home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / CASSM.SFX / assm5.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-27  |  6.5 KB  |  407 lines

  1. /*
  2.  * 6502 ┴SSEMBLER ╧BJECT ╧UPTPUT
  3.  * ╞ILENAME:  ASSM5.C
  4.  *
  5.  */
  6.  
  7.  
  8. #INCLUDE <STDIO.H>
  9. #INCLUDE "ASSM.D1"
  10. #INCLUDE "ASSM.D2"
  11.  
  12. /*
  13.  * ╘HE STRUCTURES DESCRIBING THE VARIOUS
  14.  * EXTERNAL AND RELOCATABLE OBJECTS MUST
  15.  * ALL HAVE A LINK POINTER AS THE FIRST
  16.  * FIELD, SO THEY MAY BE PROCESSED USING
  17.  * A COMMON ROUTINE.  ╙TRUCT EXTREC IS
  18.  * A GENERIC NAME FOR THIS COMMON STRUCTURE.
  19.  */
  20.  
  21. STRUCT EXTREC /* GENERIC RELOCATION/EXTERNAL RECORD */
  22.   STRUCT EXTREC *EXTñNEXT;
  23. ▌;
  24.  
  25. STRUCT RELREC /* RELOCATION RECORD */
  26.   STRUCT RELREC *RELñNEXT;
  27.   UNSIGNED RELñOFFSET;
  28. ▌;
  29.  
  30. STRUCT DEFREC /* EXTERNAL DEFINITION */
  31.   STRUCT DEFREC *DEFñNEXT;
  32.   STRUCT SYMTYPE *DEFñSYMDEF;
  33. ▌;
  34.  
  35. STRUCT REFREC /* EXTERNAL REFERENCE */
  36.   STRUCT REFREC *REFñNEXT;
  37.   STRUCT SYMTYPE *REFñSYMDEF;
  38.   UNSIGNED MODCODE; /* 0,1 OR 2, PLUS (INCREMENT << 2) */
  39.   UNSIGNED REFñOFFSET;
  40. ▌;
  41.  
  42. STRUCT DATREC /* DATA SEGMENT */
  43.   STRUCT DATREC *DATñNEXT;
  44.   STRUCT SYMTYPE *DATñSYMDEF;
  45.   UNSIGNED SIZE;
  46. ▌;
  47.  
  48. /* POINTERS TO THE ENDS OF FOUR CIRCULAR
  49.  * LISTS:
  50.  */
  51. #DEFINE ╥┼╠ 0
  52. #DEFINE ─┼╞ 1
  53. #DEFINE ╥┼╞ 2
  54. #DEFINE ─┴╘ 3
  55. STATIC STRUCT EXTREC *LISTTAIL[4];
  56. STATIC UNSIGNED CNT[4];
  57.  
  58. STATIC UNSIGNED OBJLOC;
  59.  
  60. /**************************************
  61.  *
  62.  * ┴DD ITEM TO A RELOCATION INFO LIST.
  63.  *
  64.  */
  65. ╓╧╔─ ADDREC(P, LIST)
  66. STRUCT EXTREC *P;
  67. CHAR LIST;
  68.   STRUCT EXTREC *TAIL;
  69.  
  70.   TAIL = LISTTAIL[LIST];
  71.   IF ( TAIL )
  72.   █
  73.     P->EXTñNEXT = TAIL->EXTñNEXT;
  74.     TAIL->EXTñNEXT = P;
  75.   ▌
  76.   ELSE
  77.     P->EXTñNEXT = P;
  78.  
  79.   LISTTAIL[LIST] = P;
  80.   CNT[LIST]++;
  81.  
  82. #IFDEF ─┼╞╘╥┴├┼
  83.   IF (DFLAG)
  84.     PRINTF("┼XT/╥EL RECORD, TYPE %D\N", LIST);
  85. #ENDIF
  86.  
  87. /*
  88.  * ┴DD LABEL DEFINITION TO RELOCATION INFO LIST.
  89.  *
  90.  */
  91. ╓╧╔─ ADDDEF(P)
  92. STRUCT SYMTYPE *P;
  93.   STRUCT DEFREC *RP;
  94.  
  95.   IF (P->XDFLAG)
  96.   █
  97.     RP = (STRUCT DEFREC *) MAKEREC ( SIZEOF(STRUCT DEFREC) );
  98.     RP->DEFñSYMDEF = P;
  99.     ADDREC(RP,─┼╞); /* ADD TO INFO LIST */
  100.   ▌
  101.  
  102. /* 
  103.  * ╧UTPUT OBJECT COUNT AND INITIALIZE
  104.  * REFERENCE LIST POINTERS
  105.  *
  106.  */
  107. ╓╧╔─ PUTOC()
  108.   CHAR I;
  109.  
  110.   PUTW(LOCCNT,OPTR); /* FIRST WORD IN OBJECT FILE */
  111.   FOR (I=0; I<4; I++)
  112.   █
  113.     LISTTAIL[I] = ╬╒╠╠;
  114.     CNT[I] = 0;
  115.   ▌
  116.   OBJLOC = 0;
  117.  
  118. /* 
  119.  * ╧UTPUT EXTERNAL/RELOCATION ENTRIES AND
  120.  * FREE THE RECORDS
  121.  *
  122.  */
  123. ╓╧╔─ PUTRECS(LIST)
  124. CHAR LIST;
  125.   STRUCT EXTREC *PTR, *NXTPTR;
  126.   STRUCT SYMTYPE *SP;
  127.   STRUCT RELREC *RELPTR;
  128.   STRUCT DEFREC *DEFPTR;
  129.   STRUCT REFREC *REFPTR;
  130.   STRUCT DATREC *DATPTR;
  131.  
  132.   PUTW(CNT[LIST], OPTR);
  133.   IF ((PTR = LISTTAIL[LIST])==╬╒╠╠)
  134.     RETURN;
  135.   NXTPTR = PTR->NEXT;
  136.   DO
  137.   █
  138.     PTR = NXTPTR;
  139.     SWITCH (LIST)
  140.     █
  141.     CASE ╥┼╠:
  142.       RELPTR = (STRUCT RELREC *) PTR;
  143.       PUTW(RELPTR->RELñOFFSET, OPTR);
  144.       BREAK;
  145.     CASE ─┼╞:
  146.       DEFPTR = (STRUCT DEFREC *) PTR;
  147.       SP = DEFPTR->DEFñSYMDEF;
  148.       PUTNAME(SP);
  149.       IF (ISREL(SP->FLAG))
  150.         FPUTC(1,OPTR);
  151.       ELSE
  152.         FPUTC(0,OPTR);
  153.       PUTW(SP->VALUE, OPTR);
  154.       BREAK;
  155.     CASE ╥┼╞:
  156.       REFPTR = (STRUCT REFREC *) PTR;
  157.       SP = REFPTR->REFñSYMDEF;
  158.       PUTNAME(SP);
  159.       PUTW(REFPTR->MODCODE, OPTR);
  160.       PUTW(REFPTR->REFñOFFSET, OPTR);
  161.       BREAK;
  162.     CASE ─┴╘:
  163.       DATPTR = (STRUCT DATREC *) PTR;
  164.       SP = DATPTR->DATñSYMDEF;
  165.       PUTNAME(SP);
  166.       PUTW(DATPTR->SIZE, OPTR);
  167.       BREAK;
  168.     ▌
  169.     NXTPTR = PTR->NEXT;
  170.     FREE(PTR);
  171.   ▌ WHILE ( PTR != LISTTAIL[LIST] );
  172.  
  173. /* 
  174. ** ╧UTPUT SYMBOL NAME REFERENCE.
  175. **
  176. */
  177. ╓╧╔─ PUTNAME(SP)
  178. STRUCT SYMTYPE *SP;
  179.   CHAR C;
  180.   CHAR *P;
  181.  
  182.   P = SP->NAME;
  183.   DO █
  184.     C = *P++;
  185.     FPUTC(C,OPTR);
  186.     ▌
  187.   WHILE (C);
  188.  
  189. /*
  190. ** ┴LLOCATE SIZE BYTES OF STORAGE 
  191. ** ╥ETURNS: POINTER TO EMPTY ENTRY.
  192. **
  193. */
  194. CHAR *MAKEREC(SIZE)
  195. UNSIGNED SIZE;
  196.   CHAR *PTR;
  197.  
  198.   PTR = MALLOC(SIZE);
  199.   IF (PTR==╬╒╠╠) █
  200.     ERROR(21);
  201.     QUIT();
  202.   ▌
  203.   RETURN (PTR);
  204.  
  205. /*
  206.  * ├HECK THE CURRENT OBJECT BYTE AGAINST
  207.  * 'EXPRTYP' TO DETERMINE IF IT IS RELOCATABLE,
  208.  * OR MAKES AN EXTERNAL REFERENCE.
  209.  */
  210. ╓╧╔─ RELCHK(LOC)
  211. UNSIGNED LOC;
  212.   STRUCT RELREC *RELPTR;
  213.   STRUCT REFREC *REFPTR;
  214.  
  215.   IF (ISREL(EXPRTYP) && !EXPRMC)
  216.   █
  217.     RELPTR = (STRUCT RELREC *) MAKEREC(SIZEOF(STRUCT RELREC));
  218.     RELPTR->RELñOFFSET = LOC;
  219.     ADDREC ( RELPTR, ╥┼╠ );
  220.   ▌
  221.   ELSE IF (EXPRTYP==╪╥┼╞ ▀▀ (ISREL(EXPRTYP) && EXPRMC))
  222.   █
  223.     REFPTR = (STRUCT REFREC *) MAKEREC(SIZEOF(STRUCT REFREC));
  224.     REFPTR->MODCODE = EXPRMC;
  225.     REFPTR->REFñOFFSET = LOC;
  226.     REFPTR->REFñSYMDEF = EXPRSYM;
  227.     IF (EXPRSYM->FLAG == ╪╥┼╞)
  228.     █
  229.       IF ( FULLVALUE >= 0X2000 && FULLVALUE < 0XE000 )
  230.         ERROR ( 11 );
  231.       REFPTR->MODCODE ▀= (FULLVALUE << 2);
  232.     ▌
  233.     ADDREC(REFPTR, ╥┼╞);
  234.   ▌
  235.  
  236. /*
  237.  * ╨UT 1 BYTE VALUE TO OBJECT FILE,
  238.  * INCLUDING RELOCATION CHECK
  239.  *
  240.  */
  241. ╓╧╔─ PUT1R(V)
  242. UNSIGNED V;
  243.   IF (OFLAG)
  244.   █
  245.     RELCHK(OBJLOC - 1);
  246.     PUT1(V);
  247.   ▌
  248.  
  249. /*
  250.  * ╨UT 1 BYTE VALUE TO OBJECT FILE
  251.  *
  252.  * ╬OTE: NO RELOCATION CHECK PERFORMED
  253.  */
  254. ╓╧╔─ PUT1(V)
  255. UNSIGNED V;
  256.   IF (OFLAG) █
  257.     FPUTC(V,OPTR);
  258.   ▌
  259.   OBJLOC++;
  260.  
  261. /*
  262.  * ╨UT 2 BYTE VALUE TO OBJECT FILE
  263.  * 
  264.  */
  265. ╓╧╔─ PUT2(V1,V2)
  266. UNSIGNED V1,V2;
  267.   IF (OFLAG) █
  268.     FPUTC(V1,OPTR);
  269.     FPUTC(V2,OPTR);
  270.     IF (EXPRMC)
  271.       RELCHK(OBJLOC);
  272.     ELSE
  273.       RELCHK(OBJLOC - 1);
  274.   ▌
  275.   OBJLOC += 2;
  276. /*
  277.  * ╨UT 3 BYTES TO OBJECT FILE.
  278.  * ╞IRST VALUE IS OPCODE, SECOND IS
  279.  * OPERAND.
  280.  *
  281.  */
  282. ╓╧╔─ PUT3(V1,V2)
  283. UNSIGNED V1,V2;
  284.   IF (OFLAG) █
  285.     FPUTC(V1,OPTR);
  286.     PUTW(V2,OPTR);
  287.     RELCHK(OBJLOC);
  288.   ▌
  289.   OBJLOC += 3;
  290.  
  291. ╓╧╔─ PUTN(N)
  292. INT N;
  293. /*
  294.  * PUT N BYTES OF ZERO
  295.  */
  296.   CHAR BUF[256];
  297.   INT I;
  298.  
  299.   OBJLOC += N;
  300.   IF (!OFLAG) RETURN;
  301.  
  302.   FOR (I=0; I<256; I++)
  303.     BUF[I] = 0;
  304.   WHILE ( N > 0 )
  305.   █
  306.     IF ( N >= 256 )
  307.       I = 256;
  308.     ELSE
  309.       I = N;
  310.     N -= I;
  311.     FWRITE ( BUF, I, 1, OPTR );
  312.   ▌
  313.  
  314. /* CREATE A DATA SEGMENT */
  315.  
  316. ╓╧╔─ PUTDSEG( LEN )
  317. UNSIGNED LEN;
  318.   STRUCT DATREC *PTR;
  319.  
  320.   PTR = (STRUCT DATREC *) MAKEREC(SIZEOF(STRUCT DATREC));
  321.   PTR->DATñSYMDEF = LABLPTR;
  322.   PTR->SIZE = LEN;
  323.   ADDREC(PTR,─┴╘);
  324.  
  325. ╓╧╔─ HALFCHK ()
  326. /* ANY RELOCTABLE EXPRESSION USED WITH
  327.  * A '<' OR '>' OPERATION MUST BE MADE
  328.  * EXTERNAL, SINCE THE LINKER CANNOT
  329.  * RELOCATE HALF-ADDRESSES WHICH ARE NOT
  330.  * EXTERNAL.
  331.  */
  332.   IF  ( EXPRMC )
  333.   █
  334.     IF ( EXPRSYM && EXPRSYM->XDFLAG )
  335.       RETURN;
  336.     IF ( ISABS ( EXPRTYP ) ▀▀ EXPRTYP==╪╥┼╞ )
  337.       RETURN;
  338.     STRCPY ( SYMBOL, ">" );
  339.     STRNCAT ( SYMBOL, FILENAME, ╙┬╧╠╙┌-5 );
  340.     HEXCON ( 4, FULLVALUE );
  341.     STRNCAT ( SYMBOL, HEX, 4 );
  342.     EXPRSYM = STLOOK ();
  343.     IF (PASS==╠┴╙╘ñ╨┴╙╙ && !EXPRSYM->XDFLAG)
  344.     █
  345.       EXPRSYM->FLAG = EXPRTYP;
  346.       EXPRTYP = ╪╥┼╞;
  347.       EXPRSYM->VALUE = FULLVALUE;
  348.       EXPRSYM->XDFLAG = 1;
  349.       IF (OFLAG) ADDDEF ( EXPRSYM );
  350.     ▌
  351.   ▌
  352.  
  353. #IFDEF ╒╬╔╪
  354.  
  355. CHAR *INDEX(S,C)
  356. CHAR *S, C;
  357.   WHILE (*S)
  358.     IF (C == *S) RETURN S;
  359.     ELSE S++;
  360.   RETURN 0;
  361.  
  362. #ENDIF
  363.  
  364. ╓╧╔─ QUIT()
  365. #IFDEF ╒╬╔╪
  366.   EXIT ( 1 );
  367. #ELSE
  368.   EXIT ();
  369. #ENDIF
  370.