home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 242_01 / a51.h < prev    next >
Text File  |  1989-01-13  |  13KB  |  430 lines

  1. /*
  2.     HEADER:        CUG242;
  3.     TITLE:        8051 Cross-Assembler (Portable);
  4.     FILENAME:    A51UTIL.C;
  5.     VERSION:    0.4;
  6.     DATE:        11/09/1988;
  7.  
  8.     DESCRIPTION:    "This program lets you use your computer to assemble
  9.             code for the Intel 8051 family of microprocessors.
  10.             The program is written in portable C rather than BDS
  11.             C.  All assembler features are supported except
  12.             relocation, linkage, and macros.";
  13.  
  14.     KEYWORDS:    Software Development, Assemblers, Cross-Assemblers,
  15.             Intel, 8051;
  16.  
  17.     SYSTEM:        CP/M-80, CP/M-86, HP-UX, MSDOS, PCDOS, QNIX;
  18.     COMPILERS:    Aztec C86, Aztec CII, CI-C86, Eco-C, Eco-C88, HP-UX,
  19.             Lattice C, Microsoft C,    QNIX C;
  20.  
  21.     WARNINGS:    "This program has compiled successfully on 2 UNIX
  22.             compilers, 5 MSDOS compilers, and 2 CP/M compilers.
  23.             A port to Toolworks C is untried."
  24.  
  25.     AUTHORS:    William C. Colley III;
  26. */
  27.  
  28. /*
  29.               8051 Cross-Assembler in Portable C
  30.  
  31.         Copyright (c) 1985,1987 William C. Colley, III
  32.  
  33. Revision History:
  34.  
  35. Ver    Date        Description
  36.  
  37. 0.0    JUL 1987    Adapted from version 0.0 of my portable 8048 cross-
  38.             assembler.  WCC3.
  39.  
  40. 0.1    OCT 1987    Changed the order of DW constants and made trailing
  41.             colons on labels get trashed.  WCC3.
  42.  
  43. 0.2    AUG 1988    Fixed bug that swapped the machine codes for CPL A and
  44.             CLR A.  WCC3.
  45.  
  46. 0.3    AUG 1988    Fixed a bug in the command line parser that puts it
  47.             into a VERY long loop if the user types a command line
  48.             like "A51 FILE.ASM -L".  WCC3 per Alex Cameron.
  49.  
  50. 0.4    NOV 1988    Fixed a bug that made DJNZ direct,relative generate
  51.             the wrong opcode.  WCC3.
  52.  
  53. This header file contains the global constants and data type definitions for
  54. all modules of the cross-assembler.  This also seems a good place to put the
  55. compilation and linkage instructions for the animal.  This list currently
  56. includes the following compilers:
  57.  
  58.         Compiler Name        Op. Sys.    Processor
  59.  
  60.     1)  Aztec C86            CP/M-86        8086, 8088
  61.                     MSDOS/PCDOS
  62.  
  63.     2)  AZTEC C II            CP/M-80        8080, Z-80
  64.  
  65.     3)  Computer Innovations C86    MSDOS/PCDOS    8086, 8088
  66.  
  67.     4)  Eco-C            CP/M-80        Z-80
  68.  
  69.     5)  Eco-C88            MSDOS/PCDOS    8086, 8088
  70.  
  71.     6)  HP C            HP-UX        68000
  72.  
  73.     7)  Lattice C            MSDOS/PCDOS    8086, 8088
  74.  
  75.     8)  Microsoft C            MSDOS/PCDOS    8086, 8088
  76.  
  77.     9)  QNIX C            QNIX        8086, 8088
  78.  
  79. Further additions will be made to the list as users feed the information to
  80. me.  This particularly applies to UNIX and IBM-PC compilers.
  81.  
  82. Compile-assemble-link instructions for this program under various compilers
  83. and operating systems:
  84.  
  85.     1)    Aztec C86:
  86.  
  87.     A)  Uncomment out the "#define AZTEC_C" line and comment out all
  88.         other compiler names in A51.H.
  89.  
  90.     B)  Assuming that all files are on drive A:, run the following sequence
  91.         of command lines:
  92.  
  93.         A>cc a51
  94.         A>cc a51eval
  95.         A>cc a51util
  96.         A>ln a51.o a51eval.o a51util.o -lc
  97.         A>era a51*.o
  98.  
  99.     2)  Aztec CII (version 1.06B):
  100.  
  101.     A)  Uncomment out the "#define AZTEC_C" line and comment out all
  102.         other compiler names in A51.H.
  103.  
  104.     B)  Assuming the C compiler is called "CC.COM" and all files are
  105.         on drive A:, run the following sequence of command lines:
  106.  
  107.         A>cc a51
  108.         A>as -zap a51
  109.         A>cc a51eval
  110.         A>as -zap a51eval
  111.         A>cc a51util
  112.         A>as -zap a51util
  113.         A>ln a51.o a51eval.o a51util.o -lc
  114.         A>era a51*.o
  115.  
  116.     3)  Computer Innovations C86:
  117.  
  118.     A)  Uncomment out the "#define CI_C86" line and comment out all
  119.         other compiler names in A51.H.
  120.  
  121.     B)  Compile the files A51.C, A51EVAL.C, and A51UTIL.C.  Link
  122.         according to instructions that come with the compiler.
  123.  
  124.     4)  Eco-C (CP/M-80 version 3.10):
  125.  
  126.     A)  Uncomment out the "#define ECO_C" line and comment out all
  127.         other compiler names in A51.H.
  128.  
  129.     B)  Assuming all files are on drive A:, run the following sequence of
  130.         command lines:
  131.  
  132.         A>cp a51 -i -m
  133.         A>cp a51eval -i -m
  134.         A>cp a51util -i -m
  135.         A>l80 a51,a51eval,a51util,a51/n/e
  136.         A>era a51*.mac
  137.         A>era a51*.rel
  138.  
  139.     5)  Eco-C88:
  140.  
  141.     A)  Uncomment out the "#define ECO_C" line and comment out all
  142.         other compiler names in A51.H.
  143.  
  144.     B)  Compile the files A51.C, A51EVAL.C, and A51UTIL.C.  Link
  145.         according to instructions that come with the compiler.
  146.  
  147.     6)  HP-UX (a UNIX look-alike running on an HP-9000 Series 200/500,
  148.     68000-based machine):
  149.  
  150.     A)  Uncomment out the "#define HP_UX" line and comment out all
  151.         other compiler names in A51.H.
  152.  
  153.     B)  Run the following command line:
  154.  
  155.         . cc a51.c a51eval.c a51util.c
  156.  
  157.     7)  Lattice C:
  158.  
  159.     A)  Uncomment out the "#define LATTICE_C" line and comment out all
  160.         other compiler names in A51.H.
  161.  
  162.     B)  Compile the files A51.C, A51EVAL.C, and A51UTIL.C.  Link
  163.         according to instructions that come with the compiler.
  164.  
  165.     8)  Microsoft C (version 3.00):
  166.  
  167.     A)  Uncomment out the "#define MICROSOFT_C" line and comment out all
  168.         other compiler names in A68.H.
  169.  
  170.     B)  Run the following command line:
  171.  
  172.         C>cl a51.c a51eval.c a51util.c
  173.  
  174.     9)    QNIX C:
  175.  
  176.     A)  Uncomment out the "#define QNIX" line and comment out all other
  177.         compiler names in A51.H.
  178.  
  179.     B)  Run the following command line:
  180.  
  181.         . cc a51.c a51eval.c a51util.c
  182.  
  183. Note that, under CP/M-80, you can't re-execute a core image from a previous
  184. assembly run with the "@.COM" trick.  This technique is incompatible with the
  185. Aztec CII compiler, so I didn't bother to support it at all.
  186. */
  187.  
  188. #include <stdio.h>
  189.  
  190. /*  Comment out all but the line containing the name of your compiler:    */
  191.  
  192. /* #define    AZTEC_C                            */
  193. /* #define    CI_C86                            */
  194. /* #define    ECO_C                            */
  195. /* #define    HP_UX                            */
  196. /* #define    LATTICE_C                        */
  197. #define        MICROSOFT_C
  198. /* #define    QNIX                            */
  199.  
  200. /*  Compiler dependencies:                        */
  201.  
  202. #ifdef    AZTEC_C
  203. #define    getc(f)        agetc(f)
  204. #define    putc(c,f)    aputc(c,f)
  205. #endif
  206.  
  207. #ifndef    ECO_C
  208. #define    FALSE        0
  209. #define    TRUE        (!0)
  210. #endif
  211.  
  212. #ifdef    LATTICE_C
  213. #define    void        int
  214. #endif
  215.  
  216. #ifdef    QNIX
  217. #define    fprintf        tfprintf
  218. #define    printf        tprintf
  219. #endif
  220.  
  221. /*  On 8-bit machines, the static type is as efficient as the register    */
  222. /*  type and far more efficient than the auto type.  On larger machines    */
  223. /*  such as the 8086 family, this is not necessarily the case.  To    */
  224. /*  let you experiment to see what generates the fastest, smallest code    */
  225. /*  for your machine, I have declared internal scratch variables in    */
  226. /*  functions "SCRATCH int", "SCRATCH unsigned", etc.  A SCRATCH    */
  227. /*  varible is made static below, but you might want to try register    */
  228. /*  instead.                                */
  229.  
  230. #define    SCRATCH        static
  231.  
  232. /*  A slow, but portable way of cracking an unsigned into its various    */
  233. /*  component parts:                            */
  234.  
  235. #define    clamp(u)    ((u) &= 0xffff)
  236. #define    high(u)        (((u) >> 8) & 0xff)
  237. #define    low(u)        ((u) & 0xff)
  238. #define    word(u)        ((u) & 0xffff)
  239.  
  240. /*  The longest source line the assembler can hold without exploding:    */
  241.  
  242. #define    MAXLINE        255
  243.  
  244. /*  The maximum number of source files that can be open simultaneously:    */
  245.  
  246. #define    FILES        4
  247.  
  248. /*  The fatal error messages generated by the assembler:        */
  249.  
  250. #define    ASMOPEN        "Source File Did Not Open"
  251. #define    ASMREAD        "Error Reading Source File"
  252. #define    DSKFULL        "Disk or Directory Full"
  253. #define    FLOFLOW        "File Stack Overflow"
  254. #define    HEXOPEN        "Object File Did Not Open"
  255. #define    IFOFLOW        "If Stack Overflow"
  256. #define    LSTOPEN        "Listing File Did Not Open"
  257. #define    NOASM        "No Source File Specified"
  258. #define    SYMBOLS        "Too Many Symbols"
  259.  
  260. /*  The warning messages generated by the assembler:            */
  261.  
  262. #define    BADOPT        "Illegal Option Ignored"
  263. #define    NOHEX        "-o Option Ignored -- No File Name"
  264. #define    NOLST        "-l Option Ignored -- No File Name"
  265. #define    TWOASM        "Extra Source File Ignored"
  266. #define    TWOHEX        "Extra Object File Ignored"
  267. #define    TWOLST        "Extra Listing File Ignored"
  268.  
  269. /*  Line assembler (A51.C) constants:                    */
  270.  
  271. #define    BIGINST        3        /* longest instruction length    */
  272. #define    IFDEPTH        16        /* maximum IF nesting level    */
  273. #define    NOP        0x00        /* processor's NOP opcode    */
  274. #define    ON        1        /* assembly turned on        */
  275. #define    OFF        -1        /* assembly turned off        */
  276.  
  277. /*  Line assembler (A51.C) opcode attribute word flag masks:        */
  278.  
  279. #define    PSEUDO        0x8000        /* is pseudo-op            */
  280. #define    ISIF        0x4000        /* is IF, ELSE, or ENDI        */
  281. #define    O