/* File: cmplc56k.h PMAC Compiled PLC Motorola DSP 56000 defines Author(s): Ed Lay 08/03/93 EBL Created Change log: Date Rev Who Description --------- ----- ----- ----------------------------------------- 01/11/4 EBL Changes for windows DLL 02/09/4 EBL Changes for integer math & size of 56k used 03/08/5 EBL ADD LADDER FUNCTION BLOCK CODE 03/04/99 EBL CHNG STRING CMD USE OF R2 TO R4 FOR TURBO 06/01/99 EBL CHNG PLCN & 0 BUFFER ADDRESSES 10/12/99 EBL CHNG ENDWCODE LENGTH */ // //*************************************************************** //** Instruction Defines ** //*************************************************************** #define JSR 0x0D0000 #define JSRL 0x0BF080 #define MOVItoN4 0x3C0000 // MOV IMMEDIATE SHORT TO REG 'N4' #define MOVILtoN4 0x74F400 // MOV IMMEDIATE LONG TO REG 'N4' #define MOVA1toN4 0x219C00 // "MOVE A1,N4" #define MOVA1toN5 0x219D00 // "MOVE A1,N5" #define MOVItoR1 0x61F400 // MOV IMMEDIATE LONG TO REG 'R1' #define MOVItoR2 0x62F400 // MOVE #LONG_ADDR,R2 #define MOVEAtoXR4 0x565C00 // MOVE A,X:(R4)+ #define MOVER4toXSM 0x640000 // MOVE R4,X:ADDR short + ADDR << 8 #define MOVER4toYSM 0x6C0000 // MOVE R4,Y:ADDR short + ADDR << 8 #define MOVEYLMtoR4 0x6CF000 // MOVE Y:$2000,R4 #define MOVItoR4 0x64F400 // MOV IMMEDIATE LONG TO REG 'R4' #define MOVIStoR4 0x340000 // MOV IMMEDIATE SHORT TO REG 'R4' #define MOVItoB0 0x51F400 // MOV IMMEDIATE LONG TO REG 'B0' #define MOVItoB1 0x55F400 // MOV IMMEDIATE LONG TO REG 'B1' #define MOVIStoB0 0x290000 // MOV IMMEDIATE SHORT TO REG 'B0'#=MID 8 bit #define MOVIStoB1 0x2D0000 // MOV IMMEDIATE SHORT TO REG 'B1' #define MOVIStoB 0x2F0000 // MOV IMMEDIATE SHORT TO REG 'B' #=MID 8 bit #define MOVILtoB 0x57F400 // MOV IMMEDIATE LONG TO REG 'B' #define MOVItoR5 0x65F400 // MOV IMMEDIATE LONG TO REG 'R5' #define MOVEMR4toP 0x077094 // MOVEM R4,P:$ADDR #define MOVEMPtoR4 0x07F094 // MOVEM P:$ADDR,R4 // // 56K code for ADDRESS command // #define MOVEMPtoX0 0x07F084 // MOVEM P:$ADDR,X0 #define MOVEMPtoX1 0x07F085 // MOVEM P:$ADDR,X1 #define MOVEMPtoA 0x07F08E // MOVEM P:$ADDR,A #define CLRA 0x200013 // CLR A #define CLRB 0x20001B // CLR B #define MOVIStoA 0x2E0000 // MOV IMMEDIATE SHORT TO REG 'A' #define MOVILtoA 0x56F400 // MOV IMMEDIATE LONG TO REG 'A' #define MOVIStoA1 0x2C0000 // MOVE IMMEDIATE SHORT TO REG 'A1' #define MOVIStoA0 0x280000 // MOVE IMMEDIATE SHORT TO REG 'A0' #define MOVILtoA0 0x50F400 // MOV IMMEDIATE LONG TO REG 'A0' #define NOTAISX1 0x250017 // NOT A #SDATA,X1 #define NOTAXADRtoY1 0x47F017 // NOT A X:#ADDR,Y1 #define ANDX0A 0x200046 // AND X0,A #define ORX1A 0x200062 // OR X1,A #define MOVEMA1toP 0x07708C // MOVEM A1,P:#$ADDR #define ANDILA 0x0140C6 // AND #$LONG,A #define ANDISA 0x014086 // AND #$SHORT,A // data << 8 #define ORILA 0x0140C2 // OR #$LONG,A #define MOVECSRtoY0 0x0446B9 // MOVEC SR,Y0 #define MOVECY0toSR 0x04C6B9 // MOVEC Y0,SR #define ORIintrBLK 0x0003F8 // ORI #%00000011,MR // // 56K code for CMD ^ command // #define MOVA1XR3 0x545B00 // MOVE A1,X:(R3)+ // // 56K code for String commands SEND, SENDP, SENDS, CMD // #define MOVEMR4toP 0x077094 // MOVEM R4,P:$ADDR #define MOVEYMtoA 0x5EF000 // MOVE Y:$ADDR,A ADDR = CMD_STACK #define MOVEYSMtoA 0x5E8000 // MOVE Y:$SADDR,A + $SADDR << 8 #define TSTAItoX1 0x45F403 // TST A #ADDRofSTRING,X1 #define TSTAItoR1 0x61F403 // TST A #ADDRofSTRING,R1 #define MOVEMR1toA 0x07D98E // MOVEM P:(R1)+,A #define ADDX1AItoX0 0x24FF60 // ADD X1,A #$FF,X0 #define ANDX0toB 0x20004E // AND X0,B #define ADDY1toAB0toB 0x212F70 // ADD Y1,A B0,B #define MOVEA1toYM 0x5C7000 // MOVE A1,Y:$CMD_STACK #define CLRB_R5toR4 0x22B41B // CLR B R5,R4 #define MOVER4toR5 0x229500 // MOVE R4,R5 #define MOVEMPtoB1 0x07F08D // MOVEM P:$C.S ADDR,B1 #define MOVEMPtoB 0x07F08F // MOVEM P:$C.S ADDR,B #define MOVEYR5toR5 0x6DE500 // MOVE Y:(R5),R5 #define MOVEYR5toR1 0x69E500 // MOVE Y:(R5),R1 #define MOVXP_BASEtoR5 0x65A400 // MOVE X:P_BASE,R5 #define MOVXP_BASEtoR4 0x64A400 // MOVE X:P_BASE,R4 // // 56K code for Q Write // #define MOVEMPRtoR5 0x07ED95 // MOVEM P:(R5+N5),R5 #define MOVItoN5 0x3D0000 // MOVE #QNUM,N5 ; where QNUM < 256 #define MOVILtoN5 0x75F400 // MOVE #QNUM,N5 ; LONG MOVE #define MOVEILtoN5 0x75F400 // MOVE #QNUM,N5 ; LONG MOVE #define MOVEILtoM5 0x05F425 // MOVE #$3FF,M5 #define MOVEAtoR5N5 0x486D00 // MOVE A,L:(R5+N5) #define MOVEAtoR4N4 0x486C00 // MOVE A,L:(R4+N4) #define MOVEAtoR4 0x486400 // MOVE A,L:(R4) #define MOVEA1toXR4N4 0x546C00 // MOVE A1,X:(R4+N4) #define MOVEA1toXR4 0x546400 // MOVE A1,X:(R4) #define MOVEM4toM5 0x0465A4 // MOVE M4,M5 // // 56K code for Q Read // #define MOVELR5N5toA 0x48ED00 // MOVE L:(R5+N5),A #define MOVELR5N5toX 0x42ED00 // MOVE L:(R5+N5),X #define MOVELR4N4toA 0x48EC00 // MOVE L:(R4+N4),A #define MOVELR4N4toX 0x42EC00 // MOVE L:(R4+N4),X #define MOVELR4toA 0x48E400 // MOVE L:(R4),A #define MOVELR4toX 0x42E400 // MOVE L:(R4),X #define MOVELR5toX 0x42E500 // MOVE L:(R5),X #define MOVEXR4N4toA 0x56EC00 // MOVE X:(R4+N4),A #define MOVEXR4N4toX1 0x45EC00 // MOVE X:(R4+N4),X1 #define MOVEXR4toA 0x56E400 // MOVE X:(R4),A #define MOVEXR4toX1 0x45E400 // MOVE X:(R4),X1 // // Lnn L-Variable code // #define NOTA 0x200017 // NOT A ; for "=" compare need the NOT #define NOTA_AtoB 0x21CF17 // NOT A A,B #define NOTB 0x20001F // NOT B #define MOV0toA0 0x280000 // MOVE #0,A0 ; CLR LSB OF A REG #define NEGA 0x200036 // NEG A #define ABSA 0x200026 // ABS A #define NORMR5A 0x01DD15 // NORM R5,A #define ANDX1A 0x200066 // AND X1,A #define ADDX1A 0x200060 // ADD X1,A #define EORX1A 0x200063 // EOR X1,A also used on compare #define SUBX1A 0x200064 // SUB X1,A #define ANDY1A 0x200076 // AND Y1,A #define ANDY1AY1toB 0x20EF76 // AND Y1,A Y1,B #define ANDY1B 0x20007E // AND Y1,B #define EORY1B 0x20007B // EOR Y1,B #define EORY1A 0x200073 // EOR Y1,A #define ORY1B 0x20007A // OR Y1,B #define ORY1AB0toB 0x212F72 // OR Y1,A B0,B #define ADDBtoA 0x200010 // ADD B,A #define MOVXADRtoX0 0x44F000 // MOVE X:$ADDR,X0 #define MOVXADRtoX1 0x45F000 // MOVE X:$ADDR,X1 #define MOVXADRtoY1 0x47F000 // MOVE X:$ADDR,Y1 #define MOVXADRtoA 0x56F000 // MOVE X:$ADDR,A #define MOVXADRtoB 0x57F000 // MOVE X:$ADDR,B #define MOVYADRtoR1 0x69F000 // MOVE Y:$ADDR,R1 #define MOVXSADRtoA 0x568000 // MOVE X:$SADDR,A + SADDR << 8 #define MOVILtoY1 0x47F400 // MOV IMMEDIATE LONG TO REG 'Y1' #define MOVItoY1 0x270000 // MOV IMMEDIATE SHORT TO REG 'Y1' #define MOVEB0toX0 0x212400 // MOVE B0,X0 #define TFRX1AB0toX0 0x212461 // TFR X1,A B0,X0 #define MOVEA1toX0 0x218400 // MOVE A1,X0 #define MOVEX0toA 0x208E00 // MOVE X0,A #define TFRX0toAtoX1 0x218541 // TFR X0,A A1,X1 #define MOVEB1toA 0x21AE00 // MOVE B1,A #define MOVEB1toX1 0x21A500 // MOVE B1,X1 #define MPYX0Y1AtoX1 0x2185C0 // MPY X0,Y1,A A1,X1 #define MPYX0Y1BIStoY1 0x2700C8 // MPY X0,Y1,B #<,Y1 #define MPYX0Y1BILtoY1 0x47F4C8 // MPY X0,Y1,B #>,Y1 #define MPYX0Y1A 0x2000C0 // MPY X0,Y1,A #define MPYX0Y1B 0x2000C8 // MPY X0,Y1,B #define MOVEA1toY1 0x218700 // MOVE A1,Y1 #define MPYX1Y1A 0x2000F0 // MPY X1,Y1,A #define ASRA 0x200022 // ASR A #define ASLInA 0x0C1D00 // ASL #n,A,A + n << 1 #define ASRInA 0x0C1C00 // ASR #n,A,A + n << 1 #define ASRInBtoB 0x0C1C81 // ASR #n,B,B + (n << 1) #define MOVEA0toA 0x210E00 // MOVE A0,A SIGN EXTEND #define MOVEA1toA 0x218E00 // MOVE A1,A SIGN EXTEND #define MOVEB1toX1 0x21A500 // MOVE B1,X1 #define MOVEA1toB 0x218F00 // MOVE A1,B #define LRSA 0x200023 // LSR A #define LSRInA 0x0C1EC0 // LSR #n,A + n << 1 #define LSRInB 0x0C1EC1 // LSR #n,B + n << 1 #define CLRAA1toX1 0x218513 // CLR A A1,X1 #define CLRAA1toX0 0x218413 // CLR A A1,X0 #define MOVA1toX1 0x218500 // MOVE A1,X1 ; MOVE CURRENT A1 to X1 #define MOV1toA1 0x2C0100 // MOVE #1,A1 ; LOAD CONSTANT 1 #define MOVEA1toXM 0x547000 // MOVE A1,X:$MEM_ADDR #define MOVEA1toSXM 0x540000 // MOVE A1,X:$MEM_ADDR + SHORT MEM << 8 #define MOVEA1toSYM 0x5C0000 // MOVE A1,Y:$MEM_ADDR + SHORT MEM << 8 #define BCLRXMEM 0x0A7000 // BCLR #0,X:$D000 // 0x0A7017 BCLR #23,X:$D000 // 0x0A7057 BCLR #23,Y:$D000 #define BSETXMEM 0x0A7020 // BSET #0,X:$D000 // // UNPACK Inline Code - Uses 3 vs 2 for JSR // #define UNPACK0 0x0C1881 // EXTRACTU #$00C000,A,B ; EXTRACT EXPONENT #define UNPACK1 0x00C000 #define UNPACK2 0x213514 // SUB B,A B0,R5 ; REMOVE EXPONENT FROM MANTISA // // Other 56K code // #define MOVEMPRtoR1 0x07ED91 // MOVEM P:(R5+N5),R1 #define MOVILtoX1 0x45F400 // MOV IMMEDIATE LONG TO REG 'X1' #define MOVItoX1 0x250000 // MOVE #= #define JNE 0x0AF0A2 // JMP != #define JGT 0x0AF0A7 // JMP > #define JCS 0x0AF0A8 // JCS Carry Set #define JLT 0x0AF0A9 // JMP < #define JEQ 0x0AF0AA // JMP = #define JLE 0x0AF0AF // JMP <= #define JMP 0x0AF080 // JMP LONG #define RTS 0x00000C // RET from S/R #define NOP 0 // NOP #define BEQ 0x05A400 // BEQ + ( offset ) #define BRA 0x050C00 // BRA + ( offset ) B0-9, B5 is always Zero #define BRAL 0x0D10C0 // BRA + Next address is 255 < displacement < -256 //*************************************************************** //** Conditional JMP Flag Defines ** //*************************************************************** #define JMP_TRUE 0x1000000 // Conditional JMP True flag #define JMP_FALSE 0x2000000 #define IFWHL_START 0x4000000 // If - While Start Flag #define ANDOR_START 0x8000000 // AND - OR CMD Start Flag #define ENDWCODE 13 // End While code 56k locations //**************************************************************************** // //** Defines for strings types for 56k code // //**************************************************************************** #define CMD 0 // Code for 1st word of string #define SENDP 0x10 #define SENDS 0x20 #define SEND 0x30 // //** Defines for strings types for 56k Turbo code // #define TSENDP 0x14 #define TSENDR 0x24 #define TSENDS 0x34 #define TSENDA 0x44 #define TSENDM 0x54 #define TCMD 0x84 //*************************************************************** //** Function Addresses ** //*************************************************************** #define I_SUB 0x0040CE #define M_SUB 0x0040D6 #define P_SUB 0x0040DE #define Q_SUB 0x0040E3 #define FSIN 0x000A2E #define FCOS 0x000AC5 #define FTAN 0x000AF2 #define FABS 0x0008D9 #define FASIN 0x000BC3 #define FACOS 0x000BD0 #define FATAN 0x000BE9 #define FSQRT 0x000A01 #define FEXP 0x000D4A #define FLN 0x000CDD #define FINT 0x000DCD #define FATAN2 0x000BDA //*************************************************************** //** Operator Addresses ** //*************************************************************** #define FADD_XA 0x0008E2 #define FSUB_XA 0x000918 #define FMPY_XA 0x00093E #define FDIV_XA 0x000975 #define FOR_XA 0x0009D5 #define FEOR_XA 0x0009DB #define FAND_XA 0x0009CF #define FMOD_XA 0x0009A0 #define FSUB_AX 0x0008E1 #define FDIV_AX 0x000967 #define FMOD_AX 0x000993 //*************************************************************** //** Other Addresses ** //*************************************************************** #define I_READ 0x001B23 #define M_READ 0x0015F7 #define I_WRITE 0x001B5F #define M_WRITE 0x001768 #define FNEG 0x0008DD #define FCMP_XA 0x000922 #define PACK 0x000DF4 #define UNPACK 0x000DE5 #define PLCENADIS 0x001C1C #define PLCQ_BASE 0x005B29 #define MOVPDISP 0x00222F #define FTOAF 0x000EF8 //*************************************************************** //** OPEN SERVO STARTUP CODE ** //*************************************************************** #define SRV_RTN 0x04000B // JMP SRV_RTN #define SERVO_BUFFER 0x040000 #define SMTR_NUM 0x040015 #define SERVO_SIZE 0x014 #define FLIMIT 0x04001D //*************************************************************** //** OPEN MACPLCC STARTUP buffer && FIXED LINK VECTOR TABLE ** //*************************************************************** #define MACPLCC_BUF 0x04004 #define MACPLCC_SIZE 0x04000 #define MDIVX1A 0x4 #define MDIVAX1 0x5 #define MMODX1A 0x6 #define MMODAX1 0x7 #define MI_READ 0x8 #define MM_READ 0x9 #define MI_WRITE 0x0A #define MM_WRITE 0x0B #define CHN_WRITE 0x0C #define ENDWMCODE 5 // End While MACRO code 56k locations #define MP_TBL 0x400 // Macro Pnn Table start //*************************************************************** //** Addresses that do not change ** //*************************************************************** #define PBUFFER 0x1000 #define TQ_BASE 0x2000 // Turbo C.S. 1 Q Base Address #define TPBUFFER 0x6000 #define TQBUFFER 0x8000 #define PLCBUFFER 0x8000 #define PLCJMPOFF 0x20 #define PLCRETOFF PLCJMPOFF + 2 * 32 // number of PLCC's * 2 // #define PLCJMP PLCBUFFER + PLCJMPOFF // #define PLCRET PLCBUFFER + PLCRETOFF // #define PLCSTART PLCRET + 2 // allow room for size of mem used // #define PLCCSIZE PLCRET + 1 // PLCC size stored by compiler #define PLCCEXSIZE 98 // PLCC Executive size #define PLCEND 16 #define DISPLAY 0x000780 // Display Buffer Addr #define FPTEN 0x0007DE // FPTEN Address Table #define CMD_STACK 0x00075A // PMAC PLC CMD Stack #define PLCREQ 0x031 // TURB0 PLC CMD Stack(X: PLCn, Y: PLC0 ) #define PLC_IN_PTR 0x032 // TURB0 PLC INP END PTR(X: PLCn, Y: PLC0 ) #define PLCN_BUFFER 0x1A00 // TURBO PLCn1..31 BUFFER #define PLC0_BUFFER 0x1900 // TURBO PLC 0 BUFFER #define TDISPLAY 0x001080 // TURBO Display Buffer Addr #define TFPTEN 0x0010DE // TURBO FPTEN Address Table #define TPLC0_EXT 0x0035C2 // TURBO PLC0_EXT RAM Address