home *** CD-ROM | disk | FTP | other *** search
- /*
- * 6502 ┴SSEMBLER ╧BJECT ╧UPTPUT
- * ╞ILENAME: ASSM5.C
- *
- */
-
-
- #INCLUDE <STDIO.H>
- #INCLUDE "ASSM.D1"
- #INCLUDE "ASSM.D2"
-
- /*
- * ╘HE STRUCTURES DESCRIBING THE VARIOUS
- * EXTERNAL AND RELOCATABLE OBJECTS MUST
- * ALL HAVE A LINK POINTER AS THE FIRST
- * FIELD, SO THEY MAY BE PROCESSED USING
- * A COMMON ROUTINE. ╙TRUCT EXTREC IS
- * A GENERIC NAME FOR THIS COMMON STRUCTURE.
- */
-
- STRUCT EXTREC /* GENERIC RELOCATION/EXTERNAL RECORD */
- █
- STRUCT EXTREC *EXTñNEXT;
- ▌;
-
- STRUCT RELREC /* RELOCATION RECORD */
- █
- STRUCT RELREC *RELñNEXT;
- UNSIGNED RELñOFFSET;
- ▌;
-
- STRUCT DEFREC /* EXTERNAL DEFINITION */
- █
- STRUCT DEFREC *DEFñNEXT;
- STRUCT SYMTYPE *DEFñSYMDEF;
- ▌;
-
- STRUCT REFREC /* EXTERNAL REFERENCE */
- █
- STRUCT REFREC *REFñNEXT;
- STRUCT SYMTYPE *REFñSYMDEF;
- UNSIGNED MODCODE; /* 0,1 OR 2, PLUS (INCREMENT << 2) */
- UNSIGNED REFñOFFSET;
- ▌;
-
- STRUCT DATREC /* DATA SEGMENT */
- █
- STRUCT DATREC *DATñNEXT;
- STRUCT SYMTYPE *DATñSYMDEF;
- UNSIGNED SIZE;
- ▌;
-
- /* POINTERS TO THE ENDS OF FOUR CIRCULAR
- * LISTS:
- */
- #DEFINE ╥┼╠ 0
- #DEFINE ─┼╞ 1
- #DEFINE ╥┼╞ 2
- #DEFINE ─┴╘ 3
- STATIC STRUCT EXTREC *LISTTAIL[4];
- STATIC UNSIGNED CNT[4];
-
- STATIC UNSIGNED OBJLOC;
-
- /**************************************
- *
- * ┴DD ITEM TO A RELOCATION INFO LIST.
- *
- */
- ╓╧╔─ ADDREC(P, LIST)
- STRUCT EXTREC *P;
- CHAR LIST;
- █
- STRUCT EXTREC *TAIL;
-
- TAIL = LISTTAIL[LIST];
- IF ( TAIL )
- █
- P->EXTñNEXT = TAIL->EXTñNEXT;
- TAIL->EXTñNEXT = P;
- ▌
- ELSE
- P->EXTñNEXT = P;
-
- LISTTAIL[LIST] = P;
- CNT[LIST]++;
-
- #IFDEF ─┼╞╘╥┴├┼
- IF (DFLAG)
- PRINTF("┼XT/╥EL RECORD, TYPE %D\N", LIST);
- #ENDIF
- ▌
-
- /*
- * ┴DD LABEL DEFINITION TO RELOCATION INFO LIST.
- *
- */
- ╓╧╔─ ADDDEF(P)
- STRUCT SYMTYPE *P;
- █
- STRUCT DEFREC *RP;
-
- IF (P->XDFLAG)
- █
- RP = (STRUCT DEFREC *) MAKEREC ( SIZEOF(STRUCT DEFREC) );
- RP->DEFñSYMDEF = P;
- ADDREC(RP,─┼╞); /* ADD TO INFO LIST */
- ▌
- ▌
-
- /*
- * ╧UTPUT OBJECT COUNT AND INITIALIZE
- * REFERENCE LIST POINTERS
- *
- */
- ╓╧╔─ PUTOC()
- █
- CHAR I;
-
- PUTW(LOCCNT,OPTR); /* FIRST WORD IN OBJECT FILE */
- FOR (I=0; I<4; I++)
- █
- LISTTAIL[I] = ╬╒╠╠;
- CNT[I] = 0;
- ▌
- OBJLOC = 0;
- ▌
-
- /*
- * ╧UTPUT EXTERNAL/RELOCATION ENTRIES AND
- * FREE THE RECORDS
- *
- */
- ╓╧╔─ PUTRECS(LIST)
- CHAR LIST;
- █
- STRUCT EXTREC *PTR, *NXTPTR;
- STRUCT SYMTYPE *SP;
- STRUCT RELREC *RELPTR;
- STRUCT DEFREC *DEFPTR;
- STRUCT REFREC *REFPTR;
- STRUCT DATREC *DATPTR;
-
- PUTW(CNT[LIST], OPTR);
- IF ((PTR = LISTTAIL[LIST])==╬╒╠╠)
- RETURN;
- NXTPTR = PTR->NEXT;
- DO
- █
- PTR = NXTPTR;
- SWITCH (LIST)
- █
- CASE ╥┼╠:
- RELPTR = (STRUCT RELREC *) PTR;
- PUTW(RELPTR->RELñOFFSET, OPTR);
- BREAK;
- CASE ─┼╞:
- DEFPTR = (STRUCT DEFREC *) PTR;
- SP = DEFPTR->DEFñSYMDEF;
- PUTNAME(SP);
- IF (ISREL(SP->FLAG))
- FPUTC(1,OPTR);
- ELSE
- FPUTC(0,OPTR);
- PUTW(SP->VALUE, OPTR);
- BREAK;
- CASE ╥┼╞:
- REFPTR = (STRUCT REFREC *) PTR;
- SP = REFPTR->REFñSYMDEF;
- PUTNAME(SP);
- PUTW(REFPTR->MODCODE, OPTR);
- PUTW(REFPTR->REFñOFFSET, OPTR);
- BREAK;
- CASE ─┴╘:
- DATPTR = (STRUCT DATREC *) PTR;
- SP = DATPTR->DATñSYMDEF;
- PUTNAME(SP);
- PUTW(DATPTR->SIZE, OPTR);
- BREAK;
- ▌
- NXTPTR = PTR->NEXT;
- FREE(PTR);
- ▌ WHILE ( PTR != LISTTAIL[LIST] );
- ▌
-
- /*
- ** ╧UTPUT SYMBOL NAME REFERENCE.
- **
- */
- ╓╧╔─ PUTNAME(SP)
- STRUCT SYMTYPE *SP;
- █
- CHAR C;
- CHAR *P;
-
- P = SP->NAME;
- DO █
- C = *P++;
- FPUTC(C,OPTR);
- ▌
- WHILE (C);
- ▌
-
- /*
- ** ┴LLOCATE SIZE BYTES OF STORAGE
- ** ╥ETURNS: POINTER TO EMPTY ENTRY.
- **
- */
- CHAR *MAKEREC(SIZE)
- UNSIGNED SIZE;
- █
- CHAR *PTR;
-
- PTR = MALLOC(SIZE);
- IF (PTR==╬╒╠╠) █
- ERROR(21);
- QUIT();
- ▌
- RETURN (PTR);
- ▌
-
- /*
- * ├HECK THE CURRENT OBJECT BYTE AGAINST
- * 'EXPRTYP' TO DETERMINE IF IT IS RELOCATABLE,
- * OR MAKES AN EXTERNAL REFERENCE.
- */
- ╓╧╔─ RELCHK(LOC)
- UNSIGNED LOC;
- █
- STRUCT RELREC *RELPTR;
- STRUCT REFREC *REFPTR;
-
- IF (ISREL(EXPRTYP) && !EXPRMC)
- █
- RELPTR = (STRUCT RELREC *) MAKEREC(SIZEOF(STRUCT RELREC));
- RELPTR->RELñOFFSET = LOC;
- ADDREC ( RELPTR, ╥┼╠ );
- ▌
- ELSE IF (EXPRTYP==╪╥┼╞ ▀▀ (ISREL(EXPRTYP) && EXPRMC))
- █
- REFPTR = (STRUCT REFREC *) MAKEREC(SIZEOF(STRUCT REFREC));
- REFPTR->MODCODE = EXPRMC;
- REFPTR->REFñOFFSET = LOC;
- REFPTR->REFñSYMDEF = EXPRSYM;
- IF (EXPRSYM->FLAG == ╪╥┼╞)
- █
- IF ( FULLVALUE >= 0X2000 && FULLVALUE < 0XE000 )
- ERROR ( 11 );
- REFPTR->MODCODE ▀= (FULLVALUE << 2);
- ▌
- ADDREC(REFPTR, ╥┼╞);
- ▌
- ▌
-
- /*
- * ╨UT 1 BYTE VALUE TO OBJECT FILE,
- * INCLUDING RELOCATION CHECK
- *
- */
- ╓╧╔─ PUT1R(V)
- UNSIGNED V;
- █
- IF (OFLAG)
- █
- RELCHK(OBJLOC - 1);
- PUT1(V);
- ▌
- ▌
-
- /*
- * ╨UT 1 BYTE VALUE TO OBJECT FILE
- *
- * ╬OTE: NO RELOCATION CHECK PERFORMED
- */
- ╓╧╔─ PUT1(V)
- UNSIGNED V;
- █
- IF (OFLAG) █
- FPUTC(V,OPTR);
- ▌
- OBJLOC++;
- ▌
-
- /*
- * ╨UT 2 BYTE VALUE TO OBJECT FILE
- *
- */
- ╓╧╔─ PUT2(V1,V2)
- UNSIGNED V1,V2;
- █
- IF (OFLAG) █
- FPUTC(V1,OPTR);
- FPUTC(V2,OPTR);
- IF (EXPRMC)
- RELCHK(OBJLOC);
- ELSE
- RELCHK(OBJLOC - 1);
- ▌
- OBJLOC += 2;
- ▌
- /*
- * ╨UT 3 BYTES TO OBJECT FILE.
- * ╞IRST VALUE IS OPCODE, SECOND IS
- * OPERAND.
- *
- */
- ╓╧╔─ PUT3(V1,V2)
- UNSIGNED V1,V2;
- █
- IF (OFLAG) █
- FPUTC(V1,OPTR);
- PUTW(V2,OPTR);
- RELCHK(OBJLOC);
- ▌
- OBJLOC += 3;
- ▌
-
- ╓╧╔─ PUTN(N)
- INT N;
- /*
- * PUT N BYTES OF ZERO
- */
- █
- CHAR BUF[256];
- INT I;
-
- OBJLOC += N;
- IF (!OFLAG) RETURN;
-
- FOR (I=0; I<256; I++)
- BUF[I] = 0;
- WHILE ( N > 0 )
- █
- IF ( N >= 256 )
- I = 256;
- ELSE
- I = N;
- N -= I;
- FWRITE ( BUF, I, 1, OPTR );
- ▌
- ▌
-
- /* CREATE A DATA SEGMENT */
-
- ╓╧╔─ PUTDSEG( LEN )
- UNSIGNED LEN;
- █
- STRUCT DATREC *PTR;
-
- PTR = (STRUCT DATREC *) MAKEREC(SIZEOF(STRUCT DATREC));
- PTR->DATñSYMDEF = LABLPTR;
- PTR->SIZE = LEN;
- ADDREC(PTR,─┴╘);
- ▌
-
- ╓╧╔─ HALFCHK ()
- /* ANY RELOCTABLE EXPRESSION USED WITH
- * A '<' OR '>' OPERATION MUST BE MADE
- * EXTERNAL, SINCE THE LINKER CANNOT
- * RELOCATE HALF-ADDRESSES WHICH ARE NOT
- * EXTERNAL.
- */
- █
- IF ( EXPRMC )
- █
- IF ( EXPRSYM && EXPRSYM->XDFLAG )
- RETURN;
- IF ( ISABS ( EXPRTYP ) ▀▀ EXPRTYP==╪╥┼╞ )
- RETURN;
- STRCPY ( SYMBOL, ">" );
- STRNCAT ( SYMBOL, FILENAME, ╙┬╧╠╙┌-5 );
- HEXCON ( 4, FULLVALUE );
- STRNCAT ( SYMBOL, HEX, 4 );
- EXPRSYM = STLOOK ();
- IF (PASS==╠┴╙╘ñ╨┴╙╙ && !EXPRSYM->XDFLAG)
- █
- EXPRSYM->FLAG = EXPRTYP;
- EXPRTYP = ╪╥┼╞;
- EXPRSYM->VALUE = FULLVALUE;
- EXPRSYM->XDFLAG = 1;
- IF (OFLAG) ADDDEF ( EXPRSYM );
- ▌
- ▌
- ▌
-
- #IFDEF ╒╬╔╪
-
- CHAR *INDEX(S,C)
- CHAR *S, C;
- █
- WHILE (*S)
- IF (C == *S) RETURN S;
- ELSE S++;
- RETURN 0;
- ▌
-
- #ENDIF
-
- ╓╧╔─ QUIT()
- █
- #IFDEF ╒╬╔╪
- EXIT ( 1 );
- #ELSE
- EXIT ();
- #ENDIF
- ▌
-