@@ -375,8 +375,11 @@ class VirtualMachine(irProgram: IRProgram) {
375375 if (i.type== IRDataType .FLOAT )
376376 registers.setFloat(i.fpReg1!! , i.immediateFp!! )
377377 else {
378- if (i.immediate!= null )
378+ if (i.immediate!= null ) {
379379 setResultReg(i.reg1!! , i.immediate!! , i.type!! )
380+ statusZero = i.immediate== 0
381+ statusNegative = i.immediate!! < 0
382+ }
380383 else {
381384 if (i.labelSymbol== null )
382385 throw IllegalArgumentException (" expected LOAD of address of labelsymbol" )
@@ -388,26 +391,56 @@ class VirtualMachine(irProgram: IRProgram) {
388391
389392 private fun InsLOADM (i : IRInstruction ) {
390393 when (i.type!! ) {
391- IRDataType .BYTE -> registers.setUB(i.reg1!! , memory.getUB(i.address!! ))
392- IRDataType .WORD -> registers.setUW(i.reg1!! , memory.getUW(i.address!! ))
394+ IRDataType .BYTE -> {
395+ val value = memory.getUB(i.address!! )
396+ registers.setUB(i.reg1!! , value)
397+ statusZero = value== 0 .toUByte()
398+ statusNegative = value>= 0x80u
399+ }
400+ IRDataType .WORD -> {
401+ val value = memory.getUW(i.address!! )
402+ registers.setUW(i.reg1!! , value)
403+ statusZero = value== 0 .toUShort()
404+ statusNegative = value>= 0x8000u
405+ }
393406 IRDataType .FLOAT -> registers.setFloat(i.fpReg1!! , memory.getFloat(i.address!! ))
394407 }
395408 nextPc()
396409 }
397410
398411 private fun InsLOADI (i : IRInstruction ) {
399412 when (i.type!! ) {
400- IRDataType .BYTE -> registers.setUB(i.reg1!! , memory.getUB(registers.getUW(i.reg2!! ).toInt()))
401- IRDataType .WORD -> registers.setUW(i.reg1!! , memory.getUW(registers.getUW(i.reg2!! ).toInt()))
413+ IRDataType .BYTE -> {
414+ val value = memory.getUB(registers.getUW(i.reg2!! ).toInt())
415+ registers.setUB(i.reg1!! , value)
416+ statusZero = value== 0 .toUByte()
417+ statusNegative = value>= 0x80u
418+ }
419+ IRDataType .WORD -> {
420+ val value = memory.getUW(registers.getUW(i.reg2!! ).toInt())
421+ registers.setUW(i.reg1!! , value)
422+ statusZero = value== 0 .toUShort()
423+ statusNegative = value>= 0x8000u
424+ }
402425 IRDataType .FLOAT -> registers.setFloat(i.fpReg1!! , memory.getFloat(registers.getUW(i.reg1!! ).toInt()))
403426 }
404427 nextPc()
405428 }
406429
407430 private fun InsLOADX (i : IRInstruction ) {
408431 when (i.type!! ) {
409- IRDataType .BYTE -> registers.setUB(i.reg1!! , memory.getUB(i.address!! + registers.getUW(i.reg2!! ).toInt()))
410- IRDataType .WORD -> registers.setUW(i.reg1!! , memory.getUW(i.address!! + registers.getUW(i.reg2!! ).toInt()))
432+ IRDataType .BYTE -> {
433+ val value = memory.getUB(i.address!! + registers.getUW(i.reg2!! ).toInt())
434+ registers.setUB(i.reg1!! , value)
435+ statusZero = value== 0 .toUByte()
436+ statusNegative = value>= 0x80u
437+ }
438+ IRDataType .WORD -> {
439+ val value = memory.getUW(i.address!! + registers.getUW(i.reg2!! ).toInt())
440+ registers.setUW(i.reg1!! , value)
441+ statusZero = value== 0 .toUShort()
442+ statusNegative = value>= 0x8000u
443+ }
411444 IRDataType .FLOAT -> registers.setFloat(i.fpReg1!! , memory.getFloat(i.address!! + registers.getUW(i.reg1!! ).toInt()))
412445 }
413446 nextPc()
@@ -417,11 +450,17 @@ class VirtualMachine(irProgram: IRProgram) {
417450 when (i.type!! ) {
418451 IRDataType .BYTE -> {
419452 val pointer = memory.getUW(i.address!! ) + registers.getUB(i.reg2!! )
420- registers.setUB(i.reg1!! , memory.getUB(pointer.toInt()))
453+ val value = memory.getUB(pointer.toInt())
454+ registers.setUB(i.reg1!! , value)
455+ statusZero = value== 0 .toUByte()
456+ statusNegative = value>= 0x80u
421457 }
422458 IRDataType .WORD -> {
423459 val pointer = memory.getUW(i.address!! ) + registers.getUB(i.reg2!! )
424- registers.setUW(i.reg1!! , memory.getUW(pointer.toInt()))
460+ val value = memory.getUW(pointer.toInt())
461+ registers.setUW(i.reg1!! , value)
462+ statusZero = value== 0 .toUShort()
463+ statusNegative = value>= 0x8000u
425464 }
426465 IRDataType .FLOAT -> {
427466 val pointer = memory.getUW(i.address!! ) + registers.getUB(i.reg1!! )
@@ -433,8 +472,18 @@ class VirtualMachine(irProgram: IRProgram) {
433472
434473 private fun InsLOADR (i : IRInstruction ) {
435474 when (i.type!! ) {
436- IRDataType .BYTE -> registers.setUB(i.reg1!! , registers.getUB(i.reg2!! ))
437- IRDataType .WORD -> registers.setUW(i.reg1!! , registers.getUW(i.reg2!! ))
475+ IRDataType .BYTE -> {
476+ val value = registers.getUB(i.reg2!! )
477+ registers.setUB(i.reg1!! , value)
478+ statusZero = value== 0 .toUByte()
479+ statusNegative = value>= 0x80u
480+ }
481+ IRDataType .WORD -> {
482+ val value = registers.getUW(i.reg2!! )
483+ registers.setUW(i.reg1!! , value)
484+ statusZero = value== 0 .toUShort()
485+ statusNegative = value>= 0x8000u
486+ }
438487 IRDataType .FLOAT -> registers.setFloat(i.fpReg1!! , registers.getFloat(i.fpReg2!! ))
439488 }
440489 nextPc()
@@ -842,8 +891,18 @@ class VirtualMachine(irProgram: IRProgram) {
842891
843892 private fun InsINC (i : IRInstruction ) {
844893 when (i.type!! ) {
845- IRDataType .BYTE -> registers.setUB(i.reg1!! , (registers.getUB(i.reg1!! )+ 1u ).toUByte())
846- IRDataType .WORD -> registers.setUW(i.reg1!! , (registers.getUW(i.reg1!! )+ 1u ).toUShort())
894+ IRDataType .BYTE -> {
895+ val value = (registers.getUB(i.reg1!! )+ 1u ).toUByte()
896+ registers.setUB(i.reg1!! , value)
897+ statusZero = value== 0 .toUByte()
898+ statusNegative = value>= 0x80u
899+ }
900+ IRDataType .WORD -> {
901+ val value = (registers.getUW(i.reg1!! )+ 1u ).toUShort()
902+ registers.setUW(i.reg1!! , value)
903+ statusZero = value== 0 .toUShort()
904+ statusNegative = value>= 0x8000u
905+ }
847906 IRDataType .FLOAT -> registers.setFloat(i.fpReg1!! , registers.getFloat(i.fpReg1!! )+ 1f )
848907 }
849908 nextPc()
@@ -852,26 +911,56 @@ class VirtualMachine(irProgram: IRProgram) {
852911 private fun InsINCM (i : IRInstruction ) {
853912 val address = i.address!!
854913 when (i.type!! ) {
855- IRDataType .BYTE -> memory.setUB(address, (memory.getUB(address)+ 1u ).toUByte())
856- IRDataType .WORD -> memory.setUW(address, (memory.getUW(address)+ 1u ).toUShort())
914+ IRDataType .BYTE -> {
915+ val value = (memory.getUB(address)+ 1u ).toUByte()
916+ memory.setUB(address, value)
917+ statusZero = value== 0 .toUByte()
918+ statusNegative = value>= 0x80u
919+ }
920+ IRDataType .WORD -> {
921+ val value = (memory.getUW(address)+ 1u ).toUShort()
922+ memory.setUW(address, value)
923+ statusZero = value== 0 .toUShort()
924+ statusNegative = value>= 0x8000u
925+ }
857926 IRDataType .FLOAT -> memory.setFloat(address, memory.getFloat(address)+ 1f )
858927 }
859928 nextPc()
860929 }
861930
862931 private fun InsDEC (i : IRInstruction ) {
863932 when (i.type!! ) {
864- IRDataType .BYTE -> registers.setUB(i.reg1!! , (registers.getUB(i.reg1!! )- 1u ).toUByte())
865- IRDataType .WORD -> registers.setUW(i.reg1!! , (registers.getUW(i.reg1!! )- 1u ).toUShort())
933+ IRDataType .BYTE -> {
934+ val value = (registers.getUB(i.reg1!! )- 1u ).toUByte()
935+ registers.setUB(i.reg1!! , value)
936+ statusZero = value== 0 .toUByte()
937+ statusNegative = value>= 0x80u
938+ }
939+ IRDataType .WORD -> {
940+ val value = (registers.getUW(i.reg1!! )- 1u ).toUShort()
941+ registers.setUW(i.reg1!! , value)
942+ statusZero = value== 0 .toUShort()
943+ statusNegative = value>= 0x8000u
944+ }
866945 IRDataType .FLOAT -> registers.setFloat(i.fpReg1!! , registers.getFloat(i.fpReg1!! )- 1f )
867946 }
868947 nextPc()
869948 }
870949
871950 private fun InsDECM (i : IRInstruction ) {
872951 when (i.type!! ) {
873- IRDataType .BYTE -> memory.setUB(i.address!! , (memory.getUB(i.address!! )- 1u ).toUByte())
874- IRDataType .WORD -> memory.setUW(i.address!! , (memory.getUW(i.address!! )- 1u ).toUShort())
952+ IRDataType .BYTE -> {
953+ val value = (memory.getUB(i.address!! )- 1u ).toUByte()
954+ memory.setUB(i.address!! , value)
955+ statusZero = value== 0 .toUByte()
956+ statusNegative = value>= 0x80u
957+ }
958+ IRDataType .WORD -> {
959+ val value = (memory.getUW(i.address!! )- 1u ).toUShort()
960+ memory.setUW(i.address!! , value)
961+ statusZero = value== 0 .toUShort()
962+ statusNegative = value>= 0x8000u
963+ }
875964 IRDataType .FLOAT -> memory.setFloat(i.address!! , memory.getFloat(i.address!! )- 1f )
876965 }
877966 nextPc()
0 commit comments