//----------------------------------------------------------------------------- // Copyright 2007 Jonathan Westhues // // This file is part of LDmicro. // // LDmicro is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // LDmicro is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with LDmicro. If not, see . //------ // // Constants, structures, declarations etc. for the PIC ladder logic compiler // Jonathan Westhues, Oct 2004 //----------------------------------------------------------------------------- #ifndef __LDMICRO_H #define __LDMICRO_H #include typedef signed short SWORD; typedef signed long SDWORD; //----------------------------------------------- // `Configuration options.' // The library that I use to do registry stuff. #define FREEZE_SUBKEY "LDMicro" // Size of the font that we will use to draw the ladder diagrams, in pixels #define FONT_WIDTH 7 #define FONT_HEIGHT 13 //----------------------------------------------- // Constants for the GUI. We have drop-down menus, a listview for the I/Os, // etc. // Menu IDs #define MNU_NEW 0x01 #define MNU_OPEN 0x02 #define MNU_SAVE 0x03 #define MNU_SAVE_AS 0x04 #define MNU_EXPORT 0x05 #define MNU_EXIT 0x06 #define MNU_UNDO 0x10 #define MNU_REDO 0x11 #define MNU_PUSH_RUNG_UP 0x12 #define MNU_PUSH_RUNG_DOWN 0x13 #define MNU_INSERT_RUNG_BEFORE 0x14 #define MNU_INSERT_RUNG_AFTER 0x15 #define MNU_DELETE_ELEMENT 0x16 #define MNU_DELETE_RUNG 0x17 #define MNU_INSERT_COMMENT 0x20 #define MNU_INSERT_CONTACTS 0x21 #define MNU_INSERT_COIL 0x22 #define MNU_INSERT_TON 0x23 #define MNU_INSERT_TOF 0x24 #define MNU_INSERT_RTO 0x25 #define MNU_INSERT_RES 0x26 #define MNU_INSERT_OSR 0x27 #define MNU_INSERT_OSF 0x28 #define MNU_INSERT_CTU 0x29 #define MNU_INSERT_CTD 0x2a #define MNU_INSERT_CTC 0x2b #define MNU_INSERT_ADD 0x2c #define MNU_INSERT_SUB 0x2d #define MNU_INSERT_MUL 0x2e #define MNU_INSERT_DIV 0x2f #define MNU_INSERT_MOV 0x30 #define MNU_INSERT_READ_ADC 0x31 #define MNU_INSERT_SET_PWM 0x32 #define MNU_INSERT_UART_SEND 0x33 #define MNU_INSERT_UART_RECV 0x34 #define MNU_INSERT_EQU 0x35 #define MNU_INSERT_NEQ 0x36 #define MNU_INSERT_GRT 0x37 #define MNU_INSERT_GEQ 0x38 #define MNU_INSERT_LES 0x39 #define MNU_INSERT_LEQ 0x3a #define MNU_INSERT_OPEN 0x3b #define MNU_INSERT_SHORT 0x3c #define MNU_INSERT_MASTER_RLY 0x3d #define MNU_INSERT_SHIFT_REG 0x3e #define MNU_INSERT_LUT 0x3f #define MNU_INSERT_FMTD_STR 0x40 #define MNU_INSERT_PERSIST 0x41 #define MNU_MAKE_NORMAL 0x42 #define MNU_NEGATE 0x43 #define MNU_MAKE_SET_ONLY 0x44 #define MNU_MAKE_RESET_ONLY 0x45 #define MNU_INSERT_PWL 0x46 #define MNU_MCU_SETTINGS 0x50 #define MNU_PROCESSOR_0 0xa0 #define MNU_SIMULATION_MODE 0x60 #define MNU_START_SIMULATION 0x61 #define MNU_STOP_SIMULATION 0x62 #define MNU_SINGLE_CYCLE 0x63 #define MNU_COMPILE 0x70 #define MNU_COMPILE_AS 0x71 #define MNU_MANUAL 0x80 #define MNU_ABOUT 0x81 // Columns within the I/O etc. listview. #define LV_IO_NAME 0x00 #define LV_IO_TYPE 0x01 #define LV_IO_STATE 0x02 #define LV_IO_PIN 0x03 #define LV_IO_PORT 0x04 // Timer IDs associated with the main window. #define TIMER_BLINK_CURSOR 1 #define TIMER_SIMULATE 2 //----------------------------------------------- // Data structures for the actual ladder logic. A rung on the ladder // is a series subcircuit. A series subcircuit contains elements or // parallel subcircuits. A parallel subcircuit contains elements or series // subcircuits. An element is a set of contacts (possibly negated) or a coil. #define MAX_ELEMENTS_IN_SUBCKT 16 #define ELEM_PLACEHOLDER 0x01 #define ELEM_SERIES_SUBCKT 0x02 #define ELEM_PARALLEL_SUBCKT 0x03 #define ELEM_PADDING 0x04 #define ELEM_COMMENT 0x05 #define ELEM_CONTACTS 0x10 #define ELEM_COIL 0x11 #define ELEM_TON 0x12 #define ELEM_TOF 0x13 #define ELEM_RTO 0x14 #define ELEM_RES 0x15 #define ELEM_ONE_SHOT_RISING 0x16 #define ELEM_ONE_SHOT_FALLING 0x17 #define ELEM_MOVE 0x18 #define ELEM_ADD 0x19 #define ELEM_SUB 0x1a #define ELEM_MUL 0x1b #define ELEM_DIV 0x1c #define ELEM_EQU 0x1d #define ELEM_NEQ 0x1e #define ELEM_GRT 0x1f #define ELEM_GEQ 0x20 #define ELEM_LES 0x21 #define ELEM_LEQ 0x22 #define ELEM_CTU 0x23 #define ELEM_CTD 0x24 #define ELEM_CTC 0x25 #define ELEM_SHORT 0x26 #define ELEM_OPEN 0x27 #define ELEM_READ_ADC 0x28 #define ELEM_SET_PWM 0x29 #define ELEM_UART_RECV 0x2a #define ELEM_UART_SEND 0x2b #define ELEM_MASTER_RELAY 0x2c #define ELEM_SHIFT_REGISTER 0x2d #define ELEM_LOOK_UP_TABLE 0x2e #define ELEM_FORMATTED_STRING 0x2f #define ELEM_PERSIST 0x30 #define ELEM_PIECEWISE_LINEAR 0x31 #define CASE_LEAF \ case ELEM_PLACEHOLDER: \ case ELEM_COMMENT: \ case ELEM_COIL: \ case ELEM_CONTACTS: \ case ELEM_TON: \ case ELEM_TOF: \ case ELEM_RTO: \ case ELEM_CTD: \ case ELEM_CTU: \ case ELEM_CTC: \ case ELEM_RES: \ case ELEM_ONE_SHOT_RISING: \ case ELEM_ONE_SHOT_FALLING: \ case ELEM_EQU: \ case ELEM_NEQ: \ case ELEM_GRT: \ case ELEM_GEQ: \ case ELEM_LES: \ case ELEM_LEQ: \ case ELEM_ADD: \ case ELEM_SUB: \ case ELEM_MUL: \ case ELEM_DIV: \ case ELEM_MOVE: \ case ELEM_SHORT: \ case ELEM_OPEN: \ case ELEM_READ_ADC: \ case ELEM_SET_PWM: \ case ELEM_UART_SEND: \ case ELEM_UART_RECV: \ case ELEM_MASTER_RELAY: \ case ELEM_SHIFT_REGISTER: \ case ELEM_LOOK_UP_TABLE: \ case ELEM_PIECEWISE_LINEAR: \ case ELEM_FORMATTED_STRING: \ case ELEM_PERSIST: #define MAX_NAME_LEN 128 #define MAX_COMMENT_LEN 384 #define MAX_LOOK_UP_TABLE_LEN 60 typedef struct ElemSubckParallelTag ElemSubcktParallel; typedef struct ElemCommentTag { char str[MAX_COMMENT_LEN]; } ElemComment; typedef struct ElemContactsTag { char name[MAX_NAME_LEN]; BOOL negated; } ElemContacts; typedef struct ElemCoilTag { char name[MAX_NAME_LEN]; BOOL negated; BOOL setOnly; BOOL resetOnly; } ElemCoil; typedef struct ElemTimeTag { char name[MAX_NAME_LEN]; int delay; } ElemTimer; typedef struct ElemResetTag { char name[MAX_NAME_LEN]; } ElemReset; typedef struct ElemMoveTag { char src[MAX_NAME_LEN]; char dest[MAX_NAME_LEN]; } ElemMove; typedef struct ElemMathTag { char op1[MAX_NAME_LEN]; char op2[MAX_NAME_LEN]; char dest[MAX_NAME_LEN]; } ElemMath; typedef struct ElemCmpTag { char op1[MAX_NAME_LEN]; char op2[MAX_NAME_LEN]; } ElemCmp; typedef struct ElemCounterTag { char name[MAX_NAME_LEN]; int max; } ElemCounter; typedef struct ElemReadAdcTag { char name[MAX_NAME_LEN]; } ElemReadAdc; typedef struct ElemSetPwmTag { char name[MAX_NAME_LEN]; int targetFreq; } ElemSetPwm; typedef struct ElemUartTag { char name[MAX_NAME_LEN]; } ElemUart; typedef struct ElemShiftRegisterTag { char name[MAX_NAME_LEN]; int stages; } ElemShiftRegister; typedef struct ElemLookUpTableTag { char dest[MAX_NAME_LEN]; char index[MAX_NAME_LEN]; int count; BOOL editAsString; SWORD vals[MAX_LOOK_UP_TABLE_LEN]; } ElemLookUpTable; typedef struct ElemPiecewiseLinearTag { char dest[MAX_NAME_LEN]; char index[MAX_NAME_LEN]; int count; SWORD vals[MAX_LOOK_UP_TABLE_LEN]; } ElemPiecewiseLinear; typedef struct ElemFormattedStringTag { char var[MAX_NAME_LEN]; char string[MAX_LOOK_UP_TABLE_LEN]; } ElemFormattedString; typedef struct ElemPerisistTag { char var[MAX_NAME_LEN]; } ElemPersist; #define SELECTED_NONE 0 #define SELECTED_ABOVE 1 #define SELECTED_BELOW 2 #define SELECTED_RIGHT 3 #define SELECTED_LEFT 4 typedef struct ElemLeafTag { int selectedState; BOOL poweredAfter; union { ElemComment comment; ElemContacts contacts; ElemCoil coil; ElemTimer timer; ElemReset reset; ElemMove move; ElemMath math; ElemCmp cmp; ElemCounter counter; ElemReadAdc readAdc; ElemSetPwmTag setPwm; ElemUart uart; ElemShiftRegister shiftRegister; ElemFormattedString fmtdStr; ElemLookUpTable lookUpTable; ElemPiecewiseLinear piecewiseLinear; ElemPersist persist; } d; } ElemLeaf; typedef struct ElemSubcktSeriesTag { struct { int which; union { void *any; ElemSubcktParallel *parallel; ElemLeaf *leaf; } d; } contents[MAX_ELEMENTS_IN_SUBCKT]; int count; } ElemSubcktSeries; typedef struct ElemSubckParallelTag { struct { int which; union { void *any; ElemSubcktSeries *series; ElemLeaf *leaf; } d; } contents[MAX_ELEMENTS_IN_SUBCKT]; int count; } ElemSubcktParallel; typedef struct McuIoInfoTag McuIoInfo; typedef struct PlcProgramSingleIoTag { char name[MAX_NAME_LEN]; #define IO_TYPE_PENDING 0 #define IO_TYPE_DIG_INPUT 1 #define IO_TYPE_DIG_OUTPUT 2 #define IO_TYPE_READ_ADC 3 #define IO_TYPE_UART_TX 4 #define IO_TYPE_UART_RX 5 #define IO_TYPE_PWM_OUTPUT 6 #define IO_TYPE_INTERNAL_RELAY 7 #define IO_TYPE_TON 8 #define IO_TYPE_TOF 9 #define IO_TYPE_RTO 10 #define IO_TYPE_COUNTER 11 #define IO_TYPE_GENERAL 12 int type; #define NO_PIN_ASSIGNED 0 int pin; } PlcProgramSingleIo; #define MAX_IO 512 typedef struct PlcProgramTag { struct { PlcProgramSingleIo assignment[MAX_IO]; int count; } io; McuIoInfo *mcu; int cycleTime; int mcuClock; int baudRate; #define MAX_RUNGS 99 ElemSubcktSeries *rungs[MAX_RUNGS]; BOOL rungPowered[MAX_RUNGS]; int numRungs; } PlcProgram; //----------------------------------------------- // For actually drawing the ladder logic on screen; constants that determine // how the boxes are laid out in the window, need to know that lots of // places for figuring out if a mouse click is in a box etc. // dimensions, in characters, of the area reserved for 1 leaf element #define POS_WIDTH 17 #define POS_HEIGHT 3 // offset from the top left of the window at which we start drawing, in pixels #define X_PADDING 35 #define Y_PADDING 14 typedef struct PlcCursorTag { int left; int top; int width; int height; } PlcCursor; //----------------------------------------------- // The syntax highlighting style colours; a structure for the palette. typedef struct SyntaxHighlightingColoursTag { COLORREF bg; // background COLORREF def; // default foreground COLORREF selected; // selected element COLORREF op; // `op code' (like OSR, OSF, ADD, ...) COLORREF punct; // punctuation, like square or curly braces COLORREF lit; // a literal number COLORREF name; // the name of an item COLORREF rungNum; // rung numbers COLORREF comment; // user-written comment text COLORREF bus; // the `bus' at the right and left of screen COLORREF simBg; // background, simulation mode COLORREF simRungNum; // rung number, simulation mode COLORREF simOff; // de-energized element, simulation mode COLORREF simOn; // energzied element, simulation mode COLORREF simBusLeft; // the `bus,' can be different colours for COLORREF simBusRight; // right and left of the screen } SyntaxHighlightingColours; extern SyntaxHighlightingColours HighlightColours; //----------------------------------------------- // Processor definitions. These tables tell us where to find the I/Os on // a processor, what bit in what register goes with what pin, etc. There // is one master SupportedMcus table, which contains entries for each // supported microcontroller. typedef struct McuIoPinInfoTag { char port; int bit; int pin; } McuIoPinInfo; typedef struct McuAdcPinInfoTag { int pin; BYTE muxRegValue; } McuAdcPinInfo; #define ISA_AVR 0x00 #define ISA_PIC16 0x01 #define ISA_ANSIC 0x02 #define ISA_INTERPRETED 0x03 #define MAX_IO_PORTS 10 #define MAX_RAM_SECTIONS 5 typedef struct McuIoInfoTag { char *mcuName; char portPrefix; DWORD inputRegs[MAX_IO_PORTS]; // a is 0, j is 9 DWORD outputRegs[MAX_IO_PORTS]; DWORD dirRegs[MAX_IO_PORTS]; DWORD flashWords; struct { DWORD start; int len; } ram[MAX_RAM_SECTIONS]; McuIoPinInfo *pinInfo; int pinCount; McuAdcPinInfo *adcInfo; int adcCount; int adcMax; struct { int rxPin; int txPin; } uartNeeds; int pwmNeedsPin; int whichIsa; BOOL avrUseIjmp; DWORD configurationWord; } McuIoInfo; #define NUM_SUPPORTED_MCUS 15 //----------------------------------------------- // Function prototypes // ldmicro.cpp void ProgramChanged(void); void SetMenusEnabled(BOOL canNegate, BOOL canNormal, BOOL canResetOnly, BOOL canSetOnly, BOOL canDelete, BOOL canInsertEnd, BOOL canInsertOther, BOOL canPushRungDown, BOOL canPushRungUp, BOOL canInsertComment); void SetUndoEnabled(BOOL undoEnabled, BOOL redoEnabled); void RefreshScrollbars(void); extern HINSTANCE Instance; extern HWND MainWindow; extern HDC Hdc; extern PlcProgram Prog; extern char CurrentSaveFile[MAX_PATH]; extern char CurrentCompileFile[MAX_PATH]; extern McuIoInfo SupportedMcus[NUM_SUPPORTED_MCUS]; // memory debugging, because I often get careless; ok() will check that the // heap used for all the program storage is not yet corrupt, and oops() if // it is void CheckHeap(char *file, int line); #define ok() CheckHeap(__FILE__, __LINE__) // maincontrols.cpp void MakeMainWindowControls(void); HMENU MakeMainWindowMenus(void); void VscrollProc(WPARAM wParam); void HscrollProc(WPARAM wParam); void GenerateIoListDontLoseSelection(void); void RefreshControlsToSettings(void); void MainWindowResized(void); void ToggleSimulationMode(void); void StopSimulation(void); void StartSimulation(void); void UpdateMainWindowTitleBar(void); extern int ScrollWidth; extern int ScrollHeight; extern BOOL NeedHoriz; extern HWND IoList; extern int IoListTop; extern int IoListHeight; // draw.cpp int ProgCountWidestRow(void); int CountHeightOfElement(int which, void *elem); BOOL DrawElement(int which, void *elem, int *cx, int *cy, BOOL poweredBefore); void DrawEndRung(int cx, int cy); extern int ColsAvailable; extern BOOL SelectionActive; extern BOOL ThisHighlighted; // draw_outputdev.cpp extern void (*DrawChars)(int, int, char *); void CALLBACK BlinkCursor(HWND hwnd, UINT msg, UINT_PTR id, DWORD time); void PaintWindow(void); void ExportDrawingAsText(char *file); void InitForDrawing(void); void SetUpScrollbars(BOOL *horizShown, SCROLLINFO *horiz, SCROLLINFO *vert); int ScreenRowsAvailable(void); int ScreenColsAvailable(void); extern HFONT FixedWidthFont; extern HFONT FixedWidthFontBold; extern int SelectedGxAfterNextPaint; extern int SelectedGyAfterNextPaint; extern BOOL ScrollSelectedIntoViewAfterNextPaint; extern int ScrollXOffset; extern int ScrollYOffset; extern int ScrollXOffsetMax; extern int ScrollYOffsetMax; // schematic.cpp void SelectElement(int gx, int gy, int state); void MoveCursorKeyboard(int keyCode); void MoveCursorMouseClick(int x, int y); BOOL MoveCursorTopLeft(void); void EditElementMouseDoubleclick(int x, int y); void EditSelectedElement(void); void MakeResetOnlySelected(void); void MakeSetOnlySelected(void); void MakeNormalSelected(void); void NegateSelected(void); void ForgetFromGrid(void *p); void ForgetEverything(void); void WhatCanWeDoFromCursorAndTopology(void); BOOL FindSelected(int *gx, int *gy); void MoveCursorNear(int gx, int gy); #define DISPLAY_MATRIX_X_SIZE 16 #define DISPLAY_MATRIX_Y_SIZE 512 extern ElemLeaf *DisplayMatrix[DISPLAY_MATRIX_X_SIZE][DISPLAY_MATRIX_Y_SIZE]; extern int DisplayMatrixWhich[DISPLAY_MATRIX_X_SIZE][DISPLAY_MATRIX_Y_SIZE]; extern ElemLeaf DisplayMatrixFiller; #define PADDING_IN_DISPLAY_MATRIX (&DisplayMatrixFiller) #define VALID_LEAF(x) ((x) != NULL && (x) != PADDING_IN_DISPLAY_MATRIX) extern ElemLeaf *Selected; extern int SelectedWhich; extern PlcCursor Cursor; extern BOOL CanInsertEnd; extern BOOL CanInsertOther; extern BOOL CanInsertComment; // circuit.cpp void AddTimer(int which); void AddCoil(void); void AddContact(void); void AddEmpty(int which); void AddMove(void); void AddMath(int which); void AddCmp(int which); void AddReset(void); void AddCounter(int which); void AddReadAdc(void); void AddSetPwm(void); void AddUart(int which); void AddPersist(void); void AddComment(char *text); void AddShiftRegister(void); void AddMasterRelay(void); void AddLookUpTable(void); void AddPiecewiseLinear(void); void AddFormattedString(void); void DeleteSelectedFromProgram(void); void DeleteSelectedRung(void); void InsertRung(BOOL afterCursor); int RungContainingSelected(void); BOOL ItemIsLastInCircuit(ElemLeaf *item); BOOL UartFunctionUsed(void); BOOL PwmFunctionUsed(void); void PushRungUp(void); void PushRungDown(void); void NewProgram(void); ElemLeaf *AllocLeaf(void); ElemSubcktSeries *AllocSubcktSeries(void); ElemSubcktParallel *AllocSubcktParallel(void); void FreeCircuit(int which, void *any); void FreeEntireProgram(void); void UndoUndo(void); void UndoRedo(void); void UndoRemember(void); void UndoFlush(void); BOOL CanUndo(void); // loadsave.cpp BOOL LoadProjectFromFile(char *filename); BOOL SaveProjectToFile(char *filename); // iolist.cpp int GenerateIoList(int prevSel); void SaveIoListToFile(FILE *f); BOOL LoadIoListFromFile(FILE *f); void ShowIoDialog(int item); void IoListProc(NMHDR *h); void ShowAnalogSliderPopup(char *name); // commentdialog.cpp void ShowCommentDialog(char *comment); // contactsdialog.cpp void ShowContactsDialog(BOOL *negated, char *name); // coildialog.cpp void ShowCoilDialog(BOOL *negated, BOOL *setOnly, BOOL *resetOnly, char *name); // simpledialog.cpp void ShowTimerDialog(int which, int *delay, char *name); void ShowCounterDialog(int which, int *count, char *name); void ShowMoveDialog(char *dest, char *src); void ShowReadAdcDialog(char *name); void ShowSetPwmDialog(char *name, int *targetFreq); void ShowPersistDialog(char *var); void ShowUartDialog(int which, char *name); void ShowCmpDialog(int which, char *op1, char *op2); void ShowMathDialog(int which, char *dest, char *op1, char *op2); void ShowShiftRegisterDialog(char *name, int *stages); void ShowFormattedStringDialog(char *var, char *string); void ShowLookUpTableDialog(ElemLeaf *l); void ShowPiecewiseLinearDialog(ElemLeaf *l); void ShowResetDialog(char *name); // confdialog.cpp void ShowConfDialog(void); // helpdialog.cpp void ShowHelpDialog(BOOL about); // miscutil.cpp #define oops() { \ dbp("bad at %d %s\n", __LINE__, __FILE__); \ Error("Internal error at line %d file '%s'\n", __LINE__, __FILE__); \ exit(1); \ } void dbp(char *str, ...); void Error(char *str, ...); void *CheckMalloc(size_t n); void CheckFree(void *p); extern HANDLE MainHeap; void StartIhex(FILE *f); void WriteIhex(FILE *f, BYTE b); void FinishIhex(FILE *f); char *IoTypeToString(int ioType); void PinNumberForIo(char *dest, PlcProgramSingleIo *io); HWND CreateWindowClient(DWORD exStyle, char *className, char *windowName, DWORD style, int x, int y, int width, int height, HWND parent, HMENU menu, HINSTANCE instance, void *param); void MakeDialogBoxClass(void); void NiceFont(HWND h); void FixedFont(HWND h); void CompileSuccessfulMessage(char *str); extern BOOL RunningInBatchMode; extern HFONT MyNiceFont; extern HFONT MyFixedFont; extern HWND OkButton; extern HWND CancelButton; extern BOOL DialogDone; extern BOOL DialogCancel; // lang.cpp char *_(char *in); // simulate.cpp void SimulateOneCycle(BOOL forceRefresh); void CALLBACK PlcCycleTimer(HWND hwnd, UINT msg, UINT_PTR id, DWORD time); void StartSimulationTimer(void); void ClearSimulationData(void); void DescribeForIoList(char *name, char *out); void SimulationToggleContact(char *name); void SetAdcShadow(char *name, SWORD val); SWORD GetAdcShadow(char *name); void DestroyUartSimulationWindow(void); void ShowUartSimulationWindow(void); extern BOOL InSimulationMode; extern BOOL SimulateRedrawAfterNextCycle; // compilecommon.cpp void AllocStart(void); DWORD AllocOctetRam(void); void AllocBitRam(DWORD *addr, int *bit); void MemForVariable(char *name, DWORD *addrl, DWORD *addrh); BYTE MuxForAdcVariable(char *name); void MemForSingleBit(char *name, BOOL forRead, DWORD *addr, int *bit); void MemCheckForErrorsPostCompile(void); void BuildDirectionRegisters(BYTE *isInput, BYTE *isOutput); void ComplainAboutBaudRateError(int divisor, double actual, double err); void ComplainAboutBaudRateOverflow(void); #define CompileError() longjmp(CompileErrorBuf, 1) extern jmp_buf CompileErrorBuf; // intcode.cpp void IntDumpListing(char *outFile); BOOL GenerateIntermediateCode(void); // pic16.cpp void CompilePic16(char *outFile); // avr.cpp void CompileAvr(char *outFile); // ansic.cpp void CompileAnsiC(char *outFile); // interpreted.c void CompileInterpreted(char *outFile); #endif