MP2COD 4.12, COFF to COD File Converter Copyright (c) 2007 Microchip Technology Inc. Listing File Generated: Tue Aug 28 10:08:35 2007 Address Value Disassembly Source File ------- ------- ----------------------- ------------------------------------------------------------------------------- ----- /********************************************************************* C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c ********************************************************************* C:\Projects\UBW\FW\D_143\main.c * FileName: main.c C:\Projects\UBW\FW\D_143\main.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\main.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\main.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\main.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Software License Agreement C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\main.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\main.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\main.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\main.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\main.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\main.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\main.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\main.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\main.c * license. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\main.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\main.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\main.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\main.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\main.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Author Date Comment C:\Projects\UBW\FW\D_143\main.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\main.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\main.c ********************************************************************/ C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\main.c #include C:\Projects\UBW\FW\D_143\main.c #include "system\typedefs.h" // Required C:\Projects\UBW\FW\D_143\main.c #include "system\usb\usb.h" // Required C:\Projects\UBW\FW\D_143\main.c #include "io_cfg.h" // Required C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c #include "system\usb\usb_compile_time_validation.h" // Optional C:\Projects\UBW\FW\D_143\main.c #include "user\user.h" // Modifiable C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\main.c #pragma udata C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\D_143\main.c static void InitializeSystem(void); C:\Projects\UBW\FW\D_143\main.c void USBTasks(void); C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c #pragma code high_vector_section = 0x000808 C:\Projects\UBW\FW\D_143\main.c void high_vector (void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 000808 efbb GOTO 0xb76 _asm goto high_ISR _endasm C:\Projects\UBW\FW\D_143\main.c 00080a f005 00080c 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\main.c #pragma code low_vector_section = 0x000818 C:\Projects\UBW\FW\D_143\main.c void low_vector (void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 000818 ef22 GOTO 0x844 _asm goto low_ISR _endasm C:\Projects\UBW\FW\D_143\main.c 00081a f004 00081c 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\main.c #pragma code C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\main.c #pragma code C:\Projects\UBW\FW\D_143\main.c /****************************************************************************** C:\Projects\UBW\FW\D_143\main.c * Function: void main(void) C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * PreCondition: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Input: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Output: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Side Effects: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Overview: Main program entry point. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Note: None C:\Projects\UBW\FW\D_143\main.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\main.c void main(void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 004720 d805 RCALL 0x472c InitializeSystem(); C:\Projects\UBW\FW\D_143\main.c 004728 d7fc BRA 0x4722 while(1) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 004722 d811 RCALL 0x4746 USBTasks(); // USB Tasks C:\Projects\UBW\FW\D_143\main.c 004724 ec93 CALL 0xd26,0x0 ProcessIO(); // See user\user.c & .h C:\Projects\UBW\FW\D_143\main.c 004726 f006 }//end while C:\Projects\UBW\FW\D_143\main.c 00472a 0012 RETURN 0x0 }//end main C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /****************************************************************************** C:\Projects\UBW\FW\D_143\main.c * Function: static void InitializeSystem(void) C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * PreCondition: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Input: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Output: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Side Effects: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Overview: InitializeSystem is a centralize initialization routine. C:\Projects\UBW\FW\D_143\main.c * All required USB initialization routines are called from C:\Projects\UBW\FW\D_143\main.c * here. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * User application initialization routine should also be C:\Projects\UBW\FW\D_143\main.c * called from here. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Note: None C:\Projects\UBW\FW\D_143\main.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\main.c static void InitializeSystem(void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 00472c 0e0f MOVLW 0xf ADCON1 |= 0x0F; // Default all pins to digital C:\Projects\UBW\FW\D_143\main.c 00472e 12c1 IORWF 0xc1,0x1,0x0 C:\Projects\UBW\FW\D_143\main.c 004730 0e14 MOVLW 0x14 mInitializeUSBDriver(); // See usbdrv.h C:\Projects\UBW\FW\D_143\main.c 004732 6e6f MOVWF 0x6f,0x0 004734 0101 MOVLB 0x1 004736 6bd2 CLRF 0xd2,0x1 004738 0101 MOVLB 0x1 00473a 6bd3 CLRF 0xd3,0x1 00473c 0101 MOVLB 0x1 00473e 6bd4 CLRF 0xd4,0x1 C:\Projects\UBW\FW\D_143\main.c 004740 ecc4 CALL 0xb88,0x0 UserInit(); // See user.c & .h C:\Projects\UBW\FW\D_143\main.c 004742 f005 C:\Projects\UBW\FW\D_143\main.c 004744 0012 RETURN 0x0 }//end InitializeSystem C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /****************************************************************************** C:\Projects\UBW\FW\D_143\main.c * Function: void USBTasks(void) C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * PreCondition: InitializeSystem has been called. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Input: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Output: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Side Effects: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Overview: Service loop for USB tasks. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Note: None C:\Projects\UBW\FW\D_143\main.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\main.c void USBTasks(void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c /* C:\Projects\UBW\FW\D_143\main.c * Servicing Hardware C:\Projects\UBW\FW\D_143\main.c */ C:\Projects\UBW\FW\D_143\main.c 004746 ecb6 CALL 0x3f6c,0x0 USBCheckBusStatus(); // Must use polling method C:\Projects\UBW\FW\D_143\main.c 004748 f01f 00474a be6f BTFSC 0x6f,0x7,0x0 if(UCFGbits.UTEYE!=1) C:\Projects\UBW\FW\D_143\main.c 00474c d002 BRA 0x4752 00474e ecd6 CALL 0x3fac,0x0 USBDriverService(); // Interrupt or polling method C:\Projects\UBW\FW\D_143\main.c 004750 f01f C:\Projects\UBW\FW\D_143\main.c #if defined(USB_USE_CDC) C:\Projects\UBW\FW\D_143\main.c 004752 ec00 CALL 0x3800,0x0 CDCTxService(); C:\Projects\UBW\FW\D_143\main.c 004754 f01c #endif C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c 004756 0012 RETURN 0x0 }// end USBTasks C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** EOF main.c ***************************************************************/ C:\Projects\UBW\FW\D_143\main.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * FileName: usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * license. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * -usbmmap.c- C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * USB Memory Map C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * This file is the USB memory manager; it serves as a compile-time memory C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * allocator for the USB endpoints. It uses the compile time options passed C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * from usbcfg.h to instantiate endpoints and endpoint buffer. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Each endpoint requires to have a set of Buffer Descriptor registers(BDT). C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * A BDT is 4-byte long and has a specific RAM location for each endpoint. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The BDT for endpoint 0 out is located at address 0x400 to 0x403. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The BDT for endpoint 0 in is located at address 0x404 to 0x407. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The BDT for endpoint 1 out is located at address 0x408 to 0x40B. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * and so on... The above allocation assumes the Ping-Pong Buffer Mode 0 is C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * used. These locations are already hard-wired in the silicon. The point C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * of doing instantiation, i.e. volatile far BDT ep0Bo;, is to provide the C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C compiler a way to address each variable directly. This is very important C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * because when a register can be accessed directly, it saves execution time C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * and reduces program size. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Endpoints are defined using the endpoint number and the direction C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * of transfer. For simplicity, usbmmap.c only uses the endpoint number C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * in the BDT register allocation scheme. This means if the usbcfg.h states C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * that the MAX_EP_NUMBER is number 1, then four BDTs will be C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * instantiated: one each for endpoint0 in and endpoint0 out, which must C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * always be instantiated for control transfer by default, and one each sets C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * for endpoint1 in and endpoint1 out. The naming convention for instantiating C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * BDT is C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * ep<#>B C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * where # is the endpoint number, and d is the direction of C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * transfer, which could be either or . C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The USB memory manager uses MAX_EP_NUMBER, as defined in usbcfg.h, to define C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * the endpoints to be instantiated. This represents the highest endpoint C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * number to be allocated, not how many endpoints are used. Since the BDTs for C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * endpoints have hardware-assigned addresses in Bank 4, setting this value too C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * high may lead to inefficient use of data RAM. For example, if an application C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * uses only endpoints EP0 and EP4, then the MAX_EP_NUMBER is 4, and not 2. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The in-between endpoint BDTs in this example (EP1, EP2, and EP3) go unused, C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * and the 24 bytes of memory associated with them are wasted. It does not make C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * much sense to skip endpoints, but the final decision lies with the user. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The next step is to assign the instantiated BDTs to different C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * USB functions. The firmware framework fundamentally assumes that every USB C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * function should know which endpoint it is using, i.e., the default control C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * transfer should know that it is using endpoint 0 in and endpoint 0 out. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * A HID class can choose which endpoint it wants to use, but once chosen, it C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * should always know the number of the endpoint. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The assignment of endpoints to USB functions is managed centrally C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * in usbcfg.h. This helps prevent the mistake of having more C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * than one USB function using the same endpoint. The "Endpoint Allocation" C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * section in usbcfg.h provides examples for how to map USB endpoints to USB C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * functions. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Quite a few things can be mapped in that section. There is no C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * one correct way to do the mapping and the user has the choice to C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * choose a method that is most suitable to the application. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Typically, however, a user will want to map the following for a given C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * USB interface function: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * 1. The USB interface ID C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * 2. The endpoint control registers (UEPn) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * 3. The BDT registers (ep<#>B) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * 4. The endpoint size C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Example: Assume a USB device class "foo", which uses one out endpoint C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * of size 64-byte and one in endpoint of size 64-byte, then: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_INTF_ID 0x00 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_UEP UEP1 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_BD_OUT ep1Bo C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_BD_IN ep1Bi C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_EP_SIZE 64 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The mapping above has chosen class "foo" to use endpoint 1. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The names are arbitrary and can be anything other than FOO_??????. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * For abstraction, the code for class "foo" should use the abstract C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * definitions of FOO_BD_OUT,FOO_BD_IN, and not ep1Bo or ep1Bi. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Note that the endpoint size defined in the usbcfg.h file is again C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * used in the usbmmap.c file. This shows that the relationship between C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * the two files are tightly related. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The endpoint buffer for each USB function must be located in the C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * dual-port RAM area and has to come after all the BDTs have been C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * instantiated. An example declaration is: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * volatile far unsigned char[FOO_EP_SIZE] data; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The 'volatile' keyword tells the compiler not to perform any code C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * optimization on this variable because its content could be modified C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * by the hardware. The 'far' keyword tells the compiler that this variable C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * is not located in the Access RAM area (0x000 - 0x05F). C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * For the variable to be globally accessible by other files, it should be C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * declared in the header file usbmmap.h as an extern definition, such as C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * extern volatile far unsigned char[FOO_EP_SIZE] data; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Conclusion: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * In a short summary, the dependencies between usbcfg and usbmmap can C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * be shown as: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbcfg[MAX_EP_NUMBER] -> usbmmap C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbmmap[ep<#>B] -> usbcfg C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbcfg[EP size] -> usbmmap C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbcfg[abstract ep definitions] -> usb9/hid/cdc/etc class code C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbmmap[endpoint buffer variable] -> usb9/hid/cdc/etc class code C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Data mapping provides a means for direct addressing of BDT and endpoint C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * buffer. This means less usage of pointers, which equates to a faster and C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * smaller program code. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /** U S B G L O B A L V A R I A B L E S ************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c byte usb_device_state; // Device States: DETACHED, ATTACHED, ... C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c USB_DEVICE_STATUS usb_stat; // Global USB flags C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c byte usb_active_cfg; // Value of current configuration C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c byte usb_alt_intf[MAX_NUM_INT]; // Array to keep track of the current alternate C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c // setting for each interface ID C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /** U S B F I X E D L O C A T I O N V A R I A B L E S *********************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #pragma udata usbram4=0x400 //See Linker Script,usb4:0x400-0x4FF(256-byte) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Section A: Buffer Descriptor Table C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - 0x400 - 0x4FF(max) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - MAX_EP_NUMBER is defined in autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - BDT data type is defined in system\usb\usbmmap.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(0 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep0Bo; //Endpoint #0 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep0Bi; //Endpoint #0 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(1 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep1Bo; //Endpoint #1 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep1Bi; //Endpoint #1 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(2 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep2Bo; //Endpoint #2 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep2Bi; //Endpoint #2 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(3 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep3Bo; //Endpoint #3 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep3Bi; //Endpoint #3 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(4 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep4Bo; //Endpoint #4 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep4Bi; //Endpoint #4 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(5 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep5Bo; //Endpoint #5 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep5Bi; //Endpoint #5 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(6 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep6Bo; //Endpoint #6 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep6Bi; //Endpoint #6 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(7 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep7Bo; //Endpoint #7 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep7Bi; //Endpoint #7 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(8 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep8Bo; //Endpoint #8 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep8Bi; //Endpoint #8 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(9 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep9Bo; //Endpoint #9 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep9Bi; //Endpoint #9 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(10 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep10Bo; //Endpoint #10 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep10Bi; //Endpoint #10 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(11 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep11Bo; //Endpoint #11 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep11Bi; //Endpoint #11 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(12 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep12Bo; //Endpoint #12 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep12Bi; //Endpoint #12 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(13 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep13Bo; //Endpoint #13 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep13Bi; //Endpoint #13 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(14 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep14Bo; //Endpoint #14 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep14Bi; //Endpoint #14 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(15 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep15Bo; //Endpoint #15 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep15Bi; //Endpoint #15 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Section B: EP0 Buffer Space C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c ****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Two buffer areas are defined: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * A. CTRL_TRF_SETUP C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Size = EP0_BUFF_SIZE as defined in autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Detailed data structure allows direct adddressing of bits and bytes. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * B. CTRL_TRF_DATA C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Size = EP0_BUFF_SIZE as defined in autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Data structure allows direct adddressing of the first 8 bytes. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Both data types are defined in system\usb\usbdefs\usbdefs_ep0_buff.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far CTRL_TRF_SETUP SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far CTRL_TRF_DATA CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Section C: CDC Buffer C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c ****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #pragma udata usbram5a=0x500 //See Linker Script,usb5:0x500-... C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if defined(USB_USE_CDC) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far unsigned char cdc_notice[CDC_INT_EP_SIZE]; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far unsigned char cdc_data_rx[CDC_BULK_OUT_EP_SIZE]; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far unsigned char cdc_data_tx[CDC_BULK_IN_EP_SIZE]; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /** EOF usbmmap.c ************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * FileName: usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * license. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #include C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #include "io_cfg.h" // Required for USBCheckBusStatus() C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBModuleEnable(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBModuleDisable(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBSuspend(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBWakeFromSuspend(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBProtocolResetHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USB_SOF_Handler(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBStallHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBErrorHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #pragma code C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBCheckBusStatus(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This routine enables/disables the USB module by monitoring C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the USB power signal. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBCheckBusStatus(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Bus Attachment & Detachment Detection C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * usb_bus_sense is an i/o pin defined in io_cfg.h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #define USB_BUS_ATTACHED 1 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #define USB_BUS_DETACHED 0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c if(usb_bus_sense == USB_BUS_ATTACHED) // Is USB bus attached? C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f6c a66d BTFSS 0x6d,0x3,0x0 if(UCONbits.USBEN == 0) // Is the module off? C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f6e d810 RCALL 0x3f90 USBModuleEnable(); // Is off, enable it C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c } C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f70 d002 BRA 0x3f76 else C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f72 b66d BTFSC 0x6d,0x3,0x0 if(UCONbits.USBEN == 1) // Is the module on? C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f74 d814 RCALL 0x3f9e USBModuleDisable(); // Is on, disable it C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c }//end if(usb_bus_sense...) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * After enabling the USB module, it takes some time for the voltage C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * on the D+ or D- line to rise high enough to get out of the SE0 condition. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * The USB Reset interrupt should not be unmasked until the SE0 condition is C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * cleared. This helps preventing the firmware from misinterpreting this C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * unique event as a USB bus reset from the USB host. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f76 0101 MOVLB 0x1 if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f78 05d2 DECF 0xd2,0x0,0x1 003f7a e109 BNZ 0x3f8e { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f7c ba6d BTFSC 0x6d,0x5,0x0 if(!UCONbits.SE0) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f7e d007 BRA 0x3f8e { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f80 6a68 CLRF 0x68,0x0 UIR = 0; // Clear all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f82 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f84 8069 BSF 0x69,0x0,0x0 UIEbits.URSTIE = 1; // Unmask RESET interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f86 8869 BSF 0x69,0x4,0x0 UIEbits.IDLEIE = 1; // Unmask IDLE interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f88 0101 MOVLB 0x1 usb_device_state = POWERED_STATE; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f8a 0e02 MOVLW 0x2 003f8c 6fd2 MOVWF 0xd2,0x1 }//end if // else wait until SE0 is cleared C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c }//end if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f8e 0012 RETURN 0x0 }//end USBCheckBusStatus C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBModuleEnable(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This routine enables the USB module. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * An end designer should never have to call this routine C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * manually. This routine should only be called from C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * USBCheckBusStatus(). C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: See USBCheckBusStatus() for more information. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBModuleEnable(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f90 6a6d CLRF 0x6d,0x0 UCON = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f92 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f94 866d BSF 0x6d,0x3,0x0 UCONbits.USBEN = 1; // Enable module & attach to bus C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f96 0101 MOVLB 0x1 usb_device_state = ATTACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f98 0e01 MOVLW 0x1 003f9a 6fd2 MOVWF 0xd2,0x1 003f9c 0012 RETURN 0x0 }//end USBModuleEnable C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBModuleDisable(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This routine disables the USB module. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * An end designer should never have to call this routine C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * manually. This routine should only be called from C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * USBCheckBusStatus(). C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: See USBCheckBusStatus() for more information. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBModuleDisable(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f9e 6a6d CLRF 0x6d,0x0 UCON = 0; // Disable module & detach from bus C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fa0 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fa2 0101 MOVLB 0x1 usb_device_state = DETACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fa4 6bd2 CLRF 0xd2,0x1 003fa6 0012 RETURN 0x0 }//end USBModuleDisable C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBSoftDetach(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: The device will have to be re-enumerated to function again. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: USBSoftDetach electrically disconnects the device from C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the bus. This is done by stop supplying Vusb voltage to C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * pull-up resistor. The pull-down resistors on the host C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * side will pull both differential signal lines low and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the host registers the event as a disconnect. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Since the USB cable is not physically disconnected, the C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * power supply through the cable can still be sensed by C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the device. The next time USBCheckBusStatus() function C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * is called, it will reconnect the device back to the bus. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBSoftDetach(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fa8 dffa RCALL 0x3f9e USBModuleDisable(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003faa 0012 RETURN 0x0 }//end USBSoftDetach C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBDriverService(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This routine is the heart of this firmware. It manages C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * all USB interrupts. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: Device state transitions through the following stages: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * DETACHED -> ATTACHED -> POWERED -> DEFAULT -> C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ADDRESS_PENDING -> ADDRESSED -> CONFIGURED -> READY C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBDriverService(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if USB cable is not even attached. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fac 0101 MOVLB 0x1 if(usb_device_state == DETACHED_STATE) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fae 51d2 MOVF 0xd2,0x0,0x1 003fb0 e101 BNZ 0x3fb4 003fb2 d03a BRA 0x4028 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Task A: Service USB Activity Interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fb4 5068 MOVF 0x68,0x0,0x0 if(UIRbits.ACTVIF && UIEbits.ACTVIE) USBWakeFromSuspend(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fb6 0b04 ANDLW 0x4 003fb8 e004 BZ 0x3fc2 003fba 5069 MOVF 0x69,0x0,0x0 003fbc 0b04 ANDLW 0x4 003fbe e001 BZ 0x3fc2 003fc0 d83c RCALL 0x403a C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if the device is in suspend mode. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fc2 b26d BTFSC 0x6d,0x1,0x0 if(UCONbits.SUSPND==1) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fc4 d031 BRA 0x4028 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Task B: Service USB Bus Reset Interrupt. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * When bus reset is received during suspend, ACTVIF will be set first, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * once the UCONbits.SUSPND is clear, then the URSTIF bit will be asserted. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * This is why URSTIF is checked after ACTVIF. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fc6 5068 MOVF 0x68,0x0,0x0 if(UIRbits.URSTIF && UIEbits.URSTIE) USBProtocolResetHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fc8 0b01 ANDLW 0x1 003fca e004 BZ 0x3fd4 003fcc 5069 MOVF 0x69,0x0,0x0 003fce 0b01 ANDLW 0x1 003fd0 e001 BZ 0x3fd4 003fd2 d856 RCALL 0x4080 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Task C: Service other USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fd4 5068 MOVF 0x68,0x0,0x0 if(UIRbits.IDLEIF && UIEbits.IDLEIE) USBSuspend(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fd6 0b10 ANDLW 0x10 003fd8 e004 BZ 0x3fe2 003fda 5069 MOVF 0x69,0x0,0x0 003fdc 0b10 ANDLW 0x10 003fde e001 BZ 0x3fe2 003fe0 d824 RCALL 0x402a 003fe2 5068 MOVF 0x68,0x0,0x0 if(UIRbits.SOFIF && UIEbits.SOFIE) USB_SOF_Handler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fe4 0b40 ANDLW 0x40 003fe6 e004 BZ 0x3ff0 003fe8 5069 MOVF 0x69,0x0,0x0 003fea 0b40 ANDLW 0x40 003fec e001 BZ 0x3ff0 003fee d83d RCALL 0x406a 003ff0 5068 MOVF 0x68,0x0,0x0 if(UIRbits.STALLIF && UIEbits.STALLIE) USBStallHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ff2 0b20 ANDLW 0x20 003ff4 e004 BZ 0x3ffe 003ff6 5069 MOVF 0x69,0x0,0x0 003ff8 0b20 ANDLW 0x20 003ffa e001 BZ 0x3ffe 003ffc d838 RCALL 0x406e 003ffe 5068 MOVF 0x68,0x0,0x0 if(UIRbits.UERRIF && UIEbits.UERRIE) USBErrorHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004000 0b02 ANDLW 0x2 004002 e004 BZ 0x400c 004004 5069 MOVF 0x69,0x0,0x0 004006 0b02 ANDLW 0x2 004008 e001 BZ 0x400c 00400a d838 RCALL 0x407c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if the host has not sent a bus reset. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Once bus reset is received, the device transitions into the DEFAULT C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * state and is ready for communication. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00400c 0e03 MOVLW 0x3 if(usb_device_state < DEFAULT_STATE) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00400e 0101 MOVLB 0x1 004010 5dd2 SUBWF 0xd2,0x0,0x1 004012 e201 BC 0x4016 004014 d009 BRA 0x4028 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Task D: Servicing USB Transaction Complete Interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004016 5068 MOVF 0x68,0x0,0x0 if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004018 0b08 ANDLW 0x8 00401a e006 BZ 0x4028 00401c 5069 MOVF 0x69,0x0,0x0 00401e 0b08 ANDLW 0x8 004020 e003 BZ 0x4028 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * USBCtrlEPService only services transactions over EP0. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * It ignores all other EP transactions. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004022 ec8a CALL 0x3914,0x0 USBCtrlEPService(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004024 f01c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Other EP can be serviced later by responsible device class firmware. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Each device driver knows when an OUT or IN transaction is ready by C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * checking the buffer ownership bit. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * An OUT EP should always be owned by SIE until the data is ready. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * An IN EP should always be owned by CPU until the data is ready. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Because of this logic, it is not necessary to save the USTAT value C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * of non-EP0 transactions. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004026 9668 BCF 0x68,0x3,0x0 UIRbits.TRNIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c }//end if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004028 0012 RETURN 0x0 }//end USBDriverService C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBSuspend(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBSuspend(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * NOTE: Do not clear UIRbits.ACTVIF here! C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Reason: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ACTVIF is only generated once an IDLEIF has been generated. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * This is a 1:1 ratio interrupt generation. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * For every IDLEIF, there will be only one ACTVIF regardless of C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the number of subsequent bus transitions. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If the ACTIF is cleared here, a problem could occur when: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * [ IDLE ][bus activity -> C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * <--- 3 ms -----> ^ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ^ ACTVIF=1 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * IDLEIF=1 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * # # # # (#=Program polling flags) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ^ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * This polling loop will see both C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * IDLEIF=1 and ACTVIF=1. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * However, the program services IDLEIF first C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * because ACTIVIE=0. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If this routine clears the only ACTIVIF, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * then it can never get out of the suspend C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * mode. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00402a 8469 BSF 0x69,0x2,0x0 UIEbits.ACTVIE = 1; // Enable bus activity interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00402c 9868 BCF 0x68,0x4,0x0 UIRbits.IDLEIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00402e 826d BSF 0x6d,0x1,0x0 UCONbits.SUSPND = 1; // Put USB module in power conserve C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c // mode, SIE clock inactive C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * At this point the PIC can go into sleep,idle, or C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * switch to a slower clock, etc. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004030 9aa1 BCF 0xa1,0x5,0x0 PIR2bits.USBIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004032 8aa0 BSF 0xa0,0x5,0x0 PIE2bits.USBIE = 1; // Set USB wakeup source C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004034 0003 SLEEP Sleep(); // Goto sleep C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004036 9aa0 BCF 0xa0,0x5,0x0 PIE2bits.USBIE = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* End Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004038 0012 RETURN 0x0 }//end USBSuspend C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBWakeFromSuspend(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBWakeFromSuspend(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If using clock switching, this is the place to restore the C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * original clock frequency. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00403a 926d BCF 0x6d,0x1,0x0 UCONbits.SUSPND = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00403c 9469 BCF 0x69,0x2,0x0 UIEbits.ACTVIE = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00403e 9468 BCF 0x68,0x2,0x0 UIRbits.ACTVIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004040 0012 RETURN 0x0 }//end USBWakeFromSuspend C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBRemoteWakeup(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This function should be called by user when the device C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * is waken up by an external stimulus other than ACTIVIF. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Please read the note below to understand the limitations. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: The modifiable section in this routine should be changed C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * to meet the application needs. Current implementation C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * temporary blocks other functions from executing for a C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * period of 1-13 ms depending on the core frequency. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * According to USB 2.0 specification section 7.1.7.7, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * "The remote wakeup device must hold the resume signaling C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * for at lest 1 ms but for no more than 15 ms." C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * The idea here is to use a delay counter loop, using a C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * common value that would work over a wide range of core C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * frequencies. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * That value selected is 1800. See table below: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Core Freq(MHz) MIP RESUME Signal Period (ms) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 48 12 1.05 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 4 1 12.6 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * * These timing could be incorrect when using code C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * optimization or extended instruction mode, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * or when having other interrupts enabled. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Make sure to verify using the MPLAB SIM's Stopwatch C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBRemoteWakeup(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c static word delay_count; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004042 0101 MOVLB 0x1 if(usb_stat.RemoteWakeup == 1) // Check if RemoteWakeup function C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004044 a1d3 BTFSS 0xd3,0x0,0x1 004046 d010 BRA 0x4068 { // has been enabled by the host. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004048 dff8 RCALL 0x403a USBWakeFromSuspend(); // Unsuspend USB modue C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00404a 846d BSF 0x6d,0x2,0x0 UCONbits.RESUME = 1; // Start RESUME signaling C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00404c 0101 MOVLB 0x1 delay_count = 1800U; // Set RESUME line for 1-13 ms C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00404e 0e08 MOVLW 0x8 004050 6fda MOVWF 0xda,0x1 004052 0e07 MOVLW 0x7 004054 6fdb MOVWF 0xdb,0x1 do C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004056 0101 MOVLB 0x1 delay_count--; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004058 07da DECF 0xda,0x1,0x1 00405a 0e00 MOVLW 0x0 00405c 5bdb SUBWFB 0xdb,0x1,0x1 00405e 0101 MOVLB 0x1 }while(delay_count); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004060 51da MOVF 0xda,0x0,0x1 004062 11db IORWF 0xdb,0x0,0x1 004064 e1f8 BNZ 0x4056 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* End Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004066 946d BCF 0x6d,0x2,0x0 UCONbits.RESUME = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c }//endif C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004068 0012 RETURN 0x0 }//end USBRemoteWakeup C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USB_SOF_Handler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: The USB host sends out a SOF packet to full-speed devices C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * every 1 ms. This interrupt may be useful for isochronous C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * pipes. End designers should implement callback routine C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * as necessary. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USB_SOF_Handler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* Callback routine here */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00406a 9c68 BCF 0x68,0x6,0x0 UIRbits.SOFIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00406c 0012 RETURN 0x0 }//end USB_SOF_Handler C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBStallHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: A STALL packet is sent to the host by the SIE. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: The STALLIF is set anytime the SIE sends out a STALL C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * packet regardless of which endpoint causes it. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * A Setup transaction overrides the STALL function. A stalled C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * endpoint stops stalling once it receives a setup packet. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * In this case, the SIE will accepts the Setup packet and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * set the TRNIF flag to notify the firmware. STALL function C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * for that particular endpoint pipe will be automatically C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * disabled (direction specific). C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * There are a few reasons for an endpoint to be stalled. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 1. When a non-supported USB request is received. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Example: GET_DESCRIPTOR(DEVICE_QUALIFIER) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 2. When an endpoint is currently halted. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 3. When the device class specifies that an endpoint must C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * stall in response to a specific event. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Example: Mass Storage Device Class C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If the CBW is not valid, the device shall C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * STALL the Bulk-In pipe. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * See USB Mass Storage Class Bulk-only Transport C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Specification for more details. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: UEPn.EPSTALL can be scanned to see which endpoint causes C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the stall event. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBStallHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Does not really have to do anything here, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * even for the control endpoint. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * All BDs of Endpoint 0 are owned by SIE right now, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * but once a Setup Transaction is received, the ownership C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * for EP0_OUT will be returned to CPU. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * When the Setup Transaction is serviced, the ownership C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * for EP0_IN will then be forced back to CPU by firmware. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00406e a070 BTFSS 0x70,0x0,0x0 if(UEP0bits.EPSTALL == 1) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004070 d003 BRA 0x4078 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004072 ec17 CALL 0x3c2e,0x0 USBPrepareForNextSetupTrf(); // Firmware work-around C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004074 f01e 004076 9070 BCF 0x70,0x0,0x0 UEP0bits.EPSTALL = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c } C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004078 9a68 BCF 0x68,0x5,0x0 UIRbits.STALLIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00407a 0012 RETURN 0x0 }//end USBStallHandler C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBErrorHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: The purpose of this interrupt is mainly for debugging C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * during development. Check UEIR to see which error causes C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the interrupt. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBErrorHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00407c 9268 BCF 0x68,0x1,0x0 UIRbits.UERRIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00407e 0012 RETURN 0x0 }//end USBErrorHandler C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBProtocolResetHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: A USB bus reset is received from the host. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: Currently, this routine flushes any pending USB C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * transactions. It empties out the USTAT FIFO. This action C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * might not be desirable in some applications. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: Once a USB bus reset is received from the host, this C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * routine should be called. It resets the device address to C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * zero, disables all non-EP0 endpoints, initializes EP0 to C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * be ready for default communication, clears all USB C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * interrupt flags, unmasks applicable USB interrupts, and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * reinitializes internal state-machine variables. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBProtocolResetHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004080 6a6a CLRF 0x6a,0x0 UEIR = 0; // Clear all USB error flags C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004082 6a68 CLRF 0x68,0x0 UIR = 0; // Clears all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004084 0e9f MOVLW 0x9f UEIE = 0b10011111; // Unmask all USB error interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004086 6e6b MOVWF 0x6b,0x0 004088 0e7b MOVLW 0x7b UIE = 0b01111011; // Enable all interrupts except ACTVIE C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00408a 6e69 MOVWF 0x69,0x0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00408c 6a6e CLRF 0x6e,0x0 UADDR = 0x00; // Reset to default address C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00408e 0e0f MOVLW 0xf mDisableEP1to15(); // Reset all non-EP0 UEPn registers C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004090 6ee6 MOVWF 0xe6,0x0 004092 0e71 MOVLW 0x71 004094 6ee6 MOVWF 0xe6,0x0 004096 0e0f MOVLW 0xf 004098 6ee6 MOVWF 0xe6,0x0 00409a d814 RCALL 0x40c4 00409c 52e5 MOVF 0xe5,0x1,0x0 00409e 52e5 MOVF 0xe5,0x1,0x0 0040a0 52e5 MOVF 0xe5,0x1,0x0 0040a2 0e16 MOVLW 0x16 UEP0 = EP_CTRL|HSHK_EN; // Init EP0 as a Ctrl EP, see usbdrv.h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040a4 6e70 MOVWF 0x70,0x0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040a6 a668 BTFSS 0x68,0x3,0x0 while(UIRbits.TRNIF == 1) // Flush any pending transactions C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040a8 d002 BRA 0x40ae 0040ac d7fc BRA 0x40a6 0040aa 9668 BCF 0x68,0x3,0x0 UIRbits.TRNIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040ae 986d BCF 0x6d,0x4,0x0 UCONbits.PKTDIS = 0; // Make sure packet processing is enabled C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040b0 ec17 CALL 0x3c2e,0x0 USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040b2 f01e C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040b4 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 0; // Default status flag to disable C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040b6 91d3 BCF 0xd3,0x0,0x1 0040b8 0101 MOVLB 0x1 usb_active_cfg = 0; // Clear active configuration C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040ba 6bd4 CLRF 0xd4,0x1 0040bc 0101 MOVLB 0x1 usb_device_state = DEFAULT_STATE; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040be 0e03 MOVLW 0x3 0040c0 6fd2 MOVWF 0xd2,0x1 0040c2 0012 RETURN 0x0 }//end USBProtocolResetHandler C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* Auxiliary Function */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040c4 cfd9 MOVFF 0xfd9,0xfe6 void ClearArray(byte* startAdr,byte count) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040c6 ffe6 0040c8 cfe1 MOVFF 0xfe1,0xfd9 0040ca ffd9 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040cc 0efd MOVLW 0xfd *startAdr; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040ce cfdb MOVFF 0xfdb,0xfe9 0040d0 ffe9 0040d2 0efe MOVLW 0xfe 0040d4 cfdb MOVFF 0xfdb,0xfea 0040d6 ffea 0040d8 0efc MOVLW 0xfc while(count) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040da 50db MOVF 0xdb,0x0,0x0 0040dc e004 BZ 0x40e6 0040e4 d7f9 BRA 0x40d8 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c _asm C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040de 6aee CLRF 0xee,0x0 clrf POSTINC0,0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c _endasm C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040e0 0efc MOVLW 0xfc count--; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040e2 06db DECF 0xdb,0x1,0x0 }//end while C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040e6 52e5 MOVF 0xe5,0x1,0x0 }//end ClearArray C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040e8 cfe7 MOVFF 0xfe7,0xfd9 0040ea ffd9 0040ec 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** EOF usbdrv.c *************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * FileName: usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * license. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #include C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #include "io_cfg.h" // Required for self_power status C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdGetDscHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdSetCfgHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdGetStatusHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdFeatureReqHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #pragma code C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBCheckStdRequest(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine checks the setup data packet to see if it C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * knows how to handle it C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBCheckStdRequest(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c4e 0104 MOVLB 0x4 if(SetupPkt.RequestType != STANDARD) return; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c50 5120 MOVF 0x20,0x0,0x1 003c52 0b60 ANDLW 0x60 003c54 42e8 RRNCF 0xe8,0x1,0x0 003c56 42e8 RRNCF 0xe8,0x1,0x0 003c58 42e8 RRNCF 0xe8,0x1,0x0 003c5a 42e8 RRNCF 0xe8,0x1,0x0 003c5c 42e8 RRNCF 0xe8,0x1,0x0 003c5e 0900 IORLW 0x0 003c60 e001 BZ 0x3c64 003c62 d058 BRA 0x3d14 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c64 0104 MOVLB 0x4 switch(SetupPkt.bRequest) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c66 5121 MOVF 0x21,0x0,0x1 003c68 0a07 XORLW 0x7 003c6a e053 BZ 0x3d12 003c6c 0a0b XORLW 0xb 003c6e e051 BZ 0x3d12 003c70 0a07 XORLW 0x7 003c72 e042 BZ 0x3cf8 003c74 0a01 XORLW 0x1 003c76 e02c BZ 0x3cd0 003c78 0a0b XORLW 0xb 003c7a e028 BZ 0x3ccc 003c7c 0a02 XORLW 0x2 003c7e e026 BZ 0x3ccc 003c80 0a03 XORLW 0x3 003c82 e022 BZ 0x3cc8 003c84 0a08 XORLW 0x8 003c86 e012 BZ 0x3cac 003c88 0a01 XORLW 0x1 003c8a e00e BZ 0x3ca8 003c8c 0a0f XORLW 0xf 003c8e e00a BZ 0x3ca4 003c90 0a03 XORLW 0x3 003c92 e001 BZ 0x3c96 003c94 d03e BRA 0x3d12 { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_ADR: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c96 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c98 0e01 MOVLW 0x1 003c9a 6fcb MOVWF 0xcb,0x1 003c9c 0101 MOVLB 0x1 usb_device_state = ADR_PENDING_STATE; // Update state only C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c9e 0e04 MOVLW 0x4 003ca0 6fd2 MOVWF 0xd2,0x1 /* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ca2 d038 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case GET_DSC: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ca4 d838 RCALL 0x3d16 USBStdGetDscHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ca6 d036 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_CFG: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ca8 d893 RCALL 0x3dd0 USBStdSetCfgHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003caa d034 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case GET_CFG: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cac 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cae 0e01 MOVLW 0x1 003cb0 6fcb MOVWF 0xcb,0x1 003cb2 0101 MOVLB 0x1 pSrc.bRam = (byte*)&usb_active_cfg; // Set Source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cb4 0ed4 MOVLW 0xd4 003cb6 6fcc MOVWF 0xcc,0x1 003cb8 0e01 MOVLW 0x1 003cba 6fcd MOVWF 0xcd,0x1 003cbc 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cbe 93d3 BCF 0xd3,0x1,0x1 003cc0 0101 MOVLB 0x1 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cc2 0e01 MOVLW 0x1 003cc4 6fd0 MOVWF 0xd0,0x1 003cc6 d026 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case GET_STATUS: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cc8 d8ab RCALL 0x3e20 USBStdGetStatusHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cca d024 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case CLR_FEATURE: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_FEATURE: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ccc d8f9 RCALL 0x3ec0 USBStdFeatureReqHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cce d022 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case GET_INTF: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cd0 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cd2 0e01 MOVLW 0x1 003cd4 6fcb MOVWF 0xcb,0x1 003cd6 0104 MOVLB 0x4 pSrc.bRam = (byte*)&usb_alt_intf+SetupPkt.bIntfID; // Set source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cd8 5124 MOVF 0x24,0x0,0x1 003cda 0101 MOVLB 0x1 003cdc 6fcc MOVWF 0xcc,0x1 003cde 6bcd CLRF 0xcd,0x1 003ce0 0ed5 MOVLW 0xd5 003ce2 0101 MOVLB 0x1 003ce4 27cc ADDWF 0xcc,0x1,0x1 003ce6 0e01 MOVLW 0x1 003ce8 0101 MOVLB 0x1 003cea 23cd ADDWFC 0xcd,0x1,0x1 003cec 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cee 93d3 BCF 0xd3,0x1,0x1 003cf0 0101 MOVLB 0x1 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cf2 0e01 MOVLW 0x1 003cf4 6fd0 MOVWF 0xd0,0x1 003cf6 d00e BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_INTF: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cf8 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cfa 0e01 MOVLW 0x1 003cfc 6fcb MOVWF 0xcb,0x1 003cfe 0104 MOVLB 0x4 usb_alt_intf[SetupPkt.bIntfID] = SetupPkt.bAltID; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d00 5124 MOVF 0x24,0x0,0x1 003d02 6aea CLRF 0xea,0x0 003d04 0fd5 ADDLW 0xd5 003d06 6ee9 MOVWF 0xe9,0x0 003d08 0e01 MOVLW 0x1 003d0a 22ea ADDWFC 0xea,0x1,0x0 003d0c c422 MOVFF 0x422,0xfef 003d0e ffef 003d10 d001 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_DSC: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SYNCH_FRAME: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c default: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d12 d000 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d14 0012 RETURN 0x0 }//end USBCheckStdRequest C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBStdGetDscHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine handles the standard GET_DESCRIPTOR request. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * It utilizes tables dynamically looks up descriptor size. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * This routine should never have to be modified if the tables C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * in usbdsc.c are declared correctly. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdGetDscHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d16 0e80 MOVLW 0x80 if(SetupPkt.bmRequestType == 0x80) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d18 0104 MOVLB 0x4 003d1a 5d20 SUBWF 0x20,0x0,0x1 003d1c e158 BNZ 0x3dce { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d1e 0104 MOVLB 0x4 switch(SetupPkt.bDscType) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d20 5123 MOVF 0x23,0x0,0x1 003d22 0a03 XORLW 0x3 003d24 e034 BZ 0x3d8e 003d26 0a01 XORLW 0x1 003d28 e010 BZ 0x3d4a 003d2a 0a03 XORLW 0x3 003d2c e001 BZ 0x3d30 003d2e d04d BRA 0x3dca { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case DSC_DEV: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d30 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d32 0e01 MOVLW 0x1 003d34 6fcb MOVWF 0xcb,0x1 003d36 0101 MOVLB 0x1 pSrc.bRom = (rom byte*)&device_dsc; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d38 0e2e MOVLW 0x2e 003d3a 6fcc MOVWF 0xcc,0x1 003d3c 0e43 MOVLW 0x43 003d3e 6fcd MOVWF 0xcd,0x1 003d40 0e12 MOVLW 0x12 wCount._word = sizeof(device_dsc); // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d42 0101 MOVLB 0x1 003d44 6fd0 MOVWF 0xd0,0x1 003d46 6bd1 CLRF 0xd1,0x1 003d48 d040 BRA 0x3dca break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case DSC_CFG: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d4a 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d4c 0e01 MOVLW 0x1 003d4e 6fcb MOVWF 0xcb,0x1 003d50 0104 MOVLB 0x4 pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d52 5122 MOVF 0x22,0x0,0x1 003d54 6ef6 MOVWF 0xf6,0x0 003d56 6af7 CLRF 0xf7,0x0 003d58 90d8 BCF 0xd8,0x0,0x0 003d5a 36f6 RLCF 0xf6,0x1,0x0 003d5c 36f7 RLCF 0xf7,0x1,0x0 003d5e 0eef MOVLW 0xef 003d60 26f6 ADDWF 0xf6,0x1,0x0 003d62 0e43 MOVLW 0x43 003d64 22f7 ADDWFC 0xf7,0x1,0x0 003d66 0009 TBLRDPOSTINC 003d68 cff5 MOVFF 0xff5,0x1cc 003d6a f1cc 003d6c 000a TBLRDPOSTDEC 003d6e cff5 MOVFF 0xff5,0x1cd 003d70 f1cd 003d72 0e02 MOVLW 0x2 wCount._word = *(pSrc.wRom+1); // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d74 0101 MOVLB 0x1 003d76 6af7 CLRF 0xf7,0x0 003d78 25cc ADDWF 0xcc,0x0,0x1 003d7a 6ef6 MOVWF 0xf6,0x0 003d7c 51cd MOVF 0xcd,0x0,0x1 003d7e 22f7 ADDWFC 0xf7,0x1,0x0 003d80 0009 TBLRDPOSTINC 003d82 cff5 MOVFF 0xff5,0x1d0 003d84 f1d0 003d86 000a TBLRDPOSTDEC 003d88 cff5 MOVFF 0xff5,0x1d1 003d8a f1d1 003d8c d01e BRA 0x3dca break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case DSC_STR: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d8e 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d90 0e01 MOVLW 0x1 003d92 6fcb MOVWF 0xcb,0x1 003d94 0104 MOVLB 0x4 pSrc.bRom = *(USB_SD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d96 5122 MOVF 0x22,0x0,0x1 003d98 6ef6 MOVWF 0xf6,0x0 003d9a 6af7 CLRF 0xf7,0x0 003d9c 90d8 BCF 0xd8,0x0,0x0 003d9e 36f6 RLCF 0xf6,0x1,0x0 003da0 36f7 RLCF 0xf7,0x1,0x0 003da2 0ef3 MOVLW 0xf3 003da4 26f6 ADDWF 0xf6,0x1,0x0 003da6 0e43 MOVLW 0x43 003da8 22f7 ADDWFC 0xf7,0x1,0x0 003daa 0009 TBLRDPOSTINC 003dac cff5 MOVFF 0xff5,0x1cc 003dae f1cc 003db0 000a TBLRDPOSTDEC 003db2 cff5 MOVFF 0xff5,0x1cd 003db4 f1cd 003db6 c1cc MOVFF 0x1cc,0xff6 wCount._word = *pSrc.bRom; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003db8 fff6 003dba c1cd MOVFF 0x1cd,0xff7 003dbc fff7 003dbe 0008 TBLRD 003dc0 50f5 MOVF 0xf5,0x0,0x0 003dc2 0101 MOVLB 0x1 003dc4 6fd0 MOVWF 0xd0,0x1 003dc6 6bd1 CLRF 0xd1,0x1 003dc8 d000 BRA 0x3dca break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dca 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _ROM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dcc 83d3 BSF 0xd3,0x1,0x1 }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dce 0012 RETURN 0x0 }//end USBStdGetDscHandler C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBStdSetCfgHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine first disables all endpoints by clearing C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * UEP registers. It then configures (initializes) endpoints C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * specified in the modifiable section. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdSetCfgHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dd0 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dd2 0e01 MOVLW 0x1 003dd4 6fcb MOVWF 0xcb,0x1 003dd6 0e0f MOVLW 0xf mDisableEP1to15(); // See usbdrv.h C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dd8 6ee6 MOVWF 0xe6,0x0 003dda 0e71 MOVLW 0x71 003ddc 6ee6 MOVWF 0xe6,0x0 003dde 0e0f MOVLW 0xf 003de0 6ee6 MOVWF 0xe6,0x0 003de2 ec62 CALL 0x40c4,0x0 003de4 f020 003de6 52e5 MOVF 0xe5,0x1,0x0 003de8 52e5 MOVF 0xe5,0x1,0x0 003dea 52e5 MOVF 0xe5,0x1,0x0 003dec 0e01 MOVLW 0x1 ClearArray((byte*)&usb_alt_intf,MAX_NUM_INT); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dee 6ee6 MOVWF 0xe6,0x0 003df0 0ed5 MOVLW 0xd5 003df2 6ee6 MOVWF 0xe6,0x0 003df4 0e01 MOVLW 0x1 003df6 6ee6 MOVWF 0xe6,0x0 003df8 ec62 CALL 0x40c4,0x0 003dfa f020 003dfc 52e5 MOVF 0xe5,0x1,0x0 003dfe 52e5 MOVF 0xe5,0x1,0x0 003e00 52e5 MOVF 0xe5,0x1,0x0 003e02 c422 MOVFF 0x422,0x1d4 usb_active_cfg = SetupPkt.bCfgValue; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e04 f1d4 003e06 0104 MOVLB 0x4 if(SetupPkt.bCfgValue == 0) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e08 5122 MOVF 0x22,0x0,0x1 003e0a e104 BNZ 0x3e14 003e0c 0101 MOVLB 0x1 usb_device_state = ADDRESS_STATE; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e0e 0e05 MOVLW 0x5 003e10 6fd2 MOVWF 0xd2,0x1 003e12 d005 BRA 0x3e1e else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e14 0101 MOVLB 0x1 usb_device_state = CONFIGURED_STATE; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e16 0e06 MOVLW 0x6 003e18 6fd2 MOVWF 0xd2,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /* Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #if defined(USB_USE_CDC) // See autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e1a ec05 CALL 0x360a,0x0 CDCInitEP(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e1c f01b #endif C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /* End modifiable section */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end if(SetupPkt.bcfgValue == 0) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e1e 0012 RETURN 0x0 }//end USBStdSetCfgHandler C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBStdGetStatusHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine handles the standard GET_STATUS request C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdGetStatusHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e20 0104 MOVLB 0x4 CtrlTrfData._byte0 = 0; // Initialize content C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e22 6b28 CLRF 0x28,0x1 003e24 0104 MOVLB 0x4 CtrlTrfData._byte1 = 0; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e26 6b29 CLRF 0x29,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e28 0104 MOVLB 0x4 switch(SetupPkt.Recipient) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e2a 5120 MOVF 0x20,0x0,0x1 003e2c 0b1f ANDLW 0x1f 003e2e 0a02 XORLW 0x2 003e30 e014 BZ 0x3e5a 003e32 0a03 XORLW 0x3 003e34 e00e BZ 0x3e52 003e36 0a01 XORLW 0x1 003e38 e001 BZ 0x3e3c 003e3a d034 BRA 0x3ea4 { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case RCPT_DEV: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e3c 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e3e 0e01 MOVLW 0x1 003e40 6fcb MOVWF 0xcb,0x1 /* C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * _byte0: bit0: Self-Powered Status [0] Bus-Powered [1] Self-Powered C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * bit1: RemoteWakeup [0] Disabled [1] Enabled C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c if(self_power == 1) // self_power defined in io_cfg.h C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e42 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b000000001; // Set bit0 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e44 8128 BSF 0x28,0x0,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e46 0101 MOVLB 0x1 if(usb_stat.RemoteWakeup == 1) // usb_stat defined in usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e48 a1d3 BTFSS 0xd3,0x0,0x1 003e4a d002 BRA 0x3e50 003e4c 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b00000010; // Set bit1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e4e 8328 BSF 0x28,0x1,0x1 003e50 d029 BRA 0x3ea4 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case RCPT_INTF: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e52 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; // No data to update C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e54 0e01 MOVLW 0x1 003e56 6fcb MOVWF 0xcb,0x1 003e58 d025 BRA 0x3ea4 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case RCPT_EP: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e5a 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e5c 0e01 MOVLW 0x1 003e5e 6fcb MOVWF 0xcb,0x1 /* C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * _byte0: bit0: Halt Status [0] Not Halted [1] Halted C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e60 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e62 5124 MOVF 0x24,0x0,0x1 003e64 0b0f ANDLW 0xf 003e66 0d08 MULLW 0x8 003e68 50f3 MOVF 0xf3,0x0,0x0 003e6a 6a2b CLRF 0x2b,0x0 003e6c 0f00 ADDLW 0x0 003e6e 6e2a MOVWF 0x2a,0x0 003e70 0e04 MOVLW 0x4 003e72 222b ADDWFC 0x2b,0x1,0x0 003e74 0104 MOVLB 0x4 003e76 5124 MOVF 0x24,0x0,0x1 003e78 0b80 ANDLW 0x80 003e7a e001 BZ 0x3e7e 003e7c 0e01 MOVLW 0x1 003e7e 0d04 MULLW 0x4 003e80 50f3 MOVF 0xf3,0x0,0x0 003e82 0101 MOVLB 0x1 003e84 242a ADDWF 0x2a,0x0,0x0 003e86 6fce MOVWF 0xce,0x1 003e88 0e00 MOVLW 0x0 003e8a 202b ADDWFC 0x2b,0x0,0x0 003e8c 6fcf MOVWF 0xcf,0x1 003e8e c1ce MOVFF 0x1ce,0xfe9 if(*pDst.bRam & _BSTALL) // Use _BSTALL as a bit mask C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e90 ffe9 003e92 c1cf MOVFF 0x1cf,0xfea 003e94 ffea 003e96 50ef MOVF 0xef,0x0,0x0 003e98 0b04 ANDLW 0x4 003e9a e003 BZ 0x3ea2 003e9c 0104 MOVLB 0x4 CtrlTrfData._byte0=0x01;// Set bit0 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e9e 0e01 MOVLW 0x1 003ea0 6f28 MOVWF 0x28,0x1 003ea2 d000 BRA 0x3ea4 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ea4 0101 MOVLB 0x1 if(ctrl_trf_session_owner == MUID_USB9) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ea6 05cb DECF 0xcb,0x0,0x1 003ea8 e10a BNZ 0x3ebe { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eaa 0101 MOVLB 0x1 pSrc.bRam = (byte*)&CtrlTrfData; // Set Source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eac 0e28 MOVLW 0x28 003eae 6fcc MOVWF 0xcc,0x1 003eb0 0e04 MOVLW 0x4 003eb2 6fcd MOVWF 0xcd,0x1 003eb4 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eb6 93d3 BCF 0xd3,0x1,0x1 003eb8 0101 MOVLB 0x1 LSB(wCount) = 2; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eba 0e02 MOVLW 0x2 003ebc 6fd0 MOVWF 0xd0,0x1 }//end if(...) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ebe 0012 RETURN 0x0 }//end USBStdGetStatusHandler C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBStdFeatureReqHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine handles the standard SET & CLEAR FEATURES C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * requests C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdFeatureReqHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ec0 0104 MOVLB 0x4 if((SetupPkt.bFeature == DEVICE_REMOTE_WAKEUP)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ec2 0522 DECF 0x22,0x0,0x1 003ec4 e111 BNZ 0x3ee8 (SetupPkt.Recipient == RCPT_DEV)) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ec6 0104 MOVLB 0x4 003ec8 5120 MOVF 0x20,0x0,0x1 003eca 0b1f ANDLW 0x1f 003ecc 0900 IORLW 0x0 003ece e10c BNZ 0x3ee8 { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ed0 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ed2 0e01 MOVLW 0x1 003ed4 6fcb MOVWF 0xcb,0x1 003ed6 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ed8 0104 MOVLB 0x4 003eda 5d21 SUBWF 0x21,0x0,0x1 003edc e103 BNZ 0x3ee4 003ede 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 1; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ee0 81d3 BSF 0xd3,0x0,0x1 003ee2 d002 BRA 0x3ee8 else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ee4 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 0; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ee6 91d3 BCF 0xd3,0x0,0x1 }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ee8 0104 MOVLB 0x4 if((SetupPkt.bFeature == ENDPOINT_HALT)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eea 5122 MOVF 0x22,0x0,0x1 003eec e13e BNZ 0x3f6a (SetupPkt.Recipient == RCPT_EP)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eee 0104 MOVLB 0x4 003ef0 5120 MOVF 0x20,0x0,0x1 003ef2 0b1f ANDLW 0x1f 003ef4 0802 SUBLW 0x2 003ef6 e139 BNZ 0x3f6a 003ef8 0104 MOVLB 0x4 (SetupPkt.EPNum != 0)) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003efa 5124 MOVF 0x24,0x0,0x1 003efc 0b0f ANDLW 0xf 003efe 0900 IORLW 0x0 003f00 e034 BZ 0x3f6a { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f02 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f04 0e01 MOVLW 0x1 003f06 6fcb MOVWF 0xcb,0x1 /* Must do address calculation here */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f08 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f0a 5124 MOVF 0x24,0x0,0x1 003f0c 0b0f ANDLW 0xf 003f0e 0d08 MULLW 0x8 003f10 50f3 MOVF 0xf3,0x0,0x0 003f12 6a2b CLRF 0x2b,0x0 003f14 0f00 ADDLW 0x0 003f16 6e2a MOVWF 0x2a,0x0 003f18 0e04 MOVLW 0x4 003f1a 222b ADDWFC 0x2b,0x1,0x0 003f1c 0104 MOVLB 0x4 003f1e 5124 MOVF 0x24,0x0,0x1 003f20 0b80 ANDLW 0x80 003f22 e001 BZ 0x3f26 003f24 0e01 MOVLW 0x1 003f26 0d04 MULLW 0x4 003f28 50f3 MOVF 0xf3,0x0,0x0 003f2a 0101 MOVLB 0x1 003f2c 242a ADDWF 0x2a,0x0,0x0 003f2e 6fce MOVWF 0xce,0x1 003f30 0e00 MOVLW 0x0 003f32 202b ADDWFC 0x2b,0x0,0x0 003f34 6fcf MOVWF 0xcf,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f36 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f38 0104 MOVLB 0x4 003f3a 5d21 SUBWF 0x21,0x0,0x1 003f3c e107 BNZ 0x3f4c 003f3e 0e84 MOVLW 0x84 *pDst.bRam = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f40 c1ce MOVFF 0x1ce,0xfe9 003f42 ffe9 003f44 c1cf MOVFF 0x1cf,0xfea 003f46 ffea 003f48 6eef MOVWF 0xef,0x0 003f4a d00f BRA 0x3f6a else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f4c 0104 MOVLB 0x4 if(SetupPkt.EPDir == 1) // IN C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f4e af24 BTFSS 0x24,0x7,0x1 003f50 d006 BRA 0x3f5e 003f52 c1ce MOVFF 0x1ce,0xfe9 *pDst.bRam = _UCPU; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f54 ffe9 003f56 c1cf MOVFF 0x1cf,0xfea 003f58 ffea 003f5a 6aef CLRF 0xef,0x0 003f5c d006 BRA 0x3f6a else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f5e 0e88 MOVLW 0x88 *pDst.bRam = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f60 c1ce MOVFF 0x1ce,0xfe9 003f62 ffe9 003f64 c1cf MOVFF 0x1cf,0xfea 003f66 ffea 003f68 6eef MOVWF 0xef,0x0 }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f6a 0012 RETURN 0x0 }//end USBStdFeatureReqHandler C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** EOF usb9.c ***************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /********************************************************************* C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ********************************************************************* C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * FileName: usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Software License Agreement C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * license. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * -usbdsc.c- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * This file contains the USB descriptor information. It is used C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * in conjunction with the usbdsc.h file. When a descriptor is added C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * or removed from the main configuration descriptor, i.e. CFG01, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * the user must also change the descriptor structure defined in C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * the usbdsc.h file. The structure is used to calculate the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptor size, i.e. sizeof(CFG01). C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * A typical configuration descriptor consists of: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * At least one configuration descriptor (USB_CFG_DSC) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * One or more interface descriptors (USB_INTF_DSC) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * One or more endpoint descriptors (USB_EP_DSC) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Naming Convention: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * To resolve ambiguity, the naming convention are as followed: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * - USB_CFG_DSC type should be named cdxx, where xx is the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * configuration number. This number should match the actual C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * index value of this configuration. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * - USB_INTF_DSC type should be named ia, where yy is the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * interface number and zz is the alternate interface number. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * - USB_EP_DSC type should be named ep<##>_ia, where C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ## is the endpoint number and d is the direction of transfer. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The interface name should also be listed as a suffix to identify C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * which interface does the endpoint belong to. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Example: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * If a device has one configuration, two interfaces; interface 0 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * has two endpoints (in and out), and interface 1 has one endpoint(in). C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Then the CFG01 structure in the usbdsc.h should be: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * #define CFG01 rom struct \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * { USB_CFG_DSC cd01; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_INTF_DSC i00a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_EP_DSC ep01o_i00a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_EP_DSC ep01i_i00a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_INTF_DSC i01a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_EP_DSC ep02i_i01a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * } cfg01 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Note the hierarchy of the descriptors above, it follows the USB C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * specification requirement. All endpoints belonging to an interface C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * should be listed immediately after that interface. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Filling in the descriptor values in the usbdsc.c file: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Most items should be self-explanatory, however, a few will be C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * explained for clarification. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * [Configuration Descriptor(USB_CFG_DSC)] C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The configuration attribute must always have the _DEFAULT C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * definition at the minimum. Additional options can be ORed C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * to the _DEFAULT attribute. Available options are _SELF and _RWU. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * These definitions are defined in the usbdefs_std_dsc.h file. The C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * _SELF tells the USB host that this device is self-powered. The C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * _RWU tells the USB host that this device supports Remote Wakeup. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * [Endpoint Descriptor(USB_EP_DSC)] C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Assume the following example: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * sizeof(USB_EP_DSC),DSC_EP,_EP01_OUT,_BULK,64,0x00 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The first two parameters are self-explanatory. They specify the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * length of this endpoint descriptor (7) and the descriptor type. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The next parameter identifies the endpoint, the definitions are C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * defined in usbdefs_std_dsc.h and has the following naming C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * convention: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * _EP<##>_ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * where ## is the endpoint number and dir is the direction of C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * transfer. The dir has the value of either 'OUT' or 'IN'. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The next parameter identifies the type of the endpoint. Available C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * options are _BULK, _INT, _ISO, and _CTRL. The _CTRL is not C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * typically used because the default control transfer endpoint is C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * not defined in the USB descriptors. When _ISO option is used, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * addition options can be ORed to _ISO. Example: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * _ISO|_AD|_FE C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * This describes the endpoint as an isochronous pipe with adaptive C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * and feedback attributes. See usbdefs_std_dsc.h and the USB C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * specification for details. The next parameter defines the size of C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * the endpoint. The last parameter in the polling interval. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Adding a USB String C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * A string descriptor array should have the following format: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * rom struct{byte bLength;byte bDscType;word string[size];}sdxxx={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * sizeof(sdxxx),DSC_STR,}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The above structure provides a means for the C compiler to C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * calculate the length of string descriptor sdxxx, where xxx is the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * index number. The first two bytes of the descriptor are descriptor C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * length and type. The rest are string texts which must be C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * in the unicode format. The unicode format is achieved by declaring C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * each character as a word type. The whole text string is declared C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * as a word array with the number of characters equals to . C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * has to be manually counted and entered into the array C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * declaration. Let's study this through an example: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * if the string is "USB" , then the string descriptor should be: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * (Using index 02) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * rom struct{byte bLength;byte bDscType;word string[3];}sd002={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * sizeof(sd002),DSC_STR,'U','S','B'}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * A USB project may have multiple strings and the firmware supports C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * the management of multiple strings through a look-up table. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The look-up table is defined as: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The above declaration has 3 strings, sd000, sd001, and sd002. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Strings can be removed or added. sd000 is a specialized string C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptor. It defines the language code, usually this is C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * US English (0x0409). The index of the string must match the index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * position of the USB_SD_Ptr array, &sd000 must be in position C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_SD_Ptr[0], &sd001 must be in position USB_SD_Ptr[1] and so on. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The look-up table USB_SD_Ptr is used by the get string handler C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * function in usb9.c. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The look-up table scheme also applies to the configuration C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptor. A USB device may have multiple configuration C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptors, i.e. CFG01, CFG02, etc. To add a configuration C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptor, user must implement a structure similar to CFG01. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The next step is to add the configuration descriptor name, i.e. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * cfg01, cfg02,.., to the look-up table USB_CD_Ptr. USB_CD_Ptr[0] C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * is a dummy place holder since configuration 0 is the un-configured C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * state according to the definition in the USB specification. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Descriptor specific type definitions are defined in: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * system\usb\usbdefs\usbdefs_std_dsc.h C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Configuration information is defined in: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /** I N C L U D E S *************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /** C O N S T A N T S ************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c #pragma romdata C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Device Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom USB_DEV_DSC device_dsc= C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c { C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_DEV_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DSC_DEV, // DEVICE descriptor type C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x0200, // USB Spec Release Number in BCD format C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c CDC_DEVICE, // Class Code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x00, // Subclass code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x00, // Protocol code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c EP0_BUFF_SIZE, // Max packet size for EP0, see usbcfg.h C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x04D8, // Vendor ID C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x000A, // Product ID: CDC RS-232 Emulation Demo C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x0000, // Device release number in BCD format C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x01, // Manufacturer string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x02, // Product string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x00, // Device serial number string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x01 // Number of possible configurations C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c }; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Configuration 1 Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c CFG01= C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c { C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Configuration Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_CFG_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DSC_CFG, // CONFIGURATION descriptor type C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(cfg01), // Total length of data for this cfg C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 2, // Number of interfaces in this cfg C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 1, // Index value of this configuration C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Configuration string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c _DEFAULT, // Attributes, see usbdefs_std_dsc.h C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 50, // Max power consumption (2X mA) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Interface Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_INTF_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DSC_INTF, // INTERFACE descriptor type C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Interface Number C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Alternate Setting Number C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 1, // Number of endpoints in this intf C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c COMM_INTF, // Class code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ABSTRACT_CONTROL_MODEL, // Subclass code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c V25TER, // Protocol code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Interface string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* CDC Class-Specific Descriptors */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_CDC_HEADER_FN_DSC),CS_INTERFACE,DSC_FN_HEADER,0x0110, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_CDC_ACM_FN_DSC),CS_INTERFACE,DSC_FN_ACM,0x02, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_CDC_UNION_FN_DSC),CS_INTERFACE,DSC_FN_UNION,CDC_COMM_INTF_ID,CDC_DATA_INTF_ID, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_CDC_CALL_MGT_FN_DSC),CS_INTERFACE,DSC_FN_CALL_MGT,0x00,CDC_DATA_INTF_ID, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Endpoint Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP02_IN,_INT,CDC_INT_EP_SIZE,0x02, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Interface Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_INTF_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DSC_INTF, // INTERFACE descriptor type C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 1, // Interface Number C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Alternate Setting Number C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 2, // Number of endpoints in this intf C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DATA_INTF, // Class code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Subclass code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c NO_PROTOCOL, // Protocol code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Interface string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Endpoint Descriptors */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP03_OUT,_BULK,CDC_BULK_OUT_EP_SIZE,0x00, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP03_IN,_BULK,CDC_BULK_IN_EP_SIZE,0x00 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c }; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[1];}sd000={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(sd000),DSC_STR,0x0409}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[25];}sd001={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(sd001),DSC_STR, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 'M','i','c','r','o','c','h','i','p',' ', C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[25];}sd002={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(sd002),DSC_STR, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 'C','D','C',' ','R','S','-','2','3','2',' ', C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 'E','m','u','l','a','t','i','o','n',' ','D','e','m','o'}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom const unsigned char *rom USB_CD_Ptr[]={&cfg01,&cfg01}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom pFunc ClassReqHandler[1]= C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c { C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c &USBCheckCDCRequest C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c }; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c #pragma code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /** EOF usbdsc.c ****************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * FileName: usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * license. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #include C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c byte ctrl_trf_state; // Control Transfer State C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c byte ctrl_trf_session_owner; // Current transfer session owner C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c POINTER pSrc; // Data source pointer C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c POINTER pDst; // Data destination pointer C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c WORD wCount; // Data counter C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfSetupHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfOutHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfInHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #pragma code C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlEPService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: USTAT is loaded with a valid endpoint address. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: USBCtrlEPService checks for three transaction types that C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * it knows how to service and services them: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. EP0 SETUP C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. EP0 OUT C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 3. EP0 IN C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * It ignores all other types (i.e. EP1, EP2, etc.) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlEPService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003914 506c MOVF 0x6c,0x0,0x0 if(USTAT == EP00_OUT) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003916 e002 BZ 0x391c 003918 0e00 MOVLW 0x0 00391a d001 BRA 0x391e 00391c 0e01 MOVLW 0x1 00391e 0900 IORLW 0x0 003920 e00b BZ 0x3938 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003922 0104 MOVLB 0x4 if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003924 5100 MOVF 0x0,0x0,0x1 003926 0b3c ANDLW 0x3c 003928 42e8 RRNCF 0xe8,0x1,0x0 00392a 42e8 RRNCF 0xe8,0x1,0x0 00392c 080d SUBLW 0xd 00392e e102 BNZ 0x3934 003930 d80c RCALL 0x394a USBCtrlTrfSetupHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003932 d001 BRA 0x3936 else // EP0 OUT C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003934 d842 RCALL 0x39ba USBCtrlTrfOutHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003936 d008 BRA 0x3948 else if(USTAT == EP00_IN) // EP0 IN C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003938 506c MOVF 0x6c,0x0,0x0 00393a e002 BZ 0x3940 00393c 0e00 MOVLW 0x0 00393e d001 BRA 0x3942 003940 0e01 MOVLW 0x1 003942 0904 IORLW 0x4 003944 e001 BZ 0x3948 003946 d84b RCALL 0x39de USBCtrlTrfInHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003948 0012 RETURN 0x0 }//end USBCtrlEPService C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: SetupPkt buffer is loaded with valid USB Setup Data C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine is a task dispatcher and has 3 stages. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. It initializes the control transfer state machine. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. It calls on each of the module that may know how to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * service the Setup Request from the host. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Module Example: USB9, HID, CDC, MSD, ... C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * As new classes are added, ClassReqHandler table in C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * usbdsc.c should be updated to call all available C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * class handlers. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 3. Once each of the modules has had a chance to check if C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * it is responsible for servicing the request, stage 3 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * then checks direction of the transfer to determine how C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * to prepare EP0 for the control transfer. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Refer to USBCtrlEPServiceComplete() for more details. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: Microchip USB Firmware has three different states for C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * the control transfer state machine: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. WAIT_SETUP C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. CTRL_TRF_TX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 3. CTRL_TRF_RX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Refer to firmware manual to find out how one state C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * is transitioned to another. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * A Control Transfer is composed of many USB transactions. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * When transferring data over multiple transactions, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * it is important to keep track of data source, data C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * destination, and data count. These three parameters are C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * stored in pSrc,pDst, and wCount. A flag is used to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * note if the data source is from ROM or RAM. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00394a cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00394c ffe6 00394e cfe1 MOVFF 0xfe1,0xfd9 003950 ffd9 003952 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c byte i; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* Stage 1 */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003954 0101 MOVLB 0x1 ctrl_trf_state = WAIT_SETUP; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003956 6bca CLRF 0xca,0x1 003958 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_NULL; // Set owner to NULL C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00395a 6bcb CLRF 0xcb,0x1 00395c 0101 MOVLB 0x1 wCount._word = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00395e 6bd0 CLRF 0xd0,0x1 003960 6bd1 CLRF 0xd1,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* Stage 2 */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003962 ec27 CALL 0x3c4e,0x0 USBCheckStdRequest(); // See system\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003964 f01e C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003966 6adf CLRF 0xdf,0x0 for(i=0;i < (sizeof(ClassReqHandler)/sizeof(pFunc));i++) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003968 50df MOVF 0xdf,0x0,0x0 00396a 6e2a MOVWF 0x2a,0x0 00396c 6a2b CLRF 0x2b,0x0 00396e 0e01 MOVLW 0x1 003970 5c2a SUBWF 0x2a,0x0,0x0 003972 0e00 MOVLW 0x0 003974 582b SUBWFB 0x2b,0x0,0x0 003976 e21b BC 0x39ae 0039aa 2adf INCF 0xdf,0x1,0x0 0039ac d7dd BRA 0x3968 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003978 0101 MOVLB 0x1 if(ctrl_trf_session_owner != MUID_NULL)break; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00397a 51cb MOVF 0xcb,0x0,0x1 00397c e001 BZ 0x3980 00397e d017 BRA 0x39ae 003980 6af7 CLRF 0xf7,0x0 ClassReqHandler[i](); // See autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003982 34df RLCF 0xdf,0x0,0x0 003984 0bfe ANDLW 0xfe 003986 36f7 RLCF 0xf7,0x1,0x0 003988 6ef6 MOVWF 0xf6,0x0 00398a 0ef9 MOVLW 0xf9 00398c 26f6 ADDWF 0xf6,0x1,0x0 00398e 0e43 MOVLW 0x43 003990 22f7 ADDWFC 0xf7,0x1,0x0 003992 0009 TBLRDPOSTINC 003994 cff5 MOVFF 0xff5,0x2a 003996 f02a 003998 0008 TBLRD 00399a cff5 MOVFF 0xff5,0x2b 00399c f02b 00399e d004 BRA 0x39a8 0039a0 c02b MOVFF 0x2b,0xffa 0039a2 fffa 0039a4 502a MOVF 0x2a,0x0,0x0 0039a6 6ef9 MOVWF 0xf9,0x0 0039a8 dffb RCALL 0x39a0 }//end while C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* Stage 3 */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039ae d8f0 RCALL 0x3b90 USBCtrlEPServiceComplete(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039b0 52e5 MOVF 0xe5,0x1,0x0 }//end USBCtrlTrfSetupHandler C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039b2 52e5 MOVF 0xe5,0x1,0x0 0039b4 cfe7 MOVFF 0xfe7,0xfd9 0039b6 ffd9 0039b8 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfOutHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine handles an OUT transaction according to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * which control transfer state is currently active. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: Note that if the the control transfer was from C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * host to device, the session owner should be notified C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * at the end of each OUT transaction to service the C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * received data. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfOutHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039ba 0e02 MOVLW 0x2 if(ctrl_trf_state == CTRL_TRF_RX) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039bc 0101 MOVLB 0x1 0039be 5dca SUBWF 0xca,0x0,0x1 0039c0 e10c BNZ 0x39da { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039c2 d8a4 RCALL 0x3b0c USBCtrlTrfRxService(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Don't have to worry about overwriting _KEEP bit C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * because if _KEEP was set, TRNIF would not have been C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * generated in the first place. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039c4 0104 MOVLB 0x4 if(ep0Bo.Stat.DTS == 0) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039c6 bd00 BTFSC 0x0,0x6,0x1 0039c8 d004 BRA 0x39d2 0039ca 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039cc 0ec8 MOVLW 0xc8 0039ce 6f00 MOVWF 0x0,0x1 0039d0 d003 BRA 0x39d8 else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039d2 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039d4 0e88 MOVLW 0x88 0039d6 6f00 MOVWF 0x0,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039d8 d001 BRA 0x39dc else // CTRL_TRF_TX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039da d929 RCALL 0x3c2e USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039dc 0012 RETURN 0x0 }//end USBCtrlTrfOutHandler C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfInHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine handles an IN transaction according to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * which control transfer state is currently active. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: A Set Address Request must not change the acutal address C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * of the device until the completion of the control C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * transfer. The end of the control transfer for Set Address C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Request is an IN transaction. Therefore it is necessary C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * to service this unique situation when the condition is C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * right. Macro mUSBCheckAdrPendingState is defined in C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * usb9.h and its function is to specifically service this C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * event. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfInHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039de 0e04 MOVLW 0x4 mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039e0 0101 MOVLB 0x1 0039e2 5dd2 SUBWF 0xd2,0x0,0x1 0039e4 e10c BNZ 0x39fe 0039e6 c422 MOVFF 0x422,0xf6e 0039e8 ff6e 0039ea 506e MOVF 0x6e,0x0,0x0 0039ec 0800 SUBLW 0x0 0039ee e204 BC 0x39f8 0039f0 0101 MOVLB 0x1 0039f2 0e05 MOVLW 0x5 0039f4 6fd2 MOVWF 0xd2,0x1 0039f6 d003 BRA 0x39fe 0039f8 0101 MOVLB 0x1 0039fa 0e03 MOVLW 0x3 0039fc 6fd2 MOVWF 0xd2,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039fe 0101 MOVLB 0x1 if(ctrl_trf_state == CTRL_TRF_TX) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a00 05ca DECF 0xca,0x0,0x1 003a02 e10c BNZ 0x3a1c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a04 d80d RCALL 0x3a20 USBCtrlTrfTxService(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a06 0104 MOVLB 0x4 if(ep0Bi.Stat.DTS == 0) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a08 bd04 BTFSC 0x4,0x6,0x1 003a0a d004 BRA 0x3a14 003a0c 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a0e 0ec8 MOVLW 0xc8 003a10 6f04 MOVWF 0x4,0x1 003a12 d003 BRA 0x3a1a else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a14 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a16 0e88 MOVLW 0x88 003a18 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a1a d001 BRA 0x3a1e else // CTRL_TRF_RX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a1c d908 RCALL 0x3c2e USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a1e 0012 RETURN 0x0 }//end USBCtrlTrfInHandler C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: pSrc, wCount, and usb_stat.ctrl_trf_mem are setup properly. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine should be called from only two places. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * One from USBCtrlEPServiceComplete() and one from C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * USBCtrlTrfInHandler(). It takes care of managing a C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * transfer over multiple USB transactions. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: This routine works with isochronous endpoint larger than C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 256 bytes and is shown here as an example of how to deal C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * with BC9 and BC8. In reality, a control endpoint can never C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * be larger than 64 bytes. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a20 cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a22 ffe6 003a24 cfe1 MOVFF 0xfe1,0xfd9 003a26 ffd9 003a28 0e02 MOVLW 0x2 003a2a 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c WORD byte_to_send; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * First, have to figure out how many byte of data to send. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a2c 0101 MOVLB 0x1 if(wCount._word < EP0_BUFF_SIZE) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a2e 0e08 MOVLW 0x8 003a30 5dd0 SUBWF 0xd0,0x0,0x1 003a32 0e00 MOVLW 0x0 003a34 59d1 SUBWFB 0xd1,0x0,0x1 003a36 e205 BC 0x3a42 003a38 c1d0 MOVFF 0x1d0,0xfde byte_to_send._word = wCount._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a3a ffde 003a3c c1d1 MOVFF 0x1d1,0xfdd 003a3e ffdd 003a40 d003 BRA 0x3a48 else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a42 0e08 MOVLW 0x8 byte_to_send._word = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a44 6ede MOVWF 0xde,0x0 003a46 6add CLRF 0xdd,0x0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Next, load the number of bytes to send to BC9..0 in buffer descriptor C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a48 0104 MOVLB 0x4 ep0Bi.Stat.BC9 = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a4a 9304 BCF 0x4,0x1,0x1 003a4c 0104 MOVLB 0x4 ep0Bi.Stat.BC8 = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a4e 9104 BCF 0x4,0x0,0x1 003a50 0e01 MOVLW 0x1 ep0Bi.Stat._byte |= MSB(byte_to_send); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a52 50db MOVF 0xdb,0x0,0x0 003a54 0104 MOVLB 0x4 003a56 1304 IORWF 0x4,0x1,0x1 003a58 cfdf MOVFF 0xfdf,0x405 ep0Bi.Cnt = LSB(byte_to_send); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a5a f405 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Subtract the number of bytes just about to be sent from the total. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a5c 0e00 MOVLW 0x0 wCount._word = wCount._word - byte_to_send._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a5e 50db MOVF 0xdb,0x0,0x0 003a60 0101 MOVLB 0x1 003a62 5fd0 SUBWF 0xd0,0x1,0x1 003a64 0e01 MOVLW 0x1 003a66 50db MOVF 0xdb,0x0,0x0 003a68 0101 MOVLB 0x1 003a6a 5bd1 SUBWFB 0xd1,0x1,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a6c 0101 MOVLB 0x1 pDst.bRam = (byte*)&CtrlTrfData; // Set destination pointer C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a6e 0e28 MOVLW 0x28 003a70 6fce MOVWF 0xce,0x1 003a72 0e04 MOVLW 0x4 003a74 6fcf MOVWF 0xcf,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a76 0101 MOVLB 0x1 if(usb_stat.ctrl_trf_mem == _ROM) // Determine type of memory source C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a78 a3d3 BTFSS 0xd3,0x1,0x1 003a7a d020 BRA 0x3abc { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a7c cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a7e ffe9 003a80 cfda MOVFF 0xfda,0xfea 003a82 ffea 003a84 50ee MOVF 0xee,0x0,0x0 003a86 10ed IORWF 0xed,0x0,0x0 003a88 e018 BZ 0x3aba 003ab8 d7e1 BRA 0x3a7c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a8a c1cc MOVFF 0x1cc,0xff6 *pDst.bRam = *pSrc.bRom; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a8c fff6 003a8e c1cd MOVFF 0x1cd,0xff7 003a90 fff7 003a92 0008 TBLRD 003a94 50f5 MOVF 0xf5,0x0,0x0 003a96 c1ce MOVFF 0x1ce,0xfe9 003a98 ffe9 003a9a c1cf MOVFF 0x1cf,0xfea 003a9c ffea 003a9e 6eef MOVWF 0xef,0x0 003aa0 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003aa2 2bce INCF 0xce,0x1,0x1 003aa4 0e00 MOVLW 0x0 003aa6 23cf ADDWFC 0xcf,0x1,0x1 003aa8 0101 MOVLB 0x1 pSrc.bRom++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003aaa 2bcc INCF 0xcc,0x1,0x1 003aac 0e00 MOVLW 0x0 003aae 23cd ADDWFC 0xcd,0x1,0x1 003ab0 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ab2 0e01 MOVLW 0x1 003ab4 e201 BC 0x3ab8 003ab6 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003aba d01e BRA 0x3af8 else // RAM C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003abc cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003abe ffe9 003ac0 cfda MOVFF 0xfda,0xfea 003ac2 ffea 003ac4 50ee MOVF 0xee,0x0,0x0 003ac6 10ed IORWF 0xed,0x0,0x0 003ac8 e017 BZ 0x3af8 003af6 d7e2 BRA 0x3abc { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003aca c1cc MOVFF 0x1cc,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003acc ffe9 003ace c1cd MOVFF 0x1cd,0xfea 003ad0 ffea 003ad2 50ef MOVF 0xef,0x0,0x0 003ad4 c1ce MOVFF 0x1ce,0xfe9 003ad6 ffe9 003ad8 c1cf MOVFF 0x1cf,0xfea 003ada ffea 003adc 6eef MOVWF 0xef,0x0 003ade 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ae0 2bce INCF 0xce,0x1,0x1 003ae2 0e00 MOVLW 0x0 003ae4 23cf ADDWFC 0xcf,0x1,0x1 003ae6 0101 MOVLB 0x1 pSrc.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ae8 2bcc INCF 0xcc,0x1,0x1 003aea 0e00 MOVLW 0x0 003aec 23cd ADDWFC 0xcd,0x1,0x1 003aee 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003af0 0e01 MOVLW 0x1 003af2 e201 BC 0x3af6 003af4 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c }//end if(usb_stat.ctrl_trf_mem == _ROM) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003af8 0e02 MOVLW 0x2 }//end USBCtrlTrfTxService C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003afa 5ce1 SUBWF 0xe1,0x0,0x0 003afc e202 BC 0x3b02 003afe 6ae1 CLRF 0xe1,0x0 003b00 52e5 MOVF 0xe5,0x1,0x0 003b02 6ee1 MOVWF 0xe1,0x0 003b04 52e5 MOVF 0xe5,0x1,0x0 003b06 cfe7 MOVFF 0xfe7,0xfd9 003b08 ffd9 003b0a 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: pDst and wCount are setup properly. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * pSrc is always &CtrlTrfData C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * usb_stat.ctrl_trf_mem is always _RAM. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * wCount should be set to 0 at the start of each control C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * transfer. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: *** This routine is only partially complete. Check for C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * new version of the firmware. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b0c cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b0e ffe6 003b10 cfe1 MOVFF 0xfe1,0xfd9 003b12 ffd9 003b14 0e02 MOVLW 0x2 003b16 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c WORD byte_to_read; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b18 0e03 MOVLW 0x3 MSB(byte_to_read) = 0x03 & ep0Bo.Stat._byte; // Filter out last 2 bits C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b1a 0104 MOVLB 0x4 003b1c 1500 ANDWF 0x0,0x0,0x1 003b1e 6ee7 MOVWF 0xe7,0x0 003b20 0e01 MOVLW 0x1 003b22 cfe7 MOVFF 0xfe7,0xfdb 003b24 ffdb 003b26 c401 MOVFF 0x401,0xfdf LSB(byte_to_read) = ep0Bo.Cnt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b28 ffdf C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Accumulate total number of bytes read C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b2a 50de MOVF 0xde,0x0,0x0 wCount._word = wCount._word + byte_to_read._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b2c 0101 MOVLB 0x1 003b2e 27d0 ADDWF 0xd0,0x1,0x1 003b30 50dd MOVF 0xdd,0x0,0x0 003b32 0101 MOVLB 0x1 003b34 23d1 ADDWFC 0xd1,0x1,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b36 0101 MOVLB 0x1 pSrc.bRam = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b38 0e28 MOVLW 0x28 003b3a 6fcc MOVWF 0xcc,0x1 003b3c 0e04 MOVLW 0x4 003b3e 6fcd MOVWF 0xcd,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b40 cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_read._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b42 ffe9 003b44 cfda MOVFF 0xfda,0xfea 003b46 ffea 003b48 50ee MOVF 0xee,0x0,0x0 003b4a 10ed IORWF 0xed,0x0,0x0 003b4c e017 BZ 0x3b7c 003b7a d7e2 BRA 0x3b40 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b4e c1cc MOVFF 0x1cc,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b50 ffe9 003b52 c1cd MOVFF 0x1cd,0xfea 003b54 ffea 003b56 50ef MOVF 0xef,0x0,0x0 003b58 c1ce MOVFF 0x1ce,0xfe9 003b5a ffe9 003b5c c1cf MOVFF 0x1cf,0xfea 003b5e ffea 003b60 6eef MOVWF 0xef,0x0 003b62 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b64 2bce INCF 0xce,0x1,0x1 003b66 0e00 MOVLW 0x0 003b68 23cf ADDWFC 0xcf,0x1,0x1 003b6a 0101 MOVLB 0x1 pSrc.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b6c 2bcc INCF 0xcc,0x1,0x1 003b6e 0e00 MOVLW 0x0 003b70 23cd ADDWFC 0xcd,0x1,0x1 003b72 06df DECF 0xdf,0x1,0x0 byte_to_read._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b74 0e01 MOVLW 0x1 003b76 e201 BC 0x3b7a 003b78 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_read._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b7c 0e02 MOVLW 0x2 }//end USBCtrlTrfRxService C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b7e 5ce1 SUBWF 0xe1,0x0,0x0 003b80 e202 BC 0x3b86 003b82 6ae1 CLRF 0xe1,0x0 003b84 52e5 MOVF 0xe5,0x1,0x0 003b86 6ee1 MOVWF 0xe1,0x0 003b88 52e5 MOVF 0xe5,0x1,0x0 003b8a cfe7 MOVFF 0xfe7,0xfd9 003b8c ffd9 003b8e 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlEPServiceComplete(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine wrap up the ramaining tasks in servicing C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a Setup Request. Its main task is to set the endpoint C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * controls appropriately for a given situation. See code C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * below. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * There are three main scenarios: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a) There was no handler for the Request, in this case C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a STALL should be sent out. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * b) The host has requested a read control transfer, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * endpoints are required to be setup in a specific way. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * c) The host has requested a write control transfer, or C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a control data stage is not required, endpoints are C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * required to be setup in a specific way. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Packet processing is resumed by clearing PKTDIS bit. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlEPServiceComplete(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PKTDIS bit is set when a Setup Transaction is received. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Clear to resume packet processing. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b90 986d BCF 0x6d,0x4,0x0 UCONbits.PKTDIS = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b92 0101 MOVLB 0x1 if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b94 51cb MOVF 0xcb,0x0,0x1 003b96 e10f BNZ 0x3bb6 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * If no one knows how to service this request then stall. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Must also prepare EP0 to receive the next SETUP transaction. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b98 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b9a 0e08 MOVLW 0x8 003b9c 6f01 MOVWF 0x1,0x1 003b9e 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ba0 0e20 MOVLW 0x20 003ba2 6f02 MOVWF 0x2,0x1 003ba4 0e04 MOVLW 0x4 003ba6 6f03 MOVWF 0x3,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ba8 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003baa 0e84 MOVLW 0x84 003bac 6f00 MOVWF 0x0,0x1 003bae 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bb0 0e84 MOVLW 0x84 003bb2 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bb4 d03b BRA 0x3c2c else // A module has claimed ownership of the control transfer session. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bb6 0104 MOVLB 0x4 if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bb8 af20 BTFSS 0x20,0x7,0x1 003bba d025 BRA 0x3c06 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bbc 0101 MOVLB 0x1 if(SetupPkt.wLength < wCount._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bbe 51d0 MOVF 0xd0,0x0,0x1 003bc0 0104 MOVLB 0x4 003bc2 5d26 SUBWF 0x26,0x0,0x1 003bc4 0101 MOVLB 0x1 003bc6 51d1 MOVF 0xd1,0x0,0x1 003bc8 0104 MOVLB 0x4 003bca 5927 SUBWFB 0x27,0x0,0x1 003bcc e204 BC 0x3bd6 003bce c426 MOVFF 0x426,0x1d0 wCount._word = SetupPkt.wLength; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bd0 f1d0 003bd2 c427 MOVFF 0x427,0x1d1 003bd4 f1d1 003bd6 df24 RCALL 0x3a20 USBCtrlTrfTxService(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bd8 0101 MOVLB 0x1 ctrl_trf_state = CTRL_TRF_TX; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bda 0e01 MOVLW 0x1 003bdc 6fca MOVWF 0xca,0x1 /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Control Read: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * ... | C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. Prepare OUT EP to respond to early termination C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * NOTE: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * If something went wrong during the control transfer, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * the last status stage may not be sent by the host. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * When this happens, two different things could happen C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * depending on the host. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a) The host could send out a RESET. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * b) The host could send out a new SETUP transaction C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * without sending a RESET first. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * To properly handle case (b), the OUT EP must be setup C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * to receive either a zero length OUT transaction, or a C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * new SETUP transaction. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Since the SETUP transaction requires the DTS bit to be C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * DAT0 while the zero length OUT status requires the DTS C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * bit to be DAT1, the DTS bit check by the hardware should C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * be disabled. This way the SIE could accept either of C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * the two transactions. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Furthermore, the Cnt byte should be set to prepare for C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * the SETUP data (8-byte or more), and the buffer address C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * should be pointed to SetupPkt. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bde 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003be0 0e08 MOVLW 0x8 003be2 6f01 MOVWF 0x1,0x1 003be4 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003be6 0e20 MOVLW 0x20 003be8 6f02 MOVWF 0x2,0x1 003bea 0e04 MOVLW 0x4 003bec 6f03 MOVWF 0x3,0x1 003bee 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE; // Note: DTSEN is 0! C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bf0 0e80 MOVLW 0x80 003bf2 6f00 MOVWF 0x0,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. Prepare IN EP to transfer data, Cnt should have C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * been initialized by responsible request owner. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bf4 0104 MOVLB 0x4 ep0Bi.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bf6 0e28 MOVLW 0x28 003bf8 6f06 MOVWF 0x6,0x1 003bfa 0e04 MOVLW 0x4 003bfc 6f07 MOVWF 0x7,0x1 003bfe 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c00 0ec8 MOVLW 0xc8 003c02 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c04 d013 BRA 0x3c2c else // (SetupPkt.DataDir == HOST_TO_DEV) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c06 0101 MOVLB 0x1 ctrl_trf_state = CTRL_TRF_RX; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c08 0e02 MOVLW 0x2 003c0a 6fca MOVWF 0xca,0x1 /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Control Write: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * ... | C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. Prepare IN EP to respond to early termination C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * This is the same as a Zero Length Packet Response C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * for control transfer without a data stage C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c0c 0104 MOVLB 0x4 ep0Bi.Cnt = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c0e 6b05 CLRF 0x5,0x1 003c10 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c12 0ec8 MOVLW 0xc8 003c14 6f04 MOVWF 0x4,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. Prepare OUT EP to receive data. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c16 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c18 0e08 MOVLW 0x8 003c1a 6f01 MOVWF 0x1,0x1 003c1c 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c1e 0e28 MOVLW 0x28 003c20 6f02 MOVWF 0x2,0x1 003c22 0e04 MOVLW 0x4 003c24 6f03 MOVWF 0x3,0x1 003c26 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c28 0ec8 MOVLW 0xc8 003c2a 6f00 MOVWF 0x0,0x1 }//end if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c }//end if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c2c 0012 RETURN 0x0 }//end USBCtrlEPServiceComplete C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBPrepareForNextSetupTrf(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: The routine forces EP0 OUT to be ready for a new Setup C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * transaction, and forces EP0 IN to be owned by CPU. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBPrepareForNextSetupTrf(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c2e 0101 MOVLB 0x1 ctrl_trf_state = WAIT_SETUP; // See usbctrltrf.h C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c30 6bca CLRF 0xca,0x1 003c32 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; // Defined in usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c34 0e08 MOVLW 0x8 003c36 6f01 MOVWF 0x1,0x1 003c38 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c3a 0e20 MOVLW 0x20 003c3c 6f02 MOVWF 0x2,0x1 003c3e 0e04 MOVLW 0x4 003c40 6f03 MOVWF 0x3,0x1 003c42 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; // EP0 buff dsc init, see usbmmap.h C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c44 0e88 MOVLW 0x88 003c46 6f00 MOVWF 0x0,0x1 003c48 0104 MOVLB 0x4 ep0Bi.Stat._byte = _UCPU; // EP0 IN buffer initialization C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c4a 6b04 CLRF 0x4,0x1 003c4c 0012 RETURN 0x0 }//end USBPrepareForNextSetupTrf C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** EOF usbctrltrf.c *********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /********************************************************************* C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c ********************************************************************* C:\Projects\UBW\FW\D_143\user\user.c * FileName: user.c C:\Projects\UBW\FW\D_143\user\user.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\user\user.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\user\user.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\user\user.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Software License Agreement C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\user\user.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\user\user.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\user\user.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\user\user.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\user\user.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\user\user.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\user\user.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\user\user.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\user\user.c * license. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\user\user.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\user\user.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\user\user.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\user\user.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\user\user.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Author Date Comment C:\Projects\UBW\FW\D_143\user\user.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\user\user.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\user\user.c * Brian Schmalz 03/15/06 Added user code to impliment C:\Projects\UBW\FW\D_143\user\user.c * firmware version D v1.0 for UBW C:\Projects\UBW\FW\D_143\user\user.c * project. See www.greta.dhs.org/UBW C:\Projects\UBW\FW\D_143\user\user.c * Brian Schmalz 05/04/06 Starting version 1.1, which will C:\Projects\UBW\FW\D_143\user\user.c * include several fixes. See website. C:\Projects\UBW\FW\D_143\user\user.c * BPS 06/21/06 Starting v1.2 - C:\Projects\UBW\FW\D_143\user\user.c * - Fixed problem with I packets (from T command) filling up TX buffer C:\Projects\UBW\FW\D_143\user\user.c * and not letting any incoming commands be received. (strange) C:\Projects\UBW\FW\D_143\user\user.c * - Adding several commands - Analog inputs being the biggest set. C:\Projects\UBW\FW\D_143\user\user.c * - Also Byte read/Byte write (PEEK/POKE) anywhere in memory C:\Projects\UBW\FW\D_143\user\user.c * - Individual pin I/O and direction C:\Projects\UBW\FW\D_143\user\user.c * BPS 08/16/06 v1.3 - Fixed bug with USB startup C:\Projects\UBW\FW\D_143\user\user.c * BPS 09/09/06 v1.4 - Starting 1.4 C:\Projects\UBW\FW\D_143\user\user.c * - Fixed Microchip bug with early silicon - UCONbits.PKTDIS = 0; C:\Projects\UBW\FW\D_143\user\user.c * - Adding BO and BC commands for parallel output to graphics pannels C:\Projects\UBW\FW\D_143\user\user.c * BPS 12/06/06 v1.4 - More work on 1.4 C:\Projects\UBW\FW\D_143\user\user.c * - Re-wrote all I/O buffering code for increased speed and functionality C:\Projects\UBW\FW\D_143\user\user.c * - Re-wrote error handling code C:\Projects\UBW\FW\D_143\user\user.c * - Added delays to BC/BO commands to help Corey C:\Projects\UBW\FW\D_143\user\user.c * BPS 01/06/07 v1.4 - Added RC command for servos C:\Projects\UBW\FW\D_143\user\user.c * BPS 03/07/07 v1.4.1 - Changed blink rate for SFE C:\Projects\UBW\FW\D_143\user\user.c * BPS 05/24/07 v1.4.2 - Fixed RC command bug - it C:\Projects\UBW\FW\D_143\user\user.c * wouldn't shut off. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c ********************************************************************/ C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\user\user.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\user\user.c #include "io_cfg.h" // I/O pin mapping C:\Projects\UBW\FW\D_143\user\user.c #include "user\user.h" C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** D E F I N E S ********************************************************/ C:\Projects\UBW\FW\D_143\user\user.c #define bitset(var,bitno) ((var) |= (1 << (bitno))) C:\Projects\UBW\FW\D_143\user\user.c #define bitclr(var,bitno) ((var) &= ~(1 << (bitno))) C:\Projects\UBW\FW\D_143\user\user.c #define bittst(var,bitno) (var& (1 << (bitno))) C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // For the RC command, we define a little data structure that holds the C:\Projects\UBW\FW\D_143\user\user.c // values assoicated with a particular servo connection C:\Projects\UBW\FW\D_143\user\user.c // It's port, pin, value (position) and state (INACTIVE, PRIMED or TIMING) C:\Projects\UBW\FW\D_143\user\user.c // Later on we make an array of these (19 elements long - 19 pins) to track C:\Projects\UBW\FW\D_143\user\user.c // the values of all of the servos. C:\Projects\UBW\FW\D_143\user\user.c typedef enum { C:\Projects\UBW\FW\D_143\user\user.c kOFF = 1 C:\Projects\UBW\FW\D_143\user\user.c ,kWAITING C:\Projects\UBW\FW\D_143\user\user.c ,kPRIMED C:\Projects\UBW\FW\D_143\user\user.c ,kTIMING C:\Projects\UBW\FW\D_143\user\user.c } tRC_state; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define kRC_DATA_SIZE 24 // In structs, since there are 3 ports of 8 bits each C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define kTX_BUF_SIZE 64 // In bytes C:\Projects\UBW\FW\D_143\user\user.c #define kRX_BUF_SIZE 64 // In bytes C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define kUSART_TX_BUF_SIZE 64 // In bytes C:\Projects\UBW\FW\D_143\user\user.c #define kUSART_RX_BUF_SIZE 64 // In bytes C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Enum for extract_num() function parameter C:\Projects\UBW\FW\D_143\user\user.c typedef enum { C:\Projects\UBW\FW\D_143\user\user.c kCHAR C:\Projects\UBW\FW\D_143\user\user.c ,kUCHAR C:\Projects\UBW\FW\D_143\user\user.c ,kINT C:\Projects\UBW\FW\D_143\user\user.c ,kUINT C:\Projects\UBW\FW\D_143\user\user.c ,kASCII_CHAR C:\Projects\UBW\FW\D_143\user\user.c ,kUCASE_ASCII_CHAR C:\Projects\UBW\FW\D_143\user\user.c } tExtractType; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define advance_RX_buf_out() \ C:\Projects\UBW\FW\D_143\user\user.c { \ C:\Projects\UBW\FW\D_143\user\user.c g_RX_buf_out++; \ C:\Projects\UBW\FW\D_143\user\user.c if (kRX_BUF_SIZE == g_RX_buf_out) \ C:\Projects\UBW\FW\D_143\user\user.c { \ C:\Projects\UBW\FW\D_143\user\user.c g_RX_buf_out = 0; \ C:\Projects\UBW\FW\D_143\user\user.c } \ C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define kISR_FIFO_A_DEPTH 3 C:\Projects\UBW\FW\D_143\user\user.c #define kISR_FIFO_D_DEPTH 3 C:\Projects\UBW\FW\D_143\user\user.c #define kPR2_RELOAD 250 // For 1ms TMR2 tick C:\Projects\UBW\FW\D_143\user\user.c #define kCR 0x0D C:\Projects\UBW\FW\D_143\user\user.c #define kLF 0x0A C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // defines for the error_byte byte - each bit has a meaning C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_TX_BUF_OVERRUN 2 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_RX_BUFFER_OVERRUN 3 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_MISSING_PARAMETER 4 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_PRINTED_ERROR 5 // We've already printed out an error C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT 6 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_EXTRA_CHARACTERS 7 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_UNKNOWN_COMMAND 8 // Part of command parser, not error handler C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\user\user.c #pragma udata access fast_vars C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Rate variable - how fast does interrupt fire to capture inputs? C:\Projects\UBW\FW\D_143\user\user.c near unsigned int time_between_updates; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned int ISR_D_RepeatRate; // How many 1ms ticks between Digital updates C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_D_FIFO_in; // In pointer C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_D_FIFO_out; // Out pointer C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_D_FIFO_length; // Current FIFO depth C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned int ISR_A_RepeatRate; // How many 1ms ticks between Analog updates C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_A_FIFO_in; // In pointer C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_A_FIFO_out; // Out pointer C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_A_FIFO_length; // Current FIFO depth C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char AnalogEnable; // Maximum ADC channel to convert C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // This byte has each of its bits used as a seperate error flag C:\Projects\UBW\FW\D_143\user\user.c near unsigned char error_byte; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // RC servo variables C:\Projects\UBW\FW\D_143\user\user.c // First the main array of data for each servo C:\Projects\UBW\FW\D_143\user\user.c near unsigned char g_RC_primed_ptr; C:\Projects\UBW\FW\D_143\user\user.c near unsigned char g_RC_next_ptr; C:\Projects\UBW\FW\D_143\user\user.c near unsigned char g_RC_timing_ptr; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Used only in LowISR C:\Projects\UBW\FW\D_143\user\user.c near unsigned int D_tick_counter; C:\Projects\UBW\FW\D_143\user\user.c near unsigned int A_tick_counter; C:\Projects\UBW\FW\D_143\user\user.c near unsigned char A_cur_channel; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // ROM strings C:\Projects\UBW\FW\D_143\user\user.c const rom char st_OK[] = {"OK\r\n"}; C:\Projects\UBW\FW\D_143\user\user.c const rom char st_LFCR[] = {"\r\n"}; C:\Projects\UBW\FW\D_143\user\user.c const rom char st_version[] = {"UBW FW D Version 1.4.3\r\n"}; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #pragma udata ISR_buf=0x100 C:\Projects\UBW\FW\D_143\user\user.c volatile unsigned int ISR_A_FIFO[12][kISR_FIFO_A_DEPTH]; // Stores the most recent analog conversions C:\Projects\UBW\FW\D_143\user\user.c volatile unsigned char ISR_D_FIFO[3][kISR_FIFO_D_DEPTH]; // FIFO of actual data C:\Projects\UBW\FW\D_143\user\user.c volatile tRC_state g_RC_state[kRC_DATA_SIZE]; // Stores states for each pin for RC command C:\Projects\UBW\FW\D_143\user\user.c volatile unsigned int g_RC_value[kRC_DATA_SIZE]; // Stores reload values for TMR0 C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #pragma udata com_buf=0x200 C:\Projects\UBW\FW\D_143\user\user.c // USB Transmit buffer for packets (back to PC) C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_TX_buf[kTX_BUF_SIZE]; C:\Projects\UBW\FW\D_143\user\user.c // USB Receiving buffer for commands as they come from PC C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_RX_buf[kRX_BUF_SIZE]; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // USART Receiving buffer for data coming from the USART C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_RX_buf[kUSART_RX_BUF_SIZE]; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // USART Transmit buffer for data going to the USART C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_TX_buf[kUSART_TX_BUF_SIZE]; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // These variables are in normal storage space C:\Projects\UBW\FW\D_143\user\user.c #pragma udata C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // These are used for the Fast Parallel Output routines C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_init; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_strobe_mask; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_wait_mask; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_wait_delay; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_strobe_delay; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Pointers to USB transmit (back to PC) buffer C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_TX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_TX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Pointers to USB receive (from PC) buffer C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_RX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_RX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // In and out pointers to our USART input buffer C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_RX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_RX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // In and out pointers to our USART output buffer C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_TX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_TX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Normally set to TRUE. Able to set FALSE to not send "OK" message after packet recepetion C:\Projects\UBW\FW\D_143\user\user.c BOOL g_ack_enable; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\D_143\user\user.c void BlinkUSBStatus (void); // Handles blinking the USB status LED C:\Projects\UBW\FW\D_143\user\user.c BOOL SwitchIsPressed (void); // Check to see if the user (PRG) switch is pressed C:\Projects\UBW\FW\D_143\user\user.c void parse_packet (void); // Take a full packet and dispatch it to the right function C:\Projects\UBW\FW\D_143\user\user.c signed short long extract_number (tExtractType type); // Pull a number paramter out of the packet C:\Projects\UBW\FW\D_143\user\user.c signed char extract_digit (signed short long * acc, unsigned char digits); // Pull a character out of the packet C:\Projects\UBW\FW\D_143\user\user.c void parse_R_packet (void); // R for resetting UBW C:\Projects\UBW\FW\D_143\user\user.c void parse_C_packet (void); // C for configuring I/O and analog pins C:\Projects\UBW\FW\D_143\user\user.c void parse_CX_packet (void); // CX For configuring serial port C:\Projects\UBW\FW\D_143\user\user.c void parse_O_packet (void); // O for output digital to pins C:\Projects\UBW\FW\D_143\user\user.c void parse_I_packet (void); // I for input digital from pins C:\Projects\UBW\FW\D_143\user\user.c void parse_V_packet (void); // V for printing version C:\Projects\UBW\FW\D_143\user\user.c void parse_A_packet (void); // A for requesting analog inputs C:\Projects\UBW\FW\D_143\user\user.c void parse_T_packet (void); // T for setting up timed I/O (digital or analog) C:\Projects\UBW\FW\D_143\user\user.c void parse_PI_packet (void); // PI for reading a single pin C:\Projects\UBW\FW\D_143\user\user.c void parse_PO_packet (void); // PO for setting a single pin state C:\Projects\UBW\FW\D_143\user\user.c void parse_PD_packet (void); // PD for setting a pin's direction C:\Projects\UBW\FW\D_143\user\user.c void parse_MR_packet (void); // MR for Memory Read C:\Projects\UBW\FW\D_143\user\user.c void parse_MW_packet (void); // MW for Memory Write C:\Projects\UBW\FW\D_143\user\user.c void parse_TX_packet (void); // TX for transmitting serial C:\Projects\UBW\FW\D_143\user\user.c void parse_RX_packet (void); // RX for receiving serial C:\Projects\UBW\FW\D_143\user\user.c void parse_RC_packet (void); // RC is for outputing RC servo pulses C:\Projects\UBW\FW\D_143\user\user.c void parse_BO_packet (void); // BO sends data to fast parallel output C:\Projects\UBW\FW\D_143\user\user.c void parse_BC_packet (void); // BC configures fast parallel outputs C:\Projects\UBW\FW\D_143\user\user.c void parse_BS_packet (void); // BS sends binary data to fast parallel output C:\Projects\UBW\FW\D_143\user\user.c void parse_CU_packet (void); // CU configures UBW (system wide parameters) C:\Projects\UBW\FW\D_143\user\user.c void parse_SS_packet (void); // SS Send SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_RS_packet (void); // RS Receive SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_CS_packet (void); // CS Configure SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_SI_packet (void); // SI Send I2C C:\Projects\UBW\FW\D_143\user\user.c void parse_RI_packet (void); // RI Receive I2C C:\Projects\UBW\FW\D_143\user\user.c void parse_CI_packet (void); // CI Configure I2C C:\Projects\UBW\FW\D_143\user\user.c void check_and_send_TX_data (void); // See if there is any data to send to PC, and if so, do it C:\Projects\UBW\FW\D_143\user\user.c void print_ack (void); // Print "OK" after packet is parsed C:\Projects\UBW\FW\D_143\user\user.c int _user_putc (char c); // Our UBS based stream character printer C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\user\user.c #pragma code C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #pragma interruptlow low_ISR C:\Projects\UBW\FW\D_143\user\user.c 000844 cfd8 MOVFF 0xfd8,0xfe4 void low_ISR(void) C:\Projects\UBW\FW\D_143\user\user.c 000846 ffe4 000848 cfe0 MOVFF 0xfe0,0xfe4 00084a ffe4 00084c 6ee4 MOVWF 0xe4,0x0 00084e cfda MOVFF 0xfda,0xfe4 000850 ffe4 000852 cfe2 MOVFF 0xfe2,0xfda 000854 ffda 000856 cfe9 MOVFF 0xfe9,0xfe4 000858 ffe4 00085a cfea MOVFF 0xfea,0xfe4 00085c ffe4 00085e cff3 MOVFF 0xff3,0xfe4 000860 ffe4 000862 cff4 MOVFF 0xff4,0xfe4 000864 ffe4 000866 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c // Do we have a Timer2 interrupt? (1ms rate) C:\Projects\UBW\FW\D_143\user\user.c 000868 a29e BTFSS 0x9e,0x1,0x0 if (PIR1bits.TMR2IF) C:\Projects\UBW\FW\D_143\user\user.c 00086a d101 BRA 0xa6e { C:\Projects\UBW\FW\D_143\user\user.c // Clear the interrupt C:\Projects\UBW\FW\D_143\user\user.c 00086c 929e BCF 0x9e,0x1,0x0 PIR1bits.TMR2IF = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // The most time critical part of this interrupt service routine is the C:\Projects\UBW\FW\D_143\user\user.c // handling of the RC command's servo output pulses. C:\Projects\UBW\FW\D_143\user\user.c // Each time we get this interrupt, we look to see if the next pin on the C:\Projects\UBW\FW\D_143\user\user.c // list has a value greater than zero. If so, we arm set it high and set C:\Projects\UBW\FW\D_143\user\user.c // it's state to PRIMED. Then we advance the pointers to the next pair. C:\Projects\UBW\FW\D_143\user\user.c 00086e 0e03 MOVLW 0x3 if (kPRIMED == g_RC_state[g_RC_primed_ptr]) C:\Projects\UBW\FW\D_143\user\user.c 000870 6e38 MOVWF 0x38,0x0 000872 500e MOVF 0xe,0x0,0x0 000874 6aea CLRF 0xea,0x0 000876 0f51 ADDLW 0x51 000878 6ee9 MOVWF 0xe9,0x0 00087a 0e01 MOVLW 0x1 00087c 22ea ADDWFC 0xea,0x1,0x0 00087e 50ef MOVF 0xef,0x0,0x0 000880 5c38 SUBWF 0x38,0x0,0x0 000882 e130 BNZ 0x8e4 { C:\Projects\UBW\FW\D_143\user\user.c // This is easy, throw the value into the timer C:\Projects\UBW\FW\D_143\user\user.c 000884 500e MOVF 0xe,0x0,0x0 TMR0H = g_RC_value[g_RC_primed_ptr] >> 8; C:\Projects\UBW\FW\D_143\user\user.c 000886 6ee9 MOVWF 0xe9,0x0 000888 6aea CLRF 0xea,0x0 00088a 90d8 BCF 0xd8,0x0,0x0 00088c 36e9 RLCF 0xe9,0x1,0x0 00088e 36ea RLCF 0xea,0x1,0x0 000890 0e69 MOVLW 0x69 000892 26e9 ADDWF 0xe9,0x1,0x0 000894 0e01 MOVLW 0x1 000896 22ea ADDWFC 0xea,0x1,0x0 000898 cfee MOVFF 0xfee,0x38 00089a f038 00089c cfef MOVFF 0xfef,0x39 00089e f039 0008a0 c039 MOVFF 0x39,0x38 0008a2 f038 0008a4 6a39 CLRF 0x39,0x0 0008a6 5038 MOVF 0x38,0x0,0x0 0008a8 6ed7 MOVWF 0xd7,0x0 0008aa 500e MOVF 0xe,0x0,0x0 TMR0L = g_RC_value[g_RC_primed_ptr] & 0xFF; C:\Projects\UBW\FW\D_143\user\user.c 0008ac 6ee9 MOVWF 0xe9,0x0 0008ae 6aea CLRF 0xea,0x0 0008b0 90d8 BCF 0xd8,0x0,0x0 0008b2 36e9 RLCF 0xe9,0x1,0x0 0008b4 36ea RLCF 0xea,0x1,0x0 0008b6 0e69 MOVLW 0x69 0008b8 26e9 ADDWF 0xe9,0x1,0x0 0008ba 0e01 MOVLW 0x1 0008bc 22ea ADDWFC 0xea,0x1,0x0 0008be cfee MOVFF 0xfee,0x38 0008c0 f038 0008c2 cfef MOVFF 0xfef,0x39 0008c4 f039 0008c6 5038 MOVF 0x38,0x0,0x0 0008c8 6ed6 MOVWF 0xd6,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Then make sure the timer's interrupt enable is set C:\Projects\UBW\FW\D_143\user\user.c 0008ca 8af2 BSF 0xf2,0x5,0x0 INTCONbits.TMR0IE = 1; C:\Projects\UBW\FW\D_143\user\user.c // And be sure to clear the flag too C:\Projects\UBW\FW\D_143\user\user.c 0008cc 94f2 BCF 0xf2,0x2,0x0 INTCONbits.TMR0IF = 0; C:\Projects\UBW\FW\D_143\user\user.c // Turn on Timer0 C:\Projects\UBW\FW\D_143\user\user.c 0008ce 8ed5 BSF 0xd5,0x7,0x0 T0CONbits.TMR0ON = 1; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // And set this pin's state to timing C:\Projects\UBW\FW\D_143\user\user.c 0008d0 500e MOVF 0xe,0x0,0x0 g_RC_state[g_RC_primed_ptr] = kTIMING; C:\Projects\UBW\FW\D_143\user\user.c 0008d2 6aea CLRF 0xea,0x0 0008d4 0f51 ADDLW 0x51 0008d6 6ee9 MOVWF 0xe9,0x0 0008d8 0e01 MOVLW 0x1 0008da 22ea ADDWFC 0xea,0x1,0x0 0008dc 0e04 MOVLW 0x4 0008de 6eef MOVWF 0xef,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Remember which pin is now timing C:\Projects\UBW\FW\D_143\user\user.c 0008e0 500e MOVF 0xe,0x0,0x0 g_RC_timing_ptr = g_RC_primed_ptr; C:\Projects\UBW\FW\D_143\user\user.c 0008e2 6e10 MOVWF 0x10,0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 0008e4 0e02 MOVLW 0x2 if (kWAITING == g_RC_state[g_RC_next_ptr]) C:\Projects\UBW\FW\D_143\user\user.c 0008e6 6e38 MOVWF 0x38,0x0 0008e8 500f MOVF 0xf,0x0,0x0 0008ea 6aea CLRF 0xea,0x0 0008ec 0f51 ADDLW 0x51 0008ee 6ee9 MOVWF 0xe9,0x0 0008f0 0e01 MOVLW 0x1 0008f2 22ea ADDWFC 0xea,0x1,0x0 0008f4 50ef MOVF 0xef,0x0,0x0 0008f6 5c38 SUBWF 0x38,0x0,0x0 0008f8 e149 BNZ 0x98c { C:\Projects\UBW\FW\D_143\user\user.c // If the value is zero, then shut this pin off C:\Projects\UBW\FW\D_143\user\user.c // otherwise, prime it for sending a pulse C:\Projects\UBW\FW\D_143\user\user.c 0008fa 500f MOVF 0xf,0x0,0x0 if (0 == g_RC_value[g_RC_next_ptr]) C:\Projects\UBW\FW\D_143\user\user.c 0008fc 6ee9 MOVWF 0xe9,0x0 0008fe 6aea CLRF 0xea,0x0 000900 90d8 BCF 0xd8,0x0,0x0 000902 36e9 RLCF 0xe9,0x1,0x0 000904 36ea RLCF 0xea,0x1,0x0 000906 0e69 MOVLW 0x69 000908 26e9 ADDWF 0xe9,0x1,0x0 00090a 0e01 MOVLW 0x1 00090c 22ea ADDWFC 0xea,0x1,0x0 00090e 50ee MOVF 0xee,0x0,0x0 000910 10ed IORWF 0xed,0x0,0x0 000912 e109 BNZ 0x926 { C:\Projects\UBW\FW\D_143\user\user.c 000914 500f MOVF 0xf,0x0,0x0 g_RC_state[g_RC_next_ptr] = kOFF; C:\Projects\UBW\FW\D_143\user\user.c 000916 6aea CLRF 0xea,0x0 000918 0f51 ADDLW 0x51 00091a 6ee9 MOVWF 0xe9,0x0 00091c 0e01 MOVLW 0x1 00091e 22ea ADDWFC 0xea,0x1,0x0 000920 0e01 MOVLW 0x1 000922 6eef MOVWF 0xef,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000924 d033 BRA 0x98c else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Set the bit high C:\Projects\UBW\FW\D_143\user\user.c 000926 0e08 MOVLW 0x8 if (g_RC_next_ptr < 8) C:\Projects\UBW\FW\D_143\user\user.c 000928 5c0f SUBWF 0xf,0x0,0x0 00092a e20c BC 0x944 { C:\Projects\UBW\FW\D_143\user\user.c 00092c 0e07 MOVLW 0x7 bitset (LATA, g_RC_next_ptr & 0x7); C:\Projects\UBW\FW\D_143\user\user.c 00092e 140f ANDWF 0xf,0x0,0x0 000930 6e38 MOVWF 0x38,0x0 000932 0e01 MOVLW 0x1 000934 5238 MOVF 0x38,0x1,0x0 000936 e004 BZ 0x940 000938 46e8 RLNCF 0xe8,0x1,0x0 00093a 0bfe ANDLW 0xfe 00093c 0638 DECF 0x38,0x1,0x0 00093e e1fc BNZ 0x938 000940 1289 IORWF 0x89,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000942 d01a BRA 0x978 else if (g_RC_next_ptr < 16) C:\Projects\UBW\FW\D_143\user\user.c 000944 0e10 MOVLW 0x10 000946 5c0f SUBWF 0xf,0x0,0x0 000948 e20c BC 0x962 { C:\Projects\UBW\FW\D_143\user\user.c 00094a 0e07 MOVLW 0x7 bitset (LATB, g_RC_next_ptr & 0x7); C:\Projects\UBW\FW\D_143\user\user.c 00094c 140f ANDWF 0xf,0x0,0x0 00094e 6e38 MOVWF 0x38,0x0 000950 0e01 MOVLW 0x1 000952 5238 MOVF 0x38,0x1,0x0 000954 e004 BZ 0x95e 000956 46e8 RLNCF 0xe8,0x1,0x0 000958 0bfe ANDLW 0xfe 00095a 0638 DECF 0x38,0x1,0x0 00095c e1fc BNZ 0x956 00095e 128a IORWF 0x8a,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000960 d00b BRA 0x978 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 000962 0e07 MOVLW 0x7 bitset (LATC, g_RC_next_ptr & 0x7); C:\Projects\UBW\FW\D_143\user\user.c 000964 140f ANDWF 0xf,0x0,0x0 000966 6e38 MOVWF 0x38,0x0 000968 0e01 MOVLW 0x1 00096a 5238 MOVF 0x38,0x1,0x0 00096c e004 BZ 0x976 00096e 46e8 RLNCF 0xe8,0x1,0x0 000970 0bfe ANDLW 0xfe 000972 0638 DECF 0x38,0x1,0x0 000974 e1fc BNZ 0x96e 000976 128b IORWF 0x8b,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c // Set the state to primed so we know to do next C:\Projects\UBW\FW\D_143\user\user.c 000978 500f MOVF 0xf,0x0,0x0 g_RC_state[g_RC_next_ptr] = kPRIMED; C:\Projects\UBW\FW\D_143\user\user.c 00097a 6aea CLRF 0xea,0x0 00097c 0f51 ADDLW 0x51 00097e 6ee9 MOVWF 0xe9,0x0 000980 0e01 MOVLW 0x1 000982 22ea ADDWFC 0xea,0x1,0x0 000984 0e03 MOVLW 0x3 000986 6eef MOVWF 0xef,0x0 // And remember which pin is primed C:\Projects\UBW\FW\D_143\user\user.c 000988 500f MOVF 0xf,0x0,0x0 g_RC_primed_ptr = g_RC_next_ptr; C:\Projects\UBW\FW\D_143\user\user.c 00098a 6e0e MOVWF 0xe,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // And always advance the main pointer C:\Projects\UBW\FW\D_143\user\user.c // NOTE: we need to skip RA6, RA7, and RC3, RC4, and RC5 C:\Projects\UBW\FW\D_143\user\user.c // (Because UBW doesn't bring those pins out to headers) C:\Projects\UBW\FW\D_143\user\user.c 00098c 2a0f INCF 0xf,0x1,0x0 g_RC_next_ptr++; C:\Projects\UBW\FW\D_143\user\user.c 00098e 0e06 MOVLW 0x6 if (6 == g_RC_next_ptr) C:\Projects\UBW\FW\D_143\user\user.c 000990 5c0f SUBWF 0xf,0x0,0x0 000992 e103 BNZ 0x99a { C:\Projects\UBW\FW\D_143\user\user.c 000994 0e08 MOVLW 0x8 g_RC_next_ptr = 8; C:\Projects\UBW\FW\D_143\user\user.c 000996 6e0f MOVWF 0xf,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000998 d00a BRA 0x9ae else if (19 == g_RC_next_ptr) C:\Projects\UBW\FW\D_143\user\user.c 00099a 0e13 MOVLW 0x13 00099c 5c0f SUBWF 0xf,0x0,0x0 00099e e103 BNZ 0x9a6 { C:\Projects\UBW\FW\D_143\user\user.c 0009a0 0e16 MOVLW 0x16 g_RC_next_ptr = 22; C:\Projects\UBW\FW\D_143\user\user.c 0009a2 6e0f MOVWF 0xf,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 0009a4 d004 BRA 0x9ae else if (kRC_DATA_SIZE == g_RC_next_ptr) C:\Projects\UBW\FW\D_143\user\user.c 0009a6 0e18 MOVLW 0x18 0009a8 5c0f SUBWF 0xf,0x0,0x0 0009aa e101 BNZ 0x9ae { C:\Projects\UBW\FW\D_143\user\user.c 0009ac 6a0f CLRF 0xf,0x0 g_RC_next_ptr = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // See if it's time to fire off an I packet C:\Projects\UBW\FW\D_143\user\user.c 0009ae 0e00 MOVLW 0x0 if (ISR_D_RepeatRate > 0) C:\Projects\UBW\FW\D_143\user\user.c 0009b0 80d8 BSF 0xd8,0x0,0x0 0009b2 5402 SUBFWB 0x2,0x0,0x0 0009b4 0e00 MOVLW 0x0 0009b6 5403 SUBFWB 0x3,0x0,0x0 0009b8 e22e BC 0xa16 { C:\Projects\UBW\FW\D_143\user\user.c 0009ba 2a11 INCF 0x11,0x1,0x0 D_tick_counter++; C:\Projects\UBW\FW\D_143\user\user.c 0009bc 0e00 MOVLW 0x0 0009be 2212 ADDWFC 0x12,0x1,0x0 0009c0 5002 MOVF 0x2,0x0,0x0 if (D_tick_counter >= ISR_D_RepeatRate) C:\Projects\UBW\FW\D_143\user\user.c 0009c2 5c11 SUBWF 0x11,0x0,0x0 0009c4 5003 MOVF 0x3,0x0,0x0 0009c6 5812 SUBWFB 0x12,0x0,0x0 0009c8 e326 BNC 0xa16 { C:\Projects\UBW\FW\D_143\user\user.c 0009ca 6a11 CLRF 0x11,0x0 D_tick_counter = 0; C:\Projects\UBW\FW\D_143\user\user.c 0009cc 6a12 CLRF 0x12,0x0 // Tell the main code to send an I packet C:\Projects\UBW\FW\D_143\user\user.c 0009ce 0e03 MOVLW 0x3 if (ISR_D_FIFO_length < kISR_FIFO_D_DEPTH) C:\Projects\UBW\FW\D_143\user\user.c 0009d0 5c06 SUBWF 0x6,0x0,0x0 0009d2 e21f BC 0xa12 { C:\Projects\UBW\FW\D_143\user\user.c // And copy over our port values C:\Projects\UBW\FW\D_143\user\user.c 0009d4 5004 MOVF 0x4,0x0,0x0 ISR_D_FIFO[0][ISR_D_FIFO_in] = PORTA; C:\Projects\UBW\FW\D_143\user\user.c 0009d6 6aea CLRF 0xea,0x0 0009d8 0f48 ADDLW 0x48 0009da 6ee9 MOVWF 0xe9,0x0 0009dc 0e01 MOVLW 0x1 0009de 22ea ADDWFC 0xea,0x1,0x0 0009e0 cf80 MOVFF 0xf80,0xfef 0009e2 ffef 0009e4 5004 MOVF 0x4,0x0,0x0 ISR_D_FIFO[1][ISR_D_FIFO_in] = PORTB; C:\Projects\UBW\FW\D_143\user\user.c 0009e6 6aea CLRF 0xea,0x0 0009e8 0f4b ADDLW 0x4b 0009ea 6ee9 MOVWF 0xe9,0x0 0009ec 0e01 MOVLW 0x1 0009ee 22ea ADDWFC 0xea,0x1,0x0 0009f0 cf81 MOVFF 0xf81,0xfef 0009f2 ffef 0009f4 5004 MOVF 0x4,0x0,0x0 ISR_D_FIFO[2][ISR_D_FIFO_in] = PORTC; C:\Projects\UBW\FW\D_143\user\user.c 0009f6 6aea CLRF 0xea,0x0 0009f8 0f4e ADDLW 0x4e 0009fa 6ee9 MOVWF 0xe9,0x0 0009fc 0e01 MOVLW 0x1 0009fe 22ea ADDWFC 0xea,0x1,0x0 000a00 cf82 MOVFF 0xf82,0xfef 000a02 ffef 000a04 2a04 INCF 0x4,0x1,0x0 ISR_D_FIFO_in++; C:\Projects\UBW\FW\D_143\user\user.c 000a06 0e03 MOVLW 0x3 if (ISR_D_FIFO_in >= kISR_FIFO_D_DEPTH) C:\Projects\UBW\FW\D_143\user\user.c 000a08 5c04 SUBWF 0x4,0x0,0x0 000a0a e301 BNC 0xa0e { C:\Projects\UBW\FW\D_143\user\user.c 000a0c 6a04 CLRF 0x4,0x0 ISR_D_FIFO_in = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000a0e 2a06 INCF 0x6,0x1,0x0 ISR_D_FIFO_length++; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000a10 d002 BRA 0xa16 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Stop the madness! Something is wrong, we're C:\Projects\UBW\FW\D_143\user\user.c // not getting our packets out. So kill the C:\Projects\UBW\FW\D_143\user\user.c // timer. C:\Projects\UBW\FW\D_143\user\user.c 000a12 6a02 CLRF 0x2,0x0 ISR_D_RepeatRate = 0; C:\Projects\UBW\FW\D_143\user\user.c 000a14 6a03 CLRF 0x3,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // See if it's time to fire off an A packet C:\Projects\UBW\FW\D_143\user\user.c 000a16 0e00 MOVLW 0x0 if ((ISR_A_RepeatRate > 0) && (AnalogEnable > 0)) C:\Projects\UBW\FW\D_143\user\user.c 000a18 80d8 BSF 0xd8,0x0,0x0 000a1a 5407 SUBFWB 0x7,0x0,0x0 000a1c 0e00 MOVLW 0x0 000a1e 5408 SUBFWB 0x8,0x0,0x0 000a20 e219 BC 0xa54 000a22 500c MOVF 0xc,0x0,0x0 000a24 0800 SUBLW 0x0 000a26 e216 BC 0xa54 { C:\Projects\UBW\FW\D_143\user\user.c 000a28 2a13 INCF 0x13,0x1,0x0 A_tick_counter++; C:\Projects\UBW\FW\D_143\user\user.c 000a2a 0e00 MOVLW 0x0 000a2c 2214 ADDWFC 0x14,0x1,0x0 000a2e 5007 MOVF 0x7,0x0,0x0 if (A_tick_counter >= ISR_A_RepeatRate) C:\Projects\UBW\FW\D_143\user\user.c 000a30 5c13 SUBWF 0x13,0x0,0x0 000a32 5008 MOVF 0x8,0x0,0x0 000a34 5814 SUBWFB 0x14,0x0,0x0 000a36 e30e BNC 0xa54 { C:\Projects\UBW\FW\D_143\user\user.c 000a38 6a13 CLRF 0x13,0x0 A_tick_counter = 0; C:\Projects\UBW\FW\D_143\user\user.c 000a3a 6a14 CLRF 0x14,0x0 // Tell the main code to send an A packet C:\Projects\UBW\FW\D_143\user\user.c 000a3c 0e03 MOVLW 0x3 if (ISR_A_FIFO_length < kISR_FIFO_A_DEPTH) C:\Projects\UBW\FW\D_143\user\user.c 000a3e 5c0b SUBWF 0xb,0x0,0x0 000a40 e207 BC 0xa50 { C:\Projects\UBW\FW\D_143\user\user.c 000a42 2a09 INCF 0x9,0x1,0x0 ISR_A_FIFO_in++; C:\Projects\UBW\FW\D_143\user\user.c 000a44 0e03 MOVLW 0x3 if (ISR_A_FIFO_in >= kISR_FIFO_A_DEPTH) C:\Projects\UBW\FW\D_143\user\user.c 000a46 5c09 SUBWF 0x9,0x0,0x0 000a48 e301 BNC 0xa4c { C:\Projects\UBW\FW\D_143\user\user.c 000a4a 6a09 CLRF 0x9,0x0 ISR_A_FIFO_in = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000a4c 2a0b INCF 0xb,0x1,0x0 ISR_A_FIFO_length++; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000a4e d002 BRA 0xa54 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Stop the madness! Something is wrong, we're C:\Projects\UBW\FW\D_143\user\user.c // not getting our packets out. So kill the A C:\Projects\UBW\FW\D_143\user\user.c // packets. C:\Projects\UBW\FW\D_143\user\user.c 000a50 6a07 CLRF 0x7,0x0 ISR_A_RepeatRate = 0; C:\Projects\UBW\FW\D_143\user\user.c 000a52 6a08 CLRF 0x8,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // See if it's time to start analog conversions C:\Projects\UBW\FW\D_143\user\user.c 000a54 500c MOVF 0xc,0x0,0x0 if (AnalogEnable > 0) C:\Projects\UBW\FW\D_143\user\user.c 000a56 0800 SUBLW 0x0 000a58 e20a BC 0xa6e { C:\Projects\UBW\FW\D_143\user\user.c // Set the channel to zero to start off with C:\Projects\UBW\FW\D_143\user\user.c 000a5a 6a15 CLRF 0x15,0x0 A_cur_channel = 0; C:\Projects\UBW\FW\D_143\user\user.c 000a5c 5015 MOVF 0x15,0x0,0x0 ADCON0 = (A_cur_channel << 2) + 1; C:\Projects\UBW\FW\D_143\user\user.c 000a5e 0d04 MULLW 0x4 000a60 28f3 INCF 0xf3,0x0,0x0 000a62 6ec2 MOVWF 0xc2,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Clear the interrupt C:\Projects\UBW\FW\D_143\user\user.c 000a64 9c9e BCF 0x9e,0x6,0x0 PIR1bits.ADIF = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // And make sure to always use low priority. C:\Projects\UBW\FW\D_143\user\user.c 000a66 9c9f BCF 0x9f,0x6,0x0 IPR1bits.ADIP = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Set the interrupt enable C:\Projects\UBW\FW\D_143\user\user.c 000a68 8c9d BSF 0x9d,0x6,0x0 PIE1bits.ADIE = 1; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Make sure it's on! C:\Projects\UBW\FW\D_143\user\user.c 000a6a 80c2 BSF 0xc2,0x0,0x0 ADCON0bits.ADON = 1; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // And tell the A/D to GO! C:\Projects\UBW\FW\D_143\user\user.c 000a6c 82c2 BSF 0xc2,0x1,0x0 ADCON0bits.GO_DONE = 1; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Do we have an analog interrupt? C:\Projects\UBW\FW\D_143\user\user.c 000a6e ac9e BTFSS 0x9e,0x6,0x0 if (PIR1bits.ADIF) C:\Projects\UBW\FW\D_143\user\user.c 000a70 d02d BRA 0xacc { C:\Projects\UBW\FW\D_143\user\user.c // Clear the interrupt C:\Projects\UBW\FW\D_143\user\user.c 000a72 9c9e BCF 0x9e,0x6,0x0 PIR1bits.ADIF = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Read out the value that we just converted, and store it. C:\Projects\UBW\FW\D_143\user\user.c 000a8a 5015 MOVF 0x15,0x0,0x0 ISR_A_FIFO[A_cur_channel][ISR_A_FIFO_in] = C:\Projects\UBW\FW\D_143\user\user.c 000a8c 0d06 MULLW 0x6 000a8e cff3 MOVFF 0xff3,0x38 000a90 f038 000a92 cff4 MOVFF 0xff4,0x39 000a94 f039 000a96 0e00 MOVLW 0x0 000a98 2638 ADDWF 0x38,0x1,0x0 000a9a 0e01 MOVLW 0x1 000a9c 2239 ADDWFC 0x39,0x1,0x0 000a9e 5009 MOVF 0x9,0x0,0x0 000aa0 0d02 MULLW 0x2 000aa2 5038 MOVF 0x38,0x0,0x0 000aa4 24f3 ADDWF 0xf3,0x0,0x0 000aa6 6ee9 MOVWF 0xe9,0x0 000aa8 5039 MOVF 0x39,0x0,0x0 000aaa 20f4 ADDWFC 0xf4,0x0,0x0 000aac 6eea MOVWF 0xea,0x0 000a7e 50c3 MOVF 0xc3,0x0,0x0 (unsigned int)ADRESL C:\Projects\UBW\FW\D_143\user\user.c | C:\Projects\UBW\FW\D_143\user\user.c 000a74 50c4 MOVF 0xc4,0x0,0x0 ((unsigned int)ADRESH << 8); C:\Projects\UBW\FW\D_143\user\user.c 000a76 6e3c MOVWF 0x3c,0x0 000a78 c03c MOVFF 0x3c,0x3d 000a7a f03d 000a7c 6a3c CLRF 0x3c,0x0 000a80 0100 MOVLB 0x0 000a82 103c IORWF 0x3c,0x0,0x0 000a84 6e3a MOVWF 0x3a,0x0 000a86 c03d MOVFF 0x3d,0x3b 000a88 f03b 000aae c03a MOVFF 0x3a,0xfee 000ab0 ffee 000ab2 c03b MOVFF 0x3b,0xfed 000ab4 ffed C:\Projects\UBW\FW\D_143\user\user.c // Incriment the channel and write the new one in C:\Projects\UBW\FW\D_143\user\user.c 000ab6 2a15 INCF 0x15,0x1,0x0 A_cur_channel++; C:\Projects\UBW\FW\D_143\user\user.c 000ab8 500c MOVF 0xc,0x0,0x0 if (A_cur_channel >= AnalogEnable) C:\Projects\UBW\FW\D_143\user\user.c 000aba 5c15 SUBWF 0x15,0x0,0x0 000abc e302 BNC 0xac2 { C:\Projects\UBW\FW\D_143\user\user.c // We're done, so just sit and wait C:\Projects\UBW\FW\D_143\user\user.c // Turn off our interrupts though. C:\Projects\UBW\FW\D_143\user\user.c 000abe 9c9d BCF 0x9d,0x6,0x0 PIE1bits.ADIE = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000ac0 d005 BRA 0xacc else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Update the channel number C:\Projects\UBW\FW\D_143\user\user.c 000ac2 5015 MOVF 0x15,0x0,0x0 ADCON0 = (A_cur_channel << 2) + 1; C:\Projects\UBW\FW\D_143\user\user.c 000ac4 0d04 MULLW 0x4 000ac6 28f3 INCF 0xf3,0x0,0x0 000ac8 6ec2 MOVWF 0xc2,0x0 // And start the next conversion C:\Projects\UBW\FW\D_143\user\user.c 000aca 82c2 BSF 0xc2,0x1,0x0 ADCON0bits.GO_DONE = 1; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Do we have a TMR0 interrupt? (RC command) C:\Projects\UBW\FW\D_143\user\user.c // TMR0 is in 16 bit mode, and counts up to FFFF and overflows, generating C:\Projects\UBW\FW\D_143\user\user.c // this interrupt. C:\Projects\UBW\FW\D_143\user\user.c 000acc a4f2 BTFSS 0xf2,0x2,0x0 if (INTCONbits.TMR0IF) C:\Projects\UBW\FW\D_143\user\user.c 000ace d042 BRA 0xb54 { C:\Projects\UBW\FW\D_143\user\user.c // Turn off Timer0 C:\Projects\UBW\FW\D_143\user\user.c 000ad0 9ed5 BCF 0xd5,0x7,0x0 T0CONbits.TMR0ON = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Clear the interrupt C:\Projects\UBW\FW\D_143\user\user.c 000ad2 94f2 BCF 0xf2,0x2,0x0 INTCONbits.TMR0IF = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // And disable it C:\Projects\UBW\FW\D_143\user\user.c 000ad4 9af2 BCF 0xf2,0x5,0x0 INTCONbits.TMR0IE = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Only do our stuff if the pin is in the proper state C:\Projects\UBW\FW\D_143\user\user.c 000ad6 0e04 MOVLW 0x4 if (kTIMING == g_RC_state[g_RC_timing_ptr]) C:\Projects\UBW\FW\D_143\user\user.c 000ad8 6e38 MOVWF 0x38,0x0 000ada 5010 MOVF 0x10,0x0,0x0 000adc 6aea CLRF 0xea,0x0 000ade 0f51 ADDLW 0x51 000ae0 6ee9 MOVWF 0xe9,0x0 000ae2 0e01 MOVLW 0x1 000ae4 22ea ADDWFC 0xea,0x1,0x0 000ae6 50ef MOVF 0xef,0x0,0x0 000ae8 5c38 SUBWF 0x38,0x0,0x0 000aea e134 BNZ 0xb54 { C:\Projects\UBW\FW\D_143\user\user.c // All we need to do is clear the pin and change its state to kWAITING C:\Projects\UBW\FW\D_143\user\user.c 000aec 0e08 MOVLW 0x8 if (g_RC_timing_ptr < 8) C:\Projects\UBW\FW\D_143\user\user.c 000aee 5c10 SUBWF 0x10,0x0,0x0 000af0 e20d BC 0xb0c { C:\Projects\UBW\FW\D_143\user\user.c 000af2 0e07 MOVLW 0x7 bitclr (LATA, g_RC_timing_ptr & 0x7); C:\Projects\UBW\FW\D_143\user\user.c 000af4 1410 ANDWF 0x10,0x0,0x0 000af6 6e38 MOVWF 0x38,0x0 000af8 0e01 MOVLW 0x1 000afa 5238 MOVF 0x38,0x1,0x0 000afc e004 BZ 0xb06 000afe 46e8 RLNCF 0xe8,0x1,0x0 000b00 0bfe ANDLW 0xfe 000b02 0638 DECF 0x38,0x1,0x0 000b04 e1fc BNZ 0xafe 000b06 1ce8 COMF 0xe8,0x0,0x0 000b08 1689 ANDWF 0x89,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000b0a d01c BRA 0xb44 else if (g_RC_timing_ptr < 16) C:\Projects\UBW\FW\D_143\user\user.c 000b0c 0e10 MOVLW 0x10 000b0e 5c10 SUBWF 0x10,0x0,0x0 000b10 e20d BC 0xb2c { C:\Projects\UBW\FW\D_143\user\user.c 000b12 0e07 MOVLW 0x7 bitclr (LATB, g_RC_timing_ptr & 0x7); C:\Projects\UBW\FW\D_143\user\user.c 000b14 1410 ANDWF 0x10,0x0,0x0 000b16 6e38 MOVWF 0x38,0x0 000b18 0e01 MOVLW 0x1 000b1a 5238 MOVF 0x38,0x1,0x0 000b1c e004 BZ 0xb26 000b1e 46e8 RLNCF 0xe8,0x1,0x0 000b20 0bfe ANDLW 0xfe 000b22 0638 DECF 0x38,0x1,0x0 000b24 e1fc BNZ 0xb1e 000b26 1ce8 COMF 0xe8,0x0,0x0 000b28 168a ANDWF 0x8a,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000b2a d00c BRA 0xb44 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 000b2c 0e07 MOVLW 0x7 bitclr (LATC, g_RC_timing_ptr & 0x7); C:\Projects\UBW\FW\D_143\user\user.c 000b2e 1410 ANDWF 0x10,0x0,0x0 000b30 6e38 MOVWF 0x38,0x0 000b32 0e01 MOVLW 0x1 000b34 5238 MOVF 0x38,0x1,0x0 000b36 e004 BZ 0xb40 000b38 46e8 RLNCF 0xe8,0x1,0x0 000b3a 0bfe ANDLW 0xfe 000b3c 0638 DECF 0x38,0x1,0x0 000b3e e1fc BNZ 0xb38 000b40 1ce8 COMF 0xe8,0x0,0x0 000b42 168b ANDWF 0x8b,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000b44 5010 MOVF 0x10,0x0,0x0 g_RC_state[g_RC_timing_ptr] = kWAITING; C:\Projects\UBW\FW\D_143\user\user.c 000b46 6aea CLRF 0xea,0x0 000b48 0f51 ADDLW 0x51 000b4a 6ee9 MOVWF 0xe9,0x0 000b4c 0e01 MOVLW 0x1 000b4e 22ea ADDWFC 0xea,0x1,0x0 000b50 0e02 MOVLW 0x2 000b52 6eef MOVWF 0xef,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000b54 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000b56 cfe5 MOVFF 0xfe5,0xff4 000b58 fff4 000b5a cfe5 MOVFF 0xfe5,0xff3 000b5c fff3 000b5e cfe5 MOVFF 0xfe5,0xfea 000b60 ffea 000b62 cfe5 MOVFF 0xfe5,0xfe9 000b64 ffe9 000b66 cfe5 MOVFF 0xfe5,0xfda 000b68 ffda 000b6a 50e5 MOVF 0xe5,0x0,0x0 000b6c cfe5 MOVFF 0xfe5,0xfe0 000b6e ffe0 000b70 cfe5 MOVFF 0xfe5,0xfd8 000b72 ffd8 000b74 0010 RETFIE 0x0 C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #pragma interrupt high_ISR C:\Projects\UBW\FW\D_143\user\user.c 000b76 cfda MOVFF 0xfda,0xfe4 void high_ISR(void) C:\Projects\UBW\FW\D_143\user\user.c 000b78 ffe4 000b7a cfe2 MOVFF 0xfe2,0xfda 000b7c ffda 000b7e 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c 000b80 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000b82 cfe5 MOVFF 0xfe5,0xfda 000b84 ffda 000b86 0011 RETFIE 0x1 C:\Projects\UBW\FW\D_143\user\user.c 000b88 cfd9 MOVFF 0xfd9,0xfe6 void UserInit(void) C:\Projects\UBW\FW\D_143\user\user.c 000b8a ffe6 000b8c cfe1 MOVFF 0xfe1,0xfd9 000b8e ffd9 000b90 0e02 MOVLW 0x2 000b92 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c char i, j; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Make all of 3 digital inputs C:\Projects\UBW\FW\D_143\user\user.c 000b94 6a89 CLRF 0x89,0x0 LATA = 0x00; C:\Projects\UBW\FW\D_143\user\user.c 000b96 6892 SETF 0x92,0x0 TRISA = 0xFF; C:\Projects\UBW\FW\D_143\user\user.c // Turn all analog inputs into digital inputs C:\Projects\UBW\FW\D_143\user\user.c 000b98 0e0f MOVLW 0xf ADCON1 = 0x0F; C:\Projects\UBW\FW\D_143\user\user.c 000b9a 6ec1 MOVWF 0xc1,0x0 // Turn off the ADC C:\Projects\UBW\FW\D_143\user\user.c 000b9c 90c2 BCF 0xc2,0x0,0x0 ADCON0bits.ADON = 0; C:\Projects\UBW\FW\D_143\user\user.c // Turn off our own idea of how many analog channels to convert C:\Projects\UBW\FW\D_143\user\user.c 000b9e 6a0c CLRF 0xc,0x0 AnalogEnable = 0; C:\Projects\UBW\FW\D_143\user\user.c 000ba0 0e07 MOVLW 0x7 CMCON = 0x07; // Comparators as digital inputs C:\Projects\UBW\FW\D_143\user\user.c 000ba2 6eb4 MOVWF 0xb4,0x0 // Make all of PORTB inputs C:\Projects\UBW\FW\D_143\user\user.c 000ba4 6a8a CLRF 0x8a,0x0 LATB = 0x00; C:\Projects\UBW\FW\D_143\user\user.c 000ba6 6893 SETF 0x93,0x0 TRISB = 0xFF; C:\Projects\UBW\FW\D_143\user\user.c // Make all of PORTC inputs C:\Projects\UBW\FW\D_143\user\user.c 000ba8 6a8b CLRF 0x8b,0x0 LATC = 0x00; C:\Projects\UBW\FW\D_143\user\user.c 000baa 6894 SETF 0x94,0x0 TRISC = 0xFF; C:\Projects\UBW\FW\D_143\user\user.c #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c // Make all of PORTD and PORTE inputs too C:\Projects\UBW\FW\D_143\user\user.c 000bac 6a8c CLRF 0x8c,0x0 LATD = 0x00; C:\Projects\UBW\FW\D_143\user\user.c 000bae 6895 SETF 0x95,0x0 TRISD = 0xFF; C:\Projects\UBW\FW\D_143\user\user.c 000bb0 6a8d CLRF 0x8d,0x0 LATE = 0x00; C:\Projects\UBW\FW\D_143\user\user.c 000bb2 6896 SETF 0x96,0x0 TRISE = 0xFF; C:\Projects\UBW\FW\D_143\user\user.c #endif C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Initalize LED I/Os to outputs C:\Projects\UBW\FW\D_143\user\user.c 000bb4 0efc MOVLW 0xfc mInitAllLEDs(); C:\Projects\UBW\FW\D_143\user\user.c 000bb6 168b ANDWF 0x8b,0x1,0x0 000bb8 0efc MOVLW 0xfc 000bba 1694 ANDWF 0x94,0x1,0x0 // Initalize switch as an input C:\Projects\UBW\FW\D_143\user\user.c 000bbc 8494 BSF 0x94,0x2,0x0 mInitSwitch(); C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Start off always using "OK" acknoledge. C:\Projects\UBW\FW\D_143\user\user.c 000bbe 0101 MOVLB 0x1 g_ack_enable = TRUE; C:\Projects\UBW\FW\D_143\user\user.c 000bc0 0e01 MOVLW 0x1 000bc2 6fbe MOVWF 0xbe,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Use our own special output function for STDOUT C:\Projects\UBW\FW\D_143\user\user.c 000bc4 0101 MOVLB 0x1 stdout = _H_USER; C:\Projects\UBW\FW\D_143\user\user.c 000bc6 69dc SETF 0xdc,0x1 000bc8 69dd SETF 0xdd,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Initalize all of the ISR FIFOs C:\Projects\UBW\FW\D_143\user\user.c 000bca 6a0a CLRF 0xa,0x0 ISR_A_FIFO_out = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bcc 6a09 CLRF 0x9,0x0 ISR_A_FIFO_in = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bce 6a0b CLRF 0xb,0x0 ISR_A_FIFO_length = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bd0 6a05 CLRF 0x5,0x0 ISR_D_FIFO_out = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bd2 6a04 CLRF 0x4,0x0 ISR_D_FIFO_in = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bd4 6a06 CLRF 0x6,0x0 ISR_D_FIFO_length = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Make sure that our timer stuff starts out disabled C:\Projects\UBW\FW\D_143\user\user.c 000bd6 6a02 CLRF 0x2,0x0 ISR_D_RepeatRate = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bd8 6a03 CLRF 0x3,0x0 000bda 6a07 CLRF 0x7,0x0 ISR_A_RepeatRate = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bdc 6a08 CLRF 0x8,0x0 000bde 6a11 CLRF 0x11,0x0 D_tick_counter = 0; C:\Projects\UBW\FW\D_143\user\user.c 000be0 6a12 CLRF 0x12,0x0 000be2 6a13 CLRF 0x13,0x0 A_tick_counter = 0; C:\Projects\UBW\FW\D_143\user\user.c 000be4 6a14 CLRF 0x14,0x0 000be6 6a15 CLRF 0x15,0x0 A_cur_channel = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Now init our registers C:\Projects\UBW\FW\D_143\user\user.c // The prescaler will be at 16 C:\Projects\UBW\FW\D_143\user\user.c 000be8 82ca BSF 0xca,0x1,0x0 T2CONbits.T2CKPS1 = 1; C:\Projects\UBW\FW\D_143\user\user.c 000bea 80ca BSF 0xca,0x0,0x0 T2CONbits.T2CKPS0 = 1; C:\Projects\UBW\FW\D_143\user\user.c // We want the TMR2 post scaler to be a 3 C:\Projects\UBW\FW\D_143\user\user.c 000bec 9cca BCF 0xca,0x6,0x0 T2CONbits.T2OUTPS3 = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bee 9aca BCF 0xca,0x5,0x0 T2CONbits.T2OUTPS2 = 0; C:\Projects\UBW\FW\D_143\user\user.c 000bf0 88ca BSF 0xca,0x4,0x0 T2CONbits.T2OUTPS1 = 1; C:\Projects\UBW\FW\D_143\user\user.c 000bf2 96ca BCF 0xca,0x3,0x0 T2CONbits.T2OUTPS0 = 0; C:\Projects\UBW\FW\D_143\user\user.c // Set our reload value C:\Projects\UBW\FW\D_143\user\user.c 000bf4 0efa MOVLW 0xfa PR2 = kPR2_RELOAD; C:\Projects\UBW\FW\D_143\user\user.c 000bf6 6ecb MOVWF 0xcb,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Set up the Analog to Digital converter C:\Projects\UBW\FW\D_143\user\user.c // Clear out the FIFO data C:\Projects\UBW\FW\D_143\user\user.c 000bf8 6adf CLRF 0xdf,0x0 for (i = 0; i < 12; i++) C:\Projects\UBW\FW\D_143\user\user.c 000bfa cfdf MOVFF 0xfdf,0x2a 000bfc f02a 000bfe 0e0c MOVLW 0xc 000c00 6ee7 MOVWF 0xe7,0x0 000c02 182a XORWF 0x2a,0x0,0x0 000c04 aee8 BTFSS 0xe8,0x7,0x0 000c06 d002 BRA 0xc0c 000c08 34e7 RLCF 0xe7,0x0,0x0 000c0a d002 BRA 0xc10 000c0c 50e7 MOVF 0xe7,0x0,0x0 000c0e 5c2a SUBWF 0x2a,0x0,0x0 000c10 e238 BC 0xc82 000c7e 2adf INCF 0xdf,0x1,0x0 000c80 d7bc BRA 0xbfa { C:\Projects\UBW\FW\D_143\user\user.c 000c12 0e01 MOVLW 0x1 for (j = 0; j < kISR_FIFO_A_DEPTH; j++) C:\Projects\UBW\FW\D_143\user\user.c 000c14 6adb CLRF 0xdb,0x0 000c16 0e01 MOVLW 0x1 000c18 cfdb MOVFF 0xfdb,0x2a 000c1a f02a 000c1c 0e03 MOVLW 0x3 000c1e 6ee7 MOVWF 0xe7,0x0 000c20 182a XORWF 0x2a,0x0,0x0 000c22 aee8 BTFSS 0xe8,0x7,0x0 000c24 d002 BRA 0xc2a 000c26 34e7 RLCF 0xe7,0x0,0x0 000c28 d002 BRA 0xc2e 000c2a 50e7 MOVF 0xe7,0x0,0x0 000c2c 5c2a SUBWF 0x2a,0x0,0x0 000c2e e227 BC 0xc7e 000c78 0e01 MOVLW 0x1 000c7a 2adb INCF 0xdb,0x1,0x0 000c7c d7cc BRA 0xc16 { C:\Projects\UBW\FW\D_143\user\user.c 000c30 cfdf MOVFF 0xfdf,0x2a ISR_A_FIFO[i][j] = 0; C:\Projects\UBW\FW\D_143\user\user.c 000c32 f02a 000c34 6a2b CLRF 0x2b,0x0 000c36 be2a BTFSC 0x2a,0x7,0x0 000c38 682b SETF 0x2b,0x0 000c3a 0e06 MOVLW 0x6 000c3c 022b MULWF 0x2b,0x0 000c3e cff3 MOVFF 0xff3,0x2b 000c40 f02b 000c42 0e06 MOVLW 0x6 000c44 022a MULWF 0x2a,0x0 000c46 cff3 MOVFF 0xff3,0x2a 000c48 f02a 000c4a 50f4 MOVF 0xf4,0x0,0x0 000c4c 262b ADDWF 0x2b,0x1,0x0 000c4e 0e00 MOVLW 0x0 000c50 262a ADDWF 0x2a,0x1,0x0 000c52 0e01 MOVLW 0x1 000c54 222b ADDWFC 0x2b,0x1,0x0 000c56 0e01 MOVLW 0x1 000c58 cfdb MOVFF 0xfdb,0x2c 000c5a f02c 000c5c 6a2d CLRF 0x2d,0x0 000c5e be2c BTFSC 0x2c,0x7,0x0 000c60 682d SETF 0x2d,0x0 000c62 90d8 BCF 0xd8,0x0,0x0 000c64 362c RLCF 0x2c,0x1,0x0 000c66 362d RLCF 0x2d,0x1,0x0 000c68 502a MOVF 0x2a,0x0,0x0 000c6a 242c ADDWF 0x2c,0x0,0x0 000c6c 6ee9 MOVWF 0xe9,0x0 000c6e 502b MOVF 0x2b,0x0,0x0 000c70 202d ADDWFC 0x2d,0x0,0x0 000c72 6eea MOVWF 0xea,0x0 000c74 6aee CLRF 0xee,0x0 000c76 6aed CLRF 0xed,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Inialize USB TX and RX buffer management C:\Projects\UBW\FW\D_143\user\user.c 000c82 0101 MOVLB 0x1 g_RX_buf_in = 0; C:\Projects\UBW\FW\D_143\user\user.c 000c84 6bb8 CLRF 0xb8,0x1 000c86 0101 MOVLB 0x1 g_RX_buf_out = 0; C:\Projects\UBW\FW\D_143\user\user.c 000c88 6bb9 CLRF 0xb9,0x1 000c8a 0101 MOVLB 0x1 g_TX_buf_in = 0; C:\Projects\UBW\FW\D_143\user\user.c 000c8c 6bb6 CLRF 0xb6,0x1 000c8e 0101 MOVLB 0x1 g_TX_buf_out = 0; C:\Projects\UBW\FW\D_143\user\user.c 000c90 6bb7 CLRF 0xb7,0x1 C:\Projects\UBW\FW\D_143\user\user.c // And the USART TX and RX buffer management C:\Projects\UBW\FW\D_143\user\user.c 000c92 0101 MOVLB 0x1 g_USART_RX_buf_in = 0; C:\Projects\UBW\FW\D_143\user\user.c 000c94 6bba CLRF 0xba,0x1 000c96 0101 MOVLB 0x1 g_USART_RX_buf_out = 0; C:\Projects\UBW\FW\D_143\user\user.c 000c98 6bbb CLRF 0xbb,0x1 000c9a 0101 MOVLB 0x1 g_USART_TX_buf_in = 0; C:\Projects\UBW\FW\D_143\user\user.c 000c9c 6bbc CLRF 0xbc,0x1 000c9e 0101 MOVLB 0x1 g_USART_TX_buf_out = 0; C:\Projects\UBW\FW\D_143\user\user.c 000ca0 6bbd CLRF 0xbd,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Clear out the RC servo output pointer values C:\Projects\UBW\FW\D_143\user\user.c 000ca2 6a0e CLRF 0xe,0x0 g_RC_primed_ptr = 0; C:\Projects\UBW\FW\D_143\user\user.c 000ca4 6a0f CLRF 0xf,0x0 g_RC_next_ptr = 0; C:\Projects\UBW\FW\D_143\user\user.c 000ca6 6a10 CLRF 0x10,0x0 g_RC_timing_ptr = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Clear the RC data structure C:\Projects\UBW\FW\D_143\user\user.c 000ca8 6adf CLRF 0xdf,0x0 for (i = 0; i < kRC_DATA_SIZE; i++) C:\Projects\UBW\FW\D_143\user\user.c 000caa cfdf MOVFF 0xfdf,0x2a 000cac f02a 000cae 0e18 MOVLW 0x18 000cb0 6ee7 MOVWF 0xe7,0x0 000cb2 182a XORWF 0x2a,0x0,0x0 000cb4 aee8 BTFSS 0xe8,0x7,0x0 000cb6 d002 BRA 0xcbc 000cb8 34e7 RLCF 0xe7,0x0,0x0 000cba d002 BRA 0xcc0 000cbc 50e7 MOVF 0xe7,0x0,0x0 000cbe 5c2a SUBWF 0x2a,0x0,0x0 000cc0 e21b BC 0xcf8 000cf4 2adf INCF 0xdf,0x1,0x0 000cf6 d7d9 BRA 0xcaa { C:\Projects\UBW\FW\D_143\user\user.c 000cc2 cfdf MOVFF 0xfdf,0xfe9 g_RC_value[i] = 0; C:\Projects\UBW\FW\D_143\user\user.c 000cc4 ffe9 000cc6 6aea CLRF 0xea,0x0 000cc8 bee9 BTFSC 0xe9,0x7,0x0 000cca 68ea SETF 0xea,0x0 000ccc 90d8 BCF 0xd8,0x0,0x0 000cce 36e9 RLCF 0xe9,0x1,0x0 000cd0 36ea RLCF 0xea,0x1,0x0 000cd2 0e69 MOVLW 0x69 000cd4 26e9 ADDWF 0xe9,0x1,0x0 000cd6 0e01 MOVLW 0x1 000cd8 22ea ADDWFC 0xea,0x1,0x0 000cda 6aee CLRF 0xee,0x0 000cdc 6aed CLRF 0xed,0x0 000cde cfdf MOVFF 0xfdf,0xfe9 g_RC_state[i] = kOFF; C:\Projects\UBW\FW\D_143\user\user.c 000ce0 ffe9 000ce2 6aea CLRF 0xea,0x0 000ce4 bee9 BTFSC 0xe9,0x7,0x0 000ce6 68ea SETF 0xea,0x0 000ce8 0e51 MOVLW 0x51 000cea 26e9 ADDWF 0xe9,0x1,0x0 000cec 0e01 MOVLW 0x1 000cee 22ea ADDWFC 0xea,0x1,0x0 000cf0 0e01 MOVLW 0x1 000cf2 6eef MOVWF 0xef,0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Enable TMR0 for our RC timing operation C:\Projects\UBW\FW\D_143\user\user.c 000cf8 86d5 BSF 0xd5,0x3,0x0 T0CONbits.PSA = 1; // Do NOT use the prescaler C:\Projects\UBW\FW\D_143\user\user.c 000cfa 9ad5 BCF 0xd5,0x5,0x0 T0CONbits.T0CS = 0; // Use internal clock C:\Projects\UBW\FW\D_143\user\user.c 000cfc 9cd5 BCF 0xd5,0x6,0x0 T0CONbits.T08BIT = 0; // 16 bit timer C:\Projects\UBW\FW\D_143\user\user.c 000cfe 94f2 BCF 0xf2,0x2,0x0 INTCONbits.TMR0IF = 0; // Clear the interrupt flag C:\Projects\UBW\FW\D_143\user\user.c 000d00 9af2 BCF 0xf2,0x5,0x0 INTCONbits.TMR0IE = 0; // And clear the interrupt enable C:\Projects\UBW\FW\D_143\user\user.c 000d02 94f1 BCF 0xf1,0x2,0x0 INTCON2bits.TMR0IP = 0; // Low priority C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Enable interrupt priorities C:\Projects\UBW\FW\D_143\user\user.c 000d04 8ed0 BSF 0xd0,0x7,0x0 RCONbits.IPEN = 1; C:\Projects\UBW\FW\D_143\user\user.c 000d06 94ca BCF 0xca,0x2,0x0 T2CONbits.TMR2ON = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 000d08 829d BSF 0x9d,0x1,0x0 PIE1bits.TMR2IE = 1; C:\Projects\UBW\FW\D_143\user\user.c 000d0a 929f BCF 0x9f,0x1,0x0 IPR1bits.TMR2IP = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 000d0c 8ef2 BSF 0xf2,0x7,0x0 INTCONbits.GIEH = 1; // Turn high priority interrupts on C:\Projects\UBW\FW\D_143\user\user.c 000d0e 8cf2 BSF 0xf2,0x6,0x0 INTCONbits.GIEL = 1; // Turn low priority interrupts on C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Turn on the Timer2 C:\Projects\UBW\FW\D_143\user\user.c 000d10 84ca BSF 0xca,0x2,0x0 T2CONbits.TMR2ON = 1; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 000d12 0e02 MOVLW 0x2 }//end UserInit C:\Projects\UBW\FW\D_143\user\user.c 000d14 5ce1 SUBWF 0xe1,0x0,0x0 000d16 e202 BC 0xd1c 000d18 6ae1 CLRF 0xe1,0x0 000d1a 52e5 MOVF 0xe5,0x1,0x0 000d1c 6ee1 MOVWF 0xe1,0x0 000d1e 52e5 MOVF 0xe5,0x1,0x0 000d20 cfe7 MOVFF 0xfe7,0xfd9 000d22 ffd9 000d24 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c /****************************************************************************** C:\Projects\UBW\FW\D_143\user\user.c * Function: void ProcessIO(void) C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * PreCondition: None C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Input: None C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Output: None C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Side Effects: None C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Overview: In this function, we check for a new packet that just C:\Projects\UBW\FW\D_143\user\user.c * arrived via USB. We do a few checks on the packet to see C:\Projects\UBW\FW\D_143\user\user.c * if it is worthy of us trying to interpret it. If it is, C:\Projects\UBW\FW\D_143\user\user.c * we go and call the proper function based upon the first C:\Projects\UBW\FW\D_143\user\user.c * character of the packet. C:\Projects\UBW\FW\D_143\user\user.c * NOTE: We need to see everything in one packet (i.e. we C:\Projects\UBW\FW\D_143\user\user.c * won't treat the USB data as a stream and try to find our C:\Projects\UBW\FW\D_143\user\user.c * start and end of packets within the stream. We just look C:\Projects\UBW\FW\D_143\user\user.c * at the first character of each packet for a command and C:\Projects\UBW\FW\D_143\user\user.c * check that there's a CR as the last character of the C:\Projects\UBW\FW\D_143\user\user.c * packet. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Note: None C:\Projects\UBW\FW\D_143\user\user.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\user\user.c 000d26 cfd9 MOVFF 0xfd9,0xfe6 void ProcessIO(void) C:\Projects\UBW\FW\D_143\user\user.c 000d28 ffe6 000d2a cfe1 MOVFF 0xfe1,0xfd9 000d2c ffd9 000d2e 0e02 MOVLW 0x2 000d30 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c static BOOL in_cr = FALSE; C:\Projects\UBW\FW\D_143\user\user.c static byte last_fifo_size; C:\Projects\UBW\FW\D_143\user\user.c unsigned char tst_char; C:\Projects\UBW\FW\D_143\user\user.c 000d32 0e01 MOVLW 0x1 BOOL got_full_packet = FALSE; C:\Projects\UBW\FW\D_143\user\user.c 000d34 6adb CLRF 0xdb,0x0 000d36 0101 MOVLB 0x1 cdc_rx_len = 0; C:\Projects\UBW\FW\D_143\user\user.c 000d38 6b99 CLRF 0x99,0x1 C:\Projects\UBW\FW\D_143\user\user.c 000d3a ecfa CALL 0x27f4,0x0 BlinkUSBStatus(); C:\Projects\UBW\FW\D_143\user\user.c 000d3c f013 C:\Projects\UBW\FW\D_143\user\user.c // Check for any new I packets (from T command) ready to go out C:\Projects\UBW\FW\D_143\user\user.c 000d3e 5006 MOVF 0x6,0x0,0x0 while (ISR_D_FIFO_length > 0) C:\Projects\UBW\FW\D_143\user\user.c 000d40 0800 SUBLW 0x0 000d42 e209 BC 0xd56 000d54 d7f4 BRA 0xd3e { C:\Projects\UBW\FW\D_143\user\user.c // Spit out an I packet first C:\Projects\UBW\FW\D_143\user\user.c 000d44 ec3b CALL 0x1676,0x0 parse_I_packet (); C:\Projects\UBW\FW\D_143\user\user.c 000d46 f00b C:\Projects\UBW\FW\D_143\user\user.c // Then upate our I packet fifo stuff C:\Projects\UBW\FW\D_143\user\user.c 000d48 2a05 INCF 0x5,0x1,0x0 ISR_D_FIFO_out++; C:\Projects\UBW\FW\D_143\user\user.c 000d4a 0e03 MOVLW 0x3 if (ISR_D_FIFO_out == kISR_FIFO_D_DEPTH) C:\Projects\UBW\FW\D_143\user\user.c 000d4c 5c05 SUBWF 0x5,0x0,0x0 000d4e e101 BNZ 0xd52 { C:\Projects\UBW\FW\D_143\user\user.c 000d50 6a05 CLRF 0x5,0x0 ISR_D_FIFO_out = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000d52 0606 DECF 0x6,0x1,0x0 ISR_D_FIFO_length--; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Check for a new A packet (from T command) ready to go out C:\Projects\UBW\FW\D_143\user\user.c 000d56 500b MOVF 0xb,0x0,0x0 while (ISR_A_FIFO_length > 0) C:\Projects\UBW\FW\D_143\user\user.c 000d58 0800 SUBLW 0x0 000d5a e209 BC 0xd6e 000d6c d7f4 BRA 0xd56 { C:\Projects\UBW\FW\D_143\user\user.c // Spit out an A packet first C:\Projects\UBW\FW\D_143\user\user.c 000d5c ec6d CALL 0x16da,0x0 parse_A_packet (); C:\Projects\UBW\FW\D_143\user\user.c 000d5e f00b C:\Projects\UBW\FW\D_143\user\user.c // Then update our A packet fifo stuff C:\Projects\UBW\FW\D_143\user\user.c 000d60 2a0a INCF 0xa,0x1,0x0 ISR_A_FIFO_out++; C:\Projects\UBW\FW\D_143\user\user.c 000d62 0e03 MOVLW 0x3 if (ISR_A_FIFO_out == kISR_FIFO_A_DEPTH) C:\Projects\UBW\FW\D_143\user\user.c 000d64 5c0a SUBWF 0xa,0x0,0x0 000d66 e101 BNZ 0xd6a { C:\Projects\UBW\FW\D_143\user\user.c 000d68 6a0a CLRF 0xa,0x0 ISR_A_FIFO_out = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000d6a 060b DECF 0xb,0x1,0x0 ISR_A_FIFO_length--; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Pull in some new data if there is new data to pull in C:\Projects\UBW\FW\D_143\user\user.c if( C:\Projects\UBW\FW\D_143\user\user.c !mCDCUsartRxIsBusy() C:\Projects\UBW\FW\D_143\user\user.c 000d6e 0104 MOVLB 0x4 && C:\Projects\UBW\FW\D_143\user\user.c 000d70 0104 MOVLB 0x4 000d72 5118 MOVF 0x18,0x0,0x1 000d74 0b80 ANDLW 0x80 !( C:\Projects\UBW\FW\D_143\user\user.c 000d78 0e06 MOVLW 0x6 (usb_device_state < CONFIGURED_STATE) C:\Projects\UBW\FW\D_143\user\user.c 000d7a 0101 MOVLB 0x1 000d7c 5dd2 SUBWF 0xd2,0x0,0x1 || C:\Projects\UBW\FW\D_143\user\user.c (UCONbits.SUSPND == 1) C:\Projects\UBW\FW\D_143\user\user.c 000d7e e368 BNC 0xe50 ) C:\Projects\UBW\FW\D_143\user\user.c 000d80 506d MOVF 0x6d,0x0,0x0 000d82 0b02 ANDLW 0x2 000d84 e165 BNZ 0xe50 000d76 e16c BNZ 0xe50 ) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Copy data from dual-ram buffer to user's buffer C:\Projects\UBW\FW\D_143\user\user.c 000d86 0101 MOVLB 0x1 for(cdc_rx_len = 0; cdc_rx_len < CDC_BULK_BD_OUT.Cnt; cdc_rx_len++) C:\Projects\UBW\FW\D_143\user\user.c 000d88 6b99 CLRF 0x99,0x1 000d8a 0104 MOVLB 0x4 000d8c 5119 MOVF 0x19,0x0,0x1 000d8e 0101 MOVLB 0x1 000d90 5d99 SUBWF 0x99,0x0,0x1 000d92 e253 BC 0xe3a 000e34 0101 MOVLB 0x1 000e36 2b99 INCF 0x99,0x1,0x1 000e38 d7a8 BRA 0xd8a { C:\Projects\UBW\FW\D_143\user\user.c // Check to see if we are in a CR/LF situation C:\Projects\UBW\FW\D_143\user\user.c 000d94 0101 MOVLB 0x1 tst_char = cdc_data_rx[cdc_rx_len]; C:\Projects\UBW\FW\D_143\user\user.c 000d96 5199 MOVF 0x99,0x0,0x1 000d98 6aea CLRF 0xea,0x0 000d9a 0f08 ADDLW 0x8 000d9c 6ee9 MOVWF 0xe9,0x0 000d9e 0e05 MOVLW 0x5 000da0 22ea ADDWFC 0xea,0x1,0x0 000da2 cfef MOVFF 0xfef,0xfdf 000da4 ffdf if ( C:\Projects\UBW\FW\D_143\user\user.c 000da6 0101 MOVLB 0x1 !in_cr C:\Projects\UBW\FW\D_143\user\user.c 000da8 51d6 MOVF 0xd6,0x0,0x1 && C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c 000dac 0e0d MOVLW 0xd kCR == tst_char C:\Projects\UBW\FW\D_143\user\user.c 000dae 6e2a MOVWF 0x2a,0x0 000db0 50df MOVF 0xdf,0x0,0x0 000db2 5c2a SUBWF 0x2a,0x0,0x0 || C:\Projects\UBW\FW\D_143\user\user.c 000db6 0e0a MOVLW 0xa kLF == tst_char C:\Projects\UBW\FW\D_143\user\user.c 000db8 6e2b MOVWF 0x2b,0x0 000dba 50df MOVF 0xdf,0x0,0x0 000db4 e005 BZ 0xdc0 ) C:\Projects\UBW\FW\D_143\user\user.c 000dbc 5c2b SUBWF 0x2b,0x0,0x0 000dbe e112 BNZ 0xde4 000daa e11c BNZ 0xde4 ) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 000dc0 0101 MOVLB 0x1 in_cr = TRUE; C:\Projects\UBW\FW\D_143\user\user.c 000dc2 0e01 MOVLW 0x1 000dc4 6fd6 MOVWF 0xd6,0x1 000dc6 0101 MOVLB 0x1 g_RX_buf[g_RX_buf_in] = kCR; C:\Projects\UBW\FW\D_143\user\user.c 000dc8 51b8 MOVF 0xb8,0x0,0x1 000dca 6aea CLRF 0xea,0x0 000dcc 0f40 ADDLW 0x40 000dce 6ee9 MOVWF 0xe9,0x0 000dd0 0e02 MOVLW 0x2 000dd2 22ea ADDWFC 0xea,0x1,0x0 000dd4 0e0d MOVLW 0xd 000dd6 6eef MOVWF 0xef,0x0 000dd8 0101 MOVLB 0x1 g_RX_buf_in++; C:\Projects\UBW\FW\D_143\user\user.c 000dda 2bb8 INCF 0xb8,0x1,0x1 C:\Projects\UBW\FW\D_143\user\user.c // At this point, we know we have a full packet C:\Projects\UBW\FW\D_143\user\user.c // of information from the PC to parse C:\Projects\UBW\FW\D_143\user\user.c 000ddc 52de MOVF 0xde,0x1,0x0 got_full_packet = TRUE; C:\Projects\UBW\FW\D_143\user\user.c 000dde 0e01 MOVLW 0x1 000de0 6edd MOVWF 0xdd,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000de2 d015 BRA 0xe0e else if ( C:\Projects\UBW\FW\D_143\user\user.c 000de4 0e0d MOVLW 0xd tst_char != kCR C:\Projects\UBW\FW\D_143\user\user.c 000de6 5cdf SUBWF 0xdf,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c 000dea 0e0a MOVLW 0xa tst_char != kLF C:\Projects\UBW\FW\D_143\user\user.c 000de8 e011 BZ 0xe0c ) C:\Projects\UBW\FW\D_143\user\user.c 000dec 5cdf SUBWF 0xdf,0x0,0x0 000dee e00e BZ 0xe0c { C:\Projects\UBW\FW\D_143\user\user.c // Only add a byte if it is not a CR or LF C:\Projects\UBW\FW\D_143\user\user.c 000df0 0101 MOVLB 0x1 g_RX_buf[g_RX_buf_in] = tst_char; C:\Projects\UBW\FW\D_143\user\user.c 000df2 51b8 MOVF 0xb8,0x0,0x1 000df4 6aea CLRF 0xea,0x0 000df6 0f40 ADDLW 0x40 000df8 6ee9 MOVWF 0xe9,0x0 000dfa 0e02 MOVLW 0x2 000dfc 22ea ADDWFC 0xea,0x1,0x0 000dfe cfdf MOVFF 0xfdf,0xfef 000e00 ffef 000e02 0101 MOVLB 0x1 in_cr = FALSE; C:\Projects\UBW\FW\D_143\user\user.c 000e04 6bd6 CLRF 0xd6,0x1 000e06 0101 MOVLB 0x1 g_RX_buf_in++; C:\Projects\UBW\FW\D_143\user\user.c 000e08 2bb8 INCF 0xb8,0x1,0x1 } C:\Projects\UBW\FW\D_143\user\user.c 000e0a d001 BRA 0xe0e else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 000e0c d013 BRA 0xe34 continue; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c // Check for buffer wraparound C:\Projects\UBW\FW\D_143\user\user.c 000e0e 0e40 MOVLW 0x40 if (kRX_BUF_SIZE == g_RX_buf_in) C:\Projects\UBW\FW\D_143\user\user.c 000e10 0101 MOVLB 0x1 000e12 5db8 SUBWF 0xb8,0x0,0x1 000e14 e102 BNZ 0xe1a { C:\Projects\UBW\FW\D_143\user\user.c 000e16 0101 MOVLB 0x1 g_RX_buf_in = 0; C:\Projects\UBW\FW\D_143\user\user.c 000e18 6bb8 CLRF 0xb8,0x1 } C:\Projects\UBW\FW\D_143\user\user.c // If we hit the out pointer, then this is bad. C:\Projects\UBW\FW\D_143\user\user.c 000e1a 0101 MOVLB 0x1 if (g_RX_buf_in == g_RX_buf_out) C:\Projects\UBW\FW\D_143\user\user.c 000e1c 51b9 MOVF 0xb9,0x0,0x1 000e1e 0101 MOVLB 0x1 000e20 5db8 SUBWF 0xb8,0x0,0x1 000e22 e102 BNZ 0xe28 { C:\Projects\UBW\FW\D_143\user\user.c 000e24 860d BSF 0xd,0x3,0x0 bitset (error_byte, kERROR_BYTE_RX_BUFFER_OVERRUN); C:\Projects\UBW\FW\D_143\user\user.c 000e26 d009 BRA 0xe3a break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c // Now, if we've gotten a full command (user send ) then C:\Projects\UBW\FW\D_143\user\user.c // go call the code that deals with that command, and then C:\Projects\UBW\FW\D_143\user\user.c // keep parsing. (This allows multiple small commands per packet) C:\Projects\UBW\FW\D_143\user\user.c 000e28 0e01 MOVLW 0x1 if (got_full_packet) C:\Projects\UBW\FW\D_143\user\user.c 000e2a 50db MOVF 0xdb,0x0,0x0 000e2c e003 BZ 0xe34 { C:\Projects\UBW\FW\D_143\user\user.c 000e2e d91c RCALL 0x1068 parse_packet (); C:\Projects\UBW\FW\D_143\user\user.c 000e30 0e01 MOVLW 0x1 got_full_packet = FALSE; C:\Projects\UBW\FW\D_143\user\user.c 000e32 6adb CLRF 0xdb,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Prepare dual-ram buffer for next OUT transaction C:\Projects\UBW\FW\D_143\user\user.c 000e3a 0104 MOVLB 0x4 CDC_BULK_BD_OUT.Cnt = sizeof(cdc_data_rx); C:\Projects\UBW\FW\D_143\user\user.c 000e3c 0e40 MOVLW 0x40 000e3e 6f19 MOVWF 0x19,0x1 000e40 0e40 MOVLW 0x40 mUSBBufferReady(CDC_BULK_BD_OUT); C:\Projects\UBW\FW\D_143\user\user.c 000e42 0104 MOVLB 0x4 000e44 1718 ANDWF 0x18,0x1,0x1 000e46 0104 MOVLB 0x4 000e48 7d18 BTG 0x18,0x6,0x1 000e4a 0e88 MOVLW 0x88 000e4c 0104 MOVLB 0x4 000e4e 1318 IORWF 0x18,0x1,0x1 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Check for any errors logged in error_byte that need to be sent out C:\Projects\UBW\FW\D_143\user\user.c 000e50 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 000e52 e101 BNZ 0xe56 000e54 d081 BRA 0xf58 { C:\Projects\UBW\FW\D_143\user\user.c 000e56 a00d BTFSS 0xd,0x0,0x0 if (bittst (error_byte, 0)) C:\Projects\UBW\FW\D_143\user\user.c 000e58 d010 BRA 0xe7a { C:\Projects\UBW\FW\D_143\user\user.c // Unused as of yet C:\Projects\UBW\FW\D_143\user\user.c 000e5a 0e3b MOVLW 0x3b printf ((far rom char *)"!0 \r\n"); C:\Projects\UBW\FW\D_143\user\user.c 000e5c 6e2a MOVWF 0x2a,0x0 000e5e 0e42 MOVLW 0x42 000e60 6e2b MOVWF 0x2b,0x0 000e62 6a2c CLRF 0x2c,0x0 000e64 c02a MOVFF 0x2a,0xfe6 000e66 ffe6 000e68 c02b MOVFF 0x2b,0xfe6 000e6a ffe6 000e6c c02c MOVFF 0x2c,0xfe6 000e6e ffe6 000e70 ec4d CALL 0x449a,0x0 000e72 f022 000e74 52e5 MOVF 0xe5,0x1,0x0 000e76 52e5 MOVF 0xe5,0x1,0x0 000e78 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000e7a a20d BTFSS 0xd,0x1,0x0 if (bittst (error_byte, 1)) C:\Projects\UBW\FW\D_143\user\user.c 000e7c d010 BRA 0xe9e { C:\Projects\UBW\FW\D_143\user\user.c // Unused as of yet C:\Projects\UBW\FW\D_143\user\user.c 000e7e 0e35 MOVLW 0x35 printf ((far rom char *)"!1 \r\n"); C:\Projects\UBW\FW\D_143\user\user.c 000e80 6e2a MOVWF 0x2a,0x0 000e82 0e42 MOVLW 0x42 000e84 6e2b MOVWF 0x2b,0x0 000e86 6a2c CLRF 0x2c,0x0 000e88 c02a MOVFF 0x2a,0xfe6 000e8a ffe6 000e8c c02b MOVFF 0x2b,0xfe6 000e8e ffe6 000e90 c02c MOVFF 0x2c,0xfe6 000e92 ffe6 000e94 ec4d CALL 0x449a,0x0 000e96 f022 000e98 52e5 MOVF 0xe5,0x1,0x0 000e9a 52e5 MOVF 0xe5,0x1,0x0 000e9c 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000e9e a40d BTFSS 0xd,0x2,0x0 if (bittst (error_byte, kERROR_BYTE_TX_BUF_OVERRUN)) C:\Projects\UBW\FW\D_143\user\user.c 000ea0 d010 BRA 0xec2 { C:\Projects\UBW\FW\D_143\user\user.c 000ea2 0e19 MOVLW 0x19 printf ((far rom char *)"!2 Err: TX Buffer overrun\r\n"); C:\Projects\UBW\FW\D_143\user\user.c 000ea4 6e2a MOVWF 0x2a,0x0 000ea6 0e42 MOVLW 0x42 000ea8 6e2b MOVWF 0x2b,0x0 000eaa 6a2c CLRF 0x2c,0x0 000eac c02a MOVFF 0x2a,0xfe6 000eae ffe6 000eb0 c02b MOVFF 0x2b,0xfe6 000eb2 ffe6 000eb4 c02c MOVFF 0x2c,0xfe6 000eb6 ffe6 000eb8 ec4d CALL 0x449a,0x0 000eba f022 000ebc 52e5 MOVF 0xe5,0x1,0x0 000ebe 52e5 MOVF 0xe5,0x1,0x0 000ec0 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000ec2 a60d BTFSS 0xd,0x3,0x0 if (bittst (error_byte, kERROR_BYTE_RX_BUFFER_OVERRUN)) C:\Projects\UBW\FW\D_143\user\user.c 000ec4 d010 BRA 0xee6 { C:\Projects\UBW\FW\D_143\user\user.c 000ec6 0efd MOVLW 0xfd printf ((far rom char *)"!3 Err: RX Buffer overrun\r\n"); C:\Projects\UBW\FW\D_143\user\user.c 000ec8 6e2a MOVWF 0x2a,0x0 000eca 0e41 MOVLW 0x41 000ecc 6e2b MOVWF 0x2b,0x0 000ece 6a2c CLRF 0x2c,0x0 000ed0 c02a MOVFF 0x2a,0xfe6 000ed2 ffe6 000ed4 c02b MOVFF 0x2b,0xfe6 000ed6 ffe6 000ed8 c02c MOVFF 0x2c,0xfe6 000eda ffe6 000edc ec4d CALL 0x449a,0x0 000ede f022 000ee0 52e5 MOVF 0xe5,0x1,0x0 000ee2 52e5 MOVF 0xe5,0x1,0x0 000ee4 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000ee6 a80d BTFSS 0xd,0x4,0x0 if (bittst (error_byte, kERROR_BYTE_MISSING_PARAMETER)) C:\Projects\UBW\FW\D_143\user\user.c 000ee8 d010 BRA 0xf0a { C:\Projects\UBW\FW\D_143\user\user.c 000eea 0ede MOVLW 0xde printf ((far rom char *)"!4 Err: Missing parameter(s)\r\n"); C:\Projects\UBW\FW\D_143\user\user.c 000eec 6e2a MOVWF 0x2a,0x0 000eee 0e41 MOVLW 0x41 000ef0 6e2b MOVWF 0x2b,0x0 000ef2 6a2c CLRF 0x2c,0x0 000ef4 c02a MOVFF 0x2a,0xfe6 000ef6 ffe6 000ef8 c02b MOVFF 0x2b,0xfe6 000efa ffe6 000efc c02c MOVFF 0x2c,0xfe6 000efe ffe6 000f00 ec4d CALL 0x449a,0x0 000f02 f022 000f04 52e5 MOVF 0xe5,0x1,0x0 000f06 52e5 MOVF 0xe5,0x1,0x0 000f08 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000f0a aa0d BTFSS 0xd,0x5,0x0 if (bittst (error_byte, kERROR_BYTE_PRINTED_ERROR)) C:\Projects\UBW\FW\D_143\user\user.c 000f0c d000 BRA 0xf0e { C:\Projects\UBW\FW\D_143\user\user.c // We don't need to do anything since something has already been printed out C:\Projects\UBW\FW\D_143\user\user.c //printf ((rom char *)"!5\r\n"); C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000f0e ac0d BTFSS 0xd,0x6,0x0 if (bittst (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT)) C:\Projects\UBW\FW\D_143\user\user.c 000f10 d010 BRA 0xf32 { C:\Projects\UBW\FW\D_143\user\user.c 000f12 0ebd MOVLW 0xbd printf ((far rom char *)"!6 Err: Invalid paramter value\r\n"); C:\Projects\UBW\FW\D_143\user\user.c 000f14 6e2a MOVWF 0x2a,0x0 000f16 0e41 MOVLW 0x41 000f18 6e2b MOVWF 0x2b,0x0 000f1a 6a2c CLRF 0x2c,0x0 000f1c c02a MOVFF 0x2a,0xfe6 000f1e ffe6 000f20 c02b MOVFF 0x2b,0xfe6 000f22 ffe6 000f24 c02c MOVFF 0x2c,0xfe6 000f26 ffe6 000f28 ec4d CALL 0x449a,0x0 000f2a f022 000f2c 52e5 MOVF 0xe5,0x1,0x0 000f2e 52e5 MOVF 0xe5,0x1,0x0 000f30 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000f32 ae0d BTFSS 0xd,0x7,0x0 if (bittst (error_byte, kERROR_BYTE_EXTRA_CHARACTERS)) C:\Projects\UBW\FW\D_143\user\user.c 000f34 d010 BRA 0xf56 { C:\Projects\UBW\FW\D_143\user\user.c 000f36 0ea4 MOVLW 0xa4 printf ((far rom char *)"!7 Err: Extra parmater\r\n"); C:\Projects\UBW\FW\D_143\user\user.c 000f38 6e2a MOVWF 0x2a,0x0 000f3a 0e41 MOVLW 0x41 000f3c 6e2b MOVWF 0x2b,0x0 000f3e 6a2c CLRF 0x2c,0x0 000f40 c02a MOVFF 0x2a,0xfe6 000f42 ffe6 000f44 c02b MOVFF 0x2b,0xfe6 000f46 ffe6 000f48 c02c MOVFF 0x2c,0xfe6 000f4a ffe6 000f4c ec4d CALL 0x449a,0x0 000f4e f022 000f50 52e5 MOVF 0xe5,0x1,0x0 000f52 52e5 MOVF 0xe5,0x1,0x0 000f54 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000f56 6a0d CLRF 0xd,0x0 error_byte = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Go send any data that needs sending to PC C:\Projects\UBW\FW\D_143\user\user.c 000f58 d835 RCALL 0xfc4 check_and_send_TX_data (); C:\Projects\UBW\FW\D_143\user\user.c 000f5a 0e02 MOVLW 0x2 } C:\Projects\UBW\FW\D_143\user\user.c 000f5c 5ce1 SUBWF 0xe1,0x0,0x0 000f5e e202 BC 0xf64 000f60 6ae1 CLRF 0xe1,0x0 000f62 52e5 MOVF 0xe5,0x1,0x0 000f64 6ee1 MOVWF 0xe1,0x0 000f66 52e5 MOVF 0xe5,0x1,0x0 000f68 cfe7 MOVFF 0xfe7,0xfd9 000f6a ffd9 000f6c 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // This is our replacement for the standard putc routine C:\Projects\UBW\FW\D_143\user\user.c // This enables printf() and all related functions to print to C:\Projects\UBW\FW\D_143\user\user.c // the UBS output (i.e. to the PC) buffer C:\Projects\UBW\FW\D_143\user\user.c 000f6e cfd9 MOVFF 0xfd9,0xfe6 int _user_putc (char c) C:\Projects\UBW\FW\D_143\user\user.c 000f70 ffe6 000f72 cfe1 MOVFF 0xfe1,0xfd9 000f74 ffd9 { C:\Projects\UBW\FW\D_143\user\user.c // Copy the character into the output buffer C:\Projects\UBW\FW\D_143\user\user.c 000f76 0101 MOVLB 0x1 g_TX_buf[g_TX_buf_in] = c; C:\Projects\UBW\FW\D_143\user\user.c 000f78 51b6 MOVF 0xb6,0x0,0x1 000f7a 6aea CLRF 0xea,0x0 000f7c 0f00 ADDLW 0x0 000f7e 6ee9 MOVWF 0xe9,0x0 000f80 0e02 MOVLW 0x2 000f82 22ea ADDWFC 0xea,0x1,0x0 000f84 0efe MOVLW 0xfe 000f86 cfdb MOVFF 0xfdb,0xfef 000f88 ffef 000f8a 0101 MOVLB 0x1 g_TX_buf_in++; C:\Projects\UBW\FW\D_143\user\user.c 000f8c 2bb6 INCF 0xb6,0x1,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Check for wrap around C:\Projects\UBW\FW\D_143\user\user.c 000f8e 0e40 MOVLW 0x40 if (kTX_BUF_SIZE == g_TX_buf_in) C:\Projects\UBW\FW\D_143\user\user.c 000f90 0101 MOVLB 0x1 000f92 5db6 SUBWF 0xb6,0x0,0x1 000f94 e102 BNZ 0xf9a { C:\Projects\UBW\FW\D_143\user\user.c 000f96 0101 MOVLB 0x1 g_TX_buf_in = 0; C:\Projects\UBW\FW\D_143\user\user.c 000f98 6bb6 CLRF 0xb6,0x1 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Also check to see if we bumpted up against our output pointer C:\Projects\UBW\FW\D_143\user\user.c 000f9a 0101 MOVLB 0x1 if (g_TX_buf_in == g_TX_buf_out) C:\Projects\UBW\FW\D_143\user\user.c 000f9c 51b7 MOVF 0xb7,0x0,0x1 000f9e 0101 MOVLB 0x1 000fa0 5db6 SUBWF 0xb6,0x0,0x1 000fa2 e101 BNZ 0xfa6 { C:\Projects\UBW\FW\D_143\user\user.c 000fa4 840d BSF 0xd,0x2,0x0 bitset (error_byte, kERROR_BYTE_TX_BUF_OVERRUN); C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 000fa6 0efe MOVLW 0xfe return (c); C:\Projects\UBW\FW\D_143\user\user.c 000fa8 cfdb MOVFF 0xfdb,0x2a 000faa f02a 000fac 6a2b CLRF 0x2b,0x0 000fae be2a BTFSC 0x2a,0x7,0x0 000fb0 682b SETF 0x2b,0x0 000fb2 c02a MOVFF 0x2a,0xff3 000fb4 fff3 000fb6 c02b MOVFF 0x2b,0xff4 000fb8 fff4 000fba d000 BRA 0xfbc 000fbc 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000fbe cfe7 MOVFF 0xfe7,0xfd9 000fc0 ffd9 000fc2 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // In this function, we check to see it is OK to transmit. If so C:\Projects\UBW\FW\D_143\user\user.c // we see if there is any data to transmit to PC. If so, we schedule C:\Projects\UBW\FW\D_143\user\user.c // it for sending. C:\Projects\UBW\FW\D_143\user\user.c 000fc4 cfd9 MOVFF 0xfd9,0xfe6 void check_and_send_TX_data (void) C:\Projects\UBW\FW\D_143\user\user.c 000fc6 ffe6 000fc8 cfe1 MOVFF 0xfe1,0xfd9 000fca ffd9 000fcc 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c char temp; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Only send if we're not already sending something C:\Projects\UBW\FW\D_143\user\user.c if ( C:\Projects\UBW\FW\D_143\user\user.c 000fce 0101 MOVLB 0x1 mUSBUSARTIsTxTrfReady () C:\Projects\UBW\FW\D_143\user\user.c 000fd0 519a MOVF 0x9a,0x0,0x1 && C:\Projects\UBW\FW\D_143\user\user.c !( C:\Projects\UBW\FW\D_143\user\user.c 000fd4 0e06 MOVLW 0x6 (usb_device_state < CONFIGURED_STATE) C:\Projects\UBW\FW\D_143\user\user.c 000fd6 0101 MOVLB 0x1 000fd8 5dd2 SUBWF 0xd2,0x0,0x1 || C:\Projects\UBW\FW\D_143\user\user.c (UCONbits.SUSPND == 1) C:\Projects\UBW\FW\D_143\user\user.c 000fda e341 BNC 0x105e ) C:\Projects\UBW\FW\D_143\user\user.c 000fdc 506d MOVF 0x6d,0x0,0x0 000fde 0b02 ANDLW 0x2 000fe0 e13e BNZ 0x105e 000fd2 e145 BNZ 0x105e ) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // And only send if there's something there to send C:\Projects\UBW\FW\D_143\user\user.c 000fe2 0101 MOVLB 0x1 if (g_TX_buf_out != g_TX_buf_in) C:\Projects\UBW\FW\D_143\user\user.c 000fe4 51b6 MOVF 0xb6,0x0,0x1 000fe6 0101 MOVLB 0x1 000fe8 5db7 SUBWF 0xb7,0x0,0x1 000fea e039 BZ 0x105e { C:\Projects\UBW\FW\D_143\user\user.c // Now decide if we need to break it up into two parts or not C:\Projects\UBW\FW\D_143\user\user.c 000fec 0101 MOVLB 0x1 if (g_TX_buf_in > g_TX_buf_out) C:\Projects\UBW\FW\D_143\user\user.c 000fee 51b7 MOVF 0xb7,0x0,0x1 000ff0 0101 MOVLB 0x1 000ff2 80d8 BSF 0xd8,0x0,0x0 000ff4 55b6 SUBFWB 0xb6,0x0,0x1 000ff6 e21a BC 0x102c { C:\Projects\UBW\FW\D_143\user\user.c // Since IN is beyond OUT, only need one chunk C:\Projects\UBW\FW\D_143\user\user.c 000ff8 0101 MOVLB 0x1 temp = g_TX_buf_in - g_TX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c 000ffa 51b7 MOVF 0xb7,0x0,0x1 000ffc 0101 MOVLB 0x1 000ffe 5db6 SUBWF 0xb6,0x0,0x1 001000 6edf MOVWF 0xdf,0x0 001002 0101 MOVLB 0x1 mUSBUSARTTxRam (&g_TX_buf[g_TX_buf_out], temp); C:\Projects\UBW\FW\D_143\user\user.c 001004 51b7 MOVF 0xb7,0x0,0x1 001006 0101 MOVLB 0x1 001008 6f9b MOVWF 0x9b,0x1 00100a 6b9c CLRF 0x9c,0x1 00100c 0e00 MOVLW 0x0 00100e 0101 MOVLB 0x1 001010 279b ADDWF 0x9b,0x1,0x1 001012 0e02 MOVLW 0x2 001014 0101 MOVLB 0x1 001016 239c ADDWFC 0x9c,0x1,0x1 001018 cfdf MOVFF 0xfdf,0x19f 00101a f19f 00101c 0101 MOVLB 0x1 00101e 6ba0 CLRF 0xa0,0x1 001020 0101 MOVLB 0x1 001022 0e01 MOVLW 0x1 001024 6f9a MOVWF 0x9a,0x1 // Now that we've scheduled the data for sending, C:\Projects\UBW\FW\D_143\user\user.c // update the pointer C:\Projects\UBW\FW\D_143\user\user.c 001026 c1b6 MOVFF 0x1b6,0x1b7 g_TX_buf_out = g_TX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c 001028 f1b7 } C:\Projects\UBW\FW\D_143\user\user.c 00102a d019 BRA 0x105e else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Since IN is before OUT, we need to send from OUT to the end C:\Projects\UBW\FW\D_143\user\user.c // of the buffer, then the next time around we'll catch C:\Projects\UBW\FW\D_143\user\user.c // from the beginning to IN. C:\Projects\UBW\FW\D_143\user\user.c 00102c 0e40 MOVLW 0x40 temp = kTX_BUF_SIZE - g_TX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c 00102e 0101 MOVLB 0x1 001030 80d8 BSF 0xd8,0x0,0x0 001032 55b7 SUBFWB 0xb7,0x0,0x1 001034 6edf MOVWF 0xdf,0x0 001036 0101 MOVLB 0x1 mUSBUSARTTxRam (&g_TX_buf[g_TX_buf_out], temp); C:\Projects\UBW\FW\D_143\user\user.c 001038 51b7 MOVF 0xb7,0x0,0x1 00103a 0101 MOVLB 0x1 00103c 6f9b MOVWF 0x9b,0x1 00103e 6b9c CLRF 0x9c,0x1 001040 0e00 MOVLW 0x0 001042 0101 MOVLB 0x1 001044 279b ADDWF 0x9b,0x1,0x1 001046 0e02 MOVLW 0x2 001048 0101 MOVLB 0x1 00104a 239c ADDWFC 0x9c,0x1,0x1 00104c cfdf MOVFF 0xfdf,0x19f 00104e f19f 001050 0101 MOVLB 0x1 001052 6ba0 CLRF 0xa0,0x1 001054 0101 MOVLB 0x1 001056 0e01 MOVLW 0x1 001058 6f9a MOVWF 0x9a,0x1 // Now that we've scheduled the data for sending, C:\Projects\UBW\FW\D_143\user\user.c // update the pointer C:\Projects\UBW\FW\D_143\user\user.c 00105a 0101 MOVLB 0x1 g_TX_buf_out = 0; C:\Projects\UBW\FW\D_143\user\user.c 00105c 6bb7 CLRF 0xb7,0x1 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 00105e 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001060 52e5 MOVF 0xe5,0x1,0x0 001062 cfe7 MOVFF 0xfe7,0xfd9 001064 ffd9 001066 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Look at the new packet, see what command it is, and C:\Projects\UBW\FW\D_143\user\user.c // route it appropriately. We come in knowing that C:\Projects\UBW\FW\D_143\user\user.c // our packet is in g_RX_buf[], and that the beginning C:\Projects\UBW\FW\D_143\user\user.c // of the packet is at g_RX_buf_out, and the end (CR) is at C:\Projects\UBW\FW\D_143\user\user.c // g_RX_buf_in. Note that because of buffer wrapping, C:\Projects\UBW\FW\D_143\user\user.c // g_RX_buf_in may be less than g_RX_buf_out. C:\Projects\UBW\FW\D_143\user\user.c 001068 cfd9 MOVFF 0xfd9,0xfe6 void parse_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 00106a ffe6 00106c cfe1 MOVFF 0xfe1,0xfd9 00106e ffd9 001070 0e04 MOVLW 0x4 001072 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c 001074 6ade CLRF 0xde,0x0 unsigned int command = 0; C:\Projects\UBW\FW\D_143\user\user.c 001076 6add CLRF 0xdd,0x0 001078 0e02 MOVLW 0x2 unsigned char cmd1 = 0; C:\Projects\UBW\FW\D_143\user\user.c 00107a 6adb CLRF 0xdb,0x0 00107c 0e03 MOVLW 0x3 unsigned char cmd2 = 0; C:\Projects\UBW\FW\D_143\user\user.c 00107e 6adb CLRF 0xdb,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Always grab the first character (which is the first byte of the command) C:\Projects\UBW\FW\D_143\user\user.c 001080 0101 MOVLB 0x1 cmd1 = toupper (g_RX_buf[g_RX_buf_out]); C:\Projects\UBW\FW\D_143\user\user.c 001082 51b9 MOVF 0xb9,0x0,0x1 001084 6aea CLRF 0xea,0x0 001086 0f40 ADDLW 0x40 001088 6ee9 MOVWF 0xe9,0x0 00108a 0e02 MOVLW 0x2 00108c 22ea ADDWFC 0xea,0x1,0x0 00108e 50ef MOVF 0xef,0x0,0x0 001090 6ee6 MOVWF 0xe6,0x0 001092 6ae6 CLRF 0xe6,0x0 001094 ec46 CALL 0x468c,0x0 001096 f023 001098 52e5 MOVF 0xe5,0x1,0x0 00109a 52e5 MOVF 0xe5,0x1,0x0 00109c 0e02 MOVLW 0x2 00109e cff3 MOVFF 0xff3,0xfdb 0010a0 ffdb 0010a2 0101 MOVLB 0x1 advance_RX_buf_out(); C:\Projects\UBW\FW\D_143\user\user.c 0010a4 2bb9 INCF 0xb9,0x1,0x1 0010a6 0e40 MOVLW 0x40 0010a8 0101 MOVLB 0x1 0010aa 5db9 SUBWF 0xb9,0x0,0x1 0010ac e102 BNZ 0x10b2 0010ae 0101 MOVLB 0x1 0010b0 6bb9 CLRF 0xb9,0x1 0010b2 0e02 MOVLW 0x2 command = cmd1; C:\Projects\UBW\FW\D_143\user\user.c 0010b4 50db MOVF 0xdb,0x0,0x0 0010b6 6ede MOVWF 0xde,0x0 0010b8 6add CLRF 0xdd,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Only grab second one if it is not a comma C:\Projects\UBW\FW\D_143\user\user.c 0010ba 0101 MOVLB 0x1 if (g_RX_buf[g_RX_buf_out] != ',' && g_RX_buf[g_RX_buf_out] != kCR) C:\Projects\UBW\FW\D_143\user\user.c 0010bc 51b9 MOVF 0xb9,0x0,0x1 0010be 6aea CLRF 0xea,0x0 0010c0 0f40 ADDLW 0x40 0010c2 6ee9 MOVWF 0xe9,0x0 0010c4 0e02 MOVLW 0x2 0010c6 22ea ADDWFC 0xea,0x1,0x0 0010c8 50ef MOVF 0xef,0x0,0x0 0010ca 082c SUBLW 0x2c 0010cc e035 BZ 0x1138 0010ce 0101 MOVLB 0x1 0010d0 51b9 MOVF 0xb9,0x0,0x1 0010d2 6aea CLRF 0xea,0x0 0010d4 0f40 ADDLW 0x40 0010d6 6ee9 MOVWF 0xe9,0x0 0010d8 0e02 MOVLW 0x2 0010da 22ea ADDWFC 0xea,0x1,0x0 0010dc 50ef MOVF 0xef,0x0,0x0 0010de 080d SUBLW 0xd 0010e0 e02b BZ 0x1138 { C:\Projects\UBW\FW\D_143\user\user.c 0010e2 0101 MOVLB 0x1 cmd2 = toupper (g_RX_buf[g_RX_buf_out]); C:\Projects\UBW\FW\D_143\user\user.c 0010e4 51b9 MOVF 0xb9,0x0,0x1 0010e6 6aea CLRF 0xea,0x0 0010e8 0f40 ADDLW 0x40 0010ea 6ee9 MOVWF 0xe9,0x0 0010ec 0e02 MOVLW 0x2 0010ee 22ea ADDWFC 0xea,0x1,0x0 0010f0 50ef MOVF 0xef,0x0,0x0 0010f2 6ee6 MOVWF 0xe6,0x0 0010f4 6ae6 CLRF 0xe6,0x0 0010f6 ec46 CALL 0x468c,0x0 0010f8 f023 0010fa 52e5 MOVF 0xe5,0x1,0x0 0010fc 52e5 MOVF 0xe5,0x1,0x0 0010fe 0e03 MOVLW 0x3 001100 cff3 MOVFF 0xff3,0xfdb 001102 ffdb 001104 0101 MOVLB 0x1 advance_RX_buf_out(); C:\Projects\UBW\FW\D_143\user\user.c 001106 2bb9 INCF 0xb9,0x1,0x1 001108 0e40 MOVLW 0x40 00110a 0101 MOVLB 0x1 00110c 5db9 SUBWF 0xb9,0x0,0x1 00110e e102 BNZ 0x1114 001110 0101 MOVLB 0x1 001112 6bb9 CLRF 0xb9,0x1 001114 0e02 MOVLW 0x2 command = ((unsigned int)(cmd1) << 8) + cmd2; C:\Projects\UBW\FW\D_143\user\user.c 001116 cfdb MOVFF 0xfdb,0x2c 001118 f02c 00111a c02c MOVFF 0x2c,0x2d 00111c f02d 00111e 6a2c CLRF 0x2c,0x0 001120 0e03 MOVLW 0x3 001122 50db MOVF 0xdb,0x0,0x0 001124 0100 MOVLB 0x0 001126 242c ADDWF 0x2c,0x0,0x0 001128 6e2a MOVWF 0x2a,0x0 00112a 0e00 MOVLW 0x0 00112c 202d ADDWFC 0x2d,0x0,0x0 00112e 6e2b MOVWF 0x2b,0x0 001130 c02a MOVFF 0x2a,0xfde 001132 ffde 001134 c02b MOVFF 0x2b,0xfdd 001136 ffdd } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Now 'command' is equal to one or two bytes of our command C:\Projects\UBW\FW\D_143\user\user.c 001138 0e00 MOVLW 0x0 switch (command) C:\Projects\UBW\FW\D_143\user\user.c 00113a cfdb MOVFF 0xfdb,0x1e 00113c f01e 00113e 0e01 MOVLW 0x1 001140 cfdb MOVFF 0xfdb,0x1f 001142 f01f 001144 0e49 MOVLW 0x49 001146 181e XORWF 0x1e,0x0,0x0 001148 e102 BNZ 0x114e 00114a 0e43 MOVLW 0x43 00114c 181f XORWF 0x1f,0x0,0x0 00114e e101 BNZ 0x1152 001150 d0d8 BRA 0x1302 001152 0e49 MOVLW 0x49 001154 181e XORWF 0x1e,0x0,0x0 001156 e102 BNZ 0x115c 001158 0e52 MOVLW 0x52 00115a 181f XORWF 0x1f,0x0,0x0 00115c e101 BNZ 0x1160 00115e d0ce BRA 0x12fc 001160 0e49 MOVLW 0x49 001162 181e XORWF 0x1e,0x0,0x0 001164 e102 BNZ 0x116a 001166 0e53 MOVLW 0x53 001168 181f XORWF 0x1f,0x0,0x0 00116a e101 BNZ 0x116e 00116c d0c4 BRA 0x12f6 00116e 0e53 MOVLW 0x53 001170 181e XORWF 0x1e,0x0,0x0 001172 e102 BNZ 0x1178 001174 0e43 MOVLW 0x43 001176 181f XORWF 0x1f,0x0,0x0 001178 e101 BNZ 0x117c 00117a d0ba BRA 0x12f0 00117c 0e53 MOVLW 0x53 00117e 181e XORWF 0x1e,0x0,0x0 001180 e102 BNZ 0x1186 001182 0e52 MOVLW 0x52 001184 181f XORWF 0x1f,0x0,0x0 001186 e101 BNZ 0x118a 001188 d0b0 BRA 0x12ea 00118a 0e53 MOVLW 0x53 00118c 181e XORWF 0x1e,0x0,0x0 00118e e102 BNZ 0x1194 001190 0e53 MOVLW 0x53 001192 181f XORWF 0x1f,0x0,0x0 001194 e101 BNZ 0x1198 001196 d0a6 BRA 0x12e4 001198 0e53 MOVLW 0x53 00119a 181e XORWF 0x1e,0x0,0x0 00119c e102 BNZ 0x11a2 00119e 0e42 MOVLW 0x42 0011a0 181f XORWF 0x1f,0x0,0x0 0011a2 e101 BNZ 0x11a6 0011a4 d09c BRA 0x12de 0011a6 0e43 MOVLW 0x43 0011a8 181e XORWF 0x1e,0x0,0x0 0011aa e102 BNZ 0x11b0 0011ac 0e42 MOVLW 0x42 0011ae 181f XORWF 0x1f,0x0,0x0 0011b0 e101 BNZ 0x11b4 0011b2 d092 BRA 0x12d8 0011b4 0e43 MOVLW 0x43 0011b6 181e XORWF 0x1e,0x0,0x0 0011b8 e102 BNZ 0x11be 0011ba 0e52 MOVLW 0x52 0011bc 181f XORWF 0x1f,0x0,0x0 0011be e101 BNZ 0x11c2 0011c0 d088 BRA 0x12d2 0011c2 0e4f MOVLW 0x4f 0011c4 181e XORWF 0x1e,0x0,0x0 0011c6 e102 BNZ 0x11cc 0011c8 0e42 MOVLW 0x42 0011ca 181f XORWF 0x1f,0x0,0x0 0011cc e101 BNZ 0x11d0 0011ce d07e BRA 0x12cc 0011d0 0e57 MOVLW 0x57 0011d2 181e XORWF 0x1e,0x0,0x0 0011d4 e102 BNZ 0x11da 0011d6 0e4d MOVLW 0x4d 0011d8 181f XORWF 0x1f,0x0,0x0 0011da e076 BZ 0x12c8 0011dc 0e52 MOVLW 0x52 0011de 181e XORWF 0x1e,0x0,0x0 0011e0 e102 BNZ 0x11e6 0011e2 0e4d MOVLW 0x4d 0011e4 181f XORWF 0x1f,0x0,0x0 0011e6 e06e BZ 0x12c4 0011e8 0e44 MOVLW 0x44 0011ea 181e XORWF 0x1e,0x0,0x0 0011ec e102 BNZ 0x11f2 0011ee 0e50 MOVLW 0x50 0011f0 181f XORWF 0x1f,0x0,0x0 0011f2 e066 BZ 0x12c0 0011f4 0e4f MOVLW 0x4f 0011f6 181e XORWF 0x1e,0x0,0x0 0011f8 e102 BNZ 0x11fe 0011fa 0e50 MOVLW 0x50 0011fc 181f XORWF 0x1f,0x0,0x0 0011fe e05d BZ 0x12ba 001200 0e49 MOVLW 0x49 001202 181e XORWF 0x1e,0x0,0x0 001204 e102 BNZ 0x120a 001206 0e50 MOVLW 0x50 001208 181f XORWF 0x1f,0x0,0x0 00120a e055 BZ 0x12b6 00120c 0e58 MOVLW 0x58 00120e 181e XORWF 0x1e,0x0,0x0 001210 e102 BNZ 0x1216 001212 0e54 MOVLW 0x54 001214 181f XORWF 0x1f,0x0,0x0 001216 e04c BZ 0x12b0 001218 0e54 MOVLW 0x54 00121a 181e XORWF 0x1e,0x0,0x0 00121c e101 BNZ 0x1220 00121e 501f MOVF 0x1f,0x0,0x0 001220 e045 BZ 0x12ac 001222 0e41 MOVLW 0x41 001224 181e XORWF 0x1e,0x0,0x0 001226 e101 BNZ 0x122a 001228 501f MOVF 0x1f,0x0,0x0 00122a e03e BZ 0x12a8 00122c 0e56 MOVLW 0x56 00122e 181e XORWF 0x1e,0x0,0x0 001230 e101 BNZ 0x1234 001232 501f MOVF 0x1f,0x0,0x0 001234 e037 BZ 0x12a4 001236 0e49 MOVLW 0x49 001238 181e XORWF 0x1e,0x0,0x0 00123a e101 BNZ 0x123e 00123c 501f MOVF 0x1f,0x0,0x0 00123e e030 BZ 0x12a0 001240 0e4f MOVLW 0x4f 001242 181e XORWF 0x1e,0x0,0x0 001244 e101 BNZ 0x1248 001246 501f MOVF 0x1f,0x0,0x0 001248 e029 BZ 0x129c 00124a 0e55 MOVLW 0x55 00124c 181e XORWF 0x1e,0x0,0x0 00124e e102 BNZ 0x1254 001250 0e43 MOVLW 0x43 001252 181f XORWF 0x1f,0x0,0x0 001254 e021 BZ 0x1298 001256 0e58 MOVLW 0x58 001258 181e XORWF 0x1e,0x0,0x0 00125a e102 BNZ 0x1260 00125c 0e43 MOVLW 0x43 00125e 181f XORWF 0x1f,0x0,0x0 001260 e018 BZ 0x1292 001262 0e43 MOVLW 0x43 001264 181e XORWF 0x1e,0x0,0x0 001266 e101 BNZ 0x126a 001268 501f MOVF 0x1f,0x0,0x0 00126a e011 BZ 0x128e 00126c 0e52 MOVLW 0x52 00126e 181e XORWF 0x1e,0x0,0x0 001270 e101 BNZ 0x1274 001272 501f MOVF 0x1f,0x0,0x0 001274 e00a BZ 0x128a 001276 0e58 MOVLW 0x58 001278 181e XORWF 0x1e,0x0,0x0 00127a e102 BNZ 0x1280 00127c 0e52 MOVLW 0x52 00127e 181f XORWF 0x1f,0x0,0x0 001280 e001 BZ 0x1284 001282 d042 BRA 0x1308 { C:\Projects\UBW\FW\D_143\user\user.c case ('R' * 256) + 'X': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // For receiving serial C:\Projects\UBW\FW\D_143\user\user.c 001284 ecab CALL 0x1d56,0x0 parse_RX_packet (); C:\Projects\UBW\FW\D_143\user\user.c 001286 f00e 001288 d07e BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case 'R': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Reset command (resets everything to power-on state) C:\Projects\UBW\FW\D_143\user\user.c 00128a d8b4 RCALL 0x13f4 parse_R_packet (); C:\Projects\UBW\FW\D_143\user\user.c 00128c d07c BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case 'C': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Configure command (configure ports for Input or Ouptut) C:\Projects\UBW\FW\D_143\user\user.c 00128e d937 RCALL 0x14fe parse_C_packet (); C:\Projects\UBW\FW\D_143\user\user.c 001290 d07a BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('C' * 256) + 'X': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // For configuring serial port C:\Projects\UBW\FW\D_143\user\user.c 001292 ecae CALL 0x1d5c,0x0 parse_CX_packet (); C:\Projects\UBW\FW\D_143\user\user.c 001294 f00e 001296 d077 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('C' * 256) + 'U': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // For configuring UBW C:\Projects\UBW\FW\D_143\user\user.c 001298 d8b1 RCALL 0x13fc parse_CU_packet (); C:\Projects\UBW\FW\D_143\user\user.c 00129a d075 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case 'O': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Output command (tell the ports to output something) C:\Projects\UBW\FW\D_143\user\user.c 00129c d9a3 RCALL 0x15e4 parse_O_packet (); C:\Projects\UBW\FW\D_143\user\user.c 00129e d073 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case 'I': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Input command (return the current status of the ports) C:\Projects\UBW\FW\D_143\user\user.c 0012a0 d9ea RCALL 0x1676 parse_I_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012a2 d071 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case 'V': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Version command C:\Projects\UBW\FW\D_143\user\user.c 0012a4 da09 RCALL 0x16b8 parse_V_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012a6 d06f BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case 'A': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Analog command C:\Projects\UBW\FW\D_143\user\user.c 0012a8 da18 RCALL 0x16da parse_A_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012aa d06d BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case 'T': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // For timed I/O C:\Projects\UBW\FW\D_143\user\user.c 0012ac d8e7 RCALL 0x147c parse_T_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012ae d06b BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('T' * 256) + 'X': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // For transmitting serial C:\Projects\UBW\FW\D_143\user\user.c 0012b0 eca8 CALL 0x1d50,0x0 parse_TX_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012b2 f00e 0012b4 d068 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('P' * 256) + 'I': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // PI for reading a single pin C:\Projects\UBW\FW\D_143\user\user.c 0012b6 dbc6 RCALL 0x1a44 parse_PI_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012b8 d066 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('P' * 256) + 'O': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // PO for setting a single pin C:\Projects\UBW\FW\D_143\user\user.c 0012ba eccc CALL 0x1b98,0x0 parse_PO_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012bc f00d 0012be d063 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c case ('P' * 256) + 'D': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // PD for setting a pin's direction C:\Projects\UBW\FW\D_143\user\user.c 0012c0 dae3 RCALL 0x1888 parse_PD_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012c2 d061 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('M' * 256) + 'R': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // MR for Memory Read C:\Projects\UBW\FW\D_143\user\user.c 0012c4 daa0 RCALL 0x1806 parse_MR_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012c6 d05f BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('M' * 256) + 'W': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // MW for Memory Write C:\Projects\UBW\FW\D_143\user\user.c 0012c8 da69 RCALL 0x179c parse_MW_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012ca d05d BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('B' * 256) + 'O': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // MR for Fast Parallel Output C:\Projects\UBW\FW\D_143\user\user.c 0012cc ec9d CALL 0x1f3a,0x0 parse_BO_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012ce f00f 0012d0 d05a BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('R' * 256) + 'C': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // RC for RC servo output C:\Projects\UBW\FW\D_143\user\user.c 0012d2 ecb1 CALL 0x1d62,0x0 parse_RC_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012d4 f00e 0012d6 d057 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('B' * 256) + 'C': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // BC for Fast Parallel Configure C:\Projects\UBW\FW\D_143\user\user.c 0012d8 ec56 CALL 0x1eac,0x0 parse_BC_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012da f00f 0012dc d054 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('B' * 256) + 'S': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // BS for Fast Binary Stream output C:\Projects\UBW\FW\D_143\user\user.c 0012de ece4 CALL 0x21c8,0x0 parse_BS_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012e0 f010 0012e2 d051 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('S' * 256) + 'S': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // SS for Send SPI C:\Projects\UBW\FW\D_143\user\user.c 0012e4 eca0 CALL 0x2340,0x0 parse_SS_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012e6 f011 0012e8 d04e BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('R' * 256) + 'S': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // RS for Receive SPI C:\Projects\UBW\FW\D_143\user\user.c 0012ea eca3 CALL 0x2346,0x0 parse_RS_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012ec f011 0012ee d04b BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('C' * 256) + 'S': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // CS for Configure SPI C:\Projects\UBW\FW\D_143\user\user.c 0012f0 eca6 CALL 0x234c,0x0 parse_CS_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012f2 f011 0012f4 d048 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('S' * 256) + 'I': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // SI for Send I2C C:\Projects\UBW\FW\D_143\user\user.c 0012f6 eca9 CALL 0x2352,0x0 parse_SI_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012f8 f011 0012fa d045 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('R' * 256) + 'I': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // RI for Receive I2C C:\Projects\UBW\FW\D_143\user\user.c 0012fc ecac CALL 0x2358,0x0 parse_RI_packet (); C:\Projects\UBW\FW\D_143\user\user.c 0012fe f011 001300 d042 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c case ('C' * 256) + 'I': C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // CI for Configure I2C C:\Projects\UBW\FW\D_143\user\user.c 001302 ecaf CALL 0x235e,0x0 parse_CI_packet (); C:\Projects\UBW\FW\D_143\user\user.c 001304 f011 001306 d03f BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c default: C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001308 0e03 MOVLW 0x3 if (0 == cmd2) C:\Projects\UBW\FW\D_143\user\user.c 00130a 50db MOVF 0xdb,0x0,0x0 00130c e11a BNZ 0x1342 { C:\Projects\UBW\FW\D_143\user\user.c // Send back 'unknown command' error C:\Projects\UBW\FW\D_143\user\user.c printf ( C:\Projects\UBW\FW\D_143\user\user.c (far rom char *)"!8 Err: Unknown command '%c:%2X'\r\n" C:\Projects\UBW\FW\D_143\user\user.c 00131e 0e81 MOVLW 0x81 ,cmd1 C:\Projects\UBW\FW\D_143\user\user.c 001320 6e2a MOVWF 0x2a,0x0 001322 0e41 MOVLW 0x41 001324 6e2b MOVWF 0x2b,0x0 001326 6a2c CLRF 0x2c,0x0 001328 c02a MOVFF 0x2a,0xfe6 00132a ffe6 00132c c02b MOVFF 0x2b,0xfe6 00132e ffe6 001330 c02c MOVFF 0x2c,0xfe6 001332 ffe6 001316 0e02 MOVLW 0x2 ,cmd1 C:\Projects\UBW\FW\D_143\user\user.c 001318 cfdb MOVFF 0xfdb,0xfe6 00131a ffe6 00131c 6ae6 CLRF 0xe6,0x0 00130e 0e02 MOVLW 0x2 ); C:\Projects\UBW\FW\D_143\user\user.c 001310 cfdb MOVFF 0xfdb,0xfe6 001312 ffe6 001314 6ae6 CLRF 0xe6,0x0 001334 ec4d CALL 0x449a,0x0 001336 f022 001338 6e2d MOVWF 0x2d,0x0 00133a 0e07 MOVLW 0x7 00133c 5ee1 SUBWF 0xe1,0x1,0x0 00133e 502d MOVF 0x2d,0x0,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001340 d021 BRA 0x1384 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Send back 'unknown command' error C:\Projects\UBW\FW\D_143\user\user.c printf ( C:\Projects\UBW\FW\D_143\user\user.c (far rom char *)"!8 Err: Unknown command '%c%c:%2X%2X'\r\n" C:\Projects\UBW\FW\D_143\user\user.c 001362 0e59 MOVLW 0x59 ,cmd1 C:\Projects\UBW\FW\D_143\user\user.c 001364 6e2a MOVWF 0x2a,0x0 001366 0e41 MOVLW 0x41 001368 6e2b MOVWF 0x2b,0x0 00136a 6a2c CLRF 0x2c,0x0 00136c c02a MOVFF 0x2a,0xfe6 00136e ffe6 001370 c02b MOVFF 0x2b,0xfe6 001372 ffe6 001374 c02c MOVFF 0x2c,0xfe6 001376 ffe6 00135a 0e02 MOVLW 0x2 ,cmd2 C:\Projects\UBW\FW\D_143\user\user.c 00135c cfdb MOVFF 0xfdb,0xfe6 00135e ffe6 001360 6ae6 CLRF 0xe6,0x0 001352 0e03 MOVLW 0x3 ,cmd1 C:\Projects\UBW\FW\D_143\user\user.c 001354 cfdb MOVFF 0xfdb,0xfe6 001356 ffe6 001358 6ae6 CLRF 0xe6,0x0 00134a 0e02 MOVLW 0x2 ,cmd2 C:\Projects\UBW\FW\D_143\user\user.c 00134c cfdb MOVFF 0xfdb,0xfe6 00134e ffe6 001350 6ae6 CLRF 0xe6,0x0 001342 0e03 MOVLW 0x3 ); C:\Projects\UBW\FW\D_143\user\user.c 001344 cfdb MOVFF 0xfdb,0xfe6 001346 ffe6 001348 6ae6 CLRF 0xe6,0x0 001378 ec4d CALL 0x449a,0x0 00137a f022 00137c 6e2d MOVWF 0x2d,0x0 00137e 0e0b MOVLW 0xb 001380 5ee1 SUBWF 0xe1,0x1,0x0 001382 502d MOVF 0x2d,0x0,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001384 d000 BRA 0x1386 break; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Double check that our output pointer is now at the ending C:\Projects\UBW\FW\D_143\user\user.c // If it is not, this indicates that there were extra characters that C:\Projects\UBW\FW\D_143\user\user.c // the command parsing routine didn't eat. This would be an error and needs C:\Projects\UBW\FW\D_143\user\user.c // to be reported. (Ignore for Reset command because FIFO pointers get cleared.) C:\Projects\UBW\FW\D_143\user\user.c if ( C:\Projects\UBW\FW\D_143\user\user.c 001386 0101 MOVLB 0x1 (g_RX_buf[g_RX_buf_out] != kCR && 0 == error_byte) C:\Projects\UBW\FW\D_143\user\user.c 001388 51b9 MOVF 0xb9,0x0,0x1 00138a 6aea CLRF 0xea,0x0 00138c 0f40 ADDLW 0x40 00138e 6ee9 MOVWF 0xe9,0x0 001390 0e02 MOVLW 0x2 001392 22ea ADDWFC 0xea,0x1,0x0 001394 50ef MOVF 0xef,0x0,0x0 001396 080d SUBLW 0xd 001398 e00d BZ 0x13b4 00139a 500d MOVF 0xd,0x0,0x0 00139c e10b BNZ 0x13b4 && C:\Projects\UBW\FW\D_143\user\user.c 00139e 0e52 MOVLW 0x52 ('R' != command) C:\Projects\UBW\FW\D_143\user\user.c 0013a0 6e2a MOVWF 0x2a,0x0 0013a2 6a2b CLRF 0x2b,0x0 0013a4 50df MOVF 0xdf,0x0,0x0 0013a6 182a XORWF 0x2a,0x0,0x0 0013a8 e103 BNZ 0x13b0 0013aa 52de MOVF 0xde,0x1,0x0 0013ac 50dd MOVF 0xdd,0x0,0x0 0013ae 182b XORWF 0x2b,0x0,0x0 0013b0 e001 BZ 0x13b4 ) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0013b2 8e0d BSF 0xd,0x7,0x0 bitset (error_byte, kERROR_BYTE_EXTRA_CHARACTERS); C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Clean up by skipping over any bytes we haven't eaten C:\Projects\UBW\FW\D_143\user\user.c // This is safe since we parse each packet as we get a C:\Projects\UBW\FW\D_143\user\user.c // (i.e. g_RX_buf_in doesn't move while we are in this routine) C:\Projects\UBW\FW\D_143\user\user.c 0013b4 c1b8 MOVFF 0x1b8,0x1b9 g_RX_buf_out = g_RX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c 0013b6 f1b9 0013b8 0e04 MOVLW 0x4 } C:\Projects\UBW\FW\D_143\user\user.c 0013ba 5ce1 SUBWF 0xe1,0x0,0x0 0013bc e202 BC 0x13c2 0013be 6ae1 CLRF 0xe1,0x0 0013c0 52e5 MOVF 0xe5,0x1,0x0 0013c2 6ee1 MOVWF 0xe1,0x0 0013c4 52e5 MOVF 0xe5,0x1,0x0 0013c6 cfe7 MOVFF 0xfe7,0xfd9 0013c8 ffd9 0013ca 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // Print out the positive acknoledgement that the packet was received C:\Projects\UBW\FW\D_143\user\user.c // if we have acks turned on. C:\Projects\UBW\FW\D_143\user\user.c void print_ack(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0013cc 0101 MOVLB 0x1 if (g_ack_enable) C:\Projects\UBW\FW\D_143\user\user.c 0013ce 51be MOVF 0xbe,0x0,0x1 0013d0 e010 BZ 0x13f2 { C:\Projects\UBW\FW\D_143\user\user.c 0013d2 0e58 MOVLW 0x58 printf ((far rom char *)st_OK); C:\Projects\UBW\FW\D_143\user\user.c 0013d4 6e2a MOVWF 0x2a,0x0 0013d6 0e47 MOVLW 0x47 0013d8 6e2b MOVWF 0x2b,0x0 0013da 6a2c CLRF 0x2c,0x0 0013dc c02a MOVFF 0x2a,0xfe6 0013de ffe6 0013e0 c02b MOVFF 0x2b,0xfe6 0013e2 ffe6 0013e4 c02c MOVFF 0x2c,0xfe6 0013e6 ffe6 0013e8 ec4d CALL 0x449a,0x0 0013ea f022 0013ec 52e5 MOVF 0xe5,0x1,0x0 0013ee 52e5 MOVF 0xe5,0x1,0x0 0013f0 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 0013f2 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Return all I/Os to their default power-on values C:\Projects\UBW\FW\D_143\user\user.c void parse_R_packet(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0013f4 ecc4 CALL 0xb88,0x0 UserInit (); C:\Projects\UBW\FW\D_143\user\user.c 0013f6 f005 0013f8 dfe9 RCALL 0x13cc print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 0013fa 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // CU is "Configure UBW" and controls system-wide configruation values C:\Projects\UBW\FW\D_143\user\user.c // "CU,," C:\Projects\UBW\FW\D_143\user\user.c // C:\Projects\UBW\FW\D_143\user\user.c // 1 {1|0} turns on or off the 'ack' ("OK" at end of packets) C:\Projects\UBW\FW\D_143\user\user.c 0013fc cfd9 MOVFF 0xfd9,0xfe6 void parse_CU_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 0013fe ffe6 001400 cfe1 MOVFF 0xfe1,0xfd9 001402 ffd9 001404 0e03 MOVLW 0x3 001406 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char parameter_number; C:\Projects\UBW\FW\D_143\user\user.c signed int paramater_value; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001408 0e01 MOVLW 0x1 parameter_number = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 00140a 6ee6 MOVWF 0xe6,0x0 00140c ecb2 CALL 0x2364,0x0 00140e f011 001410 52e5 MOVF 0xe5,0x1,0x0 001412 501d MOVF 0x1d,0x0,0x0 001414 6edf MOVWF 0xdf,0x0 001416 0e02 MOVLW 0x2 paramater_value = extract_number (kINT); C:\Projects\UBW\FW\D_143\user\user.c 001418 6ee6 MOVWF 0xe6,0x0 00141a ecb2 CALL 0x2364,0x0 00141c f011 00141e 52e5 MOVF 0xe5,0x1,0x0 001420 52de MOVF 0xde,0x1,0x0 001422 c01d MOVFF 0x1d,0xfde 001424 ffde 001426 c01e MOVFF 0x1e,0xfdd 001428 ffdd 00142a 52dd MOVF 0xdd,0x1,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 00142c 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 00142e e001 BZ 0x1432 { C:\Projects\UBW\FW\D_143\user\user.c 001430 d01b BRA 0x1468 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001432 04df DECF 0xdf,0x0,0x0 if (1 == parameter_number) C:\Projects\UBW\FW\D_143\user\user.c 001434 e118 BNZ 0x1466 { C:\Projects\UBW\FW\D_143\user\user.c 001436 50d9 MOVF 0xd9,0x0,0x0 if (0 == paramater_value || 1 == paramater_value) C:\Projects\UBW\FW\D_143\user\user.c 001438 0f01 ADDLW 0x1 00143a 6ee9 MOVWF 0xe9,0x0 00143c cfda MOVFF 0xfda,0xfea 00143e ffea 001440 50ee MOVF 0xee,0x0,0x0 001442 10ed IORWF 0xed,0x0,0x0 001444 e00b BZ 0x145c 001446 0e01 MOVLW 0x1 001448 6e2a MOVWF 0x2a,0x0 00144a 6a2b CLRF 0x2b,0x0 00144c 0e01 MOVLW 0x1 00144e 50db MOVF 0xdb,0x0,0x0 001450 182a XORWF 0x2a,0x0,0x0 001452 e103 BNZ 0x145a 001454 0e02 MOVLW 0x2 001456 50db MOVF 0xdb,0x0,0x0 001458 182b XORWF 0x2b,0x0,0x0 00145a e104 BNZ 0x1464 { C:\Projects\UBW\FW\D_143\user\user.c 00145c 0e01 MOVLW 0x1 g_ack_enable = paramater_value; C:\Projects\UBW\FW\D_143\user\user.c 00145e cfdb MOVFF 0xfdb,0x1be 001460 f1be } C:\Projects\UBW\FW\D_143\user\user.c 001462 d001 BRA 0x1466 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001464 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001466 dfb2 RCALL 0x13cc print_ack(); C:\Projects\UBW\FW\D_143\user\user.c 001468 0e03 MOVLW 0x3 } C:\Projects\UBW\FW\D_143\user\user.c 00146a 5ce1 SUBWF 0xe1,0x0,0x0 00146c e202 BC 0x1472 00146e 6ae1 CLRF 0xe1,0x0 001470 52e5 MOVF 0xe5,0x1,0x0 001472 6ee1 MOVWF 0xe1,0x0 001474 52e5 MOVF 0xe5,0x1,0x0 001476 cfe7 MOVFF 0xfe7,0xfd9 001478 ffd9 00147a 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // "T" Packet C:\Projects\UBW\FW\D_143\user\user.c // Causes PIC to sample digital or analog inputs at a regular interval and send C:\Projects\UBW\FW\D_143\user\user.c // I (or A) packets back at that interval. C:\Projects\UBW\FW\D_143\user\user.c // Send T,0,0 to stop I (or A) packets C:\Projects\UBW\FW\D_143\user\user.c // FORMAT: T,, C:\Projects\UBW\FW\D_143\user\user.c // is 0 for digital (I packets) and 1 for analog (A packets) C:\Projects\UBW\FW\D_143\user\user.c // EXAMPLE: "T,4000,0" to send an I packet back every 4 seconds. C:\Projects\UBW\FW\D_143\user\user.c // EXAMPLE: "T,2000,1" to send an A packet back every 2 seconds. C:\Projects\UBW\FW\D_143\user\user.c 00147c cfd9 MOVFF 0xfd9,0xfe6 void parse_T_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 00147e ffe6 001480 cfe1 MOVFF 0xfe1,0xfd9 001482 ffd9 001484 0e03 MOVLW 0x3 001486 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned int value; C:\Projects\UBW\FW\D_143\user\user.c 001488 0e02 MOVLW 0x2 unsigned char mode = 0; C:\Projects\UBW\FW\D_143\user\user.c 00148a 6adb CLRF 0xdb,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Extract the value C:\Projects\UBW\FW\D_143\user\user.c 00148c 0e03 MOVLW 0x3 time_between_updates = extract_number (kUINT); C:\Projects\UBW\FW\D_143\user\user.c 00148e 6ee6 MOVWF 0xe6,0x0 001490 ecb2 CALL 0x2364,0x0 001492 f011 001494 52e5 MOVF 0xe5,0x1,0x0 001496 c01d MOVFF 0x1d,0x0 001498 f000 00149a c01e MOVFF 0x1e,0x1 00149c f001 // Extract the value C:\Projects\UBW\FW\D_143\user\user.c 00149e 0e01 MOVLW 0x1 mode = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 0014a0 6ee6 MOVWF 0xe6,0x0 0014a2 ecb2 CALL 0x2364,0x0 0014a4 f011 0014a6 52e5 MOVF 0xe5,0x1,0x0 0014a8 0e02 MOVLW 0x2 0014aa c01d MOVFF 0x1d,0xfdb 0014ac ffdb C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 0014ae 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 0014b0 e001 BZ 0x14b4 { C:\Projects\UBW\FW\D_143\user\user.c 0014b2 d01b BRA 0x14ea return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Now start up the timer at the right rate or shut C:\Projects\UBW\FW\D_143\user\user.c // it down. C:\Projects\UBW\FW\D_143\user\user.c 0014b4 0e02 MOVLW 0x2 if (0 == mode) C:\Projects\UBW\FW\D_143\user\user.c 0014b6 50db MOVF 0xdb,0x0,0x0 0014b8 e10c BNZ 0x14d2 { C:\Projects\UBW\FW\D_143\user\user.c 0014ba 5000 MOVF 0x0,0x0,0x0 if (0 == time_between_updates) C:\Projects\UBW\FW\D_143\user\user.c 0014bc 1001 IORWF 0x1,0x0,0x0 0014be e103 BNZ 0x14c6 { C:\Projects\UBW\FW\D_143\user\user.c // Turn off sending of I packets. C:\Projects\UBW\FW\D_143\user\user.c 0014c0 6a02 CLRF 0x2,0x0 ISR_D_RepeatRate = 0; C:\Projects\UBW\FW\D_143\user\user.c 0014c2 6a03 CLRF 0x3,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 0014c4 d005 BRA 0x14d0 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0014c6 84ca BSF 0xca,0x2,0x0 T2CONbits.TMR2ON = 1; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Eventually gaurd this section from interrupts C:\Projects\UBW\FW\D_143\user\user.c 0014c8 c000 MOVFF 0x0,0x2 ISR_D_RepeatRate = time_between_updates; C:\Projects\UBW\FW\D_143\user\user.c 0014ca f002 0014cc c001 MOVFF 0x1,0x3 0014ce f003 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0014d0 d00b BRA 0x14e8 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0014d2 5000 MOVF 0x0,0x0,0x0 if (0 == time_between_updates) C:\Projects\UBW\FW\D_143\user\user.c 0014d4 1001 IORWF 0x1,0x0,0x0 0014d6 e103 BNZ 0x14de { C:\Projects\UBW\FW\D_143\user\user.c // Turn off sending of A packets. C:\Projects\UBW\FW\D_143\user\user.c 0014d8 6a07 CLRF 0x7,0x0 ISR_A_RepeatRate = 0; C:\Projects\UBW\FW\D_143\user\user.c 0014da 6a08 CLRF 0x8,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 0014dc d005 BRA 0x14e8 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0014de 84ca BSF 0xca,0x2,0x0 T2CONbits.TMR2ON = 1; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Eventually gaurd this section from interrupts C:\Projects\UBW\FW\D_143\user\user.c 0014e0 c000 MOVFF 0x0,0x7 ISR_A_RepeatRate = time_between_updates; C:\Projects\UBW\FW\D_143\user\user.c 0014e2 f007 0014e4 c001 MOVFF 0x1,0x8 0014e6 f008 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 0014e8 df71 RCALL 0x13cc print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 0014ea 0e03 MOVLW 0x3 } C:\Projects\UBW\FW\D_143\user\user.c 0014ec 5ce1 SUBWF 0xe1,0x0,0x0 0014ee e202 BC 0x14f4 0014f0 6ae1 CLRF 0xe1,0x0 0014f2 52e5 MOVF 0xe5,0x1,0x0 0014f4 6ee1 MOVWF 0xe1,0x0 0014f6 52e5 MOVF 0xe5,0x1,0x0 0014f8 cfe7 MOVFF 0xfe7,0xfd9 0014fa ffd9 0014fc 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // FORMAT: C,,,, C:\Projects\UBW\FW\D_143\user\user.c // EXAMPLE: "C,255,0,4,0" C:\Projects\UBW\FW\D_143\user\user.c // is the byte sent to the Data Direction (DDR) regsiter for C:\Projects\UBW\FW\D_143\user\user.c // each port. A 1 in a bit location means input, a 0 means output. C:\Projects\UBW\FW\D_143\user\user.c // is a value between 0 and 12. It tells the UBW C:\Projects\UBW\FW\D_143\user\user.c // how many analog inputs to enable. If a zero is sent for this C:\Projects\UBW\FW\D_143\user\user.c // parameter, all analog inputs are disabled. C:\Projects\UBW\FW\D_143\user\user.c // For the other values, see the following chart to know what pins are C:\Projects\UBW\FW\D_143\user\user.c // used for what: C:\Projects\UBW\FW\D_143\user\user.c // C:\Projects\UBW\FW\D_143\user\user.c // Note that in the following chart, PortE is references. This port C:\Projects\UBW\FW\D_143\user\user.c // only exists on the 40 and 44 pin versions of the UBW. For the C:\Projects\UBW\FW\D_143\user\user.c // 28 pin versions of the UBW, all PortE based analog pins will return C:\Projects\UBW\FW\D_143\user\user.c // zero. C:\Projects\UBW\FW\D_143\user\user.c // C:\Projects\UBW\FW\D_143\user\user.c // Analog Inputs Enabled Pins Used For Analog Inputs C:\Projects\UBW\FW\D_143\user\user.c // --------------- --------------------- ------------------------------- C:\Projects\UBW\FW\D_143\user\user.c // 0 C:\Projects\UBW\FW\D_143\user\user.c // 1 AN0 A0 C:\Projects\UBW\FW\D_143\user\user.c // 2 AN0,AN1 A0,A1 C:\Projects\UBW\FW\D_143\user\user.c // 3 AN0,AN1,AN2 A0,A1,A2 C:\Projects\UBW\FW\D_143\user\user.c // 4 AN0,AN1,AN2,AN3 A0,A1,A2,A3 C:\Projects\UBW\FW\D_143\user\user.c // 5 AN0,AN1,AN2,AN3,AN4 A0,A1,A2,A3,A5 C:\Projects\UBW\FW\D_143\user\user.c // 6 AN0,AN1,AN2,AN3,AN4, A0,A1,A2,A3,A5,E0 C:\Projects\UBW\FW\D_143\user\user.c // AN5 C:\Projects\UBW\FW\D_143\user\user.c // 7 AN0,AN1,AN2,AN3,AN4, A0,A1,A2,A3,A5,E0,E1 C:\Projects\UBW\FW\D_143\user\user.c // AN5,AN6 C:\Projects\UBW\FW\D_143\user\user.c // 8 AN0,AN1,AN2,AN3,AN4, A0,A1,A2,A3,A5,E0,E1,E2 C:\Projects\UBW\FW\D_143\user\user.c // AN5,AN6,AN7 C:\Projects\UBW\FW\D_143\user\user.c // 9 AN0,AN1,AN2,AN3,AN4, A0,A1,A2,A3,A5,E0,E1,E2,B2 C:\Projects\UBW\FW\D_143\user\user.c // AN5,AN6,AN7,AN8 C:\Projects\UBW\FW\D_143\user\user.c // 10 AN0,AN1,AN2,AN3,AN4, A0,A1,A2,A3,A5,E0,E1,E2,B2,B3 C:\Projects\UBW\FW\D_143\user\user.c // AN5,AN6,AN7,AN8, C:\Projects\UBW\FW\D_143\user\user.c // AN9 C:\Projects\UBW\FW\D_143\user\user.c // 11 AN0,AN1,AN2,AN3,AN4, A0,A1,A2,A3,A5,E0,E1,E2,B2,B3,B1 C:\Projects\UBW\FW\D_143\user\user.c // AN5,AN6,AN7,AN8, C:\Projects\UBW\FW\D_143\user\user.c // AB9,AN10 C:\Projects\UBW\FW\D_143\user\user.c // 12 AN0,AN1,AN2,AN3,AN4, A0,A1,A2,A3,A5,E0,E1,E2,B2,B3,B1,B4 C:\Projects\UBW\FW\D_143\user\user.c // AN5,AN6,AN7,AN8, C:\Projects\UBW\FW\D_143\user\user.c // AN9,AN10,AN11 C:\Projects\UBW\FW\D_143\user\user.c // NOTE: it is up to the user to tell the proper port direction bits to be C:\Projects\UBW\FW\D_143\user\user.c // inputs for the analog channels they wish to use. C:\Projects\UBW\FW\D_143\user\user.c 0014fe cfd9 MOVFF 0xfd9,0xfe6 void parse_C_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 001500 ffe6 001502 cfe1 MOVFF 0xfe1,0xfd9 001504 ffd9 001506 0e06 MOVLW 0x6 001508 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char PA, PB, PC, AA; C:\Projects\UBW\FW\D_143\user\user.c #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c unsigned char PD, PE; C:\Projects\UBW\FW\D_143\user\user.c #endif C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Extract each of the four values. C:\Projects\UBW\FW\D_143\user\user.c 00150a 0e01 MOVLW 0x1 PA = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 00150c 6ee6 MOVWF 0xe6,0x0 00150e ecb2 CALL 0x2364,0x0 001510 f011 001512 52e5 MOVF 0xe5,0x1,0x0 001514 501d MOVF 0x1d,0x0,0x0 001516 6edf MOVWF 0xdf,0x0 001518 0e01 MOVLW 0x1 PB = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 00151a 6ee6 MOVWF 0xe6,0x0 00151c ecb2 CALL 0x2364,0x0 00151e f011 001520 52e5 MOVF 0xe5,0x1,0x0 001522 0e01 MOVLW 0x1 001524 c01d MOVFF 0x1d,0xfdb 001526 ffdb 001528 0e01 MOVLW 0x1 PC = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 00152a 6ee6 MOVWF 0xe6,0x0 00152c ecb2 CALL 0x2364,0x0 00152e f011 001530 52e5 MOVF 0xe5,0x1,0x0 001532 0e02 MOVLW 0x2 001534 c01d MOVFF 0x1d,0xfdb 001536 ffdb #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c 001538 0e01 MOVLW 0x1 PD = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 00153a 6ee6 MOVWF 0xe6,0x0 00153c ecb2 CALL 0x2364,0x0 00153e f011 001540 52e5 MOVF 0xe5,0x1,0x0 001542 0e04 MOVLW 0x4 001544 c01d MOVFF 0x1d,0xfdb 001546 ffdb 001548 0e01 MOVLW 0x1 PE = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 00154a 6ee6 MOVWF 0xe6,0x0 00154c ecb2 CALL 0x2364,0x0 00154e f011 001550 52e5 MOVF 0xe5,0x1,0x0 001552 0e05 MOVLW 0x5 001554 c01d MOVFF 0x1d,0xfdb 001556 ffdb #endif C:\Projects\UBW\FW\D_143\user\user.c 001558 0e01 MOVLW 0x1 AA = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 00155a 6ee6 MOVWF 0xe6,0x0 00155c ecb2 CALL 0x2364,0x0 00155e f011 001560 52e5 MOVF 0xe5,0x1,0x0 001562 0e03 MOVLW 0x3 001564 c01d MOVFF 0x1d,0xfdb 001566 ffdb C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 001568 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 00156a e001 BZ 0x156e { C:\Projects\UBW\FW\D_143\user\user.c 00156c d031 BRA 0x15d0 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Now write those values to the data direction registers. C:\Projects\UBW\FW\D_143\user\user.c 00156e 50df MOVF 0xdf,0x0,0x0 TRISA = PA; C:\Projects\UBW\FW\D_143\user\user.c 001570 6e92 MOVWF 0x92,0x0 001572 0e01 MOVLW 0x1 TRISB = PB; C:\Projects\UBW\FW\D_143\user\user.c 001574 50db MOVF 0xdb,0x0,0x0 001576 6e93 MOVWF 0x93,0x0 001578 0e02 MOVLW 0x2 TRISC = PC; C:\Projects\UBW\FW\D_143\user\user.c 00157a 50db MOVF 0xdb,0x0,0x0 00157c 6e94 MOVWF 0x94,0x0 #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c 00157e 0e04 MOVLW 0x4 TRISD = PD; C:\Projects\UBW\FW\D_143\user\user.c 001580 50db MOVF 0xdb,0x0,0x0 001582 6e95 MOVWF 0x95,0x0 001584 0e05 MOVLW 0x5 TRISE = PE; C:\Projects\UBW\FW\D_143\user\user.c 001586 50db MOVF 0xdb,0x0,0x0 001588 6e96 MOVWF 0x96,0x0 #endif C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Handle the analog value. C:\Projects\UBW\FW\D_143\user\user.c // Maximum value of 12. C:\Projects\UBW\FW\D_143\user\user.c 00158a 0e03 MOVLW 0x3 if (AA > 12) C:\Projects\UBW\FW\D_143\user\user.c 00158c 50db MOVF 0xdb,0x0,0x0 00158e 080c SUBLW 0xc 001590 e205 BC 0x159c { C:\Projects\UBW\FW\D_143\user\user.c 001592 0e0c MOVLW 0xc AA = 12; C:\Projects\UBW\FW\D_143\user\user.c 001594 6ef3 MOVWF 0xf3,0x0 001596 0e03 MOVLW 0x3 001598 cff3 MOVFF 0xff3,0xfdb 00159a ffdb } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // If we are turning off Analog inputs C:\Projects\UBW\FW\D_143\user\user.c 00159c 0e03 MOVLW 0x3 if (0 == AA) C:\Projects\UBW\FW\D_143\user\user.c 00159e 50db MOVF 0xdb,0x0,0x0 0015a0 e105 BNZ 0x15ac { C:\Projects\UBW\FW\D_143\user\user.c // Turn all analog inputs into digital inputs C:\Projects\UBW\FW\D_143\user\user.c 0015a2 0e0f MOVLW 0xf ADCON1 = 0x0F; C:\Projects\UBW\FW\D_143\user\user.c 0015a4 6ec1 MOVWF 0xc1,0x0 // Turn off the ADC C:\Projects\UBW\FW\D_143\user\user.c 0015a6 90c2 BCF 0xc2,0x0,0x0 ADCON0bits.ADON = 0; C:\Projects\UBW\FW\D_143\user\user.c // Turn off our own idea of how many analog channels to convert C:\Projects\UBW\FW\D_143\user\user.c 0015a8 6a0c CLRF 0xc,0x0 AnalogEnable = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0015aa d011 BRA 0x15ce else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Some protection from ISR C:\Projects\UBW\FW\D_143\user\user.c 0015ac 6a0c CLRF 0xc,0x0 AnalogEnable = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // We're turning some on. C:\Projects\UBW\FW\D_143\user\user.c // Start by selecting channel zero C:\Projects\UBW\FW\D_143\user\user.c 0015ae 6ac2 CLRF 0xc2,0x0 ADCON0 = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Then enabling the proper number of channels C:\Projects\UBW\FW\D_143\user\user.c 0015b0 0e03 MOVLW 0x3 ADCON1 = 15 - AA; C:\Projects\UBW\FW\D_143\user\user.c 0015b2 cfdb MOVFF 0xfdb,0xfe6 0015b4 ffe6 0015b6 0e0f MOVLW 0xf 0015b8 52e5 MOVF 0xe5,0x1,0x0 0015ba 80d8 BSF 0xd8,0x0,0x0 0015bc 54e7 SUBFWB 0xe7,0x0,0x0 0015be 6ec1 MOVWF 0xc1,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Set up ADCON2 options C:\Projects\UBW\FW\D_143\user\user.c // A/D Result right justified C:\Projects\UBW\FW\D_143\user\user.c // Acq time = 20 Tad (?) C:\Projects\UBW\FW\D_143\user\user.c // Tad = Fosc/64 C:\Projects\UBW\FW\D_143\user\user.c 0015c0 0ebe MOVLW 0xbe ADCON2 = 0b10111110; C:\Projects\UBW\FW\D_143\user\user.c 0015c2 6ec0 MOVWF 0xc0,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Turn on the ADC C:\Projects\UBW\FW\D_143\user\user.c 0015c4 80c2 BSF 0xc2,0x0,0x0 ADCON0bits.ADON = 1; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Tell ourselves how many channels to convert, and turn on ISR conversions C:\Projects\UBW\FW\D_143\user\user.c 0015c6 0e03 MOVLW 0x3 AnalogEnable = AA; C:\Projects\UBW\FW\D_143\user\user.c 0015c8 50db MOVF 0xdb,0x0,0x0 0015ca 6e0c MOVWF 0xc,0x0 C:\Projects\UBW\FW\D_143\user\user.c 0015cc 84ca BSF 0xca,0x2,0x0 T2CONbits.TMR2ON = 1; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 0015ce defe RCALL 0x13cc print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 0015d0 0e06 MOVLW 0x6 } C:\Projects\UBW\FW\D_143\user\user.c 0015d2 5ce1 SUBWF 0xe1,0x0,0x0 0015d4 e202 BC 0x15da 0015d6 6ae1 CLRF 0xe1,0x0 0015d8 52e5 MOVF 0xe5,0x1,0x0 0015da 6ee1 MOVWF 0xe1,0x0 0015dc 52e5 MOVF 0xe5,0x1,0x0 0015de cfe7 MOVFF 0xfe7,0xfd9 0015e0 ffd9 0015e2 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // Outputs values to the ports pins that are set up as outputs. C:\Projects\UBW\FW\D_143\user\user.c // Example "O,121,224,002" C:\Projects\UBW\FW\D_143\user\user.c 0015e4 cfd9 MOVFF 0xfd9,0xfe6 void parse_O_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 0015e6 ffe6 0015e8 cfe1 MOVFF 0xfe1,0xfd9 0015ea ffd9 0015ec 0e05 MOVLW 0x5 0015ee 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char PA, PB, PC; C:\Projects\UBW\FW\D_143\user\user.c #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c unsigned char PD, PE; C:\Projects\UBW\FW\D_143\user\user.c #endif C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Extract each of the values. C:\Projects\UBW\FW\D_143\user\user.c 0015f0 0e01 MOVLW 0x1 PA = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 0015f2 6ee6 MOVWF 0xe6,0x0 0015f4 ecb2 CALL 0x2364,0x0 0015f6 f011 0015f8 52e5 MOVF 0xe5,0x1,0x0 0015fa 501d MOVF 0x1d,0x0,0x0 0015fc 6edf MOVWF 0xdf,0x0 0015fe 0e01 MOVLW 0x1 PB = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001600 6ee6 MOVWF 0xe6,0x0 001602 ecb2 CALL 0x2364,0x0 001604 f011 001606 52e5 MOVF 0xe5,0x1,0x0 001608 0e01 MOVLW 0x1 00160a c01d MOVFF 0x1d,0xfdb 00160c ffdb 00160e 0e01 MOVLW 0x1 PC = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001610 6ee6 MOVWF 0xe6,0x0 001612 ecb2 CALL 0x2364,0x0 001614 f011 001616 52e5 MOVF 0xe5,0x1,0x0 001618 0e02 MOVLW 0x2 00161a c01d MOVFF 0x1d,0xfdb 00161c ffdb #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c 00161e 0e01 MOVLW 0x1 PD = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001620 6ee6 MOVWF 0xe6,0x0 001622 ecb2 CALL 0x2364,0x0 001624 f011 001626 52e5 MOVF 0xe5,0x1,0x0 001628 0e03 MOVLW 0x3 00162a c01d MOVFF 0x1d,0xfdb 00162c ffdb 00162e 0e01 MOVLW 0x1 PE = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001630 6ee6 MOVWF 0xe6,0x0 001632 ecb2 CALL 0x2364,0x0 001634 f011 001636 52e5 MOVF 0xe5,0x1,0x0 001638 0e04 MOVLW 0x4 00163a c01d MOVFF 0x1d,0xfdb 00163c ffdb #endif C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 00163e 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 001640 e001 BZ 0x1644 { C:\Projects\UBW\FW\D_143\user\user.c 001642 d00f BRA 0x1662 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c // Now write those values to the data port registers. C:\Projects\UBW\FW\D_143\user\user.c 001644 50df MOVF 0xdf,0x0,0x0 LATA = PA; C:\Projects\UBW\FW\D_143\user\user.c 001646 6e89 MOVWF 0x89,0x0 001648 0e01 MOVLW 0x1 LATB = PB; C:\Projects\UBW\FW\D_143\user\user.c 00164a 50db MOVF 0xdb,0x0,0x0 00164c 6e8a MOVWF 0x8a,0x0 00164e 0e02 MOVLW 0x2 LATC = PC; C:\Projects\UBW\FW\D_143\user\user.c 001650 50db MOVF 0xdb,0x0,0x0 001652 6e8b MOVWF 0x8b,0x0 #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c 001654 0e03 MOVLW 0x3 LATD = PD; C:\Projects\UBW\FW\D_143\user\user.c 001656 50db MOVF 0xdb,0x0,0x0 001658 6e8c MOVWF 0x8c,0x0 00165a 0e04 MOVLW 0x4 LATE = PE; C:\Projects\UBW\FW\D_143\user\user.c 00165c 50db MOVF 0xdb,0x0,0x0 00165e 6e8d MOVWF 0x8d,0x0 #endif C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001660 deb5 RCALL 0x13cc print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 001662 0e05 MOVLW 0x5 } C:\Projects\UBW\FW\D_143\user\user.c 001664 5ce1 SUBWF 0xe1,0x0,0x0 001666 e202 BC 0x166c 001668 6ae1 CLRF 0xe1,0x0 00166a 52e5 MOVF 0xe5,0x1,0x0 00166c 6ee1 MOVWF 0xe1,0x0 00166e 52e5 MOVF 0xe5,0x1,0x0 001670 cfe7 MOVFF 0xfe7,0xfd9 001672 ffd9 001674 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // Read in the three I/O ports (A,B,C) and create C:\Projects\UBW\FW\D_143\user\user.c // a packet to send back with all of values. C:\Projects\UBW\FW\D_143\user\user.c // Example: "I,143,221,010" C:\Projects\UBW\FW\D_143\user\user.c // Remember that on UBW 28 pin boards, we only have C:\Projects\UBW\FW\D_143\user\user.c // Port A bits 0 through 5 C:\Projects\UBW\FW\D_143\user\user.c // Port B bits 0 through 7 C:\Projects\UBW\FW\D_143\user\user.c // Port C bits 0,1,2 and 6,7 C:\Projects\UBW\FW\D_143\user\user.c // And that Port C bits 0,1,2 are used for C:\Projects\UBW\FW\D_143\user\user.c // User1 LED, User2 LED and Program switch respectively. C:\Projects\UBW\FW\D_143\user\user.c // The rest will be read in as zeros. C:\Projects\UBW\FW\D_143\user\user.c void parse_I_packet(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c printf ( C:\Projects\UBW\FW\D_143\user\user.c 001694 0e3c MOVLW 0x3c (far rom char*)"I,%03i,%03i,%03i,%03i,%03i\r\n", C:\Projects\UBW\FW\D_143\user\user.c 001696 6e2a MOVWF 0x2a,0x0 001698 0e41 MOVLW 0x41 00169a 6e2b MOVWF 0x2b,0x0 00169c 6a2c CLRF 0x2c,0x0 00169e c02a MOVFF 0x2a,0xfe6 0016a0 ffe6 0016a2 c02b MOVFF 0x2b,0xfe6 0016a4 ffe6 0016a6 c02c MOVFF 0x2c,0xfe6 0016a8 ffe6 00168e 5080 MOVF 0x80,0x0,0x0 PORTA, C:\Projects\UBW\FW\D_143\user\user.c 001690 6ee6 MOVWF 0xe6,0x0 001692 6ae6 CLRF 0xe6,0x0 001688 5081 MOVF 0x81,0x0,0x0 PORTB, C:\Projects\UBW\FW\D_143\user\user.c 00168a 6ee6 MOVWF 0xe6,0x0 00168c 6ae6 CLRF 0xe6,0x0 001682 5082 MOVF 0x82,0x0,0x0 PORTC, C:\Projects\UBW\FW\D_143\user\user.c 001684 6ee6 MOVWF 0xe6,0x0 001686 6ae6 CLRF 0xe6,0x0 00167c 5083 MOVF 0x83,0x0,0x0 PORTD, C:\Projects\UBW\FW\D_143\user\user.c 00167e 6ee6 MOVWF 0xe6,0x0 001680 6ae6 CLRF 0xe6,0x0 001676 5084 MOVF 0x84,0x0,0x0 PORTE C:\Projects\UBW\FW\D_143\user\user.c 001678 6ee6 MOVWF 0xe6,0x0 ); C:\Projects\UBW\FW\D_143\user\user.c 00167a 6ae6 CLRF 0xe6,0x0 0016aa ec4d CALL 0x449a,0x0 0016ac f022 0016ae 6e2d MOVWF 0x2d,0x0 0016b0 0e0d MOVLW 0xd 0016b2 5ee1 SUBWF 0xe1,0x1,0x0 0016b4 502d MOVF 0x2d,0x0,0x0 #else C:\Projects\UBW\FW\D_143\user\user.c printf ( C:\Projects\UBW\FW\D_143\user\user.c (far rom char*)"I,%03i,%03i,%03i\r\n", C:\Projects\UBW\FW\D_143\user\user.c PORTA, C:\Projects\UBW\FW\D_143\user\user.c PORTB, C:\Projects\UBW\FW\D_143\user\user.c PORTC C:\Projects\UBW\FW\D_143\user\user.c ); C:\Projects\UBW\FW\D_143\user\user.c #endif C:\Projects\UBW\FW\D_143\user\user.c 0016b6 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // All we do here is just print out our version number C:\Projects\UBW\FW\D_143\user\user.c void parse_V_packet(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0016b8 0e60 MOVLW 0x60 printf ((far rom char *)st_version); C:\Projects\UBW\FW\D_143\user\user.c 0016ba 6e2a MOVWF 0x2a,0x0 0016bc 0e47 MOVLW 0x47 0016be 6e2b MOVWF 0x2b,0x0 0016c0 6a2c CLRF 0x2c,0x0 0016c2 c02a MOVFF 0x2a,0xfe6 0016c4 ffe6 0016c6 c02b MOVFF 0x2b,0xfe6 0016c8 ffe6 0016ca c02c MOVFF 0x2c,0xfe6 0016cc ffe6 0016ce ec4d CALL 0x449a,0x0 0016d0 f022 0016d2 52e5 MOVF 0xe5,0x1,0x0 0016d4 52e5 MOVF 0xe5,0x1,0x0 0016d6 52e5 MOVF 0xe5,0x1,0x0 0016d8 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // A is for read Analog inputs C:\Projects\UBW\FW\D_143\user\user.c // Just print out the last analog values for each of the C:\Projects\UBW\FW\D_143\user\user.c // enabled channels. The number of value returned in the C:\Projects\UBW\FW\D_143\user\user.c // A packet depend upon the number of analog inputs enabled. C:\Projects\UBW\FW\D_143\user\user.c // The user can enabled any number of analog inputs between C:\Projects\UBW\FW\D_143\user\user.c // 0 and 12. (none enabled, through all 12 analog inputs enabled). C:\Projects\UBW\FW\D_143\user\user.c // Returned packet will look like "A,0,0,0,0,0,0" if C:\Projects\UBW\FW\D_143\user\user.c // six analog inputs are enabled but they are all C:\Projects\UBW\FW\D_143\user\user.c // grounded. Note that each one is a 10 bit C:\Projects\UBW\FW\D_143\user\user.c // value, where 0 means the intput was at ground, and C:\Projects\UBW\FW\D_143\user\user.c // 1024 means it was at +5 V. (Or whatever the USB +5 C:\Projects\UBW\FW\D_143\user\user.c // pin is at.) C:\Projects\UBW\FW\D_143\user\user.c 0016da cfd9 MOVFF 0xfd9,0xfe6 void parse_A_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 0016dc ffe6 0016de cfe1 MOVFF 0xfe1,0xfd9 0016e0 ffd9 0016e2 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c 0016e4 6adf CLRF 0xdf,0x0 char channel = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Put the beginning of the packet in place C:\Projects\UBW\FW\D_143\user\user.c 0016e6 0e3a MOVLW 0x3a printf ((far rom char *)"A"); C:\Projects\UBW\FW\D_143\user\user.c 0016e8 6e2a MOVWF 0x2a,0x0 0016ea 0e41 MOVLW 0x41 0016ec 6e2b MOVWF 0x2b,0x0 0016ee 6a2c CLRF 0x2c,0x0 0016f0 c02a MOVFF 0x2a,0xfe6 0016f2 ffe6 0016f4 c02b MOVFF 0x2b,0xfe6 0016f6 ffe6 0016f8 c02c MOVFF 0x2c,0xfe6 0016fa ffe6 0016fc ec4d CALL 0x449a,0x0 0016fe f022 001700 52e5 MOVF 0xe5,0x1,0x0 001702 52e5 MOVF 0xe5,0x1,0x0 001704 52e5 MOVF 0xe5,0x1,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Now add each analog value C:\Projects\UBW\FW\D_143\user\user.c 001706 6adf CLRF 0xdf,0x0 for (channel = 0; channel < AnalogEnable; channel++) C:\Projects\UBW\FW\D_143\user\user.c 001708 500c MOVF 0xc,0x0,0x0 00170a 5cdf SUBWF 0xdf,0x0,0x0 00170c e232 BC 0x1772 00176e 2adf INCF 0xdf,0x1,0x0 001770 d7cb BRA 0x1708 { C:\Projects\UBW\FW\D_143\user\user.c printf( C:\Projects\UBW\FW\D_143\user\user.c (far rom char *)",%04u" C:\Projects\UBW\FW\D_143\user\user.c 00170e cfdf MOVFF 0xfdf,0x2a ,ISR_A_FIFO[channel][ISR_A_FIFO_out] C:\Projects\UBW\FW\D_143\user\user.c 001710 f02a 001712 6a2b CLRF 0x2b,0x0 001714 be2a BTFSC 0x2a,0x7,0x0 001716 682b SETF 0x2b,0x0 001718 0e06 MOVLW 0x6 00171a 022b MULWF 0x2b,0x0 00171c cff3 MOVFF 0xff3,0x2b 00171e f02b 001720 0e06 MOVLW 0x6 001722 022a MULWF 0x2a,0x0 001724 cff3 MOVFF 0xff3,0x2a 001726 f02a 001728 50f4 MOVF 0xf4,0x0,0x0 00172a 262b ADDWF 0x2b,0x1,0x0 00172c 0e00 MOVLW 0x0 00172e 262a ADDWF 0x2a,0x1,0x0 001730 0e01 MOVLW 0x1 001732 222b ADDWFC 0x2b,0x1,0x0 001734 500a MOVF 0xa,0x0,0x0 001736 0d02 MULLW 0x2 001738 502a MOVF 0x2a,0x0,0x0 00173a 24f3 ADDWF 0xf3,0x0,0x0 00173c 6ee9 MOVWF 0xe9,0x0 00173e 502b MOVF 0x2b,0x0,0x0 001740 20f4 ADDWFC 0xf4,0x0,0x0 001742 6eea MOVWF 0xea,0x0 00174c 0e34 MOVLW 0x34 00174e 6e2c MOVWF 0x2c,0x0 001750 0e41 MOVLW 0x41 001752 6e2d MOVWF 0x2d,0x0 001754 6a2e CLRF 0x2e,0x0 001756 c02c MOVFF 0x2c,0xfe6 001758 ffe6 00175a c02d MOVFF 0x2d,0xfe6 00175c ffe6 00175e c02e MOVFF 0x2e,0xfe6 001760 ffe6 001744 cfee MOVFF 0xfee,0xfe6 ); C:\Projects\UBW\FW\D_143\user\user.c 001746 ffe6 001748 cfef MOVFF 0xfef,0xfe6 00174a ffe6 001762 ec4d CALL 0x449a,0x0 001764 f022 001766 6e2f MOVWF 0x2f,0x0 001768 0e05 MOVLW 0x5 00176a 5ee1 SUBWF 0xe1,0x1,0x0 00176c 502f MOVF 0x2f,0x0,0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Add \r\n and terminating zero. C:\Projects\UBW\FW\D_143\user\user.c 001772 0e5d MOVLW 0x5d printf ((far rom char *)st_LFCR); C:\Projects\UBW\FW\D_143\user\user.c 001774 6e2a MOVWF 0x2a,0x0 001776 0e47 MOVLW 0x47 001778 6e2b MOVWF 0x2b,0x0 00177a 6a2c CLRF 0x2c,0x0 00177c c02a MOVFF 0x2a,0xfe6 00177e ffe6 001780 c02b MOVFF 0x2b,0xfe6 001782 ffe6 001784 c02c MOVFF 0x2c,0xfe6 001786 ffe6 001788 ec4d CALL 0x449a,0x0 00178a f022 00178c 52e5 MOVF 0xe5,0x1,0x0 00178e 52e5 MOVF 0xe5,0x1,0x0 001790 52e5 MOVF 0xe5,0x1,0x0 001792 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001794 52e5 MOVF 0xe5,0x1,0x0 001796 cfe7 MOVFF 0xfe7,0xfd9 001798 ffd9 00179a 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // MW is for Memory Write C:\Projects\UBW\FW\D_143\user\user.c // "MW,," C:\Projects\UBW\FW\D_143\user\user.c // is a decimal value between 0 and 4096 indicating the RAM address to write to C:\Projects\UBW\FW\D_143\user\user.c // is a decimal value between 0 and 255 that is the value to write C:\Projects\UBW\FW\D_143\user\user.c 00179c cfd9 MOVFF 0xfd9,0xfe6 void parse_MW_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 00179e ffe6 0017a0 cfe1 MOVFF 0xfe1,0xfd9 0017a2 ffd9 0017a4 0e03 MOVLW 0x3 0017a6 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned int location; C:\Projects\UBW\FW\D_143\user\user.c unsigned char value; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 0017a8 0e03 MOVLW 0x3 location = extract_number (kUINT); C:\Projects\UBW\FW\D_143\user\user.c 0017aa 6ee6 MOVWF 0xe6,0x0 0017ac ecb2 CALL 0x2364,0x0 0017ae f011 0017b0 52e5 MOVF 0xe5,0x1,0x0 0017b2 c01d MOVFF 0x1d,0xfde 0017b4 ffde 0017b6 c01e MOVFF 0x1e,0xfdd 0017b8 ffdd 0017ba 0e01 MOVLW 0x1 value = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 0017bc 6ee6 MOVWF 0xe6,0x0 0017be ecb2 CALL 0x2364,0x0 0017c0 f011 0017c2 52e5 MOVF 0xe5,0x1,0x0 0017c4 0e02 MOVLW 0x2 0017c6 c01d MOVFF 0x1d,0xfdb 0017c8 ffdb C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 0017ca 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 0017cc e001 BZ 0x17d0 { C:\Projects\UBW\FW\D_143\user\user.c 0017ce d011 BRA 0x17f2 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c // Limit check the address and write the byte in C:\Projects\UBW\FW\D_143\user\user.c 0017d0 cfde MOVFF 0xfde,0x2a if (location < 4096) C:\Projects\UBW\FW\D_143\user\user.c 0017d2 f02a 0017d4 cfdd MOVFF 0xfdd,0x2b 0017d6 f02b 0017d8 0e00 MOVLW 0x0 0017da 5c2a SUBWF 0x2a,0x0,0x0 0017dc 0e10 MOVLW 0x10 0017de 582b SUBWFB 0x2b,0x0,0x0 0017e0 e207 BC 0x17f0 { C:\Projects\UBW\FW\D_143\user\user.c 0017e2 cfde MOVFF 0xfde,0xfe9 *((unsigned char *)location) = value; C:\Projects\UBW\FW\D_143\user\user.c 0017e4 ffe9 0017e6 cfdd MOVFF 0xfdd,0xfea 0017e8 ffea 0017ea 0e02 MOVLW 0x2 0017ec cfdb MOVFF 0xfdb,0xfef 0017ee ffef } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 0017f0 dded RCALL 0x13cc print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 0017f2 0e03 MOVLW 0x3 } C:\Projects\UBW\FW\D_143\user\user.c 0017f4 5ce1 SUBWF 0xe1,0x0,0x0 0017f6 e202 BC 0x17fc 0017f8 6ae1 CLRF 0xe1,0x0 0017fa 52e5 MOVF 0xe5,0x1,0x0 0017fc 6ee1 MOVWF 0xe1,0x0 0017fe 52e5 MOVF 0xe5,0x1,0x0 001800 cfe7 MOVFF 0xfe7,0xfd9 001802 ffd9 001804 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // MR is for Memory Read C:\Projects\UBW\FW\D_143\user\user.c // "MW," C:\Projects\UBW\FW\D_143\user\user.c // is a decimal value between 0 and 4096 indicating the RAM address to read from C:\Projects\UBW\FW\D_143\user\user.c // The UBW will then send a "MR," packet back to the PC C:\Projects\UBW\FW\D_143\user\user.c // where is the byte value read from the address C:\Projects\UBW\FW\D_143\user\user.c 001806 cfd9 MOVFF 0xfd9,0xfe6 void parse_MR_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 001808 ffe6 00180a cfe1 MOVFF 0xfe1,0xfd9 00180c ffd9 00180e 0e03 MOVLW 0x3 001810 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned int location; C:\Projects\UBW\FW\D_143\user\user.c unsigned char value; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001812 0e03 MOVLW 0x3 location = extract_number (kUINT); C:\Projects\UBW\FW\D_143\user\user.c 001814 6ee6 MOVWF 0xe6,0x0 001816 ecb2 CALL 0x2364,0x0 001818 f011 00181a 52e5 MOVF 0xe5,0x1,0x0 00181c c01d MOVFF 0x1d,0xfde 00181e ffde 001820 c01e MOVFF 0x1e,0xfdd 001822 ffdd C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 001824 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 001826 e001 BZ 0x182a { C:\Projects\UBW\FW\D_143\user\user.c 001828 d025 BRA 0x1874 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Limit check the address and write the byte in C:\Projects\UBW\FW\D_143\user\user.c 00182a cfde MOVFF 0xfde,0x2a if (location < 4096) C:\Projects\UBW\FW\D_143\user\user.c 00182c f02a 00182e cfdd MOVFF 0xfdd,0x2b 001830 f02b 001832 0e00 MOVLW 0x0 001834 5c2a SUBWF 0x2a,0x0,0x0 001836 0e10 MOVLW 0x10 001838 582b SUBWFB 0x2b,0x0,0x0 00183a e207 BC 0x184a { C:\Projects\UBW\FW\D_143\user\user.c 00183c cfde MOVFF 0xfde,0xfe9 value = *((unsigned char *)location); C:\Projects\UBW\FW\D_143\user\user.c 00183e ffe9 001840 cfdd MOVFF 0xfdd,0xfea 001842 ffea 001844 0e02 MOVLW 0x2 001846 cfef MOVFF 0xfef,0xfdb 001848 ffdb } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Now send back the MR packet C:\Projects\UBW\FW\D_143\user\user.c printf ( C:\Projects\UBW\FW\D_143\user\user.c (far rom char *)"MR,%03u\r\n" C:\Projects\UBW\FW\D_143\user\user.c 001852 0e2a MOVLW 0x2a ,value C:\Projects\UBW\FW\D_143\user\user.c 001854 6e2a MOVWF 0x2a,0x0 001856 0e41 MOVLW 0x41 001858 6e2b MOVWF 0x2b,0x0 00185a 6a2c CLRF 0x2c,0x0 00185c c02a MOVFF 0x2a,0xfe6 00185e ffe6 001860 c02b MOVFF 0x2b,0xfe6 001862 ffe6 001864 c02c MOVFF 0x2c,0xfe6 001866 ffe6 00184a 0e02 MOVLW 0x2 ); C:\Projects\UBW\FW\D_143\user\user.c 00184c cfdb MOVFF 0xfdb,0xfe6 00184e ffe6 001850 6ae6 CLRF 0xe6,0x0 001868 ec4d CALL 0x449a,0x0 00186a f022 00186c 6e2d MOVWF 0x2d,0x0 00186e 0e05 MOVLW 0x5 001870 5ee1 SUBWF 0xe1,0x1,0x0 001872 502d MOVF 0x2d,0x0,0x0 001874 0e03 MOVLW 0x3 } C:\Projects\UBW\FW\D_143\user\user.c 001876 5ce1 SUBWF 0xe1,0x0,0x0 001878 e202 BC 0x187e 00187a 6ae1 CLRF 0xe1,0x0 00187c 52e5 MOVF 0xe5,0x1,0x0 00187e 6ee1 MOVWF 0xe1,0x0 001880 52e5 MOVF 0xe5,0x1,0x0 001882 cfe7 MOVFF 0xfe7,0xfd9 001884 ffd9 001886 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // PD is for Pin Direction C:\Projects\UBW\FW\D_143\user\user.c // "PD,,," C:\Projects\UBW\FW\D_143\user\user.c // is "A", "B", "C" and indicates the port C:\Projects\UBW\FW\D_143\user\user.c // is a number between 0 and 7 and indicates which pin to change direction on C:\Projects\UBW\FW\D_143\user\user.c // is "1" for input, "0" for output C:\Projects\UBW\FW\D_143\user\user.c 001888 cfd9 MOVFF 0xfd9,0xfe6 void parse_PD_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 00188a ffe6 00188c cfe1 MOVFF 0xfe1,0xfd9 00188e ffd9 001890 0e03 MOVLW 0x3 001892 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char port; C:\Projects\UBW\FW\D_143\user\user.c unsigned char pin; C:\Projects\UBW\FW\D_143\user\user.c unsigned char direction; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001894 0e05 MOVLW 0x5 port = extract_number (kUCASE_ASCII_CHAR); C:\Projects\UBW\FW\D_143\user\user.c 001896 6ee6 MOVWF 0xe6,0x0 001898 ecb2 CALL 0x2364,0x0 00189a f011 00189c 52e5 MOVF 0xe5,0x1,0x0 00189e 501d MOVF 0x1d,0x0,0x0 0018a0 6edf MOVWF 0xdf,0x0 0018a2 0e01 MOVLW 0x1 pin = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 0018a4 6ee6 MOVWF 0xe6,0x0 0018a6 ecb2 CALL 0x2364,0x0 0018a8 f011 0018aa 52e5 MOVF 0xe5,0x1,0x0 0018ac 0e01 MOVLW 0x1 0018ae c01d MOVFF 0x1d,0xfdb 0018b0 ffdb 0018b2 0e01 MOVLW 0x1 direction = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 0018b4 6ee6 MOVWF 0xe6,0x0 0018b6 ecb2 CALL 0x2364,0x0 0018b8 f011 0018ba 52e5 MOVF 0xe5,0x1,0x0 0018bc 0e02 MOVLW 0x2 0018be c01d MOVFF 0x1d,0xfdb 0018c0 ffdb C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 0018c2 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 0018c4 e001 BZ 0x18c8 { C:\Projects\UBW\FW\D_143\user\user.c 0018c6 d0b4 BRA 0x1a30 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Limit check the parameters C:\Projects\UBW\FW\D_143\user\user.c 0018c8 0e02 MOVLW 0x2 if (direction > 1) C:\Projects\UBW\FW\D_143\user\user.c 0018ca 50db MOVF 0xdb,0x0,0x0 0018cc 0801 SUBLW 0x1 0018ce e202 BC 0x18d4 { C:\Projects\UBW\FW\D_143\user\user.c 0018d0 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 0018d2 d0ae BRA 0x1a30 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0018d4 0e01 MOVLW 0x1 if (pin > 7) C:\Projects\UBW\FW\D_143\user\user.c 0018d6 50db MOVF 0xdb,0x0,0x0 0018d8 0807 SUBLW 0x7 0018da e202 BC 0x18e0 { C:\Projects\UBW\FW\D_143\user\user.c 0018dc 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 0018de d0a8 BRA 0x1a30 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0018e0 0e41 MOVLW 0x41 if ('A' == port) C:\Projects\UBW\FW\D_143\user\user.c 0018e2 6e2a MOVWF 0x2a,0x0 0018e4 50df MOVF 0xdf,0x0,0x0 0018e6 5c2a SUBWF 0x2a,0x0,0x0 0018e8 e11c BNZ 0x1922 { C:\Projects\UBW\FW\D_143\user\user.c 0018ea 0e02 MOVLW 0x2 if (0 == direction) C:\Projects\UBW\FW\D_143\user\user.c 0018ec 50db MOVF 0xdb,0x0,0x0 0018ee e10d BNZ 0x190a { C:\Projects\UBW\FW\D_143\user\user.c 0018f0 0e01 MOVLW 0x1 bitclr (DDRA, pin); C:\Projects\UBW\FW\D_143\user\user.c 0018f2 6ef3 MOVWF 0xf3,0x0 0018f4 0e01 MOVLW 0x1 0018f6 50db MOVF 0xdb,0x0,0x0 0018f8 e004 BZ 0x1902 0018fa 90d8 BCF 0xd8,0x0,0x0 0018fc 36f3 RLCF 0xf3,0x1,0x0 0018fe 06e8 DECF 0xe8,0x1,0x0 001900 e1fc BNZ 0x18fa 001902 50f3 MOVF 0xf3,0x0,0x0 001904 1ce8 COMF 0xe8,0x0,0x0 001906 1692 ANDWF 0x92,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001908 d00b BRA 0x1920 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 00190a 0e01 MOVLW 0x1 bitset (DDRA, pin); C:\Projects\UBW\FW\D_143\user\user.c 00190c 6ef3 MOVWF 0xf3,0x0 00190e 0e01 MOVLW 0x1 001910 50db MOVF 0xdb,0x0,0x0 001912 e004 BZ 0x191c 001914 90d8 BCF 0xd8,0x0,0x0 001916 36f3 RLCF 0xf3,0x1,0x0 001918 06e8 DECF 0xe8,0x1,0x0 00191a e1fc BNZ 0x1914 00191c 50f3 MOVF 0xf3,0x0,0x0 00191e 1292 IORWF 0x92,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001920 d086 BRA 0x1a2e else if ('B' == port) C:\Projects\UBW\FW\D_143\user\user.c 001922 0e42 MOVLW 0x42 001924 6e2a MOVWF 0x2a,0x0 001926 50df MOVF 0xdf,0x0,0x0 001928 5c2a SUBWF 0x2a,0x0,0x0 00192a e11c BNZ 0x1964 { C:\Projects\UBW\FW\D_143\user\user.c 00192c 0e02 MOVLW 0x2 if (0 == direction) C:\Projects\UBW\FW\D_143\user\user.c 00192e 50db MOVF 0xdb,0x0,0x0 001930 e10d BNZ 0x194c { C:\Projects\UBW\FW\D_143\user\user.c 001932 0e01 MOVLW 0x1 bitclr (DDRB, pin); C:\Projects\UBW\FW\D_143\user\user.c 001934 6ef3 MOVWF 0xf3,0x0 001936 0e01 MOVLW 0x1 001938 50db MOVF 0xdb,0x0,0x0 00193a e004 BZ 0x1944 00193c 90d8 BCF 0xd8,0x0,0x0 00193e 36f3 RLCF 0xf3,0x1,0x0 001940 06e8 DECF 0xe8,0x1,0x0 001942 e1fc BNZ 0x193c 001944 50f3 MOVF 0xf3,0x0,0x0 001946 1ce8 COMF 0xe8,0x0,0x0 001948 1693 ANDWF 0x93,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 00194a d00b BRA 0x1962 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 00194c 0e01 MOVLW 0x1 bitset (DDRB, pin); C:\Projects\UBW\FW\D_143\user\user.c 00194e 6ef3 MOVWF 0xf3,0x0 001950 0e01 MOVLW 0x1 001952 50db MOVF 0xdb,0x0,0x0 001954 e004 BZ 0x195e 001956 90d8 BCF 0xd8,0x0,0x0 001958 36f3 RLCF 0xf3,0x1,0x0 00195a 06e8 DECF 0xe8,0x1,0x0 00195c e1fc BNZ 0x1956 00195e 50f3 MOVF 0xf3,0x0,0x0 001960 1293 IORWF 0x93,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001962 d065 BRA 0x1a2e else if ('C' == port) C:\Projects\UBW\FW\D_143\user\user.c 001964 0e43 MOVLW 0x43 001966 6e2a MOVWF 0x2a,0x0 001968 50df MOVF 0xdf,0x0,0x0 00196a 5c2a SUBWF 0x2a,0x0,0x0 00196c e11c BNZ 0x19a6 { C:\Projects\UBW\FW\D_143\user\user.c 00196e 0e02 MOVLW 0x2 if (0 == direction) C:\Projects\UBW\FW\D_143\user\user.c 001970 50db MOVF 0xdb,0x0,0x0 001972 e10d BNZ 0x198e { C:\Projects\UBW\FW\D_143\user\user.c 001974 0e01 MOVLW 0x1 bitclr (DDRC, pin); C:\Projects\UBW\FW\D_143\user\user.c 001976 6ef3 MOVWF 0xf3,0x0 001978 0e01 MOVLW 0x1 00197a 50db MOVF 0xdb,0x0,0x0 00197c e004 BZ 0x1986 00197e 90d8 BCF 0xd8,0x0,0x0 001980 36f3 RLCF 0xf3,0x1,0x0 001982 06e8 DECF 0xe8,0x1,0x0 001984 e1fc BNZ 0x197e 001986 50f3 MOVF 0xf3,0x0,0x0 001988 1ce8 COMF 0xe8,0x0,0x0 00198a 1694 ANDWF 0x94,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 00198c d00b BRA 0x19a4 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 00198e 0e01 MOVLW 0x1 bitset (DDRC, pin); C:\Projects\UBW\FW\D_143\user\user.c 001990 6ef3 MOVWF 0xf3,0x0 001992 0e01 MOVLW 0x1 001994 50db MOVF 0xdb,0x0,0x0 001996 e004 BZ 0x19a0 001998 90d8 BCF 0xd8,0x0,0x0 00199a 36f3 RLCF 0xf3,0x1,0x0 00199c 06e8 DECF 0xe8,0x1,0x0 00199e e1fc BNZ 0x1998 0019a0 50f3 MOVF 0xf3,0x0,0x0 0019a2 1294 IORWF 0x94,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c 0019a4 d044 BRA 0x1a2e else if ('D' == port) C:\Projects\UBW\FW\D_143\user\user.c 0019a6 0e44 MOVLW 0x44 0019a8 6e2a MOVWF 0x2a,0x0 0019aa 50df MOVF 0xdf,0x0,0x0 0019ac 5c2a SUBWF 0x2a,0x0,0x0 0019ae e11c BNZ 0x19e8 { C:\Projects\UBW\FW\D_143\user\user.c 0019b0 0e02 MOVLW 0x2 if (0 == direction) C:\Projects\UBW\FW\D_143\user\user.c 0019b2 50db MOVF 0xdb,0x0,0x0 0019b4 e10d BNZ 0x19d0 { C:\Projects\UBW\FW\D_143\user\user.c 0019b6 0e01 MOVLW 0x1 bitclr (DDRD, pin); C:\Projects\UBW\FW\D_143\user\user.c 0019b8 6ef3 MOVWF 0xf3,0x0 0019ba 0e01 MOVLW 0x1 0019bc 50db MOVF 0xdb,0x0,0x0 0019be e004 BZ 0x19c8 0019c0 90d8 BCF 0xd8,0x0,0x0 0019c2 36f3 RLCF 0xf3,0x1,0x0 0019c4 06e8 DECF 0xe8,0x1,0x0 0019c6 e1fc BNZ 0x19c0 0019c8 50f3 MOVF 0xf3,0x0,0x0 0019ca 1ce8 COMF 0xe8,0x0,0x0 0019cc 1695 ANDWF 0x95,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 0019ce d00b BRA 0x19e6 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0019d0 0e01 MOVLW 0x1 bitset (DDRD, pin); C:\Projects\UBW\FW\D_143\user\user.c 0019d2 6ef3 MOVWF 0xf3,0x0 0019d4 0e01 MOVLW 0x1 0019d6 50db MOVF 0xdb,0x0,0x0 0019d8 e004 BZ 0x19e2 0019da 90d8 BCF 0xd8,0x0,0x0 0019dc 36f3 RLCF 0xf3,0x1,0x0 0019de 06e8 DECF 0xe8,0x1,0x0 0019e0 e1fc BNZ 0x19da 0019e2 50f3 MOVF 0xf3,0x0,0x0 0019e4 1295 IORWF 0x95,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0019e6 d023 BRA 0x1a2e else if ('E' == port) C:\Projects\UBW\FW\D_143\user\user.c 0019e8 0e45 MOVLW 0x45 0019ea 6e2a MOVWF 0x2a,0x0 0019ec 50df MOVF 0xdf,0x0,0x0 0019ee 5c2a SUBWF 0x2a,0x0,0x0 0019f0 e11c BNZ 0x1a2a { C:\Projects\UBW\FW\D_143\user\user.c 0019f2 0e02 MOVLW 0x2 if (0 == direction) C:\Projects\UBW\FW\D_143\user\user.c 0019f4 50db MOVF 0xdb,0x0,0x0 0019f6 e10d BNZ 0x1a12 { C:\Projects\UBW\FW\D_143\user\user.c 0019f8 0e01 MOVLW 0x1 bitclr (DDRE, pin); C:\Projects\UBW\FW\D_143\user\user.c 0019fa 6ef3 MOVWF 0xf3,0x0 0019fc 0e01 MOVLW 0x1 0019fe 50db MOVF 0xdb,0x0,0x0 001a00 e004 BZ 0x1a0a 001a02 90d8 BCF 0xd8,0x0,0x0 001a04 36f3 RLCF 0xf3,0x1,0x0 001a06 06e8 DECF 0xe8,0x1,0x0 001a08 e1fc BNZ 0x1a02 001a0a 50f3 MOVF 0xf3,0x0,0x0 001a0c 1ce8 COMF 0xe8,0x0,0x0 001a0e 1696 ANDWF 0x96,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001a10 d00b BRA 0x1a28 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001a12 0e01 MOVLW 0x1 bitset (DDRE, pin); C:\Projects\UBW\FW\D_143\user\user.c 001a14 6ef3 MOVWF 0xf3,0x0 001a16 0e01 MOVLW 0x1 001a18 50db MOVF 0xdb,0x0,0x0 001a1a e004 BZ 0x1a24 001a1c 90d8 BCF 0xd8,0x0,0x0 001a1e 36f3 RLCF 0xf3,0x1,0x0 001a20 06e8 DECF 0xe8,0x1,0x0 001a22 e1fc BNZ 0x1a1c 001a24 50f3 MOVF 0xf3,0x0,0x0 001a26 1296 IORWF 0x96,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c #endif C:\Projects\UBW\FW\D_143\user\user.c 001a28 d002 BRA 0x1a2e else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001a2a 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001a2c d001 BRA 0x1a30 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001a2e dcce RCALL 0x13cc print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 001a30 0e03 MOVLW 0x3 } C:\Projects\UBW\FW\D_143\user\user.c 001a32 5ce1 SUBWF 0xe1,0x0,0x0 001a34 e202 BC 0x1a3a 001a36 6ae1 CLRF 0xe1,0x0 001a38 52e5 MOVF 0xe5,0x1,0x0 001a3a 6ee1 MOVWF 0xe1,0x0 001a3c 52e5 MOVF 0xe5,0x1,0x0 001a3e cfe7 MOVFF 0xfe7,0xfd9 001a40 ffd9 001a42 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // PI is for Pin Input C:\Projects\UBW\FW\D_143\user\user.c // "PI,," C:\Projects\UBW\FW\D_143\user\user.c // is "A", "B", "C" and indicates the port C:\Projects\UBW\FW\D_143\user\user.c // is a number between 0 and 7 and indicates which pin to read C:\Projects\UBW\FW\D_143\user\user.c // The command returns a "PI," packet, C:\Projects\UBW\FW\D_143\user\user.c // where is the value (0 or 1 for digital, 0 to 1024 for Analog) C:\Projects\UBW\FW\D_143\user\user.c // value for that pin. C:\Projects\UBW\FW\D_143\user\user.c 001a44 cfd9 MOVFF 0xfd9,0xfe6 void parse_PI_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 001a46 ffe6 001a48 cfe1 MOVFF 0xfe1,0xfd9 001a4a ffd9 001a4c 0e03 MOVLW 0x3 001a4e 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char port; C:\Projects\UBW\FW\D_143\user\user.c unsigned char pin; C:\Projects\UBW\FW\D_143\user\user.c 001a50 0e02 MOVLW 0x2 unsigned char value = 0; C:\Projects\UBW\FW\D_143\user\user.c 001a52 6adb CLRF 0xdb,0x0 C:\Projects\UBW\FW\D_143\user\user.c 001a54 0e05 MOVLW 0x5 port = extract_number (kUCASE_ASCII_CHAR); C:\Projects\UBW\FW\D_143\user\user.c 001a56 6ee6 MOVWF 0xe6,0x0 001a58 ecb2 CALL 0x2364,0x0 001a5a f011 001a5c 52e5 MOVF 0xe5,0x1,0x0 001a5e 501d MOVF 0x1d,0x0,0x0 001a60 6edf MOVWF 0xdf,0x0 001a62 0e01 MOVLW 0x1 pin = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001a64 6ee6 MOVWF 0xe6,0x0 001a66 ecb2 CALL 0x2364,0x0 001a68 f011 001a6a 52e5 MOVF 0xe5,0x1,0x0 001a6c 0e01 MOVLW 0x1 001a6e c01d MOVFF 0x1d,0xfdb 001a70 ffdb C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 001a72 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 001a74 e001 BZ 0x1a78 { C:\Projects\UBW\FW\D_143\user\user.c 001a76 d086 BRA 0x1b84 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Limit check the parameters C:\Projects\UBW\FW\D_143\user\user.c 001a78 0e01 MOVLW 0x1 if (pin > 7) C:\Projects\UBW\FW\D_143\user\user.c 001a7a 50db MOVF 0xdb,0x0,0x0 001a7c 0807 SUBLW 0x7 001a7e e202 BC 0x1a84 { C:\Projects\UBW\FW\D_143\user\user.c 001a80 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001a82 d080 BRA 0x1b84 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Then test the bit in question based upon port C:\Projects\UBW\FW\D_143\user\user.c 001a84 0e41 MOVLW 0x41 if ('A' == port) C:\Projects\UBW\FW\D_143\user\user.c 001a86 6e2a MOVWF 0x2a,0x0 001a88 50df MOVF 0xdf,0x0,0x0 001a8a 5c2a SUBWF 0x2a,0x0,0x0 001a8c e110 BNZ 0x1aae { C:\Projects\UBW\FW\D_143\user\user.c 001a8e 0e01 MOVLW 0x1 value = bittst (PORTA, pin); C:\Projects\UBW\FW\D_143\user\user.c 001a90 6ef3 MOVWF 0xf3,0x0 001a92 0e01 MOVLW 0x1 001a94 50db MOVF 0xdb,0x0,0x0 001a96 e004 BZ 0x1aa0 001a98 90d8 BCF 0xd8,0x0,0x0 001a9a 36f3 RLCF 0xf3,0x1,0x0 001a9c 06e8 DECF 0xe8,0x1,0x0 001a9e e1fc BNZ 0x1a98 001aa0 50f3 MOVF 0xf3,0x0,0x0 001aa2 1480 ANDWF 0x80,0x0,0x0 001aa4 6ee7 MOVWF 0xe7,0x0 001aa6 0e02 MOVLW 0x2 001aa8 cfe7 MOVFF 0xfe7,0xfdb 001aaa ffdb } C:\Projects\UBW\FW\D_143\user\user.c 001aac d056 BRA 0x1b5a else if ('B' == port) C:\Projects\UBW\FW\D_143\user\user.c 001aae 0e42 MOVLW 0x42 001ab0 6e2a MOVWF 0x2a,0x0 001ab2 50df MOVF 0xdf,0x0,0x0 001ab4 5c2a SUBWF 0x2a,0x0,0x0 001ab6 e110 BNZ 0x1ad8 { C:\Projects\UBW\FW\D_143\user\user.c 001ab8 0e01 MOVLW 0x1 value = bittst (PORTB, pin); C:\Projects\UBW\FW\D_143\user\user.c 001aba 6ef3 MOVWF 0xf3,0x0 001abc 0e01 MOVLW 0x1 001abe 50db MOVF 0xdb,0x0,0x0 001ac0 e004 BZ 0x1aca 001ac2 90d8 BCF 0xd8,0x0,0x0 001ac4 36f3 RLCF 0xf3,0x1,0x0 001ac6 06e8 DECF 0xe8,0x1,0x0 001ac8 e1fc BNZ 0x1ac2 001aca 50f3 MOVF 0xf3,0x0,0x0 001acc 1481 ANDWF 0x81,0x0,0x0 001ace 6ee7 MOVWF 0xe7,0x0 001ad0 0e02 MOVLW 0x2 001ad2 cfe7 MOVFF 0xfe7,0xfdb 001ad4 ffdb } C:\Projects\UBW\FW\D_143\user\user.c 001ad6 d041 BRA 0x1b5a else if ('C' == port) C:\Projects\UBW\FW\D_143\user\user.c 001ad8 0e43 MOVLW 0x43 001ada 6e2a MOVWF 0x2a,0x0 001adc 50df MOVF 0xdf,0x0,0x0 001ade 5c2a SUBWF 0x2a,0x0,0x0 001ae0 e110 BNZ 0x1b02 { C:\Projects\UBW\FW\D_143\user\user.c 001ae2 0e01 MOVLW 0x1 value = bittst (PORTC, pin); C:\Projects\UBW\FW\D_143\user\user.c 001ae4 6ef3 MOVWF 0xf3,0x0 001ae6 0e01 MOVLW 0x1 001ae8 50db MOVF 0xdb,0x0,0x0 001aea e004 BZ 0x1af4 001aec 90d8 BCF 0xd8,0x0,0x0 001aee 36f3 RLCF 0xf3,0x1,0x0 001af0 06e8 DECF 0xe8,0x1,0x0 001af2 e1fc BNZ 0x1aec 001af4 50f3 MOVF 0xf3,0x0,0x0 001af6 1482 ANDWF 0x82,0x0,0x0 001af8 6ee7 MOVWF 0xe7,0x0 001afa 0e02 MOVLW 0x2 001afc cfe7 MOVFF 0xfe7,0xfdb 001afe ffdb } C:\Projects\UBW\FW\D_143\user\user.c #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c 001b00 d02c BRA 0x1b5a else if ('D' == port) C:\Projects\UBW\FW\D_143\user\user.c 001b02 0e44 MOVLW 0x44 001b04 6e2a MOVWF 0x2a,0x0 001b06 50df MOVF 0xdf,0x0,0x0 001b08 5c2a SUBWF 0x2a,0x0,0x0 001b0a e110 BNZ 0x1b2c { C:\Projects\UBW\FW\D_143\user\user.c 001b0c 0e01 MOVLW 0x1 value = bittst (PORTD, pin); C:\Projects\UBW\FW\D_143\user\user.c 001b0e 6ef3 MOVWF 0xf3,0x0 001b10 0e01 MOVLW 0x1 001b12 50db MOVF 0xdb,0x0,0x0 001b14 e004 BZ 0x1b1e 001b16 90d8 BCF 0xd8,0x0,0x0 001b18 36f3 RLCF 0xf3,0x1,0x0 001b1a 06e8 DECF 0xe8,0x1,0x0 001b1c e1fc BNZ 0x1b16 001b1e 50f3 MOVF 0xf3,0x0,0x0 001b20 1483 ANDWF 0x83,0x0,0x0 001b22 6ee7 MOVWF 0xe7,0x0 001b24 0e02 MOVLW 0x2 001b26 cfe7 MOVFF 0xfe7,0xfdb 001b28 ffdb } C:\Projects\UBW\FW\D_143\user\user.c 001b2a d017 BRA 0x1b5a else if ('E' == port) C:\Projects\UBW\FW\D_143\user\user.c 001b2c 0e45 MOVLW 0x45 001b2e 6e2a MOVWF 0x2a,0x0 001b30 50df MOVF 0xdf,0x0,0x0 001b32 5c2a SUBWF 0x2a,0x0,0x0 001b34 e110 BNZ 0x1b56 { C:\Projects\UBW\FW\D_143\user\user.c 001b36 0e01 MOVLW 0x1 value = bittst (PORTE, pin); C:\Projects\UBW\FW\D_143\user\user.c 001b38 6ef3 MOVWF 0xf3,0x0 001b3a 0e01 MOVLW 0x1 001b3c 50db MOVF 0xdb,0x0,0x0 001b3e e004 BZ 0x1b48 001b40 90d8 BCF 0xd8,0x0,0x0 001b42 36f3 RLCF 0xf3,0x1,0x0 001b44 06e8 DECF 0xe8,0x1,0x0 001b46 e1fc BNZ 0x1b40 001b48 50f3 MOVF 0xf3,0x0,0x0 001b4a 1484 ANDWF 0x84,0x0,0x0 001b4c 6ee7 MOVWF 0xe7,0x0 001b4e 0e02 MOVLW 0x2 001b50 cfe7 MOVFF 0xfe7,0xfdb 001b52 ffdb } C:\Projects\UBW\FW\D_143\user\user.c #endif C:\Projects\UBW\FW\D_143\user\user.c 001b54 d002 BRA 0x1b5a else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001b56 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001b58 d015 BRA 0x1b84 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Now send back our response C:\Projects\UBW\FW\D_143\user\user.c printf( C:\Projects\UBW\FW\D_143\user\user.c (far rom char *)"PI,%1u\r\n" C:\Projects\UBW\FW\D_143\user\user.c 001b62 0e21 MOVLW 0x21 ,value C:\Projects\UBW\FW\D_143\user\user.c 001b64 6e2a MOVWF 0x2a,0x0 001b66 0e41 MOVLW 0x41 001b68 6e2b MOVWF 0x2b,0x0 001b6a 6a2c CLRF 0x2c,0x0 001b6c c02a MOVFF 0x2a,0xfe6 001b6e ffe6 001b70 c02b MOVFF 0x2b,0xfe6 001b72 ffe6 001b74 c02c MOVFF 0x2c,0xfe6 001b76 ffe6 001b5a 0e02 MOVLW 0x2 ); C:\Projects\UBW\FW\D_143\user\user.c 001b5c cfdb MOVFF 0xfdb,0xfe6 001b5e ffe6 001b60 6ae6 CLRF 0xe6,0x0 001b78 ec4d CALL 0x449a,0x0 001b7a f022 001b7c 6e2d MOVWF 0x2d,0x0 001b7e 0e05 MOVLW 0x5 001b80 5ee1 SUBWF 0xe1,0x1,0x0 001b82 502d MOVF 0x2d,0x0,0x0 001b84 0e03 MOVLW 0x3 } C:\Projects\UBW\FW\D_143\user\user.c 001b86 5ce1 SUBWF 0xe1,0x0,0x0 001b88 e202 BC 0x1b8e 001b8a 6ae1 CLRF 0xe1,0x0 001b8c 52e5 MOVF 0xe5,0x1,0x0 001b8e 6ee1 MOVWF 0xe1,0x0 001b90 52e5 MOVF 0xe5,0x1,0x0 001b92 cfe7 MOVFF 0xfe7,0xfd9 001b94 ffd9 001b96 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // PO is for Pin Output C:\Projects\UBW\FW\D_143\user\user.c // "PO,,," C:\Projects\UBW\FW\D_143\user\user.c // is "A", "B", "C" and indicates the port C:\Projects\UBW\FW\D_143\user\user.c // is a number between 0 and 7 and indicates which pin to write out the value to C:\Projects\UBW\FW\D_143\user\user.c // is "1" or "0" and indicates the state to change the pin to C:\Projects\UBW\FW\D_143\user\user.c 001b98 cfd9 MOVFF 0xfd9,0xfe6 void parse_PO_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 001b9a ffe6 001b9c cfe1 MOVFF 0xfe1,0xfd9 001b9e ffd9 001ba0 0e03 MOVLW 0x3 001ba2 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char port; C:\Projects\UBW\FW\D_143\user\user.c unsigned char pin; C:\Projects\UBW\FW\D_143\user\user.c unsigned char value; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001ba4 0e05 MOVLW 0x5 port = extract_number (kUCASE_ASCII_CHAR); C:\Projects\UBW\FW\D_143\user\user.c 001ba6 6ee6 MOVWF 0xe6,0x0 001ba8 dbdd RCALL 0x2364 001baa 52e5 MOVF 0xe5,0x1,0x0 001bac 501d MOVF 0x1d,0x0,0x0 001bae 6edf MOVWF 0xdf,0x0 001bb0 0e01 MOVLW 0x1 pin = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001bb2 6ee6 MOVWF 0xe6,0x0 001bb4 dbd7 RCALL 0x2364 001bb6 52e5 MOVF 0xe5,0x1,0x0 001bb8 0e01 MOVLW 0x1 001bba c01d MOVFF 0x1d,0xfdb 001bbc ffdb 001bbe 0e01 MOVLW 0x1 value = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001bc0 6ee6 MOVWF 0xe6,0x0 001bc2 dbd0 RCALL 0x2364 001bc4 52e5 MOVF 0xe5,0x1,0x0 001bc6 0e02 MOVLW 0x2 001bc8 c01d MOVFF 0x1d,0xfdb 001bca ffdb C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 001bcc 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 001bce e001 BZ 0x1bd2 { C:\Projects\UBW\FW\D_143\user\user.c 001bd0 d0b5 BRA 0x1d3c return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Limit check the parameters C:\Projects\UBW\FW\D_143\user\user.c 001bd2 0e02 MOVLW 0x2 if (value > 1) C:\Projects\UBW\FW\D_143\user\user.c 001bd4 50db MOVF 0xdb,0x0,0x0 001bd6 0801 SUBLW 0x1 001bd8 e202 BC 0x1bde { C:\Projects\UBW\FW\D_143\user\user.c 001bda 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001bdc d0af BRA 0x1d3c return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001bde 0e01 MOVLW 0x1 if (pin > 7) C:\Projects\UBW\FW\D_143\user\user.c 001be0 50db MOVF 0xdb,0x0,0x0 001be2 0807 SUBLW 0x7 001be4 e202 BC 0x1bea { C:\Projects\UBW\FW\D_143\user\user.c 001be6 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001be8 d0a9 BRA 0x1d3c return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001bea 0e41 MOVLW 0x41 if ('A' == port) C:\Projects\UBW\FW\D_143\user\user.c 001bec 6e2a MOVWF 0x2a,0x0 001bee 50df MOVF 0xdf,0x0,0x0 001bf0 5c2a SUBWF 0x2a,0x0,0x0 001bf2 e11c BNZ 0x1c2c { C:\Projects\UBW\FW\D_143\user\user.c 001bf4 0e02 MOVLW 0x2 if (0 == value) C:\Projects\UBW\FW\D_143\user\user.c 001bf6 50db MOVF 0xdb,0x0,0x0 001bf8 e10d BNZ 0x1c14 { C:\Projects\UBW\FW\D_143\user\user.c 001bfa 0e01 MOVLW 0x1 bitclr (LATA, pin); C:\Projects\UBW\FW\D_143\user\user.c 001bfc 6ef3 MOVWF 0xf3,0x0 001bfe 0e01 MOVLW 0x1 001c00 50db MOVF 0xdb,0x0,0x0 001c02 e004 BZ 0x1c0c 001c04 90d8 BCF 0xd8,0x0,0x0 001c06 36f3 RLCF 0xf3,0x1,0x0 001c08 06e8 DECF 0xe8,0x1,0x0 001c0a e1fc BNZ 0x1c04 001c0c 50f3 MOVF 0xf3,0x0,0x0 001c0e 1ce8 COMF 0xe8,0x0,0x0 001c10 1689 ANDWF 0x89,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001c12 d00b BRA 0x1c2a else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001c14 0e01 MOVLW 0x1 bitset (LATA, pin); C:\Projects\UBW\FW\D_143\user\user.c 001c16 6ef3 MOVWF 0xf3,0x0 001c18 0e01 MOVLW 0x1 001c1a 50db MOVF 0xdb,0x0,0x0 001c1c e004 BZ 0x1c26 001c1e 90d8 BCF 0xd8,0x0,0x0 001c20 36f3 RLCF 0xf3,0x1,0x0 001c22 06e8 DECF 0xe8,0x1,0x0 001c24 e1fc BNZ 0x1c1e 001c26 50f3 MOVF 0xf3,0x0,0x0 001c28 1289 IORWF 0x89,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001c2a d086 BRA 0x1d38 else if ('B' == port) C:\Projects\UBW\FW\D_143\user\user.c 001c2c 0e42 MOVLW 0x42 001c2e 6e2a MOVWF 0x2a,0x0 001c30 50df MOVF 0xdf,0x0,0x0 001c32 5c2a SUBWF 0x2a,0x0,0x0 001c34 e11c BNZ 0x1c6e { C:\Projects\UBW\FW\D_143\user\user.c 001c36 0e02 MOVLW 0x2 if (0 == value) C:\Projects\UBW\FW\D_143\user\user.c 001c38 50db MOVF 0xdb,0x0,0x0 001c3a e10d BNZ 0x1c56 { C:\Projects\UBW\FW\D_143\user\user.c 001c3c 0e01 MOVLW 0x1 bitclr (LATB, pin); C:\Projects\UBW\FW\D_143\user\user.c 001c3e 6ef3 MOVWF 0xf3,0x0 001c40 0e01 MOVLW 0x1 001c42 50db MOVF 0xdb,0x0,0x0 001c44 e004 BZ 0x1c4e 001c46 90d8 BCF 0xd8,0x0,0x0 001c48 36f3 RLCF 0xf3,0x1,0x0 001c4a 06e8 DECF 0xe8,0x1,0x0 001c4c e1fc BNZ 0x1c46 001c4e 50f3 MOVF 0xf3,0x0,0x0 001c50 1ce8 COMF 0xe8,0x0,0x0 001c52 168a ANDWF 0x8a,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001c54 d00b BRA 0x1c6c else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001c56 0e01 MOVLW 0x1 bitset (LATB, pin); C:\Projects\UBW\FW\D_143\user\user.c 001c58 6ef3 MOVWF 0xf3,0x0 001c5a 0e01 MOVLW 0x1 001c5c 50db MOVF 0xdb,0x0,0x0 001c5e e004 BZ 0x1c68 001c60 90d8 BCF 0xd8,0x0,0x0 001c62 36f3 RLCF 0xf3,0x1,0x0 001c64 06e8 DECF 0xe8,0x1,0x0 001c66 e1fc BNZ 0x1c60 001c68 50f3 MOVF 0xf3,0x0,0x0 001c6a 128a IORWF 0x8a,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001c6c d065 BRA 0x1d38 else if ('C' == port) C:\Projects\UBW\FW\D_143\user\user.c 001c6e 0e43 MOVLW 0x43 001c70 6e2a MOVWF 0x2a,0x0 001c72 50df MOVF 0xdf,0x0,0x0 001c74 5c2a SUBWF 0x2a,0x0,0x0 001c76 e11c BNZ 0x1cb0 { C:\Projects\UBW\FW\D_143\user\user.c 001c78 0e02 MOVLW 0x2 if (0 == value) C:\Projects\UBW\FW\D_143\user\user.c 001c7a 50db MOVF 0xdb,0x0,0x0 001c7c e10d BNZ 0x1c98 { C:\Projects\UBW\FW\D_143\user\user.c 001c7e 0e01 MOVLW 0x1 bitclr (LATC, pin); C:\Projects\UBW\FW\D_143\user\user.c 001c80 6ef3 MOVWF 0xf3,0x0 001c82 0e01 MOVLW 0x1 001c84 50db MOVF 0xdb,0x0,0x0 001c86 e004 BZ 0x1c90 001c88 90d8 BCF 0xd8,0x0,0x0 001c8a 36f3 RLCF 0xf3,0x1,0x0 001c8c 06e8 DECF 0xe8,0x1,0x0 001c8e e1fc BNZ 0x1c88 001c90 50f3 MOVF 0xf3,0x0,0x0 001c92 1ce8 COMF 0xe8,0x0,0x0 001c94 168b ANDWF 0x8b,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001c96 d00b BRA 0x1cae else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001c98 0e01 MOVLW 0x1 bitset (LATC, pin); C:\Projects\UBW\FW\D_143\user\user.c 001c9a 6ef3 MOVWF 0xf3,0x0 001c9c 0e01 MOVLW 0x1 001c9e 50db MOVF 0xdb,0x0,0x0 001ca0 e004 BZ 0x1caa 001ca2 90d8 BCF 0xd8,0x0,0x0 001ca4 36f3 RLCF 0xf3,0x1,0x0 001ca6 06e8 DECF 0xe8,0x1,0x0 001ca8 e1fc BNZ 0x1ca2 001caa 50f3 MOVF 0xf3,0x0,0x0 001cac 128b IORWF 0x8b,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c #ifdef __18F4550 C:\Projects\UBW\FW\D_143\user\user.c 001cae d044 BRA 0x1d38 else if ('D' == port) C:\Projects\UBW\FW\D_143\user\user.c 001cb0 0e44 MOVLW 0x44 001cb2 6e2a MOVWF 0x2a,0x0 001cb4 50df MOVF 0xdf,0x0,0x0 001cb6 5c2a SUBWF 0x2a,0x0,0x0 001cb8 e11c BNZ 0x1cf2 { C:\Projects\UBW\FW\D_143\user\user.c 001cba 0e02 MOVLW 0x2 if (0 == value) C:\Projects\UBW\FW\D_143\user\user.c 001cbc 50db MOVF 0xdb,0x0,0x0 001cbe e10d BNZ 0x1cda { C:\Projects\UBW\FW\D_143\user\user.c 001cc0 0e01 MOVLW 0x1 bitclr (LATD, pin); C:\Projects\UBW\FW\D_143\user\user.c 001cc2 6ef3 MOVWF 0xf3,0x0 001cc4 0e01 MOVLW 0x1 001cc6 50db MOVF 0xdb,0x0,0x0 001cc8 e004 BZ 0x1cd2 001cca 90d8 BCF 0xd8,0x0,0x0 001ccc 36f3 RLCF 0xf3,0x1,0x0 001cce 06e8 DECF 0xe8,0x1,0x0 001cd0 e1fc BNZ 0x1cca 001cd2 50f3 MOVF 0xf3,0x0,0x0 001cd4 1ce8 COMF 0xe8,0x0,0x0 001cd6 168c ANDWF 0x8c,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001cd8 d00b BRA 0x1cf0 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001cda 0e01 MOVLW 0x1 bitset (LATD, pin); C:\Projects\UBW\FW\D_143\user\user.c 001cdc 6ef3 MOVWF 0xf3,0x0 001cde 0e01 MOVLW 0x1 001ce0 50db MOVF 0xdb,0x0,0x0 001ce2 e004 BZ 0x1cec 001ce4 90d8 BCF 0xd8,0x0,0x0 001ce6 36f3 RLCF 0xf3,0x1,0x0 001ce8 06e8 DECF 0xe8,0x1,0x0 001cea e1fc BNZ 0x1ce4 001cec 50f3 MOVF 0xf3,0x0,0x0 001cee 128c IORWF 0x8c,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001cf0 d023 BRA 0x1d38 else if ('E' == port) C:\Projects\UBW\FW\D_143\user\user.c 001cf2 0e45 MOVLW 0x45 001cf4 6e2a MOVWF 0x2a,0x0 001cf6 50df MOVF 0xdf,0x0,0x0 001cf8 5c2a SUBWF 0x2a,0x0,0x0 001cfa e11c BNZ 0x1d34 { C:\Projects\UBW\FW\D_143\user\user.c 001cfc 0e02 MOVLW 0x2 if (0 == value) C:\Projects\UBW\FW\D_143\user\user.c 001cfe 50db MOVF 0xdb,0x0,0x0 001d00 e10d BNZ 0x1d1c { C:\Projects\UBW\FW\D_143\user\user.c 001d02 0e01 MOVLW 0x1 bitclr (LATE, pin); C:\Projects\UBW\FW\D_143\user\user.c 001d04 6ef3 MOVWF 0xf3,0x0 001d06 0e01 MOVLW 0x1 001d08 50db MOVF 0xdb,0x0,0x0 001d0a e004 BZ 0x1d14 001d0c 90d8 BCF 0xd8,0x0,0x0 001d0e 36f3 RLCF 0xf3,0x1,0x0 001d10 06e8 DECF 0xe8,0x1,0x0 001d12 e1fc BNZ 0x1d0c 001d14 50f3 MOVF 0xf3,0x0,0x0 001d16 1ce8 COMF 0xe8,0x0,0x0 001d18 168d ANDWF 0x8d,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001d1a d00b BRA 0x1d32 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001d1c 0e01 MOVLW 0x1 bitset (LATE, pin); C:\Projects\UBW\FW\D_143\user\user.c 001d1e 6ef3 MOVWF 0xf3,0x0 001d20 0e01 MOVLW 0x1 001d22 50db MOVF 0xdb,0x0,0x0 001d24 e004 BZ 0x1d2e 001d26 90d8 BCF 0xd8,0x0,0x0 001d28 36f3 RLCF 0xf3,0x1,0x0 001d2a 06e8 DECF 0xe8,0x1,0x0 001d2c e1fc BNZ 0x1d26 001d2e 50f3 MOVF 0xf3,0x0,0x0 001d30 128d IORWF 0x8d,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c #endif C:\Projects\UBW\FW\D_143\user\user.c 001d32 d002 BRA 0x1d38 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001d34 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001d36 d002 BRA 0x1d3c return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001d38 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 001d3a f009 001d3c 0e03 MOVLW 0x3 } C:\Projects\UBW\FW\D_143\user\user.c 001d3e 5ce1 SUBWF 0xe1,0x0,0x0 001d40 e202 BC 0x1d46 001d42 6ae1 CLRF 0xe1,0x0 001d44 52e5 MOVF 0xe5,0x1,0x0 001d46 6ee1 MOVWF 0xe1,0x0 001d48 52e5 MOVF 0xe5,0x1,0x0 001d4a cfe7 MOVFF 0xfe7,0xfd9 001d4c ffd9 001d4e 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // TX is for Serial Transmit C:\Projects\UBW\FW\D_143\user\user.c // "TX,," C:\Projects\UBW\FW\D_143\user\user.c // is a count of the number of bytes in the field. C:\Projects\UBW\FW\D_143\user\user.c // It must never be larger than the number of bytes that are currently free in the C:\Projects\UBW\FW\D_143\user\user.c // software TX buffer or some data will get lost. C:\Projects\UBW\FW\D_143\user\user.c // are the bytes that you want the UBW to send. It will store them C:\Projects\UBW\FW\D_143\user\user.c // in its software TX buffer until there is time to send them out the TX pin. C:\Projects\UBW\FW\D_143\user\user.c // If you send in "0" for a C:\Projects\UBW\FW\D_143\user\user.c // then the UBW will send back a "TX," packet, C:\Projects\UBW\FW\D_143\user\user.c // where is the number of bytes currently available in the C:\Projects\UBW\FW\D_143\user\user.c // software TX buffer. C:\Projects\UBW\FW\D_143\user\user.c void parse_TX_packet(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001d50 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 001d52 f009 001d54 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // RX is for Serial Receive C:\Projects\UBW\FW\D_143\user\user.c // "RX," C:\Projects\UBW\FW\D_143\user\user.c // is the maximum number of characters that you want the UBW to send C:\Projects\UBW\FW\D_143\user\user.c // back to you in the RX packet. If you use "0" for then the UBW C:\Projects\UBW\FW\D_143\user\user.c // will just send you the current number of bytes in it's RX buffer, and if C:\Projects\UBW\FW\D_143\user\user.c // there have been any buffer overruns since the last time a of C:\Projects\UBW\FW\D_143\user\user.c // "0" was received by the UBW. C:\Projects\UBW\FW\D_143\user\user.c // This command will send back a "RX,," C:\Projects\UBW\FW\D_143\user\user.c // or "RX,," packet depending upon if you send C:\Projects\UBW\FW\D_143\user\user.c // "0" or something else for C:\Projects\UBW\FW\D_143\user\user.c // in the returning RX packet is a count of the number of bytes C:\Projects\UBW\FW\D_143\user\user.c // in the field. It will never be more than the C:\Projects\UBW\FW\D_143\user\user.c // you sent in. C:\Projects\UBW\FW\D_143\user\user.c // is the data (in raw form - byte for byte what was received - C:\Projects\UBW\FW\D_143\user\user.c // i.e. not translated in any way, into ASCII values or anything else) that the UBW C:\Projects\UBW\FW\D_143\user\user.c // received. This may include s and NULLs among any other bytes, so make sure C:\Projects\UBW\FW\D_143\user\user.c // your PC application treates the RX packet coming back from the UBW in a speical way C:\Projects\UBW\FW\D_143\user\user.c // so as not to screw up normal packet processing if any special caracters are received. C:\Projects\UBW\FW\D_143\user\user.c // is a valule between 0 and MAX_SERIAL_RX_BUFFER_SIZE that records C:\Projects\UBW\FW\D_143\user\user.c // the total number of bytes, at that point in time, that the UBW is holding, waiting C:\Projects\UBW\FW\D_143\user\user.c // to pass on to the PC. C:\Projects\UBW\FW\D_143\user\user.c // has several bits. C:\Projects\UBW\FW\D_143\user\user.c // Bit 0 = Software RX Buffer Overrun (1 means software RX buffer (on RX pin) C:\Projects\UBW\FW\D_143\user\user.c // has been overrun and data has been lost) This will happen if you don't C:\Projects\UBW\FW\D_143\user\user.c // read the data out of the UWB often enough and the data is coming in too fast. C:\Projects\UBW\FW\D_143\user\user.c // Bit 1 = Software TX Buffer Overrun (1 means software TX buffer (on TX pin) C:\Projects\UBW\FW\D_143\user\user.c // as been overrun and data hs been lost. This will happen if you send too much C:\Projects\UBW\FW\D_143\user\user.c // data to the UBW and you have the serial port set to a low baud rate. C:\Projects\UBW\FW\D_143\user\user.c void parse_RX_packet(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001d56 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 001d58 f009 001d5a 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // CX is for setting up serial port parameters C:\Projects\UBW\FW\D_143\user\user.c // TBD C:\Projects\UBW\FW\D_143\user\user.c void parse_CX_packet(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001d5c ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 001d5e f009 001d60 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // RC is for outputting RC servo pulses on a pin C:\Projects\UBW\FW\D_143\user\user.c // "RC,,," C:\Projects\UBW\FW\D_143\user\user.c // is "A", "B", "C" and indicates the port C:\Projects\UBW\FW\D_143\user\user.c // is a number between 0 and 7 and indicates which pin to output the new value on C:\Projects\UBW\FW\D_143\user\user.c // is an unsigned 16 bit number between 0 and 11890. C:\Projects\UBW\FW\D_143\user\user.c // If is "0" then the RC output on that pin is disabled. C:\Projects\UBW\FW\D_143\user\user.c // Otherwise = 1 means 1ms pulse, = 11890 means 2ms pulse, C:\Projects\UBW\FW\D_143\user\user.c // any value inbetween means proportional pulse values between those two C:\Projects\UBW\FW\D_143\user\user.c // Note: The pin used for RC output must be set as an output, or not much will happen. C:\Projects\UBW\FW\D_143\user\user.c // The RC command will continue to send out pulses at the last set value on C:\Projects\UBW\FW\D_143\user\user.c // each pin that has RC output with a repition rate of 1 pulse about every 19ms. C:\Projects\UBW\FW\D_143\user\user.c // If you have RC output enabled on a pin, outputting a digital value to that pin C:\Projects\UBW\FW\D_143\user\user.c // will be overwritten the next time the RC pulses. Make sure to turn off the RC C:\Projects\UBW\FW\D_143\user\user.c // output if you want to use the pin for something else. C:\Projects\UBW\FW\D_143\user\user.c 001d62 cfd9 MOVFF 0xfd9,0xfe6 void parse_RC_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 001d64 ffe6 001d66 cfe1 MOVFF 0xfe1,0xfd9 001d68 ffd9 001d6a 0e04 MOVLW 0x4 001d6c 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char port; C:\Projects\UBW\FW\D_143\user\user.c unsigned char pin; C:\Projects\UBW\FW\D_143\user\user.c unsigned int value; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001d6e 0e05 MOVLW 0x5 port = extract_number (kUCASE_ASCII_CHAR); C:\Projects\UBW\FW\D_143\user\user.c 001d70 6ee6 MOVWF 0xe6,0x0 001d72 daf8 RCALL 0x2364 001d74 52e5 MOVF 0xe5,0x1,0x0 001d76 501d MOVF 0x1d,0x0,0x0 001d78 6edf MOVWF 0xdf,0x0 001d7a 0e01 MOVLW 0x1 pin = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001d7c 6ee6 MOVWF 0xe6,0x0 001d7e daf2 RCALL 0x2364 001d80 52e5 MOVF 0xe5,0x1,0x0 001d82 0e01 MOVLW 0x1 001d84 c01d MOVFF 0x1d,0xfdb 001d86 ffdb 001d88 0e03 MOVLW 0x3 value = extract_number (kUINT); C:\Projects\UBW\FW\D_143\user\user.c 001d8a 6ee6 MOVWF 0xe6,0x0 001d8c daeb RCALL 0x2364 001d8e 52e5 MOVF 0xe5,0x1,0x0 001d90 0e02 MOVLW 0x2 001d92 c01d MOVFF 0x1d,0xfdb 001d94 ffdb 001d96 0e03 MOVLW 0x3 001d98 c01e MOVFF 0x1e,0xfdb 001d9a ffdb C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 001d9c 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 001d9e e001 BZ 0x1da2 { C:\Projects\UBW\FW\D_143\user\user.c 001da0 d07b BRA 0x1e98 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Max value user can input. (min is zero) C:\Projects\UBW\FW\D_143\user\user.c 001da2 50d9 MOVF 0xd9,0x0,0x0 if (value > 11890) C:\Projects\UBW\FW\D_143\user\user.c 001da4 0f02 ADDLW 0x2 001da6 6ee9 MOVWF 0xe9,0x0 001da8 cfda MOVFF 0xfda,0xfea 001daa ffea 001dac 0e72 MOVLW 0x72 001dae 80d8 BSF 0xd8,0x0,0x0 001db0 54ee SUBFWB 0xee,0x0,0x0 001db2 0e2e MOVLW 0x2e 001db4 54ed SUBFWB 0xed,0x0,0x0 001db6 e202 BC 0x1dbc { C:\Projects\UBW\FW\D_143\user\user.c 001db8 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001dba d06e BRA 0x1e98 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Now get Value in the form that TMR0 needs it C:\Projects\UBW\FW\D_143\user\user.c // TMR0 needs to get filled with values from 65490 (1ms) to 53600 (2ms) C:\Projects\UBW\FW\D_143\user\user.c 001dbc 50d9 MOVF 0xd9,0x0,0x0 if (value != 0) C:\Projects\UBW\FW\D_143\user\user.c 001dbe 0f02 ADDLW 0x2 001dc0 6ee9 MOVWF 0xe9,0x0 001dc2 cfda MOVFF 0xfda,0xfea 001dc4 ffea 001dc6 50ee MOVF 0xee,0x0,0x0 001dc8 10ed IORWF 0xed,0x0,0x0 001dca e01f BZ 0x1e0a { C:\Projects\UBW\FW\D_143\user\user.c 001dcc 682d SETF 0x2d,0x0 value = (65535 - (value + 45)); C:\Projects\UBW\FW\D_143\user\user.c 001dce 682e SETF 0x2e,0x0 001dd0 6a2f CLRF 0x2f,0x0 001dd2 0e2d MOVLW 0x2d 001dd4 6ee7 MOVWF 0xe7,0x0 001dd6 0e02 MOVLW 0x2 001dd8 cfdb MOVFF 0xfdb,0x30 001dda f030 001ddc 0e03 MOVLW 0x3 001dde cfdb MOVFF 0xfdb,0x31 001de0 f031 001de2 50e7 MOVF 0xe7,0x0,0x0 001de4 2630 ADDWF 0x30,0x1,0x0 001de6 0e00 MOVLW 0x0 001de8 2231 ADDWFC 0x31,0x1,0x0 001dea 6a32 CLRF 0x32,0x0 001dec 5030 MOVF 0x30,0x0,0x0 001dee 5c2d SUBWF 0x2d,0x0,0x0 001df0 6e2a MOVWF 0x2a,0x0 001df2 5031 MOVF 0x31,0x0,0x0 001df4 582e SUBWFB 0x2e,0x0,0x0 001df6 6e2b MOVWF 0x2b,0x0 001df8 5032 MOVF 0x32,0x0,0x0 001dfa 582f SUBWFB 0x2f,0x0,0x0 001dfc 6e2c MOVWF 0x2c,0x0 001dfe 0e02 MOVLW 0x2 001e00 c02a MOVFF 0x2a,0xfdb 001e02 ffdb 001e04 0e03 MOVLW 0x3 001e06 c02b MOVFF 0x2b,0xfdb 001e08 ffdb } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001e0a 0e01 MOVLW 0x1 if (pin > 7) C:\Projects\UBW\FW\D_143\user\user.c 001e0c 50db MOVF 0xdb,0x0,0x0 001e0e 0807 SUBLW 0x7 001e10 e202 BC 0x1e16 { C:\Projects\UBW\FW\D_143\user\user.c 001e12 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001e14 d041 BRA 0x1e98 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001e16 0e41 MOVLW 0x41 if ('A' == port) C:\Projects\UBW\FW\D_143\user\user.c 001e18 6e2a MOVWF 0x2a,0x0 001e1a 50df MOVF 0xdf,0x0,0x0 001e1c 5c2a SUBWF 0x2a,0x0,0x0 001e1e e102 BNZ 0x1e24 { C:\Projects\UBW\FW\D_143\user\user.c 001e20 6adf CLRF 0xdf,0x0 port = 0; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 001e22 d012 BRA 0x1e48 else if ('B' == port) C:\Projects\UBW\FW\D_143\user\user.c 001e24 0e42 MOVLW 0x42 001e26 6e2a MOVWF 0x2a,0x0 001e28 50df MOVF 0xdf,0x0,0x0 001e2a 5c2a SUBWF 0x2a,0x0,0x0 001e2c e103 BNZ 0x1e34 { C:\Projects\UBW\FW\D_143\user\user.c 001e2e 0e08 MOVLW 0x8 port = 8; C:\Projects\UBW\FW\D_143\user\user.c 001e30 6edf MOVWF 0xdf,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001e32 d00a BRA 0x1e48 else if ('C' == port) C:\Projects\UBW\FW\D_143\user\user.c 001e34 0e43 MOVLW 0x43 001e36 6e2a MOVWF 0x2a,0x0 001e38 50df MOVF 0xdf,0x0,0x0 001e3a 5c2a SUBWF 0x2a,0x0,0x0 001e3c e103 BNZ 0x1e44 { C:\Projects\UBW\FW\D_143\user\user.c 001e3e 0e10 MOVLW 0x10 port = 16; C:\Projects\UBW\FW\D_143\user\user.c 001e40 6edf MOVWF 0xdf,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 001e42 d002 BRA 0x1e48 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 001e44 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 001e46 d028 BRA 0x1e98 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Store the new RC time value C:\Projects\UBW\FW\D_143\user\user.c 001e48 0e01 MOVLW 0x1 g_RC_value[pin + port] = value; C:\Projects\UBW\FW\D_143\user\user.c 001e4a 50db MOVF 0xdb,0x0,0x0 001e4c 24df ADDWF 0xdf,0x0,0x0 001e4e 6ee9 MOVWF 0xe9,0x0 001e50 6aea CLRF 0xea,0x0 001e52 90d8 BCF 0xd8,0x0,0x0 001e54 36e9 RLCF 0xe9,0x1,0x0 001e56 36ea RLCF 0xea,0x1,0x0 001e58 0e69 MOVLW 0x69 001e5a 26e9 ADDWF 0xe9,0x1,0x0 001e5c 0e01 MOVLW 0x1 001e5e 22ea ADDWFC 0xea,0x1,0x0 001e60 0e02 MOVLW 0x2 001e62 cfdb MOVFF 0xfdb,0xfee 001e64 ffee 001e66 0e03 MOVLW 0x3 001e68 cfdb MOVFF 0xfdb,0xfed 001e6a ffed // Only set this state if we are off - if we are already running on C:\Projects\UBW\FW\D_143\user\user.c // this pin, then the new value will be picked up next time around (19ms) C:\Projects\UBW\FW\D_143\user\user.c 001e6c 0e01 MOVLW 0x1 if (kOFF == g_RC_state[pin + port]) C:\Projects\UBW\FW\D_143\user\user.c 001e6e 50db MOVF 0xdb,0x0,0x0 001e70 24df ADDWF 0xdf,0x0,0x0 001e72 6aea CLRF 0xea,0x0 001e74 0f51 ADDLW 0x51 001e76 6ee9 MOVWF 0xe9,0x0 001e78 0e01 MOVLW 0x1 001e7a 22ea ADDWFC 0xea,0x1,0x0 001e7c 04ef DECF 0xef,0x0,0x0 001e7e e10a BNZ 0x1e94 { C:\Projects\UBW\FW\D_143\user\user.c 001e80 0e01 MOVLW 0x1 g_RC_state[pin + port] = kWAITING; C:\Projects\UBW\FW\D_143\user\user.c 001e82 50db MOVF 0xdb,0x0,0x0 001e84 24df ADDWF 0xdf,0x0,0x0 001e86 6aea CLRF 0xea,0x0 001e88 0f51 ADDLW 0x51 001e8a 6ee9 MOVWF 0xe9,0x0 001e8c 0e01 MOVLW 0x1 001e8e 22ea ADDWFC 0xea,0x1,0x0 001e90 0e02 MOVLW 0x2 001e92 6eef MOVWF 0xef,0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001e94 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 001e96 f009 001e98 0e04 MOVLW 0x4 } C:\Projects\UBW\FW\D_143\user\user.c 001e9a 5ce1 SUBWF 0xe1,0x0,0x0 001e9c e202 BC 0x1ea2 001e9e 6ae1 CLRF 0xe1,0x0 001ea0 52e5 MOVF 0xe5,0x1,0x0 001ea2 6ee1 MOVWF 0xe1,0x0 001ea4 52e5 MOVF 0xe5,0x1,0x0 001ea6 cfe7 MOVFF 0xfe7,0xfd9 001ea8 ffd9 001eaa 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // BC is for Bulk Configure C:\Projects\UBW\FW\D_143\user\user.c // BC,,,,, C:\Projects\UBW\FW\D_143\user\user.c // This command sets up the mask and strobe bits on port A for the C:\Projects\UBW\FW\D_143\user\user.c // BO (Bulk Output) command below. Also suck in wait delay, strobe delay, etc. C:\Projects\UBW\FW\D_143\user\user.c 001eac cfd9 MOVFF 0xfd9,0xfe6 void parse_BC_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 001eae ffe6 001eb0 cfe1 MOVFF 0xfe1,0xfd9 001eb2 ffd9 001eb4 0e05 MOVLW 0x5 001eb6 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char BO_init; C:\Projects\UBW\FW\D_143\user\user.c unsigned char BO_strobe_mask; C:\Projects\UBW\FW\D_143\user\user.c unsigned char BO_wait_mask; C:\Projects\UBW\FW\D_143\user\user.c unsigned char BO_wait_delay; C:\Projects\UBW\FW\D_143\user\user.c unsigned char BO_strobe_delay; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 001eb8 0e01 MOVLW 0x1 BO_init = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001eba 6ee6 MOVWF 0xe6,0x0 001ebc da53 RCALL 0x2364 001ebe 52e5 MOVF 0xe5,0x1,0x0 001ec0 501d MOVF 0x1d,0x0,0x0 001ec2 6edf MOVWF 0xdf,0x0 001ec4 0e01 MOVLW 0x1 BO_wait_mask = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001ec6 6ee6 MOVWF 0xe6,0x0 001ec8 da4d RCALL 0x2364 001eca 52e5 MOVF 0xe5,0x1,0x0 001ecc 0e02 MOVLW 0x2 001ece c01d MOVFF 0x1d,0xfdb 001ed0 ffdb 001ed2 0e01 MOVLW 0x1 BO_wait_delay = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001ed4 6ee6 MOVWF 0xe6,0x0 001ed6 da46 RCALL 0x2364 001ed8 52e5 MOVF 0xe5,0x1,0x0 001eda 0e03 MOVLW 0x3 001edc c01d MOVFF 0x1d,0xfdb 001ede ffdb 001ee0 0e01 MOVLW 0x1 BO_strobe_mask = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001ee2 6ee6 MOVWF 0xe6,0x0 001ee4 da3f RCALL 0x2364 001ee6 52e5 MOVF 0xe5,0x1,0x0 001ee8 0e01 MOVLW 0x1 001eea c01d MOVFF 0x1d,0xfdb 001eec ffdb 001eee 0e01 MOVLW 0x1 BO_strobe_delay = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 001ef0 6ee6 MOVWF 0xe6,0x0 001ef2 da38 RCALL 0x2364 001ef4 52e5 MOVF 0xe5,0x1,0x0 001ef6 0e04 MOVLW 0x4 001ef8 c01d MOVFF 0x1d,0xfdb 001efa ffdb C:\Projects\UBW\FW\D_143\user\user.c // Bail if we got a conversion error C:\Projects\UBW\FW\D_143\user\user.c 001efc 500d MOVF 0xd,0x0,0x0 if (error_byte) C:\Projects\UBW\FW\D_143\user\user.c 001efe e001 BZ 0x1f02 { C:\Projects\UBW\FW\D_143\user\user.c 001f00 d012 BRA 0x1f26 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Copy over values to their gloabls C:\Projects\UBW\FW\D_143\user\user.c 001f02 cfdf MOVFF 0xfdf,0x1b1 g_BO_init = BO_init; C:\Projects\UBW\FW\D_143\user\user.c 001f04 f1b1 001f06 0e02 MOVLW 0x2 g_BO_wait_mask = BO_wait_mask; C:\Projects\UBW\FW\D_143\user\user.c 001f08 cfdb MOVFF 0xfdb,0x1b3 001f0a f1b3 001f0c 0e01 MOVLW 0x1 g_BO_strobe_mask = BO_strobe_mask; C:\Projects\UBW\FW\D_143\user\user.c 001f0e cfdb MOVFF 0xfdb,0x1b2 001f10 f1b2 001f12 0e03 MOVLW 0x3 g_BO_wait_delay = BO_wait_delay; C:\Projects\UBW\FW\D_143\user\user.c 001f14 cfdb MOVFF 0xfdb,0x1b4 001f16 f1b4 001f18 0e04 MOVLW 0x4 g_BO_strobe_delay = BO_strobe_delay; C:\Projects\UBW\FW\D_143\user\user.c 001f1a cfdb MOVFF 0xfdb,0x1b5 001f1c f1b5 // And initalize Port A C:\Projects\UBW\FW\D_143\user\user.c 001f1e c1b1 MOVFF 0x1b1,0xf89 LATA = g_BO_init; C:\Projects\UBW\FW\D_143\user\user.c 001f20 ff89 C:\Projects\UBW\FW\D_143\user\user.c 001f22 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 001f24 f009 001f26 0e05 MOVLW 0x5 } C:\Projects\UBW\FW\D_143\user\user.c 001f28 5ce1 SUBWF 0xe1,0x0,0x0 001f2a e202 BC 0x1f30 001f2c 6ae1 CLRF 0xe1,0x0 001f2e 52e5 MOVF 0xe5,0x1,0x0 001f30 6ee1 MOVWF 0xe1,0x0 001f32 52e5 MOVF 0xe5,0x1,0x0 001f34 cfe7 MOVFF 0xfe7,0xfd9 001f36 ffd9 001f38 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // Bulk Output (BO) C:\Projects\UBW\FW\D_143\user\user.c // BO,4AF2C124 C:\Projects\UBW\FW\D_143\user\user.c // After the inital comma, pull in hex values and spit them out to port A C:\Projects\UBW\FW\D_143\user\user.c // Note that the procedure here is as follows: C:\Projects\UBW\FW\D_143\user\user.c // 1) Write new value to PortB C:\Projects\UBW\FW\D_143\user\user.c // 2) Assert C:\Projects\UBW\FW\D_143\user\user.c // 3) Wait for (if not zero) C:\Projects\UBW\FW\D_143\user\user.c // 4) Deassert C:\Projects\UBW\FW\D_143\user\user.c // 5) Wait for to be asserted C:\Projects\UBW\FW\D_143\user\user.c // 6) Wait for to be deasserted C:\Projects\UBW\FW\D_143\user\user.c // 7) If 5) or 6) takes longer than then just move on to next byte C:\Projects\UBW\FW\D_143\user\user.c // Repeat for each byte C:\Projects\UBW\FW\D_143\user\user.c 001f3a cfd9 MOVFF 0xfd9,0xfe6 void parse_BO_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 001f3c ffe6 001f3e cfe1 MOVFF 0xfe1,0xfd9 001f40 ffd9 001f42 0e04 MOVLW 0x4 001f44 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char BO_data_byte; C:\Projects\UBW\FW\D_143\user\user.c unsigned char new_port_A_value; C:\Projects\UBW\FW\D_143\user\user.c unsigned char tmp; C:\Projects\UBW\FW\D_143\user\user.c 001f46 0e03 MOVLW 0x3 unsigned char wait_count = 0; C:\Projects\UBW\FW\D_143\user\user.c 001f48 6adb CLRF 0xdb,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Check for comma where ptr points C:\Projects\UBW\FW\D_143\user\user.c 001f4a 0101 MOVLB 0x1 if (g_RX_buf[g_RX_buf_out] != ',') C:\Projects\UBW\FW\D_143\user\user.c 001f4c 51b9 MOVF 0xb9,0x0,0x1 001f4e 6aea CLRF 0xea,0x0 001f50 0f40 ADDLW 0x40 001f52 6ee9 MOVWF 0xe9,0x0 001f54 0e02 MOVLW 0x2 001f56 22ea ADDWFC 0xea,0x1,0x0 001f58 50ef MOVF 0xef,0x0,0x0 001f5a 082c SUBLW 0x2c 001f5c e01d BZ 0x1f98 { C:\Projects\UBW\FW\D_143\user\user.c 001f5e 0101 MOVLB 0x1 printf ((far rom char *)"!5 Err: Need comma next, found: '%c'\r\n", g_RX_buf[g_RX_buf_out]); C:\Projects\UBW\FW\D_143\user\user.c 001f60 51b9 MOVF 0xb9,0x0,0x1 001f62 6aea CLRF 0xea,0x0 001f64 0f40 ADDLW 0x40 001f66 6ee9 MOVWF 0xe9,0x0 001f68 0e02 MOVLW 0x2 001f6a 22ea ADDWFC 0xea,0x1,0x0 001f6c 50ef MOVF 0xef,0x0,0x0 001f6e 6ee6 MOVWF 0xe6,0x0 001f70 6ae6 CLRF 0xe6,0x0 001f72 0efa MOVLW 0xfa 001f74 6e2a MOVWF 0x2a,0x0 001f76 0e40 MOVLW 0x40 001f78 6e2b MOVWF 0x2b,0x0 001f7a 6a2c CLRF 0x2c,0x0 001f7c c02a MOVFF 0x2a,0xfe6 001f7e ffe6 001f80 c02b MOVFF 0x2b,0xfe6 001f82 ffe6 001f84 c02c MOVFF 0x2c,0xfe6 001f86 ffe6 001f88 ec4d CALL 0x449a,0x0 001f8a f022 001f8c 6e2d MOVWF 0x2d,0x0 001f8e 0e05 MOVLW 0x5 001f90 5ee1 SUBWF 0xe1,0x1,0x0 001f92 502d MOVF 0x2d,0x0,0x0 001f94 8a0d BSF 0xd,0x5,0x0 bitset (error_byte, kERROR_BYTE_PRINTED_ERROR); C:\Projects\UBW\FW\D_143\user\user.c 001f96 d10e BRA 0x21b4 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Move to the next character C:\Projects\UBW\FW\D_143\user\user.c 001f98 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 001f9a 2bb9 INCF 0xb9,0x1,0x1 001f9c 0e40 MOVLW 0x40 001f9e 0101 MOVLB 0x1 001fa0 5db9 SUBWF 0xb9,0x0,0x1 001fa2 e102 BNZ 0x1fa8 001fa4 0101 MOVLB 0x1 001fa6 6bb9 CLRF 0xb9,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Make sure Port A is correct C:\Projects\UBW\FW\D_143\user\user.c 001fa8 c1b1 MOVFF 0x1b1,0xf89 LATA = g_BO_init; C:\Projects\UBW\FW\D_143\user\user.c 001faa ff89 001fac 0101 MOVLB 0x1 new_port_A_value = ((~LATA & g_BO_strobe_mask)) | (LATA & ~g_BO_strobe_mask); C:\Projects\UBW\FW\D_143\user\user.c 001fae 1db2 COMF 0xb2,0x0,0x1 001fb0 1489 ANDWF 0x89,0x0,0x0 001fb2 6e2a MOVWF 0x2a,0x0 001fb4 1c89 COMF 0x89,0x0,0x0 001fb6 0101 MOVLB 0x1 001fb8 15b2 ANDWF 0xb2,0x0,0x1 001fba 102a IORWF 0x2a,0x0,0x0 001fbc 6ee7 MOVWF 0xe7,0x0 001fbe 0e01 MOVLW 0x1 001fc0 cfe7 MOVFF 0xfe7,0xfdb 001fc2 ffdb C:\Projects\UBW\FW\D_143\user\user.c 001fc4 0101 MOVLB 0x1 while (g_RX_buf[g_RX_buf_out] != 13) C:\Projects\UBW\FW\D_143\user\user.c 001fc6 51b9 MOVF 0xb9,0x0,0x1 001fc8 6aea CLRF 0xea,0x0 001fca 0f40 ADDLW 0x40 001fcc 6ee9 MOVWF 0xe9,0x0 001fce 0e02 MOVLW 0x2 001fd0 22ea ADDWFC 0xea,0x1,0x0 001fd2 50ef MOVF 0xef,0x0,0x0 001fd4 080d SUBLW 0xd 001fd6 e101 BNZ 0x1fda 001fd8 d0eb BRA 0x21b0 0021ae d70a BRA 0x1fc4 { C:\Projects\UBW\FW\D_143\user\user.c // Pull in a nibble from the input buffer C:\Projects\UBW\FW\D_143\user\user.c 001fda 0101 MOVLB 0x1 tmp = toupper (g_RX_buf[g_RX_buf_out]); C:\Projects\UBW\FW\D_143\user\user.c 001fdc 51b9 MOVF 0xb9,0x0,0x1 001fde 6aea CLRF 0xea,0x0 001fe0 0f40 ADDLW 0x40 001fe2 6ee9 MOVWF 0xe9,0x0 001fe4 0e02 MOVLW 0x2 001fe6 22ea ADDWFC 0xea,0x1,0x0 001fe8 50ef MOVF 0xef,0x0,0x0 001fea 6ee6 MOVWF 0xe6,0x0 001fec 6ae6 CLRF 0xe6,0x0 001fee ec46 CALL 0x468c,0x0 001ff0 f023 001ff2 52e5 MOVF 0xe5,0x1,0x0 001ff4 52e5 MOVF 0xe5,0x1,0x0 001ff6 0e02 MOVLW 0x2 001ff8 cff3 MOVFF 0xff3,0xfdb 001ffa ffdb 001ffc 0e30 MOVLW 0x30 if (tmp >= '0' && tmp <= '9') C:\Projects\UBW\FW\D_143\user\user.c 001ffe 6ef3 MOVWF 0xf3,0x0 002000 0e02 MOVLW 0x2 002002 cfdb MOVFF 0xfdb,0xff4 002004 fff4 002006 50f3 MOVF 0xf3,0x0,0x0 002008 5cf4 SUBWF 0xf4,0x0,0x0 00200a e30f BNC 0x202a 00200c 0e02 MOVLW 0x2 00200e 50db MOVF 0xdb,0x0,0x0 002010 0839 SUBLW 0x39 002012 e30b BNC 0x202a { C:\Projects\UBW\FW\D_143\user\user.c 002014 0e30 MOVLW 0x30 tmp -= '0'; C:\Projects\UBW\FW\D_143\user\user.c 002016 6e2a MOVWF 0x2a,0x0 002018 0e02 MOVLW 0x2 00201a cfdb MOVFF 0xfdb,0xfe7 00201c ffe7 00201e 502a MOVF 0x2a,0x0,0x0 002020 5ee7 SUBWF 0xe7,0x1,0x0 002022 0e02 MOVLW 0x2 002024 cfe7 MOVFF 0xfe7,0xfdb 002026 ffdb } C:\Projects\UBW\FW\D_143\user\user.c 002028 d019 BRA 0x205c else if (tmp >= 'A' && tmp <= 'F') C:\Projects\UBW\FW\D_143\user\user.c 00202a 0e41 MOVLW 0x41 00202c 6ef3 MOVWF 0xf3,0x0 00202e 0e02 MOVLW 0x2 002030 cfdb MOVFF 0xfdb,0xff4 002032 fff4 002034 50f3 MOVF 0xf3,0x0,0x0 002036 5cf4 SUBWF 0xf4,0x0,0x0 002038 e30f BNC 0x2058 00203a 0e02 MOVLW 0x2 00203c 50db MOVF 0xdb,0x0,0x0 00203e 0846 SUBLW 0x46 002040 e30b BNC 0x2058 { C:\Projects\UBW\FW\D_143\user\user.c 002042 0e37 MOVLW 0x37 tmp -= 55; C:\Projects\UBW\FW\D_143\user\user.c 002044 6e2a MOVWF 0x2a,0x0 002046 0e02 MOVLW 0x2 002048 cfdb MOVFF 0xfdb,0xfe7 00204a ffe7 00204c 502a MOVF 0x2a,0x0,0x0 00204e 5ee7 SUBWF 0xe7,0x1,0x0 002050 0e02 MOVLW 0x2 002052 cfe7 MOVFF 0xfe7,0xfdb 002054 ffdb } C:\Projects\UBW\FW\D_143\user\user.c 002056 d002 BRA 0x205c else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002058 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 00205a d0ac BRA 0x21b4 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 00205c 0e02 MOVLW 0x2 BO_data_byte = tmp << 4; C:\Projects\UBW\FW\D_143\user\user.c 00205e 38db SWAPF 0xdb,0x0,0x0 002060 0bf0 ANDLW 0xf0 002062 6edf MOVWF 0xdf,0x0 002064 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 002066 2bb9 INCF 0xb9,0x1,0x1 002068 0e40 MOVLW 0x40 00206a 0101 MOVLB 0x1 00206c 5db9 SUBWF 0xb9,0x0,0x1 00206e e102 BNZ 0x2074 002070 0101 MOVLB 0x1 002072 6bb9 CLRF 0xb9,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Check for CR next C:\Projects\UBW\FW\D_143\user\user.c 002074 0e0d MOVLW 0xd if (kCR == g_RX_buf[g_RX_buf_out]) C:\Projects\UBW\FW\D_143\user\user.c 002076 6e2a MOVWF 0x2a,0x0 002078 0101 MOVLB 0x1 00207a 51b9 MOVF 0xb9,0x0,0x1 00207c 6aea CLRF 0xea,0x0 00207e 0f40 ADDLW 0x40 002080 6ee9 MOVWF 0xe9,0x0 002082 0e02 MOVLW 0x2 002084 22ea ADDWFC 0xea,0x1,0x0 002086 50ef MOVF 0xef,0x0,0x0 002088 5c2a SUBWF 0x2a,0x0,0x0 00208a e102 BNZ 0x2090 { C:\Projects\UBW\FW\D_143\user\user.c 00208c 880d BSF 0xd,0x4,0x0 bitset (error_byte, kERROR_BYTE_MISSING_PARAMETER); C:\Projects\UBW\FW\D_143\user\user.c 00208e d092 BRA 0x21b4 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 002090 0101 MOVLB 0x1 tmp = toupper (g_RX_buf[g_RX_buf_out]); C:\Projects\UBW\FW\D_143\user\user.c 002092 51b9 MOVF 0xb9,0x0,0x1 002094 6aea CLRF 0xea,0x0 002096 0f40 ADDLW 0x40 002098 6ee9 MOVWF 0xe9,0x0 00209a 0e02 MOVLW 0x2 00209c 22ea ADDWFC 0xea,0x1,0x0 00209e 50ef MOVF 0xef,0x0,0x0 0020a0 6ee6 MOVWF 0xe6,0x0 0020a2 6ae6 CLRF 0xe6,0x0 0020a4 ec46 CALL 0x468c,0x0 0020a6 f023 0020a8 52e5 MOVF 0xe5,0x1,0x0 0020aa 52e5 MOVF 0xe5,0x1,0x0 0020ac 0e02 MOVLW 0x2 0020ae cff3 MOVFF 0xff3,0xfdb 0020b0 ffdb 0020b2 0e30 MOVLW 0x30 if (tmp >= '0' && tmp <= '9') C:\Projects\UBW\FW\D_143\user\user.c 0020b4 6ef3 MOVWF 0xf3,0x0 0020b6 0e02 MOVLW 0x2 0020b8 cfdb MOVFF 0xfdb,0xff4 0020ba fff4 0020bc 50f3 MOVF 0xf3,0x0,0x0 0020be 5cf4 SUBWF 0xf4,0x0,0x0 0020c0 e30f BNC 0x20e0 0020c2 0e02 MOVLW 0x2 0020c4 50db MOVF 0xdb,0x0,0x0 0020c6 0839 SUBLW 0x39 0020c8 e30b BNC 0x20e0 { C:\Projects\UBW\FW\D_143\user\user.c 0020ca 0e30 MOVLW 0x30 tmp -= '0'; C:\Projects\UBW\FW\D_143\user\user.c 0020cc 6e2a MOVWF 0x2a,0x0 0020ce 0e02 MOVLW 0x2 0020d0 cfdb MOVFF 0xfdb,0xfe7 0020d2 ffe7 0020d4 502a MOVF 0x2a,0x0,0x0 0020d6 5ee7 SUBWF 0xe7,0x1,0x0 0020d8 0e02 MOVLW 0x2 0020da cfe7 MOVFF 0xfe7,0xfdb 0020dc ffdb } C:\Projects\UBW\FW\D_143\user\user.c 0020de d019 BRA 0x2112 else if (tmp >= 'A' && tmp <= 'F') C:\Projects\UBW\FW\D_143\user\user.c 0020e0 0e41 MOVLW 0x41 0020e2 6ef3 MOVWF 0xf3,0x0 0020e4 0e02 MOVLW 0x2 0020e6 cfdb MOVFF 0xfdb,0xff4 0020e8 fff4 0020ea 50f3 MOVF 0xf3,0x0,0x0 0020ec 5cf4 SUBWF 0xf4,0x0,0x0 0020ee e30f BNC 0x210e 0020f0 0e02 MOVLW 0x2 0020f2 50db MOVF 0xdb,0x0,0x0 0020f4 0846 SUBLW 0x46 0020f6 e30b BNC 0x210e { C:\Projects\UBW\FW\D_143\user\user.c 0020f8 0e37 MOVLW 0x37 tmp -= 55; C:\Projects\UBW\FW\D_143\user\user.c 0020fa 6e2a MOVWF 0x2a,0x0 0020fc 0e02 MOVLW 0x2 0020fe cfdb MOVFF 0xfdb,0xfe7 002100 ffe7 002102 502a MOVF 0x2a,0x0,0x0 002104 5ee7 SUBWF 0xe7,0x1,0x0 002106 0e02 MOVLW 0x2 002108 cfe7 MOVFF 0xfe7,0xfdb 00210a ffdb } C:\Projects\UBW\FW\D_143\user\user.c 00210c d002 BRA 0x2112 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 00210e 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 002110 d051 BRA 0x21b4 return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 002112 0e02 MOVLW 0x2 BO_data_byte = BO_data_byte + tmp; C:\Projects\UBW\FW\D_143\user\user.c 002114 50db MOVF 0xdb,0x0,0x0 002116 24df ADDWF 0xdf,0x0,0x0 002118 6edf MOVWF 0xdf,0x0 00211a 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 00211c 2bb9 INCF 0xb9,0x1,0x1 00211e 0e40 MOVLW 0x40 002120 0101 MOVLB 0x1 002122 5db9 SUBWF 0xb9,0x0,0x1 002124 e102 BNZ 0x212a 002126 0101 MOVLB 0x1 002128 6bb9 CLRF 0xb9,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Output the byte on Port B C:\Projects\UBW\FW\D_143\user\user.c 00212a 50df MOVF 0xdf,0x0,0x0 LATB = BO_data_byte; C:\Projects\UBW\FW\D_143\user\user.c 00212c 6e8a MOVWF 0x8a,0x0 C:\Projects\UBW\FW\D_143\user\user.c // And strobe the Port A bits that we're supposed to C:\Projects\UBW\FW\D_143\user\user.c 00212e 0e01 MOVLW 0x1 LATA = new_port_A_value; C:\Projects\UBW\FW\D_143\user\user.c 002130 50db MOVF 0xdb,0x0,0x0 002132 6e89 MOVWF 0x89,0x0 002134 0101 MOVLB 0x1 if (g_BO_strobe_delay) C:\Projects\UBW\FW\D_143\user\user.c 002136 51b5 MOVF 0xb5,0x0,0x1 002138 e005 BZ 0x2144 { C:\Projects\UBW\FW\D_143\user\user.c 00213a c1b5 MOVFF 0x1b5,0xfe6 Delay10TCYx (g_BO_strobe_delay); C:\Projects\UBW\FW\D_143\user\user.c 00213c ffe6 00213e ecd7 CALL 0x47ae,0x0 002140 f023 002142 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 002144 c1b1 MOVFF 0x1b1,0xf89 LATA = g_BO_init; C:\Projects\UBW\FW\D_143\user\user.c 002146 ff89 C:\Projects\UBW\FW\D_143\user\user.c 002148 0101 MOVLB 0x1 if (g_BO_wait_delay) C:\Projects\UBW\FW\D_143\user\user.c 00214a 51b4 MOVF 0xb4,0x0,0x1 00214c e030 BZ 0x21ae { C:\Projects\UBW\FW\D_143\user\user.c // Now we spin on the wait bit specified in WaitMask C:\Projects\UBW\FW\D_143\user\user.c // (Used for Busy Bits) We also have to wait here C:\Projects\UBW\FW\D_143\user\user.c // for a maximum of g_BO_wait_delay, which is in 10 clock units C:\Projects\UBW\FW\D_143\user\user.c // First we wait for the wait mask to become asserted C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Set the wait counter to the number of delays we want C:\Projects\UBW\FW\D_143\user\user.c 00214e 0e03 MOVLW 0x3 wait_count = g_BO_wait_delay; C:\Projects\UBW\FW\D_143\user\user.c 002150 c1b4 MOVFF 0x1b4,0xfdb 002152 ffdb 00217c d7eb BRA 0x2154 while ( C:\Projects\UBW\FW\D_143\user\user.c 002154 0101 MOVLB 0x1 ((g_BO_init & g_BO_wait_mask) == (PORTA & g_BO_wait_mask)) C:\Projects\UBW\FW\D_143\user\user.c 002156 51b1 MOVF 0xb1,0x0,0x1 002158 0101 MOVLB 0x1 00215a 15b3 ANDWF 0xb3,0x0,0x1 00215c 6e2a MOVWF 0x2a,0x0 00215e 0101 MOVLB 0x1 002160 51b3 MOVF 0xb3,0x0,0x1 002162 1480 ANDWF 0x80,0x0,0x0 002164 5c2a SUBWF 0x2a,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c 002168 0e03 MOVLW 0x3 (wait_count != 0) C:\Projects\UBW\FW\D_143\user\user.c 00216a 50db MOVF 0xdb,0x0,0x0 002166 e10b BNZ 0x217e ) C:\Projects\UBW\FW\D_143\user\user.c 00216c e008 BZ 0x217e { C:\Projects\UBW\FW\D_143\user\user.c 00216e 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 002170 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 002172 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 002174 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 002176 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 002178 0e03 MOVLW 0x3 wait_count--; C:\Projects\UBW\FW\D_143\user\user.c 00217a 06db DECF 0xdb,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Set the wait counter to the number of delays we want C:\Projects\UBW\FW\D_143\user\user.c 00217e 0e03 MOVLW 0x3 wait_count = g_BO_wait_delay; C:\Projects\UBW\FW\D_143\user\user.c 002180 c1b4 MOVFF 0x1b4,0xfdb 002182 ffdb // Then we wait for the wait mask to become de-asserted C:\Projects\UBW\FW\D_143\user\user.c 0021ac d7eb BRA 0x2184 while ( C:\Projects\UBW\FW\D_143\user\user.c 002184 0101 MOVLB 0x1 ((g_BO_init & g_BO_wait_mask) != (PORTA & g_BO_wait_mask)) C:\Projects\UBW\FW\D_143\user\user.c 002186 51b1 MOVF 0xb1,0x0,0x1 002188 0101 MOVLB 0x1 00218a 15b3 ANDWF 0xb3,0x0,0x1 00218c 6e2a MOVWF 0x2a,0x0 00218e 0101 MOVLB 0x1 002190 51b3 MOVF 0xb3,0x0,0x1 002192 1480 ANDWF 0x80,0x0,0x0 002194 5c2a SUBWF 0x2a,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c 002198 0e03 MOVLW 0x3 (wait_count != 0) C:\Projects\UBW\FW\D_143\user\user.c 00219a 50db MOVF 0xdb,0x0,0x0 002196 e00b BZ 0x21ae ) C:\Projects\UBW\FW\D_143\user\user.c 00219c e008 BZ 0x21ae { C:\Projects\UBW\FW\D_143\user\user.c 00219e 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0021a0 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0021a2 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0021a4 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0021a6 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0021a8 0e03 MOVLW 0x3 wait_count--; C:\Projects\UBW\FW\D_143\user\user.c 0021aa 06db DECF 0xdb,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0021b0 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 0021b2 f009 0021b4 0e04 MOVLW 0x4 } C:\Projects\UBW\FW\D_143\user\user.c 0021b6 5ce1 SUBWF 0xe1,0x0,0x0 0021b8 e202 BC 0x21be 0021ba 6ae1 CLRF 0xe1,0x0 0021bc 52e5 MOVF 0xe5,0x1,0x0 0021be 6ee1 MOVWF 0xe1,0x0 0021c0 52e5 MOVF 0xe5,0x1,0x0 0021c2 cfe7 MOVFF 0xfe7,0xfd9 0021c4 ffd9 0021c6 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // Bulk Stream (BS) (he he, couldn't think of a better name) C:\Projects\UBW\FW\D_143\user\user.c // BS,, C:\Projects\UBW\FW\D_143\user\user.c // This command is extremely similar to the BO command C:\Projects\UBW\FW\D_143\user\user.c // except that instead of ASCII HEX values, it actually C:\Projects\UBW\FW\D_143\user\user.c // takes raw binary data. C:\Projects\UBW\FW\D_143\user\user.c // So in order for the UBW to know when the end of the stream C:\Projects\UBW\FW\D_143\user\user.c // is, we need to have a of bytes. C:\Projects\UBW\FW\D_143\user\user.c // represents the number of bytes after the second comma C:\Projects\UBW\FW\D_143\user\user.c // that will be the actual binary data to be streamed out port B. C:\Projects\UBW\FW\D_143\user\user.c // Then, must be exactly that length. C:\Projects\UBW\FW\D_143\user\user.c // must be between 1 and 56 (currently - in the future C:\Projects\UBW\FW\D_143\user\user.c // it would be nice to extend the upper limit) C:\Projects\UBW\FW\D_143\user\user.c // The UBW will pull in one byte at a time within the C:\Projects\UBW\FW\D_143\user\user.c // section and output it to PORTB exactly as the BO command does. C:\Projects\UBW\FW\D_143\user\user.c // It will do this for bytes. It will then pull in another C:\Projects\UBW\FW\D_143\user\user.c // byte (which must be a carrige return) and be done. C:\Projects\UBW\FW\D_143\user\user.c // The whole point of this command is to improve data throughput C:\Projects\UBW\FW\D_143\user\user.c // from the PC to the UBW. This form of data is also more efficient C:\Projects\UBW\FW\D_143\user\user.c // for the UBW to process. C:\Projects\UBW\FW\D_143\user\user.c 0021c8 cfd9 MOVFF 0xfd9,0xfe6 void parse_BS_packet(void) C:\Projects\UBW\FW\D_143\user\user.c 0021ca ffe6 0021cc cfe1 MOVFF 0xfe1,0xfd9 0021ce ffd9 0021d0 0e05 MOVLW 0x5 0021d2 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char BO_data_byte; C:\Projects\UBW\FW\D_143\user\user.c unsigned char new_port_A_value; C:\Projects\UBW\FW\D_143\user\user.c unsigned char tmp; C:\Projects\UBW\FW\D_143\user\user.c 0021d4 0e03 MOVLW 0x3 unsigned char wait_count = 0; C:\Projects\UBW\FW\D_143\user\user.c 0021d6 6adb CLRF 0xdb,0x0 0021d8 0e04 MOVLW 0x4 unsigned char byte_count = 0; C:\Projects\UBW\FW\D_143\user\user.c 0021da 6adb CLRF 0xdb,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Get byte_count C:\Projects\UBW\FW\D_143\user\user.c 0021dc 0e01 MOVLW 0x1 byte_count = extract_number (kUCHAR); C:\Projects\UBW\FW\D_143\user\user.c 0021de 6ee6 MOVWF 0xe6,0x0 0021e0 d8c1 RCALL 0x2364 0021e2 52e5 MOVF 0xe5,0x1,0x0 0021e4 0e04 MOVLW 0x4 0021e6 c01d MOVFF 0x1d,0xfdb 0021e8 ffdb C:\Projects\UBW\FW\D_143\user\user.c // Limit check it C:\Projects\UBW\FW\D_143\user\user.c 0021ea 0e04 MOVLW 0x4 if (0 == byte_count || byte_count > 56) C:\Projects\UBW\FW\D_143\user\user.c 0021ec 50db MOVF 0xdb,0x0,0x0 0021ee e004 BZ 0x21f8 0021f0 0e04 MOVLW 0x4 0021f2 50db MOVF 0xdb,0x0,0x0 0021f4 0838 SUBLW 0x38 0021f6 e202 BC 0x21fc { C:\Projects\UBW\FW\D_143\user\user.c 0021f8 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 0021fa d098 BRA 0x232c return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Check for comma where ptr points C:\Projects\UBW\FW\D_143\user\user.c 0021fc 0101 MOVLB 0x1 if (g_RX_buf[g_RX_buf_out] != ',') C:\Projects\UBW\FW\D_143\user\user.c 0021fe 51b9 MOVF 0xb9,0x0,0x1 002200 6aea CLRF 0xea,0x0 002202 0f40 ADDLW 0x40 002204 6ee9 MOVWF 0xe9,0x0 002206 0e02 MOVLW 0x2 002208 22ea ADDWFC 0xea,0x1,0x0 00220a 50ef MOVF 0xef,0x0,0x0 00220c 082c SUBLW 0x2c 00220e e01d BZ 0x224a { C:\Projects\UBW\FW\D_143\user\user.c 002210 0101 MOVLB 0x1 printf ((far rom char *)"!5 Err: Need comma next, found: '%c'\r\n", g_RX_buf[g_RX_buf_out]); C:\Projects\UBW\FW\D_143\user\user.c 002212 51b9 MOVF 0xb9,0x0,0x1 002214 6aea CLRF 0xea,0x0 002216 0f40 ADDLW 0x40 002218 6ee9 MOVWF 0xe9,0x0 00221a 0e02 MOVLW 0x2 00221c 22ea ADDWFC 0xea,0x1,0x0 00221e 50ef MOVF 0xef,0x0,0x0 002220 6ee6 MOVWF 0xe6,0x0 002222 6ae6 CLRF 0xe6,0x0 002224 0efa MOVLW 0xfa 002226 6e2a MOVWF 0x2a,0x0 002228 0e40 MOVLW 0x40 00222a 6e2b MOVWF 0x2b,0x0 00222c 6a2c CLRF 0x2c,0x0 00222e c02a MOVFF 0x2a,0xfe6 002230 ffe6 002232 c02b MOVFF 0x2b,0xfe6 002234 ffe6 002236 c02c MOVFF 0x2c,0xfe6 002238 ffe6 00223a ec4d CALL 0x449a,0x0 00223c f022 00223e 6e2d MOVWF 0x2d,0x0 002240 0e05 MOVLW 0x5 002242 5ee1 SUBWF 0xe1,0x1,0x0 002244 502d MOVF 0x2d,0x0,0x0 002246 8a0d BSF 0xd,0x5,0x0 bitset (error_byte, kERROR_BYTE_PRINTED_ERROR); C:\Projects\UBW\FW\D_143\user\user.c 002248 d071 BRA 0x232c return; C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Move to the next character C:\Projects\UBW\FW\D_143\user\user.c 00224a 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 00224c 2bb9 INCF 0xb9,0x1,0x1 00224e 0e40 MOVLW 0x40 002250 0101 MOVLB 0x1 002252 5db9 SUBWF 0xb9,0x0,0x1 002254 e102 BNZ 0x225a 002256 0101 MOVLB 0x1 002258 6bb9 CLRF 0xb9,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Make sure Port A is correct C:\Projects\UBW\FW\D_143\user\user.c 00225a c1b1 MOVFF 0x1b1,0xf89 LATA = g_BO_init; C:\Projects\UBW\FW\D_143\user\user.c 00225c ff89 00225e 0101 MOVLB 0x1 new_port_A_value = ((~LATA & g_BO_strobe_mask)) | (LATA & ~g_BO_strobe_mask); C:\Projects\UBW\FW\D_143\user\user.c 002260 1db2 COMF 0xb2,0x0,0x1 002262 1489 ANDWF 0x89,0x0,0x0 002264 6e2a MOVWF 0x2a,0x0 002266 1c89 COMF 0x89,0x0,0x0 002268 0101 MOVLB 0x1 00226a 15b2 ANDWF 0xb2,0x0,0x1 00226c 102a IORWF 0x2a,0x0,0x0 00226e 6ee7 MOVWF 0xe7,0x0 002270 0e01 MOVLW 0x1 002272 cfe7 MOVFF 0xfe7,0xfdb 002274 ffdb C:\Projects\UBW\FW\D_143\user\user.c 002276 0e04 MOVLW 0x4 while (byte_count != 0) C:\Projects\UBW\FW\D_143\user\user.c 002278 50db MOVF 0xdb,0x0,0x0 00227a e056 BZ 0x2328 002326 d7a7 BRA 0x2276 { C:\Projects\UBW\FW\D_143\user\user.c // Pull in a single byte from input buffer C:\Projects\UBW\FW\D_143\user\user.c 00227c 0101 MOVLB 0x1 BO_data_byte = g_RX_buf[g_RX_buf_out]; C:\Projects\UBW\FW\D_143\user\user.c 00227e 51b9 MOVF 0xb9,0x0,0x1 002280 6aea CLRF 0xea,0x0 002282 0f40 ADDLW 0x40 002284 6ee9 MOVWF 0xe9,0x0 002286 0e02 MOVLW 0x2 002288 22ea ADDWFC 0xea,0x1,0x0 00228a cfef MOVFF 0xfef,0xfdf 00228c ffdf 00228e 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 002290 2bb9 INCF 0xb9,0x1,0x1 002292 0e40 MOVLW 0x40 002294 0101 MOVLB 0x1 002296 5db9 SUBWF 0xb9,0x0,0x1 002298 e102 BNZ 0x229e 00229a 0101 MOVLB 0x1 00229c 6bb9 CLRF 0xb9,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Count this byte C:\Projects\UBW\FW\D_143\user\user.c 00229e 0e04 MOVLW 0x4 byte_count--; C:\Projects\UBW\FW\D_143\user\user.c 0022a0 06db DECF 0xdb,0x1,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Output the byte on Port B C:\Projects\UBW\FW\D_143\user\user.c 0022a2 50df MOVF 0xdf,0x0,0x0 LATB = BO_data_byte; C:\Projects\UBW\FW\D_143\user\user.c 0022a4 6e8a MOVWF 0x8a,0x0 C:\Projects\UBW\FW\D_143\user\user.c // And strobe the Port A bits that we're supposed to C:\Projects\UBW\FW\D_143\user\user.c 0022a6 0e01 MOVLW 0x1 LATA = new_port_A_value; C:\Projects\UBW\FW\D_143\user\user.c 0022a8 50db MOVF 0xdb,0x0,0x0 0022aa 6e89 MOVWF 0x89,0x0 0022ac 0101 MOVLB 0x1 if (g_BO_strobe_delay) C:\Projects\UBW\FW\D_143\user\user.c 0022ae 51b5 MOVF 0xb5,0x0,0x1 0022b0 e005 BZ 0x22bc { C:\Projects\UBW\FW\D_143\user\user.c 0022b2 c1b5 MOVFF 0x1b5,0xfe6 Delay10TCYx (g_BO_strobe_delay); C:\Projects\UBW\FW\D_143\user\user.c 0022b4 ffe6 0022b6 ecd7 CALL 0x47ae,0x0 0022b8 f023 0022ba 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 0022bc c1b1 MOVFF 0x1b1,0xf89 LATA = g_BO_init; C:\Projects\UBW\FW\D_143\user\user.c 0022be ff89 C:\Projects\UBW\FW\D_143\user\user.c 0022c0 0101 MOVLB 0x1 if (g_BO_wait_delay) C:\Projects\UBW\FW\D_143\user\user.c 0022c2 51b4 MOVF 0xb4,0x0,0x1 0022c4 e030 BZ 0x2326 { C:\Projects\UBW\FW\D_143\user\user.c // Now we spin on the wait bit specified in WaitMask C:\Projects\UBW\FW\D_143\user\user.c // (Used for Busy Bits) We also have to wait here C:\Projects\UBW\FW\D_143\user\user.c // for a maximum of g_BO_wait_delay, which is in 10 clock units C:\Projects\UBW\FW\D_143\user\user.c // First we wait for the wait mask to become asserted C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Set the wait counter to the number of delays we want C:\Projects\UBW\FW\D_143\user\user.c 0022c6 0e03 MOVLW 0x3 wait_count = g_BO_wait_delay; C:\Projects\UBW\FW\D_143\user\user.c 0022c8 c1b4 MOVFF 0x1b4,0xfdb 0022ca ffdb 0022f4 d7eb BRA 0x22cc while ( C:\Projects\UBW\FW\D_143\user\user.c 0022cc 0101 MOVLB 0x1 ((g_BO_init & g_BO_wait_mask) == (PORTA & g_BO_wait_mask)) C:\Projects\UBW\FW\D_143\user\user.c 0022ce 51b1 MOVF 0xb1,0x0,0x1 0022d0 0101 MOVLB 0x1 0022d2 15b3 ANDWF 0xb3,0x0,0x1 0022d4 6e2a MOVWF 0x2a,0x0 0022d6 0101 MOVLB 0x1 0022d8 51b3 MOVF 0xb3,0x0,0x1 0022da 1480 ANDWF 0x80,0x0,0x0 0022dc 5c2a SUBWF 0x2a,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c 0022e0 0e03 MOVLW 0x3 (wait_count != 0) C:\Projects\UBW\FW\D_143\user\user.c 0022e2 50db MOVF 0xdb,0x0,0x0 0022de e10b BNZ 0x22f6 ) C:\Projects\UBW\FW\D_143\user\user.c 0022e4 e008 BZ 0x22f6 { C:\Projects\UBW\FW\D_143\user\user.c 0022e6 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0022e8 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0022ea 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0022ec 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0022ee 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 0022f0 0e03 MOVLW 0x3 wait_count--; C:\Projects\UBW\FW\D_143\user\user.c 0022f2 06db DECF 0xdb,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Set the wait counter to the number of delays we want C:\Projects\UBW\FW\D_143\user\user.c 0022f6 0e03 MOVLW 0x3 wait_count = g_BO_wait_delay; C:\Projects\UBW\FW\D_143\user\user.c 0022f8 c1b4 MOVFF 0x1b4,0xfdb 0022fa ffdb // Then we wait for the wait mask to become de-asserted C:\Projects\UBW\FW\D_143\user\user.c 002324 d7eb BRA 0x22fc while ( C:\Projects\UBW\FW\D_143\user\user.c 0022fc 0101 MOVLB 0x1 ((g_BO_init & g_BO_wait_mask) != (PORTA & g_BO_wait_mask)) C:\Projects\UBW\FW\D_143\user\user.c 0022fe 51b1 MOVF 0xb1,0x0,0x1 002300 0101 MOVLB 0x1 002302 15b3 ANDWF 0xb3,0x0,0x1 002304 6e2a MOVWF 0x2a,0x0 002306 0101 MOVLB 0x1 002308 51b3 MOVF 0xb3,0x0,0x1 00230a 1480 ANDWF 0x80,0x0,0x0 00230c 5c2a SUBWF 0x2a,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c 002310 0e03 MOVLW 0x3 (wait_count != 0) C:\Projects\UBW\FW\D_143\user\user.c 002312 50db MOVF 0xdb,0x0,0x0 00230e e00b BZ 0x2326 ) C:\Projects\UBW\FW\D_143\user\user.c 002314 e008 BZ 0x2326 { C:\Projects\UBW\FW\D_143\user\user.c 002316 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 002318 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 00231a 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 00231c 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 00231e 0000 NOP Delay1TCY (); C:\Projects\UBW\FW\D_143\user\user.c 002320 0e03 MOVLW 0x3 wait_count--; C:\Projects\UBW\FW\D_143\user\user.c 002322 06db DECF 0xdb,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 002328 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 00232a f009 00232c 0e05 MOVLW 0x5 } C:\Projects\UBW\FW\D_143\user\user.c 00232e 5ce1 SUBWF 0xe1,0x0,0x0 002330 e202 BC 0x2336 002332 6ae1 CLRF 0xe1,0x0 002334 52e5 MOVF 0xe5,0x1,0x0 002336 6ee1 MOVWF 0xe1,0x0 002338 52e5 MOVF 0xe5,0x1,0x0 00233a cfe7 MOVFF 0xfe7,0xfd9 00233c ffd9 00233e 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // SS Send SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_SS_packet (void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002340 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 002342 f009 C:\Projects\UBW\FW\D_143\user\user.c 002344 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // RS Receive SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_RS_packet (void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002346 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 002348 f009 C:\Projects\UBW\FW\D_143\user\user.c 00234a 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // CS Configure SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_CS_packet (void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 00234c ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 00234e f009 C:\Projects\UBW\FW\D_143\user\user.c 002350 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // SI Send I2C C:\Projects\UBW\FW\D_143\user\user.c void parse_SI_packet (void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002352 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 002354 f009 C:\Projects\UBW\FW\D_143\user\user.c 002356 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // RI Receive I2C C:\Projects\UBW\FW\D_143\user\user.c void parse_RI_packet (void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002358 ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 00235a f009 C:\Projects\UBW\FW\D_143\user\user.c 00235c 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // CI Configure I2C C:\Projects\UBW\FW\D_143\user\user.c void parse_CI_packet (void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 00235e ece6 CALL 0x13cc,0x0 print_ack (); C:\Projects\UBW\FW\D_143\user\user.c 002360 f009 C:\Projects\UBW\FW\D_143\user\user.c 002362 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Look at the string pointed to by ptr C:\Projects\UBW\FW\D_143\user\user.c // There should be a comma where ptr points to upon entry. C:\Projects\UBW\FW\D_143\user\user.c // If not, throw a comma error. C:\Projects\UBW\FW\D_143\user\user.c // If so, then look for up to three bytes after the C:\Projects\UBW\FW\D_143\user\user.c // comma for numbers, and put them all into one C:\Projects\UBW\FW\D_143\user\user.c // byte (0-255). If the number is greater than 255, then C:\Projects\UBW\FW\D_143\user\user.c // thow a range error. C:\Projects\UBW\FW\D_143\user\user.c // Advance the pointer to the byte after the last number C:\Projects\UBW\FW\D_143\user\user.c // and return. C:\Projects\UBW\FW\D_143\user\user.c 002364 cfd9 MOVFF 0xfd9,0xfe6 signed short long extract_number(tExtractType type) C:\Projects\UBW\FW\D_143\user\user.c 002366 ffe6 002368 cfe1 MOVFF 0xfe1,0xfd9 00236a ffd9 00236c 0e04 MOVLW 0x4 00236e 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c signed short long acc; C:\Projects\UBW\FW\D_143\user\user.c 002370 0e03 MOVLW 0x3 unsigned char neg = FALSE; C:\Projects\UBW\FW\D_143\user\user.c 002372 6adb CLRF 0xdb,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Check to see if we're already at the end C:\Projects\UBW\FW\D_143\user\user.c 002374 0e0d MOVLW 0xd if (kCR == g_RX_buf[g_RX_buf_out]) C:\Projects\UBW\FW\D_143\user\user.c 002376 6e2a MOVWF 0x2a,0x0 002378 0101 MOVLB 0x1 00237a 51b9 MOVF 0xb9,0x0,0x1 00237c 6aea CLRF 0xea,0x0 00237e 0f40 ADDLW 0x40 002380 6ee9 MOVWF 0xe9,0x0 002382 0e02 MOVLW 0x2 002384 22ea ADDWFC 0xea,0x1,0x0 002386 50ef MOVF 0xef,0x0,0x0 002388 5c2a SUBWF 0x2a,0x0,0x0 00238a e105 BNZ 0x2396 { C:\Projects\UBW\FW\D_143\user\user.c 00238c 880d BSF 0xd,0x4,0x0 bitset (error_byte, kERROR_BYTE_MISSING_PARAMETER); C:\Projects\UBW\FW\D_143\user\user.c 00238e 6a1d CLRF 0x1d,0x0 return (0); C:\Projects\UBW\FW\D_143\user\user.c 002390 6a1e CLRF 0x1e,0x0 002392 6a1f CLRF 0x1f,0x0 002394 d193 BRA 0x26bc } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Check for comma where ptr points C:\Projects\UBW\FW\D_143\user\user.c 002396 0101 MOVLB 0x1 if (g_RX_buf[g_RX_buf_out] != ',') C:\Projects\UBW\FW\D_143\user\user.c 002398 51b9 MOVF 0xb9,0x0,0x1 00239a 6aea CLRF 0xea,0x0 00239c 0f40 ADDLW 0x40 00239e 6ee9 MOVWF 0xe9,0x0 0023a0 0e02 MOVLW 0x2 0023a2 22ea ADDWFC 0xea,0x1,0x0 0023a4 50ef MOVF 0xef,0x0,0x0 0023a6 082c SUBLW 0x2c 0023a8 e020 BZ 0x23ea { C:\Projects\UBW\FW\D_143\user\user.c 0023aa 0101 MOVLB 0x1 printf ((far rom char *)"!5 Err: Need comma next, found: '%c'\r\n", g_RX_buf[g_RX_buf_out]); C:\Projects\UBW\FW\D_143\user\user.c 0023ac 51b9 MOVF 0xb9,0x0,0x1 0023ae 6aea CLRF 0xea,0x0 0023b0 0f40 ADDLW 0x40 0023b2 6ee9 MOVWF 0xe9,0x0 0023b4 0e02 MOVLW 0x2 0023b6 22ea ADDWFC 0xea,0x1,0x0 0023b8 50ef MOVF 0xef,0x0,0x0 0023ba 6ee6 MOVWF 0xe6,0x0 0023bc 6ae6 CLRF 0xe6,0x0 0023be 0efa MOVLW 0xfa 0023c0 6e2a MOVWF 0x2a,0x0 0023c2 0e40 MOVLW 0x40 0023c4 6e2b MOVWF 0x2b,0x0 0023c6 6a2c CLRF 0x2c,0x0 0023c8 c02a MOVFF 0x2a,0xfe6 0023ca ffe6 0023cc c02b MOVFF 0x2b,0xfe6 0023ce ffe6 0023d0 c02c MOVFF 0x2c,0xfe6 0023d2 ffe6 0023d4 ec4d CALL 0x449a,0x0 0023d6 f022 0023d8 6e2d MOVWF 0x2d,0x0 0023da 0e05 MOVLW 0x5 0023dc 5ee1 SUBWF 0xe1,0x1,0x0 0023de 502d MOVF 0x2d,0x0,0x0 0023e0 8a0d BSF 0xd,0x5,0x0 bitset (error_byte, kERROR_BYTE_PRINTED_ERROR); C:\Projects\UBW\FW\D_143\user\user.c 0023e2 6a1d CLRF 0x1d,0x0 return (0); C:\Projects\UBW\FW\D_143\user\user.c 0023e4 6a1e CLRF 0x1e,0x0 0023e6 6a1f CLRF 0x1f,0x0 0023e8 d169 BRA 0x26bc } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Move to the next character C:\Projects\UBW\FW\D_143\user\user.c 0023ea 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 0023ec 2bb9 INCF 0xb9,0x1,0x1 0023ee 0e40 MOVLW 0x40 0023f0 0101 MOVLB 0x1 0023f2 5db9 SUBWF 0xb9,0x0,0x1 0023f4 e102 BNZ 0x23fa 0023f6 0101 MOVLB 0x1 0023f8 6bb9 CLRF 0xb9,0x1 C:\Projects\UBW\FW\D_143\user\user.c // Now check for a sign character if we're not looking for ASCII chars C:\Projects\UBW\FW\D_143\user\user.c if ( C:\Projects\UBW\FW\D_143\user\user.c 0023fa 0e2d MOVLW 0x2d ('-' == g_RX_buf[g_RX_buf_out]) C:\Projects\UBW\FW\D_143\user\user.c 0023fc 6e2a MOVWF 0x2a,0x0 0023fe 0101 MOVLB 0x1 002400 51b9 MOVF 0xb9,0x0,0x1 002402 6aea CLRF 0xea,0x0 002404 0f40 ADDLW 0x40 002406 6ee9 MOVWF 0xe9,0x0 002408 0e02 MOVLW 0x2 00240a 22ea ADDWFC 0xea,0x1,0x0 00240c 50ef MOVF 0xef,0x0,0x0 00240e 5c2a SUBWF 0x2a,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c 002412 0e04 MOVLW 0x4 (kASCII_CHAR != type) C:\Projects\UBW\FW\D_143\user\user.c 002414 6e2b MOVWF 0x2b,0x0 002416 0efe MOVLW 0xfe 002418 50db MOVF 0xdb,0x0,0x0 00241a 5c2b SUBWF 0x2b,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c 00241e 0e05 MOVLW 0x5 (kUCASE_ASCII_CHAR != type) C:\Projects\UBW\FW\D_143\user\user.c 002420 6e2c MOVWF 0x2c,0x0 002422 0efe MOVLW 0xfe 002424 50db MOVF 0xdb,0x0,0x0 002426 5c2c SUBWF 0x2c,0x0,0x0 00241c e022 BZ 0x2462 ) C:\Projects\UBW\FW\D_143\user\user.c 002428 e01c BZ 0x2462 002410 e128 BNZ 0x2462 ) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // It's an error if we see a negative sign on an unsigned value C:\Projects\UBW\FW\D_143\user\user.c if ( C:\Projects\UBW\FW\D_143\user\user.c 00242a 0efe MOVLW 0xfe (kUCHAR == type) C:\Projects\UBW\FW\D_143\user\user.c 00242c 04db DECF 0xdb,0x0,0x0 || C:\Projects\UBW\FW\D_143\user\user.c 002430 0e03 MOVLW 0x3 (kUINT == type) C:\Projects\UBW\FW\D_143\user\user.c 002432 6e2a MOVWF 0x2a,0x0 002434 0efe MOVLW 0xfe 002436 50db MOVF 0xdb,0x0,0x0 002438 5c2a SUBWF 0x2a,0x0,0x0 00242e e006 BZ 0x243c ) C:\Projects\UBW\FW\D_143\user\user.c 00243a e106 BNZ 0x2448 { C:\Projects\UBW\FW\D_143\user\user.c 00243c 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 00243e 6a1d CLRF 0x1d,0x0 return (0); C:\Projects\UBW\FW\D_143\user\user.c 002440 6a1e CLRF 0x1e,0x0 002442 6a1f CLRF 0x1f,0x0 002444 d13b BRA 0x26bc } C:\Projects\UBW\FW\D_143\user\user.c 002446 d00d BRA 0x2462 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002448 0e01 MOVLW 0x1 neg = TRUE; C:\Projects\UBW\FW\D_143\user\user.c 00244a 6ef3 MOVWF 0xf3,0x0 00244c 0e03 MOVLW 0x3 00244e cff3 MOVFF 0xff3,0xfdb 002450 ffdb // Move to the next character C:\Projects\UBW\FW\D_143\user\user.c 002452 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 002454 2bb9 INCF 0xb9,0x1,0x1 002456 0e40 MOVLW 0x40 002458 0101 MOVLB 0x1 00245a 5db9 SUBWF 0xb9,0x0,0x1 00245c e102 BNZ 0x2462 00245e 0101 MOVLB 0x1 002460 6bb9 CLRF 0xb9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // If we need to get a digit, go do that C:\Projects\UBW\FW\D_143\user\user.c if ( C:\Projects\UBW\FW\D_143\user\user.c 002462 0e04 MOVLW 0x4 (kASCII_CHAR != type) C:\Projects\UBW\FW\D_143\user\user.c 002464 6e2a MOVWF 0x2a,0x0 002466 0efe MOVLW 0xfe 002468 50db MOVF 0xdb,0x0,0x0 00246a 5c2a SUBWF 0x2a,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c 00246e 0e05 MOVLW 0x5 (kUCASE_ASCII_CHAR != type) C:\Projects\UBW\FW\D_143\user\user.c 002470 6e2b MOVWF 0x2b,0x0 002472 0efe MOVLW 0xfe 002474 50db MOVF 0xdb,0x0,0x0 002476 5c2b SUBWF 0x2b,0x0,0x0 00246c e011 BZ 0x2490 ) C:\Projects\UBW\FW\D_143\user\user.c 002478 e00b BZ 0x2490 { C:\Projects\UBW\FW\D_143\user\user.c 00247a 0e05 MOVLW 0x5 extract_digit(&acc, 5); C:\Projects\UBW\FW\D_143\user\user.c 00247c 6ee6 MOVWF 0xe6,0x0 00247e cfd9 MOVFF 0xfd9,0xfe6 002480 ffe6 002482 cfda MOVFF 0xfda,0xfe6 002484 ffe6 002486 d924 RCALL 0x26d0 002488 52e5 MOVF 0xe5,0x1,0x0 00248a 52e5 MOVF 0xe5,0x1,0x0 00248c 52e5 MOVF 0xe5,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 00248e d03a BRA 0x2504 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Otherwise just copy the byte C:\Projects\UBW\FW\D_143\user\user.c 002490 0101 MOVLB 0x1 acc = g_RX_buf[g_RX_buf_out]; C:\Projects\UBW\FW\D_143\user\user.c 002492 51b9 MOVF 0xb9,0x0,0x1 002494 6aea CLRF 0xea,0x0 002496 0f40 ADDLW 0x40 002498 6ee9 MOVWF 0xe9,0x0 00249a 0e02 MOVLW 0x2 00249c 22ea ADDWFC 0xea,0x1,0x0 00249e cfef MOVFF 0xfef,0x2a 0024a0 f02a 0024a2 6a2b CLRF 0x2b,0x0 0024a4 6a2c CLRF 0x2c,0x0 0024a6 c02a MOVFF 0x2a,0xfdf 0024a8 ffdf 0024aa 0e01 MOVLW 0x1 0024ac c02b MOVFF 0x2b,0xfdb 0024ae ffdb 0024b0 0e02 MOVLW 0x2 0024b2 c02c MOVFF 0x2c,0xfdb 0024b4 ffdb C:\Projects\UBW\FW\D_143\user\user.c // Force uppercase if that's what type we have C:\Projects\UBW\FW\D_143\user\user.c 0024b6 0e05 MOVLW 0x5 if (kUCASE_ASCII_CHAR == type) C:\Projects\UBW\FW\D_143\user\user.c 0024b8 6e2a MOVWF 0x2a,0x0 0024ba 0efe MOVLW 0xfe 0024bc 50db MOVF 0xdb,0x0,0x0 0024be 5c2a SUBWF 0x2a,0x0,0x0 0024c0 e119 BNZ 0x24f4 { C:\Projects\UBW\FW\D_143\user\user.c 0024c2 0e00 MOVLW 0x0 acc = toupper (acc); C:\Projects\UBW\FW\D_143\user\user.c 0024c4 cfdb MOVFF 0xfdb,0xfe6 0024c6 ffe6 0024c8 0e01 MOVLW 0x1 0024ca cfdb MOVFF 0xfdb,0xfe6 0024cc ffe6 0024ce ec46 CALL 0x468c,0x0 0024d0 f023 0024d2 52e5 MOVF 0xe5,0x1,0x0 0024d4 52e5 MOVF 0xe5,0x1,0x0 0024d6 cff3 MOVFF 0xff3,0x2a 0024d8 f02a 0024da cff4 MOVFF 0xff4,0x2b 0024dc f02b 0024de 6a2c CLRF 0x2c,0x0 0024e0 be2b BTFSC 0x2b,0x7,0x0 0024e2 682c SETF 0x2c,0x0 0024e4 c02a MOVFF 0x2a,0xfdf 0024e6 ffdf 0024e8 0e01 MOVLW 0x1 0024ea c02b MOVFF 0x2b,0xfdb 0024ec ffdb 0024ee 0e02 MOVLW 0x2 0024f0 c02c MOVFF 0x2c,0xfdb 0024f2 ffdb } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Move to the next character C:\Projects\UBW\FW\D_143\user\user.c 0024f4 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 0024f6 2bb9 INCF 0xb9,0x1,0x1 0024f8 0e40 MOVLW 0x40 0024fa 0101 MOVLB 0x1 0024fc 5db9 SUBWF 0xb9,0x0,0x1 0024fe e102 BNZ 0x2504 002500 0101 MOVLB 0x1 002502 6bb9 CLRF 0xb9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Handle the negative sign C:\Projects\UBW\FW\D_143\user\user.c 002504 0e03 MOVLW 0x3 if (neg) C:\Projects\UBW\FW\D_143\user\user.c 002506 50db MOVF 0xdb,0x0,0x0 002508 e021 BZ 0x254c { C:\Projects\UBW\FW\D_143\user\user.c 00250a cfdf MOVFF 0xfdf,0x2a acc = -acc; C:\Projects\UBW\FW\D_143\user\user.c 00250c f02a 00250e 0e01 MOVLW 0x1 002510 cfdb MOVFF 0xfdb,0x2b 002512 f02b 002514 0e02 MOVLW 0x2 002516 cfdb MOVFF 0xfdb,0x2c 002518 f02c 00251a 6822 SETF 0x22,0x0 00251c 6823 SETF 0x23,0x0 00251e 6824 SETF 0x24,0x0 002520 c02a MOVFF 0x2a,0x1d 002522 f01d 002524 c02b MOVFF 0x2b,0x1e 002526 f01e 002528 c02c MOVFF 0x2c,0x1f 00252a f01f 00252c ec21 CALL 0x4242,0x0 00252e f021 002530 c01a MOVFF 0x1a,0x2a 002532 f02a 002534 c01b MOVFF 0x1b,0x2b 002536 f02b 002538 c01c MOVFF 0x1c,0x2c 00253a f02c 00253c c02a MOVFF 0x2a,0xfdf 00253e ffdf 002540 0e01 MOVLW 0x1 002542 c02b MOVFF 0x2b,0xfdb 002544 ffdb 002546 0e02 MOVLW 0x2 002548 c02c MOVFF 0x2c,0xfdb 00254a ffdb } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Range check the new value C:\Projects\UBW\FW\D_143\user\user.c if ( C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c 00254c 0efe MOVLW 0xfe kCHAR == type C:\Projects\UBW\FW\D_143\user\user.c 00254e 50db MOVF 0xdb,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c 002552 cfdf MOVFF 0xfdf,0x2a (acc > 127) C:\Projects\UBW\FW\D_143\user\user.c 002554 f02a 002556 0e01 MOVLW 0x1 002558 cfdb MOVFF 0xfdb,0x2b 00255a f02b 00255c 0e02 MOVLW 0x2 00255e cfdb MOVFF 0xfdb,0x2c 002560 f02c 002562 342c RLCF 0x2c,0x0,0x0 002564 0e00 MOVLW 0x0 002566 182c XORWF 0x2c,0x0,0x0 002568 e607 BN 0x2578 00256a 80d8 BSF 0xd8,0x0,0x0 00256c 0e7f MOVLW 0x7f 00256e 542a SUBFWB 0x2a,0x0,0x0 002570 0e00 MOVLW 0x0 002572 542b SUBFWB 0x2b,0x0,0x0 002574 0e00 MOVLW 0x0 002576 542c SUBFWB 0x2c,0x0,0x0 || C:\Projects\UBW\FW\D_143\user\user.c 00257c cfd9 MOVFF 0xfd9,0xfe9 (acc < -128) C:\Projects\UBW\FW\D_143\user\user.c 00257e ffe9 002580 cfda MOVFF 0xfda,0xfea 002582 ffea 002584 0e02 MOVLW 0x2 002586 80d8 BSF 0xd8,0x0,0x0 002588 50eb MOVF 0xeb,0x0,0x0 00258a 0aff XORLW 0xff 00258c e606 BN 0x259a 00258e 0e80 MOVLW 0x80 002590 5cee SUBWF 0xee,0x0,0x0 002592 0eff MOVLW 0xff 002594 58ee SUBWFB 0xee,0x0,0x0 002596 0eff MOVLW 0xff 002598 58ef SUBWFB 0xef,0x0,0x0 002578 e201 BC 0x257c ) C:\Projects\UBW\FW\D_143\user\user.c 00257a d08c BRA 0x2694 00259a e201 BC 0x259e 00259c d07b BRA 0x2694 002550 e126 BNZ 0x259e ) C:\Projects\UBW\FW\D_143\user\user.c || C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c kUCHAR == type C:\Projects\UBW\FW\D_143\user\user.c 00259e 0efe MOVLW 0xfe && C:\Projects\UBW\FW\D_143\user\user.c 0025a0 04db DECF 0xdb,0x0,0x0 ( C:\Projects\UBW\FW\D_143\user\user.c 0025a4 cfdf MOVFF 0xfdf,0x2d (acc > 255) C:\Projects\UBW\FW\D_143\user\user.c 0025a6 f02d 0025a8 0e01 MOVLW 0x1 0025aa cfdb MOVFF 0xfdb,0x2e 0025ac f02e 0025ae 0e02 MOVLW 0x2 0025b0 cfdb MOVFF 0xfdb,0x2f 0025b2 f02f 0025b4 342f RLCF 0x2f,0x0,0x0 0025b6 0e00 MOVLW 0x0 0025b8 182f XORWF 0x2f,0x0,0x0 0025ba e607 BN 0x25ca 0025bc 80d8 BSF 0xd8,0x0,0x0 0025be 0eff MOVLW 0xff 0025c0 542d SUBFWB 0x2d,0x0,0x0 0025c2 0e00 MOVLW 0x0 0025c4 542e SUBFWB 0x2e,0x0,0x0 0025c6 0e00 MOVLW 0x0 0025c8 542f SUBFWB 0x2f,0x0,0x0 || C:\Projects\UBW\FW\D_143\user\user.c 0025cc cfd9 MOVFF 0xfd9,0xfe9 (acc < 0) C:\Projects\UBW\FW\D_143\user\user.c 0025ce ffe9 0025d0 cfda MOVFF 0xfda,0xfea 0025d2 ffea 0025d4 0e02 MOVLW 0x2 0025d6 90d8 BCF 0xd8,0x0,0x0 0025d8 50eb MOVF 0xeb,0x0,0x0 0025da 0a00 XORLW 0x0 0025dc e606 BN 0x25ea 0025de 0e00 MOVLW 0x0 0025e0 5cee SUBWF 0xee,0x0,0x0 0025e2 0e00 MOVLW 0x0 0025e4 58ee SUBWFB 0xee,0x0,0x0 0025e6 0e00 MOVLW 0x0 0025e8 58ef SUBWFB 0xef,0x0,0x0 0025ca e364 BNC 0x2694 ) C:\Projects\UBW\FW\D_143\user\user.c 0025ea e354 BNC 0x2694 0025a2 e124 BNZ 0x25ec ) C:\Projects\UBW\FW\D_143\user\user.c || C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c 0025ec 0e02 MOVLW 0x2 kINT == type C:\Projects\UBW\FW\D_143\user\user.c 0025ee 6e30 MOVWF 0x30,0x0 0025f0 0efe MOVLW 0xfe 0025f2 50db MOVF 0xdb,0x0,0x0 0025f4 5c30 SUBWF 0x30,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c 0025f8 cfdf MOVFF 0xfdf,0x31 (acc > 32767) C:\Projects\UBW\FW\D_143\user\user.c 0025fa f031 0025fc 0e01 MOVLW 0x1 0025fe cfdb MOVFF 0xfdb,0x32 002600 f032 002602 0e02 MOVLW 0x2 002604 cfdb MOVFF 0xfdb,0x33 002606 f033 002608 3433 RLCF 0x33,0x0,0x0 00260a 0e00 MOVLW 0x0 00260c 1833 XORWF 0x33,0x0,0x0 00260e e607 BN 0x261e 002610 80d8 BSF 0xd8,0x0,0x0 002612 0eff MOVLW 0xff 002614 5431 SUBFWB 0x31,0x0,0x0 002616 0e7f MOVLW 0x7f 002618 5432 SUBFWB 0x32,0x0,0x0 00261a 0e00 MOVLW 0x0 00261c 5433 SUBFWB 0x33,0x0,0x0 || C:\Projects\UBW\FW\D_143\user\user.c 002620 cfd9 MOVFF 0xfd9,0xfe9 (acc < -32768) C:\Projects\UBW\FW\D_143\user\user.c 002622 ffe9 002624 cfda MOVFF 0xfda,0xfea 002626 ffea 002628 0e02 MOVLW 0x2 00262a 80d8 BSF 0xd8,0x0,0x0 00262c 50eb MOVF 0xeb,0x0,0x0 00262e 0aff XORLW 0xff 002630 e606 BN 0x263e 002632 0e00 MOVLW 0x0 002634 5cee SUBWF 0xee,0x0,0x0 002636 0e80 MOVLW 0x80 002638 58ee SUBWFB 0xee,0x0,0x0 00263a 0eff MOVLW 0xff 00263c 58ef SUBWFB 0xef,0x0,0x0 00261e e33a BNC 0x2694 ) C:\Projects\UBW\FW\D_143\user\user.c 00263e e32a BNC 0x2694 0025f6 e124 BNZ 0x2640 ) C:\Projects\UBW\FW\D_143\user\user.c || C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c 002640 0e03 MOVLW 0x3 kUINT == type C:\Projects\UBW\FW\D_143\user\user.c 002642 6e34 MOVWF 0x34,0x0 002644 0efe MOVLW 0xfe 002646 50db MOVF 0xdb,0x0,0x0 002648 5c34 SUBWF 0x34,0x0,0x0 && C:\Projects\UBW\FW\D_143\user\user.c ( C:\Projects\UBW\FW\D_143\user\user.c 00264c cfdf MOVFF 0xfdf,0x35 (acc > 65535) C:\Projects\UBW\FW\D_143\user\user.c 00264e f035 002650 0e01 MOVLW 0x1 002652 cfdb MOVFF 0xfdb,0x36 002654 f036 002656 0e02 MOVLW 0x2 002658 cfdb MOVFF 0xfdb,0x37 00265a f037 00265c 3437 RLCF 0x37,0x0,0x0 00265e 0e00 MOVLW 0x0 002660 1837 XORWF 0x37,0x0,0x0 002662 e607 BN 0x2672 002664 80d8 BSF 0xd8,0x0,0x0 002666 0eff MOVLW 0xff 002668 5435 SUBFWB 0x35,0x0,0x0 00266a 0eff MOVLW 0xff 00266c 5436 SUBFWB 0x36,0x0,0x0 00266e 0e00 MOVLW 0x0 002670 5437 SUBFWB 0x37,0x0,0x0 || C:\Projects\UBW\FW\D_143\user\user.c 002674 cfd9 MOVFF 0xfd9,0xfe9 (acc < 0) C:\Projects\UBW\FW\D_143\user\user.c 002676 ffe9 002678 cfda MOVFF 0xfda,0xfea 00267a ffea 00267c 0e02 MOVLW 0x2 00267e 90d8 BCF 0xd8,0x0,0x0 002680 50eb MOVF 0xeb,0x0,0x0 002682 0a00 XORLW 0x0 002684 e606 BN 0x2692 002686 0e00 MOVLW 0x0 002688 5cee SUBWF 0xee,0x0,0x0 00268a 0e00 MOVLW 0x0 00268c 58ee SUBWFB 0xee,0x0,0x0 00268e 0e00 MOVLW 0x0 002690 58ef SUBWFB 0xef,0x0,0x0 002672 e310 BNC 0x2694 ) C:\Projects\UBW\FW\D_143\user\user.c 002692 e205 BC 0x269e 00264a e129 BNZ 0x269e ) C:\Projects\UBW\FW\D_143\user\user.c ) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002694 8c0d BSF 0xd,0x6,0x0 bitset (error_byte, kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT); C:\Projects\UBW\FW\D_143\user\user.c 002696 6a1d CLRF 0x1d,0x0 return (0); C:\Projects\UBW\FW\D_143\user\user.c 002698 6a1e CLRF 0x1e,0x0 00269a 6a1f CLRF 0x1f,0x0 00269c d00f BRA 0x26bc } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 00269e cfdf MOVFF 0xfdf,0x2a return(acc); C:\Projects\UBW\FW\D_143\user\user.c 0026a0 f02a 0026a2 0e01 MOVLW 0x1 0026a4 cfdb MOVFF 0xfdb,0x2b 0026a6 f02b 0026a8 0e02 MOVLW 0x2 0026aa cfdb MOVFF 0xfdb,0x2c 0026ac f02c 0026ae c02a MOVFF 0x2a,0x1d 0026b0 f01d 0026b2 c02b MOVFF 0x2b,0x1e 0026b4 f01e 0026b6 c02c MOVFF 0x2c,0x1f 0026b8 f01f 0026ba d000 BRA 0x26bc 0026bc 0e04 MOVLW 0x4 } C:\Projects\UBW\FW\D_143\user\user.c 0026be 5ce1 SUBWF 0xe1,0x0,0x0 0026c0 e202 BC 0x26c6 0026c2 6ae1 CLRF 0xe1,0x0 0026c4 52e5 MOVF 0xe5,0x1,0x0 0026c6 6ee1 MOVWF 0xe1,0x0 0026c8 52e5 MOVF 0xe5,0x1,0x0 0026ca cfe7 MOVFF 0xfe7,0xfd9 0026cc ffd9 0026ce 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // Loop 'digits' number of times, looking at the C:\Projects\UBW\FW\D_143\user\user.c // byte in input_buffer index *ptr, and if it is C:\Projects\UBW\FW\D_143\user\user.c // a digit, adding it to acc. Take care of C:\Projects\UBW\FW\D_143\user\user.c // powers of ten as well. If you hit a non-numerical C:\Projects\UBW\FW\D_143\user\user.c // char, then return FALSE, otherwise return TRUE. C:\Projects\UBW\FW\D_143\user\user.c // Store result as you go in *acc. C:\Projects\UBW\FW\D_143\user\user.c 0026d0 cfd9 MOVFF 0xfd9,0xfe6 signed char extract_digit(signed short long * acc, unsigned char digits) C:\Projects\UBW\FW\D_143\user\user.c 0026d2 ffe6 0026d4 cfe1 MOVFF 0xfe1,0xfd9 0026d6 ffd9 0026d8 0e02 MOVLW 0x2 0026da 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c unsigned char val; C:\Projects\UBW\FW\D_143\user\user.c unsigned char digit_cnt; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 0026dc 0efd MOVLW 0xfd *acc = 0; C:\Projects\UBW\FW\D_143\user\user.c 0026de cfdb MOVFF 0xfdb,0xfe9 0026e0 ffe9 0026e2 0efe MOVLW 0xfe 0026e4 cfdb MOVFF 0xfdb,0xfea 0026e6 ffea 0026e8 6aee CLRF 0xee,0x0 0026ea 6aee CLRF 0xee,0x0 0026ec 6aee CLRF 0xee,0x0 C:\Projects\UBW\FW\D_143\user\user.c 0026ee 0e01 MOVLW 0x1 for (digit_cnt = 0; digit_cnt < digits; digit_cnt++) C:\Projects\UBW\FW\D_143\user\user.c 0026f0 6adb CLRF 0xdb,0x0 0026f2 0efc MOVLW 0xfc 0026f4 50db MOVF 0xdb,0x0,0x0 0026f6 6ef3 MOVWF 0xf3,0x0 0026f8 0e01 MOVLW 0x1 0026fa cfdb MOVFF 0xfdb,0xff4 0026fc fff4 0026fe 50f3 MOVF 0xf3,0x0,0x0 002700 5cf4 SUBWF 0xf4,0x0,0x0 002702 e255 BC 0x27ae 0027a8 0e01 MOVLW 0x1 0027aa 2adb INCF 0xdb,0x1,0x0 0027ac d7a2 BRA 0x26f2 { C:\Projects\UBW\FW\D_143\user\user.c 002704 0101 MOVLB 0x1 val = g_RX_buf[g_RX_buf_out]; C:\Projects\UBW\FW\D_143\user\user.c 002706 51b9 MOVF 0xb9,0x0,0x1 002708 6aea CLRF 0xea,0x0 00270a 0f40 ADDLW 0x40 00270c 6ee9 MOVWF 0xe9,0x0 00270e 0e02 MOVLW 0x2 002710 22ea ADDWFC 0xea,0x1,0x0 002712 cfef MOVFF 0xfef,0xfdf 002714 ffdf 002716 0e30 MOVLW 0x30 if ((val >= 48) && (val <= 57)) C:\Projects\UBW\FW\D_143\user\user.c 002718 5cdf SUBWF 0xdf,0x0,0x0 00271a e344 BNC 0x27a4 00271c 50df MOVF 0xdf,0x0,0x0 00271e 0839 SUBLW 0x39 002720 e341 BNC 0x27a4 { C:\Projects\UBW\FW\D_143\user\user.c 002722 0efd MOVLW 0xfd *acc = (*acc * 10) + (val - 48); C:\Projects\UBW\FW\D_143\user\user.c 002724 cfdb MOVFF 0xfdb,0xfe9 002726 ffe9 002728 0efe MOVLW 0xfe 00272a cfdb MOVFF 0xfdb,0xfea 00272c ffea 00272e cfee MOVFF 0xfee,0x2d 002730 f02d 002732 cfee MOVFF 0xfee,0x2e 002734 f02e 002736 cfef MOVFF 0xfef,0x2f 002738 f02f 00273a 0e0a MOVLW 0xa 00273c 6e22 MOVWF 0x22,0x0 00273e 6a23 CLRF 0x23,0x0 002740 6a24 CLRF 0x24,0x0 002742 c02d MOVFF 0x2d,0x1d 002744 f01d 002746 c02e MOVFF 0x2e,0x1e 002748 f01e 00274a c02f MOVFF 0x2f,0x1f 00274c f01f 00274e ec21 CALL 0x4242,0x0 002750 f021 002752 c01a MOVFF 0x1a,0x2d 002754 f02d 002756 c01b MOVFF 0x1b,0x2e 002758 f02e 00275a c01c MOVFF 0x1c,0x2f 00275c f02f 00275e 0e30 MOVLW 0x30 002760 5cdf SUBWF 0xdf,0x0,0x0 002762 6e30 MOVWF 0x30,0x0 002764 6a31 CLRF 0x31,0x0 002766 6a32 CLRF 0x32,0x0 002768 502d MOVF 0x2d,0x0,0x0 00276a 2430 ADDWF 0x30,0x0,0x0 00276c 6e2a MOVWF 0x2a,0x0 00276e 502e MOVF 0x2e,0x0,0x0 002770 2031 ADDWFC 0x31,0x0,0x0 002772 6e2b MOVWF 0x2b,0x0 002774 502f MOVF 0x2f,0x0,0x0 002776 2032 ADDWFC 0x32,0x0,0x0 002778 6e2c MOVWF 0x2c,0x0 00277a 0efd MOVLW 0xfd 00277c cfdb MOVFF 0xfdb,0xfe9 00277e ffe9 002780 0efe MOVLW 0xfe 002782 cfdb MOVFF 0xfdb,0xfea 002784 ffea 002786 c02a MOVFF 0x2a,0xfee 002788 ffee 00278a c02b MOVFF 0x2b,0xfee 00278c ffee 00278e c02c MOVFF 0x2c,0xfee 002790 ffee // Move to the next character C:\Projects\UBW\FW\D_143\user\user.c 002792 0101 MOVLB 0x1 advance_RX_buf_out (); C:\Projects\UBW\FW\D_143\user\user.c 002794 2bb9 INCF 0xb9,0x1,0x1 002796 0e40 MOVLW 0x40 002798 0101 MOVLB 0x1 00279a 5db9 SUBWF 0xb9,0x0,0x1 00279c e102 BNZ 0x27a2 00279e 0101 MOVLB 0x1 0027a0 6bb9 CLRF 0xb9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c 0027a2 d002 BRA 0x27a8 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 0027a4 0e00 MOVLW 0x0 return (FALSE); C:\Projects\UBW\FW\D_143\user\user.c 0027a6 d005 BRA 0x27b2 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0027ae 0e01 MOVLW 0x1 return (TRUE); C:\Projects\UBW\FW\D_143\user\user.c 0027b0 d000 BRA 0x27b2 0027b2 6e2a MOVWF 0x2a,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 0027b4 0e02 MOVLW 0x2 0027b6 5ce1 SUBWF 0xe1,0x0,0x0 0027b8 e202 BC 0x27be 0027ba 6ae1 CLRF 0xe1,0x0 0027bc 52e5 MOVF 0xe5,0x1,0x0 0027be 6ee1 MOVWF 0xe1,0x0 0027c0 502a MOVF 0x2a,0x0,0x0 0027c2 52e5 MOVF 0xe5,0x1,0x0 0027c4 cfe7 MOVFF 0xfe7,0xfd9 0027c6 ffd9 0027c8 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\user\user.c // For debugging, this command will spit out a bunch of values. C:\Projects\UBW\FW\D_143\user\user.c void print_status(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c printf( C:\Projects\UBW\FW\D_143\user\user.c (far rom char*)"Status=%i\r\n" C:\Projects\UBW\FW\D_143\user\user.c 0027ca 5006 MOVF 0x6,0x0,0x0 ,ISR_D_FIFO_length C:\Projects\UBW\FW\D_143\user\user.c 0027d0 0eee MOVLW 0xee 0027d2 6e2a MOVWF 0x2a,0x0 0027d4 0e40 MOVLW 0x40 0027d6 6e2b MOVWF 0x2b,0x0 0027d8 6a2c CLRF 0x2c,0x0 0027da c02a MOVFF 0x2a,0xfe6 0027dc ffe6 0027de c02b MOVFF 0x2b,0xfe6 0027e0 ffe6 0027e2 c02c MOVFF 0x2c,0xfe6 0027e4 ffe6 0027cc 6ee6 MOVWF 0xe6,0x0 ); C:\Projects\UBW\FW\D_143\user\user.c 0027ce 6ae6 CLRF 0xe6,0x0 0027e6 ec4d CALL 0x449a,0x0 0027e8 f022 0027ea 6e2d MOVWF 0x2d,0x0 0027ec 0e05 MOVLW 0x5 0027ee 5ee1 SUBWF 0xe1,0x1,0x0 0027f0 502d MOVF 0x2d,0x0,0x0 0027f2 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /****************************************************************************** C:\Projects\UBW\FW\D_143\user\user.c * Function: void BlinkUSBStatus(void) C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * PreCondition: None C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Input: None C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Output: None C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Side Effects: None C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Overview: BlinkUSBStatus turns on and off LEDs corresponding to C:\Projects\UBW\FW\D_143\user\user.c * the USB device state. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Note: mLED macros can be found in io_cfg.h C:\Projects\UBW\FW\D_143\user\user.c * usb_device_state is declared in usbmmap.c and is modified C:\Projects\UBW\FW\D_143\user\user.c * in usbdrv.c, usbctrltrf.c, and usb9.c C:\Projects\UBW\FW\D_143\user\user.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\user\user.c void BlinkUSBStatus(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c static word LEDCount = 0; C:\Projects\UBW\FW\D_143\user\user.c static unsigned char LEDState = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c if ( C:\Projects\UBW\FW\D_143\user\user.c 0027f4 0101 MOVLB 0x1 usb_device_state == DETACHED_STATE C:\Projects\UBW\FW\D_143\user\user.c 0027f6 51d2 MOVF 0xd2,0x0,0x1 || C:\Projects\UBW\FW\D_143\user\user.c 0027fa 0e01 MOVLW 0x1 1 == UCONbits.SUSPND C:\Projects\UBW\FW\D_143\user\user.c 0027fc 6e2a MOVWF 0x2a,0x0 0027fe 506d MOVF 0x6d,0x0,0x0 002800 0b02 ANDLW 0x2 002802 e001 BZ 0x2806 002804 0e01 MOVLW 0x1 0027f8 e008 BZ 0x280a ) C:\Projects\UBW\FW\D_143\user\user.c 002806 5c2a SUBWF 0x2a,0x0,0x0 002808 e122 BNZ 0x284e { C:\Projects\UBW\FW\D_143\user\user.c 00280a 0101 MOVLB 0x1 LEDCount--; C:\Projects\UBW\FW\D_143\user\user.c 00280c 07d7 DECF 0xd7,0x1,0x1 00280e 0e00 MOVLW 0x0 002810 5bd8 SUBWFB 0xd8,0x1,0x1 002812 0101 MOVLB 0x1 if (0 == LEDState) C:\Projects\UBW\FW\D_143\user\user.c 002814 51d9 MOVF 0xd9,0x0,0x1 002816 e10e BNZ 0x2834 { C:\Projects\UBW\FW\D_143\user\user.c 002818 0101 MOVLB 0x1 if (0 == LEDCount) C:\Projects\UBW\FW\D_143\user\user.c 00281a 51d7 MOVF 0xd7,0x0,0x1 00281c 11d8 IORWF 0xd8,0x0,0x1 00281e e109 BNZ 0x2832 { C:\Projects\UBW\FW\D_143\user\user.c 002820 808b BSF 0x8b,0x0,0x0 mLED_1_On(); C:\Projects\UBW\FW\D_143\user\user.c 002822 0101 MOVLB 0x1 LEDCount = 2000U; C:\Projects\UBW\FW\D_143\user\user.c 002824 0ed0 MOVLW 0xd0 002826 6fd7 MOVWF 0xd7,0x1 002828 0e07 MOVLW 0x7 00282a 6fd8 MOVWF 0xd8,0x1 00282c 0101 MOVLB 0x1 LEDState = 1; C:\Projects\UBW\FW\D_143\user\user.c 00282e 0e01 MOVLW 0x1 002830 6fd9 MOVWF 0xd9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 002832 d00c BRA 0x284c else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002834 0101 MOVLB 0x1 if (0 == LEDCount) C:\Projects\UBW\FW\D_143\user\user.c 002836 51d7 MOVF 0xd7,0x0,0x1 002838 11d8 IORWF 0xd8,0x0,0x1 00283a e108 BNZ 0x284c { C:\Projects\UBW\FW\D_143\user\user.c 00283c 908b BCF 0x8b,0x0,0x0 mLED_1_Off(); C:\Projects\UBW\FW\D_143\user\user.c 00283e 0101 MOVLB 0x1 LEDCount = 2000U; C:\Projects\UBW\FW\D_143\user\user.c 002840 0ed0 MOVLW 0xd0 002842 6fd7 MOVWF 0xd7,0x1 002844 0e07 MOVLW 0x7 002846 6fd8 MOVWF 0xd8,0x1 002848 0101 MOVLB 0x1 LEDState = 0; C:\Projects\UBW\FW\D_143\user\user.c 00284a 6bd9 CLRF 0xd9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 00284c d05d BRA 0x2908 else if ( C:\Projects\UBW\FW\D_143\user\user.c usb_device_state == ATTACHED_STATE C:\Projects\UBW\FW\D_143\user\user.c 00284e 0101 MOVLB 0x1 || C:\Projects\UBW\FW\D_143\user\user.c 002850 05d2 DECF 0xd2,0x0,0x1 002854 0e02 MOVLW 0x2 usb_device_state == POWERED_STATE C:\Projects\UBW\FW\D_143\user\user.c 002852 e00c BZ 0x286c || C:\Projects\UBW\FW\D_143\user\user.c 002856 0101 MOVLB 0x1 002858 5dd2 SUBWF 0xd2,0x0,0x1 00285a e008 BZ 0x286c 00285c 0e03 MOVLW 0x3 usb_device_state == DEFAULT_STATE C:\Projects\UBW\FW\D_143\user\user.c 00285e 0101 MOVLB 0x1 || C:\Projects\UBW\FW\D_143\user\user.c 002860 5dd2 SUBWF 0xd2,0x0,0x1 002862 e004 BZ 0x286c 002864 0e05 MOVLW 0x5 usb_device_state == ADDRESS_STATE C:\Projects\UBW\FW\D_143\user\user.c 002866 0101 MOVLB 0x1 ) C:\Projects\UBW\FW\D_143\user\user.c 002868 5dd2 SUBWF 0xd2,0x0,0x1 00286a e102 BNZ 0x2870 { C:\Projects\UBW\FW\D_143\user\user.c 00286c 808b BSF 0x8b,0x0,0x0 mLED_1_On(); C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 00286e d04c BRA 0x2908 else if (usb_device_state == CONFIGURED_STATE) C:\Projects\UBW\FW\D_143\user\user.c 002870 0e06 MOVLW 0x6 002872 0101 MOVLB 0x1 002874 5dd2 SUBWF 0xd2,0x0,0x1 002876 e148 BNZ 0x2908 { C:\Projects\UBW\FW\D_143\user\user.c 002878 0101 MOVLB 0x1 LEDCount--; C:\Projects\UBW\FW\D_143\user\user.c 00287a 07d7 DECF 0xd7,0x1,0x1 00287c 0e00 MOVLW 0x0 00287e 5bd8 SUBWFB 0xd8,0x1,0x1 002880 0101 MOVLB 0x1 if (0 == LEDState) C:\Projects\UBW\FW\D_143\user\user.c 002882 51d9 MOVF 0xd9,0x0,0x1 002884 e10e BNZ 0x28a2 { C:\Projects\UBW\FW\D_143\user\user.c 002886 0101 MOVLB 0x1 if (0 == LEDCount) C:\Projects\UBW\FW\D_143\user\user.c 002888 51d7 MOVF 0xd7,0x0,0x1 00288a 11d8 IORWF 0xd8,0x0,0x1 00288c e109 BNZ 0x28a0 { C:\Projects\UBW\FW\D_143\user\user.c 00288e 808b BSF 0x8b,0x0,0x0 mLED_1_On(); C:\Projects\UBW\FW\D_143\user\user.c 002890 0101 MOVLB 0x1 LEDCount = 10000U; C:\Projects\UBW\FW\D_143\user\user.c 002892 0e10 MOVLW 0x10 002894 6fd7 MOVWF 0xd7,0x1 002896 0e27 MOVLW 0x27 002898 6fd8 MOVWF 0xd8,0x1 00289a 0101 MOVLB 0x1 LEDState = 1; C:\Projects\UBW\FW\D_143\user\user.c 00289c 0e01 MOVLW 0x1 00289e 6fd9 MOVWF 0xd9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0028a0 d033 BRA 0x2908 else if (1 == LEDState) C:\Projects\UBW\FW\D_143\user\user.c 0028a2 0101 MOVLB 0x1 0028a4 05d9 DECF 0xd9,0x0,0x1 0028a6 e10e BNZ 0x28c4 { C:\Projects\UBW\FW\D_143\user\user.c 0028a8 0101 MOVLB 0x1 if (0 == LEDCount) C:\Projects\UBW\FW\D_143\user\user.c 0028aa 51d7 MOVF 0xd7,0x0,0x1 0028ac 11d8 IORWF 0xd8,0x0,0x1 0028ae e109 BNZ 0x28c2 { C:\Projects\UBW\FW\D_143\user\user.c 0028b0 908b BCF 0x8b,0x0,0x0 mLED_1_Off(); C:\Projects\UBW\FW\D_143\user\user.c 0028b2 0101 MOVLB 0x1 LEDCount = 10000U; C:\Projects\UBW\FW\D_143\user\user.c 0028b4 0e10 MOVLW 0x10 0028b6 6fd7 MOVWF 0xd7,0x1 0028b8 0e27 MOVLW 0x27 0028ba 6fd8 MOVWF 0xd8,0x1 0028bc 0101 MOVLB 0x1 LEDState = 2; C:\Projects\UBW\FW\D_143\user\user.c 0028be 0e02 MOVLW 0x2 0028c0 6fd9 MOVWF 0xd9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0028c2 d022 BRA 0x2908 else if (2 == LEDState) C:\Projects\UBW\FW\D_143\user\user.c 0028c4 0e02 MOVLW 0x2 0028c6 0101 MOVLB 0x1 0028c8 5dd9 SUBWF 0xd9,0x0,0x1 0028ca e10e BNZ 0x28e8 { C:\Projects\UBW\FW\D_143\user\user.c 0028cc 0101 MOVLB 0x1 if (0 == LEDCount) C:\Projects\UBW\FW\D_143\user\user.c 0028ce 51d7 MOVF 0xd7,0x0,0x1 0028d0 11d8 IORWF 0xd8,0x0,0x1 0028d2 e109 BNZ 0x28e6 { C:\Projects\UBW\FW\D_143\user\user.c 0028d4 808b BSF 0x8b,0x0,0x0 mLED_1_On(); C:\Projects\UBW\FW\D_143\user\user.c 0028d6 0101 MOVLB 0x1 LEDCount = 100000U; C:\Projects\UBW\FW\D_143\user\user.c 0028d8 0ea0 MOVLW 0xa0 0028da 6fd7 MOVWF 0xd7,0x1 0028dc 0e86 MOVLW 0x86 0028de 6fd8 MOVWF 0xd8,0x1 0028e0 0101 MOVLB 0x1 LEDState = 3; C:\Projects\UBW\FW\D_143\user\user.c 0028e2 0e03 MOVLW 0x3 0028e4 6fd9 MOVWF 0xd9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 0028e6 d010 BRA 0x2908 else if (LEDState >= 3) C:\Projects\UBW\FW\D_143\user\user.c 0028e8 0e03 MOVLW 0x3 0028ea 0101 MOVLB 0x1 0028ec 5dd9 SUBWF 0xd9,0x0,0x1 0028ee e30c BNC 0x2908 { C:\Projects\UBW\FW\D_143\user\user.c 0028f0 0101 MOVLB 0x1 if (0 == LEDCount) C:\Projects\UBW\FW\D_143\user\user.c 0028f2 51d7 MOVF 0xd7,0x0,0x1 0028f4 11d8 IORWF 0xd8,0x0,0x1 0028f6 e108 BNZ 0x2908 { C:\Projects\UBW\FW\D_143\user\user.c 0028f8 908b BCF 0x8b,0x0,0x0 mLED_1_Off(); C:\Projects\UBW\FW\D_143\user\user.c 0028fa 0101 MOVLB 0x1 LEDCount = 10000U; C:\Projects\UBW\FW\D_143\user\user.c 0028fc 0e10 MOVLW 0x10 0028fe 6fd7 MOVWF 0xd7,0x1 002900 0e27 MOVLW 0x27 002902 6fd8 MOVWF 0xd8,0x1 002904 0101 MOVLB 0x1 LEDState = 0; C:\Projects\UBW\FW\D_143\user\user.c 002906 6bd9 CLRF 0xd9,0x1 } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c 002908 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c BOOL SwitchIsPressed(void) C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 00290a b482 BTFSC 0x82,0x2,0x0 if( 0 == UserSW) // If pressed C:\Projects\UBW\FW\D_143\user\user.c 00290c d003 BRA 0x2914 { C:\Projects\UBW\FW\D_143\user\user.c 00290e 0e01 MOVLW 0x1 return (TRUE); // Was pressed C:\Projects\UBW\FW\D_143\user\user.c 002910 d003 BRA 0x2918 } C:\Projects\UBW\FW\D_143\user\user.c 002912 d002 BRA 0x2918 else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c 002914 0e00 MOVLW 0x0 return (FALSE); // Was not pressed C:\Projects\UBW\FW\D_143\user\user.c 002916 d000 BRA 0x2918 } C:\Projects\UBW\FW\D_143\user\user.c 002918 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** EOF user.c ***************************************************************/ C:\Projects\UBW\FW\D_143\user\user.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Microchip USB C18 Firmware - CDC Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * FileName: cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * license. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Rawin Rojvanit 11/19/04 Original. RS-232 Emulation Subset C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c #include C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c #ifdef USB_USE_CDC C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c byte cdc_rx_len; // total rx length C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c byte cdc_trf_state; // States are defined cdc.h C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c POINTER pCDCSrc; // Dedicated source pointer C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c POINTER pCDCDst; // Dedicated destination pointer C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c byte cdc_tx_len; // total tx length C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c byte cdc_mem_type; // _ROM, _RAM C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c LINE_CODING line_coding; // Buffer to store line coding information C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c CONTROL_SIGNAL_BITMAP control_signal_bitmap; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * SEND_ENCAPSULATED_COMMAND and GET_ENCAPSULATED_RESPONSE are required C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * requests according to the CDC specification. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * However, it is not really being used here, therefore a dummy buffer is C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * used for conformance. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c #define dummy_length 0x08 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c byte dummy_encapsulated_cmd_response[dummy_length]; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c #pragma code C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /** C L A S S S P E C I F I C R E Q ****************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Function: void USBCheckCDCRequest(void) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Overview: This routine checks the setup data packet to see if it C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * knows how to handle it C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c void USBCheckCDCRequest(void) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * If request recipient is not an interface then return C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00353c 0104 MOVLB 0x4 if(SetupPkt.Recipient != RCPT_INTF) return; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00353e 5120 MOVF 0x20,0x0,0x1 003540 0b1f ANDLW 0x1f 003542 0801 SUBLW 0x1 003544 e001 BZ 0x3548 003546 d060 BRA 0x3608 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * If request type is not class-specific then return C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003548 0104 MOVLB 0x4 if(SetupPkt.RequestType != CLASS) return; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00354a 5120 MOVF 0x20,0x0,0x1 00354c 0b60 ANDLW 0x60 00354e 42e8 RRNCF 0xe8,0x1,0x0 003550 42e8 RRNCF 0xe8,0x1,0x0 003552 42e8 RRNCF 0xe8,0x1,0x0 003554 42e8 RRNCF 0xe8,0x1,0x0 003556 42e8 RRNCF 0xe8,0x1,0x0 003558 0801 SUBLW 0x1 00355a e001 BZ 0x355e 00355c d055 BRA 0x3608 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Interface ID must match interface numbers associated with C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * CDC class, else return C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00355e 0104 MOVLB 0x4 if((SetupPkt.bIntfID != CDC_COMM_INTF_ID)&& C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003560 5124 MOVF 0x24,0x0,0x1 003562 e004 BZ 0x356c (SetupPkt.bIntfID != CDC_DATA_INTF_ID)) return; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003564 0104 MOVLB 0x4 003566 0524 DECF 0x24,0x0,0x1 003568 e001 BZ 0x356c 00356a d04e BRA 0x3608 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00356c 0104 MOVLB 0x4 switch(SetupPkt.bRequest) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00356e 5121 MOVF 0x21,0x0,0x1 003570 0a23 XORLW 0x23 003572 e048 BZ 0x3604 003574 0a01 XORLW 0x1 003576 e040 BZ 0x35f8 003578 0a03 XORLW 0x3 00357a e030 BZ 0x35dc 00357c 0a01 XORLW 0x1 00357e e025 BZ 0x35ca 003580 0a24 XORLW 0x24 003582 e022 BZ 0x35c8 003584 0a07 XORLW 0x7 003586 e01f BZ 0x35c6 003588 0a01 XORLW 0x1 00358a e01c BZ 0x35c4 00358c 0a03 XORLW 0x3 00358e e011 BZ 0x35b2 003590 0a01 XORLW 0x1 003592 e001 BZ 0x3596 003594 d038 BRA 0x3606 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case SEND_ENCAPSULATED_COMMAND: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003596 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_CDC; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003598 0e03 MOVLW 0x3 00359a 6fcb MOVWF 0xcb,0x1 00359c 0101 MOVLB 0x1 pSrc.bRam = (byte*)&dummy_encapsulated_cmd_response; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00359e 0ea9 MOVLW 0xa9 0035a0 6fcc MOVWF 0xcc,0x1 0035a2 0e01 MOVLW 0x1 0035a4 6fcd MOVWF 0xcd,0x1 0035a6 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035a8 93d3 BCF 0xd3,0x1,0x1 0035aa 0101 MOVLB 0x1 LSB(wCount) = dummy_length; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035ac 0e08 MOVLW 0x8 0035ae 6fd0 MOVWF 0xd0,0x1 0035b0 d02b BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case GET_ENCAPSULATED_RESPONSE: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035b2 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_CDC; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035b4 0e03 MOVLW 0x3 0035b6 6fcb MOVWF 0xcb,0x1 // Populate dummy_encapsulated_cmd_response first. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035b8 0101 MOVLB 0x1 pDst.bRam = (byte*)&dummy_encapsulated_cmd_response; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035ba 0ea9 MOVLW 0xa9 0035bc 6fce MOVWF 0xce,0x1 0035be 0e01 MOVLW 0x1 0035c0 6fcf MOVWF 0xcf,0x1 0035c2 d022 BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case SET_COMM_FEATURE: // Optional C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035c4 d021 BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case GET_COMM_FEATURE: // Optional C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035c6 d020 BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case CLEAR_COMM_FEATURE: // Optional C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035c8 d01f BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case SET_LINE_CODING: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035ca 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_CDC; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035cc 0e03 MOVLW 0x3 0035ce 6fcb MOVWF 0xcb,0x1 0035d0 0101 MOVLB 0x1 pDst.bRam = (byte*)&line_coding; // Set destination C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035d2 0ea1 MOVLW 0xa1 0035d4 6fce MOVWF 0xce,0x1 0035d6 0e01 MOVLW 0x1 0035d8 6fcf MOVWF 0xcf,0x1 0035da d016 BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case GET_LINE_CODING: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035dc 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_CDC; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035de 0e03 MOVLW 0x3 0035e0 6fcb MOVWF 0xcb,0x1 0035e2 0101 MOVLB 0x1 pSrc.bRam = (byte*)&line_coding; // Set source C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035e4 0ea1 MOVLW 0xa1 0035e6 6fcc MOVWF 0xcc,0x1 0035e8 0e01 MOVLW 0x1 0035ea 6fcd MOVWF 0xcd,0x1 0035ec 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035ee 93d3 BCF 0xd3,0x1,0x1 0035f0 0101 MOVLB 0x1 LSB(wCount) = LINE_CODING_LENGTH; // Set data count C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035f2 0e07 MOVLW 0x7 0035f4 6fd0 MOVWF 0xd0,0x1 0035f6 d008 BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case SET_CONTROL_LINE_STATE: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035f8 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_CDC; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0035fa 0e03 MOVLW 0x3 0035fc 6fcb MOVWF 0xcb,0x1 0035fe c422 MOVFF 0x422,0x1a8 control_signal_bitmap._byte = LSB(SetupPkt.W_Value); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003600 f1a8 003602 d002 BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c case SEND_BREAK: // Optional C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003604 d001 BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c default: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003606 d000 BRA 0x3608 break; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c }//end switch(SetupPkt.bRequest) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003608 0012 RETURN 0x0 }//end USBCheckCDCRequest C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /** U S E R A P I ***********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Function: void CDCInitEP(void) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Overview: CDCInitEP initializes CDC endpoints, buffer descriptors, C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * internal state-machine, and variables. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * It should be called after the USB host has sent out a C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * SET_CONFIGURATION request. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * See USBStdSetCfgHandler() in usb9.c for examples. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c void CDCInitEP(void) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c //Abstract line coding information C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00360a 0101 MOVLB 0x1 line_coding.dwDTERate._dword = 115200; // baud rate C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00360c 6ba1 CLRF 0xa1,0x1 00360e 0ec2 MOVLW 0xc2 003610 6fa2 MOVWF 0xa2,0x1 003612 0e01 MOVLW 0x1 003614 6fa3 MOVWF 0xa3,0x1 003616 6ba4 CLRF 0xa4,0x1 003618 0101 MOVLB 0x1 line_coding.bCharFormat = 0x00; // 1 stop bit C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00361a 6ba5 CLRF 0xa5,0x1 00361c 0101 MOVLB 0x1 line_coding.bParityType = 0x00; // None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00361e 6ba6 CLRF 0xa6,0x1 003620 0101 MOVLB 0x1 line_coding.bDataBits = 0x08; // 5,6,7,8, or 16 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003622 0e08 MOVLW 0x8 003624 6fa7 MOVWF 0xa7,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003626 0101 MOVLB 0x1 cdc_trf_state = CDC_TX_READY; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003628 6b9a CLRF 0x9a,0x1 00362a 0101 MOVLB 0x1 cdc_rx_len = 0; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00362c 6b99 CLRF 0x99,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00362e 0e1a MOVLW 0x1a CDC_COMM_UEP = EP_IN|HSHK_EN; // Enable 1 Comm pipe C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003630 6e72 MOVWF 0x72,0x0 003632 0e1e MOVLW 0x1e CDC_DATA_UEP = EP_OUT_IN|HSHK_EN; // Enable 2 data pipes C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003634 6e73 MOVWF 0x73,0x0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Do not have to init Cnt of IN pipes here. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Reason: Number of bytes to send to the host C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * varies from one transaction to C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * another. Cnt should equal the exact C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * number of bytes to transmit for C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * a given IN transaction. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * This number of bytes will only C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * be known right before the data is C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * sent. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003636 0104 MOVLB 0x4 CDC_INT_BD_IN.ADR = (byte*)&cdc_notice; // Set buffer address C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003638 0e00 MOVLW 0x0 00363a 6f16 MOVWF 0x16,0x1 00363c 0e05 MOVLW 0x5 00363e 6f17 MOVWF 0x17,0x1 003640 0104 MOVLB 0x4 CDC_INT_BD_IN.Stat._byte = _UCPU|_DAT1; // Set status C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003642 0e40 MOVLW 0x40 003644 6f14 MOVWF 0x14,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003646 0104 MOVLB 0x4 CDC_BULK_BD_OUT.Cnt = sizeof(cdc_data_rx); // Set buffer size C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003648 0e40 MOVLW 0x40 00364a 6f19 MOVWF 0x19,0x1 00364c 0104 MOVLB 0x4 CDC_BULK_BD_OUT.ADR = (byte*)&cdc_data_rx; // Set buffer address C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00364e 0e08 MOVLW 0x8 003650 6f1a MOVWF 0x1a,0x1 003652 0e05 MOVLW 0x5 003654 6f1b MOVWF 0x1b,0x1 003656 0104 MOVLB 0x4 CDC_BULK_BD_OUT.Stat._byte = _USIE|_DAT0|_DTSEN;// Set status C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003658 0e88 MOVLW 0x88 00365a 6f18 MOVWF 0x18,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00365c 0104 MOVLB 0x4 CDC_BULK_BD_IN.ADR = (byte*)&cdc_data_tx; // Set buffer size C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00365e 0e48 MOVLW 0x48 003660 6f1e MOVWF 0x1e,0x1 003662 0e05 MOVLW 0x5 003664 6f1f MOVWF 0x1f,0x1 003666 0104 MOVLB 0x4 CDC_BULK_BD_IN.Stat._byte = _UCPU|_DAT1; // Set buffer address C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003668 0e40 MOVLW 0x40 00366a 6f1c MOVWF 0x1c,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00366c 0012 RETURN 0x0 }//end CDCInitEP C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Function: byte getsUSBUSART(char *buffer, C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * byte len) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * PreCondition: Value of input argument 'len' should be smaller than the C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * maximum endpoint size responsible for receiving bulk C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * data from USB host for CDC class. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Input argument 'buffer' should point to a buffer area that C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * is bigger or equal to the size specified by 'len'. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Input: buffer : Pointer to where received bytes are to be stored C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * len : The number of bytes expected. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Output: The number of bytes copied to buffer. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Side Effects: Publicly accessible variable cdc_rx_len is updated with C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * the number of bytes copied to buffer. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Once getsUSBUSART is called, subsequent retrieval of C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * cdc_rx_len can be done by calling macro mCDCGetRxLength(). C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Overview: getsUSBUSART copies a string of bytes received through C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * USB CDC Bulk OUT endpoint to a user's specified location. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * It is a non-blocking function. It does not wait C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * for data if there is no data available. Instead it returns C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * '0' to notify the caller that there is no data available. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Note: If the actual number of bytes received is larger than the C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * number of bytes expected (len), only the expected number C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * of bytes specified will be copied to buffer. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * If the actual number of bytes received is smaller than the C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * number of bytes expected (len), only the actual number C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * of bytes received will be copied to buffer. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00366e cfd9 MOVFF 0xfd9,0xfe6 byte getsUSBUSART(unsigned char *buffer, byte len) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003670 ffe6 003672 cfe1 MOVFF 0xfe1,0xfd9 003674 ffd9 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003676 0101 MOVLB 0x1 cdc_rx_len = 0; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003678 6b99 CLRF 0x99,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00367a 0104 MOVLB 0x4 if(!mCDCUsartRxIsBusy()) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00367c bf18 BTFSC 0x18,0x7,0x1 00367e d039 BRA 0x36f2 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Adjust the expected number of bytes to equal C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * the actual number of bytes received. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003680 0efc MOVLW 0xfc if(len > CDC_BULK_BD_OUT.Cnt) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003682 cfdb MOVFF 0xfdb,0x2a 003684 f02a 003686 0104 MOVLB 0x4 003688 5119 MOVF 0x19,0x0,0x1 00368a 80d8 BSF 0xd8,0x0,0x0 00368c 542a SUBFWB 0x2a,0x0,0x0 00368e e203 BC 0x3696 003690 0efc MOVLW 0xfc len = CDC_BULK_BD_OUT.Cnt; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003692 c419 MOVFF 0x419,0xfdb 003694 ffdb C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Copy data from dual-ram buffer to user's buffer C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003696 0101 MOVLB 0x1 for(cdc_rx_len = 0; cdc_rx_len < len; cdc_rx_len++) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003698 6b99 CLRF 0x99,0x1 00369a 0efc MOVLW 0xfc 00369c 50db MOVF 0xdb,0x0,0x0 00369e 0101 MOVLB 0x1 0036a0 5d99 SUBWF 0x99,0x0,0x1 0036a2 e21c BC 0x36dc 0036d6 0101 MOVLB 0x1 0036d8 2b99 INCF 0x99,0x1,0x1 0036da d7df BRA 0x369a 0036a4 0101 MOVLB 0x1 buffer[cdc_rx_len] = cdc_data_rx[cdc_rx_len]; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0036a6 5199 MOVF 0x99,0x0,0x1 0036a8 6aea CLRF 0xea,0x0 0036aa 0f08 ADDLW 0x8 0036ac 6ee9 MOVWF 0xe9,0x0 0036ae 0e05 MOVLW 0x5 0036b0 22ea ADDWFC 0xea,0x1,0x0 0036b2 50ef MOVF 0xef,0x0,0x0 0036b4 6ee6 MOVWF 0xe6,0x0 0036b6 0101 MOVLB 0x1 0036b8 5199 MOVF 0x99,0x0,0x1 0036ba 6ee7 MOVWF 0xe7,0x0 0036bc 0efd MOVLW 0xfd 0036be cfdb MOVFF 0xfdb,0xfe9 0036c0 ffe9 0036c2 0efe MOVLW 0xfe 0036c4 cfdb MOVFF 0xfdb,0xfea 0036c6 ffea 0036c8 50e7 MOVF 0xe7,0x0,0x0 0036ca 26e9 ADDWF 0xe9,0x1,0x0 0036cc 0e00 MOVLW 0x0 0036ce 22ea ADDWFC 0xea,0x1,0x0 0036d0 52e5 MOVF 0xe5,0x1,0x0 0036d2 50e7 MOVF 0xe7,0x0,0x0 0036d4 6eef MOVWF 0xef,0x0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Prepare dual-ram buffer for next OUT transaction C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0036dc 0104 MOVLB 0x4 CDC_BULK_BD_OUT.Cnt = sizeof(cdc_data_rx); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0036de 0e40 MOVLW 0x40 0036e0 6f19 MOVWF 0x19,0x1 0036e2 0e40 MOVLW 0x40 mUSBBufferReady(CDC_BULK_BD_OUT); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0036e4 0104 MOVLB 0x4 0036e6 1718 ANDWF 0x18,0x1,0x1 0036e8 0104 MOVLB 0x4 0036ea 7d18 BTG 0x18,0x6,0x1 0036ec 0e88 MOVLW 0x88 0036ee 0104 MOVLB 0x4 0036f0 1318 IORWF 0x18,0x1,0x1 }//end if C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0036f2 0101 MOVLB 0x1 return cdc_rx_len; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0036f4 5199 MOVF 0x99,0x0,0x1 0036f6 d000 BRA 0x36f8 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0036f8 52e5 MOVF 0xe5,0x1,0x0 }//end getsUSBUSART C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0036fa cfe7 MOVFF 0xfe7,0xfd9 0036fc ffd9 0036fe 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Function: void putsUSBUSART(char *data) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * PreCondition: cdc_trf_state must be in the CDC_TX_READY state. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * The string of characters pointed to by 'data' must equal C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * to or smaller than 255 bytes. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Input: data : Pointer to a null-terminated string of data. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * If a null character is not found, 255 bytes C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * of data will be transferred to the host. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Overview: putsUSBUSART writes a string of data to the USB including C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * the null character. Use this version, 'puts', to transfer C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * data located in data memory. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Note: The transfer mechanism for device-to-host(put) is more C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * flexible than host-to-device(get). It can handle C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * a string of data larger than the maximum size of bulk IN C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * endpoint. A state machine is used to transfer a long C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * string of data over multiple USB transactions. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * See CDCTxService() for more details. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003700 cfd9 MOVFF 0xfd9,0xfe6 void putsUSBUSART(unsigned char *data) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003702 ffe6 003704 cfe1 MOVFF 0xfe1,0xfd9 003706 ffd9 003708 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c byte len; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * User should have checked that cdc_trf_state is in CDC_TX_READY state C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * before calling this function. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * As a safety precaution, this fuction checks the state one more time C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * to make sure it does not override any pending transactions. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Currently it just quits the routine without reporting any errors back C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * to the user. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Bottomline: User MUST make sure that mUSBUSARTIsTxTrfReady()==1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * before calling this function! C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Example: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * if(mUSBUSARTIsTxTrfReady()) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * putsUSBUSART(pData); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * IMPORTANT: Never use the following blocking while loop to wait: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * while(!mUSBUSARTIsTxTrfReady()) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * putsUSBUSART(pData); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * The whole firmware framework is written based on cooperative C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * multi-tasking and a blocking code is not acceptable. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Use a state machine instead. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00370a 0101 MOVLB 0x1 if(cdc_trf_state != CDC_TX_READY) return; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00370c 519a MOVF 0x9a,0x0,0x1 00370e e001 BZ 0x3712 003710 d031 BRA 0x3774 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * While loop counts the number of bytes to send including the C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * null character. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003712 6adf CLRF 0xdf,0x0 len = 0; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c do C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003714 2adf INCF 0xdf,0x1,0x0 len++; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003716 50df MOVF 0xdf,0x0,0x0 if(len == 256) break; // Break loop once max len is reached. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003718 6e2a MOVWF 0x2a,0x0 00371a 6a2b CLRF 0x2b,0x0 00371c 502a MOVF 0x2a,0x0,0x0 00371e e102 BNZ 0x3724 003720 0e01 MOVLW 0x1 003722 182b XORWF 0x2b,0x0,0x0 003724 e101 BNZ 0x3728 003726 d00b BRA 0x373e 003728 0efd MOVLW 0xfd }while(*data++); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00372a cfdb MOVFF 0xfdb,0xfe9 00372c ffe9 00372e 2adb INCF 0xdb,0x1,0x0 003730 0efe MOVLW 0xfe 003732 cfdb MOVFF 0xfdb,0xfea 003734 ffea 003736 e301 BNC 0x373a 003738 2adb INCF 0xdb,0x1,0x0 00373a 50ef MOVF 0xef,0x0,0x0 00373c e1eb BNZ 0x3714 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Re-adjust pointer to its initial location C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00373e 50df MOVF 0xdf,0x0,0x0 data-=len; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003740 6e2a MOVWF 0x2a,0x0 003742 6a2b CLRF 0x2b,0x0 003744 50d9 MOVF 0xd9,0x0,0x0 003746 0ffd ADDLW 0xfd 003748 6ee9 MOVWF 0xe9,0x0 00374a 0eff MOVLW 0xff 00374c 20da ADDWFC 0xda,0x0,0x0 00374e 6eea MOVWF 0xea,0x0 003750 502a MOVF 0x2a,0x0,0x0 003752 5eee SUBWF 0xee,0x1,0x0 003754 502b MOVF 0x2b,0x0,0x0 003756 5aed SUBWFB 0xed,0x1,0x0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c // BPS - 05/04/2006 I don't want the NULL at the end. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003758 06df DECF 0xdf,0x1,0x0 len--; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Second piece of information (length of data to send) is ready. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Call mUSBUSARTTxRam to setup the transfer. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * The actual transfer process will be handled by CDCTxService(), C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * which should be called once per Main Program loop. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00375a 0efd MOVLW 0xfd mUSBUSARTTxRam((byte*)data,len); // See cdc.h C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00375c cfdb MOVFF 0xfdb,0x19b 00375e f19b 003760 0efe MOVLW 0xfe 003762 cfdb MOVFF 0xfdb,0x19c 003764 f19c 003766 cfdf MOVFF 0xfdf,0x19f 003768 f19f 00376a 0101 MOVLB 0x1 00376c 6ba0 CLRF 0xa0,0x1 00376e 0101 MOVLB 0x1 003770 0e01 MOVLW 0x1 003772 6f9a MOVWF 0x9a,0x1 003774 52e5 MOVF 0xe5,0x1,0x0 }//end putsUSBUSART C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003776 52e5 MOVF 0xe5,0x1,0x0 003778 cfe7 MOVFF 0xfe7,0xfd9 00377a ffd9 00377c 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Function: void putrsUSBUSART(const rom char *data) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * PreCondition: cdc_trf_state must be in the CDC_TX_READY state. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * The string of characters pointed to by 'data' must equal C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * to or smaller than 255 bytes. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Input: data : Pointer to a null-terminated string of data. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * If a null character is not found, 255 bytes C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * of data will be transferred to the host. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Overview: putrsUSBUSART writes a string of data to the USB including C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * the null character. Use this version, 'putrs', to transfer C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * data literals and data located in program memory. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Note: The transfer mechanism for device-to-host(put) is more C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * flexible than host-to-device(get). It can handle C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * a string of data larger than the maximum size of bulk IN C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * endpoint. A state machine is used to transfer a long C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * string of data over multiple USB transactions. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * See CDCTxService() for more details. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00377e cfd9 MOVFF 0xfd9,0xfe6 void putrsUSBUSART(const rom unsigned char *data) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003780 ffe6 003782 cfe1 MOVFF 0xfe1,0xfd9 003784 ffd9 003786 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c byte len; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * User should have checked that cdc_trf_state is in CDC_TX_READY state C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * before calling this function. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * As a safety precaution, this fuction checks the state one more time C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * to make sure it does not override any pending transactions. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Currently it just quits the routine without reporting any errors back C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * to the user. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Bottomline: User MUST make sure that mUSBUSARTIsTxTrfReady() C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * before calling this function! C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Example: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * if(mUSBUSARTIsTxTrfReady()) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * putsUSBUSART(pData); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * IMPORTANT: Never use the following blocking while loop to wait: C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * while(cdc_trf_state != CDC_TX_READY) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * putsUSBUSART(pData); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * The whole firmware framework is written based on cooperative C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * multi-tasking and a blocking code is not acceptable. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Use a state machine instead. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003788 0101 MOVLB 0x1 if(cdc_trf_state != CDC_TX_READY) return; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00378a 519a MOVF 0x9a,0x0,0x1 00378c e001 BZ 0x3790 00378e d033 BRA 0x37f6 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * While loop counts the number of bytes to send including the C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * null character. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003790 6adf CLRF 0xdf,0x0 len = 0; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c do C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003792 2adf INCF 0xdf,0x1,0x0 len++; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003794 50df MOVF 0xdf,0x0,0x0 if(len == 255) break; // Break loop once max len is reached. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003796 6e2a MOVWF 0x2a,0x0 003798 6a2b CLRF 0x2b,0x0 00379a 0eff MOVLW 0xff 00379c 182a XORWF 0x2a,0x0,0x0 00379e e101 BNZ 0x37a2 0037a0 502b MOVF 0x2b,0x0,0x0 0037a2 e101 BNZ 0x37a6 0037a4 d00c BRA 0x37be 0037a6 0efd MOVLW 0xfd }while(*data++); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0037a8 cfdb MOVFF 0xfdb,0xff6 0037aa fff6 0037ac 2adb INCF 0xdb,0x1,0x0 0037ae 0efe MOVLW 0xfe 0037b0 cfdb MOVFF 0xfdb,0xff7 0037b2 fff7 0037b4 e301 BNC 0x37b8 0037b6 2adb INCF 0xdb,0x1,0x0 0037b8 0008 TBLRD 0037ba 50f5 MOVF 0xf5,0x0,0x0 0037bc e1ea BNZ 0x3792 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Re-adjust pointer to its initial location C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0037be 50df MOVF 0xdf,0x0,0x0 data-=len; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0037c0 6e2a MOVWF 0x2a,0x0 0037c2 6a2b CLRF 0x2b,0x0 0037c4 50d9 MOVF 0xd9,0x0,0x0 0037c6 0ffd ADDLW 0xfd 0037c8 6ee9 MOVWF 0xe9,0x0 0037ca 0eff MOVLW 0xff 0037cc 20da ADDWFC 0xda,0x0,0x0 0037ce 6eea MOVWF 0xea,0x0 0037d0 502a MOVF 0x2a,0x0,0x0 0037d2 5eee SUBWF 0xee,0x1,0x0 0037d4 502b MOVF 0x2b,0x0,0x0 0037d6 5aed SUBWFB 0xed,0x1,0x0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c // BPS - 05/04/2006 I don't want the NULL at the end. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0037d8 06df DECF 0xdf,0x1,0x0 len--; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Second piece of information (length of data to send) is ready. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Call mUSBUSARTTxRom to setup the transfer. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * The actual transfer process will be handled by CDCTxService(), C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * which should be called once per Main Program loop. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * (BPS 5/16/2006) Don't add the zero byte at the end. Send len-1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * bytes intead of len bytes. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0037da 0efd MOVLW 0xfd mUSBUSARTTxRom((rom byte*)data,len); // See cdc.h C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0037dc cfdb MOVFF 0xfdb,0x19b 0037de f19b 0037e0 0efe MOVLW 0xfe 0037e2 cfdb MOVFF 0xfdb,0x19c 0037e4 f19c 0037e6 cfdf MOVFF 0xfdf,0x19f 0037e8 f19f 0037ea 0101 MOVLB 0x1 0037ec 0e01 MOVLW 0x1 0037ee 6fa0 MOVWF 0xa0,0x1 0037f0 0101 MOVLB 0x1 0037f2 0e01 MOVLW 0x1 0037f4 6f9a MOVWF 0x9a,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0037f6 52e5 MOVF 0xe5,0x1,0x0 }//end putrsUSBUSART C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0037f8 52e5 MOVF 0xe5,0x1,0x0 0037fa cfe7 MOVFF 0xfe7,0xfd9 0037fc ffd9 0037fe 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Function: void CDCTxService(void) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Overview: CDCTxService handles device-to-host transaction(s). C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * This function should be called once per Main Program loop. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003800 cfd9 MOVFF 0xfd9,0xfe6 void CDCTxService(void) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003802 ffe6 003804 cfe1 MOVFF 0xfe1,0xfd9 003806 ffd9 003808 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c byte byte_to_send; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00380a 0104 MOVLB 0x4 if(mCDCUsartTxIsBusy()) return; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00380c bf1c BTFSC 0x1c,0x7,0x1 00380e d07d BRA 0x390a /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Completing stage is necessary while [ mCDCUSartTxIsBusy()==1 ]. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * By having this stage, user can always check cdc_trf_state, C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * and not having to call mCDCUsartTxIsBusy() directly. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003810 0e03 MOVLW 0x3 if(cdc_trf_state == CDC_TX_COMPLETING) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003812 0101 MOVLB 0x1 003814 5d9a SUBWF 0x9a,0x0,0x1 003816 e102 BNZ 0x381c 003818 0101 MOVLB 0x1 cdc_trf_state = CDC_TX_READY; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00381a 6b9a CLRF 0x9a,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * If CDC_TX_READY state, nothing to do, just return. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00381c 0101 MOVLB 0x1 if(cdc_trf_state == CDC_TX_READY) return; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00381e 519a MOVF 0x9a,0x0,0x1 003820 e101 BNZ 0x3824 003822 d073 BRA 0x390a C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * If CDC_TX_BUSY_ZLP state, send zero length packet C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003824 0e02 MOVLW 0x2 if(cdc_trf_state == CDC_TX_BUSY_ZLP) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003826 0101 MOVLB 0x1 003828 5d9a SUBWF 0x9a,0x0,0x1 00382a e106 BNZ 0x3838 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00382c 0104 MOVLB 0x4 CDC_BULK_BD_IN.Cnt = 0; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00382e 6b1d CLRF 0x1d,0x1 003830 0101 MOVLB 0x1 cdc_trf_state = CDC_TX_COMPLETING; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003832 0e03 MOVLW 0x3 003834 6f9a MOVWF 0x9a,0x1 } C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003836 d061 BRA 0x38fa else if(cdc_trf_state == CDC_TX_BUSY) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003838 0101 MOVLB 0x1 00383a 059a DECF 0x9a,0x0,0x1 00383c e15e BNZ 0x38fa { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * First, have to figure out how many byte of data to send. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00383e 0e40 MOVLW 0x40 if(cdc_tx_len > sizeof(cdc_data_tx)) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003840 6e2a MOVWF 0x2a,0x0 003842 6a2b CLRF 0x2b,0x0 003844 0101 MOVLB 0x1 003846 519f MOVF 0x9f,0x0,0x1 003848 5c2a SUBWF 0x2a,0x0,0x0 00384a 0e00 MOVLW 0x0 00384c 582b SUBWFB 0x2b,0x0,0x0 00384e e203 BC 0x3856 003850 0e40 MOVLW 0x40 byte_to_send = sizeof(cdc_data_tx); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003852 6edf MOVWF 0xdf,0x0 003854 d002 BRA 0x385a else C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003856 c19f MOVFF 0x19f,0xfdf byte_to_send = cdc_tx_len; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003858 ffdf C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Next, load the number of bytes to send to Cnt in buffer descriptor C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00385a cfdf MOVFF 0xfdf,0x41d CDC_BULK_BD_IN.Cnt = byte_to_send; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00385c f41d C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Subtract the number of bytes just about to be sent from the total. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00385e 50df MOVF 0xdf,0x0,0x0 cdc_tx_len = cdc_tx_len - byte_to_send; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003860 0101 MOVLB 0x1 003862 5d9f SUBWF 0x9f,0x0,0x1 003864 0101 MOVLB 0x1 003866 6f9f MOVWF 0x9f,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003868 0101 MOVLB 0x1 pCDCDst.bRam = (byte*)&cdc_data_tx; // Set destination pointer C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00386a 0e48 MOVLW 0x48 00386c 6f9d MOVWF 0x9d,0x1 00386e 0e05 MOVLW 0x5 003870 6f9e MOVWF 0x9e,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003872 0101 MOVLB 0x1 if(cdc_mem_type == _ROM) // Determine type of memory source C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003874 05a0 DECF 0xa0,0x0,0x1 003876 e118 BNZ 0x38a8 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003878 50df MOVF 0xdf,0x0,0x0 while(byte_to_send) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00387a e015 BZ 0x38a6 0038a4 d7e9 BRA 0x3878 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00387c c19b MOVFF 0x19b,0xff6 *pCDCDst.bRam = *pCDCSrc.bRom; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00387e fff6 003880 c19c MOVFF 0x19c,0xff7 003882 fff7 003884 0008 TBLRD 003886 50f5 MOVF 0xf5,0x0,0x0 003888 c19d MOVFF 0x19d,0xfe9 00388a ffe9 00388c c19e MOVFF 0x19e,0xfea 00388e ffea 003890 6eef MOVWF 0xef,0x0 003892 0101 MOVLB 0x1 pCDCDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 003894 2b9d INCF 0x9d,0x1,0x1 003896 0e00 MOVLW 0x0 003898 239e ADDWFC 0x9e,0x1,0x1 00389a 0101 MOVLB 0x1 pCDCSrc.bRom++; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00389c 2b9b INCF 0x9b,0x1,0x1 00389e 0e00 MOVLW 0x0 0038a0 239c ADDWFC 0x9c,0x1,0x1 0038a2 06df DECF 0xdf,0x1,0x0 byte_to_send--; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c }//end while(byte_to_send) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c } C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038a6 d016 BRA 0x38d4 else // _RAM C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038a8 50df MOVF 0xdf,0x0,0x0 while(byte_to_send) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038aa e014 BZ 0x38d4 0038d2 d7ea BRA 0x38a8 { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038ac c19b MOVFF 0x19b,0xfe9 *pCDCDst.bRam = *pCDCSrc.bRam; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038ae ffe9 0038b0 c19c MOVFF 0x19c,0xfea 0038b2 ffea 0038b4 50ef MOVF 0xef,0x0,0x0 0038b6 c19d MOVFF 0x19d,0xfe9 0038b8 ffe9 0038ba c19e MOVFF 0x19e,0xfea 0038bc ffea 0038be 6eef MOVWF 0xef,0x0 0038c0 0101 MOVLB 0x1 pCDCDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038c2 2b9d INCF 0x9d,0x1,0x1 0038c4 0e00 MOVLW 0x0 0038c6 239e ADDWFC 0x9e,0x1,0x1 0038c8 0101 MOVLB 0x1 pCDCSrc.bRam++; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038ca 2b9b INCF 0x9b,0x1,0x1 0038cc 0e00 MOVLW 0x0 0038ce 239c ADDWFC 0x9c,0x1,0x1 0038d0 06df DECF 0xdf,0x1,0x0 byte_to_send--; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c }//end while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c }//end if(cdc_mem_type...) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Lastly, determine if a zero length packet state is necessary. C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * See explanation in USB Specification 2.0: Section 5.8.3 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038d4 0101 MOVLB 0x1 if(cdc_tx_len == 0) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038d6 519f MOVF 0x9f,0x0,0x1 0038d8 e110 BNZ 0x38fa { C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038da 0104 MOVLB 0x4 if(CDC_BULK_BD_IN.Cnt == sizeof(cdc_data_tx)) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038dc 511d MOVF 0x1d,0x0,0x1 0038de 6e2a MOVWF 0x2a,0x0 0038e0 6a2b CLRF 0x2b,0x0 0038e2 0e40 MOVLW 0x40 0038e4 182a XORWF 0x2a,0x0,0x0 0038e6 e101 BNZ 0x38ea 0038e8 502b MOVF 0x2b,0x0,0x0 0038ea e104 BNZ 0x38f4 0038ec 0101 MOVLB 0x1 cdc_trf_state = CDC_TX_BUSY_ZLP; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038ee 0e02 MOVLW 0x2 0038f0 6f9a MOVWF 0x9a,0x1 0038f2 d003 BRA 0x38fa else C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038f4 0101 MOVLB 0x1 cdc_trf_state = CDC_TX_COMPLETING; C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038f6 0e03 MOVLW 0x3 0038f8 6f9a MOVWF 0x9a,0x1 }//end if(cdc_tx_len...) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c }//end if(cdc_tx_sate == CDC_TX_BUSY) C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /* C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c * Both CDC_TX_BUSY and CDC_TX_BUSY_ZLP states use the following macro C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c */ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038fa 0e40 MOVLW 0x40 mUSBBufferReady(CDC_BULK_BD_IN); C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 0038fc 0104 MOVLB 0x4 0038fe 171c ANDWF 0x1c,0x1,0x1 003900 0104 MOVLB 0x4 003902 7d1c BTG 0x1c,0x6,0x1 003904 0e88 MOVLW 0x88 003906 0104 MOVLB 0x4 003908 131c IORWF 0x1c,0x1,0x1 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00390a 52e5 MOVF 0xe5,0x1,0x0 }//end CDCTxService C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c 00390c 52e5 MOVF 0xe5,0x1,0x0 00390e cfe7 MOVFF 0xfe7,0xfd9 003910 ffd9 003912 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c #endif //USB_USE_CDC C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c /** EOF cdc.c ****************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\class\cdc\cdc.c LIST P=18F4550 C:\MCC18\SRC\TRADIT~1\PROC\p18f4550.asm LIST C:\MCC18\SRC\TRADIT~1\PROC\p18f4550.asm END C:\MCC18\SRC\TRADIT~1\PROC\p18f4550.asm #include "p18cxxx.inc" C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm LIST C:\MCC18\MPASM\p18cxxx.inc ; P18CXXX.INC Standard Header File, Microchip Technology, Inc. C:\MCC18\MPASM\p18cxxx.inc LIST C:\MCC18\MPASM\P18C452.INC ; P18C452.INC Standard Header File, Version 0.12 Microchip Technology, Inc. C:\MCC18\MPASM\P18C452.INC LIST C:\MCC18\MPASM\P18C452.INC ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18C242 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18C252 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18C442 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18C452 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18C601 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18C658 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18C801 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18C858 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F1220 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F1230 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F1320 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F1330 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2220 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2221 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2320 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2321 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2331 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2410 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F242 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2420 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2423 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2431 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2439 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2450 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2455 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2458 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F248 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2480 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F24J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F24K20 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2510 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2515 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F252 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2520 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2523 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2525 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2539 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2550 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2553 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F258 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2580 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2585 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F25J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F25K20 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2610 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2620 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2680 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2682 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F2685 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F26K20 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4220 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4221 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4320 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4321 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4331 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4410 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F442 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4420 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4423 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4431 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4439 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4450 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4455 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4458 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F448 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4480 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F44J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F44K20 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4510 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4515 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F452 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4520 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4523 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4525 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4539 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4550 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4553 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F458 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4580 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4585 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F45J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F45K20 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4610 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4620 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4680 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4682 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F4685 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F46K20 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6310 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6390 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F63J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F63J90 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6410 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6490 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F64J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F64J90 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6520 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6525 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6527 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6585 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F65J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F65J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F65J15 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F65J50 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F65J90 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6620 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6621 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6622 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6627 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6628 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6680 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F66J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F66J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F66J15 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F66J16 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F66J50 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F66J55 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F66J60 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F66J65 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6720 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6722 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F6723 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F67J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F67J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F67J50 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F67J60 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8310 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8390 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F83J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F83J90 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8410 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8490 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F84J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F84J90 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8520 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8525 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8527 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8585 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F85J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F85J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F85J15 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F85J50 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F85J90 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8620 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8621 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8622 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8627 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8628 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8680 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F86J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F86J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F86J15 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F86J16 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F86J50 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F86J55 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F86J60 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F86J65 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8720 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8722 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F8723 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F87J10 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F87J11 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F87J50 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F87J60 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F96J60 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F96J65 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc IFDEF __18F97J60 C:\MCC18\MPASM\p18cxxx.inc INCLUDE C:\MCC18\MPASM\p18cxxx.inc ENDIF C:\MCC18\MPASM\p18cxxx.inc C:\MCC18\MPASM\p18cxxx.inc C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;/******************************************************************** C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* Function Name: Delay10TCYx * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* Return Value: void * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* Parameters: unit: * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* Description: This routine delays for multiples of 10 * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* instruction cycles that is specified in unit. * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* Special Note: This routine provides multiples of 10 Tcy. * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* A value of 1 to 255 provides 10 to 2550 Tcy * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* delay. A value of 0 will provide a delay of * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;* 2560 Tcy. * C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ;********************************************************************/ C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm D10TCYXCODE CODE C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm Delay10TCYx C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047ae 0eff MOVLW 0xff movlw 0xff C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047b0 50e3 MOVF 0xe3,0x0,0x0 movf PLUSW1,0 C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047b2 4ee8 DCFSNZ 0xe8,0x1,0x0 dcfsnz WREG,1 C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047b4 0012 RETURN 0x0 return C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm D10x C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047b6 0000 NOP nop C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047b8 d000 BRA 0x47ba bra $+2 C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047ba d000 BRA 0x47bc bra $+2 C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047bc d000 BRA 0x47be bra $+2 C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm D10_1 C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047be 2ee8 DECFSZ 0xe8,0x1,0x0 decfsz WREG,1 C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047c0 d7fa BRA 0x47b6 bra D10x C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm 0047c2 0012 RETURN 0x0 return C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm GLOBAL Delay10TCYx C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm END C:\MCC18\SRC\TRADIT~1\DELAYS\d10tcyx.asm ; RCS Header $Id: fxm2424u.asm,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; $Revision: 1.3 $ C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm include ; general Golden Gate definitions C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm LIST C:\MCC18\MPASM\P18CXXX.INC ; P18CXXX.INC Standard Header File, Microchip Technology, Inc. C:\MCC18\MPASM\P18CXXX.INC LIST C:\MCC18\MPASM\P18C452.INC ; P18C452.INC Standard Header File, Version 0.12 Microchip Technology, Inc. C:\MCC18\MPASM\P18C452.INC LIST C:\MCC18\MPASM\P18C452.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C601 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C658 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C801 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C858 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1230 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1330 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F248 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F258 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F26K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F448 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F46K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F97J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm include ; Math library definitions C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; RCS Header $Id: cmath18.inc,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC ; $Revision: 1.3 $ C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC LIST C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC ; CMATH18.INC v1.0 Microchip Technology, Inc. / F.J. Testa C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC LIST C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm include ; AARG declarations C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; RCS Header $Id: aarg.inc,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC ; CMATH18 DATA DECLARATION FILE C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC EXTERN __AARGB0, __AARGB1, __AARGB2, __AARGB3 C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC EXTERN __AARGB4, __AARGB5, __AARGB6, __AARGB7 C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC EXTERN __AEXP C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC EXTERN __REMB3, __REMB2, __REMB1, __REMB0 C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm include ; BARG declarations C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; RCS Header $Id: barg.inc,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC ; CMATH18 DATA DECLARATION FILE C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC EXTERN __BARGB3, __BARGB2, __BARGB1, __BARGB0 C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC EXTERN __BEXP C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm include ; TEMPARG declarations C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; RCS Header $Id: temparg.inc,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC ; CMATH18 DATA DECLARATION FILE C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC EXTERN __TEMPB3, __TEMPB2, __TEMPB1, __TEMPB0, __TEMP C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ;********************************************************************************************** C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ;********************************************************************************************** C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; 24x24 Bit Unsigned Fixed Point Multiply 24 x 24 -> 48 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; Input: 24 bit unsigned fixed point multiplicand in AARGB0, AARGB1, C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; AARGB2 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; 24 bit unsigned fixed point multiplier in BARGB0, BARGB1, C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; BARGB2 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; Use: CALL FXM2424U C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; Output: 48 bit unsigned fixed point product in AARGB0, AARGB1, C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; AARGB2, AARGB3, AARGB4, AARGB5 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; Result: AARG <-- AARG * BARG C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; Max Timing: 65 clks C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; Min Timing: 65 clks C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; PM: 64 DM: 12 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm PROG CODE C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm FXM2424U C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm GLOBAL FXM2424U C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004242 c01f MOVFF 0x1f,0x29 MOVFF __AARGB0,__TEMPB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004244 f029 004246 c01e MOVFF 0x1e,0x28 MOVFF __AARGB1,__TEMPB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004248 f028 00424a c01d MOVFF 0x1d,0x27 MOVFF __AARGB2,__TEMPB2 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00424c f027 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00424e 501d MOVF 0x1d,0x0,0x0 MOVF __AARGB2,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004250 0222 MULWF 0x22,0x0 MULWF __BARGB2 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004252 cff4 MOVFF 0xff4,0x1b MOVFF PRODH,__AARGB4 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004254 f01b 004256 cff3 MOVFF 0xff3,0x1a MOVFF PRODL,__AARGB5 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004258 f01a C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00425a 501e MOVF 0x1e,0x0,0x0 MOVF __AARGB1,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00425c 0223 MULWF 0x23,0x0 MULWF __BARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00425e cff4 MOVFF 0xff4,0x1d MOVFF PRODH,__AARGB2 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004260 f01d 004262 cff3 MOVFF 0xff3,0x1c MOVFF PRODL,__AARGB3 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004264 f01c C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004266 0222 MULWF 0x22,0x0 MULWF __BARGB2 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004268 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00426a 261b ADDWF 0x1b,0x1,0x0 ADDWF __AARGB4,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00426c 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00426e 221c ADDWFC 0x1c,0x1,0x0 ADDWFC __AARGB3,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004270 6ae8 CLRF 0xe8,0x0 CLRF WREG C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004272 221d ADDWFC 0x1d,0x1,0x0 ADDWFC __AARGB2,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004274 5027 MOVF 0x27,0x0,0x0 MOVF __TEMPB2,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004276 0223 MULWF 0x23,0x0 MULWF __BARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004278 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00427a 261b ADDWF 0x1b,0x1,0x0 ADDWF __AARGB4,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00427c 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00427e 221c ADDWFC 0x1c,0x1,0x0 ADDWFC __AARGB3,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004280 6ae8 CLRF 0xe8,0x0 CLRF WREG C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004282 221d ADDWFC 0x1d,0x1,0x0 ADDWFC __AARGB2,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004284 501f MOVF 0x1f,0x0,0x0 MOVF __AARGB0,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004286 0222 MULWF 0x22,0x0 MULWF __BARGB2 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004288 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00428a 261c ADDWF 0x1c,0x1,0x0 ADDWF __AARGB3,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00428c 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00428e 221d ADDWFC 0x1d,0x1,0x0 ADDWFC __AARGB2,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004290 501f MOVF 0x1f,0x0,0x0 MOVF __AARGB0,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004292 0223 MULWF 0x23,0x0 MULWF __BARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004294 6a1e CLRF 0x1e,0x0 CLRF __AARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004296 6ae8 CLRF 0xe8,0x0 CLRF WREG C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 004298 221e ADDWFC 0x1e,0x1,0x0 ADDWFC __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00429a 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00429c 261d ADDWF 0x1d,0x1,0x0 ADDWF __AARGB2,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 00429e 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042a0 221e ADDWFC 0x1e,0x1,0x0 ADDWFC __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042a2 5027 MOVF 0x27,0x0,0x0 MOVF __TEMPB2,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042a4 0224 MULWF 0x24,0x0 MULWF __BARGB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042a6 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042a8 261c ADDWF 0x1c,0x1,0x0 ADDWF __AARGB3,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042aa 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042ac 221d ADDWFC 0x1d,0x1,0x0 ADDWFC __AARGB2,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042ae 6a1f CLRF 0x1f,0x0 CLRF __AARGB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042b0 6ae8 CLRF 0xe8,0x0 CLRF WREG C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042b2 221e ADDWFC 0x1e,0x1,0x0 ADDWFC __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042b4 221f ADDWFC 0x1f,0x1,0x0 ADDWFC __AARGB0,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042b6 5028 MOVF 0x28,0x0,0x0 MOVF __TEMPB1,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042b8 0224 MULWF 0x24,0x0 MULWF __BARGB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042ba 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042bc 261d ADDWF 0x1d,0x1,0x0 ADDWF __AARGB2,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042be 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042c0 221e ADDWFC 0x1e,0x1,0x0 ADDWFC __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042c2 6ae8 CLRF 0xe8,0x0 CLRF WREG C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042c4 221f ADDWFC 0x1f,0x1,0x0 ADDWFC __AARGB0,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042c6 5029 MOVF 0x29,0x0,0x0 MOVF __TEMPB0,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042c8 0224 MULWF 0x24,0x0 MULWF __BARGB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042ca 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042cc 261e ADDWF 0x1e,0x1,0x0 ADDWF __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042ce 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042d0 221f ADDWFC 0x1f,0x1,0x0 ADDWFC __AARGB0,F C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm 0042d2 0c00 RETLW 0x0 RETLW 0x00 C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm END C:\MCC18\SRC\TRADIT~1\MATH\fxm2424u.asm ; RCS Header $Id: cmath18.asm,v 1.5 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ; CMATH18 DATA DEFINITION FILE C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ; VARIABLE ALLOCATION - Core math library routines C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm MATH_DATA UDATA_ACS C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm SIGN RES 1 ; save location for sign in MSB C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm __FPFLAGSbits C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm __FPFLAGS RES 1 ; floating point library exception flags C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm GLOBAL SIGN, __FPFLAGS, __FPFLAGSbits C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm END C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ; RCS Header $Id: aarg.asm,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm ; CMATH18 DATA DEFINITION FILE C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm ; VARIABLE ALLOCATION - Core math library routines C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm MATH_DATA UDATA_ACS C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __REMB3 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AARGB7 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __REMB2 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AARGB6 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __REMB1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AARGB5 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __REMB0 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AARGB4 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AARGB3 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AARGB2 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AARGB1 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AARGB0 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm __AEXP RES 1 ; 8 bit biased exponent for argument A C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm GLOBAL __AARGB0, __AARGB1, __AARGB2, __AARGB3 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm GLOBAL __AARGB4, __AARGB5, __AARGB6, __AARGB7 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm GLOBAL __AEXP C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm GLOBAL __REMB3, __REMB2, __REMB1, __REMB0 C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm END C:\MCC18\SRC\TRADIT~1\MATH\aarg.asm ; RCS Header $Id: barg.asm,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\barg.asm C:\MCC18\SRC\TRADIT~1\MATH\barg.asm ; CMATH18 DATA DEFINITION FILE C:\MCC18\SRC\TRADIT~1\MATH\barg.asm C:\MCC18\SRC\TRADIT~1\MATH\barg.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\barg.asm ; VARIABLE ALLOCATION - Core math library routines C:\MCC18\SRC\TRADIT~1\MATH\barg.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\barg.asm C:\MCC18\SRC\TRADIT~1\MATH\barg.asm MATH_DATA UDATA_ACS C:\MCC18\SRC\TRADIT~1\MATH\barg.asm C:\MCC18\SRC\TRADIT~1\MATH\barg.asm __BARGB3 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\barg.asm __BARGB2 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\barg.asm __BARGB1 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\barg.asm __BARGB0 RES 1 ; most significant byte of argument B C:\MCC18\SRC\TRADIT~1\MATH\barg.asm C:\MCC18\SRC\TRADIT~1\MATH\barg.asm __BEXP RES 1 ; 8 bit biased exponent for argument B C:\MCC18\SRC\TRADIT~1\MATH\barg.asm C:\MCC18\SRC\TRADIT~1\MATH\barg.asm GLOBAL __BARGB3, __BARGB2, __BARGB1, __BARGB0 C:\MCC18\SRC\TRADIT~1\MATH\barg.asm GLOBAL __BEXP C:\MCC18\SRC\TRADIT~1\MATH\barg.asm C:\MCC18\SRC\TRADIT~1\MATH\barg.asm END C:\MCC18\SRC\TRADIT~1\MATH\barg.asm ; RCS Header $Id: temparg.asm,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm ; CMATH18 DATA DEFINITION FILE C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm ; VARIABLE ALLOCATION - Core math library routines C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm MATH_DATA UDATA_ACS C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm __TEMPB3 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm __TEMPB2 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm __TEMPB1 RES 1 C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm __TEMP C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm __TEMPB0 RES 1 ; temporary storage C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm GLOBAL __TEMPB3, __TEMPB2, __TEMPB1, __TEMPB0, __TEMP C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm END C:\MCC18\SRC\TRADIT~1\MATH\temparg.asm #include C:\MCC18\src\TRADIT~1\stdclib\printf.c C:\MCC18\src\TRADIT~1\stdclib\printf.c /* printf() is a wrapper function which calls vfprintf() with stdout as the C:\MCC18\src\TRADIT~1\stdclib\printf.c destination output stream. EOF is returned on error, else the number C:\MCC18\src\TRADIT~1\stdclib\printf.c of characters output. */ C:\MCC18\src\TRADIT~1\stdclib\printf.c int C:\MCC18\src\TRADIT~1\stdclib\printf.c 00449a cfd9 MOVFF 0xfd9,0xfe6 printf (const rom char *fmt, ...) C:\MCC18\src\TRADIT~1\stdclib\printf.c 00449c ffe6 00449e cfda MOVFF 0xfda,0xfe6 0044a0 ffe6 0044a2 cfe1 MOVFF 0xfe1,0xfd9 0044a4 ffd9 0044a6 cfe2 MOVFF 0xfe2,0xfda 0044a8 ffda 0044aa 52e6 MOVF 0xe6,0x1,0x0 0044ac 52e6 MOVF 0xe6,0x1,0x0 0044ae 52e6 MOVF 0xe6,0x1,0x0 0044b0 52e6 MOVF 0xe6,0x1,0x0 { C:\MCC18\src\TRADIT~1\stdclib\printf.c va_list ap; C:\MCC18\src\TRADIT~1\stdclib\printf.c int n; C:\MCC18\src\TRADIT~1\stdclib\printf.c 0044b2 50d9 MOVF 0xd9,0x0,0x0 va_start (ap, fmt); C:\MCC18\src\TRADIT~1\stdclib\printf.c 0044b4 0ffb ADDLW 0xfb 0044b6 6e2a MOVWF 0x2a,0x0 0044b8 0eff MOVLW 0xff 0044ba 20da ADDWFC 0xda,0x0,0x0 0044bc 6e2b MOVWF 0x2b,0x0 0044be c02a MOVFF 0x2a,0xfde 0044c0 ffde 0044c2 6edd MOVWF 0xdd,0x0 0044c4 cfde MOVFF 0xfde,0xfe6 n = vfprintf (stdout, fmt, ap); C:\MCC18\src\TRADIT~1\stdclib\printf.c 0044c6 ffe6 0044c8 cfdd MOVFF 0xfdd,0xfe6 0044ca ffe6 0044cc 0efb MOVLW 0xfb 0044ce cfdb MOVFF 0xfdb,0xfe6 0044d0 ffe6 0044d2 0efc MOVLW 0xfc 0044d4 cfdb MOVFF 0xfdb,0xfe6 0044d6 ffe6 0044d8 0efd MOVLW 0xfd 0044da cfdb MOVFF 0xfdb,0xfe6 0044dc ffe6 0044de c1dc MOVFF 0x1dc,0xfe6 0044e0 ffe6 0044e2 c1dd MOVFF 0x1dd,0xfe6 0044e4 ffe6 0044e6 eca3 CALL 0x2946,0x0 0044e8 f014 0044ea 6e2a MOVWF 0x2a,0x0 0044ec 0e07 MOVLW 0x7 0044ee 5ce1 SUBWF 0xe1,0x0,0x0 0044f0 e202 BC 0x44f6 0044f2 6ae1 CLRF 0xe1,0x0 0044f4 52e5 MOVF 0xe5,0x1,0x0 0044f6 6ee1 MOVWF 0xe1,0x0 0044f8 502a MOVF 0x2a,0x0,0x0 0044fa 0e02 MOVLW 0x2 0044fc cff3 MOVFF 0xff3,0xfdb 0044fe ffdb 004500 0e03 MOVLW 0x3 004502 cff4 MOVFF 0xff4,0xfdb 004504 ffdb va_end (ap); C:\MCC18\src\TRADIT~1\stdclib\printf.c 004506 0e02 MOVLW 0x2 return n; C:\MCC18\src\TRADIT~1\stdclib\printf.c 004508 cfdb MOVFF 0xfdb,0x2a 00450a f02a 00450c 0e03 MOVLW 0x3 00450e cfdb MOVFF 0xfdb,0x2b 004510 f02b 004512 c02a MOVFF 0x2a,0xff3 004514 fff3 004516 c02b MOVFF 0x2b,0xff4 004518 fff4 00451a 0e04 MOVLW 0x4 } C:\MCC18\src\TRADIT~1\stdclib\printf.c 00451c 5ce1 SUBWF 0xe1,0x0,0x0 00451e e202 BC 0x4524 004520 6ae1 CLRF 0xe1,0x0 004522 52e5 MOVF 0xe5,0x1,0x0 004524 6ee1 MOVWF 0xe1,0x0 004526 52e5 MOVF 0xe5,0x1,0x0 004528 cfe5 MOVFF 0xfe5,0xfda 00452a ffda 00452c cfe7 MOVFF 0xfe7,0xfd9 00452e ffd9 004530 0012 RETURN 0x0 #include C:\MCC18\src\TRADIT~1\stdclib\stdout.c C:\MCC18\src\TRADIT~1\stdclib\stdout.c /* by default stdout issues to the USART */ C:\MCC18\src\TRADIT~1\stdclib\stdout.c FILE *stdout = _H_USART; C:\MCC18\src\TRADIT~1\stdclib\stdout.c #include "P18CXXX.INC" C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm LIST C:\MCC18\MPASM\P18CXXX.INC ; P18CXXX.INC Standard Header File, Microchip Technology, Inc. C:\MCC18\MPASM\P18CXXX.INC LIST C:\MCC18\MPASM\P18C452.INC ; P18C452.INC Standard Header File, Version 0.12 Microchip Technology, Inc. C:\MCC18\MPASM\P18C452.INC LIST C:\MCC18\MPASM\P18C452.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C601 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C658 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C801 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C858 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1230 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1330 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F248 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F258 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F26K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F448 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F46K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F97J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\MPASM\P18CXXX.INC #include "P18MACRO.INC" C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; $Id: p18macro.inc,v 1.2 2005/05/20 15:34:54 GrosbaJ Exp $ C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;========================================================================== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; MACROS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;========================================================================== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC LIST C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkSetPtrToOffset macro Ptr,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Set pointer Ptr to argument in stack frame at Offset. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf Ptr,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(Offset&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf Ptr+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkPushPtrToOffset macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Push pointer onto stack to point to Offset location in stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Offset defined before push. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf INDF1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(Offset&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf PREINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTINC1,F,ACCESS ; increment FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkAddStackPtr macro N C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add N to FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(N) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(N&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFD C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS ; restore FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFD C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS ; restore FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+2) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+3) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+2) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment 3 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement 3 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 1 byte at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 2 bytes at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 3 bytes at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 1 byte in stack at Offset to byte at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf INDF0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 2 bytes in stack at Offset to 2 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 3 bytes in stack at Offset to 3 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 4 bytes in stack at Offset to 4 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 1 byte in stack at Offset to byte at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 2 bytes in stack at Offset to 2 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 3 bytes in stack at Offset to 3 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 4 bytes in stack at Offset to 4 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 1 byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 4 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 1 byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 2 bytesin stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 4 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1NegateFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 1 byte at FSR2. FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2NegateFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 2 bytes at FSR2. FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;====== These branches are short ============== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpWeqZ macro Label ; jmp if W == 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf WREG,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpWneZ macro Label ; jmp if W != 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC tstfsz WREG,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqZ macro Reg,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg,F,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneZ macro Reg,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg,F,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg,W,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg,W,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFleL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC cpfsgt Reg,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFgeL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC cpfslt Reg,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqF macro Reg1,Acc1,Reg2,Acc2,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg1,W,Acc1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg2,W,Acc2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneF macro Reg1,Acc1,Reg2,Acc2,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg1,W,Acc1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg2,W,Acc2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpClr macro Reg,Bit,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfss Reg,Bit,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpSet macro Reg,Bit,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc Reg,Bit,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; @name toupper C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ;The {\bf toupper} function converts a lower case character to the C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ;corresponding upper case character. C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ;@return If {\bf islower} is true for the value of {\bf c}, the corresponding C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ;upper case equivalent is returned, else the value of {\bf c} is returned C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ;unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; int toupper (int c); C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm CTYPE CODE C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm toupper C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm global toupper C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; Proceedure: Use FSR0 as pointer to 'c' C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; Return with result in PROD C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; Set FSR0 = FSR1 - 2 ( location of 'c') after checking upper byte for 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 00468c 0eff MOVLW 0xff StkSetPtrToOffset FSR0L,-1 C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 00468e 24e1 ADDWF 0xe1,0x0,0x0 004690 6ee9 MOVWF 0xe9,0x0 004692 0eff MOVLW 0xff 004694 20e2 ADDWFC 0xe2,0x0,0x0 004696 6eea MOVWF 0xea,0x0 C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; Copy 'c' into target location C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 004698 cfed MOVFF 0xfed,0xff4 movff POSTDEC0, PRODH C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 00469a fff4 00469c cfef MOVFF 0xfef,0xff3 movff INDF0, PRODL C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 00469e fff3 C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 0046a0 66f4 TSTFSZ 0xf4,0x0 tstfsz PRODH,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 0046a2 d007 BRA 0x46b2 bra jNoMatch ; upper byte must be 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; Test for lower case condition C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 0046a4 0e60 MOVLW 0x60 jmpFleL PRODL,ACCESS,'a'-1,jNoMatch C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 0046a6 64f3 CPFSGT 0xf3,0x0 0046a8 d004 BRA 0x46b2 0046aa 0e7b MOVLW 0x7b jmpFgeL PRODL,ACCESS,'z'+1,jNoMatch C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 0046ac 60f3 CPFSLT 0xf3,0x0 0046ae d001 BRA 0x46b2 C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm ; Convert char from lower to upper by clearing bit 5 C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 0046b0 9af3 BCF 0xf3,0x5,0x0 bcf PRODL,5,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm jNoMatch: C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm 0046b2 0012 RETURN 0x0 return C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm end C:\MCC18\SRC\TRADIT~1\STDCLIB\toupper.asm #include C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #include C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #include C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FLAG_MINUS 0x1 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FLAG_PLUS 0x2 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FLAG_SPACE 0x4 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FLAG_OCTO 0x8 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FLAG_ZERO 0x10 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FLAG_SIGNED 0x80 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c static const rom char s_digits[] = "0123456789abcdef"; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c static unsigned char C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00291a ecc9 CALL 0x3392,0x0 s_put_n_chars (FILE * handle, unsigned char n, char c) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00291c f019 003392 cfd9 MOVFF 0xfd9,0xfe6 003394 ffe6 003396 cfda MOVFF 0xfda,0xfe6 003398 ffe6 00339a cfe1 MOVFF 0xfe1,0xfd9 00339c ffd9 00339e cfe2 MOVFF 0xfe2,0xfda 0033a0 ffda 0033a2 0012 RETURN 0x0 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00291e 0efb MOVLW 0xfb while (n--) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002920 cfdb MOVFF 0xfdb,0xff3 002922 fff3 002924 06db DECF 0xdb,0x1,0x0 002926 50f3 MOVF 0xf3,0x0,0x0 002928 0900 IORLW 0x0 00292a e00a BZ 0x2940 00292c ec17 CALL 0x342e,0x0 if (putc (c, handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00292e f01a 002930 0efa MOVLW 0xfa 002932 ec82 CALL 0x3504,0x0 002934 f01a 002936 e1f3 BNZ 0x291e 002938 1c2b COMF 0x2b,0x0,0x0 00293a e1f1 BNZ 0x291e 00293c 0e01 MOVLW 0x1 return 1; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00293e d001 BRA 0x2942 002940 0e00 MOVLW 0x0 return 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002942 eff8 GOTO 0x33f0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002944 f019 0033f0 52e5 MOVF 0xe5,0x1,0x0 0033f2 cfe5 MOVFF 0xfe5,0xfda 0033f4 ffda 0033f6 cfe7 MOVFF 0xfe7,0xfd9 0033f8 ffd9 0033fa 0012 RETURN 0x0 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FMT_UNSPECIFIED 0 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FMT_LONG 1 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FMT_SHLONG 2 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c #define _FMT_BYTE 3 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c int C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002946 ecc9 CALL 0x3392,0x0 vfprintf (auto FILE *handle, auto const rom char *f, auto va_list ap) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002948 f019 00294a 0e3b MOVLW 0x3b 00294c 24e1 ADDWF 0xe1,0x0,0x0 00294e e302 BNC 0x2954 002950 68e1 SETF 0xe1,0x0 002952 52e6 MOVF 0xe6,0x1,0x0 002954 6ee1 MOVWF 0xe1,0x0 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c unsigned char c; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002956 0e01 MOVLW 0x1 int count = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002958 6adb CLRF 0xdb,0x0 00295a 0e02 MOVLW 0x2 00295c 6adb CLRF 0xdb,0x0 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00295e 0ef9 MOVLW 0xf9 for (c = *f; c; c = *++f) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002960 cfdb MOVFF 0xfdb,0xff6 002962 fff6 002964 0efa MOVLW 0xfa 002966 cfdb MOVFF 0xfdb,0xff7 002968 fff7 00296a 0efb MOVLW 0xfb 00296c cfdb MOVFF 0xfdb,0xff8 00296e fff8 002970 0008 TBLRD 002972 50f5 MOVF 0xf5,0x0,0x0 002974 6edf MOVWF 0xdf,0x0 002976 50df MOVF 0xdf,0x0,0x0 002978 e102 BNZ 0x297e 00297a ef1c GOTO 0x3238 00297c f019 003232 d979 RCALL 0x3526 003234 efb8 GOTO 0x2970 003236 f014 003526 50d9 MOVF 0xd9,0x0,0x0 003528 0ff9 ADDLW 0xf9 00352a 6ee9 MOVWF 0xe9,0x0 00352c 0eff MOVLW 0xff 00352e ef2c GOTO 0x3458 003530 f01a { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00297e 0e25 MOVLW 0x25 if (c == '%') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002980 5cdf SUBWF 0xdf,0x0,0x0 002982 e002 BZ 0x2988 002984 ef0f GOTO 0x321e 002986 f019 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002988 0e03 MOVLW 0x3 unsigned char flags = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00298a 6adb CLRF 0xdb,0x0 00298c 0e04 MOVLW 0x4 unsigned char width = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00298e 6adb CLRF 0xdb,0x0 002990 0e05 MOVLW 0x5 unsigned char precision = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002992 6adb CLRF 0xdb,0x0 002994 0e06 MOVLW 0x6 unsigned char have_precision = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002996 6adb CLRF 0xdb,0x0 002998 0e07 MOVLW 0x7 unsigned char size = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00299a 6adb CLRF 0xdb,0x0 unsigned char space_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c unsigned char cval; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c unsigned long larg; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c far rom char *romstring; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c char *ramstring; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c int n; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* get the first character of the conversion specifier */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00299c ec31 CALL 0x3262,0x0 c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00299e f019 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /** The conversion specification has, after the '%' character: C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 7.9.6.1 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c * Zero or more flags (in any order) that modify the meaning of the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c conversion specification. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c * An optional minimum field width. If the converted value has C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c fewer characters than the field width, it will be padded with C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c spaces (by default) on the left (or right, if the left C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c adjustment flag, described later, has been given) to the field C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c width. The field width takes the form of an asterisk * C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c (described later) or a decimal integer. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c * An optional precision that gives the minimum number of digits C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c to appear for the d, i, o, u, x, and X conversions, the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c maximum number of digits to appear after the decimal point C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c character for e, E, and f conversions, the maximum number C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c of significant digits for the g and G conversions, or the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c maximum number of characters to be written from a string in C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c s conversion. The precision takes the form of a period (.) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c followed by an asterisk * (described later) or by an optional C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c decimal integer; if only the period is specified, the precision C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c is taken as zero. If a precision appears with any other C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c conversion specifier, the behaviour is undefined. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c * An optional h specifying that a following d, i, o, u, x, or X C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c conversion specifier applies to a short int or unsigned short C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c int argument (the argument will have been promoted according C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c to the integer promotions, and its value shall be converted C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c to short int or unsigned short int before printing); an C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c optional h specifying that a following n conversion specifier C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c applies to a pointer to a short int argument; an optional l C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c (ell) specifying that a following d, i, o, u, x, or X C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c conversion specifier applies to a long int or unsigned long int C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c argument; or an optional L specifying that a following e, E, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c f, g, or G conversion specifier applies to a long double C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c argument. If an h, l, or L appears with any other conversion C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c specifier, the behaviour is undefined. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c * A character that specifies the type of conversion to be applied. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /** check for a flag. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 7.9.6.1 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c The flag characters and their meanings are: C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c - The result of the conversion will be left-justified within C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c the field. (It will be right justified if this flag is not C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c specified.) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c + The result of a signed conversion will always begin with a C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c plus or a minus sign. (It will begin with a sign only when C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c a negative value is converted if this flag is not specified.) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c space If the first character of a signed conversion is not a C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c sign, or if a signed conversion results in no characters, a C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c space will be prefixed to the result. If the space and + flags C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c both appear, the space flag will be ignored. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c # The result is to be converted to an "alternate form." For o C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c conversion, it increases the precision to force the first digit C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c of the result to be a zero. For x (or X) conversion, a nonzero C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c result will have 0x (or 0X) prefixed to it. For e, E, f, g, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c and G conversions, the result will always contain a decimal- C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c point character, even if no digits follow it. (Normally, a C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c decimal point character appears in the result of these C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c conversions only if a digit follows it.) For g and G C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c conversions, trailing zeros will not be removed from the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c result. For other conversions the behaviour is undefined. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0 For d, i, o, u, x, X, e, E, f, g, and G conversions, leading C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c zeros (following any indication of sign or base) are used to C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c pad to the field width; no space padding is performed. If C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c the 0 and - flags both appear, the 0 flag will be ignored. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c For other conversions, the behaviour is undefined. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029a0 0e2d MOVLW 0x2d while (c == '-' || c == '+' || c == ' ' || c == '#' C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029a2 5cdf SUBWF 0xdf,0x0,0x0 0029a4 e00c BZ 0x29be 0029a6 0e2b MOVLW 0x2b 0029a8 5cdf SUBWF 0xdf,0x0,0x0 0029aa e009 BZ 0x29be 0029ac 0e20 MOVLW 0x20 0029ae 5cdf SUBWF 0xdf,0x0,0x0 0029b0 e006 BZ 0x29be 0029b2 0e23 MOVLW 0x23 0029f0 d7d5 BRA 0x299c 0029b4 5cdf SUBWF 0xdf,0x0,0x0 || c == '0') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029b6 e003 BZ 0x29be 0029b8 0e30 MOVLW 0x30 0029ba 5cdf SUBWF 0xdf,0x0,0x0 0029bc e11a BNZ 0x29f2 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029be 50df MOVF 0xdf,0x0,0x0 switch (c) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029c0 0a30 XORLW 0x30 0029c2 e014 BZ 0x29ec 0029c4 0a13 XORLW 0x13 0029c6 e00f BZ 0x29e6 0029c8 0a03 XORLW 0x3 0029ca e00a BZ 0x29e0 0029cc 0a0b XORLW 0xb 0029ce e005 BZ 0x29da 0029d0 0a06 XORLW 0x6 0029d2 e1e4 BNZ 0x299c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case '-': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029d4 0e03 MOVLW 0x3 flags |= _FLAG_MINUS; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029d6 80db BSF 0xdb,0x0,0x0 0029d8 d7e1 BRA 0x299c break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case '+': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029da 0e03 MOVLW 0x3 flags |= _FLAG_PLUS; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029dc 82db BSF 0xdb,0x1,0x0 0029de d7de BRA 0x299c break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case ' ': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029e0 0e03 MOVLW 0x3 flags |= _FLAG_SPACE; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029e2 84db BSF 0xdb,0x2,0x0 0029e4 d7db BRA 0x299c break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case '#': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029e6 0e03 MOVLW 0x3 flags |= _FLAG_OCTO; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029e8 86db BSF 0xdb,0x3,0x0 0029ea d7d8 BRA 0x299c break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case '0': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029ec 0e03 MOVLW 0x3 flags |= _FLAG_ZERO; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029ee 88db BSF 0xdb,0x4,0x0 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* the optional width field is next */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029f2 0e2a MOVLW 0x2a if (c == '*') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029f4 5cdf SUBWF 0xdf,0x0,0x0 0029f6 e11b BNZ 0x2a2e { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029f8 ec2d CALL 0x325a,0x0 n = va_arg (ap, int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0029fa f019 0029fc ec7b CALL 0x32f6,0x0 0029fe f019 0032f6 0e13 MOVLW 0x13 0032f8 cfee MOVFF 0xfee,0xfdb 0032fa ffdb 0032fc 0e14 MOVLW 0x14 0032fe cfed MOVFF 0xfed,0xfdb 003300 ffdb 002a00 e010 BZ 0x2a22 if (n < 0) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003302 0e13 MOVLW 0x13 003304 cfdb MOVFF 0xfdb,0x2a 003306 f02a 003308 0e14 MOVLW 0x14 00330a cfdb MOVFF 0xfdb,0x2b 00330c f02b 00330e 0100 MOVLB 0x0 003310 0e80 MOVLW 0x80 003312 142b ANDWF 0x2b,0x0,0x0 003314 0012 RETURN 0x0 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a02 0e03 MOVLW 0x3 flags |= _FLAG_MINUS; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a04 80db BSF 0xdb,0x0,0x0 002a06 681e SETF 0x1e,0x0 width = -n; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a08 681f SETF 0x1f,0x0 002a0a 0e13 MOVLW 0x13 002a0c cfdb MOVFF 0xfdb,0x23 002a0e f023 002a10 0e14 MOVLW 0x14 002a12 cfdb MOVFF 0xfdb,0x24 002a14 f024 002a16 ec6a CALL 0x42d4,0x0 002a18 f021 002a1a 0e04 MOVLW 0x4 002a1c c01c MOVFF 0x1c,0xfdb 002a1e ffdb } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a20 d003 BRA 0x2a28 else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a22 0e13 MOVLW 0x13 width = n; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a24 ec64 CALL 0x32c8,0x0 002a26 f019 002a28 ec31 CALL 0x3262,0x0 c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a2a f019 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a2c d00b BRA 0x2a44 else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a2e 0e09 MOVLW 0x9 cval = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a30 6adb CLRF 0xdb,0x0 002a32 ecd2 CALL 0x33a4,0x0 while ((unsigned char) isdigit (c)) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a34 f019 002a36 e003 BZ 0x2a3e 002a3c d7fa BRA 0x2a32 0033a4 cfdf MOVFF 0xfdf,0xfe6 0033a6 ffe6 0033a8 6ae6 CLRF 0xe6,0x0 0033aa ec5a CALL 0x46b4,0x0 0033ac f023 0033ae 52e5 MOVF 0xe5,0x1,0x0 0033b0 52e5 MOVF 0xe5,0x1,0x0 0033b2 50f3 MOVF 0xf3,0x0,0x0 0033b4 0012 RETURN 0x0 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a38 ec46 CALL 0x348c,0x0 cval = cval * 10 + c - '0'; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a3a f01a 00348c 0e09 MOVLW 0x9 00348e 50db MOVF 0xdb,0x0,0x0 003490 0d0a MULLW 0xa 003492 50f3 MOVF 0xf3,0x0,0x0 003494 24df ADDWF 0xdf,0x0,0x0 003496 0fd0 ADDLW 0xd0 003498 6ee7 MOVWF 0xe7,0x0 00349a 0e09 MOVLW 0x9 00349c cfe7 MOVFF 0xfe7,0xfdb 00349e ffdb 0034a0 ef31 GOTO 0x3262 c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0034a2 f019 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a3e 0e09 MOVLW 0x9 width = cval; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a40 ec64 CALL 0x32c8,0x0 002a42 f019 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* if '-' is specified, '0' is ignored */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a44 0e03 MOVLW 0x3 if (flags & _FLAG_MINUS) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a46 b0db BTFSC 0xdb,0x0,0x0 002a48 98db BCF 0xdb,0x4,0x0 flags &= ~_FLAG_ZERO; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* the optional precision field is next */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a4a 0e2e MOVLW 0x2e if (c == '.') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a4c 5cdf SUBWF 0xdf,0x0,0x0 002a4e e11b BNZ 0x2a86 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a50 ec31 CALL 0x3262,0x0 c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a52 f019 002a54 0e2a MOVLW 0x2a if (c == '*') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a56 5cdf SUBWF 0xdf,0x0,0x0 002a58 e10b BNZ 0x2a70 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a5a ec2d CALL 0x325a,0x0 n = va_arg (ap, int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a5c f019 002a5e ec7b CALL 0x32f6,0x0 002a60 f019 00325a d929 RCALL 0x34ae 00325c 0e02 MOVLW 0x2 00325e ef1e GOTO 0x343c 003260 f01a 00343c 5e2a SUBWF 0x2a,0x1,0x0 00343e 0e00 MOVLW 0x0 003440 5a2b SUBWFB 0x2b,0x1,0x0 003442 0ef7 MOVLW 0xf7 003444 c02a MOVFF 0x2a,0xfdb 003446 ffdb 003448 0ef8 MOVLW 0xf8 00344a c02b MOVFF 0x2b,0xfdb 00344c ffdb 00344e c02a MOVFF 0x2a,0xfe9 003450 ffe9 003452 c02b MOVFF 0x2b,0xfea 003454 ffea 003456 0012 RETURN 0x0 0034ae 0ef7 MOVLW 0xf7 0034b0 cfdb MOVFF 0xfdb,0x2a 0034b2 f02a 0034b4 0ef8 MOVLW 0xf8 0034b6 cfdb MOVFF 0xfdb,0x2b 0034b8 f02b 0034ba 0012 RETURN 0x0 002a62 e103 BNZ 0x2a6a if (n >= 0) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a64 0e13 MOVLW 0x13 precision = n; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a66 ecb6 CALL 0x336c,0x0 002a68 f019 00336c 50db MOVF 0xdb,0x0,0x0 00336e d8ce RCALL 0x350c 00350c 6ee7 MOVWF 0xe7,0x0 00350e 0e05 MOVLW 0x5 003510 cfe7 MOVFF 0xfe7,0xfdb 003512 ffdb 003514 0012 RETURN 0x0 003370 0e01 MOVLW 0x1 have_precision = 1; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003372 6ef3 MOVWF 0xf3,0x0 003374 0e06 MOVLW 0x6 003376 cff3 MOVFF 0xff3,0xfdb 003378 ffdb 00337a 0012 RETURN 0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a6a ec31 CALL 0x3262,0x0 c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a6c f019 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a6e d00b BRA 0x2a86 else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a70 0e09 MOVLW 0x9 cval = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a72 6adb CLRF 0xdb,0x0 002a74 ecd2 CALL 0x33a4,0x0 while ((unsigned char) isdigit (c)) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a76 f019 002a78 e003 BZ 0x2a80 002a7e d7fa BRA 0x2a74 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a7a ec46 CALL 0x348c,0x0 cval = cval * 10 + c - '0'; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a7c f01a c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a80 0e09 MOVLW 0x9 precision = cval; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a82 ecb6 CALL 0x336c,0x0 002a84 f019 have_precision = 1; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* the optional 'h' specifier. since int and short int are C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c the same size for MPLAB C18, this is a NOP for us. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a86 0e68 MOVLW 0x68 if (c == 'h') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a88 5cdf SUBWF 0xdf,0x0,0x0 002a8a e107 BNZ 0x2a9a { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a8c ec31 CALL 0x3262,0x0 c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a8e f019 /* if 'c' is another 'h' character, this is an 'hh' C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c specifier and the size is 8 bits */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a90 0e68 MOVLW 0x68 if (c == 'h') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a92 5cdf SUBWF 0xdf,0x0,0x0 002a94 e11d BNZ 0x2ad0 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a96 0e03 MOVLW 0x3 size = _FMT_BYTE; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* 'z' and 't' are both 16-bit and so are NOPs */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a98 d018 BRA 0x2aca else if (c == 't' || c == 'z') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002a9a 0e74 MOVLW 0x74 002a9c 5cdf SUBWF 0xdf,0x0,0x0 002a9e e017 BZ 0x2ace 002aa0 0e7a MOVLW 0x7a 002aa2 5cdf SUBWF 0xdf,0x0,0x0 002aa4 e014 BZ 0x2ace c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* the 'H' specifier tells us to deal with 24-bit integers. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c the 'T' and 'Z' specifiers are also 24 bit */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002aa6 0e48 MOVLW 0x48 else if (c == 'H' || c == 'T' || c == 'Z') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002aa8 5cdf SUBWF 0xdf,0x0,0x0 002aaa e006 BZ 0x2ab8 002aac 0e54 MOVLW 0x54 002aae 5cdf SUBWF 0xdf,0x0,0x0 002ab0 e003 BZ 0x2ab8 002ab2 0e5a MOVLW 0x5a 002ab4 5cdf SUBWF 0xdf,0x0,0x0 002ab6 e102 BNZ 0x2abc { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ab8 0e02 MOVLW 0x2 size = _FMT_SHLONG; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* the 'l' specifier tells us to deal with 32-bit integers C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 'j' specifies intmax_t (long in our case). */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002aba d007 BRA 0x2aca else if (c == 'l' || c == 'j') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002abc 0e6c MOVLW 0x6c 002abe 5cdf SUBWF 0xdf,0x0,0x0 002ac0 e003 BZ 0x2ac8 002ac2 0e6a MOVLW 0x6a 002ac4 5cdf SUBWF 0xdf,0x0,0x0 002ac6 e104 BNZ 0x2ad0 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ac8 0e01 MOVLW 0x1 size = _FMT_LONG; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002aca ec09 CALL 0x3412,0x0 002acc f01a 002ace dbc9 RCALL 0x3262 c = *++f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003262 d961 RCALL 0x3526 003264 0008 TBLRD 003266 50f5 MOVF 0xf5,0x0,0x0 003268 6edf MOVWF 0xdf,0x0 00326a 0012 RETURN 0x0 003458 20da ADDWFC 0xda,0x0,0x0 00345a 6eea MOVWF 0xea,0x0 00345c 2aef INCF 0xef,0x1,0x0 00345e cfee MOVFF 0xfee,0xff6 003460 fff6 003462 0e00 MOVLW 0x0 003464 22ef ADDWFC 0xef,0x1,0x0 003466 cfee MOVFF 0xfee,0xff7 003468 fff7 00346a 22ef ADDWFC 0xef,0x1,0x0 00346c cfee MOVFF 0xfee,0xff8 00346e fff8 003470 0012 RETURN 0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ad0 50df MOVF 0xdf,0x0,0x0 switch (c) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ad2 0a6e XORLW 0x6e 002ad4 e101 BNZ 0x2ad8 002ad6 d37f BRA 0x31d6 002ad8 0a1e XORLW 0x1e 002ada e101 BNZ 0x2ade 002adc d192 BRA 0x2e02 002ade 0a20 XORLW 0x20 002ae0 e101 BNZ 0x2ae4 002ae2 d18f BRA 0x2e02 002ae4 0a3f XORLW 0x3f 002ae6 e101 BNZ 0x2aea 002ae8 d149 BRA 0x2d7c 002aea 0a1a XORLW 0x1a 002aec e101 BNZ 0x2af0 002aee d146 BRA 0x2d7c 002af0 0a0d XORLW 0xd 002af2 e101 BNZ 0x2af6 002af4 d143 BRA 0x2d7c 002af6 0a20 XORLW 0x20 002af8 e101 BNZ 0x2afc 002afa d140 BRA 0x2d7c 002afc 0a3a XORLW 0x3a 002afe e101 BNZ 0x2b02 002b00 d13d BRA 0x2d7c 002b02 0a20 XORLW 0x20 002b04 e101 BNZ 0x2b08 002b06 d13a BRA 0x2d7c 002b08 0a26 XORLW 0x26 002b0a e101 BNZ 0x2b0e 002b0c d135 BRA 0x2d78 002b0e 0a0d XORLW 0xd 002b10 e101 BNZ 0x2b14 002b12 d132 BRA 0x2d78 002b14 0a1a XORLW 0x1a 002b16 e101 BNZ 0x2b1a 002b18 d0d9 BRA 0x2ccc 002b1a 0a20 XORLW 0x20 002b1c e04a BZ 0x2bb2 002b1e 0a30 XORLW 0x30 002b20 e01f BZ 0x2b60 002b22 0a46 XORLW 0x46 002b24 e00e BZ 0x2b42 002b26 0a25 XORLW 0x25 002b28 e001 BZ 0x2b2c 002b2a d383 BRA 0x3232 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case '\0': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* this is undefined behaviour. we have a trailing '%' character C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c in the string, perhaps with some flags, width, precision C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c stuff as well, but no format specifier. We'll, arbitrarily, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c back up a character so that the loop will terminate C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c properly when it loops back and we'll output a '%' C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c character. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b2c 50d9 MOVF 0xd9,0x0,0x0 --f; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b2e 0ff9 ADDLW 0xf9 002b30 6ee9 MOVWF 0xe9,0x0 002b32 0eff MOVLW 0xff 002b34 20da ADDWFC 0xda,0x0,0x0 002b36 6eea MOVWF 0xea,0x0 002b38 0e01 MOVLW 0x1 002b3a 5eee SUBWF 0xee,0x1,0x0 002b3c 0e00 MOVLW 0x0 002b3e 5aee SUBWFB 0xee,0x1,0x0 002b40 5aee SUBWFB 0xee,0x1,0x0 /* fallthrough */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case '%': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b42 ec17 CALL 0x342e,0x0 if (putc ('%', handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b44 f01a 002b46 0e25 MOVLW 0x25 002b48 6ee6 MOVWF 0xe6,0x0 002b4a db95 RCALL 0x3276 002b4c e103 BNZ 0x2b54 002b4e 1c2b COMF 0x2b,0x0,0x0 002b50 e101 BNZ 0x2b54 002b52 d369 BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b54 ec13 CALL 0x3426,0x0 ++count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b56 f01a 002b58 e201 BC 0x2b5c 002b5a d36b BRA 0x3232 002b5c 2adb INCF 0xdb,0x1,0x0 002b5e d369 BRA 0x3232 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'c': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b60 0e08 MOVLW 0x8 space_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b62 6adb CLRF 0xdb,0x0 002b64 0e04 MOVLW 0x4 if (width > 1) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b66 50db MOVF 0xdb,0x0,0x0 002b68 0801 SUBLW 0x1 002b6a e206 BC 0x2b78 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b6c 0e04 MOVLW 0x4 space_cnt = width - 1; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b6e 04db DECF 0xdb,0x0,0x0 002b70 ecdb CALL 0x33b6,0x0 002b72 f019 002b74 50db MOVF 0xdb,0x0,0x0 count += space_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b76 db8b RCALL 0x328e } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b78 0e08 MOVLW 0x8 if (space_cnt && !(flags & _FLAG_MINUS)) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b7a 50db MOVF 0xdb,0x0,0x0 002b7c e009 BZ 0x2b90 002b7e 0e03 MOVLW 0x3 002b80 50db MOVF 0xdb,0x0,0x0 002b82 0b01 ANDLW 0x1 002b84 e105 BNZ 0x2b90 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b86 db72 RCALL 0x326c if (s_put_n_chars (handle, space_cnt, ' ')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b88 e001 BZ 0x2b8c 002b8a d34d BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b8c 0e08 MOVLW 0x8 space_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b8e 6adb CLRF 0xdb,0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b90 db64 RCALL 0x325a c = va_arg (ap, int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b92 cfef MOVFF 0xfef,0xfdf 002b94 ffdf 002b96 ec8b CALL 0x3516,0x0 if (putc (c, handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002b98 f01a 002b9a e103 BNZ 0x2ba2 002b9c 1c2b COMF 0x2b,0x0,0x0 002b9e e101 BNZ 0x2ba2 002ba0 d342 BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ba2 ec13 CALL 0x3426,0x0 ++count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ba4 f01a 002ba6 e301 BNC 0x2baa 002ba8 2adb INCF 0xdb,0x1,0x0 002baa db60 RCALL 0x326c if (s_put_n_chars (handle, space_cnt, ' ')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002bac e101 BNZ 0x2bb0 002bae d341 BRA 0x3232 002bb0 d33a BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'S': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002bb2 0e07 MOVLW 0x7 if (size == _FMT_SHLONG) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002bb4 50db MOVF 0xdb,0x0,0x0 002bb6 0802 SUBLW 0x2 002bb8 e10f BNZ 0x2bd8 002bba ec57 CALL 0x34ae,0x0 romstring = va_arg (ap, rom far char *); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002bbc f01a 002bbe 0e03 MOVLW 0x3 002bc0 ec1e CALL 0x343c,0x0 002bc2 f01a 002bc4 0e0e MOVLW 0xe 002bc6 cfee MOVFF 0xfee,0xfdb 002bc8 ffdb 002bca 0e0f MOVLW 0xf 002bcc cfee MOVFF 0xfee,0xfdb 002bce ffdb 002bd0 0e10 MOVLW 0x10 002bd2 cfee MOVFF 0xfee,0xfdb 002bd4 ffdb 002bd6 d020 BRA 0x2c18 else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002bd8 0ef7 MOVLW 0xf7 romstring = (far rom char*)va_arg (ap, rom near char *); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002bda cfdb MOVFF 0xfdb,0x2d 002bdc f02d 002bde 0ef8 MOVLW 0xf8 002be0 cfdb MOVFF 0xfdb,0x2e 002be2 f02e 002be4 0e02 MOVLW 0x2 002be6 5e2d SUBWF 0x2d,0x1,0x0 002be8 0e00 MOVLW 0x0 002bea 5a2e SUBWFB 0x2e,0x1,0x0 002bec 0ef7 MOVLW 0xf7 002bee c02d MOVFF 0x2d,0xfdb 002bf0 ffdb 002bf2 0ef8 MOVLW 0xf8 002bf4 c02e MOVFF 0x2e,0xfdb 002bf6 ffdb 002bf8 c02d MOVFF 0x2d,0xfe9 002bfa ffe9 002bfc c02e MOVFF 0x2e,0xfea 002bfe ffea 002c00 ec0e CALL 0x341c,0x0 002c02 f01a 002c04 6a2c CLRF 0x2c,0x0 002c06 0e0e MOVLW 0xe 002c08 c02a MOVFF 0x2a,0xfdb 002c0a ffdb 002c0c 0e0f MOVLW 0xf 002c0e c02b MOVFF 0x2b,0xfdb 002c10 ffdb 002c12 0e10 MOVLW 0x10 002c14 c02c MOVFF 0x2c,0xfdb 002c16 ffdb 002c18 0e0e MOVLW 0xe n = strlenpgm (romstring); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c1a cfdb MOVFF 0xfdb,0xfe6 002c1c ffe6 002c1e 0e0f MOVLW 0xf 002c20 cfdb MOVFF 0xfdb,0xfe6 002c22 ffe6 002c24 0e10 MOVLW 0x10 002c26 cfdb MOVFF 0xfdb,0xfe6 002c28 ffe6 002c2a ec21 CALL 0x4642,0x0 002c2c f023 002c2e 52e5 MOVF 0xe5,0x1,0x0 002c30 52e5 MOVF 0xe5,0x1,0x0 002c32 52e5 MOVF 0xe5,0x1,0x0 002c34 0e13 MOVLW 0x13 002c36 c01d MOVFF 0x1d,0xfdb 002c38 ffdb 002c3a 0e14 MOVLW 0x14 002c3c c01e MOVFF 0x1e,0xfdb 002c3e ffdb /* Normalize the width based on the length of the actual C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c string and the precision. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c40 0e06 MOVLW 0x6 if (have_precision && precision < (unsigned char) n) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c42 50db MOVF 0xdb,0x0,0x0 002c44 e005 BZ 0x2c50 002c46 0e13 MOVLW 0x13 002c48 ec52 CALL 0x34a4,0x0 002c4a f01a 002c4c e201 BC 0x2c50 002c4e db6a RCALL 0x3324 n = precision; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003324 0e05 MOVLW 0x5 003326 50db MOVF 0xdb,0x0,0x0 003328 6ee6 MOVWF 0xe6,0x0 00332a 50d9 MOVF 0xd9,0x0,0x0 00332c 0f13 ADDLW 0x13 00332e d901 RCALL 0x3532 003330 52e5 MOVF 0xe5,0x1,0x0 003332 50e7 MOVF 0xe7,0x0,0x0 003334 6eee MOVWF 0xee,0x0 003336 6aed CLRF 0xed,0x0 003338 0012 RETURN 0x0 002c50 ec76 CALL 0x34ec,0x0 if (width < (unsigned char) n) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c52 f01a 002c54 e202 BC 0x2c5a 0034ec 0e13 MOVLW 0x13 0034ee 50db MOVF 0xdb,0x0,0x0 0034f0 6ef3 MOVWF 0xf3,0x0 0034f2 0e04 MOVLW 0x4 0034f4 ef5f GOTO 0x32be 0034f6 f019 002c56 0e13 MOVLW 0x13 width = n; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c58 db37 RCALL 0x32c8 002c5a ec39 CALL 0x3472,0x0 space_cnt = width - (unsigned char) n; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c5c f01a 003472 0e04 MOVLW 0x4 003474 cfdb MOVFF 0xfdb,0xfe6 003476 ffe6 003478 0e13 MOVLW 0x13 00347a 50db MOVF 0xdb,0x0,0x0 00347c 52e5 MOVF 0xe5,0x1,0x0 00347e 5ce7 SUBWF 0xe7,0x0,0x0 003480 df9a RCALL 0x33b6 003482 50db MOVF 0xdb,0x0,0x0 count += space_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003484 df04 RCALL 0x328e /* we've already calculated the space count that the width C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c will require. now we want the width field to have the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c number of character to display from the string itself, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c limited by the length of the actual string and the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c specified precision. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c5e e006 BZ 0x2c6c if (have_precision && precision < width) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c60 0e04 MOVLW 0x4 002c62 ec52 CALL 0x34a4,0x0 002c64 f01a 002c66 e202 BC 0x2c6c 003486 0e06 MOVLW 0x6 003488 50db MOVF 0xdb,0x0,0x0 00348a 0012 RETURN 0x0 002c68 0e05 MOVLW 0x5 width = precision; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c6a db2e RCALL 0x32c8 /* if right justified, we print the spaces before the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c string */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c6c 0e03 MOVLW 0x3 if (!(flags & _FLAG_MINUS)) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c6e b0db BTFSC 0xdb,0x0,0x0 002c70 d005 BRA 0x2c7c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c72 dafc RCALL 0x326c if (s_put_n_chars (handle, space_cnt, ' ')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c74 e001 BZ 0x2c78 002c76 d2d7 BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c78 0e08 MOVLW 0x8 space_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c7a 6adb CLRF 0xdb,0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c7c 0e09 MOVLW 0x9 cval = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c7e 6adb CLRF 0xdb,0x0 002c80 0e0e MOVLW 0xe for (c = *romstring; c && cval < width; c = *++romstring) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002c82 cfdb MOVFF 0xfdb,0xff6 002c84 fff6 002c86 0e0f MOVLW 0xf 002c88 cfdb MOVFF 0xfdb,0xff7 002c8a fff7 002c8c 0e10 MOVLW 0x10 002c8e cfdb MOVFF 0xfdb,0xff8 002c90 fff8 002c92 0008 TBLRD 002c94 50f5 MOVF 0xf5,0x0,0x0 002c96 6edf MOVWF 0xdf,0x0 002c98 50df MOVF 0xdf,0x0,0x0 002c9a e014 BZ 0x2cc4 002c9c ec7c CALL 0x34f8,0x0 002c9e f01a 002ca0 e211 BC 0x2cc4 002cb8 50d9 MOVF 0xd9,0x0,0x0 002cba 0f0e ADDLW 0xe 002cbc 6ee9 MOVWF 0xe9,0x0 002cbe 0e00 MOVLW 0x0 002cc0 dbcb RCALL 0x3458 002cc2 d7e7 BRA 0x2c92 0034f8 0e04 MOVLW 0x4 0034fa 50db MOVF 0xdb,0x0,0x0 0034fc 6ef3 MOVWF 0xf3,0x0 0034fe 0e09 MOVLW 0x9 003500 ef5f GOTO 0x32be 003502 f019 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ca2 ec8b CALL 0x3516,0x0 if (putc (c, handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ca4 f01a 002ca6 e103 BNZ 0x2cae 002ca8 1c2b COMF 0x2b,0x0,0x0 002caa e101 BNZ 0x2cae 002cac d2bc BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cae dbbb RCALL 0x3426 ++count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cb0 e301 BNC 0x2cb4 002cb2 2adb INCF 0xdb,0x1,0x0 002cb4 0e09 MOVLW 0x9 ++cval; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cb6 2adb INCF 0xdb,0x1,0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* If there are spaces left, it's left justified. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c Either way, calling the function unconditionally C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c is smaller code. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cc4 dad3 RCALL 0x326c if (s_put_n_chars (handle, space_cnt, ' ')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cc6 e101 BNZ 0x2cca 002cc8 d2b4 BRA 0x3232 002cca d2ad BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 's': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ccc dac6 RCALL 0x325a ramstring = va_arg (ap, char *); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cce 0e11 MOVLW 0x11 002cd0 cfee MOVFF 0xfee,0xfdb 002cd2 ffdb 002cd4 0e12 MOVLW 0x12 002cd6 cfed MOVFF 0xfed,0xfdb 002cd8 ffdb 002cda 0e11 MOVLW 0x11 n = strlen (ramstring); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cdc cfdb MOVFF 0xfdb,0xfe6 002cde ffe6 002ce0 0e12 MOVLW 0x12 002ce2 cfdb MOVFF 0xfdb,0xfe6 002ce4 ffe6 002ce6 ec13 CALL 0x4626,0x0 002ce8 f023 002cea 52e5 MOVF 0xe5,0x1,0x0 002cec 52e5 MOVF 0xe5,0x1,0x0 002cee 0e13 MOVLW 0x13 002cf0 cff3 MOVFF 0xff3,0xfdb 002cf2 ffdb 002cf4 0e14 MOVLW 0x14 002cf6 cff4 MOVFF 0xff4,0xfdb 002cf8 ffdb /* Normalize the width based on the length of the actual C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c string and the precision. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cfa 0e06 MOVLW 0x6 if (have_precision && precision < (unsigned char) n) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002cfc 50db MOVF 0xdb,0x0,0x0 002cfe e004 BZ 0x2d08 002d00 0e13 MOVLW 0x13 002d02 dbd0 RCALL 0x34a4 002d04 e201 BC 0x2d08 002d06 db0e RCALL 0x3324 n = precision; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d08 ec76 CALL 0x34ec,0x0 if (width < (unsigned char) n) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d0a f01a 002d0c e202 BC 0x2d12 002d0e 0e13 MOVLW 0x13 width = n; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d10 dadb RCALL 0x32c8 002d12 dbaf RCALL 0x3472 space_cnt = width - (unsigned char) n; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0033b6 6ee7 MOVWF 0xe7,0x0 0033b8 0e08 MOVLW 0x8 0033ba cfe7 MOVFF 0xfe7,0xfdb 0033bc ffdb 0033be 0012 RETURN 0x0 count += space_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* we've already calculated the space count that the width C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c will require. now we want the width field to have the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c number of character to display from the string itself, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c limited by the length of the actual string and the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c specified precision. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d14 e005 BZ 0x2d20 if (have_precision && precision < width) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d16 0e04 MOVLW 0x4 002d18 dbc5 RCALL 0x34a4 002d1a e202 BC 0x2d20 0034a4 50db MOVF 0xdb,0x0,0x0 0034a6 6ef3 MOVWF 0xf3,0x0 0034a8 0e05 MOVLW 0x5 0034aa ef5f GOTO 0x32be 0034ac f019 002d1c 0e05 MOVLW 0x5 width = precision; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d1e dad4 RCALL 0x32c8 0032c8 50db MOVF 0xdb,0x0,0x0 0032ca 6ee7 MOVWF 0xe7,0x0 0032cc 0e04 MOVLW 0x4 0032ce cfe7 MOVFF 0xfe7,0xfdb 0032d0 ffdb 0032d2 0012 RETURN 0x0 /* if right justified, we print the spaces before the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c string */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d20 0e03 MOVLW 0x3 if (!(flags & _FLAG_MINUS)) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d22 b0db BTFSC 0xdb,0x0,0x0 002d24 d005 BRA 0x2d30 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d26 daa2 RCALL 0x326c if (s_put_n_chars (handle, space_cnt, ' ')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d28 e001 BZ 0x2d2c 002d2a d27d BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d2c 0e08 MOVLW 0x8 space_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d2e 6adb CLRF 0xdb,0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d30 0e09 MOVLW 0x9 cval = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d32 6adb CLRF 0xdb,0x0 002d34 0e11 MOVLW 0x11 for (c = *ramstring; c && cval < width; c = *++ramstring) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d36 cfdb MOVFF 0xfdb,0xfe9 002d38 ffe9 002d3a 0e12 MOVLW 0x12 002d3c cfdb MOVFF 0xfdb,0xfea 002d3e ffea 002d40 cfef MOVFF 0xfef,0xfdf 002d42 ffdf 002d44 50df MOVF 0xdf,0x0,0x0 002d46 e014 BZ 0x2d70 002d48 dbd7 RCALL 0x34f8 002d4a e212 BC 0x2d70 002d60 0e11 MOVLW 0x11 002d62 2adb INCF 0xdb,0x1,0x0 002d64 cfdb MOVFF 0xfdb,0xfe9 002d66 ffe9 002d68 0e12 MOVLW 0x12 002d6a e3e8 BNC 0x2d3c 002d6c 2adb INCF 0xdb,0x1,0x0 002d6e d7e6 BRA 0x2d3c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d4c dbe4 RCALL 0x3516 if (putc (c, handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d4e e103 BNZ 0x2d56 002d50 1c2b COMF 0x2b,0x0,0x0 002d52 e101 BNZ 0x2d56 002d54 d268 BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d56 db67 RCALL 0x3426 ++count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d58 e301 BNC 0x2d5c 002d5a 2adb INCF 0xdb,0x1,0x0 002d5c 0e09 MOVLW 0x9 ++cval; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d5e 2adb INCF 0xdb,0x1,0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* If there are spaces left, it's left justified. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c Either way, calling the function unconditionally C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c is smaller code. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d70 da7d RCALL 0x326c if (s_put_n_chars (handle, space_cnt, ' ')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d72 e101 BNZ 0x2d76 002d74 d25e BRA 0x3232 002d76 d257 BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'd': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'i': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d78 0e03 MOVLW 0x3 flags |= _FLAG_SIGNED; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d7a 8edb BSF 0xdb,0x7,0x0 /* fall through */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'o': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'u': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'x': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'X': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'b': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'B': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* This is a bit of a sneaky trick. The 'l' and 'hh' size C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c specifiers are valid only for the integer conversions, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c not the 'p' or 'P' conversions, and are ignored for the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c latter. By jumping over the additional size specifier C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c checks here we get the best code size since we can C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c limit the size checks in the remaining code. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d7c 0e07 MOVLW 0x7 if (size == _FMT_LONG) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d7e 04db DECF 0xdb,0x0,0x0 002d80 e110 BNZ 0x2da2 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d82 db95 RCALL 0x34ae larg = va_arg (ap, long int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002d84 0e04 MOVLW 0x4 002d86 db5a RCALL 0x343c 002d88 0e0a MOVLW 0xa 002d8a cfee MOVFF 0xfee,0xfdb 002d8c ffdb 002d8e 0e0b MOVLW 0xb 002d90 cfee MOVFF 0xfee,0xfdb 002d92 ffdb 002d94 0e0c MOVLW 0xc 002d96 cfee MOVFF 0xfee,0xfdb 002d98 ffdb 002d9a 0e0d MOVLW 0xd 002d9c cfee MOVFF 0xfee,0xfdb 002d9e ffdb 002da0 d06c BRA 0x2e7a goto _do_integer_conversion; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002da2 0e07 MOVLW 0x7 else if (size == _FMT_BYTE) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002da4 50db MOVF 0xdb,0x0,0x0 002da6 0803 SUBLW 0x3 002da8 e12c BNZ 0x2e02 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002daa 0e03 MOVLW 0x3 if (flags & _FLAG_SIGNED) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002dac aedb BTFSS 0xdb,0x7,0x0 002dae d00d BRA 0x2dca 002db0 dab2 RCALL 0x3316 larg = (signed char) va_arg (ap, int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002db2 0e02 MOVLW 0x2 002db4 da76 RCALL 0x32a2 002db6 cfef MOVFF 0xfef,0x2a 002db8 f02a 002dba 6a2b CLRF 0x2b,0x0 002dbc 6a2c CLRF 0x2c,0x0 002dbe 6a2d CLRF 0x2d,0x0 002dc0 ae2a BTFSS 0x2a,0x7,0x0 002dc2 d039 BRA 0x2e36 002dc4 682b SETF 0x2b,0x0 002dc6 682c SETF 0x2c,0x0 002dc8 d035 BRA 0x2e34 else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002dca 0ef7 MOVLW 0xf7 larg = (unsigned char) va_arg (ap, unsigned int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002dcc cfdb MOVFF 0xfdb,0x2b 002dce f02b 002dd0 0ef8 MOVLW 0xf8 002dd2 cfdb MOVFF 0xfdb,0x2c 002dd4 f02c 002dd6 0e02 MOVLW 0x2 002dd8 5e2b SUBWF 0x2b,0x1,0x0 002dda 0e00 MOVLW 0x0 002ddc 5a2c SUBWFB 0x2c,0x1,0x0 002dde 0ef7 MOVLW 0xf7 002de0 c02b MOVFF 0x2b,0xfdb 002de2 ffdb 002de4 0ef8 MOVLW 0xf8 002de6 c02c MOVFF 0x2c,0xfdb 002de8 ffdb 002dea c02b MOVFF 0x2b,0xfe9 002dec ffe9 002dee c02c MOVFF 0x2c,0xfea 002df0 ffea 002df2 cfef MOVFF 0xfef,0x2a 002df4 f02a 002df6 0e0a MOVLW 0xa 002df8 c02a MOVFF 0x2a,0xfdb 002dfa ffdb 002dfc 0e0b MOVLW 0xb 002dfe 6adb CLRF 0xdb,0x0 002e00 d038 BRA 0x2e72 goto _do_integer_conversion; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* fall through */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'p': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'P': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e02 0e07 MOVLW 0x7 if (size == _FMT_SHLONG) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e04 50db MOVF 0xdb,0x0,0x0 002e06 0802 SUBLW 0x2 002e08 e109 BNZ 0x2e1c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e0a 0e03 MOVLW 0x3 if (flags & _FLAG_SIGNED) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e0c aedb BTFSS 0xdb,0x7,0x0 002e0e d004 BRA 0x2e18 002e10 db59 RCALL 0x34c4 larg = va_arg (ap, short long int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e12 ae2c BTFSS 0x2c,0x7,0x0 002e14 d010 BRA 0x2e36 0033c0 cfee MOVFF 0xfee,0x2a 0033c2 f02a 0033c4 cfee MOVFF 0xfee,0x2b 0033c6 f02b 0033c8 cfef MOVFF 0xfef,0x2c 0033ca f02c 0033cc 6a2d CLRF 0x2d,0x0 0033ce 0012 RETURN 0x0 0034c4 df28 RCALL 0x3316 0034c6 0e03 MOVLW 0x3 0034c8 deec RCALL 0x32a2 0034ca efe0 GOTO 0x33c0 0034cc f019 002e16 d00e BRA 0x2e34 else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e18 db55 RCALL 0x34c4 larg = va_arg (ap, unsigned short long int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e1a d00d BRA 0x2e36 else if (flags & _FLAG_SIGNED) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e1c 0e03 MOVLW 0x3 002e1e aedb BTFSS 0xdb,0x7,0x0 002e20 d012 BRA 0x2e46 002e22 da79 RCALL 0x3316 larg = va_arg (ap, int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e24 0e02 MOVLW 0x2 002e26 da3d RCALL 0x32a2 002e28 daf9 RCALL 0x341c 002e2a 6a2c CLRF 0x2c,0x0 002e2c 6a2d CLRF 0x2d,0x0 002e2e ae2b BTFSS 0x2b,0x7,0x0 002e30 d002 BRA 0x2e36 002e32 682c SETF 0x2c,0x0 002e34 682d SETF 0x2d,0x0 002e36 dae2 RCALL 0x33fc 002e38 0e0c MOVLW 0xc 002e3a c02c MOVFF 0x2c,0xfdb 002e3c ffdb 002e3e 0e0d MOVLW 0xd 002e40 c02d MOVFF 0x2d,0xfdb 002e42 ffdb 0032a2 5e2e SUBWF 0x2e,0x1,0x0 0032a4 0e00 MOVLW 0x0 0032a6 5a2f SUBWFB 0x2f,0x1,0x0 0032a8 0ef7 MOVLW 0xf7 0032aa c02e MOVFF 0x2e,0xfdb 0032ac ffdb 0032ae 0ef8 MOVLW 0xf8 0032b0 c02f MOVFF 0x2f,0xfdb 0032b2 ffdb 0032b4 c02e MOVFF 0x2e,0xfe9 0032b6 ffe9 0032b8 c02f MOVFF 0x2f,0xfea 0032ba ffea 0032bc 0012 RETURN 0x0 003316 0ef7 MOVLW 0xf7 003318 cfdb MOVFF 0xfdb,0x2e 00331a f02e 00331c 0ef8 MOVLW 0xf8 00331e cfdb MOVFF 0xfdb,0x2f 003320 f02f 003322 0012 RETURN 0x0 0033fc 0e0a MOVLW 0xa 0033fe c02a MOVFF 0x2a,0xfdb 003400 ffdb 003402 0e0b MOVLW 0xb 003404 c02b MOVFF 0x2b,0xfdb 003406 ffdb 003408 0012 RETURN 0x0 00341c cfee MOVFF 0xfee,0x2a 00341e f02a 003420 cfef MOVFF 0xfef,0x2b 003422 f02b 003424 0012 RETURN 0x0 002e44 d01a BRA 0x2e7a else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e46 0ef7 MOVLW 0xf7 larg = va_arg (ap, unsigned int); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e48 cfdb MOVFF 0xfdb,0x2c 002e4a f02c 002e4c 0ef8 MOVLW 0xf8 002e4e cfdb MOVFF 0xfdb,0x2d 002e50 f02d 002e52 0e02 MOVLW 0x2 002e54 5e2c SUBWF 0x2c,0x1,0x0 002e56 0e00 MOVLW 0x0 002e58 5a2d SUBWFB 0x2d,0x1,0x0 002e5a 0ef7 MOVLW 0xf7 002e5c c02c MOVFF 0x2c,0xfdb 002e5e ffdb 002e60 0ef8 MOVLW 0xf8 002e62 c02d MOVFF 0x2d,0xfdb 002e64 ffdb 002e66 c02c MOVFF 0x2c,0xfe9 002e68 ffe9 002e6a c02d MOVFF 0x2d,0xfea 002e6c ffea 002e6e dad6 RCALL 0x341c 002e70 dac5 RCALL 0x33fc 002e72 0e0c MOVLW 0xc 002e74 6adb CLRF 0xdb,0x0 002e76 0e0d MOVLW 0xd 002e78 6adb CLRF 0xdb,0x0 _do_integer_conversion: C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* default precision is 1 */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e7a 0e06 MOVLW 0x6 if (!have_precision) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e7c 50db MOVF 0xdb,0x0,0x0 002e7e e105 BNZ 0x2e8a 002e80 0e01 MOVLW 0x1 precision = 1; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e82 6ef3 MOVWF 0xf3,0x0 002e84 0e05 MOVLW 0x5 002e86 cff3 MOVFF 0xff3,0xfdb 002e88 ffdb C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e8a 0e15 MOVLW 0x15 unsigned char digit_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e8c 6adb CLRF 0xdb,0x0 002e8e 0e16 MOVLW 0x16 unsigned char prefix_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e90 6adb CLRF 0xdb,0x0 unsigned char sign_char; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* A 32 bit number will require at most 32 digits in the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c string representation (binary format). */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c char buf[33]; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* Start storing digits least-significant first */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e92 50d9 MOVF 0xd9,0x0,0x0 char *q = &buf[31]; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002e94 0f37 ADDLW 0x37 002e96 6e2a MOVWF 0x2a,0x0 002e98 0e00 MOVLW 0x0 002e9a 20da ADDWFC 0xda,0x0,0x0 002e9c 6e2b MOVWF 0x2b,0x0 002e9e 0e39 MOVLW 0x39 002ea0 c02a MOVFF 0x2a,0xfdb 002ea2 ffdb 002ea4 0e3a MOVLW 0x3a 002ea6 c02b MOVFF 0x2b,0xfdb 002ea8 ffdb /* null terminate the string */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eaa 0e38 MOVLW 0x38 buf[32] = '\0'; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eac 6adb CLRF 0xdb,0x0 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eae 0e08 MOVLW 0x8 space_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eb0 6adb CLRF 0xdb,0x0 002eb2 0e0a MOVLW 0xa size = 10; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eb4 daae RCALL 0x3412 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eb6 50df MOVF 0xdf,0x0,0x0 switch (c) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eb8 0a78 XORLW 0x78 002eba e012 BZ 0x2ee0 002ebc 0a20 XORLW 0x20 002ebe e010 BZ 0x2ee0 002ec0 0a28 XORLW 0x28 002ec2 e00c BZ 0x2edc 002ec4 0a20 XORLW 0x20 002ec6 e00a BZ 0x2edc 002ec8 0a3f XORLW 0x3f 002eca e006 BZ 0x2ed8 002ecc 0a0d XORLW 0xd 002ece e002 BZ 0x2ed4 002ed0 0a20 XORLW 0x20 002ed2 e108 BNZ 0x2ee4 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'b': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'B': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ed4 0e02 MOVLW 0x2 size = 2; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ed6 d005 BRA 0x2ee2 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'o': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ed8 0e08 MOVLW 0x8 size = 8; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eda d003 BRA 0x2ee2 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'p': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'P': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* from here on out, treat 'p' conversions just C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c like 'x' conversions. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002edc 0e08 MOVLW 0x8 c += 'x' - 'p'; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ede 26df ADDWF 0xdf,0x1,0x0 /* fall through */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'x': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'X': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ee0 0e10 MOVLW 0x10 size = 16; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ee2 da97 RCALL 0x3412 003412 6ef3 MOVWF 0xf3,0x0 003414 0e07 MOVLW 0x7 003416 cff3 MOVFF 0xff3,0xfdb 003418 ffdb 00341a 0012 RETURN 0x0 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* if it's an unsigned conversion, we should ignore the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c ' ' and '+' flags */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ee4 0e03 MOVLW 0x3 if (!(flags & _FLAG_SIGNED)) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ee6 bedb BTFSC 0xdb,0x7,0x0 002ee8 d002 BRA 0x2eee 002eea 92db BCF 0xdb,0x1,0x0 flags &= ~(_FLAG_PLUS | _FLAG_SPACE); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eec 94db BCF 0xdb,0x2,0x0 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* if it's a negative value, we need to negate the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c unsigned version before we convert to text. Using C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c unsigned for this allows us to (ab)use the 2's C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c complement system to avoid overflow and be able to C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c adequately handle LONG_MIN. C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c We'll figure out what sign character to print, if C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c any, here as well. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002eee 50db MOVF 0xdb,0x0,0x0 if (flags & _FLAG_SIGNED && ((long) larg < 0)) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002ef0 0b80 ANDLW 0x80 002ef2 e024 BZ 0x2f3c 002ef4 da8a RCALL 0x340a 002ef6 90d8 BCF 0xd8,0x0,0x0 002ef8 0e03 MOVLW 0x3 002efa 50eb MOVF 0xeb,0x0,0x0 002efc 0a00 XORLW 0x0 002efe e608 BN 0x2f10 002f00 0e00 MOVLW 0x0 002f02 5cee SUBWF 0xee,0x0,0x0 002f04 0e00 MOVLW 0x0 002f06 58ee SUBWFB 0xee,0x0,0x0 002f08 0e00 MOVLW 0x0 002f0a 58ee SUBWFB 0xee,0x0,0x0 002f0c 0e00 MOVLW 0x0 002f0e 58ee SUBWFB 0xee,0x0,0x0 002f10 e215 BC 0x2f3c 00340a 50d9 MOVF 0xd9,0x0,0x0 00340c 0f0a ADDLW 0xa 00340e ef99 GOTO 0x3532 003410 f01a 003532 6ee9 MOVWF 0xe9,0x0 003534 0e00 MOVLW 0x0 003536 20da ADDWFC 0xda,0x0,0x0 003538 6eea MOVWF 0xea,0x0 00353a 0012 RETURN 0x0 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f12 da13 RCALL 0x333a larg = -(long) larg; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f14 6821 SETF 0x21,0x0 002f16 6822 SETF 0x22,0x0 002f18 6823 SETF 0x23,0x0 002f1a 6824 SETF 0x24,0x0 002f1c ecdb CALL 0x45b6,0x0 002f1e f022 002f20 0e0a MOVLW 0xa 002f22 c018 MOVFF 0x18,0xfdb 002f24 ffdb 002f26 0e0b MOVLW 0xb 002f28 c019 MOVFF 0x19,0xfdb 002f2a ffdb 002f2c 0e0c MOVLW 0xc 002f2e c01a MOVFF 0x1a,0xfdb 002f30 ffdb 002f32 0e0d MOVLW 0xd 002f34 c01b MOVFF 0x1b,0xfdb 002f36 ffdb 00333a 0e0a MOVLW 0xa 00333c cfdb MOVFF 0xfdb,0x1c 00333e f01c 003340 0e0b MOVLW 0xb 003342 cfdb MOVFF 0xfdb,0x1d 003344 f01d 003346 0e0c MOVLW 0xc 003348 cfdb MOVFF 0xfdb,0x1e 00334a f01e 00334c 0e0d MOVLW 0xd 00334e cfdb MOVFF 0xfdb,0x1f 003350 f01f 003352 0012 RETURN 0x0 002f38 0e2d MOVLW 0x2d sign_char = '-'; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c ++digit_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f3a d008 BRA 0x2f4c else if (flags & _FLAG_PLUS) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f3c 0e03 MOVLW 0x3 002f3e a2db BTFSS 0xdb,0x1,0x0 002f40 d002 BRA 0x2f46 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f42 0e2b MOVLW 0x2b sign_char = '+'; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c ++digit_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f44 d003 BRA 0x2f4c else if (flags & _FLAG_SPACE) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f46 a4db BTFSS 0xdb,0x2,0x0 002f48 d008 BRA 0x2f5a { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f4a 0e20 MOVLW 0x20 sign_char = ' '; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f4c 6ef3 MOVWF 0xf3,0x0 002f4e 0e17 MOVLW 0x17 002f50 cff3 MOVFF 0xff3,0xfdb 002f52 ffdb 002f54 0e15 MOVLW 0x15 ++digit_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f56 2adb INCF 0xdb,0x1,0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f58 d002 BRA 0x2f5e else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f5a 0e17 MOVLW 0x17 sign_char = '\0'; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f5c 6adb CLRF 0xdb,0x0 /* get the digits for the actual number. If the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c precision is zero and the value is zero, the result C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c is no characters. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f5e 0e05 MOVLW 0x5 if (precision || larg) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f60 50db MOVF 0xdb,0x0,0x0 002f62 e103 BNZ 0x2f6a 002f64 d9b7 RCALL 0x32d4 002f66 e101 BNZ 0x2f6a 002f68 d089 BRA 0x307c 0032d4 0e0a MOVLW 0xa 0032d6 cfdb MOVFF 0xfdb,0x2a 0032d8 f02a 0032da 0e0b MOVLW 0xb 0032dc cfdb MOVFF 0xfdb,0x2b 0032de f02b 0032e0 0e0c MOVLW 0xc 0032e2 cfdb MOVFF 0xfdb,0x2c 0032e4 f02c 0032e6 0e0d MOVLW 0xd 0032e8 cfdb MOVFF 0xfdb,0x2d 0032ea f02d 0032ec 502a MOVF 0x2a,0x0,0x0 0032ee 102b IORWF 0x2b,0x0,0x0 0032f0 102c IORWF 0x2c,0x0,0x0 0032f2 102d IORWF 0x2d,0x0,0x0 0032f4 0012 RETURN 0x0 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c do C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f6a 0ec4 MOVLW 0xc4 cval = s_digits[larg % size]; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002f6c 6e2a MOVWF 0x2a,0x0 002f6e 0e47 MOVLW 0x47 002f70 6e2b MOVWF 0x2b,0x0 002f72 0e00 MOVLW 0x0 002f74 6e2c MOVWF 0x2c,0x0 002f76 0e07 MOVLW 0x7 002f78 cfdb MOVFF 0xfdb,0x2d 002f7a f02d 002f7c 6a2e CLRF 0x2e,0x0 002f7e 6a2f CLRF 0x2f,0x0 002f80 6a30 CLRF 0x30,0x0 002f82 c02d MOVFF 0x2d,0x21 002f84 f021 002f86 c02e MOVFF 0x2e,0x22 002f88 f022 002f8a c02f MOVFF 0x2f,0x23 002f8c f023 002f8e c030 MOVFF 0x30,0x24 002f90 f024 002f92 d9d3 RCALL 0x333a 002f94 ec6c CALL 0x46d8,0x0 002f96 f023 002f98 502a MOVF 0x2a,0x0,0x0 002f9a 2418 ADDWF 0x18,0x0,0x0 002f9c 6ef3 MOVWF 0xf3,0x0 002f9e 502b MOVF 0x2b,0x0,0x0 002fa0 2019 ADDWFC 0x19,0x0,0x0 002fa2 6ef4 MOVWF 0xf4,0x0 002fa4 502c MOVF 0x2c,0x0,0x0 002fa6 201a ADDWFC 0x1a,0x0,0x0 002fa8 6ef8 MOVWF 0xf8,0x0 002faa cff4 MOVFF 0xff4,0xff7 002fac fff7 002fae cff3 MOVFF 0xff3,0xff6 002fb0 fff6 002fb2 0008 TBLRD 002fb4 0e09 MOVLW 0x9 002fb6 cff5 MOVFF 0xff5,0xfdb 002fb8 ffdb 002fba 0e58 MOVLW 0x58 if (c == 'X' && cval >= 'a') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002fbc 5cdf SUBWF 0xdf,0x0,0x0 002fbe e10f BNZ 0x2fde 002fc0 0e61 MOVLW 0x61 002fc2 6ef3 MOVWF 0xf3,0x0 002fc4 0e09 MOVLW 0x9 002fc6 d97b RCALL 0x32be 002fc8 e30a BNC 0x2fde 0032be cfdb MOVFF 0xfdb,0xff4 0032c0 fff4 0032c2 50f3 MOVF 0xf3,0x0,0x0 0032c4 5cf4 SUBWF 0xf4,0x0,0x0 0032c6 0012 RETURN 0x0 002fca 0e20 MOVLW 0x20 cval -= 'a' - 'A'; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002fcc 6e2a MOVWF 0x2a,0x0 002fce 0e09 MOVLW 0x9 002fd0 cfdb MOVFF 0xfdb,0xfe7 002fd2 ffe7 002fd4 502a MOVF 0x2a,0x0,0x0 002fd6 5ee7 SUBWF 0xe7,0x1,0x0 002fd8 0e09 MOVLW 0x9 002fda cfe7 MOVFF 0xfe7,0xfdb 002fdc ffdb 002fde 0e07 MOVLW 0x7 larg /= size; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 002fe0 cfdb MOVFF 0xfdb,0x2a 002fe2 f02a 002fe4 6a2b CLRF 0x2b,0x0 002fe6 6a2c CLRF 0x2c,0x0 002fe8 6a2d CLRF 0x2d,0x0 002fea da0f RCALL 0x340a 002fec c02a MOVFF 0x2a,0x21 002fee f021 002ff0 c02b MOVFF 0x2b,0x22 002ff2 f022 002ff4 c02c MOVFF 0x2c,0x23 002ff6 f023 002ff8 c02d MOVFF 0x2d,0x24 002ffa f024 002ffc cfee MOVFF 0xfee,0x1c 002ffe f01c 003000 cfee MOVFF 0xfee,0x1d 003002 f01d 003004 cfee MOVFF 0xfee,0x1e 003006 f01e 003008 cfef MOVFF 0xfef,0x1f 00300a f01f 00300c ec6c CALL 0x46d8,0x0 00300e f023 003010 c01f MOVFF 0x1f,0xfed 003012 ffed 003014 c01e MOVFF 0x1e,0xfed 003016 ffed 003018 c01d MOVFF 0x1d,0xfed 00301a ffed 00301c c01c MOVFF 0x1c,0xfef 00301e ffef 003020 0e39 MOVLW 0x39 *q-- = cval; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003022 cfdb MOVFF 0xfdb,0xfe9 003024 ffe9 003026 06db DECF 0xdb,0x1,0x0 003028 0e3a MOVLW 0x3a 00302a cfdb MOVFF 0xfdb,0xfea 00302c ffea 00302e e201 BC 0x3032 003030 06db DECF 0xdb,0x1,0x0 003032 0e09 MOVLW 0x9 003034 cfdb MOVFF 0xfdb,0xfef 003036 ffef 003038 0e15 MOVLW 0x15 ++digit_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00303a 2adb INCF 0xdb,0x1,0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00303c d94b RCALL 0x32d4 while (larg); C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00303e e195 BNZ 0x2f6a /* if the '#' flag was specified and we're dealing C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c with an 'o', 'b', 'B', 'x', or 'X' conversion, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c we need a bit more. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003040 0e03 MOVLW 0x3 if (flags & _FLAG_OCTO) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003042 a6db BTFSS 0xdb,0x3,0x0 003044 d01d BRA 0x3080 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003046 0e6f MOVLW 0x6f if (c == 'o') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003048 5cdf SUBWF 0xdf,0x0,0x0 00304a e106 BNZ 0x3058 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* per the standard, for octal, the '#' flag C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c makes the precision be at least one more C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c than the number of digits in the number */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00304c d9c1 RCALL 0x33d0 if (precision <= digit_cnt) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00304e e318 BNC 0x3080 0033d0 0e05 MOVLW 0x5 0033d2 cfdb MOVFF 0xfdb,0x2a 0033d4 f02a 0033d6 0e15 MOVLW 0x15 0033d8 50db MOVF 0xdb,0x0,0x0 0033da 80d8 BSF 0xd8,0x0,0x0 0033dc 542a SUBFWB 0x2a,0x0,0x0 0033de 0012 RETURN 0x0 003050 0e15 MOVLW 0x15 precision = digit_cnt + 1; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003052 28db INCF 0xdb,0x0,0x0 003054 da5b RCALL 0x350c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003056 d014 BRA 0x3080 else if (c == 'x' C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003058 0e78 MOVLW 0x78 00305a 5cdf SUBWF 0xdf,0x0,0x0 || c == 'X' || c == 'b' || c == 'B') C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00305c e009 BZ 0x3070 00305e 0e58 MOVLW 0x58 003060 5cdf SUBWF 0xdf,0x0,0x0 003062 e006 BZ 0x3070 003064 0e62 MOVLW 0x62 003066 5cdf SUBWF 0xdf,0x0,0x0 003068 e003 BZ 0x3070 00306a 0e42 MOVLW 0x42 00306c 5cdf SUBWF 0xdf,0x0,0x0 00306e e108 BNZ 0x3080 003070 0e02 MOVLW 0x2 prefix_cnt = 2; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003072 6ef3 MOVWF 0xf3,0x0 003074 0e16 MOVLW 0x16 003076 cff3 MOVFF 0xff3,0xfdb 003078 ffdb } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00307a d002 BRA 0x3080 else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00307c 0e15 MOVLW 0x15 digit_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00307e 6adb CLRF 0xdb,0x0 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* The leading zero count depends on whether the '0' C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c flag was specified or not. If it was not, then the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c count is the difference between the specified C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c precision and the number of digits (including the C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c sign character, if any) to be printed; otherwise, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c it's as if the precision were equal to the max of C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c the specified precision and the field width. If a C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c precision was specified, the '0' flag is ignored, C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c however. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003080 0e03 MOVLW 0x3 if ((flags & _FLAG_ZERO) && (width > precision) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003082 50db MOVF 0xdb,0x0,0x0 003084 0b10 ANDLW 0x10 003088 0e04 MOVLW 0x4 00308a cfdb MOVFF 0xfdb,0x2a 00308c f02a 00308e 0e05 MOVLW 0x5 003090 50db MOVF 0xdb,0x0,0x0 003092 80d8 BSF 0xd8,0x0,0x0 003094 542a SUBFWB 0x2a,0x0,0x0 003086 e00e BZ 0x30a4 && !have_precision) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003096 e206 BC 0x30a4 003098 0e06 MOVLW 0x6 00309a 50db MOVF 0xdb,0x0,0x0 00309c e103 BNZ 0x30a4 00309e 0e04 MOVLW 0x4 precision = width; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030a0 50db MOVF 0xdb,0x0,0x0 0030a2 da34 RCALL 0x350c /* for the rest of the processing, precision contains C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c the leading zero count for the conversion. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030a4 d995 RCALL 0x33d0 if (precision > digit_cnt) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030a6 e20a BC 0x30bc 0030a8 0e05 MOVLW 0x5 precision -= digit_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030aa cfdb MOVFF 0xfdb,0xfe7 0030ac ffe7 0030ae 0e15 MOVLW 0x15 0030b0 50db MOVF 0xdb,0x0,0x0 0030b2 5ee7 SUBWF 0xe7,0x1,0x0 0030b4 0e05 MOVLW 0x5 0030b6 cfe7 MOVFF 0xfe7,0xfdb 0030b8 ffdb 0030ba d002 BRA 0x30c0 else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030bc 0e05 MOVLW 0x5 precision = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030be 6adb CLRF 0xdb,0x0 /* the space count is the difference between the field C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c width and the digit count plus the leading zero C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c count. If the width is less than the digit count C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c plus the leading zero count, the space count is C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c zero. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030c0 0e04 MOVLW 0x4 if (width > precision + digit_cnt + prefix_cnt) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030c2 cfdb MOVFF 0xfdb,0x2a 0030c4 f02a 0030c6 0e16 MOVLW 0x16 0030c8 d945 RCALL 0x3354 0030ca 80d8 BSF 0xd8,0x0,0x0 0030cc 542a SUBFWB 0x2a,0x0,0x0 0030ce e214 BC 0x30f8 003354 cfdb MOVFF 0xfdb,0xfe6 003356 ffe6 003358 0e15 MOVLW 0x15 00335a cfdb MOVFF 0xfdb,0xfe6 00335c ffe6 00335e 0e05 MOVLW 0x5 003360 50db MOVF 0xdb,0x0,0x0 003362 52e5 MOVF 0xe5,0x1,0x0 003364 24e7 ADDWF 0xe7,0x0,0x0 003366 52e5 MOVF 0xe5,0x1,0x0 003368 24e7 ADDWF 0xe7,0x0,0x0 00336a 0012 RETURN 0x0 space_cnt = C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030d0 0e16 MOVLW 0x16 width - precision - digit_cnt - prefix_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030d2 cfdb MOVFF 0xfdb,0xfe6 0030d4 ffe6 0030d6 0e15 MOVLW 0x15 0030d8 cfdb MOVFF 0xfdb,0xfe6 0030da ffe6 0030dc 0e04 MOVLW 0x4 0030de cfdb MOVFF 0xfdb,0xfe6 0030e0 ffe6 0030e2 0e05 MOVLW 0x5 0030e4 50db MOVF 0xdb,0x0,0x0 0030e6 52e5 MOVF 0xe5,0x1,0x0 0030e8 5ce7 SUBWF 0xe7,0x0,0x0 0030ea 52e5 MOVF 0xe5,0x1,0x0 0030ec 80d8 BSF 0xd8,0x0,0x0 0030ee 54e7 SUBFWB 0xe7,0x0,0x0 0030f0 52e5 MOVF 0xe5,0x1,0x0 0030f2 80d8 BSF 0xd8,0x0,0x0 0030f4 54e7 SUBFWB 0xe7,0x0,0x0 0030f6 d95f RCALL 0x33b6 C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* for output, we check the justification, if it's C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c right justified and the space count is positive, we C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c emit the space characters first. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030f8 0e03 MOVLW 0x3 if (!(flags & _FLAG_MINUS) && space_cnt) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0030fa 50db MOVF 0xdb,0x0,0x0 0030fc 0b01 ANDLW 0x1 0030fe e10b BNZ 0x3116 003100 0e08 MOVLW 0x8 003102 50db MOVF 0xdb,0x0,0x0 003104 e008 BZ 0x3116 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003106 d8b2 RCALL 0x326c if (s_put_n_chars (handle, space_cnt, ' ')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003108 e001 BZ 0x310c 00310a d08d BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00310c 0e08 MOVLW 0x8 count += space_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00310e 50db MOVF 0xdb,0x0,0x0 003110 d8be RCALL 0x328e 003112 0e08 MOVLW 0x8 space_cnt = 0; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003114 6adb CLRF 0xdb,0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* if we have a sign character to print, that comes C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c next */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003116 0e17 MOVLW 0x17 if (sign_char) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003118 50db MOVF 0xdb,0x0,0x0 00311a e007 BZ 0x312a 00311c d988 RCALL 0x342e if (putc (sign_char, handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00311e 0e17 MOVLW 0x17 003120 d9f1 RCALL 0x3504 003122 e103 BNZ 0x312a 003124 1c2b COMF 0x2b,0x0,0x0 003126 e101 BNZ 0x312a 003128 d07e BRA 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* if we have a prefix (0b, 0B, 0x or 0X), that's next */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00312a 0e16 MOVLW 0x16 if (prefix_cnt) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00312c 50db MOVF 0xdb,0x0,0x0 00312e e016 BZ 0x315c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003130 d97e RCALL 0x342e if (putc ('0', handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003132 0e30 MOVLW 0x30 003134 6ee6 MOVWF 0xe6,0x0 003136 d89f RCALL 0x3276 003138 e102 BNZ 0x313e 00313a 1c2b COMF 0x2b,0x0,0x0 00313c e074 BZ 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00313e d977 RCALL 0x342e if (putc (c, handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003140 cfdf MOVFF 0xfdf,0xfe6 003142 ffe6 003144 ec99 CALL 0x4532,0x0 003146 f022 003148 52e5 MOVF 0xe5,0x1,0x0 00314a 52e5 MOVF 0xe5,0x1,0x0 00314c 52e5 MOVF 0xe5,0x1,0x0 00314e cff4 MOVFF 0xff4,0x2b 003150 f02b 003152 0100 MOVLB 0x0 003154 1cf3 COMF 0xf3,0x0,0x0 003156 e102 BNZ 0x315c 003158 1c2b COMF 0x2b,0x0,0x0 00315a e065 BZ 0x3226 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* if we have leading zeros, they follow. the prefix, if any C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c is included in the number of digits when determining how C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c many leading zeroes are needed. */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00315c 0e05 MOVLW 0x5 if (precision > prefix_cnt) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00315e cfdb MOVFF 0xfdb,0x2a 003160 f02a 003162 0e16 MOVLW 0x16 003164 50db MOVF 0xdb,0x0,0x0 003166 80d8 BSF 0xd8,0x0,0x0 003168 542a SUBFWB 0x2a,0x0,0x0 00316a e209 BC 0x317e 00316c 0e05 MOVLW 0x5 precision -= prefix_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00316e cfdb MOVFF 0xfdb,0xfe7 003170 ffe7 003172 0e16 MOVLW 0x16 003174 50db MOVF 0xdb,0x0,0x0 003176 5ee7 SUBWF 0xe7,0x1,0x0 003178 0e05 MOVLW 0x5 00317a cfe7 MOVFF 0xfe7,0xfdb 00317c ffdb 00317e 0e30 MOVLW 0x30 if (s_put_n_chars (handle, precision, '0')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003180 6ee6 MOVWF 0xe6,0x0 003182 0e05 MOVLW 0x5 003184 d9cb RCALL 0x351c 003186 e14f BNZ 0x3226 0034ce ec8d CALL 0x291a,0x0 0034d0 f014 0034d2 52e5 MOVF 0xe5,0x1,0x0 0034d4 52e5 MOVF 0xe5,0x1,0x0 0034d6 52e5 MOVF 0xe5,0x1,0x0 0034d8 52e5 MOVF 0xe5,0x1,0x0 0034da 0900 IORLW 0x0 0034dc 0012 RETURN 0x0 00351c cfdb MOVFF 0xfdb,0xfe6 00351e ffe6 003520 df86 RCALL 0x342e 003522 ef67 GOTO 0x34ce 003524 f01a return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* print the actual number */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003188 0e39 MOVLW 0x39 for (cval = *++q; cval; cval = *++q) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00318a 2adb INCF 0xdb,0x1,0x0 00318c cfdb MOVFF 0xfdb,0xfe9 00318e ffe9 003190 0e3a MOVLW 0x3a 003192 e301 BNC 0x3196 003194 2adb INCF 0xdb,0x1,0x0 003196 cfdb MOVFF 0xfdb,0xfea 003198 ffea 00319a 0e09 MOVLW 0x9 00319c cfef MOVFF 0xfef,0xfdb 00319e ffdb 0031a0 50db MOVF 0xdb,0x0,0x0 0031a2 e00e BZ 0x31c0 0031b0 0e39 MOVLW 0x39 0031b2 2adb INCF 0xdb,0x1,0x0 0031b4 cfdb MOVFF 0xfdb,0xfe9 0031b6 ffe9 0031b8 0e3a MOVLW 0x3a 0031ba e3ed BNC 0x3196 0031bc 2adb INCF 0xdb,0x1,0x0 0031be d7eb BRA 0x3196 0031a4 d944 RCALL 0x342e if (putc (cval, handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031a6 0e09 MOVLW 0x9 0031a8 d9ad RCALL 0x3504 0031aa e102 BNZ 0x31b0 0031ac 1c2b COMF 0x2b,0x0,0x0 0031ae e03b BZ 0x3226 003504 cfdb MOVFF 0xfdb,0xfe6 003506 ffe6 003508 ef3b GOTO 0x3276 00350a f019 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* if there are any spaces left, they go to right-pad C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c the field */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031c0 d855 RCALL 0x326c if (s_put_n_chars (handle, space_cnt, ' ')) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031c2 e131 BNZ 0x3226 00326c 0e20 MOVLW 0x20 00326e 6ee6 MOVWF 0xe6,0x0 003270 0e08 MOVLW 0x8 003272 ef8e GOTO 0x351c 003274 f01a 00342e 0efc MOVLW 0xfc 003430 cfdb MOVFF 0xfdb,0xfe6 003432 ffe6 003434 0efd MOVLW 0xfd 003436 cfdb MOVFF 0xfdb,0xfe6 003438 ffe6 00343a 0012 RETURN 0x0 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031c4 0e16 MOVLW 0x16 count += precision + digit_cnt + space_cnt + prefix_cnt; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031c6 cfdb MOVFF 0xfdb,0xfe6 0031c8 ffe6 0031ca 0e08 MOVLW 0x8 0031cc d8c3 RCALL 0x3354 0031ce 52e5 MOVF 0xe5,0x1,0x0 0031d0 24e7 ADDWF 0xe7,0x0,0x0 0031d2 d85d RCALL 0x328e 00328e 6e2a MOVWF 0x2a,0x0 003290 6a2b CLRF 0x2b,0x0 003292 50d9 MOVF 0xd9,0x0,0x0 003294 0f01 ADDLW 0x1 003296 d94d RCALL 0x3532 003298 502a MOVF 0x2a,0x0,0x0 00329a 26ee ADDWF 0xee,0x1,0x0 00329c 502b MOVF 0x2b,0x0,0x0 00329e 22ed ADDWFC 0xed,0x1,0x0 0032a0 0012 RETURN 0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031d4 d02e BRA 0x3232 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case 'n': C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031d6 0e07 MOVLW 0x7 switch (size) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031d8 50db MOVF 0xdb,0x0,0x0 0031da 0a03 XORLW 0x3 0031dc e01c BZ 0x3216 0031de 0a01 XORLW 0x1 0031e0 e014 BZ 0x320a 0031e2 0a03 XORLW 0x3 0031e4 e007 BZ 0x31f4 { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case _FMT_LONG: C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031f4 d8f5 RCALL 0x33e0 *(long *) va_arg (ap, long *) = count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031f6 6a2f CLRF 0x2f,0x0 0031f8 ae2d BTFSS 0x2d,0x7,0x0 0031fa d002 BRA 0x3200 0031fc 682e SETF 0x2e,0x0 0031fe 682f SETF 0x2f,0x0 003200 d82c RCALL 0x325a 003202 d8bc RCALL 0x337c 003204 c02f MOVFF 0x2f,0xfee 003206 ffee 00337c 50ee MOVF 0xee,0x0,0x0 00337e cfef MOVFF 0xfef,0xfea 003380 ffea 003382 6ee9 MOVWF 0xe9,0x0 003384 c02c MOVFF 0x2c,0xfee 003386 ffee 003388 c02d MOVFF 0x2d,0xfee 00338a ffee 00338c c02e MOVFF 0x2e,0xfee 00338e ffee 003390 0012 RETURN 0x0 0033e0 0e01 MOVLW 0x1 0033e2 cfdb MOVFF 0xfdb,0x2c 0033e4 f02c 0033e6 0e02 MOVLW 0x2 0033e8 cfdb MOVFF 0xfdb,0x2d 0033ea f02d 0033ec 6a2e CLRF 0x2e,0x0 0033ee 0012 RETURN 0x0 003208 d014 BRA 0x3232 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case _FMT_SHLONG: C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00320a d8ea RCALL 0x33e0 *(short long *) va_arg (ap, short long *) = count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00320c be2d BTFSC 0x2d,0x7,0x0 00320e 682e SETF 0x2e,0x0 003210 d824 RCALL 0x325a 003212 d8b4 RCALL 0x337c 003214 d00e BRA 0x3232 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c case _FMT_BYTE: C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003216 d963 RCALL 0x34de *(signed char *) va_arg (ap, signed char *) = count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003218 cfdb MOVFF 0xfdb,0xfef 00321a ffef 00321c d00a BRA 0x3232 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c default: C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031e6 d97b RCALL 0x34de *(int *) va_arg (ap, int *) = count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031e8 cfdb MOVFF 0xfdb,0xfee 0031ea ffee 0031ec 0e02 MOVLW 0x2 0031ee cfdb MOVFF 0xfdb,0xfed 0031f0 ffed 0034de debd RCALL 0x325a 0034e0 50ee MOVF 0xee,0x0,0x0 0034e2 cfef MOVFF 0xfef,0xfea 0034e4 ffea 0034e6 6ee9 MOVWF 0xe9,0x0 0034e8 0e01 MOVLW 0x1 0034ea 0012 RETURN 0x0 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 0031f2 d01f BRA 0x3232 break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c default: C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c /* undefined behaviour. we do nothing */ C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c break; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c else C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c { C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00321e d97b RCALL 0x3516 if (putc (c, handle) == EOF) C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003220 e105 BNZ 0x322c 003222 1c2b COMF 0x2b,0x0,0x0 003224 e103 BNZ 0x322c 003276 ec99 CALL 0x4532,0x0 003278 f022 00327a 52e5 MOVF 0xe5,0x1,0x0 00327c 52e5 MOVF 0xe5,0x1,0x0 00327e 52e5 MOVF 0xe5,0x1,0x0 003280 cff3 MOVFF 0xff3,0x2a 003282 f02a 003284 cff4 MOVFF 0xff4,0x2b 003286 f02b 003288 0100 MOVLB 0x0 00328a 1cf3 COMF 0xf3,0x0,0x0 00328c 0012 RETURN 0x0 0034bc cfdf MOVFF 0xfdf,0xfe6 0034be ffe6 0034c0 ef3b GOTO 0x3276 0034c2 f019 003516 df8b RCALL 0x342e 003518 ef5e GOTO 0x34bc 00351a f01a 003226 68f3 SETF 0xf3,0x0 return EOF; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003228 68f4 SETF 0xf4,0x0 00322a d010 BRA 0x324c 00322c d8fc RCALL 0x3426 ++count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00322e e301 BNC 0x3232 003230 2adb INCF 0xdb,0x1,0x0 003426 0e01 MOVLW 0x1 003428 2adb INCF 0xdb,0x1,0x0 00342a 0e02 MOVLW 0x2 00342c 0012 RETURN 0x0 } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 003238 0e01 MOVLW 0x1 return count; C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00323a cfdb MOVFF 0xfdb,0x2a 00323c f02a 00323e 0e02 MOVLW 0x2 003240 cfdb MOVFF 0xfdb,0x2b 003242 f02b 003244 c02a MOVFF 0x2a,0xff3 003246 fff3 003248 c02b MOVFF 0x2b,0xff4 00324a fff4 00324c 0e3b MOVLW 0x3b } C:\MCC18\src\TRADIT~1\stdclib\vfprintf.c 00324e 5ce1 SUBWF 0xe1,0x0,0x0 003250 e202 BC 0x3256 003252 6ae1 CLRF 0xe1,0x0 003254 52e5 MOVF 0xe5,0x1,0x0 003256 6ee1 MOVWF 0xe1,0x0 003258 d0cb BRA 0x33f0 /*** Unsigned Integer Division: 32-bit by 32-bit C:\MCC18\src\TRADIT~1\math\fxd3232u.c *** C:\MCC18\src\TRADIT~1\math\fxd3232u.c *** Optimized: Dec. 21, 2000 C:\MCC18\src\TRADIT~1\math\fxd3232u.c *** by: Daniel R. Madill, Quanser Consulting Inc. C:\MCC18\src\TRADIT~1\math\fxd3232u.c *** for: Saved (for the worst case) at least 8*32 = 256 instruction cycles C:\MCC18\src\TRADIT~1\math\fxd3232u.c *** over the code supplied with MCC18 v1.00.12 C:\MCC18\src\TRADIT~1\math\fxd3232u.c ***/ C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c void FXD3232U(void/* ulong aarg, ulong barg */) C:\MCC18\src\TRADIT~1\math\fxd3232u.c { C:\MCC18\src\TRADIT~1\math\fxd3232u.c // use INDF1 for the counter... C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c _asm C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c // REM = 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046d8 6a1b CLRF 0x1b,0x0 clrf __REMB0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046da 6a1a CLRF 0x1a,0x0 clrf __REMB1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046dc 6a19 CLRF 0x19,0x0 clrf __REMB2, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046de 6a18 CLRF 0x18,0x0 clrf __REMB3, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c // INDF1 = 32 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046e0 0e20 MOVLW 0x20 movlw 32 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046e2 6ee7 MOVWF 0xe7,0x0 movwf INDF1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c // Clear the carry C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046e4 90d8 BCF 0xd8,0x0,0x0 bcf STATUS, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c loop: C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c //AARG32 <<= 1; The carry is always clear at the top of the loop. C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046e6 361c RLCF 0x1c,0x1,0x0 rlcf __AARGB3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046e8 361d RLCF 0x1d,0x1,0x0 rlcf __AARGB2, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046ea 361e RLCF 0x1e,0x1,0x0 rlcf __AARGB1, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046ec 361f RLCF 0x1f,0x1,0x0 rlcf __AARGB0, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c //REM32 = (REM32 << 1) | (AARG32 >> 32) C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046ee 3618 RLCF 0x18,0x1,0x0 rlcf __REMB3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046f0 3619 RLCF 0x19,0x1,0x0 rlcf __REMB2, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046f2 361a RLCF 0x1a,0x1,0x0 rlcf __REMB1, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046f4 361b RLCF 0x1b,0x1,0x0 rlcf __REMB0, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c //if (PROD >= BARG32) C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046f6 5021 MOVF 0x21,0x0,0x0 movf __BARGB3, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046f8 5c18 SUBWF 0x18,0x0,0x0 subwf __REMB3, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046fa 5022 MOVF 0x22,0x0,0x0 movf __BARGB2, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046fc 5819 SUBWFB 0x19,0x0,0x0 subwfb __REMB2, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 0046fe 5023 MOVF 0x23,0x0,0x0 movf __BARGB1, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004700 581a SUBWFB 0x1a,0x0,0x0 subwfb __REMB1, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004702 5024 MOVF 0x24,0x0,0x0 movf __BARGB0, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004704 581b SUBWFB 0x1b,0x0,0x0 subwfb __REMB0, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004706 e309 BNC 0x471a bnc _false C:\MCC18\src\TRADIT~1\math\fxd3232u.c //{ C:\MCC18\src\TRADIT~1\math\fxd3232u.c //REM32-= BARG32; C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004708 5021 MOVF 0x21,0x0,0x0 movf __BARGB3, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 00470a 5e18 SUBWF 0x18,0x1,0x0 subwf __REMB3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 00470c 5022 MOVF 0x22,0x0,0x0 movf __BARGB2, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 00470e 5a19 SUBWFB 0x19,0x1,0x0 subwfb __REMB2, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004710 5023 MOVF 0x23,0x0,0x0 movf __BARGB1, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004712 5a1a SUBWFB 0x1a,0x1,0x0 subwfb __REMB1, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004714 5024 MOVF 0x24,0x0,0x0 movf __BARGB0, 0, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004716 5a1b SUBWFB 0x1b,0x1,0x0 subwfb __REMB0, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c //++AARG32; Since AARG32 was shift to the left above, we only need to set C:\MCC18\src\TRADIT~1\math\fxd3232u.c // the lowest bit. Use incf so that the carry flag will also be cleared. C:\MCC18\src\TRADIT~1\math\fxd3232u.c // Thus, the carry will always be clear at the top of the loop. C:\MCC18\src\TRADIT~1\math\fxd3232u.c 004718 2a1c INCF 0x1c,0x1,0x0 incf __AARGB3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxd3232u.c //} C:\MCC18\src\TRADIT~1\math\fxd3232u.c _false: C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c 00471a 2ee7 DECFSZ 0xe7,0x1,0x0 decfsz INDF1, 1, 0 // does not affect the carry bit C:\MCC18\src\TRADIT~1\math\fxd3232u.c 00471c d7e4 BRA 0x46e6 bra loop C:\MCC18\src\TRADIT~1\math\fxd3232u.c C:\MCC18\src\TRADIT~1\math\fxd3232u.c /* result in AARG already... */ C:\MCC18\src\TRADIT~1\math\fxd3232u.c _endasm C:\MCC18\src\TRADIT~1\math\fxd3232u.c 00471e 0012 RETURN 0x0 } C:\MCC18\src\TRADIT~1\math\fxd3232u.c ; RCS Header $Id: fxm1616s.asm,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; $Revision: 1.3 $ C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm include ; general Golden Gate definitions C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm LIST C:\MCC18\MPASM\P18CXXX.INC ; P18CXXX.INC Standard Header File, Microchip Technology, Inc. C:\MCC18\MPASM\P18CXXX.INC LIST C:\MCC18\MPASM\P18C452.INC ; P18C452.INC Standard Header File, Version 0.12 Microchip Technology, Inc. C:\MCC18\MPASM\P18C452.INC LIST C:\MCC18\MPASM\P18C452.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C601 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C658 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C801 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C858 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1230 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1330 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F248 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F258 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F26K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F448 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F46K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F97J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm include ; Math library definitions C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; RCS Header $Id: cmath18.inc,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC ; $Revision: 1.3 $ C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC LIST C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC ; CMATH18.INC v1.0 Microchip Technology, Inc. / F.J. Testa C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC LIST C:\MCC18\SRC\TRADIT~1\MATH\CMATH18.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm include ; AARG declarations C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; RCS Header $Id: aarg.inc,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC ; CMATH18 DATA DECLARATION FILE C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC EXTERN __AARGB0, __AARGB1, __AARGB2, __AARGB3 C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC EXTERN __AARGB4, __AARGB5, __AARGB6, __AARGB7 C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC EXTERN __AEXP C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC EXTERN __REMB3, __REMB2, __REMB1, __REMB0 C:\MCC18\SRC\TRADIT~1\MATH\AARG.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm include ; BARG declarations C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; RCS Header $Id: barg.inc,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC ; CMATH18 DATA DECLARATION FILE C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC EXTERN __BARGB3, __BARGB2, __BARGB1, __BARGB0 C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC EXTERN __BEXP C:\MCC18\SRC\TRADIT~1\MATH\BARG.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm include ; TEMPARG declarations C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; RCS Header $Id: temparg.inc,v 1.3 2006/01/12 23:16:38 rhinec Exp $ C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC ; CMATH18 DATA DECLARATION FILE C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC EXTERN __TEMPB3, __TEMPB2, __TEMPB1, __TEMPB0, __TEMP C:\MCC18\SRC\TRADIT~1\MATH\TEMPARG.INC C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ;********************************************************************************************** C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ;********************************************************************************************** C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; 16x16 Bit Signed Fixed Point Multiply 16 x 16 -> 32 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; Input: 16 bit signed fixed point multiplicand in AARGB0, AARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; 16 bit signed fixed point multiplier in BARGB0, BARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; Use: CALL FXM1616S C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; Output: 32 bit signed fixed point product in AARGB0, AARGB1, C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; AARGB2, AARGB3 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; Result: AARG <-- AARG * BARG C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; Max Timing: 39 clks C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; Min Timing: 31 clks C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm ; PM: 38 DM: 8 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm PROG CODE C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm FXM1616S C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm GLOBAL FXM1616S C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042d4 c01f MOVFF 0x1f,0x29 MOVFF __AARGB0,__TEMPB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042d6 f029 0042d8 c01e MOVFF 0x1e,0x28 MOVFF __AARGB1,__TEMPB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042da f028 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042dc 501e MOVF 0x1e,0x0,0x0 MOVF __AARGB1,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042de 0223 MULWF 0x23,0x0 MULWF __BARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042e0 cff4 MOVFF 0xff4,0x1d MOVFF PRODH,__AARGB2 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042e2 f01d 0042e4 cff3 MOVFF 0xff3,0x1c MOVFF PRODL,__AARGB3 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042e6 f01c C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042e8 501f MOVF 0x1f,0x0,0x0 MOVF __AARGB0,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042ea 0224 MULWF 0x24,0x0 MULWF __BARGB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042ec cff4 MOVFF 0xff4,0x1f MOVFF PRODH,__AARGB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042ee f01f 0042f0 cff3 MOVFF 0xff3,0x1e MOVFF PRODL,__AARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042f2 f01e C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042f4 0223 MULWF 0x23,0x0 MULWF __BARGB1 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042f6 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042f8 261d ADDWF 0x1d,0x1,0x0 ADDWF __AARGB2,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042fa 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042fc 221e ADDWFC 0x1e,0x1,0x0 ADDWFC __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 0042fe 6ae8 CLRF 0xe8,0x0 CLRF WREG C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004300 221f ADDWFC 0x1f,0x1,0x0 ADDWFC __AARGB0,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004302 5028 MOVF 0x28,0x0,0x0 MOVF __TEMPB1,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004304 0224 MULWF 0x24,0x0 MULWF __BARGB0 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004306 50f3 MOVF 0xf3,0x0,0x0 MOVF PRODL,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004308 261d ADDWF 0x1d,0x1,0x0 ADDWF __AARGB2,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 00430a 50f4 MOVF 0xf4,0x0,0x0 MOVF PRODH,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 00430c 221e ADDWFC 0x1e,0x1,0x0 ADDWFC __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 00430e 6ae8 CLRF 0xe8,0x0 CLRF WREG C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004310 221f ADDWFC 0x1f,0x1,0x0 ADDWFC __AARGB0,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004312 ae24 BTFSS 0x24,0x7,0x0 BTFSS __BARGB0,MSB C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004314 ef90 GOTO 0x4320 GOTO TSIGN1616A C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004316 f021 004318 5028 MOVF 0x28,0x0,0x0 MOVF __TEMPB1,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 00431a 5e1e SUBWF 0x1e,0x1,0x0 SUBWF __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 00431c 5029 MOVF 0x29,0x0,0x0 MOVF __TEMPB0,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 00431e 5a1f SUBWFB 0x1f,0x1,0x0 SUBWFB __AARGB0,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm TSIGN1616A C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004320 ae29 BTFSS 0x29,0x7,0x0 BTFSS __TEMPB0,MSB C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004322 0c00 RETLW 0x0 RETLW 0x00 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004324 5023 MOVF 0x23,0x0,0x0 MOVF __BARGB1,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004326 5e1e SUBWF 0x1e,0x1,0x0 SUBWF __AARGB1,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 004328 5024 MOVF 0x24,0x0,0x0 MOVF __BARGB0,W C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 00432a 5a1f SUBWFB 0x1f,0x1,0x0 SUBWFB __AARGB0,F C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm 00432c 0c00 RETLW 0x0 RETLW 0x00 C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm END C:\MCC18\SRC\TRADIT~1\MATH\fxm1616s.asm /* a signed multiply is only different from an unsigned multiply C:\MCC18\src\TRADIT~1\math\fxm3232.c * if the upper bytes of the result matter, which for us they C:\MCC18\src\TRADIT~1\math\fxm3232.c * don't. C:\MCC18\src\TRADIT~1\math\fxm3232.c */ C:\MCC18\src\TRADIT~1\math\fxm3232.c C:\MCC18\src\TRADIT~1\math\fxm3232.c #define PRODH (PRODL + 1) C:\MCC18\src\TRADIT~1\math\fxm3232.c C:\MCC18\src\TRADIT~1\math\fxm3232.c extern near unsigned char __AARGB3, __BARGB3; C:\MCC18\src\TRADIT~1\math\fxm3232.c extern near unsigned char __AARGB7; C:\MCC18\src\TRADIT~1\math\fxm3232.c void FXM3232 (void) C:\MCC18\src\TRADIT~1\math\fxm3232.c { C:\MCC18\src\TRADIT~1\math\fxm3232.c _asm C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045b6 501c MOVF 0x1c,0x0,0x0 movf __AARGB3, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045b8 0221 MULWF 0x21,0x0 mulwf __BARGB3, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // low byte of both operands, so result adds into the low order C:\MCC18\src\TRADIT~1\math\fxm3232.c // result bytes C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045ba cff3 MOVFF 0xff3,0x18 movff PRODL, __AARGB7 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045bc f018 0045be cff4 MOVFF 0xff4,0x19 movff PRODH, __AARGB7 + 1 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045c0 f019 // W still contains AARGB3 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045c2 0222 MULWF 0x22,0x0 mulwf __BARGB3 + 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // BARGB3[1], so result adds into AARGB7[1,2] C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045c4 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045c6 2619 ADDWF 0x19,0x1,0x0 addwf __AARGB7 + 1, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045c8 0e00 MOVLW 0x0 movlw 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045ca 20f4 ADDWFC 0xf4,0x0,0x0 addwfc PRODH, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045cc 6e1a MOVWF 0x1a,0x0 movwf __AARGB7 + 2, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // reload AARGB3 to continue C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045ce 501c MOVF 0x1c,0x0,0x0 movf __AARGB3, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045d0 0223 MULWF 0x23,0x0 mulwf __BARGB3 + 2, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // BARGB3[2], so result adds into AARGB7[2,3] C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045d2 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045d4 261a ADDWF 0x1a,0x1,0x0 addwf __AARGB7 + 2, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045d6 0e00 MOVLW 0x0 movlw 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045d8 20f4 ADDWFC 0xf4,0x0,0x0 addwfc PRODH, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045da 6e1b MOVWF 0x1b,0x0 movwf __AARGB7 + 3, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // reload AARGB3 to continue C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045dc 501c MOVF 0x1c,0x0,0x0 movf __AARGB3, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045de 0224 MULWF 0x24,0x0 mulwf __BARGB3 + 3, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // BARGB3[3], so result adds into AARGB7[3]. C:\MCC18\src\TRADIT~1\math\fxm3232.c // we don't care about result bytes above AARGB7[3], ignore prodh here. C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045e0 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045e2 261b ADDWF 0x1b,0x1,0x0 addwf __AARGB7 + 3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // that's the end of all terms involving AARGB3[0]. C:\MCC18\src\TRADIT~1\math\fxm3232.c // load AARGB3[1] to continue C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045e4 501d MOVF 0x1d,0x0,0x0 movf __AARGB3 + 1, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045e6 0221 MULWF 0x21,0x0 mulwf __BARGB3, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // AARGB3[1], so result adds into AARGB7[1,2] C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045e8 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045ea 2619 ADDWF 0x19,0x1,0x0 addwf __AARGB7 + 1, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045ec 50f4 MOVF 0xf4,0x0,0x0 movf PRODH, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045ee 221a ADDWFC 0x1a,0x1,0x0 addwfc __AARGB7 + 2, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045f0 0e00 MOVLW 0x0 movlw 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045f2 221b ADDWFC 0x1b,0x1,0x0 addwfc __AARGB7 + 3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // reload AARGB3[1] to continue C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045f4 501d MOVF 0x1d,0x0,0x0 movf __AARGB3 + 1, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045f6 0222 MULWF 0x22,0x0 mulwf __BARGB3 + 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // AARGB3[1] and BARGB3[1], so result adds into AARGB7[2,3] C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045f8 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045fa 261a ADDWF 0x1a,0x1,0x0 addwf __AARGB7 + 2, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045fc 50f4 MOVF 0xf4,0x0,0x0 movf PRODH, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 0045fe 221b ADDWFC 0x1b,0x1,0x0 addwfc __AARGB7 + 3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // reload AARGB3[1] to continue C:\MCC18\src\TRADIT~1\math\fxm3232.c 004600 501d MOVF 0x1d,0x0,0x0 movf __AARGB3 + 1, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 004602 0223 MULWF 0x23,0x0 mulwf __BARGB3 + 2, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // AARGB3[1] and BARGB3[2], so result adds into AARGB7[3] C:\MCC18\src\TRADIT~1\math\fxm3232.c // we don't care about result bytes above AARGB7[3], ignore prodh here. C:\MCC18\src\TRADIT~1\math\fxm3232.c 004604 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 004606 261b ADDWF 0x1b,0x1,0x0 addwf __AARGB7 + 3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // all bytes of the term from the product of AARGB3[1] and BARGB3[3] are C:\MCC18\src\TRADIT~1\math\fxm3232.c // above our 32-bit result, don't even need to bother calculating C:\MCC18\src\TRADIT~1\math\fxm3232.c // that term. C:\MCC18\src\TRADIT~1\math\fxm3232.c // load AARGB3[2] to continue C:\MCC18\src\TRADIT~1\math\fxm3232.c 004608 501e MOVF 0x1e,0x0,0x0 movf __AARGB3 + 2, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 00460a 0221 MULWF 0x21,0x0 mulwf __BARGB3, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // AARGB3[2] and BARGB3[0], so result adds into AARGB7[2,3] C:\MCC18\src\TRADIT~1\math\fxm3232.c 00460c 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 00460e 261a ADDWF 0x1a,0x1,0x0 addwf __AARGB7 + 2, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 004610 50f4 MOVF 0xf4,0x0,0x0 movf PRODH, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 004612 221b ADDWFC 0x1b,0x1,0x0 addwfc __AARGB7 + 3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // reload AARGB3[2] to continue C:\MCC18\src\TRADIT~1\math\fxm3232.c 004614 501e MOVF 0x1e,0x0,0x0 movf __AARGB3 + 2, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 004616 0222 MULWF 0x22,0x0 mulwf __BARGB3 + 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // AARGB3[2] and BARGB3[1], so result adds into AARGB7[3] C:\MCC18\src\TRADIT~1\math\fxm3232.c // we don't care about result bytes above AARGB7[3], ignore prodh here. C:\MCC18\src\TRADIT~1\math\fxm3232.c 004618 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 00461a 261b ADDWF 0x1b,0x1,0x0 addwf __AARGB7 + 3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // all bytes of the termsfrom the products of AARGB3[2] and BARGB3[2,3] are C:\MCC18\src\TRADIT~1\math\fxm3232.c // above our 32-bit result, don't even need to bother calculating C:\MCC18\src\TRADIT~1\math\fxm3232.c // those terms. C:\MCC18\src\TRADIT~1\math\fxm3232.c // load AARGB3[3] to continue C:\MCC18\src\TRADIT~1\math\fxm3232.c 00461c 501f MOVF 0x1f,0x0,0x0 movf __AARGB3 + 3, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 00461e 0221 MULWF 0x21,0x0 mulwf __BARGB3, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c // AARGB3[3] and BARGB3[0], so result adds into AARGB7[3] C:\MCC18\src\TRADIT~1\math\fxm3232.c 004620 50f3 MOVF 0xf3,0x0,0x0 movf PRODL, 0, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c 004622 261b ADDWF 0x1b,0x1,0x0 addwf __AARGB7 + 3, 1, 0 C:\MCC18\src\TRADIT~1\math\fxm3232.c C:\MCC18\src\TRADIT~1\math\fxm3232.c _endasm; C:\MCC18\src\TRADIT~1\math\fxm3232.c 004624 0012 RETURN 0x0 } C:\MCC18\src\TRADIT~1\math\fxm3232.c #include "P18CXXX.INC" C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm LIST C:\MCC18\MPASM\P18CXXX.INC ; P18CXXX.INC Standard Header File, Microchip Technology, Inc. C:\MCC18\MPASM\P18CXXX.INC LIST C:\MCC18\MPASM\P18C452.INC ; P18C452.INC Standard Header File, Version 0.12 Microchip Technology, Inc. C:\MCC18\MPASM\P18C452.INC LIST C:\MCC18\MPASM\P18C452.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C601 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C658 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C801 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C858 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1230 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1330 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F248 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F258 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F26K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F448 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F46K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F97J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\MPASM\P18CXXX.INC #include "P18MACRO.INC" C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; $Id: p18macro.inc,v 1.2 2005/05/20 15:34:54 GrosbaJ Exp $ C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;========================================================================== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; MACROS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;========================================================================== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC LIST C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkSetPtrToOffset macro Ptr,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Set pointer Ptr to argument in stack frame at Offset. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf Ptr,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(Offset&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf Ptr+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkPushPtrToOffset macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Push pointer onto stack to point to Offset location in stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Offset defined before push. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf INDF1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(Offset&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf PREINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTINC1,F,ACCESS ; increment FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkAddStackPtr macro N C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add N to FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(N) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(N&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFD C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS ; restore FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFD C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS ; restore FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+2) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+3) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+2) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment 3 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement 3 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 1 byte at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 2 bytes at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 3 bytes at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 1 byte in stack at Offset to byte at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf INDF0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 2 bytes in stack at Offset to 2 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 3 bytes in stack at Offset to 3 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 4 bytes in stack at Offset to 4 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 1 byte in stack at Offset to byte at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 2 bytes in stack at Offset to 2 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 3 bytes in stack at Offset to 3 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 4 bytes in stack at Offset to 4 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 1 byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 4 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 1 byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 2 bytesin stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 4 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1NegateFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 1 byte at FSR2. FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2NegateFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 2 bytes at FSR2. FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;====== These branches are short ============== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpWeqZ macro Label ; jmp if W == 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf WREG,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpWneZ macro Label ; jmp if W != 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC tstfsz WREG,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqZ macro Reg,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg,F,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneZ macro Reg,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg,F,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg,W,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg,W,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFleL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC cpfsgt Reg,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFgeL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC cpfslt Reg,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqF macro Reg1,Acc1,Reg2,Acc2,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg1,W,Acc1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg2,W,Acc2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneF macro Reg1,Acc1,Reg2,Acc2,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg1,W,Acc1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg2,W,Acc2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpClr macro Reg,Bit,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfss Reg,Bit,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpSet macro Reg,Bit,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc Reg,Bit,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; @name isdigit C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ;The {\bf isdigit} function tests the value of {\bf c} to determine if it C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ;is a digit character. A digit character is defined as any decimal digit C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ;character (0, 1, 2, 3, 4, 5, 6, 7, 8, 9). C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; int isdigit (int c); C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm CTYPE CODE C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm isdigit C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm global isdigit C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; Proceedure: Use FSR0 as pointer to 'c' C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; Return with result in PROD C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; Clear out result C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046b4 6af3 CLRF 0xf3,0x0 clrf PRODL, ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046b6 6af4 CLRF 0xf4,0x0 clrf PRODH, ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; Set FSR0 = FSR1 - 2 ( location of 'c') C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046b8 0eff MOVLW 0xff StkSetPtrToOffset FSR0L,-1 C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046ba 24e1 ADDWF 0xe1,0x0,0x0 0046bc 6ee9 MOVWF 0xe9,0x0 0046be 0eff MOVLW 0xff 0046c0 20e2 ADDWFC 0xe2,0x0,0x0 0046c2 6eea MOVWF 0xea,0x0 C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046c4 66ed TSTFSZ 0xed,0x0 tstfsz POSTDEC0,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046c6 d007 BRA 0x46d6 bra jNoMatch ; upper byte must be 0 to match C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm ; Test for condition C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046c8 0e2f MOVLW 0x2f jmpFleL INDF0,ACCESS,'0'-1,jNoMatch C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046ca 64ef CPFSGT 0xef,0x0 0046cc d004 BRA 0x46d6 0046ce 0e3a MOVLW 0x3a jmpFgeL INDF0,ACCESS,'9'+1,jNoMatch C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046d0 60ef CPFSLT 0xef,0x0 0046d2 d001 BRA 0x46d6 C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm jMatch: C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046d4 2af3 INCF 0xf3,0x1,0x0 incf PRODL,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm jNoMatch: C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm 0046d6 0012 RETURN 0x0 return C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm end C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\isdigit.asm #include C:\MCC18\src\TRADIT~1\stdclib\putc.c C:\MCC18\src\TRADIT~1\stdclib\putc.c int _user_putc (char c); C:\MCC18\src\TRADIT~1\stdclib\putc.c int _usart_putc (char c); C:\MCC18\src\TRADIT~1\stdclib\putc.c C:\MCC18\src\TRADIT~1\stdclib\putc.c int C:\MCC18\src\TRADIT~1\stdclib\putc.c 004532 cfd9 MOVFF 0xfd9,0xfe6 putc (char c, FILE * f) C:\MCC18\src\TRADIT~1\stdclib\putc.c 004534 ffe6 004536 cfda MOVFF 0xfda,0xfe6 004538 ffe6 00453a cfe1 MOVFF 0xfe1,0xfd9 00453c ffd9 00453e cfe2 MOVFF 0xfe2,0xfda 004540 ffda { C:\MCC18\src\TRADIT~1\stdclib\putc.c /* if the handle > 0 then it's a pointer to a string buffer address. C:\MCC18\src\TRADIT~1\stdclib\putc.c specifically, a pointer to a pointer referencing the next available C:\MCC18\src\TRADIT~1\stdclib\putc.c byte in the buffer, to which the character will be stored. */ C:\MCC18\src\TRADIT~1\stdclib\putc.c 004542 0efb MOVLW 0xfb if ((int) f >= 0) C:\MCC18\src\TRADIT~1\stdclib\putc.c 004544 cfdb MOVFF 0xfdb,0x2a 004546 f02a 004548 0efc MOVLW 0xfc 00454a cfdb MOVFF 0xfdb,0x2b 00454c f02b 00454e 0100 MOVLB 0x0 004550 0e80 MOVLW 0x80 004552 142b ANDWF 0x2b,0x0,0x0 004554 e11a BNZ 0x458a 004556 0efb MOVLW 0xfb return (unsigned char) (*(*(char **) f)++ = c); C:\MCC18\src\TRADIT~1\stdclib\putc.c 004558 cfdb MOVFF 0xfdb,0xfe9 00455a ffe9 00455c 0efc MOVLW 0xfc 00455e cfdb MOVFF 0xfdb,0xfea 004560 ffea 004562 cfee MOVFF 0xfee,0xff3 004564 fff3 004566 cfed MOVFF 0xfed,0xff4 004568 fff4 00456a 2aee INCF 0xee,0x1,0x0 00456c 0e00 MOVLW 0x0 00456e 22ef ADDWFC 0xef,0x1,0x0 004570 cff3 MOVFF 0xff3,0xfe9 004572 ffe9 004574 cff4 MOVFF 0xff4,0xfea 004576 ffea 004578 0efd MOVLW 0xfd 00457a cfdb MOVFF 0xfdb,0xfef 00457c ffef 00457e 50ef MOVF 0xef,0x0,0x0 004580 6a2b CLRF 0x2b,0x0 004582 6ef3 MOVWF 0xf3,0x0 004584 c02b MOVFF 0x2b,0xff4 004586 fff4 004588 d010 BRA 0x45aa C:\MCC18\src\TRADIT~1\stdclib\putc.c 00458a 0efb MOVLW 0xfb if ((signed char) f == (signed char) _H_USART) C:\MCC18\src\TRADIT~1\stdclib\putc.c 00458c 50db MOVF 0xdb,0x0,0x0 00458e 08fe SUBLW 0xfe 004590 e106 BNZ 0x459e { C:\MCC18\src\TRADIT~1\stdclib\putc.c /* the invocation of the USART function is direct, as it's our C:\MCC18\src\TRADIT~1\stdclib\putc.c default value and we want it to work without needing any C:\MCC18\src\TRADIT~1\stdclib\putc.c direct initialization from the user */ C:\MCC18\src\TRADIT~1\stdclib\putc.c 004592 0efd MOVLW 0xfd return _usart_putc (c); C:\MCC18\src\TRADIT~1\stdclib\putc.c 004594 cfdb MOVFF 0xfdb,0xfe6 004596 ffe6 004598 ecbd CALL 0x477a,0x0 00459a f023 00459c d005 BRA 0x45a8 } C:\MCC18\src\TRADIT~1\stdclib\putc.c else C:\MCC18\src\TRADIT~1\stdclib\putc.c { C:\MCC18\src\TRADIT~1\stdclib\putc.c /* the invocation of the user function is direct, not via a C:\MCC18\src\TRADIT~1\stdclib\putc.c function pointer. We just put an empty definition of the C:\MCC18\src\TRADIT~1\stdclib\putc.c function in the library and if the user specifies their own C:\MCC18\src\TRADIT~1\stdclib\putc.c version it will be found first and the library definition will C:\MCC18\src\TRADIT~1\stdclib\putc.c be ignored. We do it this way because it's generally better to C:\MCC18\src\TRADIT~1\stdclib\putc.c spend 2 bytes of program memory for the RETURN instruction of C:\MCC18\src\TRADIT~1\stdclib\putc.c the empty function than three bytes of data memory for the C:\MCC18\src\TRADIT~1\stdclib\putc.c function pointer. */ C:\MCC18\src\TRADIT~1\stdclib\putc.c 00459e 0efd MOVLW 0xfd return _user_putc (c); C:\MCC18\src\TRADIT~1\stdclib\putc.c 0045a0 cfdb MOVFF 0xfdb,0xfe6 0045a2 ffe6 0045a4 ecb7 CALL 0xf6e,0x0 0045a6 f007 0045a8 52e5 MOVF 0xe5,0x1,0x0 } C:\MCC18\src\TRADIT~1\stdclib\putc.c 0045aa 52e5 MOVF 0xe5,0x1,0x0 } C:\MCC18\src\TRADIT~1\stdclib\putc.c 0045ac cfe5 MOVFF 0xfe5,0xfda 0045ae ffda 0045b0 cfe7 MOVFF 0xfe7,0xfd9 0045b2 ffd9 0045b4 0012 RETURN 0x0 include C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm LIST C:\MCC18\MPASM\P18CXXX.INC ; P18CXXX.INC Standard Header File, Microchip Technology, Inc. C:\MCC18\MPASM\P18CXXX.INC LIST C:\MCC18\MPASM\p18F4550.INC C:\MCC18\MPASM\p18F4550.INC ;========================================================================== C:\MCC18\MPASM\p18F4550.INC ; MPASM PIC18F4550 processor include C:\MCC18\MPASM\p18F4550.INC ; C:\MCC18\MPASM\p18F4550.INC ; (c) Copyright 1999-2007 Microchip Technology, All rights reserved C:\MCC18\MPASM\p18F4550.INC ;========================================================================== C:\MCC18\MPASM\p18F4550.INC C:\MCC18\MPASM\p18F4550.INC LIST C:\MCC18\MPASM\p18F4550.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F46K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F97J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #ifdef __18F1220 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #define __USE_PORTB 1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #endif C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #ifdef __18F1230 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #define __USE_PORTB 1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #endif C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #ifdef __18F1231 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #define __USE_PORTB 1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #endif C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #ifdef __18F1320 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #define __USE_PORTB 1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #endif C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #ifdef __18F1330 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #define __USE_PORTB 1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #endif C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #ifdef __18F1331 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #define __USE_PORTB 1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #endif C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm GLOBAL _usart_putc C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm STDIO CODE C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm _usart_putc C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 00477a 0eff MOVLW 0xff MOVLW 0xff C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 00477c 50e3 MOVF 0xe3,0x0,0x0 MOVF PLUSW1, w C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 00477e baac BTFSC 0xac,0x5,0x0 BTFSC TXSTA, 0x5 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 004780 d004 BRA 0x478a BRA loop C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 004782 6aaf CLRF 0xaf,0x0 CLRF SPBRG C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 004784 8eab BSF 0xab,0x7,0x0 BSF RCSTA, 0x7 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 004786 8aac BSF 0xac,0x5,0x0 BSF TXSTA, 0x5 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #ifdef __USE_PORTB C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm BCF TRISB, 0x1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #else C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 004788 9c94 BCF 0x94,0x6,0x0 BCF TRISC, 0x6 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm #endif C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 00478a a2ac BTFSS 0xac,0x1,0x0 loop: BTFSS TXSTA, 0x1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 00478c d7fe BRA 0x478a BRA loop C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 00478e 6ead MOVWF 0xad,0x0 MOVWF TXREG C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 004790 6ef3 MOVWF 0xf3,0x0 MOVWF PRODL C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 004792 6af4 CLRF 0xf4,0x0 CLRF PRODL + 1 C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm 004794 0012 RETURN 0x0 RETURN C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm END C:\MCC18\SRC\TRADIT~1\PMC\USART\_usartpc.asm ; $Id: strlen.asm,v 1.1 2003/12/09 22:53:20 GrosbaJ Exp $ C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm #include "P18CXXX.INC" C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm LIST C:\MCC18\MPASM\P18CXXX.INC ; P18CXXX.INC Standard Header File, Microchip Technology, Inc. C:\MCC18\MPASM\P18CXXX.INC LIST C:\MCC18\MPASM\P18C452.INC ; P18C452.INC Standard Header File, Version 0.12 Microchip Technology, Inc. C:\MCC18\MPASM\P18C452.INC LIST C:\MCC18\MPASM\P18C452.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C601 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C658 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C801 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C858 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1230 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1330 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F248 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F258 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F26K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F448 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F46K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F97J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\MPASM\P18CXXX.INC #include "P18MACRO.INC" C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; $Id: p18macro.inc,v 1.2 2005/05/20 15:34:54 GrosbaJ Exp $ C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;========================================================================== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; MACROS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;========================================================================== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC LIST C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkSetPtrToOffset macro Ptr,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Set pointer Ptr to argument in stack frame at Offset. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf Ptr,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(Offset&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf Ptr+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkPushPtrToOffset macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Push pointer onto stack to point to Offset location in stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Offset defined before push. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf INDF1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(Offset&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf PREINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTINC1,F,ACCESS ; increment FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkAddStackPtr macro N C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add N to FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(N) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(N&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFD C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS ; restore FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFD C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS ; restore FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+2) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+3) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+2) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment 3 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement 3 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 1 byte at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 2 bytes at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 3 bytes at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 1 byte in stack at Offset to byte at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf INDF0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 2 bytes in stack at Offset to 2 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 3 bytes in stack at Offset to 3 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 4 bytes in stack at Offset to 4 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 1 byte in stack at Offset to byte at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 2 bytes in stack at Offset to 2 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 3 bytes in stack at Offset to 3 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 4 bytes in stack at Offset to 4 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 1 byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 4 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 1 byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 2 bytesin stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 4 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1NegateFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 1 byte at FSR2. FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2NegateFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 2 bytes at FSR2. FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;====== These branches are short ============== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpWeqZ macro Label ; jmp if W == 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf WREG,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpWneZ macro Label ; jmp if W != 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC tstfsz WREG,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqZ macro Reg,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg,F,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneZ macro Reg,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg,F,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg,W,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg,W,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFleL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC cpfsgt Reg,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFgeL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC cpfslt Reg,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqF macro Reg1,Acc1,Reg2,Acc2,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg1,W,Acc1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg2,W,Acc2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneF macro Reg1,Acc1,Reg2,Acc2,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg1,W,Acc1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg2,W,Acc2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpClr macro Reg,Bit,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfss Reg,Bit,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpSet macro Reg,Bit,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc Reg,Bit,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; @name strlen C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ;``The {\bf strlen} function computes the length of the string pointed C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ;to by {\bf s}.'' C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ;Stack usage: 2 bytes. Re-entrant. C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ;@param s pointer to the string C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ;@return ``The {\bf strlen} function returns the number of characters C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ;that precede the terminating null character.'' C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; size_t strlen (const char *s); C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm STRING CODE C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm strlen C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm global strlen C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; Proceedure: Use FSR0 for 's' and use PROD for 'n'. C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; Load FSR0 by copying 's' off stack into FSR0. C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 004626 0efe MOVLW 0xfe Stk2CpyToReg -2,FSR0L C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 004628 cfe3 MOVFF 0xfe3,0xfe9 00462a ffe9 00462c 0eff MOVLW 0xff 00462e cfe3 MOVFF 0xfe3,0xfea 004630 ffea C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; Clear PROD C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 004632 6af3 CLRF 0xf3,0x0 clrf PRODL,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 004634 6af4 CLRF 0xf4,0x0 clrf PRODH,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; Scan for '\0' while counting. C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm jLoop: C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; Test for '\0' C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 004636 52ee MOVF 0xee,0x1,0x0 movf POSTINC0,F,ACCESS ; set Z flag C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 004638 e003 BZ 0x4640 bz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; Count it C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 00463a 4af3 INFSNZ 0xf3,0x1,0x0 infsnz PRODL, F, ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 00463c 2af4 INCF 0xf4,0x1,0x0 incf PRODH, F, ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 00463e d7fb BRA 0x4636 bra jLoop C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm 004640 0012 RETURN 0x0 return C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm end C:\MCC18\SRC\TRADIT~1\STDCLIB\strlen.asm ; $Id: slenpgm.asm,v 1.4 2006/02/04 00:06:53 nairnj Exp $ C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm #include "P18CXXX.INC" C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm LIST C:\MCC18\MPASM\P18CXXX.INC ; P18CXXX.INC Standard Header File, Microchip Technology, Inc. C:\MCC18\MPASM\P18CXXX.INC LIST C:\MCC18\MPASM\P18C452.INC ; P18C452.INC Standard Header File, Version 0.12 Microchip Technology, Inc. C:\MCC18\MPASM\P18C452.INC LIST C:\MCC18\MPASM\P18C452.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C601 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C658 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C801 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18C858 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1230 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F1330 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F242 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F248 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F24K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F252 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F258 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F25K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F2685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F26K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4220 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4221 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4320 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4321 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4331 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F442 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4420 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4423 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4431 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4439 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4450 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4455 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F448 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4480 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F44K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4510 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4515 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F452 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4523 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4539 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4550 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4553 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F458 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4580 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F45K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4610 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4682 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F4685 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F46K20 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F63J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F64J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F65J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F66J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F6723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F67J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8310 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8390 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F83J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8410 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8490 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F84J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8520 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8525 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8527 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8585 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F85J90 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8620 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8621 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8622 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8627 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8628 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8680 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J15 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J16 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J55 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F86J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8720 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8722 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F8723 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J10 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J11 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J50 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F87J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F96J65 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC IFDEF __18F97J60 C:\MCC18\MPASM\P18CXXX.INC INCLUDE C:\MCC18\MPASM\P18CXXX.INC ENDIF C:\MCC18\MPASM\P18CXXX.INC C:\MCC18\MPASM\P18CXXX.INC #include "P18MACRO.INC" C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; $Id: p18macro.inc,v 1.2 2005/05/20 15:34:54 GrosbaJ Exp $ C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;========================================================================== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; MACROS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;========================================================================== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC LIST C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkSetPtrToOffset macro Ptr,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Set pointer Ptr to argument in stack frame at Offset. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf Ptr,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(Offset&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf Ptr+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkPushPtrToOffset macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Push pointer onto stack to point to Offset location in stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Offset defined before push. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf INDF1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(Offset&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movwf PREINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTINC1,F,ACCESS ; increment FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC StkAddStackPtr macro N C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add N to FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(N) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf FSR1L,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw HIGH(N&0xFFFF) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc FSR1H,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from FSR0 and push on stack. FSR0, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from FSR2 and push on stack. FSR2, WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get one byte from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get two bytes from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PushFromReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Get three bytes from Reg and push on stack. WREG unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+2,POSTINC1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToFSR0 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at FSR0 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFD C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS ; restore FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at FSR2 without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFD C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFE C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS ; restore FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop one byte from stack and put it at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop two bytes from stack and put them at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3PopToReg macro Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Pop three bytes from stack and put them at Reg without exposing stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw 0xFF C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC1,F,ACCESS ; decrement FSR1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to FSR0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,INDF2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from stack frame at Offset to FSR2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; WREG changed, FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+2) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTINC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+3) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,POSTDEC2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyToReg macro Offset,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from stack frame at Offset to Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+1) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset+2) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff PLUSW1,Reg+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyFromFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from FSR0 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC0,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff INDF2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4CpyFromFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy four bytes from FSR2 to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTINC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff POSTDEC2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy one byte from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw LOW(Offset) C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy two bytes from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3CpyFromReg macro Reg,Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Copy three bytes from Reg to stack frame at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+1,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movff Reg+2,PLUSW1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3Inc macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Increment 3 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3Dec macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Decrement 3 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bc jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 1 byte at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 2 bytes at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3TestForZero macro Offset,jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Test 3 bytes at Offset. Branch if zero. Returns 0 in WREG if zero. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz jZero C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jContinue C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 1 byte in stack at Offset to byte at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf INDF0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 2 bytes in stack at Offset to 2 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 3 bytes in stack at Offset to 3 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4AddToFSR0 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 4 bytes in stack at Offset to 4 bytes at FSR0. Pointer FSR0 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC0,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 1 byte in stack at Offset to byte at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 2 bytes in stack at Offset to 2 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk3AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 3 bytes in stack at Offset to 3 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4AddToFSR2 macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Add 4 bytes in stack at Offset to 4 bytes at FSR2. Pointer FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf PLUSW1,W,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC addwfc POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 1 byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 2 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4ShiftLeft macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Shift left 4 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bcf STATUS,C C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC rlcf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 1 byte in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 2 bytesin stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk4Negate macro Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 4 bytes in stack at Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC local jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw Offset+3 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf PLUSW1,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jEnd: C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk1NegateFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 1 byte at FSR2. FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC Stk2NegateFSR2 macro C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ; Negate 2 bytes at FSR2. FSR2 unchanged. C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC incf POSTINC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc STATUS,Z C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC decf INDF2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC comf POSTDEC2,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC ;====== These branches are short ============== C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpWeqZ macro Label ; jmp if W == 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf WREG,F,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpWneZ macro Label ; jmp if W != 0 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC tstfsz WREG,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqZ macro Reg,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg,F,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneZ macro Reg,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg,F,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg,W,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg,W,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFleL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC cpfsgt Reg,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFgeL macro Reg,Acc,bVal,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movlw bVal C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC cpfslt Reg,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFeqF macro Reg1,Acc1,Reg2,Acc2,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg1,W,Acc1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg2,W,Acc2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpFneF macro Reg1,Acc1,Reg2,Acc2,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC movf Reg1,W,Acc1 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC subwf Reg2,W,Acc2 C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bnz Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpClr macro Reg,Bit,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfss Reg,Bit,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC jmpSet macro Reg,Bit,Acc,Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC btfsc Reg,Bit,Acc C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC bra Label C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC endm C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\P18MACRO.INC C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; @name strlenpgm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ;``The {\bf strlenpgm} function computes the length of the string pointed C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ;to by {\bf s}.'' C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ;@param s pointer to the string C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ;@return ``The {\bf strlenpgm} function returns the number of characters C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ;that precede the terminating null character.'' C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; sizerom_t strlenpgm (const rom char *s); C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm extern __AARGB2 C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm STRING CODE C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm strlenpgm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm global strlenpgm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm #ifdef __SMALL__ C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm messg "strlenpgm - SMALL" C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Procedure: Use TBLPTR for 's' and create 'n' on stack. Return 'n' in C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; __AARGB0:__AARGB1:__AARGB2. C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Load TBLPTR by POPing 's' off stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm Stk2PopToReg TBLPTRL C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm clrf POSTDEC1,ACCESS ; provide extra byte below stack C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Push 3 bytes of 0 onto stack. This is initial value of 'n'. C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm clrf POSTINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm clrf POSTINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm clrf POSTINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Scan for '\0' while counting. C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm jLoop: C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Test for '\0' C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm tblrd *+ ; read & increment C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm movf TABLAT, F, ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm bz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Count it C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm Stk3Inc -3 C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm bra jLoop C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm Stk3CpyToReg -3, __AARGB2 C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm return C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm #else C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm #ifdef __LARGE__ C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm messg "strlenpgm - LARGE" C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Procedure: Use TBLPTR for 's' and create 'n' on stack. Return 'n' in C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; __AARGB0:__AARGB1:__AARGB2. C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Load TBLPTR by POPing 's' off stack. C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 004642 0eff MOVLW 0xff Stk3PopToReg TBLPTRL C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 004644 cfe3 MOVFF 0xfe3,0xff8 004646 fff8 004648 52e5 MOVF 0xe5,0x1,0x0 00464a 0eff MOVLW 0xff 00464c cfe3 MOVFF 0xfe3,0xff7 00464e fff7 004650 52e5 MOVF 0xe5,0x1,0x0 004652 0eff MOVLW 0xff 004654 cfe3 MOVFF 0xfe3,0xff6 004656 fff6 004658 52e5 MOVF 0xe5,0x1,0x0 C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Push 3 bytes of 0 onto stack. This is initial value of 'n'. C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 00465a 6ae6 CLRF 0xe6,0x0 clrf POSTINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 00465c 6ae6 CLRF 0xe6,0x0 clrf POSTINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 00465e 6ae6 CLRF 0xe6,0x0 clrf POSTINC1,ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Scan for '\0' while counting. C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm jLoop: C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Test for '\0' C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 004660 0009 TBLRDPOSTINC tblrd *+ ; read & increment C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 004662 52f5 MOVF 0xf5,0x1,0x0 movf TABLAT, F, ACCESS C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 004664 e009 BZ 0x4678 bz jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm ; Count it C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 004666 0efd MOVLW 0xfd Stk3Inc -3 C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 004668 2ae3 INCF 0xe3,0x1,0x0 00466a e105 BNZ 0x4676 00466c 0efe MOVLW 0xfe 00466e 2ae3 INCF 0xe3,0x1,0x0 004670 e102 BNZ 0x4676 004672 0eff MOVLW 0xff 004674 2ae3 INCF 0xe3,0x1,0x0 004676 d7f4 BRA 0x4660 bra jLoop C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm jEnd C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 004678 0efd MOVLW 0xfd Stk3CpyToReg -3, __AARGB2 C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm 00467a cfe3 MOVFF 0xfe3,0x1d 00467c f01d 00467e 0efe MOVLW 0xfe 004680 cfe3 MOVFF 0xfe3,0x1e 004682 f01e 004684 0eff MOVLW 0xff 004686 cfe3 MOVFF 0xfe3,0x1f 004688 f01f 00468a 0012 RETURN 0x0 return C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm #else C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm error "No Model Specified" C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm #endif C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm #endif C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm end C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm C:\MCC18\SRC\TRADIT~1\STDCLIB\slenpgm.asm