Table of Contents Previous topic Next topic
Extension Examples->Counters 0 and 1->Extension Source Code
/* * This single file is a complete extension, written in C, for the Crossware 8051 Virtual Workshop. * It increments counter 0 every 5 machine cycles and increments counter 1 every 50 machine cycles. * * As written (ie using DllExport), it will compile with the Microsoft Visual C++ compiler. * * Copyright (c) 1998 Crossware Products. * * This source code is provided as an example to complement the Crossware 8051 Virtual Workshop. */#define DllExport __declspec( dllexport )#define LONG long#define BYTE unsigned char#define TRUE 1#define FALSE 0LONG g_nMachineCycles;LONG g_nCounter0Cycles;LONG g_nCounter1Cycles;LONG* g_pnError; // placing a non-zero value in here will halt the simulatorDllExport LONG Initialise(LONG* pnError){ g_pnError = pnError; // save the address of the simulators error indicator return 1; // must return a non-zero value otherwise extension will be ignored}DllExport void SetMachineCycles(LONG nExtensionState, LONG nCycles){ g_nMachineCycles = nCycles;}DllExport void IncMachineCycles(LONG nExtensionState, LONG nCycles){ // we need to keep track of the machine cycles so intercept this call g_nMachineCycles += nCycles;}DllExport void GetPortPins(LONG nExtensionState, BYTE nPortAddress, BYTE* pnPins, BYTE* pnHandledPins, LONG bSimulating){ // Clear or set only the pins relevant to this extension // If you set or clear any of the pins, then set the corresponding bit in pnHandledPins if (nPortAddress == 0XB0) { // Port 3 // one count every 5 machine cycles if (g_nMachineCycles - g_nCounter0Cycles > 5) { *pnPins &= ~0X10; // clear the pin P3.4 to trigger counter 0 g_nCounter0Cycles = g_nMachineCycles; } else *pnPins |= 0X10; // set the pin *pnHandledPins |= 0X10; // tell the simulator that we have handled this pin // one count every 50 machine cycles if (g_nMachineCycles - g_nCounter1Cycles > 50) { *pnPins &= ~0X20; // clear the pin P3.5 to trigger counter 1 g_nCounter1Cycles = g_nMachineCycles; } else *pnPins |= 0X20; // set the pin *pnHandledPins |= 0X20; // tell the simulator that we have handled this pin }}DllExport void ResetState(LONG nExtensionState){ // simulator is being reset, reset our own variables g_nMachineCycles = 0; g_nCounter0Cycles = 0; g_nCounter1Cycles = 0;}