home *** CD-ROM | disk | FTP | other *** search
-
- /*
- XA65 - 6502 CROSS ASSEMBLER AND UTILITY SUITE
- cOPYRIGHT (c) 1989-1998 aNDR{$e9} fACHAT (A.FACHAT@PHYSIK.TU-CHEMNITZ.DE)
-
- tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
- IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
- THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
- (AT YOUR OPTION) ANY LATER VERSION.
-
- tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
- BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
- merchantability OR fitness for a particular purpose. sEE THE
- gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
-
- yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
- ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
- fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
- */
-
-
- #INCLUDE <CTYPE.H>
- #INCLUDE <STDIO.H>
-
- #INCLUDE "XAH.H"
- #INCLUDE "XAH2.H"
-
- #INCLUDE "XAR.H"
- #INCLUDE "XA.H"
- #INCLUDE "XAA.H"
- #INCLUDE "XAL.H"
- #INCLUDE "XAT.H"
- #INCLUDE "XAO.H"
- #INCLUDE "XAP.H"
-
- INT DSB_LEN = 0;
-
- STATIC INT T_CONV(SIGNED CHAR*,SIGNED CHAR*,INT*,INT,INT*,INT*,INT*,INT);
- STATIC INT T_KEYWORD(SIGNED CHAR*,INT*,INT*);
- STATIC INT TG_ASC(SIGNED CHAR*,SIGNED CHAR*,INT*,INT*,INT*,INT*);
- STATIC VOID TG_DEZ(SIGNED CHAR*,INT*,INT*);
- STATIC VOID TG_HEX(SIGNED CHAR*,INT*,INT*);
- STATIC VOID TG_OCT(SIGNED CHAR*,INT*,INT*);
- STATIC VOID TG_BIN(SIGNED CHAR*,INT*,INT*);
-
- STATIC CHAR *KT[] ={$7b}
- "ADC","AND","ASL","BBR","BBS","BCC","BCS","BEQ",
- "BIT","BMI",
- "BNE","BPL","BRA","BRK","BVC","BVS","CLC","CLD",
- "CLI",
- "CLV","CMP","CPX","CPY","DEC","DEX","DEY","EOR",
- "INC","INX","INY","JMP","JSR","LDA","LDX","LDY",
- "LSR","NOP","ORA","PHA","PHP","PHX","PHY","PLA",
- "PLP","PLX","PLY","RMB","ROL",
- "ROR","RTI","RTS","SBC","SEC","SED","SEI","SMB",
- "STA",
- "STX","STY","STZ","TAX","TAY","TRB","TSB","TSX",
- "TXA","TXS","TYA",
- ".BYT",".WORD",".ASC",".DSB",
- ".(",".)","*=", ".TEXT", ".DATA", ".BSS", ".ZERO",
- ".FOPT", ".BYTE", ".END", ".LIST", ".XLIST",
- ".DUPB", ".BLKB", ".DB", ".DW", ".ALIGN",
- ".BLOCK", ".BEND"
- {$7d};
-
- STATIC INT LP[]= {$7b} 0,1,1,1,1,2,2,1,1,1,2,2,2,1,1,1,2,2 {$7d};
-
- #DEFINE lASTBEF 67
- #DEFINE aNZKEY 91
-
- #DEFINE kBYT 68
- #DEFINE kWORD 69
- #DEFINE kASC 70
- #DEFINE kDSB 71
- #DEFINE kOPEN 72 /* .( */
- #DEFINE kCLOSE 73 /* .) */
- #DEFINE kPCDEF 74 /* *=VALUE */
- #DEFINE kTEXT 75
- #DEFINE kDATA 76
- #DEFINE kBSS 77
- #DEFINE kZERO 78
- #DEFINE kFOPT 79
- #DEFINE kBYTE 80/* GETS REMAPPED TO kBYT */
- #DEFINE kEND 81/* IGNORED (masm COMPAT.) */
- #DEFINE kLIST 82/* IGNORED (masm COMPAT.) */
- #DEFINE kXLIST 83/* IGNORED (masm COMPAT.) */
- #DEFINE kDUPB 84/* GETS REMAPPED TO kDSB */
- #DEFINE kBLKB 85/* GETS REMAPPED TO kDSB */
- #DEFINE kDB 86/* GETS REMAPPED TO kBYT */
- #DEFINE kDW 87/* GETS REMAPPED TO kWORD */
- #DEFINE kALIGN 88
- #DEFINE kBLOCK 89/* GETS REMAPPED TO .( */
- #DEFINE kBEND 90/* GETS REMAPPED TO .) */
- #DEFINE kRELOC aNZKEY /* *= (RELOCATION MODE) */
- #DEFINE kSEGMENT aNZKEY+1
-
- STATIC INT KTP[]={$7b} 0,3,16,23,26,27,27,27,27,30,32,32,36,36,37,38,46,
- 46,51,60,68,68,68,68,68,68,68,aNZKEY {$7d};
-
- STATIC INT CT[68][16] ={$7b}
- /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
- {$7b} -1, 0X65,0X75,-1, 0X172,0X61,0X71,0X69,0X6D,0X7D,0X79,-1, -1, -1, -1, -1 {$7d}, /*ADC*/
- {$7b} -1, 0X25,0X35,-1, 0X132,0X21,0X31,0X29,0X2D,0X3D,0X39,-1, -1, -1, -1, -1 {$7d}, /*AND*/
- {$7b} 0X0A,0X06,0X16,-1, -1, -1, -1, -1, 0X0E,0X1E,-1, -1, -1, -1, -1, -1 {$7d}, /*ASL*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0X10F,-1 {$7d}, /*BBR*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0X18F,-1 {$7d}, /*BBS*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0X90,-1, -1, -1, -1 {$7d}, /*BCC*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0XB0,-1, -1, -1, -1 {$7d}, /*BCS*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0XF0,-1, -1, -1, -1 {$7d}, /*BEQ*/
- {$7b} -1, 0X24,0X134,-1, -1, -1, -1, 0X189,0X2C,0X13C,-1, -1, -1, -1, -1, -1 {$7d}, /*BIT*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0X30,-1, -1, -1, -1 {$7d}, /*BMI*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0XD0,-1, -1, -1, -1 {$7d}, /*BNE*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0X10,-1, -1, -1, -1 {$7d}, /*BPL*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0X180,-1, -1, -1, -1 {$7d}, /*BRA*/
- {$7b} 0X00,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*BRK*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0X50,-1, -1, -1, -1 {$7d}, /*BVC*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0X70,-1, -1, -1, -1 {$7d}, /*BVS*/
- {$7b} 0X18,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*CLC*/
- {$7b} 0XD8,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*CLD*/
- {$7b} 0X58,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*CLI*/
- {$7b} 0XB8,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*CLV*/
- {$7b} -1, 0XC5,0XD5,-1, 0X1D2,0XC1,0XD1,0XC9,0XCD,0XDD,0XD9,-1, -1, -1, -1, -1 {$7d}, /*CMP*/
- {$7b} -1, 0XE4,-1, -1, -1, -1, -1, 0XE0,0XEC,-1, -1, -1, -1, -1, -1, -1 {$7d}, /*CPX*/
- {$7b} -1, 0XC4,-1, -1, -1, -1, -1, 0XC0,0XCC,-1, -1, -1, -1, -1, -1, -1 {$7d}, /*CPY*/
- {$7b} 0X13A,0XC6,0XD6,-1, -1, -1, -1, -1, 0XCE,0XDE,-1, -1, -1, -1, -1, -1 {$7d}, /*DEC*/
- {$7b} 0XCA,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*DEX*/
- {$7b} 0X88,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*DEY*/
- {$7b} -1, 0X45,0X55,-1, 0X152,0X41,0X51,0X49,0X4D,0X5D,0X59,-1, -1, -1, -1, -1 {$7d}, /*EOR*/
- {$7b} 0X11A,0XE6,0XF6,-1, -1, -1, -1, -1, 0XEE,0XFE,-1, -1, -1, -1, -1, -1 {$7d}, /*INC*/
- {$7b} 0XE8,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*INX*/
- {$7b} 0XC8,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*INY*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, 0X4C,-1, -1, -1, 0X6C,0X17C,-1, -1 {$7d}, /*JMP*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, 0X20,-1, -1, -1, -1, -1, -1, -1 {$7d}, /*JSR*/
- {$7b} -1, 0XA5,0XB5,-1, 0X1B2,0XA1,0XB1,0XA9,0XAD,0XBD,0XB9,-1, -1, -1, -1, -1 {$7d}, /*LDA*/
- {$7b} -1, 0XA6,-1, 0XB6,-1, -1, -1, 0XA2,0XAE,-1, 0XBE,-1, -1, -1, -1, -1 {$7d}, /*LDX*/
- {$7b} -1, 0XA4,0XB4,-1, -1, -1, -1, 0XA0,0XAC,0XBC,-1, -1, -1, -1, -1, -1 {$7d}, /*LDY*/
- {$7b} 0X4A,0X46,0X56,-1, -1, -1, -1, -1, 0X4E,0X5E,-1, -1, -1, -1, -1, -1 {$7d}, /*LSR*/
- {$7b} 0XEA,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*NOP*/
- {$7b} -1, 0X05,0X15,-1, 0X112,0X01,0X11,0X09,0X0D,0X1D,0X19,-1, -1, -1, -1, -1 {$7d}, /*ORA*/
- {$7b} 0X48,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*PHA*/
- {$7b} 0X08,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*PHP*/
- {$7b} 0X1DA,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*PHX*/
- {$7b} 0X15A,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*PHY*/
- {$7b} 0X68,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*PLA*/
- {$7b} 0X28,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*PLP*/
- {$7b} 0X1FA,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*PLX*/
- {$7b} 0X17A,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*PLY*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,0X107 {$7d}, /*RMB*/
- {$7b} 0X2A,0X26,0X36,-1, -1, -1, -1, -1, 0X2E,0X3E,-1, -1, -1, -1, -1, -1 {$7d}, /*ROL*/
- {$7b} 0X6A,0X66,0X76,-1, -1, -1, -1, -1, 0X6E,0X7E,-1, -1, -1, -1, -1, -1 {$7d}, /*ROR*/
- {$7b} 0X40,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*RTI*/
- {$7b} 0X60,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*RTS*/
- {$7b} -1, 0XE5,0XF5,-1, 0X1F2,0XE1,0XF1,0XE9,0XED,0XFD,0XF9,-1, -1, -1, -1, -1 {$7d}, /*SBC*/
- {$7b} 0X38,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*SEC*/
- {$7b} 0XF8,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*SED*/
- {$7b} 0X78,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*SEI*/
- {$7b} -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,0X187 {$7d}, /*SMB*/
- {$7b} -1, 0X85,0X95,-1, 0X192,0X81,0X91,-1, 0X8D,0X9D,0X99,-1, -1, -1, -1, -1 {$7d}, /*STA*/
- {$7b} -1, 0X86,-1, 0X96,-1, -1, -1, -1, 0X8E,-1, -1, -1, -1, -1, -1, -1 {$7d}, /*STX*/
- {$7b} -1, 0X84,0X94,-1, -1, -1, -1, -1, 0X8C,-1, -1, -1, -1, -1, -1, -1 {$7d}, /*STY*/
- {$7b} -1, 0X164,0X174,-1, -1, -1, -1, -1, 0X19C,0X19E,-1, -1, -1, -1, -1, -1 {$7d}, /*STZ*/
- {$7b} 0XAA,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*TAX*/
- {$7b} 0XA8,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*TAY*/
- {$7b} -1, 0X114,-1, -1, -1, -1, -1, -1, 0X11C,-1, -1, -1, -1, -1, -1, -1 {$7d}, /*TRB*/
- {$7b} -1, 0X104,-1, -1, -1, -1, -1, -1, 0X10C,-1, -1, -1, -1, -1, -1, -1 {$7d}, /*TSB*/
- {$7b} 0XBA,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*TSX*/
- {$7b} 0X8A,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*TXA*/
- {$7b} 0X9A,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d}, /*TXS*/
- {$7b} 0X98,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 {$7d} /*TYA*/
- {$7d} ;
-
- #IF 0
- STATIC INT CF[] ={$7b} 0,0,0,1,1,0,0,0,0,0,0,0,1, /* 1= cmos */
- 0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,1,1,0,0,1,1,1,
- 0,0,0,0,0,0,0,0,1,0,0,0,
- 1,0,0,1,1,0,0,0,0 {$7d};
- #ENDIF
-
- #DEFINE sYNTAX 10
-
- STATIC INT AT[sYNTAX][3] ={$7b}
- {$7b} 0, -1, -1 {$7d},
- {$7b} -1, 7, -1 {$7d},
- {$7b} -1, 15, -1 {$7d},
- {$7b} -1, -1, 14 {$7d},
- {$7b} -1, 1, 8 {$7d},
- {$7b} -1, 2, 9 {$7d},
- {$7b} -1, 3, 10 {$7d},
- {$7b} -1, 4, 12 {$7d},
- {$7b} -1, 5, 13 {$7d},
- {$7b} -1, 6, -1 {$7d}
- {$7d};
-
- #DEFINE aNZaLT 4
-
- STATIC INT XT[aNZaLT][2] ={$7b} /* aLTERNATIV aDR-mODES */
- {$7b} 8, 11 {$7d}, /* ABS -> REL */
- {$7b} 2, 3 {$7d}, /* Z,X -> Z,Y */
- {$7b} 5, 6 {$7d}, /* ,X) -> ),Y */
- {$7b} 9, 10 {$7d} /* A,X -> A,Y */
- {$7d};
-
- STATIC INT LE[] ={$7b} 1,2,2,2,2,2,2,2,3,3,3,2,3,3,3,2 {$7d};
-
- STATIC INT OPT[] ={$7b} -1,-1,-1,-1,-1,-1,-1,-1,1,2,3,-1,4,5,-1,-1 {$7d}; /* ABS -> ZP */
-
- #DEFINE CVAL(S) 256*((S)[1]&255)+((S)[0]&255)
- #DEFINE WVAL(I,V) T[I++]=t_value;T[I++]=(V)&255;T[I++]=((V)>>8)&255
-
- /* PASS 1 */
- INT T_P1(SIGNED CHAR *S, SIGNED CHAR *T, INT *LL, INT *AL)
- {$7b}
- STATIC INT ER,L,N,V,NK,NA1,NA2,BL,AM,SY,I,LABEL; /*,J,V2 ;*/
- INT AFL = 0;
-
- BL=0;
- *AL = 0;
-
- /* PRINTF("\N"); */
-
- ER=T_CONV(S,T,&L,PC[SEGMENT],&NK,&NA1,&NA2,0);
-
- *LL=L;
- /*
- PRINTF("T_CONV (ER=%D):",ER);
- FOR(I=0;I<L;I++)
- PRINTF("%02X,",T[I]);
- PRINTF("\N");
- */
- /* IF TEXT/DATA PRODUCED, THEN NO MORE FOPT ALLOWED IN ROMABLE MODE */
- IF((ROMABLE>1) && (T[0]<kOPEN {$7c}{$7c} T[0]==kBYTE {$7c}{$7c} T[0]==kPCDEF)) {$7b}
- AFILE->BASE[seg_text] = PC[seg_text] = ROMADR + H_LENGTH();
- ROMABLE=1;
- {$7d}
-
- IF(!ER)
- {$7b}
- N=T[0];
- /* todo: MAKE THAT A BIG SWITCH STATEMENT... */
- IF(N==kEND {$7c}{$7c} N==kLIST {$7c}{$7c} N==kXLIST) {$7b}
- *LL = 0;/* IGNORE */
- {$7d} ELSE
- IF(N==kFOPT) {$7b}
- IF(ROMABLE==1) ER=e_romopt;
- T[0] = kBYT;
- SET_FOPT(L,T,NK+1-NA1+NA2);
- *LL = 0;
- {$7d} ELSE
- IF(N==kPCDEF)
- {$7b}
- INT TMP;
- IF(!(ER=A_TERM(T+1,&TMP /*&PC[seg_abs]*/,&L,PC[SEGMENT],&AFL,&LABEL,0)))
- {$7b}
- I=1;
- WVAL(I,TMP /*PC[seg_abs]*/);
- T[I++]=t_end;
- *LL=5;
- ER=e_okdef;
- /*PRINTF("SET PC=%04X, OLDSEGMENT=%D, PC[SEGM]=%04X, ",
- PC[seg_abs], SEGMENT, PC[SEGMENT]);
- PRINTF(" WROTE %02X %02X %02X %02X %02X %02X\N",
- T[0],T[1],T[2],T[3],T[4],T[5]);*/
- IF(SEGMENT==seg_text) {$7b}
- PC[seg_abs] = TMP;
- R_MODE(rmode_abs);
- {$7d} ELSE {$7b}
- IF(!RELMODE) {$7b}
- PC[SEGMENT] = TMP;
- {$7d} ELSE {$7b}
- ER = e_illsegment;
- {$7d}
- {$7d}
- /*PRINTF("NEWSEGMENT=%D, PC[abs]=%04X\N", SEGMENT, PC[seg_abs]);*/
- {$7d} ELSE {$7b}/* todo: DIFFERENT ERROR CODE */
- IF((SEGMENT==seg_abs) && (ER==e_syntax && L==0)) {$7b}
- /*PRINTF("RELOC: OLDSEG=%D, PC[OLDSEG]=%04X, PC[ABS]=%04X, PC[TEXT]=%04X\N",
- SEGMENT, PC[SEGMENT], PC[seg_abs], PC[seg_text]);*/
- T[0]=kRELOC;
- I=1;
- WVAL(I,PC[seg_text]);
- T[I++]=t_end;
- *LL=5;
- ER=e_okdef;
- R_MODE(rmode_reloc);
- /*PRINTF(" : NEWSEG=%D, PC[NEWSEG]=%04X, PC[ABS]=%04X, PC[TEXT]=%04X\N",
- SEGMENT, PC[SEGMENT], PC[seg_abs], PC[seg_text]);*/
- {$7d}
- {$7d}
- {$7d} ELSE
- IF(N==kOPEN)
- {$7b}
- IF(SHOWBLK) FPRINTF(STDERR, "%S LINE %D: .(\N", PP_GETIDAT()->FNAME, PP_GETIDAT()->FLINE);
- B_OPEN();
- ER=e_noline;
- {$7d} ELSE
- IF(N==kCLOSE)
- {$7b}
- IF(SHOWBLK) FPRINTF(STDERR, "%S LINE %D: .)\N", PP_GETIDAT()->FNAME, PP_GETIDAT()->FLINE);
- ER=B_CLOSE();
- IF(!ER) ER=e_noline;
- {$7d} ELSE
- IF(N==kDSB)
- {$7b}
- DSB_LEN = 1;
- IF(!(ER=A_TERM(T+1,&BL,&L,PC[SEGMENT],&AFL,&LABEL,0))) {$7b}
- ER=e_okdef;
- {$7d}
- DSB_LEN = 0;
- {$7d} ELSE
- IF(N==kTEXT) {$7b}
- /* IF(SEGMENT!=seg_abs) {$7b}*/
- SEGMENT = RELMODE ? seg_text : seg_abs;
- T[0]=kSEGMENT;
- T[1]=SEGMENT;
- *LL=2;
- ER=e_okdef;
- /* {$7d} ELSE {$7b}
- ER=e_illsegment;
- {$7d}*/
- {$7d} ELSE
- IF(N==kDATA) {$7b}
- /* IF(SEGMENT!=seg_abs) {$7b}*/
- SEGMENT = seg_data;
- T[0]=kSEGMENT;
- T[1]=seg_data;
- *LL=2;
- ER=e_okdef;
- /* {$7d} ELSE {$7b}
- ER=e_illsegment;
- {$7d}*/
- {$7d} ELSE
- IF(N==kBSS) {$7b}
- /* IF(SEGMENT!=seg_abs) {$7b}*/
- SEGMENT = seg_bss;
- T[0]=kSEGMENT;
- T[1]=seg_bss;
- *LL=2;
- ER=e_okdef;
- /* {$7d} ELSE {$7b}
- ER=e_illsegment;
- {$7d}*/
- {$7d} ELSE
- IF(N==kZERO) {$7b}
- /* IF(SEGMENT!=seg_abs) {$7b}*/
- SEGMENT = seg_zero;
- T[0]=kSEGMENT;
- T[1]=seg_zero;
- *LL=2;
- ER=e_okdef;
- /* {$7d} ELSE {$7b}
- ER=e_illsegment;
- {$7d}*/
- {$7d} ELSE
- IF(N==kALIGN) {$7b}
- INT TMP;
- IF(SEGMENT!=seg_abs) {$7b}
- IF(!(ER=A_TERM(T+1,&TMP,&L,PC[SEGMENT],&AFL,&LABEL,0))) {$7b}
- IF(TMP == 1 {$7c}{$7c} TMP == 2 {$7c}{$7c} TMP == 4 {$7c}{$7c} TMP == 256) {$7b}
- SET_ALIGN(TMP);
- IF(PC[SEGMENT] & (TMP-1)) {$7b} /* NOT ALIGNED */
- INT TMP2;
- T[0]=kDSB;
- I=1;
- BL=TMP=(TMP - (PC[SEGMENT] & (TMP-1))) & (TMP-1);
- WVAL(I,TMP);
- T[I++]=',';
- TMP2= 0XEA;
- WVAL(I,TMP2);/* NOP OPCODE */
- T[I++]=t_end;
- *LL=9;
- ER=e_okdef;
- {$7d} ELSE {$7b}
- *LL=0;/* IGNORE IF ALIGNED RIGHT */
- {$7d}
- {$7d} ELSE {$7b}
- ER=e_illalign;
- {$7d}
- {$7d}
- {$7d} ELSE {$7b}
- ER=e_illsegment;
- {$7d}
- {$7d} ELSE
- ER=T_P2(T,LL,1, AL);
-
- {$7d} ELSE
- IF(ER==e_nodef)
- {$7b}
- ER=e_ok;
- N=T[0];
-
- IF(N>=0 && N<=lASTBEF)
- {$7b}
- IF(T[1]==t_end)
- {$7b}
- SY=0;
- {$7d} ELSE
- IF(T[1]=='#')
- {$7b}
- SY=1+NK;
- {$7d} ELSE
- IF(T[1]=='(')
- {$7b}
- SY=7+NK;
- {$7d} ELSE
- SY=4+NK;
-
- BL=4;
-
- WHILE(--BL)
- {$7b}
- IF((AM=AT[SY][BL-1])>=0)
- {$7b}
- IF(AM>15)
- {$7b}
- ER=e_syntax;
- BREAK;
- {$7d}
- IF(CT[N][AM]>=0)
- BREAK;
-
- FOR(V=0;V<aNZaLT;V++)
- IF(XT[V][0]==AM && CT[N][XT[V][1]]>=0)
- BREAK;
- IF(V<aNZaLT)
- {$7b}
- AM=XT[V][1];
- BREAK;
- {$7d}
- {$7d}
- {$7d}
-
- IF(!BL)
- ER=e_syntax;
- ELSE
- BL=LE[AM];
-
- {$7d} ELSE
- IF(N==kBYT {$7c}{$7c} N==kASC)
- {$7b}
- BL=NK+1-NA1+NA2;
- {$7d} ELSE
- IF(N==kWORD)
- {$7b}
- BL=2*NK+2;
- {$7d} ELSE
- IF(N==kDSB)
- {$7b}
- ER=A_TERM(T+1,&BL,&L,PC[SEGMENT],&AFL,&LABEL,0);
- {$7d} ELSE
- IF(N==kFOPT)
- {$7b}
- SET_FOPT(L-1,T+1, NK+1-NA1+NA2);
- *LL = 0;
- {$7d} ELSE
- IF(N==t_op)
- {$7b}
- ER=e_okdef;
- {$7d} ELSE
- ER=e_nodef;
-
- IF(!ER)
- ER=e_okdef;
- {$7d}
- IF(ER==e_noline)
- {$7b}
- ER=e_ok;
- *LL=0;
- {$7d}
-
- *AL += BL;
- PC[SEGMENT]+=BL;
- IF(SEGMENT==seg_text) PC[seg_abs]+=BL;
- IF(SEGMENT==seg_abs) PC[seg_text]+=BL;
-
- RETURN(ER);
- {$7d}
-
- INT T_P2(SIGNED CHAR *T, INT *LL, INT FL, INT *AL)
- {$7b}
- STATIC INT AFL,NAFL, I,J,K,ER,V,N,L,BL,SY,AM,C,VV[3],V2,LABEL;
- STATIC INT RLT[3];/* RELOCATION TABLE */
- STATIC INT LAB[3];/* UNDEF. LABEL TABLE */
-
- ER=e_ok;
- BL=0;
- IF(*LL<0) /* <0 BEI e_ok, >0 BEI e_okdef */
- {$7b}
- *LL=-*LL;
- BL=*LL;
- ER=e_ok;
- {$7d} ELSE
- {$7b}
- N=T[0];
- IF(N==t_op)
- {$7b}
- N=CVAL(T+1);
- ER=A_TERM(T+4,&V,&L,PC[SEGMENT],&NAFL,&LABEL,0);
-
- IF(!ER)
- {$7b}
- IF(T[3]=='=')
- {$7b}
- V2=V;
- {$7d} ELSE {$7b}
- IF( (!(ER=L_GET(N,&V2, &AFL)))
- && ((AFL & a_fmask)!=(seg_undef<<8)) )
- {$7b}
- IF(T[3]=='+')
- {$7b}
- IF(AFL && NAFL) {$7b} ERROUT(e_wpointer); NAFL=0; {$7d}
- NAFL = AFL;
- V2+=V;
- {$7d} ELSE
- IF(T[3]=='-')
- {$7b}
- IF( (((NAFL & a_fmask)>>8) != AFL)
- {$7c}{$7c} ((NAFL & a_mask)==a_high) ) {$7b}
- ERROUT(e_wpointer);
- NAFL=0;
- {$7d} ELSE {$7b}
- NAFL = AFL;
- {$7d}
- V2-=V;
- {$7d} ELSE
- IF(T[3]=='*')
- {$7b}
- IF(AFL {$7c}{$7c} NAFL) {$7b} ERROUT(e_wpointer); NAFL=0; {$7d}
- V2*=V;
- {$7d} ELSE
- IF(T[3]=='/')
- {$7b}
- IF(AFL {$7c}{$7c} NAFL) {$7b} ERROUT(e_wpointer); NAFL=0; {$7d}
- IF(V)
- V2/=V;
- ELSE
- ER=e_div;
- {$7d} ELSE
- IF(T[3]=='{$7c}')
- {$7b}
- IF(AFL {$7c}{$7c} NAFL) {$7b} ERROUT(e_wpointer); NAFL=0; {$7d}
- V2=V{$7c}V2;
- {$7d} ELSE
- IF(T[3]=='&')
- {$7b}
- IF(AFL {$7c}{$7c} NAFL) {$7b} ERROUT(e_wpointer); NAFL=0; {$7d}
- V2=V2&V;
- {$7d}
- {$7d}
- {$7d}
- L_SET(N,V2,NAFL>>8);
-
- *LL=0;
- IF(!ER)
- ER=e_noline;
- {$7d}
- {$7d} ELSE
- IF(N==kWORD)
- {$7b}
- I=1;
- J=0;
- WHILE(!ER && T[I]!=t_end)
- {$7b}
- IF(!(ER=A_TERM(T+I,&V,&L,PC[SEGMENT],&AFL,&LABEL,1)))
- {$7b}
- /*IF(AFL) PRINTF("RELOCATION 1 %04X AT PC=$%04X, VALUE NOW =$%04X\N",
- AFL,PC[SEGMENT],V); */
- IF(AFL) U_SET(PC[SEGMENT]+J, AFL, LABEL, 2);
- T[J++]=V&255;
- T[J++]=(V>>8)&255;
-
- I+=L;
- IF(T[I]!=t_end && T[I]!=',')
- ER=e_syntax;
- ELSE
- IF(T[I]==',')
- I++;
-
- {$7d}
- {$7d}
- *LL=J;
- BL=J;
- {$7d} ELSE
- IF(N==kASC {$7c}{$7c} N==kBYT)
- {$7b}
- I=1;
- J=0;
- WHILE(!ER && T[I]!=t_end)
- {$7b}
- IF(T[I]=='\"')
- {$7b}
- I++;
- K=T[I]+I+1;
- I++;
- WHILE(I<K)
- T[J++]=T[I++];
- {$7d} ELSE
- {$7b}
- IF(!(ER=A_TERM(T+I,&V,&L,PC[SEGMENT],&AFL,&LABEL,1)))
- {$7b}
- /*IF(AFL) PRINTF("RELOCATION 2 %04X AT PC=$%04X, VALUE NOW =$%04X\N",AFL,PC[SEGMENT]+J,V); */
- IF(AFL) U_SET(PC[SEGMENT]+J, AFL, LABEL, 1);
- IF(V&0XFF00)
- ER=e_overflow;
- ELSE
- {$7b}
- T[J++]=V;
- I+=L;
- {$7d}
- {$7d}
- {$7d}
- IF(T[I]!=t_end && T[I]!=',')
- ER=e_syntax;
- ELSE
- IF(T[I]==',')
- I++;
- {$7d}
- *LL=J;
- BL=J;
- {$7d} ELSE
- IF(N==kPCDEF)
- {$7b}
- INT NPC;
- ER=A_TERM(T+1,&NPC,&L,PC[SEGMENT],&AFL,&LABEL,0);
- BL=0;
- *LL=0;
- IF(SEGMENT==seg_text) {$7b}
- R_MODE(rmode_abs);
- {$7d}
- PC[SEGMENT] = NPC;
- {$7d} ELSE
- IF(N==kRELOC) {$7b}
- INT NPC;
- ER=A_TERM(T+1,&NPC,&L,PC[SEGMENT],&AFL,&LABEL,0);
- /*PRINTF("kRELOC: SEGMENT=%D, PC[SEG]=%04X\N", SEGMENT, PC[SEGMENT]);*/
- BL=0;
- *LL=0;
- R_MODE(rmode_reloc);
- PC[SEGMENT] = NPC;
- /*PRINTF("kRELOC: NEWSEGMENT=%D, PC[SEG]=%04X\N", SEGMENT, PC[SEGMENT]);*/
- {$7d} ELSE
- IF(N==kSEGMENT) {$7b}
- SEGMENT = T[1];
- *LL=0;
- BL =0;
- {$7d} ELSE
- IF(N==kDSB)
- {$7b}
- DSB_LEN = 1;
- IF(!(ER=A_TERM(T+1,&J,&I,PC[SEGMENT],&AFL,&LABEL,0)))
- {$7b}
- /*
- IF(T[I+1]!=',')
- ER=e_syntax;
- ELSE
- */
- /*
- IF((SEGMENT!=seg_abs) && AFL)
- ER=e_illpointer;
- ELSE
- */
- {$7b}
- DSB_LEN = 0;
-
- IF(T[I+1]==',') {$7b}
- ER=A_TERM(T+2+I,&V,&L,PC[SEGMENT],&AFL,&LABEL,0);
- {$7d} ELSE {$7b}
- V=0;
- {$7d}
- IF(!ER && V>>8)
- ER=e_overflow;
- T[0]=V&255;
- IF(!ER)
- {$7b}
- *LL=J;
- BL=J;
- ER=e_dsb;
- {$7d}
- {$7d}
- IF(!ER)
- BL=J;
- {$7d}
- DSB_LEN = 0;
- {$7d} ELSE
- IF(N<=lASTBEF)
- {$7b}
- IF((C=T[1])=='#')
- {$7b}
- I=2;
- SY=1;
- IF(!(ER=A_TERM(T+I,VV,&L,PC[SEGMENT],&AFL,&LABEL,1)))
- {$7b}
- /* IF(1) PRINTF("A_TERM RETURNS AFL=%04X\N",AFL); */
-
- RLT[0] = AFL;
- LAB[0] = LABEL;
- I+=L;
- IF(T[I]!=t_end)
- {$7b}
- IF(T[I]!=',')
- ER=e_syntax;
- ELSE
- {$7b}
- I++;
- SY++;
- IF(!(ER=A_TERM(T+I,VV+1,&L,PC[SEGMENT],&AFL,&LABEL,1)))
- {$7b}
- RLT[1] = AFL;
- LAB[1] = LABEL;
- I+=L;
- IF(T[I]!=t_end)
- {$7b}
- IF(T[I]!=',')
- ER=e_syntax;
- ELSE
- {$7b}
- I++;
- SY++;
- IF(!(ER=A_TERM(T+I,VV+2,&L,PC[SEGMENT],&AFL,&LABEL,1)))
- {$7b}
- RLT[2] = AFL;
- LAB[2] = LABEL;
- I+=L;
- IF(T[I]!=t_end)
- ER=e_syntax;
- {$7d}
- {$7d}
- {$7d}
- {$7d}
- {$7d}
- {$7d}
- {$7d}
- {$7d} ELSE
- IF(C==t_end)
- {$7b}
- SY=0;
- {$7d} ELSE
- IF(C=='(')
- {$7b}
- SY=7;
- IF(!(ER=A_TERM(T+2,VV,&L,PC[SEGMENT],&AFL,&LABEL,1)))
- {$7b}
- RLT[0] = AFL;
- LAB[0] = LABEL;
-
- IF(T[2+L]!=t_end)
- {$7b}
- IF(T[2+L]==',' && TOLOWER(T[3+L])=='X')
- SY=8;
- ELSE
- IF(T[2+L]==')')
- {$7b}
- IF(T[3+L]==',')
- {$7b}
- IF(TOLOWER(T[4+L])=='Y')
- SY=9;
- ELSE
- ER=e_syntax;
- {$7d} ELSE
- IF(T[3+L]!=t_end)
- ER=e_syntax;
- {$7d}
- {$7d} ELSE
- ER=e_syntax;
- {$7d}
- {$7d} ELSE
- {$7b}
- SY=4;
- IF(!(ER=A_TERM(T+1,VV,&L,PC[SEGMENT],&AFL,&LABEL,1)))
- {$7b}
- RLT[0] = AFL;
- LAB[0] = LABEL;
- IF(T[1+L]!=t_end)
- {$7b}
- IF(T[1+L]==',')
- {$7b}
- IF(TOLOWER(T[2+L])=='Y')
- SY=6;
- ELSE
- SY=5;
- {$7d} ELSE
- ER=e_syntax;
- {$7d}
- {$7d}
- {$7d}
-
- BL=4;
-
- WHILE(--BL)
- {$7b}
- IF((AM=AT[SY][BL-1])>=0)
- {$7b}
- IF(AM>15)
- {$7b}
- ER=e_syntax;
- BREAK;
- {$7d}
- IF(CT[N][AM]>=0)
- BREAK;
-
- FOR(V=0;V<aNZaLT;V++)
- IF(XT[V][0]==AM && CT[N][XT[V][1]]>=0)
- BREAK;
- IF(V<aNZaLT)
- {$7b}
- AM=XT[V][1];
- BREAK;
- {$7d}
- {$7d}
- {$7d}
-
- IF(FL && BL && !ER && !(VV[0]&0XFF00) && OPT[AM]>=0)
- IF(CT[N][OPT[AM]]>=0)
- AM=OPT[AM];
-
- IF(!BL)
- ER=e_syntax;
- ELSE
- {$7b}
- BL=LE[AM];
- *LL=BL;
- {$7d}
-
-
- IF(!ER)
- {$7b}
- T[0]=CT[N][AM]&0X00FF;
- IF(CT[N][AM]&0X0100)
- {$7b}
- NCMOS++;
- IF(!CMOSFL)
- ER=e_cmos;
- {$7d}
- IF(AM!=0)
- {$7b}
- IF(AM<8)
- {$7b}
- IF(VV[0]&0XFF00)
- ER=e_overflow;
- ELSE
- T[1]=VV[0];
- /*IF(RLT[0]) PRINTF("RELOCATION 1 BYTE %04X AT PC=$%04X, VALUE NOW =$%04X\N",RLT[0],PC[SEGMENT]+1,*VV); */
- IF(RLT[0]) U_SET(PC[SEGMENT]+1, RLT[0], LAB[0], 1);
- {$7d} ELSE
- IF(AM<14 && AM!=11)
- {$7b}
- T[1]=VV[0]&255;
- T[2]=(VV[0]>>8)&255;
- /*IF(RLT[0]) PRINTF("RELOCATION 2 BYTE %04X AT PC=$%04X, VALUE NOW =$%04X\N",RLT[0],PC[SEGMENT]+1,*VV); */
- IF(RLT[0]) U_SET(PC[SEGMENT]+1, RLT[0], LAB[0], 2);
- {$7d} ELSE
- IF(AM==11) {$7b}
- IF((SEGMENT!=seg_abs) && (!RLT[0])) {$7b}
- ER=e_illpointer;
- {$7d} ELSE {$7b}
- /*PRINTF("AM=11, PC=%04X, VV[0]=%04X, SEGMENT=%D\N",PC[SEGMENT],VV[0], SEGMENT);*/
- V=VV[0]-PC[SEGMENT]-2;
- IF(((V&0XFF80)!=0XFF80) && (V&0XFF80))
- ER=e_range;
- ELSE
- T[1]=V;
- {$7d}
- {$7d} ELSE
- IF(AM==14) {$7b}
- IF(VV[0]&0XFFF8 {$7c}{$7c} VV[1]&0XFF00)
- ER=e_range;
- ELSE
- IF((SEGMENT!=seg_abs) && (RLT[0] {$7c}{$7c} !RLT[2])) {$7b}
- ER=e_illpointer;
- {$7d} ELSE {$7b}
- /*IF(RLT[1]) PRINTF("RELOCATION 1 BYTE %04X AT PC=$%04X, VALUE NOW =$%04X\N",RLT[1],PC[SEGMENT]+1,*VV); */
- IF(RLT[1]) U_SET(PC[SEGMENT]+1, RLT[1], LAB[1], 1);
- T[0]=T[0]{$7c}(VV[0]<<4);
- T[1]=VV[1];
- V=VV[2]-PC[SEGMENT]-3;
- IF((V&0XFF80) && ((V&0XFF80)!=0XFF80))
- ER=e_overflow;
- ELSE
- T[2]=V;
- {$7d}
- {$7d} ELSE
- IF(AM==15)
- {$7b}
- /*IF(RLT[1]) PRINTF("RELOCATION 1 BYTE %04X AT PC=$%04X, VALUE NOW =$%04X\N",RLT[1],PC[SEGMENT]+1,*VV); */
- IF(RLT[1]) U_SET(PC[SEGMENT]+1, RLT[1], LAB[1], 1);
- IF(VV[0]&0XFFF8 {$7c}{$7c} VV[1]&0XFF00)
- ER=e_overflow;
- ELSE
- {$7b}
- T[0]=T[0]{$7c}(VV[0]<<4);
- T[1]=VV[1];
- {$7d}
- {$7d} ELSE
- ER=e_syntax;
- {$7d}
- {$7d}
-
- {$7d} ELSE
- ER=e_syntax;
- {$7d}
- PC[SEGMENT]+=BL;
- IF(SEGMENT==seg_text) PC[seg_abs]+=BL;
- IF(SEGMENT==seg_abs) PC[seg_text]+=BL;
- *AL = BL;
- RETURN(ER);
- {$7d}
-
- INT B_TERM(CHAR *S, INT *V, INT *L, INT PC)
- {$7b}
- STATIC SIGNED CHAR T[maxline];
- INT ER,I,AFL, LABEL;
-
- IF(!(ER=T_CONV((SIGNED CHAR*)S,T,L,PC,&I,&I,&I,1)))
- {$7b}
- ER=A_TERM(T,V,&I,PC,&AFL,&LABEL,0);
-
- {$7d}
- RETURN(ER);
- {$7d}
-
- STATIC INT T_CONV(SIGNED CHAR *S, SIGNED CHAR *T, INT *L, INT PC, INT *NK,
- INT *NA1, INT *NA2, INT AF) /* pASS1 VON S NACH T */
- {$7b}
- STATIC INT P,Q,UD,N,V,LL,MK,ER,F;
- STATIC INT OPERAND,O,FL,AFL;
-
- *NK=0; /* aNZAHL kOMMA */
- *NA1=0; /* aNZAHL "ASC-TEXTE" */
- *NA2=0; /* UND aNZAHL bYTE IN DIESEN */
- LL=0;
- ER=e_ok;
- P=0;
- Q=0;
- UD=0;
- MK=0; /* 0 = MEHRERE kOMMAS ERLAUBT */
- FL=0; /* 1 = TEXT EINFACH WEITERGEBEN */
- AFL=0; /* POINTER FLAG FOR LABEL */
-
- WHILE(S[P]==' ') P++;
-
- N=t_end;
-
- IF(!AF)
- {$7b}
- WHILE(S[P]!='\0' && S[P]!=';')
- {$7b}
-
- IF(!(ER=T_KEYWORD(S+P,&LL,&N)))
- BREAK;
-
- IF(ER && ER!=e_nokey)
- BREAK;
-
- IF((ER=L_DEF((CHAR*)S+P,&LL,&N,&F)))
- BREAK;
-
- P+=LL;
-
- WHILE(S[P]==' ') P++;
-
- IF(S[P]=='=')
- {$7b}
- T[Q++]=t_op;
- T[Q++]=N&255;
- T[Q++]=(N>>8)&255;
- T[Q++]='=';
- P++;
- LL=N=0;
- BREAK;
- {$7d} ELSE
- IF(F && S[P]!='\0' && S[P+1]=='=')
- {$7b}
- T[Q++]=t_op;
- T[Q++]=N&255;
- T[Q++]=(N>>8)&255;
- T[Q++]=S[P];
- P+=2;
- LL=N=0;
- BREAK;
- {$7d} ELSE
- {$7b}
- L_SET(N,PC,SEGMENT);/* SET AS ADDRESS VALUE */
- N=0;
- {$7d}
-
- {$7d}
-
-
- IF(N<=lASTBEF)
- MK=1; /* 1= NUR 1 kOMMA ERLAUBT */
- {$7d}
- IF(S[P]=='\0' {$7c}{$7c} S[P]==';')
- {$7b}
- ER=e_noline;
- LL=0;
- {$7d} ELSE
- IF(!ER)
- {$7b}
-
- P+=LL;
- IF(LL)
- T[Q++]=N;
-
- OPERAND=1;
-
- WHILE(S[P]==' ') P++;
-
- IF(S[P]=='#')
- {$7b}
- MK=0;
- T[Q++]=S[P++];
- WHILE(S[P]==' ')
- P++;
- {$7d}
- WHILE(S[P]!='\0' && S[P]!=';' && !ER)
- {$7b}
- IF(FL)
- {$7b}
- T[Q++]=S[P++];
- {$7d} ELSE
- {$7b}
- IF(OPERAND)
- {$7b}
- IF(S[P]=='(' {$7c}{$7c} S[P]=='-' {$7c}{$7c} S[P]=='>' {$7c}{$7c} S[P]=='<')
- {$7b}
- T[Q++]=S[P++];
- OPERAND= -OPERAND+1;
- {$7d} ELSE
- IF(S[P]=='*')
- {$7b}
- T[Q++]=S[P++];
- {$7d} ELSE
- IF(ISALPHA(S[P]) {$7c}{$7c} S[P]=='_')
- {$7b}
- ER=L_SUCH((CHAR*)S+P,&LL,&N,&V,&AFL);
- IF(!ER)
- {$7b}
- IF(AFL) {$7b}
- T[Q++]=t_pointer;
- T[Q++]=AFL & 255;
- T[Q++]=V & 255;
- T[Q++]=(V>>8) & 255;
- {$7d} ELSE {$7b}
- WVAL(Q,V);
- {$7d}
- {$7d}
- ELSE
- IF(ER==e_nodef)
- {$7b}
- T[Q++]=t_label;
- T[Q++]=N & 255;
- T[Q++]=(N>>8) & 255;
- UD++;
- ER=e_ok;
- {$7d}
- P+=LL;
- {$7d}
- ELSE
- IF(S[P]<='9' && S[P]>='0')
- {$7b}
- TG_DEZ(S+P,&LL,&V);
- P+=LL;
- WVAL(Q,V);
- {$7d}
- ELSE
- SWITCH(S[P]) {$7b}
- CASE '$':
- TG_HEX(S+P+1,&LL,&V);
- P+=1+LL;
- WVAL(Q,V);
- BREAK;
- CASE '%':
- TG_BIN(S+P+1,&LL,&V);
- P+=1+LL;
- WVAL(Q,V);
- BREAK;
- CASE '&':
- TG_OCT(S+P+1,&LL,&V);
- P+=1+LL;
- WVAL(Q,V);
- BREAK;
- CASE '\"':
- ER=TG_ASC(S+P,T+Q,&Q,&P,NA1,NA2);
- BREAK;
- CASE ',':
- IF(MK)
- WHILE(S[P]!='\0' && S[P]!=';')
- {$7b}
- WHILE(S[P]==' ') P++;
- *NK+=(S[P]==',');
- T[Q++]=S[P++];
- {$7d}
- ELSE
- {$7b}
- *NK+=1;
- T[Q++]=S[P++];
- {$7d}
- BREAK;
- DEFAULT :
- ER=e_syntax;
- BREAK;
- {$7d}
- OPERAND= -OPERAND+1;
-
- {$7d} ELSE /* OPERATOR */
- {$7b}
- O=0;
- IF(S[P]==')')
- {$7b}
- T[Q++]=S[P++];
- OPERAND =-OPERAND+1;
- {$7d} ELSE
- IF(S[P]==',')
- {$7b}
- T[Q++]=S[P++];
- IF(MK)
- FL++;
- *NK+=1;
- {$7d} ELSE
- SWITCH(S[P]) {$7b}
- CASE '+':
- O=1;
- BREAK;
- CASE '-':
- O=2;
- BREAK;
- CASE '*':
- O=3;
- BREAK;
- CASE '/':
- O=4;
- BREAK;
- CASE '<':
- SWITCH (S[P+1]) {$7b}
- CASE '<':
- O=6;
- BREAK;
- CASE '>':
- O=12;
- BREAK;
- CASE '=':
- O=10;
- BREAK;
- DEFAULT :
- O=7;
- BREAK;
- {$7d}
- BREAK;
- CASE '>':
- SWITCH (S[P+1]) {$7b}
- CASE '>':
- O=5;
- BREAK;
- CASE '<':
- O=12;
- BREAK;
- CASE '=':
- O=11;
- BREAK;
- DEFAULT:
- O=8;
- BREAK;
- {$7d}
- BREAK;
- CASE '=':
- SWITCH (S[P+1]) {$7b}
- CASE '<':
- O=10;
- BREAK;
- CASE '>':
- O=11;
- BREAK;
- DEFAULT:
- O=9;
- BREAK;
- {$7d}
- BREAK;
- CASE '&':
- IF (S[P+1]=='&')
- O=16;
- ELSE
- O=13;
- BREAK;
- CASE '{$7c}':
- IF (S[P+1]=='{$7c}')
- O=17;
- ELSE
- O=15;
- BREAK;
- CASE '^':
- O=14;
- BREAK;
- DEFAULT:
- ER=e_syntax;
- BREAK;
- {$7d}
- IF(O)
- {$7b}
- T[Q++]=O;
- P+=LP[O];
- {$7d}
- OPERAND= -OPERAND+1;
- {$7d}
-
- WHILE(S[P]==' ') P++;
- {$7d}
- {$7d}
- {$7d}
- IF(!ER)
- {$7b}
- T[Q++]=t_end;
- IF(UD)
- ER=e_nodef;
- {$7d}
- *L=Q;
-
- RETURN(ER);
- {$7d}
-
- STATIC INT T_KEYWORD(SIGNED CHAR *S, INT *L, INT *N)
- {$7b}
- INT I=0,J,HASH;
-
- IF(!ISALPHA(S[0]) && S[0]!='.' && S[0]!='*' )
- RETURN(e_nokey);
-
- IF(ISALPHA(S[0]))
- HASH=TOLOWER(S[0])-'A';
- ELSE
- HASH=26;
-
-
- IF(S[0]=='*') {$7b}
- J=1;
- WHILE(S[J] && ISSPACE(S[J])) J++;
- IF(S[J]=='=') {$7b}
- I=kPCDEF;
- J++;
- {$7d}
- {$7d}
- IF(!I) {$7b}
- I=KTP[HASH];
- HASH=KTP[HASH+1];
- WHILE(I<HASH)
- {$7b}
- J=0;
- WHILE(KT[I][J]!='\0' && KT[I][J]==TOLOWER(S[J]))
- J++;
-
- IF((KT[I][J]=='\0') && ((I==kPCDEF) {$7c}{$7c} ((S[J]!='_') && !ISALNUM(S[J]))))
- BREAK;
- I++;
- {$7d}
- {$7d}
- IF(I==kBYTE) I=kBYT;
- IF(I==kDUPB) I=kDSB;
- IF(I==kBLKB) I=kDSB;
- IF(I==kDB) I=kBYT;
- IF(I==kDW) I=kWORD;
- IF(I==kBLOCK) I=kOPEN;
- IF(I==kBEND) I=kCLOSE;
- *L=J;
- *N=I;
- RETURN( I==HASH ? e_nokey : e_ok );
- {$7d}
-
- STATIC VOID TG_DEZ(S,L,V)
- SIGNED CHAR *S;
- INT *L,*V;
- {$7b}
- INT I=0,VAL=0;
-
- WHILE(ISDIGIT(S[I]))
- VAL=VAL*10+(S[I++]-'0');
-
- *L=I;
- *V=VAL;
- {$7d}
-
- STATIC VOID TG_BIN(SIGNED CHAR *S, INT *L, INT *V)
- {$7b}
- INT I=0,VAL=0;
-
- WHILE(S[I]=='0' {$7c}{$7c} S[I]=='1')
- VAL=VAL*2+(S[I++]-'0');
-
- *L=I;
- *V=VAL;
- {$7d}
-
- STATIC VOID TG_OCT(SIGNED CHAR *S, INT *L, INT *V)
- {$7b}
- INT I=0,VAL=0;
-
- WHILE(S[I]<'8' && S[I]>='0')
- VAL=VAL*8+(S[I++]-'0');
-
- *L=I;
- *V=VAL;
- {$7d}
-
- STATIC VOID TG_HEX(SIGNED CHAR *S, INT *L, INT *V)
- {$7b}
- INT I=0,VAL=0;
-
- WHILE((S[I]>='0' && S[I]<='9') {$7c}{$7c} (TOLOWER(S[I])<='F' && TOLOWER(S[I])>='A'))
- {$7b}
- VAL=VAL*16+(S[I]<='9' ? S[I]-'0' : TOLOWER(S[I])-'A'+10);
- I++;
- {$7d}
- *L=I;
- *V=VAL;
- {$7d}
-
- STATIC INT TG_ASC(SIGNED CHAR *S, SIGNED CHAR *T, INT *Q, INT *P, INT *NA1, INT *NA2)
- {$7b}
- INT ER=e_ok,I=0,J=0;
-
- T[J++]=S[I++]; /* " */
- J++;
- WHILE(S[I]!='\0' && S[I]!='\"')
- {$7b}
- IF(S[I]!='^')
- T[J++]=S[I];
- ELSE
- SWITCH(S[I+1]) {$7b}
- CASE '\0':
- CASE '\"':
- ER=e_syntax;
- BREAK;
- CASE '^':
- T[J++]='^';
- I++;
- BREAK;
- DEFAULT:
- T[J++]=S[I+1]&0X1F;
- I++;
- BREAK;
- {$7d}
- I++;
- {$7d}
- IF(J==3)
- {$7b}
- T[0]=t_value;
- T[1]=T[2];
- T[2]=0;
- {$7d} ELSE
- {$7b}
- T[1]=J-2;
- *NA1 +=1;
- *NA2 +=J-2;
- {$7d}
- IF(S[I]=='\"')
- I++;
- *Q +=J;
- *P +=I;
- RETURN(ER);
- {$7d}
-
-