diff --git a/internal/support/vwatch/vwatch.bm b/internal/support/vwatch/vwatch.bm index 71d212e84..8a7d95f32 100644 --- a/internal/support/vwatch/vwatch.bm +++ b/internal/support/vwatch/vwatch.bm @@ -5,10 +5,10 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) STATIC AS LONG callStackLength, runToLine STATIC AS _BYTE pauseMode, stepOver, bypass, setNextLine STATIC buffer$, endc$ - DIM AS LONG i, tempIndex, localIndex + DIM AS LONG i, tempIndex, localIndex, varSize, sequence DIM AS _OFFSET address - DIM AS _MEM m - DIM start!, temp$, cmd$, value$, k&, dataType$, result$ + DIM AS _MEM m, m2 + DIM start!, temp$, cmd$, value$, k&, dataType$, result$, buf$ DECLARE LIBRARY SUB vwatch_stoptimers ALIAS stop_timers @@ -217,29 +217,37 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) CASE "clear all skips" REDIM vwatch_skiplines(UBOUND(vwatch_skiplines)) AS _BYTE CASE "call stack" - 'send call stack history" + 'send call stack history GOSUB SendCallStack CASE "global var" tempIndex = CVL(LEFT$(value$, 4)) localIndex = CVL(MID$(value$, 5, 4)) - dataType$ = MID$(value$, 9) address = globalVariables + LEN(address) * localIndex address = _MEMGET(m, address, _OFFSET) - GOSUB GetMemData $CONSOLE - _ECHO "Sending global var: " + STR$(tempIndex) + " = " + result$ - cmd$ = "global var:" + MKL$(tempIndex) + result$ + cmd$ = "global var:" + MKL$(tempIndex) + str$(address) GOSUB SendCommand CASE "local var" - tempIndex = CVL(LEFT$(value$, 4)) - localIndex = CVL(MID$(value$, 5, 4)) - dataType$ = MID$(value$, 9) - address = localVariables + LEN(address) * localIndex - address = _MEMGET(m, address, _OFFSET) - GOSUB GetMemData - _ECHO "Sending local var: " + STR$(tempIndex) + " = " + result$ - cmd$ = "local var:" + MKL$(tempIndex) + result$ - GOSUB SendCommand + ' tempIndex = CVL(LEFT$(value$, 4)) + ' localIndex = CVL(MID$(value$, 5, 4)) + ' dataType$ = MID$(value$, 9) + ' address = localVariables + LEN(address) * localIndex + ' address = _MEMGET(m, address, _OFFSET) + ' GOSUB GetMemData + ' _ECHO "Sending local var: " + STR$(tempIndex) + " = " + result$ + ' cmd$ = "local var:" + MKL$(tempIndex) + result$ + ' GOSUB SendCommand + case "get address" + tempIndex = cvl(left$(value$, 4)) + sequence = cvi(mid$(value$, 5, 2)) + varSize = cvl(mid$(value$, 7, 4)) + address = val(mid$(value$, 11)) + buf$ = space$(varSize) + m = _mem(address, varSize) + m2 = _mem(_offset(buf$), varSize) + _memcopy m, m.offset, m.size to m2, m2.offset + cmd$ = "address read:" + mkl$(tempIndex) + mki$(sequence) + buf$ + gosub sendcommand CASE "current sub" cmd$ = "current sub:" + vwatch_internalsubname$ GOSUB SendCommand @@ -309,55 +317,4 @@ SUB vwatch (globalVariables AS _OFFSET, localVariables AS _OFFSET) cmd$ = "" RETURN - GetMemData: - DIM integerType AS INTEGER, uintegerType AS _UNSIGNED INTEGER - DIM longType AS LONG, ulongType AS _UNSIGNED LONG - DIM singleType AS SINGLE, doubleType AS DOUBLE - DIM varOffset AS _OFFSET, m2 AS _MEM - - SELECT CASE dataType$ - CASE "INTEGER" - m = _MEM(address, 2) - m2 = _MEM(integerType) - _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET - _MEMFREE m - _MEMFREE m2 - result$ = STR$(integerType) - CASE "_UNSIGNED INTEGER" - m = _MEM(address, 2) - m2 = _MEM(uintegerType) - _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET - _MEMFREE m - _MEMFREE m2 - result$ = STR$(uintegerType) - CASE "LONG" - m = _MEM(address, 4) - m2 = _MEM(longType) - _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET - _MEMFREE m - _MEMFREE m2 - result$ = STR$(longType) - CASE "_UNSIGNED LONG" - m = _MEM(address, 4) - m2 = _MEM(ulongType) - _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET - _MEMFREE m - _MEMFREE m2 - result$ = STR$(ulongType) - CASE "SINGLE" - m = _MEM(address, 4) - m2 = _MEM(singleType) - _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET - _MEMFREE m - _MEMFREE m2 - result$ = STR$(singleType) - CASE "DOUBLE" - m = _MEM(address, 8) - m2 = _MEM(doubleType) - _MEMCOPY m, m.OFFSET, m.SIZE TO m2, m2.OFFSET - _MEMFREE m - _MEMFREE m2 - result$ = STR$(doubleType) - END SELECT - RETURN END SUB diff --git a/source/ide/ide_methods.bas b/source/ide/ide_methods.bas index 737516e02..a2fd1db6e 100644 --- a/source/ide/ide_methods.bas +++ b/source/ide/ide_methods.bas @@ -6940,8 +6940,8 @@ SUB DebugMode temp$ = MID$(temp$, 5) IF usedVariableList(tempIndex&).watch THEN cmd$ = "" - _ECHO "usedVariableList(tempIndex&).subfunc =" + usedVariableList(tempIndex&).subfunc - _ECHO "currentSub$ =" + currentSub$ + '_ECHO "usedVariableList(tempIndex&).subfunc =" + usedVariableList(tempIndex&).subfunc + '_ECHO "currentSub$ =" + currentSub$ IF LEN(usedVariableList(tempIndex&).subfunc) = 0 THEN cmd$ = "global var:" ELSEIF usedVariableList(tempIndex&).subfunc = currentSub$ THEN @@ -6949,21 +6949,72 @@ SUB DebugMode END IF IF LEN(cmd$) THEN _CONSOLE ON - _ECHO "Requesting " + cmd$ - _ECHO "currentSub$ = " + currentSub$ - cmd$ = cmd$ + MKL$(tempIndex&) + MKL$(usedVariableList(tempIndex&).localIndex) + usedVariableList(tempIndex&).varType + _ECHO "Requesting " + cmd$ + str$(tempIndex&) + '_ECHO "currentSub$ = " + currentSub$ + cmd$ = cmd$ + MKL$(tempIndex&) + MKL$(usedVariableList(tempIndex&).localIndex) GOSUB SendCommand END IF END IF LOOP END IF CASE "global var", "local var" - _ECHO "Received " + cmd$ tempIndex& = CVL(LEFT$(value$, 4)) - value$ = MID$(value$, 5) - _ECHO "index = " + STR$(tempIndex&) - _ECHO "=== value$ = " + value$ - usedVariableList(tempIndex&).mostRecentValue = value$ + address%& = val(mid$(value$, 5)) + varType$ = usedVariableList(tempIndex&).varType + if instr(varType$, "STRING *") then varType$ = "STRING" + select case varType$ + case "_BYTE", "_UNSIGNED _BYTE": varSize& = len(dummy%%) + case "INTEGER", "_UNSIGNED INTEGER": varSize& = len(dummy%) + case "LONG", "_UNSIGNED LONG": varSize& = len(dummy&) + case "_INTEGER64", "_UNSIGNED _INTEGER64": varSize& = len(dummy&&) + case "SINGLE": varSize& = len(dummy!) + case "DOUBLE": varSize& = len(dummy#) + case "_FLOAT": varSize& = len(dummy##) + case "_OFFSET", "_UNSIGNED _OFFSET": varSize& = len(dummy%&) + case "STRING": varSize& = len(dummy%&) + len(dummy&) + end select + _echo "Requesting " + str$(varSize&) + " bytes from &H" + hex$(address%&) + cmd$ = "get address:" + mkl$(tempIndex&) + mki$(1) + mkl$(varSize&) + str$(address%&) + gosub SendCommand + case "address read" + tempIndex& = cvl(left$(value$, 4)) + sequence% = cvi(mid$(value$, 5, 2)) + _echo "Received data for " + str$(tempIndex&) + recvData$ = mid$(value$, 7) + varType$ = usedVariableList(tempIndex&).varType + if instr(varType$, "STRING *") then varType$ = "STRING" + select case varType$ + case "_BYTE": recvData$ = str$(_cv(_byte, recvData$)) + case "_UNSIGNED _BYTE": recvData$ = str$(_cv(_unsigned _byte, recvData$)) + case "INTEGER": recvData$ = str$(_cv(integer, recvData$)) + case "_UNSIGNED INTEGER": recvData$ = str$(_cv(_unsigned integer, recvData$)) + case "LONG": recvData$ = str$(_cv(long, recvData$)) + case "_UNSIGNED LONG": recvData$ = str$(_cv(_unsigned long, recvData$)) + case "_INTEGER64": recvData$ = str$(_cv(_integer64, recvData$)) + case "_UNSIGNED _INTEGER64": recvData$ = str$(_cv(_unsigned _integer64, recvData$)) + case "SINGLE": recvData$ = str$(_cv(single, recvData$)) + case "DOUBLE": recvData$ = str$(_cv(double, recvData$)) + case "_FLOAT": recvData$ = str$(_cv(_float, recvData$)) + case "_OFFSET": 'TODO + case "_UNSIGNED _OFFSET": 'TODO + case "STRING" + if sequence% = 1 then + if len(dummy%&) = 8 then + address%& = _cv(_integer64, left$(recvData$, 8)) + strLength& = cvl(mid$(recvData$, 9)) + else + address%& = _cv(long, left$(recvData$, 4)) + strLength& = cvl(mid$(recvData$, 5)) + end if + address$ = left$(recvData$, len(dummy%&)) 'Pointer to data + _echo "Requesting string of length " + str$(strLength&) + " at &H" + hex$(address%&) + cmd$ = "get address:" + mkl$(tempIndex&) + mki$(2) + mkl$(strLength&) + str$(address%&) + gosub sendcommand + goto vwatch_string_seq1_done + end if + end select + usedVariableList(tempIndex&).mostRecentValue = recvData$ + vwatch_string_seq1_done: CASE "current sub" currentSub$ = value$ CASE "quit"