home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / programming / msdos / xa214f.lzh / xa214f / misc / file65.c next >
C/C++ Source or Header  |  1997-04-16  |  5KB  |  175 lines

  1. /*
  2.     XA65 - 6502 CROSS ASSEMBLER AND UTILITY SUITE
  3.     FILE65 - PRINTS INFORMATION ON 'O65' FILES
  4.     cOPYRIGHT (c) 1997 aNDR{$e9} fACHAT (A.FACHAT@PHYSIK.TU-CHEMNITZ.DE)
  5.  
  6.     tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
  7.     IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
  8.     THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
  9.     (AT YOUR OPTION) ANY LATER VERSION.
  10.  
  11.     tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
  12.     BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
  13.     merchantability OR fitness for a particular purpose.  sEE THE
  14.     gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
  15.  
  16.     yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
  17.     ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
  18.     fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
  19. */
  20.  
  21. #INCLUDE <STDIO.H>
  22. #INCLUDE <STDLIB.H>
  23. #INCLUDE <SYS/STAT.H>
  24. #INCLUDE <UNISTD.H>
  25. #INCLUDE <ERRNO.H>
  26. #INCLUDE <STRING.H>
  27.  
  28. #DEFINEbuf(9*4+8)
  29.  
  30. INT READ_OPTIONS(file *FP);
  31.  
  32. UNSIGNED CHAR HDR[buf];
  33. UNSIGNED CHAR CMP[] = {$7b} 1, 0, 'O', '6', '5' {$7d};
  34.  
  35. INT XAPAR = 0;
  36. INT ROMPAR = 0;
  37. INT ROMOFF = 0;
  38.  
  39. VOID USAGE(VOID) {$7b}
  40. PRINTF("FILE65: PRINTS FILE INFORMATION ON 'O65' FILES\N"
  41. "  FILE65 [OPTIONS] [FILENAMES...]\N"
  42. "OPTIONS:\N"
  43. "  -V        = PRINT VERSION NUMBER\N"
  44. "  -H, -?    = PRINT THIS HELP\N"
  45. "  -p        = PRINT THE SEGMENT END ADDRESSES ACCORDING TO XA COMMAND LINE\N"
  46. "              PARAMETERS '-B?'\N"
  47. "  -A OFFSET = PRINT XA 'ROMABLE' PARAMETER FOR ANOTHER FILE BEHIND THIS ONE\N"
  48. "              IN THE SAME rom. aDD OFFSET TO START ADDRESS.\N"
  49. "  -a OFFSET = SAME AS '-A', BUT ONLY PRINT THE START ADDRESS OF THE NEXT\N"
  50. "              FILE IN THE rom.\N"
  51. );
  52. EXIT(0);
  53. {$7d}
  54.  
  55. INT MAIN(INT ARGC, CHAR *ARGV[]) {$7b}
  56. INT I = 1, N, MODE, HLEN;
  57. file *FP;
  58. CHAR *ALIGNTXT[4]= {$7b}"[ALIGN 1]","[ALIGN 2]","[ALIGN 4]","[ALIGN 256]"{$7d};
  59.  IF(ARGC<=1) USAGE();
  60.  
  61. WHILE(I<ARGC) {$7b}
  62.   IF(ARGV[I][0]=='-') {$7b}
  63.     /* PROCESS OPTIONS */
  64.     SWITCH(ARGV[I][1]) {$7b}
  65.     CASE 'V':
  66. PRINTF("FILE65: vERSION 0.2\N");
  67. BREAK;
  68.     CASE 'A':
  69.     CASE 'a':
  70. ROMPAR = 1;
  71. IF(ARGV[I][1]=='a') ROMPAR++;
  72. IF(ARGV[I][2]) ROMOFF = ATOI(ARGV[I]+2);
  73. ELSE ROMOFF = ATOI(ARGV[++I]);
  74. BREAK;
  75.     CASE 'p':
  76. XAPAR = 1;
  77. BREAK;
  78.     CASE 'H':
  79.     CASE '?':
  80. USAGE();
  81.     DEFAULT:
  82. FPRINTF(STDERR,"FILE65: %S UNKNOWN OPTION\N",ARGV[I]);
  83. BREAK;
  84.     {$7d}
  85.   {$7d} ELSE {$7b}
  86.     FP = FOPEN(ARGV[I],"RB");
  87.     IF(FP) {$7b}
  88.       N = FREAD(HDR, 1, 8, FP);
  89.       IF((N>=8) && (!MEMCMP(HDR, CMP, 5))) {$7b}
  90. MODE=HDR[7]*256+HDR[6];
  91. IF(!XAPAR && !ROMPAR) {$7b}
  92.   PRINTF("%S: O65 VERSION %D %S FILE\N", ARGV[I], HDR[5],
  93. HDR[7]&0X10 ? "OBJECT" : "EXECUTABLE");
  94.   PRINTF(" MODE: %04X =",MODE );
  95.   PRINTF("%S%S%S%S%S\N", 
  96. (MODE & 0X1000)?"[OBJECT]":"[EXECUTABLE]",
  97. (MODE & 0X2000)?"[32BIT]":"[16BIT]",
  98. (MODE & 0X4000)?"[PAGE RELOCATION]":"[BYTE RELOCATION]",
  99. (MODE & 0X8000)?"[cpu 65816]":"[cpu 6502]",
  100. ALIGNTXT[MODE & 3]);
  101. {$7d}
  102. IF(MODE & 0X2000) {$7b}
  103.           FPRINTF(STDERR,"FILE65: %S: 32 BIT SIZE NOT SUPPORTED\N", ARGV[I]);
  104. {$7d} ELSE {$7b}
  105.   N=FREAD(HDR+8, 1, 18, FP);
  106.   IF(N<18) {$7b}
  107.             FPRINTF(STDERR,"FILE65: %S: TRUNCATED FILE\N", ARGV[I]);
  108.   {$7d} ELSE {$7b}
  109.     HLEN = 8+18+READ_OPTIONS(FP);
  110.     IF(!XAPAR && !ROMPAR) {$7b}
  111.       PRINTF(" TEXT SEGMENT @ $%04X - $%04X [$%04X BYTES]\N", HDR[9]*256+HDR[8], HDR[9]*256+HDR[8]+HDR[11]*256+HDR[10], HDR[11]*256+HDR[10]);
  112.       PRINTF(" DATA SEGMENT @ $%04X - $%04X [$%04X BYTES]\N", HDR[13]*256+HDR[12], HDR[13]*256+HDR[12]+HDR[15]*256+HDR[14], HDR[15]*256+HDR[14]);
  113.       PRINTF(" BSS  SEGMENT @ $%04X - $%04X [$%04X BYTES]\N", HDR[17]*256+HDR[16], HDR[17]*256+HDR[16]+HDR[19]*256+HDR[18], HDR[19]*256+HDR[18]);
  114.       PRINTF(" ZERO SEGMENT @ $%04X - $%04X [$%04X BYTES]\N", HDR[21]*256+HDR[20], HDR[21]*256+HDR[20]+HDR[23]*256+HDR[22], HDR[23]*256+HDR[22]);
  115.       PRINTF(" STACK SIZE $%04X BYTES %S\N", HDR[25]*256+HDR[24],
  116. (HDR[25]*256+HDR[24])==0?"(I.E. UNKNOWN)":"");
  117.     {$7d} ELSE {$7b}
  118.       STRUCT STAT FBUF;
  119.       STAT(ARGV[I],&FBUF);
  120.       IF(XAPAR) {$7b}
  121. IF(!ROMPAR) PRINTF("-BT %D ",
  122.     (HDR[9]*256+HDR[8]) + (HDR[11]*256+HDR[10])
  123. );
  124. PRINTF("-BD %D -BB %D -BZ %D ",
  125.   (HDR[13]*256+HDR[12]) + (HDR[15]*256+HDR[14]),
  126.   (HDR[17]*256+HDR[16]) + (HDR[19]*256+HDR[18]),
  127.   (HDR[21]*256+HDR[20]) + (HDR[23]*256+HDR[22])
  128.         ); 
  129.       {$7d}
  130.       IF(ROMPAR==1) {$7b}
  131. PRINTF("-a %LD ", (HDR[9]*256+HDR[8])
  132. -HLEN +ROMOFF +FBUF.ST_SIZE);
  133.       {$7d} ELSE
  134.       IF(ROMPAR==2) {$7b}
  135. PRINTF("%LD ", (HDR[9]*256+HDR[8])
  136. -HLEN +ROMOFF +FBUF.ST_SIZE);
  137.       {$7d}
  138.       PRINTF("\N");
  139.     {$7d}
  140.   {$7d}
  141. {$7d}
  142.       {$7d} ELSE {$7b}
  143.         FPRINTF(STDERR,"FILE65: %S: NOT AN O65 FILE!\N", ARGV[I]);
  144. IF(HDR[0]==1 && HDR[1]==8 && HDR[3]==8) {$7b}
  145.   PRINTF("%S: c64 basic EXECUTABLE (START ADDRESS $0801)?\N", ARGV[I]);
  146. {$7d} ELSE
  147. IF(HDR[0]==1 && HDR[1]==4 && HDR[3]==4) {$7b}
  148.   PRINTF("%S: cbm pet basic EXECUTABLE (START ADDRESS $0401)?\N", ARGV[I]);
  149. {$7d}
  150.       {$7d}
  151.     {$7d} ELSE {$7b}
  152.       FPRINTF(STDERR,"FILE65: %S: %S\N", ARGV[I], STRERROR(ERRNO));
  153.     {$7d}
  154.   {$7d}
  155.   I++;
  156. {$7d}
  157. RETURN 0;
  158. {$7d}
  159.  
  160.  
  161. INT READ_OPTIONS(file *FP) {$7b}
  162. INT C, L=0;
  163. CHAR TB[256];
  164.  
  165. C=FGETC(FP); L++;
  166. WHILE(C && C!=eof) {$7b}
  167.   C&=255;
  168.   FREAD(TB, 1, C-1, FP);
  169.   L+=C;
  170.   C=FGETC(FP);
  171. {$7d}
  172. RETURN L;
  173. {$7d}
  174.  
  175.