; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** SYMBOL VERSION_MAJOR = 0 ' 0.0 SYMBOL VERSION_MINOR = 0 ; .------------------------------------------------------------------------. ; | | ; | Target PICAXE-18X | ; | Compiler Used Revolution Programming Editor 4.1.4 | ; | Memory Used Approx 700 bytes of 2048 | ; | | ; | Author The Happy Hippy | ; | Web Site www.hippy.freeserve.co.uk/picaxebf.htm | ; | Email hippy@psynet.net | ; | | ; | Copyright (C) 2004, The Happy Hippy | ; | | ; `------------------------------------------------------------------------' ; .------------------------------------------------------------------------. ; | | ; | | ; | | ; `------------------------------------------------------------------------' SYMBOL codeByte = b0 SYMBOL flags = b1 SYMBOL debugFlag = bit8 SYMBOL m8Flag = bit9 SYMBOL opcode = b2 SYMBOL char = b3 SYMBOL sp = b4 SYMBOL number = w3 ; b7:b6 SYMBOL numberLsb = b6 SYMBOL numberMsb = b7 SYMBOL pc = w4 ; b9:b8 SYMBOL pcLsb = b8 SYMBOL pcMsb = b9 SYMBOL acc = w5 ; b11:b10 SYMBOL accLsb = b10 SYMBOL accMsb = b11 SYMBOL arg = w6 ; b13:b12 SYMBOL argLsb = b12 SYMBOL argMsb = b13 SYMBOL RX_BAUD = N4800 SYMBOL TX_BAUD = N4800 SYMBOL PULSIN_EDGE = 1 ; 0 to 1 transition ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** SYMBOL ARG_VAR = %00000000 SYMBOL ARG_NONE = %01000000 SYMBOL ARG_BYTEK = %10000000 SYMBOL ARG_WORDK = %11000000 SYMBOL ARG_BIT_NONE = bit6 SYMBOL ARG_BIT_K = bit7 SYMBOL ARG_BIT_WORDK = bit6 SYMBOL OPC_GET = %00000 | ARG_VAR SYMBOL OPC_GTI = %00001 | ARG_BYTEK SYMBOL OPC_PUT = %00010 | ARG_BYTEK SYMBOL OPC_PTI = %00011 | ARG_BYTEK SYMBOL OPC_ADD = %00100 | ARG_VAR SYMBOL OPC_SUB = %00101 | ARG_VAR SYMBOL OPC_MPY = %00110 | ARG_VAR SYMBOL OPC_DIV = %00111 | ARG_VAR SYMBOL OPC_MOD = %01000 | ARG_VAR SYMBOL OPC_AND = %01001 | ARG_VAR SYMBOL OPC_OR = %01010 | ARG_VAR SYMBOL OPC_XOR = %01011 | ARG_VAR SYMBOL OPC_EQ = %01100 | ARG_VAR SYMBOL OPC_NE = %01101 | ARG_VAR SYMBOL OPC_GT = %01110 | ARG_VAR SYMBOL OPC_GE = %01111 | ARG_VAR SYMBOL OPC_LT = %10000 | ARG_VAR SYMBOL OPC_LE = %10001 | ARG_VAR SYMBOL OPC_TXT = %10010 | ARG_VAR SYMBOL OPC_43 = %10011 | ARG_NONE SYMBOL OPC_BSR = %10100 | ARG_BYTEK SYMBOL OPC_BRA = %10101 | ARG_BYTEK SYMBOL OPC_BEQ = %10110 | ARG_BYTEK SYMBOL OPC_BNE = %10111 | ARG_BYTEK SYMBOL OPC_JSR = %11000 | ARG_WORDK SYMBOL OPC_JMP = %11001 | ARG_WORDK SYMBOL OPC_JEQ = %11010 | ARG_WORDK SYMBOL OPC_JNE = %11011 | ARG_WORDK SYMBOL OPC_RTS = %11100 | ARG_NONE SYMBOL OPC_FLG = %11101 | ARG_VAR SYMBOL OPC_NOP = %11110 | ARG_NONE SYMBOL OPC_USR = %11111 | ARG_VAR ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** SYMBOL OPC_ADD_BK = OPC_ADD | ARG_BYTEK SYMBOL OPC_SUB_BK = OPC_SUB | ARG_BYTEK SYMBOL OPC_MPY_BK = OPC_MPY | ARG_BYTEK SYMBOL OPC_DIV_BK = OPC_DIV | ARG_BYTEK SYMBOL OPC_MOD_BK = OPC_MOD | ARG_BYTEK SYMBOL OPC_AND_BK = OPC_AND | ARG_BYTEK SYMBOL OPC_OR_BK = OPC_OR | ARG_BYTEK SYMBOL OPC_XOR_BK = OPC_XOR | ARG_BYTEK SYMBOL OPC_EQ_BK = OPC_EQ | ARG_BYTEK SYMBOL OPC_NE_BK = OPC_NE | ARG_BYTEK SYMBOL OPC_GT_BK = OPC_GT | ARG_BYTEK SYMBOL OPC_GE_BK = OPC_GE | ARG_BYTEK SYMBOL OPC_LT_BK = OPC_LT | ARG_BYTEK SYMBOL OPC_LE_BK = OPC_LE | ARG_BYTEK SYMBOL OPC_GET_BK = OPC_GET | ARG_BYTEK SYMBOL OPC_ADD_WK = OPC_ADD | ARG_WORDK SYMBOL OPC_SUB_WK = OPC_SUB | ARG_WORDK SYMBOL OPC_MPY_WK = OPC_MPY | ARG_WORDK SYMBOL OPC_DIV_WK = OPC_DIV | ARG_WORDK SYMBOL OPC_MOD_WK = OPC_MOD | ARG_WORDK SYMBOL OPC_AND_WK = OPC_AND | ARG_WORDK SYMBOL OPC_OR_WK = OPC_OR | ARG_WORDK SYMBOL OPC_XOR_WK = OPC_XOR | ARG_WORDK SYMBOL OPC_EQ_WK = OPC_EQ | ARG_WORDK SYMBOL OPC_NE_WK = OPC_NE | ARG_WORDK SYMBOL OPC_GT_WK = OPC_GT | ARG_WORDK SYMBOL OPC_GE_WK = OPC_GE | ARG_WORDK SYMBOL OPC_LT_WK = OPC_LT | ARG_WORDK SYMBOL OPC_LE_WK = OPC_LE | ARG_WORDK SYMBOL OPC_GET_WK = OPC_GET | ARG_WORDK SYMBOL OPC_BRF = OPC_BEQ | ARG_BYTEK ; Branch if False ( = 0 ) SYMBOL OPC_BRT = OPC_BNE | ARG_BYTEK ; Branch if True ( <> 0 ) SYMBOL OPC_BNT = OPC_BEQ | ARG_BYTEK ; Branch if Not True ( = 0 ) SYMBOL OPC_BNF = OPC_BNE | ARG_BYTEK ; Branch if Not False ( <> 0 ) SYMBOL OPC_JPF = OPC_JEQ | ARG_WORDK ; Jump if False ( = 0 ) SYMBOL OPC_JPT = OPC_JNE | ARG_WORDK ; Jump if True ( <> 0 ) SYMBOL OPC_JNT = OPC_JEQ | ARG_WORDK ; Jump if Not True ( = 0 ) SYMBOL OPC_JNF = OPC_JNE | ARG_WORDK ; Jump if Not False ( <> 0 ) SYMBOL OPC_TXT_BK = OPC_TXT | ARG_BYTEK SYMBOL OPC_TXT_WK = OPC_TXT | ARG_WORDK SYMBOL OPC_END = OPC_USR | ARG_NONE SYMBOL OPC_USR_BK = OPC_USR | ARG_BYTEK SYMBOL OPC_USR_WK = OPC_USR | ARG_WORDK SYMBOL OPC_FLG_BK = OPC_FLG | ARG_BYTEK ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** SYMBOL VAR_B = $00 SYMBOL VAR_B0 = VAR_B+0 ; 0 50 SYMBOL VAR_B1 = VAR_B+1 ; 1 51 SYMBOL VAR_B2 = VAR_B+2 ; 2 52 SYMBOL VAR_B3 = VAR_B+3 ; 3 53 SYMBOL VAR_B4 = VAR_B+4 ; 4 54 SYMBOL VAR_B5 = VAR_B+5 ; 5 55 SYMBOL VAR_B6 = VAR_B+6 ; 6 56 SYMBOL VAR_B7 = VAR_B+7 ; 7 57 SYMBOL VAR_B8 = VAR_B+8 ; 8 58 SYMBOL VAR_B9 = VAR_B+9 ; 9 59 SYMBOL VAR_B10 = VAR_B+10 ; A 5A SYMBOL VAR_B11 = VAR_B+11 ; B 5B SYMBOL VAR_B12 = VAR_B+12 ; C 5C SYMBOL VAR_B13 = VAR_B+13 ; D 5D SYMBOL VAR_B14 = VAR_B+14 ; E 5E SYMBOL VAR_B15 = VAR_B+15 ; F 5F SYMBOL VAR_B16 = VAR_B+16 ; 10 60 SYMBOL VAR_B17 = VAR_B+17 ; 11 61 SYMBOL VAR_B18 = VAR_B+18 ; 12 62 SYMBOL VAR_B19 = VAR_B+19 ; 13 63 SYMBOL VAR_B20 = VAR_B+20 ; 14 64 SYMBOL VAR_B21 = VAR_B+21 ; 15 65 SYMBOL VAR_B22 = VAR_B+22 ; 16 66 SYMBOL VAR_B23 = VAR_B+23 ; 17 67 SYMBOL VAR_B24 = VAR_B+24 ; 18 68 SYMBOL VAR_B25 = VAR_B+25 ; 19 69 SYMBOL VAR_B26 = VAR_B+26 ; 1A 6A SYMBOL VAR_B27 = VAR_B+27 ; 1B 6B SYMBOL VAR_B28 = VAR_B+28 ; 1C 6C SYMBOL VAR_B29 = VAR_B+29 ; 1D 6D SYMBOL VAR_B30 = VAR_B+30 ; 1E 6E SYMBOL VAR_B31 = VAR_B+31 ; 1F 6F SYMBOL VAR_B32 = VAR_B+32 ; 20 70 SYMBOL VAR_B33 = VAR_B+33 ; 21 71 SYMBOL VAR_B34 = VAR_B+34 ; 22 72 SYMBOL VAR_B35 = VAR_B+35 ; 23 73 SYMBOL VAR_B36 = VAR_B+36 ; 24 74 SYMBOL VAR_B37 = VAR_B+37 ; 25 75 SYMBOL VAR_B38 = VAR_B+38 ; 26 76 SYMBOL VAR_B39 = VAR_B+39 ; 27 77 SYMBOL VAR_B40 = VAR_B+40 ; 28 78 SYMBOL VAR_B41 = VAR_B+41 ; 29 79 SYMBOL VAR_B42 = VAR_B+42 ; 2A 7A SYMBOL VAR_B43 = VAR_B+43 ; 2B 7B SYMBOL VAR_B44 = VAR_B+44 ; 2C 7C SYMBOL VAR_B45 = VAR_B+45 ; 2D 7D SYMBOL VAR_B46 = VAR_B+46 ; 2E 7E SYMBOL VAR_B47 = VAR_B+47 ; 2F 7F SYMBOL VAR_B48 = VAR_B+48 ; 30 C0 SYMBOL VAR_B49 = VAR_B+49 ; 31 C1 SYMBOL VAR_B50 = VAR_B+50 ; 32 C2 SYMBOL VAR_B51 = VAR_B+51 ; 33 C3 SYMBOL VAR_B52 = VAR_B+52 ; 34 C4 SYMBOL VAR_B53 = VAR_B+53 ; 35 C5 SYMBOL VAR_B54 = VAR_B+54 ; 36 C6 SYMBOL VAR_B55 = VAR_B+55 ; 37 C7 SYMBOL VAR_B56 = VAR_B+56 ; 38 C8 SYMBOL VAR_B57 = VAR_B+57 ; 39 C9 SYMBOL VAR_B58 = VAR_B+58 ; 3A CA SYMBOL VAR_B59 = VAR_B+59 ; 3B CB SYMBOL VAR_B60 = VAR_B+60 ; 3C CC SYMBOL VAR_B61 = VAR_B+61 ; 3D CD SYMBOL VAR_B62 = VAR_B+62 ; 3E CE SYMBOL VAR_B63 = VAR_B+63 ; 3F CF SYMBOL VAR_B64 = VAR_B+64 ; 40 D0 SYMBOL VAR_B65 = VAR_B+65 ; 41 D1 SYMBOL VAR_B66 = VAR_B+66 ; 42 D2 SYMBOL VAR_B67 = VAR_B+67 ; 43 D3 SYMBOL VAR_B68 = VAR_B+68 ; 44 D4 SYMBOL VAR_B69 = VAR_B+69 ; 45 D5 SYMBOL VAR_B70 = VAR_B+70 ; 46 D6 SYMBOL VAR_B71 = VAR_B+71 ; 47 D7 SYMBOL VAR_B72 = VAR_B+72 ; 48 D8 SYMBOL VAR_B73 = VAR_B+73 ; 49 D9 SYMBOL VAR_B74 = VAR_B+74 ; 4A DA SYMBOL VAR_B75 = VAR_B+75 ; 4B DB SYMBOL VAR_B76 = VAR_B+76 ; 4C DC SYMBOL VAR_B77 = VAR_B+77 ; 4D DD SYMBOL VAR_B78 = VAR_B+78 ; 4E DE SYMBOL VAR_B79 = VAR_B+79 ; 4F DF SYMBOL VAR_B80 = VAR_B+80 ; 50 E0 SYMBOL VAR_B81 = VAR_B+81 ; 51 E1 SYMBOL VAR_B82 = VAR_B+82 ; 52 E2 SYMBOL VAR_B83 = VAR_B+83 ; 53 E3 SYMBOL VAR_B84 = VAR_B+84 ; 54 E4 SYMBOL VAR_B85 = VAR_B+85 ; 55 E5 SYMBOL VAR_B86 = VAR_B+86 ; 56 E6 SYMBOL VAR_B87 = VAR_B+87 ; 57 E7 SYMBOL VAR_B88 = VAR_B+88 ; 58 E8 SYMBOL VAR_B89 = VAR_B+89 ; 59 E9 SYMBOL VAR_B90 = VAR_B+90 ; 5A EA SYMBOL VAR_B91 = VAR_B+91 ; 5B EB SYMBOL VAR_B92 = VAR_B+92 ; 5C EC SYMBOL VAR_B93 = VAR_B+93 ; 5D ED SYMBOL VAR_B94 = VAR_B+94 ; 5E EE SYMBOL VAR_B95 = VAR_B+95 ; 5F EF SYMBOL VAR_W = VAR_B95+1 SYMBOL VAR_W0 = VAR_W+0 ; 60 51:50 SYMBOL VAR_W1 = VAR_W+1 ; 61 53:52 SYMBOL VAR_W2 = VAR_W+2 ; 62 55:54 SYMBOL VAR_W3 = VAR_W+3 ; 63 57:56 SYMBOL VAR_W4 = VAR_W+4 ; 64 59:58 SYMBOL VAR_W5 = VAR_W+5 ; 65 5B:5A SYMBOL VAR_W6 = VAR_W+6 ; 66 5D:5C SYMBOL VAR_W7 = VAR_W+7 ; 67 5F:5E SYMBOL VAR_W8 = VAR_W+8 ; 68 61:60 SYMBOL VAR_W9 = VAR_W+9 ; 69 63:62 SYMBOL VAR_W10 = VAR_W+10 ; 6A 65:64 SYMBOL VAR_W11 = VAR_W+11 ; 6B 67:66 SYMBOL VAR_W12 = VAR_W+12 ; 6C 69:68 SYMBOL VAR_W13 = VAR_W+13 ; 6D 6B:6A SYMBOL VAR_W14 = VAR_W+14 ; 6E 6D:6C SYMBOL VAR_W15 = VAR_W+15 ; 6F 6F:6E SYMBOL VAR_W16 = VAR_W+16 ; 70 71:70 SYMBOL VAR_W17 = VAR_W+17 ; 71 73:72 SYMBOL VAR_W18 = VAR_W+18 ; 72 75:74 SYMBOL VAR_W19 = VAR_W+19 ; 73 77:76 SYMBOL VAR_W20 = VAR_W+20 ; 74 79:78 SYMBOL VAR_W21 = VAR_W+21 ; 75 7B:7A SYMBOL VAR_W22 = VAR_W+22 ; 76 7D:7C SYMBOL VAR_W23 = VAR_W+23 ; 77 7F:7E SYMBOL VAR_W24 = VAR_W+24 ; 78 C1:C0 SYMBOL VAR_W25 = VAR_W+25 ; 79 C3:C2 SYMBOL VAR_W26 = VAR_W+26 ; 7A C5:C4 SYMBOL VAR_W27 = VAR_W+27 ; 7B C7:C6 SYMBOL VAR_W28 = VAR_W+28 ; 7C C9:C8 SYMBOL VAR_W29 = VAR_W+29 ; 7D CB:CA SYMBOL VAR_W30 = VAR_W+30 ; 7E CD:CC SYMBOL VAR_W31 = VAR_W+31 ; 7F CF:CE SYMBOL VAR_W32 = VAR_W+32 ; 80 D1:D0 SYMBOL VAR_W33 = VAR_W+33 ; 81 D3:D2 SYMBOL VAR_W34 = VAR_W+34 ; 82 D5:D4 SYMBOL VAR_W35 = VAR_W+35 ; 83 D7:D6 SYMBOL VAR_W36 = VAR_W+36 ; 84 D9:D8 SYMBOL VAR_W37 = VAR_W+37 ; 85 DB:DA SYMBOL VAR_W38 = VAR_W+38 ; 86 DD:DC SYMBOL VAR_W39 = VAR_W+39 ; 87 DF:DE SYMBOL VAR_W40 = VAR_W+40 ; 88 E1:E0 SYMBOL VAR_W41 = VAR_W+41 ; 89 E3:E2 SYMBOL VAR_W42 = VAR_W+42 ; 8A E5:E4 SYMBOL VAR_W43 = VAR_W+43 ; 8B E7:E6 SYMBOL VAR_W44 = VAR_W+44 ; 8C E9:E8 SYMBOL VAR_W45 = VAR_W+45 ; 8D EB:EA SYMBOL VAR_W46 = VAR_W+46 ; 8E ED:EC SYMBOL VAR_W47 = VAR_W+47 ; 8F EF:EE SYMBOL VAR_BIT = VAR_W47+1 SYMBOL VAR_BIT0 = VAR_BIT+0 ; 90 50:0 SYMBOL VAR_BIT1 = VAR_BIT+1 ; 91 50:1 SYMBOL VAR_BIT2 = VAR_BIT+2 ; 92 50:2 SYMBOL VAR_BIT3 = VAR_BIT+3 ; 93 50:3 SYMBOL VAR_BIT4 = VAR_BIT+4 ; 94 50:4 SYMBOL VAR_BIT5 = VAR_BIT+5 ; 95 50:5 SYMBOL VAR_BIT6 = VAR_BIT+6 ; 96 50:6 SYMBOL VAR_BIT7 = VAR_BIT+7 ; 97 51:7 SYMBOL VAR_BIT8 = VAR_BIT+8 ; 98 51:0 SYMBOL VAR_BIT9 = VAR_BIT+9 ; 99 51:1 SYMBOL VAR_BIT10 = VAR_BIT+10 ; 9A 51:2 SYMBOL VAR_BIT11 = VAR_BIT+11 ; 9B 51:3 SYMBOL VAR_BIT12 = VAR_BIT+12 ; 9C 51:4 SYMBOL VAR_BIT13 = VAR_BIT+13 ; 9D 51:5 SYMBOL VAR_BIT14 = VAR_BIT+14 ; 9E 52:6 SYMBOL VAR_BIT15 = VAR_BIT+15 ; 9F 52:7 SYMBOL VAR_BIT16 = VAR_BIT+16 ; A0 52:0 SYMBOL VAR_BIT17 = VAR_BIT+17 ; A1 52:1 SYMBOL VAR_BIT18 = VAR_BIT+18 ; A2 52:2 SYMBOL VAR_BIT19 = VAR_BIT+19 ; A3 52:3 SYMBOL VAR_BIT20 = VAR_BIT+20 ; A4 52:4 SYMBOL VAR_BIT21 = VAR_BIT+21 ; A5 53:5 SYMBOL VAR_BIT22 = VAR_BIT+22 ; A6 53:6 SYMBOL VAR_BIT23 = VAR_BIT+23 ; A7 53:7 SYMBOL VAR_BIT24 = VAR_BIT+24 ; A8 53:0 SYMBOL VAR_BIT25 = VAR_BIT+25 ; A9 53:1 SYMBOL VAR_BIT26 = VAR_BIT+26 ; AA 53:2 SYMBOL VAR_BIT27 = VAR_BIT+27 ; AB 53:3 SYMBOL VAR_BIT28 = VAR_BIT+28 ; AC 54:4 SYMBOL VAR_BIT29 = VAR_BIT+29 ; AD 54:5 SYMBOL VAR_BIT30 = VAR_BIT+30 ; AE 54:6 SYMBOL VAR_BIT31 = VAR_BIT+31 ; AF 54:7 SYMBOL VAR_PIN = VAR_BIT31+1 SYMBOL VAR_PIN0 = VAR_PIN+0 ; B0 SYMBOL VAR_PIN1 = VAR_PIN+1 ; B1 SYMBOL VAR_PIN2 = VAR_PIN+2 ; B2 SYMBOL VAR_PIN3 = VAR_PIN+3 ; B3 SYMBOL VAR_PIN4 = VAR_PIN+4 ; B4 SYMBOL VAR_PIN5 = VAR_PIN+5 ; B5 SYMBOL VAR_PIN6 = VAR_PIN+6 ; B6 SYMBOL VAR_PIN7 = VAR_PIN+7 ; B7 SYMBOL VAR_PINS = VAR_PIN7+1 ; B8 SYMBOL VAR_SERIN = VAR_PINS+1 : SYMBOL VAR_SEROUT = VAR_SERIN SYMBOL VAR_SERIN0 = VAR_SERIN+0 : SYMBOL VAR_SEROUT0 = VAR_SERIN0 ; B9 SYMBOL VAR_SERIN1 = VAR_SERIN+1 : SYMBOL VAR_SEROUT1 = VAR_SERIN1 ; BA SYMBOL VAR_SERIN2 = VAR_SERIN+2 : SYMBOL VAR_SEROUT2 = VAR_SERIN2 ; BB SYMBOL VAR_SERIN3 = VAR_SERIN+3 : SYMBOL VAR_SEROUT3 = VAR_SERIN3 ; BC SYMBOL VAR_SERIN4 = VAR_SERIN+4 : SYMBOL VAR_SEROUT4 = VAR_SERIN4 ; BD SYMBOL VAR_SERIN5 = VAR_SERIN+5 : SYMBOL VAR_SEROUT5 = VAR_SERIN5 ; BE SYMBOL VAR_SERIN6 = VAR_SERIN+6 : SYMBOL VAR_SEROUT6 = VAR_SERIN6 ; BF SYMBOL VAR_SERIN7 = VAR_SERIN+7 : SYMBOL VAR_SEROUT7 = VAR_SERIN7 ; C0 SYMBOL VAR_A2D = VAR_SERIN7+1 : SYMBOL VAR_SERVO = VAR_A2D SYMBOL VAR_A2D0 = VAR_A2D+0 : SYMBOL VAR_SERVO0 = VAR_A2D0 ; C1 SYMBOL VAR_A2D1 = VAR_A2D+1 : SYMBOL VAR_SERVO1 = VAR_A2D1 ; C2 SYMBOL VAR_A2D2 = VAR_A2D+2 : SYMBOL VAR_SERVO2 = VAR_A2D2 ; C3 SYMBOL VAR_A2D3 = VAR_A2D+3 : SYMBOL VAR_SERVO3 = VAR_A2D3 ; C4 SYMBOL VAR_A2D4 = VAR_A2D+4 : SYMBOL VAR_SERVO4 = VAR_A2D4 ; C5 SYMBOL VAR_A2D5 = VAR_A2D+5 : SYMBOL VAR_SERVO5 = VAR_A2D5 ; C6 SYMBOL VAR_A2D6 = VAR_A2D+6 : SYMBOL VAR_SERVO6 = VAR_A2D6 ; C7 SYMBOL VAR_A2D7 = VAR_A2D+7 : SYMBOL VAR_SERVO7 = VAR_A2D7 ; C8 SYMBOL VAR_PULSIN = VAR_SERIN7+1 : SYMBOL VAR_PULSOUT = VAR_PULSIN SYMBOL VAR_PULSIN0 = VAR_PULSIN+0 : SYMBOL VAR_PULSOUT0 = VAR_PULSIN0 ; C9 SYMBOL VAR_PULSIN1 = VAR_PULSIN+1 : SYMBOL VAR_PULSOUT1 = VAR_PULSIN1 ; CA SYMBOL VAR_PULSIN2 = VAR_PULSIN+2 : SYMBOL VAR_PULSOUT2 = VAR_PULSIN2 ; CB SYMBOL VAR_PULSIN3 = VAR_PULSIN+3 : SYMBOL VAR_PULSOUT3 = VAR_PULSIN3 ; CC SYMBOL VAR_PULSIN4 = VAR_PULSIN+4 : SYMBOL VAR_PULSOUT4 = VAR_PULSIN4 ; CD SYMBOL VAR_PULSIN5 = VAR_PULSIN+5 : SYMBOL VAR_PULSOUT5 = VAR_PULSIN5 ; CE SYMBOL VAR_PULSIN6 = VAR_PULSIN+6 : SYMBOL VAR_PULSOUT6 = VAR_PULSIN6 ; CF SYMBOL VAR_PULSIN7 = VAR_PULSIN+7 : SYMBOL VAR_PULSOUT7 = VAR_PULSIN7 ; D0 SYMBOL VAR_RANDOM = VAR_PULSIN7+1 : SYMBOL VAR_SERTXD = VAR_RANDOM ; D1 SYMBOL VAR_PC = VAR_RANDOM+1 ; D2 SYMBOL VAR_SP = VAR_PC+1 ; D3 ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** SYMBOL FLG_CLR_DBG = $00 SYMBOL FLG_CLR_4MHZ = $11 SYMBOL FLG_CLR_8MHZ = $01 SYMBOL FLG_CLR_2 = $02 SYMBOL FLG_CLR_3 = $03 SYMBOL FLG_CLR_4 = $04 SYMBOL FLG_CLR_5 = $05 SYMBOL FLG_CLR_6 = $06 SYMBOL FLG_CLR_7 = $07 SYMBOL FLG_SET_DBG = $10 SYMBOL FLG_SET_4MHZ = $01 SYMBOL FLG_SET_8MHZ = $11 SYMBOL FLG_SET_2 = $12 SYMBOL FLG_SET_3 = $13 SYMBOL FLG_SET_4 = $14 SYMBOL FLG_SET_5 = $15 SYMBOL FLG_SET_6 = $16 SYMBOL FLG_SET_7 = $17 ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** SYMBOL SFR_PAGE0_MIN = $50 SYMBOL SFR_PAGE0_MAX = $7F SYMBOL SFR_PAGE1_MIN = $C0 SYMBOL SFR_PAGE1_MAX = $EF SYMBOL IP0 = pin0 SYMBOL IP1 = pin1 SYMBOL IP2 = pin2 SYMBOL IP3 = 0 SYMBOL IP4 = 0 SYMBOL IP5 = 0 SYMBOL IP6 = pin6 SYMBOL IP7 = pin7 SYMBOL BACK = $00 ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** ; To speed execution up, we copy the first 256 bytes of I2C EEPROM ; to on-chip Data EEPROM. This mechanism also means that we can run ; program code in I2C EEPROM or in Data EEPROM. We can force code in ; Data EEPROM to be executed by either not fitting I2C EEPROM, or by ; writing an OPC_END or $FF to location $0000 of the I2C EEPROM. CacheFirstPageOfCode: ; If the I2C memory has been wiped ( OPC_END or $FF put in loc $0000, ; or the EEPROM returns $FF because it's not present ) then we assume ; that the program has been burnt into EEPROM and is ready to run from ; there. pc = $0000 GOSUB ReadCodeByteFromI2C codeByte = codeByte & OPC_END IF codeByte = OPC_END THEN StartInterpreter ; Copy the first 256 bytes of I2C EEPROM into Data EEPROM. We only ; write to the Data EEPROM if it doesn't already contain the value ; we need. This prevents the data EEPROM being written to on every ; power-on reset. FOR pc = $0000 TO $00FF GOSUB ReadCodeByteFromI2C READ pcLsb,opcode IF opcode = codeByte THEN AlreadyCached WRITE pcLsb,codeByte AlreadyCached: NEXT ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** StartInterpreter: ; Clear SFR which isn't automatically cleared by the PICAXE itself. FOR pc = SFR_PAGE1_MIN TO SFR_PAGE1_MAX POKE pc,0 NEXT pc = $0000 sp = $F0 ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** Fetch: IF debugFlag = 0 THEN Fetch1 SERTXD( CR,LF ) number = pc GOSUB ShowHexWord Fetch1: GOSUB ReadCodeByte opcode = codeByte IF debugFlag = 0 THEN Fetch2 SERTXD( " " ) FOR numberLsb = 0 TO 2 numberMsb = opcode & $1F * 3 + numberLsb ' 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F LOOKUP numberMsb,("GETGTIPUTPTIADDSUBMPYDIVMODANDOR XOREQ NE GT GE LT LE TXT43 BSRBRABEQBNEJSRJMPJEQJNERTSFLGNOPEND"),char SERTXD( char ) NEXT Fetch2: IF ARG_BIT_K = 1 THEN HasArgK IF ARG_BIT_NONE = 1 THEN HasArgNone HasArgV: IF debugFlag = 0 THEN HasArgV1 SERTXD( " " ) HasArgV1: GOSUB ReadCodeByte IF debugFlag = 0 THEN HasArgV2 number = codeByte GOSUB ShowHexByte HasArgV2: GOSUB GetVar IF debugFlag = 0 THEN Execute SERTXD( " " ) GOTO Execute HasArgK: IF ARG_BIT_WORDK = 1 THEN HasArgWordK HasArgByteK: IF debugFlag = 0 THEN HasArgByteK1 SERTXD( "_BK " ) HasArgByteK1: GOSUB ReadCodeByte arg = codeByte GOTO Execute HasArgWordK: IF debugFlag = 0 THEN HasArgWordK1 SERTXD( "_WK " ) HasArgWordK1: GOSUB ReadCodeByte argMsb = codeByte GOSUB ReadCodeByte argLsb = codeByte GOTO Execute HasArgNone: IF debugFlag = 0 THEN Execute SERTXD( " " ) Execute: IF debugFlag = 0 THEN Execute1 number = arg GOSUB ShowHexWord SERTXD( 9 ) number = acc GOSUB ShowHexWord Execute1: GOSUB ObeyOpcode IF debugFlag = 0 THEN Fetch SERTXD( "->" ) number = acc GOSUB ShowHexWord GOTO Fetch ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** ObeyOpcode: codeByte = opcode / %00000100 & %00000111 opcode = opcode & %00000011 BRANCH codeByte,( Opc0,Opc1,Opc2,Opc3,Opc4,Opc5,Opc6,Opc7 ) Opc0: BRANCH opcode,( GET_Obey , GTI_Obey , PUT_Obey , PTI_Obey ) Opc1: BRANCH opcode,( ADD_Obey , SUB_Obey , MPY_Obey , DIV_Obey ) Opc2: BRANCH opcode,( MOD_Obey , AND_Obey , OR_Obey , XOR_Obey ) Opc3: BRANCH opcode,( EQ_Obey , NE_Obey , GT_Obey , GE_Obey ) Opc4: BRANCH opcode,( LT_Obey , LE_Obey , TXT_Obey , XXX_Obey ) Opc5: BRANCH opcode,( BSR_Obey , BRA_Obey , BEQ_Obey , BNE_Obey ) Opc6: BRANCH opcode,( JSR_Obey , JMP_Obey , JEQ_Obey , JNE_Obey ) Opc7: BRANCH opcode,( RTS_Obey , FLG_Obey , NOP_Obey , END_Obey ) ; .------------------------------------------------------------------------. ; | | ; | | ; | | ; `------------------------------------------------------------------------' ADD_Obey: acc = acc + arg : RETURN SUB_Obey: acc = acc - arg : RETURN MPY_Obey: acc = acc * arg : RETURN DIV_Obey: acc = acc / arg : RETURN MOD_Obey: acc = acc // arg : RETURN AND_Obey: acc = acc & arg : RETURN OR_Obey: acc = acc | arg : RETURN XOR_Obey: acc = acc ^ arg : RETURN EQ_Obey: IF acc = arg THEN SetTrue : GOTO SetFalse NE_Obey: IF acc <> arg THEN SetTrue : GOTO SetFalse GT_Obey: IF acc > arg THEN SetTrue : GOTO SetFalse GE_Obey: IF acc >= arg THEN SetTrue : GOTO SetFalse LT_Obey: IF acc < arg THEN SetTrue : GOTO SetFalse LE_Obey: IF acc <= arg THEN SetTrue : GOTO SetFalse SetFalse: acc = 0 :RETURN SetTrue: acc = $FFFF :RETURN ; .------------------------------------------------------------------------. ; | | ; | | ; | | ; `------------------------------------------------------------------------' JEQ_Obey: IF acc = 0 THEN JMP_Obey : RETURN JNE_Obey: IF acc <> 0 THEN JMP_Obey : RETURN JSR_Obey: sp = sp-1 : POKE sp,pcLsb sp = sp-1 : POKE sp,pcMsb JMP_Obey: pc = arg XXX_Obey: NOP_Obey: RETURN BRA_Obey: IF arg >= $80 THEN BRA_ObeyBwd IF arg <> $00 THEN BRA_ObeyFwd GOSUB ReadCodeByte arg = -codeByte BRA_ObeyBwd: argMsb = $FF BRA_ObeyFwd: pc = pc+arg-1 RETURN BEQ_Obey: IF arg >= $80 THEN BEQ_ObeyBwd IF arg <> $00 THEN BEQ_ObeyFwd GOSUB ReadCodeByte arg = -codeByte BEQ_ObeyBwd: argMsb = $FF BEQ_ObeyFwd: IF acc <> 0 THEN NOP_Obey pc = pc+arg-1 RETURN BNE_Obey: IF arg >= $80 THEN BNE_ObeyBwd IF arg <> $00 THEN BNE_ObeyFwd GOSUB ReadCodeByte arg = -codeByte BNE_ObeyBwd: argMsb = $FF BNE_ObeyFwd: IF acc = 0 THEN NOP_Obey pc = pc+arg-1 RETURN BSR_Obey: IF arg >= $80 THEN BSR_ObeyBwd IF arg <> $00 THEN BSR_ObeyFwd GOSUB ReadCodeByte arg = -codeByte BSR_ObeyBwd: argMsb = $FF BSR_ObeyFwd: sp = sp+1 : POKE sp,pcLsb sp = sp+1 : POKE sp,pcMsb pc = pc+arg-1 RETURN RTS_Obey: PEEK sp,pcMsb : sp = sp+1 PEEK sp,pcLsb : sp = sp+1 RETURN ; .------------------------------------------------------------------------. ; | | ; | TXT_BK length | ; | byte1 | ; | : | ; | byteN | ; | | ; | TXT_BK 0 | ; | byte | ; | : | ; | byte | ; | 0 | ; | | ; `------------------------------------------------------------------------' TXT_Obey: acc = pc IF arg <> 0 THEN TXT_Obey2 TXT_Obey1: GOSUB ReadCodeByte IF codeByte <> 0 THEN TXT_Obey1 TXT_Obey2: pc = pc+arg RETURN ; .------------------------------------------------------------------------. ; | | ; | | ; | | ; `------------------------------------------------------------------------' FLG_Obey: number = arg & 7 | $100 FLG_Obey1: IF numberLsb=0 THEN FLG_Obey2 numberMsb = numberMsb*2 numberLsb = numberLsb-1 IF numberLsb<>0 THEN FLG_Obey1 FLG_Obey2: IF arg >= $10 THEN FLG_ObeySet FLG_ObeyClear: flags = numberMsb ^ $FF & flags GOTO SetOperatingSpeed FLG_ObeySet: flags = flags | numberMsb GOTO SetOperatingSpeed ; .------------------------------------------------------------------------. ; | | ; | | ; | | ; `------------------------------------------------------------------------' GTI_Obey: IF argMsb = 0 Then GTI_VarObey number = pc pc = arg GOSUB ReadCodeByte pc = number acc = codeByte RETURN GTI_VarObey: codeByte = argLsb GOSUB GetVar GET_Obey: acc = arg RETURN ; .------------------------------------------------------------------------. ; | | ; | | ; | | ; `------------------------------------------------------------------------' PTI_Obey: PEEK argLsb,codeByte GOTO PUT_Obey1 PUT_Obey: codeByte = argLsb PUT_Obey1: GOTO PutVar ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** ReadCodeByte: IF pcMsb <> 0 THEN ReadCodeByteFromI2C ReadCodeByteFromEEPROM: READ pcLsb,codeByte pc = pc+1 RETURN ReadCodeByteFromI2C: SETFREQ M4 codeByte = $FF ; ******* pc = pc+1 SetOperatingSpeed: IF m8Flag = 1 THEN SetOperatingSpeed8MHz SetOperatingSpeed4MHz: SETFREQ M4 RETURN SetOperatingSpeed8MHz: SETFREQ M8 RETURN ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** GetVar: IF codeByte > VAR_BIT31 THEN GetVarSpecial IF codeByte <= VAR_B47 THEN GetByteSfrPage0 IF codeByte <= VAR_B95 THEN GetByteSfrPage1 IF codeByte <= VAR_W23 THEN GetWordSfrPage0 IF codeByte <= VAR_W47 THEN GetWordSfrPage1 GetVarBit: number = codeByte & 7 | $100 GetVarBit1: IF numberLsb=0 THEN GetVarBit2 numberMsb = numberMsb*2 numberLsb = numberLsb-1 IF numberLsb<>0 THEN GetVarBit1 GetVarBit2: codeByte = codeByte / 8 + SFR_PAGE0_MIN PEEK codeByte,argLsb arg = argLsb & numberMsb MAX 1 RETURN GetVarSpecial: IF codeByte <= VAR_PIN7 THEN GetPin IF codeByte <= VAR_PINS THEN GetPins IF codeByte <= VAR_SERIN7 THEN GetSerIn IF codeByte <= VAR_A2D7 THEN GetA2d IF codeByte <= VAR_PULSIN7 THEN GetPulsIn IF codeByte <= VAR_RANDOM THEN GetRandom IF codeByte <= VAR_PC THEN GetPc IF codeByte <= VAR_SP THEN GetSp arg = 0 RETURN GetByteSfrPage0: codeByte = codeByte+SFR_PAGE0_MIN argMsb = 0 PEEK codeByte,argLsb RETURN GetByteSfrPage1: codeByte = codeByte-VAR_B48+SFR_PAGE1_MIN argMsb = 0 PEEK codeByte,argLsb RETURN GetWordSfrPage0: codeByte = codeByte-VAR_W0*2+SFR_PAGE0_MIN PEEK codeByte,argLsb codeByte = codeByte+1 PEEK codeByte,argMsb RETURN GetWordSfrPage1: codeByte = codeByte-VAR_W24*2+SFR_PAGE1_MIN PEEK codeByte,argLsb codeByte = codeByte+1 PEEK codeByte,argMsb RETURN GetPin: codeByte = codeByte-VAR_PIN0 LOOKUP codeByte,( IP0,IP1,IP2,IP3,IP4,IP5,IP6,IP7 ),arg RETURN GetPins: arg = pins RETURN GetA2d: codeByte = codeByte-VAR_A2D0 READADC codeByte,arg RETURN GetSerIn: codeByte = codeByte-VAR_SERIN0 SERIN codeByte,RX_BAUD,arg RETURN GetPulsIn: codeByte = codeByte-VAR_PULSIN0 PULSIN codeByte,PULSIN_EDGE,arg RETURN GetRandom: PEEK $BE,argLsb PEEK $BF,argMsb RANDOM arg POKE $BE,argLsb POKE $BF,argMsb RETURN GetPc: arg = pc RETURN GetSp: arg = sp-1 RETURN ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** PutVar: IF codeByte > VAR_BIT31 THEN PutVarSpecial IF codeByte <= VAR_B47 THEN PutByteSfrPage0 IF codeByte <= VAR_B95 THEN PutByteSfrPage1 IF codeByte <= VAR_W23 THEN PutWordSfrPage0 IF codeByte <= VAR_W47 THEN PutWordSfrPage1 PutVarBit: number = codeByte & 7 | $100 PutVarBit1: IF numberLsb=0 THEN PutVarBit2 numberMsb = numberMsb*2 numberLsb = numberLsb-1 IF numberLsb<>0 THEN PutVarBit1 PutVarBit2: codeByte = codeByte / 8 + SFR_PAGE0_MIN PEEK codeByte,argLsb IF acc <> 0 THEN PutVarBitSet PutVarBitClear: numberMsb = numberMsb ^ $FF & argLsb POKE codeByte,numberLsb RETURN PutVarBitSet: numberMsb = numberMsb | argLsb POKE codeByte,numberLsb RETURN PutVarSpecial: IF codeByte <= VAR_PIN7 THEN PutPin IF codeByte <= VAR_PINS THEN PutPins IF codeByte <= VAR_SERIN7 THEN PutSerOut IF codeByte <= VAR_A2D7 THEN PutServo IF codeByte <= VAR_PULSIN7 THEN PutPulsOut IF codeByte <= VAR_RANDOM THEN PutSERTXD IF codeByte <= VAR_PC THEN PutPc IF codeByte <= VAR_SP THEN PutSp RETURN PutByteSfrPage0: codeByte = codeByte+SFR_PAGE0_MIN POKE codeByte,accLsb RETURN PutByteSfrPage1: codeByte = codeByte-VAR_B48+SFR_PAGE1_MIN POKE codeByte,accLsb RETURN PutWordSfrPage0: codeByte = codeByte-VAR_W0*2+SFR_PAGE0_MIN POKE codeByte,accLsb codeByte = codeByte+1 POKE codeByte,accMsb RETURN PutWordSfrPage1: codeByte = codeByte-VAR_W24*2+SFR_PAGE1_MIN POKE codeByte,accLsb codeByte = codeByte+1 POKE codeByte,accMsb RETURN PutPin: codeByte = codeByte-VAR_PIN0 IF acc <> 0 THEN PutPinHigh PutPinLow: LOW codeByte RETURN PutPinHigh: HIGH codeByte RETURN PutPins: pins = accLsb RETURN PutServo: codeByte = codeByte-VAR_A2D0 SERVO codeByte,acc RETURN PutSerOut: codeByte = codeByte-VAR_SERIN0 SEROUT codeByte,TX_BAUD,( accLsb ) RETURN PutPulsOut: codeByte = codeByte-VAR_PULSIN0 PULSOUT codeByte,acc RETURN PutSERTXD: SERTXD ( accLsb ) RETURN PutPc: pc = arg RETURN PutSp: sp = arg-1 RETURN ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** ShowHexWord: char = numberMsb / 16 | "0" IF char <= "9" THEN ShowHexWordMsNibbleOkay char = char + 7 ' char - "0" - 10 + "A" ShowHexWordMsNibbleOkay: SERTXD( char ) char = numberMsb & $0F | "0" IF char <= "9" THEN ShowHexWordLsNibbleOkay char = char + 7 ' char - "0" - 10 + "A" ShowHexWordLsNibbleOkay: SERTXD( char ) ShowHexByte: char = numberLsb / 16 | "0" IF char <= "9" THEN ShowHexByteMsNibbleOkay char = char + 7 ' char - "0" - 10 + "A" ShowHexByteMsNibbleOkay: SERTXD( char ) char = numberLsb & $0F | "0" IF char <= "9" THEN ShowHexByteLsNibbleOkay char = char + 7 ' char - "0" - 10 + "A" ShowHexByteLsNibbleOkay: SERTXD( char ) RETURN ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** END_Obey: END RETURN ; ***************************************************************************** ; * * ; * ; * * ; ***************************************************************************** EEPROM ( OPC_FLG_BK , FLG_CLR_DBG ) EEPROM ( OPC_FLG_BK , FLG_SET_4MHZ ) EEPROM ( OPC_GET_BK , "A" ) EEPROM ( OPC_SUB_BK , 1 ) EEPROM ( OPC_PUT , VAR_B0 ) EEPROM ( OPC_GET , VAR_B0 ) EEPROM ( OPC_ADD_BK , 1 ) EEPROM ( OPC_PUT , VAR_B0 ) EEPROM ( OPC_GET , VAR_B0 ) EEPROM ( OPC_PUT , VAR_SERTXD ) EEPROM ( OPC_EQ_BK , "Z" ) EEPROM ( OPC_BRF , BACK , 14 ) EEPROM ( OPC_GET_WK , LF , CR ) EEPROM ( OPC_PUT , VAR_SERTXD ) EEPROM ( OPC_DIV_WK , $01 , $00 ) EEPROM ( OPC_PUT , VAR_SERTXD ) EEPROM ( OPC_END ) ; .------------------------------------------------------------------------. ; | | ; | | ; | | ; `------------------------------------------------------------------------' EEPROM ( OPC_FLG_BK , FLG_CLR_DBG ) EEPROM ( OPC_FLG_BK , FLG_SET_8MHZ ) EEPROM ( OPC_GET , VAR_PINS ) EEPROM ( OPC_XOR_BK , $FF ) EEPROM ( OPC_PUT , VAR_PINS ) EEPROM ( OPC_BRA , BACK , 8 ) ; ***************************************************************************** ; * * ; * ; * * ; *****************************************************************************