CCS PCW C Compiler, Version 3.068, 13348 Filename: /usr3/ha/hcs_II/hcs/ccc/pictv.LST ROM used: 1751 (43%) Largest free fragment is 2048 RAM used: 41 (21%) at main() level 52 (27%) worst case Stack: 5 worst case (3 in main + 2 for interrupts) * 0000: MOVLW 00 0001: MOVWF 0A 0002: GOTO 22D 0003: NOP 0004: BTFSS 0A.3 0005: BCF 0A.4 0006: BTFSC 0A.3 0007: BSF 0A.4 0008: BCF 0A.3 0009: BTFSC 03.5 000A: GOTO 00F 000B: MOVWF 25 000C: SWAPF 03,W 000D: MOVWF 26 000E: GOTO 014 000F: BCF 03.5 0010: MOVWF 25 0011: SWAPF 03,W 0012: MOVWF 26 0013: BSF 26.1 0014: MOVF 0A,W 0015: MOVWF 2D 0016: SWAPF 25,F 0017: MOVF 04,W 0018: MOVWF 27 0019: MOVF 20,W 001A: MOVWF 28 001B: MOVF 21,W 001C: MOVWF 29 001D: MOVF 22,W 001E: MOVWF 2A 001F: MOVF 23,W 0020: MOVWF 2B 0021: MOVF 24,W 0022: MOVWF 2C 0023: BCF 03.5 0024: MOVLW 8C 0025: MOVWF 04 0026: BTFSS 00.5 0027: GOTO 02A 0028: BTFSC 0C.5 0029: GOTO 042 002A: MOVF 27,W 002B: MOVWF 04 002C: MOVF 28,W 002D: MOVWF 20 002E: MOVF 29,W 002F: MOVWF 21 0030: MOVF 2A,W 0031: MOVWF 22 0032: MOVF 2B,W 0033: MOVWF 23 0034: MOVF 2C,W 0035: MOVWF 24 0036: MOVF 2D,W 0037: MOVWF 0A 0038: BTFSC 0A.4 0039: BSF 0A.3 003A: BCF 0A.4 003B: SWAPF 26,W 003C: MOVWF 03 003D: BCF 03.5 003E: SWAPF 25,W 003F: BTFSC 26.1 0040: BSF 03.5 0041: RETFIE 0042: BCF 0A.3 0043: GOTO 084 .................... /* .................... .................... CCC PIC-TV .................... .................... (c)1999 Creative Control Concepts .................... .................... The PIC-TV is a network interface node which allows the use of the BOB-II .................... On Screen Display device to display text on any television with video input capability .................... .................... The PIC-TV uses a 200 charcater buffer to receive large amounts of text data .................... so the display update can often be accomplished in one network packet. .................... .................... The PIC-TV recognizes many of the same commands used for the PIC-LCD and LCD-Link .................... .................... Each line is scanned character by character. Normal text is simply sent to the .................... text display box. \e cursor commands are parsed and converted into a format .................... understood by the OSD device. If the edge of the screen is reached, the .................... PIC-TV will wrap to the next line. Single line wrap mode is also supported. .................... .................... The PIC-TV uses normal HCS checksums and can be configured for any normal LCD-Link .................... node number (0-7) It will also respond to keypad query requests with 00 since there .................... is no keypad. .................... .................... The PIC-TV display size is from 0,0 to 11,27 .................... .................... The PIC-TV supports a beeper which allows the system to get the owners' attention .................... or sound an alert if necessary. .................... .................... Below are the supported commands: .................... .................... C-Style Escape Commands: .................... .................... \b Turn display on .................... \c Turn display off .................... \e Escape Charater .................... \f Clear the screen .................... \g BEEP - Will pulse a PIC output for 0.5 seconds (Beeper) .................... \h Enable Character Backgrounds .................... \i Disable Character Backgrounds .................... \j Switch to local video mode .................... \k Switch to video input mode (MAY TAKE A FEW SECONDS!) .................... \l Color entire character grid .................... \m Color only written cell positions with background .................... \n New Line (linefeed/carriage return) .................... \o Blink on .................... \p Blink off .................... \r Carriage Return (same line, leftmost column) .................... \t Tab (4 spaces per tab) .................... \xnn Send hex character .................... .................... The PICLCD-Link will also support these ANSI commands: .................... .................... \e[#A Move cursor up # rows .................... \e[#B Move cursor down # rows .................... \e[#C Move cursor right # columns .................... \e[#D Move cursor left # columns .................... \e[#;#H Move cursor to row,col 0,0 (\e[H Home) .................... \e[#;#f Move cursor to row,col #,# (Any spot) .................... \e[#;#j Move cursor to row,col 3,0 (Row setting \e[3j Row 3) .................... \e[s Save current cursor position .................... \e[u Restore saved cursor position .................... \e[2J Clear display & home cursor .................... \e[K Clear from cursor to end of row .................... \e[7# Set Display Mode (\e[7h to wrap at end of row onto same line) .................... (\e[7l to force CR/LF at end of row) .................... .................... Custom non-ANSI commands .................... .................... \e[#g Beep for # seconds (from 1-10 seconds) .................... \e[#M Screen Color (0-7) .................... \e[#N Character Color (0-7) .................... \e[#O Character Cell background Color (0-7) .................... \e[#P Character Outline Color (0-7) .................... .................... .................... Pin Assignments: .................... A0 Beeper Output .................... A1 HCS Serial Error LED .................... A2 HCS Serial Traffic LED .................... A3 TV Serial Out LED .................... A4 BOB-II Video Mute Out (Active High) .................... A5 BOB-II Reset Output .................... B0 Node Addr Bit 0 .................... B1 Node Addr Bit 1 .................... B2 Node Addr Bit 2 .................... B3-7 Future Use .................... C0 HCS RS-485 Serial Out .................... C1 RS-485 Enable Out .................... C2-5 Future Use .................... C6 Display TV Serial Out .................... C7 HCS RS-485 Serial In .................... .................... Configuration: .................... .................... The PIC-TV has it's node address set via external jumpers on Pins A0 - A2 for numbers 0-7 .................... .................... */ .................... .................... #INCLUDE "16c63.h" // Use 16bit pointers to use all of the RAM .................... //////// Standard Header file for the PIC16C63 device //////////////// .................... #device PIC16C63 .................... #list .................... .................... .................... #FUSES XT, WDT, PROTECT, BROWNOUT, PUT .................... #USE DELAY (CLOCK=3686400, RESTART_WDT) // 4MHz won't work well with internal UART * 0105: MOVLW 46 0106: MOVWF 04 0107: MOVF 00,W 0108: BTFSC 03.2 0109: GOTO 11B 010A: MOVLW 01 010B: MOVWF 21 010C: MOVLW BF 010D: MOVWF 20 010E: CLRWDT 010F: DECFSZ 20,F 0110: GOTO 10E 0111: DECFSZ 21,F 0112: GOTO 10C 0113: MOVLW 30 0114: MOVWF 20 0115: DECFSZ 20,F 0116: GOTO 115 0117: NOP 0118: CLRWDT 0119: DECFSZ 00,F 011A: GOTO 10A 011B: RETLW 00 .................... .................... #USE FAST_IO(A) // LCD bit direction handled by routines .................... #USE FAST_IO(B) .................... #USE FAST_IO(C) .................... .................... #USE RS232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=n, restart_wdt) .................... .................... #ZERO_RAM // Saves us any trouble! .................... .................... // Define the instruction time based on system clock to properly setup .................... // delays in serial send routine. Done in NANOSECONDS! .................... #DEFINE INST_TIME 1090 // Based on 3.6864MHz .................... .................... // Here are some various definitions for the serial interface .................... .................... #byte porta = 0x05 // Map pin names to Port A .................... #byte portb = 0x06 .................... #Bit T0IF = 0x0B.2 // RTCC Interrupt Flag .................... #byte OPTION = 0x81 .................... #Bit TXIF = 0x0C.4 .................... #Bit RCIF = 0x0C.5 .................... #Bit beepout = 0x05.0 .................... #Bit S_ERR = 0x05.1 .................... #Bit LAN_IN = 0x05.2 .................... #Bit TV_OUT = 0x05.3 .................... #Bit b2_reset = 0x05.5 .................... #Bit rs485_out = 0x07.0 .................... #Bit rs485_enable = 0x07.1 .................... #Bit CREN = 0x18.4 .................... #Bit FERR = 0x18.2 .................... #Bit OERR = 0x18.1 .................... #Byte FSR = 0x04 .................... #Byte INDF = 0x00 .................... #Byte SPBRG = 0x99 .................... #Byte RCSTA = 0x18 .................... #Byte TXSTA = 0x98 .................... #Byte PIR1 = 0x0C .................... #Byte RCREG = 0x1A .................... .................... #DEFINE BUFFER_SIZE 128 .................... .................... int serial_idx, process_idx, idx, scratch, check_val, node_total; .................... char addr_num, chksum; .................... char thisnode[5]; .................... boolean s_idle; // When TRUE, we are NOT receiving a packet .................... boolean p_idle; // When TRUE, we are processing a packet .................... boolean go_data; // When TRUE, we have a packet to munch .................... boolean checksum; // Checksum flag for incoming packet .................... .................... // BUFFER ACCESS ROUTINES .................... .................... // Our buffer is 128 characters long allowing for up to 3 lines of text on a 40 col printer .................... // The compiler arrays are a bit of a hassle so we'll use the upper section of Bank 0 and .................... // all of Bank 1 .................... // 0-1F Bank 0 60-7F (32 bytes) .................... // 20-7F Bank 1 A0-FF (96 bytes) .................... // .................... // We can easily handle the bank switching since bits 6 & 7 of the buffer addr correspond .................... // to the proper bank set bits and bit 0-6 will bring us directly to the proper offset in .................... // each bank. .................... .................... int read_buffer(int addr) { .................... .................... if (addr > 0x1F) { * 0068: MOVF 51,W 0069: SUBLW 1F 006A: BTFSC 03.0 006B: GOTO 070 .................... // Bank 1 .................... FSR = addr + 0x80; // We don't subtract 80 to keep the FSR bit 7 set 006C: MOVLW 80 006D: ADDWF 51,W 006E: MOVWF 04 .................... } else { 006F: GOTO 073 .................... // Bank 0 .................... FSR = addr + 0x60; 0070: MOVLW 60 0071: ADDWF 51,W 0072: MOVWF 04 .................... } .................... .................... // Access data via FSR register .................... return INDF; 0073: MOVF 00,W 0074: MOVWF 21 0075: GOTO 076 0076: RETLW 00 .................... .................... } .................... .................... void write_buffer(int addr, int b_data) { .................... .................... // Prevent a bogus address value .................... if (addr > 0x7F) { return; } * 0054: MOVF 4E,W 0055: SUBLW 7F 0056: BTFSC 03.0 0057: GOTO 059 0058: GOTO 067 .................... .................... if (addr > 0x1F) { 0059: MOVF 4E,W 005A: SUBLW 1F 005B: BTFSC 03.0 005C: GOTO 061 .................... // Bank 1 .................... FSR = addr + 0x80; 005D: MOVLW 80 005E: ADDWF 4E,W 005F: MOVWF 04 .................... } else { 0060: GOTO 064 .................... // Bank 0 .................... FSR = addr + 0x60; 0061: MOVLW 60 0062: ADDWF 4E,W 0063: MOVWF 04 .................... } .................... .................... INDF = b_data; 0064: MOVF 4F,W 0065: MOVWF 00 .................... return; 0066: GOTO 067 0067: RETLW 00 .................... } .................... .................... .................... // This routine is used to convert characters for checking the checksum .................... // It simply converts an ASCII hex value into true decimal form .................... // ASCII allows for a quick and dirty conversion routine! .................... .................... byte gethexbyte(char digit) { .................... // This also handles upper or lower case! .................... if(!BIT_TEST(digit,6)) // Its a number if bit 6 is 0 * 0077: BTFSC 52.6 0078: GOTO 07E .................... return(digit & 0x0F); // Simple way to convert 0-9 0079: MOVF 52,W 007A: ANDLW 0F 007B: MOVWF 21 007C: GOTO 083 .................... else 007D: GOTO 083 .................... return((digit & 0x0F) + 9); 007E: MOVF 52,W 007F: ANDLW 0F 0080: ADDLW 09 0081: MOVWF 21 0082: GOTO 083 0083: RETLW 00 .................... } .................... .................... void send_serial_byte(byte byte_in) { .................... .................... int bitc; .................... .................... // Sending a serial byte is fairly easy .................... // Disable interrupt since data is looped in RS485 chip .................... // Send RS485 enable bit high .................... // Send start bit (LOW) .................... // Delay 104us .................... // Shift data bits (8) onto serial out - wait 104us .................... // Send stop bit (HIGH) .................... // Clear EXT interrupt flag .................... // Re-enable EXT interrupt .................... // Delay 104us for stop bit .................... .................... restart_wdt(); * 011C: CLRWDT .................... rs485_enable = 1; 011D: BSF 07.1 .................... delay_cycles(1); 011E: NOP .................... rs485_out = 0; // Send start bit 011F: BCF 07.0 .................... .................... // Delay 104us minus 10 inst cycles to get first bit out .................... delay_us(104 - ((10 * INST_TIME) / 1000)); 0120: MOVLW 1C 0121: MOVWF 20 0122: DECFSZ 20,F 0123: GOTO 122 0124: NOP .................... .................... for(bitc = 0; bitc < 8; ++bitc) { 0125: CLRF 48 0126: MOVF 48,W 0127: SUBLW 07 0128: BTFSS 03.0 0129: GOTO 137 .................... // Lets send the bits .................... rs485_out = shift_right(&byte_in,1,0); 012A: BCF 03.0 012B: RRF 47,F 012C: BTFSC 03.0 012D: GOTO 130 012E: BCF 07.0 012F: GOTO 131 0130: BSF 07.0 .................... .................... // Loop takes 13 instructions. 104us - 13 inst .................... delay_us(104 - ((13 * INST_TIME) / 1000)); 0131: MOVLW 1B 0132: MOVWF 20 0133: DECFSZ 20,F 0134: GOTO 133 .................... } 0135: INCF 48,F 0136: GOTO 126 .................... .................... // Now we send the stop bit and re-enable the interrupts .................... // Lets delay enough to let the last bit finish .................... // We need to add the delay of 6 instructions .................... delay_us((6 * INST_TIME) / 1000); // Allow last bit to finish 104us (104 - (90 + 17 inst) 0137: NOP 0138: NOP 0139: NOP 013A: NOP 013B: NOP .................... rs485_out = 1; 013C: BSF 07.0 .................... .................... // Delay for the rest of the stop bit time .................... // 3 to return -> 104 - 3 inst .................... delay_us(104 - ((3 * INST_TIME) / 1000)); 013D: MOVLW 1E 013E: MOVWF 20 013F: DECFSZ 20,F 0140: GOTO 13F 0141: NOP 0142: NOP .................... .................... rs485_enable = 0; // Disable 485 driver 0143: BCF 07.1 0144: RETLW 00 .................... .................... } .................... .................... .................... // Serial Interface .................... // This routine sends a serial byte back to the HCS since we use the Xmit UART section .................... // to send data to the Display TV box .................... .................... // This routine reads in serial data .................... // It is called via interrupt when data has been received by the UART .................... .................... #INT_RDA .................... void serial_in() { .................... .................... char data_in; .................... int tidx; .................... .................... // Lets read the buffer until it is empty in case we have more than one char here .................... while (bit_test(PIR1, 5)) { * 0084: BTFSS 0C.5 0085: GOTO 102 .................... .................... // We don't use getc since it does a needless bit check to see if data is avail. .................... data_in = RCREG; // We use the HW UART here for simplicity sake! 0086: MOVF 1A,W 0087: MOVWF 4C .................... .................... // That's it! Lets act on the data... .................... // We are looking for the start of a packet. .................... // Otherwise we stay in this state and ignore the incoming char .................... .................... if (s_idle) { 0088: BTFSS 3B.0 0089: GOTO 0A8 .................... if ((data_in == '!') || (data_in == '#')) { 008A: MOVF 4C,W 008B: SUBLW 21 008C: BTFSC 03.2 008D: GOTO 092 008E: MOVF 4C,W 008F: SUBLW 23 0090: BTFSS 03.2 0091: GOTO 0A7 .................... // New Packet - Lets go to the front of the buffer .................... LAN_IN = 0; 0092: BCF 05.2 .................... serial_idx = 0; 0093: CLRF 2E .................... check_val = node_total; // Clear checksum buffer using default beginning 0094: MOVF 33,W 0095: MOVWF 32 .................... write_buffer(0x00, data_in); 0096: CLRF 4E 0097: MOVF 4C,W 0098: MOVWF 4F 0099: CALL 054 .................... s_idle = FALSE; 009A: BCF 3B.0 .................... S_ERR = 1; 009B: BSF 05.1 .................... .................... // Lets get the correct offset for the address/node name .................... if (data_in == '#') { 009C: MOVF 4C,W 009D: SUBLW 23 009E: BTFSS 03.2 009F: GOTO 0A4 .................... tidx = 4; 00A0: MOVLW 04 00A1: MOVWF 4D .................... checksum = TRUE; 00A2: BSF 3B.3 .................... } else { 00A3: GOTO 0A7 .................... tidx = 2; 00A4: MOVLW 02 00A5: MOVWF 4D .................... checksum = FALSE; 00A6: BCF 3B.3 .................... } .................... } .................... } else { 00A7: GOTO 101 .................... // Check for buffer overflow or if we caught up to a previous packet .................... if ((++serial_idx == BUFFER_SIZE) || (!p_idle && (serial_idx == process_idx))) { 00A8: INCF 2E,F 00A9: MOVF 2E,W 00AA: SUBLW 80 00AB: BTFSC 03.2 00AC: GOTO 0B3 00AD: BTFSC 3B.1 00AE: GOTO 0B7 00AF: MOVF 2F,W 00B0: SUBWF 2E,W 00B1: BTFSS 03.2 00B2: GOTO 0B7 .................... // Buffer Overflow - lets dump it since the checksum won't validate anyway .................... s_idle = TRUE; 00B3: BSF 3B.0 .................... S_ERR = 0; // Twiddle the status LEDs 00B4: BCF 05.1 .................... LAN_IN = 1; 00B5: BSF 05.2 .................... } else { 00B6: GOTO 101 .................... // Check for the end of the packet .................... if ((data_in == '\r') || (data_in == '\n')) { 00B7: MOVF 4C,W 00B8: SUBLW 0D 00B9: BTFSC 03.2 00BA: GOTO 0BF 00BB: MOVF 4C,W 00BC: SUBLW 0A 00BD: BTFSS 03.2 00BE: GOTO 0E1 .................... // Check the checksum if we are supposed to .................... if (checksum) { 00BF: BTFSS 3B.3 00C0: GOTO 0DD .................... check_val += ((gethexbyte(read_buffer(1)) << 4) | gethexbyte(read_buffer(2))); 00C1: MOVLW 01 00C2: MOVWF 51 00C3: CALL 068 00C4: MOVF 21,W 00C5: MOVWF 4E 00C6: MOVWF 52 00C7: CALL 077 00C8: SWAPF 21,W 00C9: MOVWF 50 00CA: MOVLW F0 00CB: ANDWF 50,F 00CC: MOVLW 02 00CD: MOVWF 51 00CE: CALL 068 00CF: MOVF 21,W 00D0: MOVWF 51 00D1: MOVWF 52 00D2: CALL 077 00D3: MOVF 50,W 00D4: IORWF 21,W 00D5: ADDWF 32,F .................... if (check_val == 0) { 00D6: MOVF 32,F 00D7: BTFSS 03.2 00D8: GOTO 0DB .................... go_data = TRUE; // Tell main program to process buffer 00D9: BSF 3B.2 .................... } else { 00DA: GOTO 0DC .................... // Bad checksum - turn on RED LED .................... S_ERR = 0; 00DB: BCF 05.1 .................... } .................... } else { 00DC: GOTO 0DE .................... // If there is no checksum, we process whatever we get .................... go_data = TRUE; 00DD: BSF 3B.2 .................... } .................... s_idle = TRUE; // We are ready to receive the next packet 00DE: BSF 3B.0 .................... LAN_IN = 1; 00DF: BSF 05.2 .................... } else { 00E0: GOTO 101 .................... // Save the data .................... write_buffer(serial_idx, data_in); 00E1: MOVF 2E,W 00E2: MOVWF 4E 00E3: MOVF 4C,W 00E4: MOVWF 4F 00E5: CALL 054 .................... .................... // Lets check character against node address if necessary .................... if ((serial_idx >= tidx) && (serial_idx < (tidx + 5))) { 00E6: MOVF 4D,W 00E7: SUBWF 2E,W 00E8: BTFSS 03.0 00E9: GOTO 0F9 00EA: MOVLW 05 00EB: ADDWF 4D,W 00EC: SUBWF 2E,W 00ED: BTFSC 03.0 00EE: GOTO 0F9 .................... // Its an node address character - lets check it .................... if (thisnode[(serial_idx-tidx)] != data_in) { 00EF: MOVF 4D,W 00F0: SUBWF 2E,W 00F1: ADDLW 36 00F2: MOVWF 04 00F3: MOVF 4C,W 00F4: SUBWF 00,W 00F5: BTFSC 03.2 00F6: GOTO 0F9 .................... // It isn't our packet - break out and wait for next one .................... s_idle = TRUE; 00F7: BSF 3B.0 .................... LAN_IN = 1; 00F8: BSF 05.2 .................... } .................... } .................... .................... // Lets add this into the checksum value .................... if (checksum) { 00F9: BTFSS 3B.3 00FA: GOTO 101 .................... // Lets add the char to the checksum value if needed .................... if (serial_idx >= 10) { 00FB: MOVF 2E,W 00FC: SUBLW 09 00FD: BTFSC 03.0 00FE: GOTO 101 .................... check_val += data_in; 00FF: MOVF 4C,W 0100: ADDWF 32,F .................... } .................... } .................... } .................... } .................... } .................... } 0101: GOTO 084 .................... } .................... .................... 0102: BCF 0C.5 0103: BCF 0A.3 0104: GOTO 02A .................... #INLINE .................... void send_uart_serial(byte char_in) { .................... .................... // We have to do our own serial send routine to get the WDT reset each time .................... // The compiler putc function doesn't do it (in this version anyway - its been fixed) .................... restart_wdt(); * 01E9: CLRWDT * 0201: CLRWDT * 020B: CLRWDT * 0214: CLRWDT * 021C: CLRWDT * 0284: CLRWDT * 028C: CLRWDT * 0297: CLRWDT * 029F: CLRWDT * 02A7: CLRWDT * 038C: CLRWDT * 0394: CLRWDT * 039C: CLRWDT * 03A5: CLRWDT * 03AD: CLRWDT * 03B5: CLRWDT * 0496: CLRWDT * 049E: CLRWDT * 04B3: CLRWDT * 04BB: CLRWDT * 04D0: CLRWDT * 04D8: CLRWDT * 04ED: CLRWDT * 04F5: CLRWDT * 050A: CLRWDT * 0512: CLRWDT * 0544: CLRWDT * 054C: CLRWDT * 0562: CLRWDT * 056A: CLRWDT * 0572: CLRWDT * 057D: CLRWDT * 0585: CLRWDT * 058D: CLRWDT * 0596: CLRWDT * 059E: CLRWDT * 05A6: CLRWDT * 05B0: CLRWDT * 05B8: CLRWDT * 05C0: CLRWDT * 05CC: CLRWDT * 05D4: CLRWDT * 05DC: CLRWDT * 05E7: CLRWDT * 05EF: CLRWDT * 05F7: CLRWDT * 060D: CLRWDT * 0615: CLRWDT * 061D: CLRWDT * 0626: CLRWDT * 062E: CLRWDT * 0636: CLRWDT * 0685: CLRWDT * 068D: CLRWDT .................... putc(char_in); * 01EA: MOVF 49,W 01EB: CLRWDT 01EC: BTFSS 0C.4 01ED: GOTO 1EB 01EE: MOVWF 19 * 0202: MOVF 49,W 0203: CLRWDT 0204: BTFSS 0C.4 0205: GOTO 203 0206: MOVWF 19 * 020C: MOVF 49,W 020D: CLRWDT 020E: BTFSS 0C.4 020F: GOTO 20D 0210: MOVWF 19 * 0215: MOVF 49,W 0216: CLRWDT 0217: BTFSS 0C.4 0218: GOTO 216 0219: MOVWF 19 * 021D: MOVF 49,W 021E: CLRWDT 021F: BTFSS 0C.4 0220: GOTO 21E 0221: MOVWF 19 * 0285: MOVF 49,W 0286: CLRWDT 0287: BTFSS 0C.4 0288: GOTO 286 0289: MOVWF 19 * 028D: MOVF 49,W 028E: CLRWDT 028F: BTFSS 0C.4 0290: GOTO 28E 0291: MOVWF 19 * 0298: MOVF 49,W 0299: CLRWDT 029A: BTFSS 0C.4 029B: GOTO 299 029C: MOVWF 19 * 02A0: MOVF 49,W 02A1: CLRWDT 02A2: BTFSS 0C.4 02A3: GOTO 2A1 02A4: MOVWF 19 * 02A8: MOVF 49,W 02A9: CLRWDT 02AA: BTFSS 0C.4 02AB: GOTO 2A9 02AC: MOVWF 19 * 038D: MOVF 49,W 038E: CLRWDT 038F: BTFSS 0C.4 0390: GOTO 38E 0391: MOVWF 19 * 0395: MOVF 49,W 0396: CLRWDT 0397: BTFSS 0C.4 0398: GOTO 396 0399: MOVWF 19 * 039D: MOVF 49,W 039E: CLRWDT 039F: BTFSS 0C.4 03A0: GOTO 39E 03A1: MOVWF 19 * 03A6: MOVF 49,W 03A7: CLRWDT 03A8: BTFSS 0C.4 03A9: GOTO 3A7 03AA: MOVWF 19 * 03AE: MOVF 49,W 03AF: CLRWDT 03B0: BTFSS 0C.4 03B1: GOTO 3AF 03B2: MOVWF 19 * 03B6: MOVF 49,W 03B7: CLRWDT 03B8: BTFSS 0C.4 03B9: GOTO 3B7 03BA: MOVWF 19 * 0497: MOVF 49,W 0498: CLRWDT 0499: BTFSS 0C.4 049A: GOTO 498 049B: MOVWF 19 * 049F: MOVF 49,W 04A0: CLRWDT 04A1: BTFSS 0C.4 04A2: GOTO 4A0 04A3: MOVWF 19 * 04B4: MOVF 49,W 04B5: CLRWDT 04B6: BTFSS 0C.4 04B7: GOTO 4B5 04B8: MOVWF 19 * 04BC: MOVF 49,W 04BD: CLRWDT 04BE: BTFSS 0C.4 04BF: GOTO 4BD 04C0: MOVWF 19 * 04D1: MOVF 49,W 04D2: CLRWDT 04D3: BTFSS 0C.4 04D4: GOTO 4D2 04D5: MOVWF 19 * 04D9: MOVF 49,W 04DA: CLRWDT 04DB: BTFSS 0C.4 04DC: GOTO 4DA 04DD: MOVWF 19 * 04EE: MOVF 49,W 04EF: CLRWDT 04F0: BTFSS 0C.4 04F1: GOTO 4EF 04F2: MOVWF 19 * 04F6: MOVF 49,W 04F7: CLRWDT 04F8: BTFSS 0C.4 04F9: GOTO 4F7 04FA: MOVWF 19 * 050B: MOVF 49,W 050C: CLRWDT 050D: BTFSS 0C.4 050E: GOTO 50C 050F: MOVWF 19 * 0513: MOVF 49,W 0514: CLRWDT 0515: BTFSS 0C.4 0516: GOTO 514 0517: MOVWF 19 * 0545: MOVF 49,W 0546: CLRWDT 0547: BTFSS 0C.4 0548: GOTO 546 0549: MOVWF 19 * 054D: MOVF 49,W 054E: CLRWDT 054F: BTFSS 0C.4 0550: GOTO 54E 0551: MOVWF 19 * 0563: MOVF 49,W 0564: CLRWDT 0565: BTFSS 0C.4 0566: GOTO 564 0567: MOVWF 19 * 056B: MOVF 49,W 056C: CLRWDT 056D: BTFSS 0C.4 056E: GOTO 56C 056F: MOVWF 19 * 0573: MOVF 49,W 0574: CLRWDT 0575: BTFSS 0C.4 0576: GOTO 574 0577: MOVWF 19 * 057E: MOVF 49,W 057F: CLRWDT 0580: BTFSS 0C.4 0581: GOTO 57F 0582: MOVWF 19 * 0586: MOVF 49,W 0587: CLRWDT 0588: BTFSS 0C.4 0589: GOTO 587 058A: MOVWF 19 * 058E: MOVF 49,W 058F: CLRWDT 0590: BTFSS 0C.4 0591: GOTO 58F 0592: MOVWF 19 * 0597: MOVF 49,W 0598: CLRWDT 0599: BTFSS 0C.4 059A: GOTO 598 059B: MOVWF 19 * 059F: MOVF 49,W 05A0: CLRWDT 05A1: BTFSS 0C.4 05A2: GOTO 5A0 05A3: MOVWF 19 * 05A7: MOVF 49,W 05A8: CLRWDT 05A9: BTFSS 0C.4 05AA: GOTO 5A8 05AB: MOVWF 19 * 05B1: MOVF 49,W 05B2: CLRWDT 05B3: BTFSS 0C.4 05B4: GOTO 5B2 05B5: MOVWF 19 * 05B9: MOVF 49,W 05BA: CLRWDT 05BB: BTFSS 0C.4 05BC: GOTO 5BA 05BD: MOVWF 19 * 05C1: MOVF 49,W 05C2: CLRWDT 05C3: BTFSS 0C.4 05C4: GOTO 5C2 05C5: MOVWF 19 * 05CD: MOVF 49,W 05CE: CLRWDT 05CF: BTFSS 0C.4 05D0: GOTO 5CE 05D1: MOVWF 19 * 05D5: MOVF 49,W 05D6: CLRWDT 05D7: BTFSS 0C.4 05D8: GOTO 5D6 05D9: MOVWF 19 * 05DD: MOVF 49,W 05DE: CLRWDT 05DF: BTFSS 0C.4 05E0: GOTO 5DE 05E1: MOVWF 19 * 05E8: MOVF 49,W 05E9: CLRWDT 05EA: BTFSS 0C.4 05EB: GOTO 5E9 05EC: MOVWF 19 * 05F0: MOVF 49,W 05F1: CLRWDT 05F2: BTFSS 0C.4 05F3: GOTO 5F1 05F4: MOVWF 19 * 05F8: MOVF 49,W 05F9: CLRWDT 05FA: BTFSS 0C.4 05FB: GOTO 5F9 05FC: MOVWF 19 * 060E: MOVF 49,W 060F: CLRWDT 0610: BTFSS 0C.4 0611: GOTO 60F 0612: MOVWF 19 * 0616: MOVF 49,W 0617: CLRWDT 0618: BTFSS 0C.4 0619: GOTO 617 061A: MOVWF 19 * 061E: MOVF 49,W 061F: CLRWDT 0620: BTFSS 0C.4 0621: GOTO 61F 0622: MOVWF 19 * 0627: MOVF 49,W 0628: CLRWDT 0629: BTFSS 0C.4 062A: GOTO 628 062B: MOVWF 19 * 062F: MOVF 49,W 0630: CLRWDT 0631: BTFSS 0C.4 0632: GOTO 630 0633: MOVWF 19 * 0637: MOVF 49,W 0638: CLRWDT 0639: BTFSS 0C.4 063A: GOTO 638 063B: MOVWF 19 * 0686: MOVF 49,W 0687: CLRWDT 0688: BTFSS 0C.4 0689: GOTO 687 068A: MOVWF 19 * 068E: MOVF 49,W 068F: CLRWDT 0690: BTFSS 0C.4 0691: GOTO 68F 0692: MOVWF 19 .................... .................... } .................... .................... .................... .................... byte get_ansi_number() { .................... int tval1, tval2; .................... .................... // This routine grabs the numbers for the ANSI commands .................... // It is used for both row and column numbers which may be one or two digits .................... tval1 = read_buffer(process_idx) & 0x0F; // Quick & dirty ASCII conversion * 018C: MOVF 2F,W 018D: MOVWF 51 018E: MOVF 0B,W 018F: ANDWF 0B,W 0190: BCF 0B.7 0191: MOVWF 25 0192: CALL 068 0193: BTFSC 25.7 0194: BSF 0B.7 0195: MOVF 21,W 0196: ANDLW 0F 0197: MOVWF 45 .................... tval2 = read_buffer(++process_idx); 0198: INCF 2F,F 0199: MOVF 2F,W 019A: MOVWF 51 019B: MOVF 0B,W 019C: ANDWF 0B,W 019D: BCF 0B.7 019E: MOVWF 25 019F: CALL 068 01A0: BTFSC 25.7 01A1: BSF 0B.7 01A2: MOVF 21,W 01A3: MOVWF 46 .................... if ((tval2 > '/') && (tval2 < ':')) { 01A4: MOVF 46,W 01A5: SUBLW 2F 01A6: BTFSC 03.0 01A7: GOTO 1B7 01A8: MOVF 46,W 01A9: SUBLW 39 01AA: BTFSS 03.0 01AB: GOTO 1B7 .................... // Lets add it together and skip the ; .................... tval1 *= 10; // Move first digit to tens position 01AC: MOVF 45,W 01AD: MOVWF 47 01AE: MOVLW 0A 01AF: MOVWF 48 01B0: CALL 167 01B1: MOVF 21,W 01B2: MOVWF 45 .................... tval1 += (tval2 & 0x0F); // Grab ones digit & point to next char 01B3: MOVF 46,W 01B4: ANDLW 0F 01B5: ADDWF 45,F .................... process_idx++; 01B6: INCF 2F,F .................... } .................... return tval1; 01B7: MOVF 45,W 01B8: MOVWF 21 01B9: GOTO 1BA 01BA: RETLW 00 .................... } .................... .................... .................... // This routine converts an 4-bit hex value into an associated ASCII character .................... .................... byte byte_to_ascii(byte tdata) { .................... // Will automatically wipe out top 4 bits .................... if (tdata <= 9) { .................... return (tdata & 0x3F); .................... } else { .................... return ((tdata - 9) & 0x4F); .................... } .................... } .................... .................... .................... .................... .................... void move_cursor(int cx, int cy) { .................... .................... // Lets jump to the given location .................... printf(send_uart_serial, "{C%02u%02u", cx, cy); * 01D0: BTFSC 48.0 01D1: GOTO 1EF 01D2: BTFSC 48.1 01D3: GOTO 207 01D4: MOVF 47,W 01D5: MOVWF 49 01D6: MOVLW 64 01D7: MOVWF 4A 01D8: CALL 1BB 01D9: MOVF 20,W 01DA: MOVWF 47 01DB: MOVF 21,W 01DC: MOVLW 30 01DD: BTFSS 03.2 01DE: GOTO 1E4 01DF: BTFSC 48.2 01E0: GOTO 1EF 01E1: BTFSC 48.3 01E2: MOVLW 20 01E3: GOTO 1E6 01E4: BCF 48.2 01E5: BCF 48.3 01E6: ADDWF 21,F 01E7: MOVF 21,W 01E8: MOVWF 49 * 01EF: MOVF 47,W 01F0: MOVWF 49 01F1: MOVLW 0A 01F2: MOVWF 4A 01F3: CALL 1BB 01F4: MOVF 20,W 01F5: MOVWF 47 01F6: MOVF 21,W 01F7: MOVLW 30 01F8: BTFSS 03.2 01F9: GOTO 1FE 01FA: BTFSC 48.2 01FB: GOTO 207 01FC: BTFSC 48.3 01FD: MOVLW 20 01FE: ADDWF 21,F 01FF: MOVF 21,W 0200: MOVWF 49 * 0207: MOVLW 30 0208: ADDWF 47,F 0209: MOVF 47,W 020A: MOVWF 49 * 0211: RETLW 00 0212: MOVLW 7B 0213: MOVWF 49 * 021A: MOVLW 43 021B: MOVWF 49 * 0222: MOVF 45,W 0223: MOVWF 47 0224: MOVLW 01 0225: MOVWF 48 0226: CALL 1D0 0227: MOVF 46,W 0228: MOVWF 47 0229: MOVLW 01 022A: MOVWF 48 022B: CALL 1D0 022C: RETLW 00 .................... .................... } .................... .................... .................... .................... void main () { .................... int endbuff, x, y, sx, sy, rows, cols; .................... boolean wrap, skipgoto, timeok, local_mode; 022D: MOVLW 5F 022E: MOVWF 20 022F: MOVLW 21 0230: MOVWF 04 0231: CLRF 00 0232: INCF 04,F 0233: DECFSZ 20,F 0234: GOTO 231 0235: MOVLW 60 0236: MOVWF 20 0237: MOVLW A0 0238: MOVWF 04 0239: CLRF 00 023A: INCF 04,F 023B: DECFSZ 20,F 023C: GOTO 239 023D: CLRF 20 023E: CLRF 04 023F: MOVLW 1F 0240: ANDWF 03,F 0241: MOVLW 05 0242: BSF 03.5 0243: MOVWF 19 0244: MOVLW 22 0245: MOVWF 18 0246: MOVLW 90 0247: BCF 03.5 0248: MOVWF 18 .................... int b_time; .................... .................... // Setup chip Options .................... // Port B Pullups - ENABLED (0) .................... // Interrupt Edge - Don't Care (0) .................... // TMR0 Clock Source - Internal (0) .................... // TMR0 Source Edge - Don't Care (0) .................... // Prescaler assigned to - TMR0 (0) .................... // TMR0 Prescale - 1:256 (111) .................... OPTION = 0b00000111; 0249: MOVLW 07 024A: BSF 03.5 024B: MOVWF 01 .................... CREN = 0; // Stop serial inputs during init 024C: BCF 03.5 024D: BCF 18.4 .................... .................... // Set port directions which won't change .................... set_tris_a(0b11010000); 024E: MOVLW D0 024F: TRIS 5 .................... set_tris_b(0b11111111); 0250: MOVLW FF 0251: TRIS 6 .................... set_tris_c(0b10111100); 0252: MOVLW BC 0253: TRIS 7 .................... .................... rs485_enable = 0; 0254: BCF 07.1 .................... rs485_out = 1; 0255: BSF 07.0 .................... .................... // Turn off the LEDs & beeper. RESET BOB-II .................... porta = 0x0E; 0256: MOVLW 0E 0257: MOVWF 05 .................... delay_ms(50); 0258: MOVLW 32 0259: MOVWF 46 025A: CALL 105 .................... b2_reset = 1; 025B: BSF 05.5 .................... .................... // Initial values .................... s_idle = TRUE; 025C: BSF 3B.0 .................... p_idle = TRUE; 025D: BSF 3B.1 .................... .................... // Set the network address from the jumpers .................... thisnode[0] = 'T'; 025E: MOVLW 54 025F: MOVWF 36 .................... thisnode[1] = 'E'; 0260: MOVLW 45 0261: MOVWF 37 .................... thisnode[2] = 'R'; 0262: MOVLW 52 0263: MOVWF 38 .................... thisnode[3] = 'M'; 0264: MOVLW 4D 0265: MOVWF 39 .................... addr_num = (~portb & 0x07) + 48; 0266: MOVF 06,W 0267: XORLW FF 0268: ANDLW 07 0269: ADDLW 30 026A: MOVWF 34 .................... thisnode[4] = addr_num; 026B: MOVF 34,W 026C: MOVWF 3A .................... .................... // Lets start totalling up the checksum ahead of time .................... node_total = '#' + '0' + '0' + ' ' + ' ' + 'T' + 'E' + 'R' + 'M'; 026D: MOVLW FB 026E: MOVWF 33 .................... node_total += addr_num; 026F: MOVF 34,W 0270: ADDWF 33,F .................... chksum = 0x74 - (addr_num - 48); // This is a quick checksum to use in query response 0271: MOVLW 30 0272: SUBWF 34,W 0273: SUBLW 74 0274: MOVWF 35 .................... .................... // Setup display size .................... rows = 10; 0275: MOVLW 0A 0276: MOVWF 41 .................... cols = 27; 0277: MOVLW 1B 0278: MOVWF 42 .................... .................... // Lets enable the interrupts! .................... disable_interrupts(GLOBAL); 0279: BCF 0B.6 027A: BCF 0B.7 027B: BTFSC 0B.7 027C: GOTO 27A .................... enable_interrupts(INT_RDA); 027D: BSF 03.5 027E: BSF 0C.5 .................... enable_interrupts(GLOBAL); 027F: MOVLW C0 0280: BCF 03.5 0281: IORWF 0B,F .................... .................... // Clear the screen (reset probably did this anyway, but just in case) .................... printf(send_uart_serial, "{A"); delay_ms(5); 0282: MOVLW 7B 0283: MOVWF 49 * 028A: MOVLW 41 028B: MOVWF 49 * 0292: MOVLW 05 0293: MOVWF 46 0294: CALL 105 .................... .................... // Ensure we are in local mode. .................... // We'll use whatever defaults the BOB-II wants otherwise .................... printf(send_uart_serial, "{MF"); 0295: MOVLW 7B 0296: MOVWF 49 * 029D: MOVLW 4D 029E: MOVWF 49 * 02A5: MOVLW 46 02A6: MOVWF 49 .................... local_mode = TRUE; * 02AD: BSF 43.3 .................... .................... // Lets start up the serial receiver here to avoid an OERR on startup .................... CREN = 1; // Continuous receive enable = turn it on 02AE: BSF 18.4 .................... .................... go_data = FALSE; 02AF: BCF 3B.2 .................... .................... Buffer_Scan: .................... p_idle = TRUE; 02B0: BSF 3B.1 .................... process_idx = 0; 02B1: CLRF 2F .................... .................... // Lets wait until the buffer has a valid packet for our node .................... // If go_data goes true, we know we have a packet for THIS node .................... // We have already checked the checksum and node address .................... .................... while(!go_data) { 02B2: BTFSC 3B.2 02B3: GOTO 2C5 .................... restart_wdt(); 02B4: CLRWDT .................... .................... // Lets ensure that no serial error has disabled the serial input .................... if (OERR) { S_ERR = 0; CREN = 0; delay_cycles(1); CREN = 1; } 02B5: BTFSS 18.1 02B6: GOTO 2BB 02B7: BCF 05.1 02B8: BCF 18.4 02B9: NOP 02BA: BSF 18.4 .................... .................... // While we wait, lets check if the beeper needs to be shut off .................... if (timeok && T0IF) { 02BB: BTFSS 43.2 02BC: GOTO 2C4 02BD: BTFSS 0B.2 02BE: GOTO 2C4 .................... // The RTCC overflowed at some point. .................... T0IF = 0; // Clear overflow bit 02BF: BCF 0B.2 .................... if (--b_time == 0) { 02C0: DECFSZ 44,F 02C1: GOTO 2C4 .................... // Time out - lets turn off the output (its inverted) .................... beepout = 0; 02C2: BCF 05.0 .................... timeok = FALSE; // Stop monitoring the interrupt bit 02C3: BCF 43.2 .................... } .................... } .................... } 02C4: GOTO 2B2 .................... .................... // Okay, lets process the packet .................... go_data = FALSE; 02C5: BCF 3B.2 .................... endbuff = serial_idx; // So we know where the end of the buffer is! 02C6: MOVF 2E,W 02C7: MOVWF 3C .................... p_idle = FALSE; // We are processing a packet! 02C8: BCF 3B.1 .................... .................... // Give us some breathing room - point directly to command .................... if (checksum) { 02C9: BTFSS 3B.3 02CA: GOTO 2CE .................... process_idx = 10; 02CB: MOVLW 0A 02CC: MOVWF 2F .................... } else { 02CD: GOTO 2D0 .................... process_idx = 8; 02CE: MOVLW 08 02CF: MOVWF 2F .................... } .................... .................... // What is the command??Q or S= or R .................... switch(read_buffer(process_idx++)) { 02D0: MOVF 2F,W 02D1: INCF 2F,F 02D2: MOVWF 45 02D3: MOVWF 51 02D4: MOVF 0B,W 02D5: ANDWF 0B,W 02D6: BCF 0B.7 02D7: MOVWF 25 02D8: CALL 068 02D9: BTFSC 25.7 02DA: BSF 0B.7 02DB: MOVF 21,W 02DC: MOVWF 20 02DD: MOVLW 51 02DE: SUBWF 21,W 02DF: BTFSC 03.2 02E0: GOTO 2EA 02E1: MOVLW 52 02E2: SUBWF 20,W 02E3: BTFSC 03.2 02E4: GOTO 313 02E5: MOVLW 53 02E6: SUBWF 20,W 02E7: BTFSC 03.2 02E8: GOTO 323 02E9: GOTO 6D4 .................... .................... // Since we have no keypad, lets simply return 00 when queried .................... case('Q'): .................... .................... p_idle = TRUE; // We are done with the buffer 02EA: BSF 3B.1 .................... CREN = 0; // Turn off receiver for this section 02EB: BCF 18.4 .................... delay_ms(50); // Give the HCS a chance to get into rcv mode 02EC: MOVLW 32 02ED: MOVWF 46 02EE: CALL 105 .................... send_serial_byte('$'); 02EF: MOVLW 24 02F0: MOVWF 47 02F1: CALL 11C .................... if (checksum) { 02F2: BTFSS 3B.3 02F3: GOTO 2F9 .................... // Send checksum value calculated during startup .................... printf(send_serial_byte, "%2X", chksum); * 0145: BTFSC 46.7 0146: GOTO 157 0147: MOVLW 0F 0148: MOVWF 20 0149: SWAPF 45,W 014A: ANDWF 20,F 014B: MOVLW 0A 014C: SUBWF 20,W 014D: BTFSC 03.0 014E: GOTO 152 014F: MOVLW 30 0150: ADDWF 20,F 0151: GOTO 154 0152: MOVF 46,W 0153: ADDWF 20,F 0154: MOVF 20,W 0155: MOVWF 47 0156: CALL 11C 0157: MOVLW 0F 0158: ANDWF 45,F 0159: MOVLW 0A 015A: SUBWF 45,W 015B: BTFSC 03.0 015C: GOTO 15F 015D: MOVLW 30 015E: GOTO 161 015F: BCF 46.7 0160: MOVF 46,W 0161: ADDWF 45,F 0162: MOVF 45,W 0163: MOVWF 47 0164: CALL 11C 0165: BCF 0A.3 0166: GOTO 2F9 (RETURN) * 02F4: MOVF 35,W 02F5: MOVWF 45 02F6: MOVLW 37 02F7: MOVWF 46 02F8: GOTO 145 .................... } .................... printf(send_serial_byte, " TERM%c 00\n", addr_num); * 0044: BCF 0A.0 0045: BCF 0A.1 0046: BCF 0A.2 0047: ADDWF 02,F 0048: RETLW 20 0049: RETLW 54 004A: RETLW 45 004B: RETLW 52 004C: RETLW 4D 004D: RETLW 25 004E: RETLW 63 004F: RETLW 20 0050: RETLW 30 0051: RETLW 30 0052: RETLW 0A 0053: RETLW 00 * 02F9: CLRF 45 02FA: MOVF 45,W 02FB: CALL 044 02FC: INCF 45,F 02FD: MOVWF 47 02FE: CALL 11C 02FF: MOVLW 05 0300: SUBWF 45,W 0301: BTFSS 03.2 0302: GOTO 2FA 0303: MOVF 34,W 0304: MOVWF 47 0305: CALL 11C 0306: MOVLW 07 0307: MOVWF 46 0308: MOVF 46,W 0309: CALL 044 030A: INCF 46,F 030B: MOVWF 47 030C: CALL 11C 030D: MOVLW 0B 030E: SUBWF 46,W 030F: BTFSS 03.2 0310: GOTO 308 .................... CREN = 1; // Turn rcv back on 0311: BSF 18.4 .................... .................... break; 0312: GOTO 6D5 .................... .................... case('R'): .................... // Reset the system .................... // Trip the watchdog reset .................... disable_interrupts(GLOBAL); 0313: BCF 0B.6 0314: BCF 0B.7 0315: BTFSC 0B.7 0316: GOTO 314 .................... S_ERR = 0; LAN_IN = 0; TV_OUT = 0; 0317: BCF 05.1 0318: BCF 05.2 0319: BCF 05.3 .................... delay_ms(2000); 031A: MOVLW 08 031B: MOVWF 45 031C: MOVLW FA 031D: MOVWF 46 031E: CALL 105 031F: DECFSZ 45,F 0320: GOTO 31C .................... while(TRUE) {} // This will expire the watchdog 0321: GOTO 321 .................... break; 0322: GOTO 6D5 .................... .................... case('S'): .................... .................... TV_OUT = 0; 0323: BCF 05.3 .................... .................... // Lets send the data to the BOB-II and process any \ or Esc commands .................... while(++process_idx < endbuff) { 0324: INCF 2F,F 0325: MOVF 3C,W 0326: SUBWF 2F,W 0327: BTFSC 03.0 0328: GOTO 6D2 .................... .................... restart_wdt(); // Prevent a reset - we have 18ms to process each character. More than enough. 0329: CLRWDT .................... .................... // Lets scan the buffer and output to the LCD .................... // First lets check for an escape sequence (\) .................... scratch = read_buffer(process_idx); 032A: MOVF 2F,W 032B: MOVWF 51 032C: MOVF 0B,W 032D: ANDWF 0B,W 032E: BCF 0B.7 032F: MOVWF 25 0330: CALL 068 0331: BTFSC 25.7 0332: BSF 0B.7 0333: MOVF 21,W 0334: MOVWF 31 .................... if (scratch == '\\') { 0335: MOVF 31,W 0336: SUBLW 5C 0337: BTFSS 03.2 0338: GOTO 6B4 .................... switch (read_buffer(++process_idx)) { 0339: INCF 2F,F 033A: MOVF 2F,W 033B: MOVWF 51 033C: MOVF 0B,W 033D: ANDWF 0B,W 033E: BCF 0B.7 033F: MOVWF 25 0340: CALL 068 0341: BTFSC 25.7 0342: BSF 0B.7 0343: MOVF 21,W 0344: MOVWF 20 0345: MOVLW 62 0346: SUBWF 21,W 0347: BTFSC 03.2 0348: GOTO 38A 0349: MOVLW 63 034A: SUBWF 20,W 034B: BTFSC 03.2 034C: GOTO 3A3 034D: MOVLW 65 034E: SUBWF 20,W 034F: BTFSC 03.2 0350: GOTO 3BC 0351: MOVLW 66 0352: SUBWF 20,W 0353: BTFSC 03.2 0354: GOTO 542 0355: MOVLW 67 0356: SUBWF 20,W 0357: BTFSC 03.2 0358: GOTO 558 0359: MOVLW 68 035A: SUBWF 20,W 035B: BTFSC 03.2 035C: GOTO 55E 035D: MOVLW 69 035E: SUBWF 20,W 035F: BTFSC 03.2 0360: GOTO 579 0361: MOVLW 6A 0362: SUBWF 20,W 0363: BTFSC 03.2 0364: GOTO 594 0365: MOVLW 6B 0366: SUBWF 20,W 0367: BTFSC 03.2 0368: GOTO 5AE 0369: MOVLW 6C 036A: SUBWF 20,W 036B: BTFSC 03.2 036C: GOTO 5C8 036D: MOVLW 6D 036E: SUBWF 20,W 036F: BTFSC 03.2 0370: GOTO 5E3 0371: MOVLW 6E 0372: SUBWF 20,W 0373: BTFSC 03.2 0374: GOTO 5FE 0375: MOVLW 6F 0376: SUBWF 20,W 0377: BTFSC 03.2 0378: GOTO 60B 0379: MOVLW 70 037A: SUBWF 20,W 037B: BTFSC 03.2 037C: GOTO 624 037D: MOVLW 72 037E: SUBWF 20,W 037F: BTFSC 03.2 0380: GOTO 63D 0381: MOVLW 74 0382: SUBWF 20,W 0383: BTFSC 03.2 0384: GOTO 643 0385: MOVLW 78 0386: SUBWF 20,W 0387: BTFSC 03.2 0388: GOTO 654 0389: GOTO 6B2 .................... case 'b': .................... // Turn the display on .................... printf(send_uart_serial, "{BE"); 038A: MOVLW 7B 038B: MOVWF 49 * 0392: MOVLW 42 0393: MOVWF 49 * 039A: MOVLW 45 039B: MOVWF 49 .................... break; * 03A2: GOTO 6B3 .................... .................... case 'c': .................... // Turn the display off .................... printf(send_uart_serial, "{BD"); 03A3: MOVLW 7B 03A4: MOVWF 49 * 03AB: MOVLW 42 03AC: MOVWF 49 * 03B3: MOVLW 44 03B4: MOVWF 49 .................... break; * 03BB: GOTO 6B3 .................... .................... case 'e': .................... // Escape char! Could be lots of things! .................... // ESC[(idx);(scratch)(command letter) .................... .................... process_idx += 2; // Skip [ sign 03BC: MOVLW 02 03BD: ADDWF 2F,F .................... scratch = 0; // Default if not specified (idx is set below) 03BE: CLRF 31 .................... .................... // Lets figure out what digits we have here .................... idx = read_buffer(process_idx); 03BF: MOVF 2F,W 03C0: MOVWF 51 03C1: MOVF 0B,W 03C2: ANDWF 0B,W 03C3: BCF 0B.7 03C4: MOVWF 25 03C5: CALL 068 03C6: BTFSC 25.7 03C7: BSF 0B.7 03C8: MOVF 21,W 03C9: MOVWF 30 .................... if (idx > '/' && idx < ':') { 03CA: MOVF 30,W 03CB: SUBLW 2F 03CC: BTFSC 03.0 03CD: GOTO 3E7 03CE: MOVF 30,W 03CF: SUBLW 39 03D0: BTFSS 03.0 03D1: GOTO 3E7 .................... // We have a number - lets get it .................... idx = get_ansi_number(); 03D2: CALL 18C 03D3: MOVF 21,W 03D4: MOVWF 30 .................... if (read_buffer(process_idx) == ';') { 03D5: MOVF 2F,W 03D6: MOVWF 51 03D7: MOVF 0B,W 03D8: ANDWF 0B,W 03D9: BCF 0B.7 03DA: MOVWF 25 03DB: CALL 068 03DC: BTFSC 25.7 03DD: BSF 0B.7 03DE: MOVF 21,W 03DF: SUBLW 3B 03E0: BTFSS 03.2 03E1: GOTO 3E6 .................... // We have a second number .................... process_idx++; // Point to next number 03E2: INCF 2F,F .................... scratch = get_ansi_number(); 03E3: CALL 18C 03E4: MOVF 21,W 03E5: MOVWF 31 .................... } .................... } else { 03E6: GOTO 3E8 .................... // It was a command with no number - set to default value .................... idx = 0; 03E7: CLRF 30 .................... } .................... .................... // Now lets execute the proper routine based on the command letter .................... // Some commands will set this true to skip moving the cursor .................... skipgoto = FALSE; 03E8: BCF 43.1 .................... .................... switch (read_buffer(process_idx)) { 03E9: MOVF 2F,W 03EA: MOVWF 51 03EB: MOVF 0B,W 03EC: ANDWF 0B,W 03ED: BCF 0B.7 03EE: MOVWF 25 03EF: CALL 068 03F0: BTFSC 25.7 03F1: BSF 0B.7 03F2: MOVF 21,W 03F3: MOVWF 20 03F4: MOVLW 41 03F5: SUBWF 21,W 03F6: BTFSC 03.2 03F7: GOTO 43D 03F8: MOVLW 42 03F9: SUBWF 20,W 03FA: BTFSC 03.2 03FB: GOTO 446 03FC: MOVLW 43 03FD: SUBWF 20,W 03FE: BTFSC 03.2 03FF: GOTO 44F 0400: MOVLW 44 0401: SUBWF 20,W 0402: BTFSC 03.2 0403: GOTO 458 0404: MOVLW 48 0405: SUBWF 20,W 0406: BTFSC 03.2 0407: GOTO 461 0408: MOVLW 66 0409: SUBWF 20,W 040A: BTFSC 03.2 040B: GOTO 466 040C: MOVLW 67 040D: SUBWF 20,W 040E: BTFSC 03.2 040F: GOTO 46B 0410: MOVLW 6A 0411: SUBWF 20,W 0412: BTFSC 03.2 0413: GOTO 47C 0414: MOVLW 4B 0415: SUBWF 20,W 0416: BTFSC 03.2 0417: GOTO 481 0418: MOVLW 4A 0419: SUBWF 20,W 041A: BTFSC 03.2 041B: GOTO 490 041C: MOVLW 4D 041D: SUBWF 20,W 041E: BTFSC 03.2 041F: GOTO 4AB 0420: MOVLW 4E 0421: SUBWF 20,W 0422: BTFSC 03.2 0423: GOTO 4C8 0424: MOVLW 4F 0425: SUBWF 20,W 0426: BTFSC 03.2 0427: GOTO 4E5 0428: MOVLW 50 0429: SUBWF 20,W 042A: BTFSC 03.2 042B: GOTO 502 042C: MOVLW 73 042D: SUBWF 20,W 042E: BTFSC 03.2 042F: GOTO 51F 0430: MOVLW 75 0431: SUBWF 20,W 0432: BTFSC 03.2 0433: GOTO 525 0434: MOVLW 68 0435: SUBWF 20,W 0436: BTFSC 03.2 0437: GOTO 52A 0438: MOVLW 6C 0439: SUBWF 20,W 043A: BTFSC 03.2 043B: GOTO 531 043C: GOTO 538 .................... case 'A': .................... // Cursor UP .................... if (y > idx) { 043D: MOVF 3E,W 043E: SUBWF 30,W 043F: BTFSC 03.0 0440: GOTO 444 .................... y -= idx; 0441: MOVF 30,W 0442: SUBWF 3E,F .................... } else { 0443: GOTO 445 .................... y = 0; 0444: CLRF 3E .................... } .................... break; 0445: GOTO 53A .................... .................... case 'B': .................... // Cursor DOWN .................... y += idx; 0446: MOVF 30,W 0447: ADDWF 3E,F .................... if (y > rows) { y = rows; } 0448: MOVF 3E,W 0449: SUBWF 41,W 044A: BTFSC 03.0 044B: GOTO 44E 044C: MOVF 41,W 044D: MOVWF 3E .................... break; 044E: GOTO 53A .................... .................... case 'C': .................... // Cursor RIGHT .................... x += idx; 044F: MOVF 30,W 0450: ADDWF 3D,F .................... if (x > cols) { x = cols; } 0451: MOVF 3D,W 0452: SUBWF 42,W 0453: BTFSC 03.0 0454: GOTO 457 0455: MOVF 42,W 0456: MOVWF 3D .................... break; 0457: GOTO 53A .................... .................... case 'D': .................... // Cursor LEFT .................... if (x > idx) { 0458: MOVF 3D,W 0459: SUBWF 30,W 045A: BTFSC 03.0 045B: GOTO 45F .................... x -= idx; 045C: MOVF 30,W 045D: SUBWF 3D,F .................... } else { 045E: GOTO 460 .................... x = 0; 045F: CLRF 3D .................... } .................... break; 0460: GOTO 53A .................... .................... case 'H': .................... // Home cursor (but we'll accept numbers if they are there) .................... y = idx; x = scratch; 0461: MOVF 30,W 0462: MOVWF 3E 0463: MOVF 31,W 0464: MOVWF 3D .................... break; 0465: GOTO 53A .................... .................... case 'f': .................... // Move cursor to X,Y .................... y = idx; x = scratch; 0466: MOVF 30,W 0467: MOVWF 3E 0468: MOVF 31,W 0469: MOVWF 3D .................... break; 046A: GOTO 53A .................... .................... case 'g': .................... // Lets beep for a given period of time .................... if (idx > 10) idx = 10; 046B: MOVF 30,W 046C: SUBLW 0A 046D: BTFSC 03.0 046E: GOTO 471 046F: MOVLW 0A 0470: MOVWF 30 .................... beepout = 1; 0471: BSF 05.0 .................... b_time = idx * 10; 0472: MOVF 30,W 0473: MOVWF 47 0474: MOVLW 0A 0475: MOVWF 48 0476: CALL 167 0477: MOVF 21,W 0478: MOVWF 44 .................... set_rtcc(0x00); 0479: CLRF 01 .................... timeok = TRUE; 047A: BSF 43.2 .................... break; 047B: GOTO 53A .................... .................... case 'j': .................... // Jump to a specific ROW .................... // Move cursor to y,1 though we take an X number if present .................... y = idx; x = scratch; 047C: MOVF 30,W 047D: MOVWF 3E 047E: MOVF 31,W 047F: MOVWF 3D .................... break; 0480: GOTO 53A .................... .................... case 'K': .................... // Clear to end of line .................... for(idx = x; idx <= cols; idx++) { 0481: MOVF 3D,W 0482: MOVWF 30 0483: MOVF 30,W 0484: SUBWF 42,W 0485: BTFSS 03.0 0486: GOTO 48F .................... restart_wdt(); 0487: CLRWDT .................... putc(' '); 0488: MOVLW 20 0489: CLRWDT 048A: BTFSS 0C.4 048B: GOTO 489 048C: MOVWF 19 .................... } 048D: INCF 30,F 048E: GOTO 483 .................... break; 048F: GOTO 53A .................... .................... case 'J': .................... // ANSI Clear screen .................... if (idx == 2) { 0490: MOVF 30,W 0491: SUBLW 02 0492: BTFSS 03.2 0493: GOTO 4A9 .................... // Clear Screen .................... printf(send_uart_serial, "{A"); 0494: MOVLW 7B 0495: MOVWF 49 * 049C: MOVLW 41 049D: MOVWF 49 .................... delay_ms(5); * 04A4: MOVLW 05 04A5: MOVWF 46 04A6: CALL 105 .................... x = 0; y = 0; 04A7: CLRF 3D 04A8: CLRF 3E .................... } .................... skipgoto = TRUE; 04A9: BSF 43.1 .................... break; 04AA: GOTO 53A .................... .................... // Color commands .................... case 'M': .................... // Set the screen color in local mode only .................... if (local_mode && (idx < 8)) { 04AB: BTFSS 43.3 04AC: GOTO 4C6 04AD: MOVF 30,W 04AE: SUBLW 07 04AF: BTFSS 03.0 04B0: GOTO 4C6 .................... printf(send_uart_serial, "{F%u", idx); 04B1: MOVLW 7B 04B2: MOVWF 49 * 04B9: MOVLW 46 04BA: MOVWF 49 * 04C1: MOVF 30,W 04C2: MOVWF 47 04C3: MOVLW 0C 04C4: MOVWF 48 04C5: CALL 1D0 .................... } .................... skipgoto = TRUE; 04C6: BSF 43.1 .................... break; 04C7: GOTO 53A .................... .................... case 'N': .................... // Set character color .................... if (local_mode && (idx < 8)) { 04C8: BTFSS 43.3 04C9: GOTO 4E3 04CA: MOVF 30,W 04CB: SUBLW 07 04CC: BTFSS 03.0 04CD: GOTO 4E3 .................... printf(send_uart_serial, "{E%u", idx); 04CE: MOVLW 7B 04CF: MOVWF 49 * 04D6: MOVLW 45 04D7: MOVWF 49 * 04DE: MOVF 30,W 04DF: MOVWF 47 04E0: MOVLW 0C 04E1: MOVWF 48 04E2: CALL 1D0 .................... } .................... skipgoto = TRUE; 04E3: BSF 43.1 .................... break; 04E4: GOTO 53A .................... .................... case 'O': .................... // Set character cell color .................... if (local_mode && (idx < 8)) { 04E5: BTFSS 43.3 04E6: GOTO 500 04E7: MOVF 30,W 04E8: SUBLW 07 04E9: BTFSS 03.0 04EA: GOTO 500 .................... printf(send_uart_serial, "{D%u", idx); 04EB: MOVLW 7B 04EC: MOVWF 49 * 04F3: MOVLW 44 04F4: MOVWF 49 * 04FB: MOVF 30,W 04FC: MOVWF 47 04FD: MOVLW 0C 04FE: MOVWF 48 04FF: CALL 1D0 .................... } .................... skipgoto = TRUE; 0500: BSF 43.1 .................... break; 0501: GOTO 53A .................... .................... case 'P': .................... // Set character outline color .................... if (local_mode && (idx < 8)) { 0502: BTFSS 43.3 0503: GOTO 51D 0504: MOVF 30,W 0505: SUBLW 07 0506: BTFSS 03.0 0507: GOTO 51D .................... printf(send_uart_serial, "{I%u", idx); 0508: MOVLW 7B 0509: MOVWF 49 * 0510: MOVLW 49 0511: MOVWF 49 * 0518: MOVF 30,W 0519: MOVWF 47 051A: MOVLW 0C 051B: MOVWF 48 051C: CALL 1D0 .................... } .................... skipgoto = TRUE; 051D: BSF 43.1 .................... break; 051E: GOTO 53A .................... .................... case 's': .................... // Save current cursor position .................... sx = x; sy = y; 051F: MOVF 3D,W 0520: MOVWF 3F 0521: MOVF 3E,W 0522: MOVWF 40 .................... skipgoto = TRUE; 0523: BSF 43.1 .................... break; 0524: GOTO 53A .................... .................... case 'u': .................... // Restore saved cursor position .................... x = sx; y = sy; 0525: MOVF 3F,W 0526: MOVWF 3D 0527: MOVF 40,W 0528: MOVWF 3E .................... break; 0529: GOTO 53A .................... .................... case 'h': .................... // Turn on wrap mode .................... if (idx == 7) { wrap = TRUE; } 052A: MOVF 30,W 052B: SUBLW 07 052C: BTFSS 03.2 052D: GOTO 52F 052E: BSF 43.0 .................... skipgoto = TRUE; 052F: BSF 43.1 .................... break; 0530: GOTO 53A .................... .................... case 'l': .................... // Turn off wrap mode .................... if (idx == 7) { wrap = FALSE; } 0531: MOVF 30,W 0532: SUBLW 07 0533: BTFSS 03.2 0534: GOTO 536 0535: BCF 43.0 .................... skipgoto = TRUE; 0536: BSF 43.1 .................... break; 0537: GOTO 53A .................... .................... default: .................... skipgoto = TRUE; 0538: BSF 43.1 .................... break; 0539: GOTO 53A .................... } .................... .................... // A few commands don't require the cursor to move .................... if (!skipgoto) { move_cursor(x, y); } 053A: BTFSC 43.1 053B: GOTO 541 053C: MOVF 3D,W 053D: MOVWF 45 053E: MOVF 3E,W 053F: MOVWF 46 0540: CALL 212 .................... break; 0541: GOTO 6B3 .................... .................... case 'f': .................... // Clear the screen .................... printf(send_uart_serial, "{A"); 0542: MOVLW 7B 0543: MOVWF 49 * 054A: MOVLW 41 054B: MOVWF 49 .................... delay_ms(5); * 0552: MOVLW 05 0553: MOVWF 46 0554: CALL 105 .................... x = 0; y = 0; // Reset cursor position 0555: CLRF 3D 0556: CLRF 3E .................... break; 0557: GOTO 6B3 .................... .................... case 'g': .................... // Beep if we should .................... beepout = 1; 0558: BSF 05.0 .................... b_time = 6; 0559: MOVLW 06 055A: MOVWF 44 .................... set_rtcc(0x00); // Give us a more exact time 055B: CLRF 01 .................... timeok = TRUE; 055C: BSF 43.2 .................... break; 055D: GOTO 6B3 .................... .................... case 'h': .................... // Enable Character Backgrounds .................... if (local_mode) { printf(send_uart_serial, "{KE"); } 055E: BTFSS 43.3 055F: GOTO 578 0560: MOVLW 7B 0561: MOVWF 49 * 0568: MOVLW 4B 0569: MOVWF 49 * 0570: MOVLW 45 0571: MOVWF 49 .................... break; * 0578: GOTO 6B3 .................... .................... case 'i': .................... // Disable Character Backgrounds .................... if (local_mode) { printf(send_uart_serial, "{KD"); } 0579: BTFSS 43.3 057A: GOTO 593 057B: MOVLW 7B 057C: MOVWF 49 * 0583: MOVLW 4B 0584: MOVWF 49 * 058B: MOVLW 44 058C: MOVWF 49 .................... break; * 0593: GOTO 6B3 .................... .................... case 'j': .................... // Switch to local video mode .................... printf(send_uart_serial, "{MF"); 0594: MOVLW 7B 0595: MOVWF 49 * 059C: MOVLW 4D 059D: MOVWF 49 * 05A4: MOVLW 46 05A5: MOVWF 49 .................... local_mode = TRUE; * 05AC: BSF 43.3 .................... break; 05AD: GOTO 6B3 .................... .................... case 'k': .................... // Switch to genlock mode - TAKES A FEW SECONDS!!!! .................... // Any data sent to device during this period will be lost! .................... printf(send_uart_serial, "{MM"); 05AE: MOVLW 7B 05AF: MOVWF 49 * 05B6: MOVLW 4D 05B7: MOVWF 49 * 05BE: MOVLW 4D 05BF: MOVWF 49 .................... local_mode = FALSE; * 05C6: BCF 43.3 .................... break; 05C7: GOTO 6B3 .................... .................... case 'l': .................... // Color entire character grid with background color .................... if (local_mode) { printf(send_uart_serial, "{JD"); } 05C8: BTFSS 43.3 05C9: GOTO 5E2 05CA: MOVLW 7B 05CB: MOVWF 49 * 05D2: MOVLW 4A 05D3: MOVWF 49 * 05DA: MOVLW 44 05DB: MOVWF 49 .................... break; * 05E2: GOTO 6B3 .................... .................... case 'm': .................... // Color written character cells with background only .................... if (local_mode) { printf(send_uart_serial, "{JE"); } 05E3: BTFSS 43.3 05E4: GOTO 5FD 05E5: MOVLW 7B 05E6: MOVWF 49 * 05ED: MOVLW 4A 05EE: MOVWF 49 * 05F5: MOVLW 45 05F6: MOVWF 49 .................... break; * 05FD: GOTO 6B3 .................... .................... case 'n': .................... // New Line (linefeed + carriage return) .................... x=0; 05FE: CLRF 3D .................... if (y == rows) { 05FF: MOVF 41,W 0600: SUBWF 3E,W 0601: BTFSS 03.2 0602: GOTO 605 .................... y = 0; 0603: CLRF 3E .................... } else { 0604: GOTO 606 .................... y++; 0605: INCF 3E,F .................... } .................... move_cursor(0, y); 0606: CLRF 45 0607: MOVF 3E,W 0608: MOVWF 46 0609: CALL 212 .................... break; 060A: GOTO 6B3 .................... .................... case 'o': .................... // Blink on .................... printf(send_uart_serial, "{GE"); 060B: MOVLW 7B 060C: MOVWF 49 * 0613: MOVLW 47 0614: MOVWF 49 * 061B: MOVLW 45 061C: MOVWF 49 .................... break; * 0623: GOTO 6B3 .................... .................... case 'p': .................... // Blink off .................... printf(send_uart_serial, "{GD"); 0624: MOVLW 7B 0625: MOVWF 49 * 062C: MOVLW 47 062D: MOVWF 49 * 0634: MOVLW 44 0635: MOVWF 49 .................... break; * 063C: GOTO 6B3 .................... .................... case 'r': .................... // Carriage Return only .................... x=0; 063D: CLRF 3D .................... move_cursor(0, y); 063E: CLRF 45 063F: MOVF 3E,W 0640: MOVWF 46 0641: CALL 212 .................... break; 0642: GOTO 6B3 .................... .................... case 't': .................... // Tab 4, 8, 12, 16, 20... .................... x += 4 - ((x + 1) % 4); 0643: MOVLW 01 0644: ADDWF 3D,W 0645: ANDLW 03 0646: SUBLW 04 0647: ADDWF 3D,F .................... if (x > cols) { x = cols; } 0648: MOVF 3D,W 0649: SUBWF 42,W 064A: BTFSC 03.0 064B: GOTO 64E 064C: MOVF 42,W 064D: MOVWF 3D .................... move_cursor(x, y); 064E: MOVF 3D,W 064F: MOVWF 45 0650: MOVF 3E,W 0651: MOVWF 46 0652: CALL 212 .................... break; 0653: GOTO 6B3 .................... .................... case 'x': .................... // Next two bytes are a hex number! .................... // convert ascii to hex byte .................... scratch = ((gethexbyte(read_buffer(++process_idx)) << 4) | gethexbyte(read_buffer(++process_idx))); 0654: INCF 2F,F 0655: MOVF 2F,W 0656: MOVWF 51 0657: MOVF 0B,W 0658: ANDWF 0B,W 0659: BCF 0B.7 065A: MOVWF 25 065B: CALL 068 065C: BTFSC 25.7 065D: BSF 0B.7 065E: MOVF 21,W 065F: MOVWF 45 0660: MOVWF 52 0661: MOVF 0B,W 0662: ANDWF 0B,W 0663: BCF 0B.7 0664: MOVWF 25 0665: CALL 077 0666: BTFSC 25.7 0667: BSF 0B.7 0668: SWAPF 21,W 0669: MOVWF 47 066A: MOVLW F0 066B: ANDWF 47,F 066C: INCF 2F,F 066D: MOVF 2F,W 066E: MOVWF 51 066F: MOVF 0B,W 0670: ANDWF 0B,W 0671: BCF 0B.7 0672: MOVWF 25 0673: CALL 068 0674: BTFSC 25.7 0675: BSF 0B.7 0676: MOVF 21,W 0677: MOVWF 48 0678: MOVWF 52 0679: MOVF 0B,W 067A: ANDWF 0B,W 067B: BCF 0B.7 067C: MOVWF 25 067D: CALL 077 067E: BTFSC 25.7 067F: BSF 0B.7 0680: MOVF 47,W 0681: IORWF 21,W 0682: MOVWF 31 .................... .................... // Lets output the character .................... printf(send_uart_serial, "{T"); // Enter raw mode 0683: MOVLW 7B 0684: MOVWF 49 * 068B: MOVLW 54 068C: MOVWF 49 .................... putc(scratch); // Send the letter * 0693: MOVF 31,W 0694: CLRWDT 0695: BTFSS 0C.4 0696: GOTO 694 0697: MOVWF 19 .................... putc(27); // Send Escape code 0698: MOVLW 1B 0699: CLRWDT 069A: BTFSS 0C.4 069B: GOTO 699 069C: MOVWF 19 .................... .................... if (++x > cols) { 069D: INCF 3D,F 069E: MOVF 3D,W 069F: SUBWF 42,W 06A0: BTFSC 03.0 06A1: GOTO 6B1 .................... x = 0; 06A2: CLRF 3D .................... if (!wrap) { 06A3: BTFSC 43.0 06A4: GOTO 6AC .................... if (y == rows) { 06A5: MOVF 41,W 06A6: SUBWF 3E,W 06A7: BTFSS 03.2 06A8: GOTO 6AB .................... y = 0; 06A9: CLRF 3E .................... } else { 06AA: GOTO 6AC .................... y++; 06AB: INCF 3E,F .................... } .................... } .................... move_cursor(x, y); 06AC: MOVF 3D,W 06AD: MOVWF 45 06AE: MOVF 3E,W 06AF: MOVWF 46 06B0: CALL 212 .................... } .................... .................... break; 06B1: GOTO 6B3 .................... .................... default: .................... break; 06B2: GOTO 6B3 .................... } .................... } else { 06B3: GOTO 6D1 .................... // Lets output the character .................... .................... if (scratch != '{') { 06B4: MOVF 31,W 06B5: SUBLW 7B 06B6: BTFSC 03.2 06B7: GOTO 6D1 .................... // Prevent them from triggering commands .................... putc(scratch); 06B8: MOVF 31,W 06B9: CLRWDT 06BA: BTFSS 0C.4 06BB: GOTO 6B9 06BC: MOVWF 19 .................... if (++x > cols) { 06BD: INCF 3D,F 06BE: MOVF 3D,W 06BF: SUBWF 42,W 06C0: BTFSC 03.0 06C1: GOTO 6D1 .................... x = 0; 06C2: CLRF 3D .................... if (!wrap) { 06C3: BTFSC 43.0 06C4: GOTO 6CC .................... if (y == rows) { 06C5: MOVF 41,W 06C6: SUBWF 3E,W 06C7: BTFSS 03.2 06C8: GOTO 6CB .................... y = 0; 06C9: CLRF 3E .................... } else { 06CA: GOTO 6CC .................... y++; 06CB: INCF 3E,F .................... } .................... } .................... move_cursor(x, y); 06CC: MOVF 3D,W 06CD: MOVWF 45 06CE: MOVF 3E,W 06CF: MOVWF 46 06D0: CALL 212 .................... } .................... } .................... } .................... } // while loop 06D1: GOTO 324 .................... .................... TV_OUT = 1; 06D2: BSF 05.3 .................... .................... break; 06D3: GOTO 6D5 .................... .................... default: .................... break; 06D4: GOTO 6D5 .................... .................... } // Command case (Q, S, ?? .................... .................... goto Buffer_Scan; 06D5: GOTO 2B0 .................... .................... } .................... 06D6: SLEEP .................... .................... ....................