static void GetWPVal( brkp *wp ) { wp->status.b.has_value = false; if( ItemGetMAD( &wp->loc.addr, &wp->item, IT_NIL, wp->th ) ) { wp->status.b.has_value = true; } }
static void GetWPVal( brkp *wp ) { wp->status.b.has_value = FALSE; if( ItemGetMAD( &wp->loc.addr, &wp->item, IT_NIL, wp->th ) ) { wp->status.b.has_value = TRUE; } }
OVL_EXTERN void IOMenuItem( a_window wnd, gui_ctl_id id, wnd_row row, wnd_piece piece ) { io_window *io = WndIO( wnd ); address addr; bool ok; item_mach item; io_location *curr; mad_radix old_radix; /* unused parameters */ (void)piece; if( row < io->num_rows && row >= 0 ) { curr = &io->list[row]; } else { curr = NULL; } switch( id ) { case MENU_INITIALIZE: if( curr == NULL ) { WndMenuGrayAll( wnd ); } else { WndMenuEnableAll( wnd ); } WndMenuEnable( wnd, MENU_IO_NEW_ADDRESS, true ); break; case MENU_IO_DELETE: io->num_rows--; memcpy( &io->list[row], &io->list[row + 1], ( io->num_rows - row ) * sizeof( io_location ) ); WndNoSelect( wnd ); WndSetRepaint( wnd ); break; case MENU_IO_NEW_ADDRESS: addr = NilAddr; if( !DlgGivenAddr( LIT_DUI( New_Port_Addr ), &addr ) ) return; WndRowDirty( wnd, io->num_rows ); IOAddNewAddr( wnd, &addr, MENU_IO_FIRST_TYPE ); WndScrollBottom( wnd ); break; case MENU_IO_MODIFY: if( row >= io->num_rows || row < 0 ) break; if( piece == PIECE_VALUE ) { old_radix = NewCurrRadix( IOData.info[curr->type].piece_radix ); item.ud = curr->value_known ? curr->value.ud : 0; ok = DlgMadTypeExpr( TxtBuff, &item, IOData.info[curr->type].mth ); if( ok ) { curr->value = item; curr->value_known = true; } NewCurrRadix( old_radix ); } else { addr = curr->addr; if( !DlgGivenAddr( LIT_DUI( New_Port_Addr ), &addr ) ) return; curr->addr = addr; curr->value_known = false; } WndRowDirty( wnd, row ); break; case MENU_IO_READ: curr->value_known = true; if( ItemGetMAD( &curr->addr, &curr->value, IT_IO, IOData.info[curr->type].mth ) == IT_NIL ) { curr->value_known = false; } WndPieceDirty( wnd, row, PIECE_VALUE ); break; case MENU_IO_WRITE: if( curr->value_known ) { ItemPutMAD( &curr->addr, &curr->value, IT_IO, IOData.info[curr->type].mth ); } break; default: curr->type = PIECE_TYPE( id ); WndZapped( wnd ); break; } }
unsigned CheckBPs( unsigned conditions, unsigned run_conditions ) { brkp *bp; item_mach item; bool hit, bphit, wphit; bool state_set; mad_type_info mti; wphit = false; state_set = false; bphit = false; for( bp = BrkList; bp != NULL; bp = bp->next ) { if( !bp->status.b.active ) continue; hit = false; if( IS_BP_EXECUTE( bp->th ) ) { if( HaveHitBP( bp ) ) { hit = true; } } else { if( SectIsLoaded( bp->loc.addr.sect_id, OVL_MAP_EXE ) ) { MADTypeInfo( bp->th, &mti ); if( ItemGetMAD( &bp->loc.addr, &item, IT_NIL, bp->th ) ) { /* * If the breakpoint fires here because of a write, but the value hasn't changed then * the breakpoint does not fire off!!!! The SupportsExactBreakpoints actually enables * break on write, not break on change and allocates the exact data space - not plus * or minus a few bytes... * */ if( _IsOn( SW_BREAK_ON_WRITE ) && IsExactBreakpointsSupported() ) { bool drop_hit = false; if( ( UserTmpBrk.status.b.active ) || ( DbgTmpBrk.status.b.active ) ) { if( HaveHitBP( &UserTmpBrk ) ) { drop_hit = true; } if( HaveHitBP( &DbgTmpBrk ) ) { drop_hit = true; } if( ! ( conditions & ( COND_BREAK | COND_WATCH | COND_TRACE | COND_USER | COND_EXCEPTION | COND_STOP ) ) ) { drop_hit = true; } } if( !drop_hit ) hit = true; } else { if( ( memcmp( &bp->item, &item, mti.b.bits / BITS_PER_BYTE ) != 0 ) || !bp->status.b.has_value ) { hit = true; } } } else if( bp->status.b.has_value ) { if( conditions & ( COND_BREAK | COND_WATCH | COND_TRACE | COND_USER | COND_EXCEPTION | COND_STOP ) ) { hit = true; } } } } if( hit ) { bp->total_hits++; } if( hit && bp->condition != NULL && bp->status.b.use_condition ) { _SwitchOn( SW_ERR_IN_TXTBUFF ); if( !state_set ) { /* gets all the registers updated */ SetProgState( run_conditions ); state_set = true; } if( SpawnP( TestExpression, bp ) == 0 ) { if( !bp->status.b.expr_true ) { hit = false; } else { bp->status.b.expr_true = false; } } else { bp->status.b.expr_error = true; bp->error = DupStr( TxtBuff ); hit = true; } _SwitchOff( SW_ERR_IN_TXTBUFF ); } if( hit && bp->status.b.use_countdown && bp->countdown != 0 && !bp->status.b.expr_error ) { if( --bp->countdown != 0 ) { hit = false; } } if( hit ) { if( IS_BP_EXECUTE( bp->th ) ) { bphit = true; } else { wphit = true; } bp->status.b.hit = true; } } if( state_set ) { /* we might have changed a register in eval'ing conditions */ WriteDbgRegs(); } if( HaveHitBP( &UserTmpBrk ) ) { bphit = true; UserTmpBrk.status.b.hit = true; } if( HaveHitBP( &DbgTmpBrk ) ) { bphit = true; DbgTmpBrk.status.b.hit = true; } if( bphit ) return( COND_BREAK | ( conditions & ~COND_STOPPERS ) ); if( wphit ) return( COND_WATCH | ( conditions & ~COND_STOPPERS ) ); if( conditions & COND_BREAK ) { unsigned max = TXT_LEN; ReadDbgRegs(); if( MADUnexpectedBreak( &DbgRegs->mr, TxtBuff, &max ) == MS_OK ) { WriteDbgRegs(); if( max == 0 ) { conditions &= ~COND_STOPPERS; if( _IsOff( SW_CONTINUE_UNEXPECTED_BREAK ) ) { conditions |= COND_TRACE; } return( conditions ); } else if( SetMsgText( TxtBuff, &conditions ) ) { DUIMsgBox( TxtBuff ); return( COND_TRACE | COND_MESSAGE | ( conditions & ~COND_STOPPERS ) ); } else { return( conditions & ~COND_STOPPERS ); } } else { return( conditions & ~COND_STOPPERS ); } } else if( conditions & COND_WATCH ) { return( conditions & ~COND_STOPPERS ); } return( conditions ); }