as31-2.3.1/0000755000175000001440000000000010307073600011501 5ustar erazorusersas31-2.3.1/as31/0000755000175000001440000000000010307073600012250 5ustar erazorusersas31-2.3.1/as31/Makefile.in0000644000175000001440000002310510307071452014321 0ustar erazorusers# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # Makefile for as31 SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CFLAGS = @CFLAGS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GUI_CFLAGS = @GUI_CFLAGS@ GUI_LIBS = @GUI_LIBS@ LIBS = @LIBS@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ YACC = @YACC@ INCLUDES = $(GUI_CFLAGS) $(CFLAGS) @OPTION_GTK_TRUE@AS31GTK_BIN = as31gtk @OPTION_GTK_FALSE@AS31GTK_BIN = bin_PROGRAMS = as31 $(AS31GTK_BIN) as31_SOURCES = as31.h run.c lexer.c parser.y parser.h symbol.c emitter.c as31.c as31gtk_SOURCES = as31.h run.c lexer.c parser.y parser.h symbol.c emitter.c as31_gtk.c as31gtk_LDADD = $(GUI_LIBS) man_MANS = as31.1 EXTRA_DIST = as31.1 CLEANFILES = as31gtk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ as31_OBJECTS = run.o lexer.o parser.o symbol.o emitter.o as31.o as31_LDADD = $(LDADD) as31_DEPENDENCIES = as31_LDFLAGS = as31gtk_OBJECTS = run.o lexer.o parser.o symbol.o emitter.o as31_gtk.o as31gtk_DEPENDENCIES = as31gtk_LDFLAGS = COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ man1dir = $(mandir)/man1 MANS = $(man_MANS) NROFF = nroff DIST_COMMON = Makefile.am Makefile.in parser.c DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best SOURCES = $(as31_SOURCES) $(as31gtk_SOURCES) OBJECTS = $(as31_OBJECTS) $(as31gtk_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .s .y $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps as31/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) distclean-binPROGRAMS: maintainer-clean-binPROGRAMS: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) list='$(bin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .c.o: $(COMPILE) -c $< .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: as31: $(as31_OBJECTS) $(as31_DEPENDENCIES) @rm -f as31 $(LINK) $(as31_LDFLAGS) $(as31_OBJECTS) $(as31_LDADD) $(LIBS) as31gtk: $(as31gtk_OBJECTS) $(as31gtk_DEPENDENCIES) @rm -f as31gtk $(LINK) $(as31gtk_LDFLAGS) $(as31gtk_OBJECTS) $(as31gtk_LDADD) $(LIBS) .y.c: $(YACC) $(AM_YFLAGS) $(YFLAGS) $< && mv y.tab.c $*.c if test -f y.tab.h; then \ if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \ else :; fi parser.h: parser.c install-man1: $(mkinstalldirs) $(DESTDIR)$(man1dir) @list='$(man1_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ done uninstall-man1: @list='$(man1_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ rm -f $(DESTDIR)$(man1dir)/$$inst; \ done install-man: $(MANS) @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-man1 uninstall-man: @$(NORMAL_UNINSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags -o $$here/TAGS $(ETAGS_ARGS) $$tags $$unique $(LISP)) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = as31 distdir: $(DISTFILES) @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done as31.o: as31.c as31.h as31_gtk.o: as31_gtk.c as31.h emitter.o: emitter.c as31.h lexer.o: lexer.c as31.h parser.h parser.o: parser.c as31.h run.o: run.c as31.h symbol.o: symbol.c as31.h parser.h info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am install-exec-am: install-binPROGRAMS install-exec: install-exec-am install-data-am: install-man install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall: uninstall-am all-am: Makefile $(PROGRAMS) $(MANS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/man1 mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: -test -z "parserhparserc" || rm -f parserh parserc mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-binPROGRAMS \ maintainer-clean-compile maintainer-clean-tags \ maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am .PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile install-man1 uninstall-man1 install-man \ uninstall-man tags mostlyclean-tags distclean-tags clean-tags \ maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \ installcheck-am installcheck install-exec-am install-exec \ install-data-am install-data install-am install uninstall-am uninstall \ all-redirect all-am all installdirs mostlyclean-generic \ distclean-generic clean-generic maintainer-clean-generic clean \ mostlyclean distclean maintainer-clean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: as31-2.3.1/as31/symbol.c0000644000175000001440000002716710307071452013741 0ustar erazorusers/* ---------------------------------------------------------------------- * FILE: symbol.c * PACKAGE: as31 - 8031/8051 Assembler. * * DESCRIPTION: * This file contains the symbol table search/insertion routines * associated with user defined symbols. * * The reserved keyword (instructions/directives) look up routine * is defined here. * * The opcode table for all of the instructions is located in this * file. * * REVISION HISTORY: * Jan. 19, 1990 - Created. (Ken Stauffer) * * AUTHOR: * All code in this file written by Ken Stauffer (University of Calgary) * January, 1990. * */ #include #include /* normally in stdlib.h, but that include file also defines */ /* "div" which conflicts with the div in this file */ extern void *malloc(size_t size); extern void free(void *ptr); #include "as31.h" #include "parser.h" #define B(a) (0xF0+(a)) #define ACC(a) (0xE0+(a)) #define PSW(a) (0xD0+(a)) #define T2CON(a) (0xC8+(a)) #define IP(a) (0xB8+(a)) #define P3(a) (0xB0+(a)) #define IE(a) (0xA8+(a)) #define P2(a) (0xA0+(a)) #define SCON(a) (0x98+(a)) #define P1(a) (0x90+(a)) #define TCON(a) (0x88+(a)) #define P0(a) (0x80+(a)) /* ---------------------------------------------------------------------- * sinit[] * These symbols are not reserved keywords. * This array contains the initial symbol table entries * for the user symbol table. The symbols are * basically convienient names that make writing * in 8031/8051 bearable. * * The function syminit() inserts these entries into the * symbol table. * */ static struct symbol sinit[] = { { "AC", 1, LABEL, PSW(6), NULL }, { "ACC", 1, LABEL, ACC(0), NULL }, { "B", 1, LABEL, B(0), NULL }, { "CY", 1, LABEL, PSW(7), NULL }, { "DPH", 1, LABEL, 0x83, NULL }, { "DPL", 1, LABEL, 0x82, NULL }, { "EA", 1, LABEL, IE(7), NULL }, { "ES", 1, LABEL, IE(4), NULL }, { "ET0", 1, LABEL, IE(1), NULL }, { "ET1", 1, LABEL, IE(3), NULL }, { "ET2", 1, LABEL, IE(5), NULL }, { "EX0", 1, LABEL, IE(0), NULL }, { "EX1", 1, LABEL, IE(2), NULL }, { "EXEN2", 1, LABEL, T2CON(3),NULL }, { "EXF2", 1, LABEL, T2CON(6),NULL }, { "F0", 1, LABEL, PSW(5), NULL }, { "IE", 1, LABEL, IE(0), NULL }, { "IE0", 1, LABEL, TCON(1),NULL }, { "IE1", 1, LABEL, TCON(3),NULL }, { "INT0", 1, LABEL, P3(2), NULL }, { "INT1", 1, LABEL, P3(3), NULL }, { "IP", 1, LABEL, IP(0), NULL }, { "IT0", 1, LABEL, TCON(0),NULL }, { "IT1", 1, LABEL, TCON(2),NULL }, { "OV", 1, LABEL, PSW(2), NULL }, { "P", 1, LABEL, PSW(0), NULL }, { "P0", 1, LABEL, P0(0), NULL }, { "P1", 1, LABEL, P1(0), NULL }, { "P2", 1, LABEL, P2(0), NULL }, { "P3", 1, LABEL, P3(0), NULL }, { "PCON", 1, LABEL, 0x87, NULL }, { "PS", 1, LABEL, IP(4), NULL }, { "PSW", 1, LABEL, PSW(0), NULL }, { "PT0", 1, LABEL, IP(1), NULL }, { "PT1", 1, LABEL, IP(3), NULL }, { "PT2", 1, LABEL, IP(5), NULL }, { "PX0", 1, LABEL, IP(0), NULL }, { "PX1", 1, LABEL, IP(2), NULL }, { "RB8", 1, LABEL, SCON(2),NULL }, { "RCAP2H", 1, LABEL, 0xCB, NULL }, { "RCAP2L", 1, LABEL, 0xCA, NULL }, { "RCLK", 1, LABEL, T2CON(5),NULL }, { "REN", 1, LABEL, SCON(4),NULL }, { "RD", 1, LABEL, P3(7), NULL }, { "RI", 1, LABEL, SCON(0),NULL }, { "RL2", 1, LABEL, T2CON(0),NULL }, { "RS0", 1, LABEL, PSW(3), NULL }, { "RS1", 1, LABEL, PSW(4), NULL }, { "RXD", 1, LABEL, P3(0), NULL }, { "SBUF", 1, LABEL, 0x99, NULL }, { "SCON", 1, LABEL, SCON(0),NULL }, { "SM0", 1, LABEL, SCON(7),NULL }, { "SM1", 1, LABEL, SCON(6),NULL }, { "SM2", 1, LABEL, SCON(5),NULL }, { "SP", 1, LABEL, 0x81, NULL }, { "T0", 1, LABEL, P3(4), NULL }, { "T1", 1, LABEL, P3(5), NULL }, { "T2", 1, LABEL, P0(0), NULL }, { "T2CON", 1, LABEL, T2CON(0),NULL }, { "T2EX", 1, LABEL, P0(1), NULL }, { "TB8", 1, LABEL, SCON(3),NULL }, { "TCLK", 1, LABEL, T2CON(4),NULL }, { "TCON", 1, LABEL, TCON(0),NULL }, { "TF0", 1, LABEL, TCON(5),NULL }, { "TF1", 1, LABEL, TCON(7),NULL }, { "TF2", 1, LABEL, T2CON(7),NULL }, { "TH0", 1, LABEL, 0x8C, NULL }, { "TH1", 1, LABEL, 0x8D, NULL }, { "TH2", 1, LABEL, 0xCD, NULL }, { "TI", 1, LABEL, SCON(1),NULL }, { "TL0", 1, LABEL, 0x8A, NULL }, { "TL1", 1, LABEL, 0x8B, NULL }, { "TL2", 1, LABEL, 0xCC, NULL }, { "TMOD", 1, LABEL, 0x89, NULL }, { "TR0", 1, LABEL, TCON(4),NULL }, { "TR1", 1, LABEL, TCON(6),NULL }, { "TR2", 1, LABEL, T2CON(2),NULL }, { "TXD", 1, LABEL, P3(1), NULL }, { "WR", 1, LABEL, P3(6), NULL } }; #define SINITSIZE (sizeof(sinit)/sizeof(sinit[0])) /* ---------------------------------------------------------------------- * opcode vectors: * These arrays contain the various opcodes for the * various forms an instruction may take. * * The ordering of these opcodes is very critical to the * proper fuctioning of the assembler. * * When a given form of an instruction is parsed, the parser * indexes one of these arrays by the correct amount and thus * obtains the correct opcode for the particular form. * */ static unsigned char acall[]= { 0x11 }; static unsigned char add[]= { 0x28, 0x25, 0x26, 0x24 }; static unsigned char addc[]= { 0x38, 0x35, 0x36, 0x34 }; static unsigned char ajmp[]= { 0x01 }; static unsigned char anl[]= { 0x58, 0x55, 0x56, 0x54, 0x52, 0x53, 0x82, 0xb0 }; static unsigned char cjne[]= { 0xb5, 0xb4, 0xb8, 0xb6 }; static unsigned char clr[]= { 0xe4, 0xc3, 0xc2 }; static unsigned char cpl[]= { 0xf4, 0xb3, 0xb2 }; static unsigned char da[]= { 0xd4 }; static unsigned char dec[]= { 0x14, 0x18, 0x15, 0x16 }; static unsigned char div[]= { 0x84 }; static unsigned char djnz[]= { 0xd8, 0xd5 }; static unsigned char inc[]= { 0x04, 0x08, 0x05, 0x06, 0xa3 }; static unsigned char jb[]= { 0x20 }; static unsigned char jbc[]= { 0x10 }; static unsigned char jc[]= { 0x40 }; static unsigned char jmp[]= { 0x73 }; static unsigned char jnb[]= { 0x30 }; static unsigned char jnc[]= { 0x50 }; static unsigned char jnz[]= { 0x70 }; static unsigned char jz[]= { 0x60 }; static unsigned char lcall[]= { 0x12 }; static unsigned char ljmp[]= { 0x02 }; static unsigned char mov[]= { 0xe8, 0xe5, 0xe6, 0x74, 0xf5, 0x75, 0xf8, 0xa8, 0x78, 0x88, 0x85, 0x86, 0xf6, 0xa6, 0x76, 0x90, 0xa2, 0x92 }; static unsigned char movc[]= { 0x93, 0x83 }; static unsigned char movx[]= { 0xe2, 0xe3, 0xe0, 0xf2, 0xf3, 0xf0 }; static unsigned char mul[]= { 0xa4 }; static unsigned char nop[]= { 0x00 }; static unsigned char orl[]= { 0x48, 0x45, 0x46, 0x44, 0x42, 0x43, 0x72, 0xa0 }; static unsigned char pop[]= { 0xd0 }; static unsigned char push[]= { 0xc0 }; static unsigned char ret[]= { 0x22 }; static unsigned char reti[]= { 0x32 }; static unsigned char rl[]= { 0x23 }; static unsigned char rlc[]= { 0x33 }; static unsigned char rr[]= { 0x03 }; static unsigned char rrc[]= { 0x13 }; static unsigned char setb[]= { 0xd3, 0xd2 }; static unsigned char sjmp[]= { 0x80 }; static unsigned char subb[]= { 0x98, 0x95, 0x96, 0x94 }; static unsigned char swap[]= { 0xc4 }; static unsigned char xch[]= { 0xc8, 0xc5, 0xc6 }; static unsigned char xchd[]= { 0xd6 }; static unsigned char xrl[]= { 0x68, 0x65, 0x66, 0x64, 0x62, 0x63 }; /* ---------------------------------------------------------------------- * optable[] * This table contains opcodes, directives and a few reserved * symbols. * * The second field is the keywords token value. * * Unless the symbol is an opcode, the third field will * be NULL. * * The third field is a pointer to an array of opcode bytes. * * --> This list must be in order by the first field */ static struct opcode optable[] = { {"a", A, NULL }, {"ab", AB, NULL }, {"acall", ACALL, acall }, {"add", ADD, add }, {"addc", ADDC, addc }, {"ajmp", AJMP, ajmp }, {"anl", ANL, anl }, {"byte", D_BYTE, NULL }, {"c", C, NULL }, {"cjne", CJNE, cjne }, {"clr", CLR, clr }, {"cpl", CPL, cpl }, {"da", DA, da }, {"db", D_BYTE, NULL }, {"dec", DEC, dec }, {"div", DIV, div }, {"djnz", DJNZ, djnz }, {"dptr", DPTR, NULL }, {"dw", D_WORD, NULL }, {"end", D_END, NULL }, {"equ", D_EQU, NULL }, {"flag", D_FLAG, NULL }, {"inc", INC, inc }, {"jb", JB, jb }, {"jbc", JBC, jbc }, {"jc", JC, jc }, {"jmp", JMP, jmp }, {"jnb", JNB, jnb }, {"jnc", JNC, jnc }, {"jnz", JNZ, jnz }, {"jz", JZ, jz }, {"lcall", LCALL, lcall }, {"ljmp", LJMP, ljmp }, {"mov", MOV, mov }, {"movc", MOVC, movc }, {"movx", MOVX, movx }, {"mul", MUL, mul }, {"nop", NOP, nop }, {"org", D_ORG, NULL }, {"orl", ORL, orl }, {"pc", PC, NULL }, {"pop", POP, pop }, {"push", PUSH, push }, {"r0", R0, NULL }, {"r1", R1, NULL }, {"r2", R2, NULL }, {"r3", R3, NULL }, {"r4", R4, NULL }, {"r5", R5, NULL }, {"r6", R6, NULL }, {"r7", R7, NULL }, {"ret", RET, ret }, {"reti", RETI, reti }, {"rl", RL, rl }, {"rlc", RLC, rlc }, {"rr", RR, rr }, {"rrc", RRC, rrc }, {"setb", SETB, setb }, {"sjmp", SJMP, sjmp }, {"skip", D_SKIP, NULL }, {"subb", SUBB, subb }, {"swap", SWAP, swap }, {"word", D_WORD, NULL }, {"xch", XCH, xch }, {"xchd", XCHD, xchd }, {"xrl", XRL, xrl } }; #define OPTABSIZE (sizeof(optable)/sizeof(struct opcode)) /* ---------------------------------------------------------------------- * lookop: * Do a binary search through optable[], for a matching * symbol. Return the symbol found or NULL. * */ struct opcode *lookop(const char *s) { register int low,high,mid,cond; low = 0; high = OPTABSIZE-1; while( low<=high ) { mid = (low+high)/2; if( (cond = strcasecmp(s,optable[mid].name)) < 0 ) high = mid-1; else if(cond > 0 ) low = mid+1; else return(&optable[mid]); } return(NULL); } /* ---------------------------------------------------------------------- * symtab, hash, looksym: * User symbol table routines. * symtab is the hash table for the user symbols. * (chaining is used for collision resolution). * */ static struct symbol *symtab[HASHTABSIZE]; int hash(const char *s) { register const char *p; register unsigned h=0, g; for (p=s; *p; p++) { h = (h<<4) + toupper(*p); if ( (g = h&0xf0000000) ) { h = h ^ (g >> 24); h = h ^ g; } } return( h % HASHTABSIZE ); } struct symbol *looksym(const char *s) { register struct symbol *ptr, *prev; char *p; register int hv; hv = hash(s); prev = NULL; for(ptr=symtab[hv]; ptr; ptr = ptr->next) { if( !strcasecmp(ptr->name,s) ) { if( prev != NULL ) { prev->next = ptr->next; ptr->next = symtab[hv]; symtab[hv] = ptr; } return(ptr); } prev = ptr; } if ( (p = malloc(strlen(s) + 1)) ) { strcpy(p,s); } else { error("Cannot allocate %d bytes",strlen(s)+1); } ptr = (struct symbol *) malloc( sizeof(struct symbol) ); if( ptr == NULL ) error("Cannot allocate %d bytes",sizeof(struct symbol)); ptr->name = p; ptr->predefined = 0; ptr->type = UNDEF; ptr->next = symtab[hv]; symtab[hv] = ptr; return(ptr); } /* ---------------------------------------------------------------------- * syminit: * Initializes the hash table, with the initial symbols from * sinit[] * */ // static struct symbol *symtab[HASHTABSIZE]; void syminit(void) { register int i,hv; /* clear all entries in the symbol table */ memset(symtab, 0, sizeof(struct symbol *) * HASHTABSIZE); /* load all the pre-defined symbols */ for(i=0; ipredefined) { sym = sym->next; } else { if (sym->name) free(sym->name); next = sym->next; free(sym); sym = next; } } } } as31-2.3.1/as31/run.c0000644000175000001440000001307310307071452013227 0ustar erazorusers#define _GNU_SOURCE #include #include #include #include #include #include //for user stuff #include "as31.h" // added ".inc" command to include header files. B.Porr /* global variables */ unsigned long lc; char *asmfile; int fatal=0, abort_asap=0; int pass=0; int dashl=0; FILE *listing=NULL, *fin=NULL; int incLineCount=0; int run_as31(const char *infile, int lst, int use_stdout, const char *fmt, const char *arg, const char *customoutfile) { char *outfile=NULL, *lstfile=NULL; const char *extension; int has_dot_asm=0; int i,len, baselen, extlen; FILE* finPre; char tmpName[256]; char *lineBuffer=NULL; int sizeBuf=0; char *includePtr=NULL; char *incLineBuffer=NULL; int incSizeBuf=0; FILE* includeFile=NULL; uid_t uid; /* first, figure out all the file names */ dashl = lst; extension = emit_extension(fmt); extlen = strlen(extension); len = baselen = strlen(infile); if (len >= 4 && strcasecmp(infile + len - 4, ".asm") == 0) { has_dot_asm = 1; baselen -= 4; } asmfile = (char *)malloc(baselen + 5); strcpy(asmfile, infile); if (dashl) { lstfile = (char *)malloc(baselen + 5); strncpy(lstfile, infile, baselen); strcpy(lstfile + baselen, ".lst"); } if (use_stdout) { outfile = NULL; } else { if (customoutfile==NULL) { outfile = (char *)malloc(baselen + extlen + 2); strncpy(outfile, infile, baselen); *(outfile + baselen) = '.'; strcpy(outfile + baselen + 1, extension); } else { len = strlen(customoutfile); outfile = (char *)malloc(len + 1); strncpy(outfile, customoutfile, len); } } /* now open the files */ // "preprocessor" finPre = freopen(asmfile, "r", stdin); if (finPre == NULL) { if (!has_dot_asm) { strcpy(asmfile + baselen, ".asm"); finPre = freopen(asmfile, "r", stdin); } if (finPre == NULL) { mesg_f("Cannot open input file: %s\n", asmfile); free(asmfile); if (outfile) free(outfile); if (lstfile) free(lstfile); return -1; } } uid = geteuid(); sprintf(tmpName,"/tmp/as31-%i-%ld.asm",uid,random()); fin = fopen(tmpName, "w"); if (fin == NULL) { mesg_f("Cannot open temp file: %s\n",tmpName); if (outfile) free(outfile); if (lstfile) free(lstfile); return -1; } while (!feof(finPre)) { getline(&lineBuffer,&sizeBuf,finPre); if ((includePtr=strstr(lineBuffer,INC_CMD))) { includePtr=includePtr+strlen(INC_CMD); while ((*includePtr==' ')|| //move includePtr to filename (*includePtr==9) || (*includePtr=='\"')|| (*includePtr=='\'')) { includePtr++; } i=0; while ((includePtr[i]!=0) && (includePtr[i]!=10) && (includePtr[i]!=13) && (includePtr[i]!='\"') && (includePtr[i]!='\'')) { i++; } includePtr[i]=0; includeFile=fopen(includePtr,"r"); mesg_f("including file: %s\n",includePtr); if (!includeFile) { mesg_f("Cannot open include file: %s\n",includePtr); } else { while (!feof(includeFile)) { getline(&incLineBuffer,&incSizeBuf,includeFile); fprintf(fin,"%s",incLineBuffer); if (strlen(incLineBuffer)) { incLineCount++; } } fclose(includeFile); if (incLineCount) { incLineCount--; } } } else { fprintf(fin,"%s",lineBuffer); } } //.inc -files are now inserted free(lineBuffer); free(incLineBuffer); fclose(fin); fin = freopen(tmpName, "r", stdin); if (dashl) { listing = fopen(lstfile,"w"); if( listing == NULL ) { mesg_f("Cannot open file: %s for writing.\n", lstfile); fclose(fin); free(asmfile); if (outfile) free(outfile); if (lstfile) free(lstfile); return -1; } } /* what happens if this doesn't work */ emitopen(outfile, fmt, arg); syminit(); clear_location_counter(); fatal = abort_asap = 0; lineno = 1; pass=0; lc = 0; /* ** P A S S 1 */ if (!use_stdout) mesg_f("Begin Pass #1\n"); yyparse(); if (fatal) { mesg_f("Errors in pass1, assembly aborted\n"); } else { rewind(fin); lineno = 1; pass++; lc = 0; emitaddr(lc); /* ** P A S S 2 */ if (!use_stdout) mesg_f("Begin Pass #2\n"); yyparse(); } if (fatal) { mesg_f("Errors in pass2, assembly aborted\n"); } emitclose(); fclose(fin); unlink(tmpName); //delete tmpName if (dashl) fclose(listing); free(asmfile); if (outfile) free(outfile); if (lstfile) free(lstfile); freesym(); if (fatal) return -1; return 0; } /* the parser, lexer and other stuff that actually do the */ /* assembly will call to these two functions to report any */ /* errors or warning. error() calls exit() in the command */ /* line version, but the abort_asap flag was added, and the */ /* parser check it at the end of every line */ void error(const char *fmt, ...) { va_list args; char buf[2048]; int len; abort_asap++; fatal++; va_start(args, fmt); // fixme: negative line no for includes... len = snprintf(buf, sizeof(buf), "Error, line %d, ", lineno-incLineCount); len += vsnprintf(buf + len, sizeof(buf) - len, fmt, args); snprintf(buf + len, sizeof(buf) - len, ".\n"); mesg(buf); } void warn(const char *fmt, ...) { va_list args; char buf[2048]; int len; fatal++; va_start(args, fmt); printf("incLineCount=%d\n",incLineCount); len = snprintf(buf, sizeof(buf), "Warning, line %d, ", lineno-incLineCount); len += vsnprintf(buf + len, sizeof(buf) - len, fmt, args); snprintf(buf + len, sizeof(buf) - len, ".\n"); mesg(buf); } void mesg_f(const char *fmt, ...) { va_list args; char buf[2048]; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); mesg(buf); } as31-2.3.1/as31/parser.y0000644000175000001440000005305110307071457013752 0ustar erazorusers/* ---------------------------------------------------------------------- * FILE: parser.y * PACKAGE: as31 - 8031/8051 Assembler. * * DESCRIPTION: * This file contains the yacc parser for the assembler. * Related to this are the following: * error(), warn(), yyerror() * genbyte(), genword(), genstr(), makeop() * * * REVISION HISTORY: * Jan. 19, 1990 - Created. (Ken Stauffer) * * AUTHOR: * All code in this file written by Ken Stauffer (University of Calgary). * January 1990. * */ %{ #include #include #define NOPE #include "as31.h" #undef NOPE #define YYSTYPE union ystack static unsigned char bytebuf[1024]; /* used by dumplist() */ static int bytecount; void yyerror(const char *s); int makeop(struct opcode * op, struct mode *m, int add); void inclc(int i); char *padline(char *line); void dumplist(char *txt, int show); void genbyte(int b); void genstr(const char *s); void genword(unsigned long w); /* ------------------------ G R A M M E R ----------------------------- */ %} %token STRING %token D_ORG %token D_BYTE %token D_WORD %token D_SKIP %token D_EQU %token D_FLAG %token D_END %token ACALL %token ADD %token ADDC %token AJMP %token ANL %token CJNE %token CLR %token CPL %token DA %token DEC %token DIV %token DJNZ %token INC %token JB %token JBC %token JC %token JMP %token JNB %token JNC %token JNZ %token JZ %token LCALL %token LJMP %token MOV %token MOVC %token MOVX %token NOP %token MUL %token ORL %token POP %token PUSH %token RET %token RETI %token RL %token RLC %token RR %token RRC %token SETB %token SJMP %token SUBB %token SWAP %token XCH %token XCHD %token XRL %token AB %token A %token C %token PC %token DPTR %token BITPOS %token R0 %token R1 %token R2 %token R3 %token R4 %token R5 %token R6 %token R7 %token VALUE %token SYMBOL %left '+' '-' %left '*' '/' '%' %left '|' '&' %left '>' '<' %start program %% program : linelist { } ; linelist : linelist line | line ; line : undefsym ':' linerest { if (abort_asap) {YYABORT;} if( pass1 ) { $1.sym->type = LABEL; $1.sym->value = lc; } inclc($3.value); bytecount = 0; } | linerest { inclc($1.value); bytecount = 0; } ; linerest : directive '\n' { $$.value = $1.value; if( dashl && pass2 ) dumplist($2.str,1); } | instr '\n' { $$.value = $1.value; if( dashl && pass2 ) dumplist($2.str,1); } | '\n' { $$.value = 0; if( dashl && pass2 ) dumplist($1.str,0); } | error { seek_eol(); } '\n' { $$.value = 0; if( dashl && pass2 ) dumplist($1.str,0); } ; /* -------------------- * DIRECTIVES: * */ directive : '.' D_ORG defexpr { lc = $3.val.v; if( pass2 ) emitaddr(lc); bytecount = 0; $$.value = 0; } | '.' D_BYTE blist { $$.value = $3.value; } | '.' D_WORD wlist { $$.value = $3.value; } | '.' D_SKIP defexpr { $$.value = $3.val.v; if( pass2 ) emitaddr(lc+$$.value); } | '.' D_EQU undefsym ',' expr { if( $5.val.d == 0 ) warn("Expression is undefined in pass 1"); $3.sym->type = LABEL; $3.sym->value = $5.val.v; $$.value = 0; } | '.' D_FLAG SYMBOL ',' flag { $3.sym->type = LABEL; $3.sym->value = $5.value; $$.value = 0; } | '.' D_END { $$.value = 0; } ; defexpr : expr { if( $1.val.d == 0 ) warn("Expression is undefined in pass 1"); if( !(isbit16($1.val.v)) ) warn("Value greater than 16-bits"); $$.value = $1.val.v; } ; flag : flagv BITPOS { if( !isbit8($1.value) ) warn("Bit address exceeds 8-bits"); if( isbmram($1.value) ) $$.value = ($1.value-0x20)*8+ $2.value; else if( isbmsfr($1.value) ) $$.value = $1.value + $2.value; else warn("Invalid bit addressable RAM location"); } ; flagv : SYMBOL { if( $1.sym->type == UNDEF ) warn("Symbol %s must be defined in pass 1",$1.sym->name); $$.value = $1.sym->value; } | VALUE { $$.value = $1.value; } ; undefsym : SYMBOL { if( $1.sym->type != UNDEF && pass1) warn("Attempt to redefine symbol: %s",$1.sym->name); $$.sym = $1.sym; } ; blist : blist ',' data8 { if( pass2 ) genbyte($3.value); $$.value = $1.value + 1; } | blist ',' STRING { if( pass1 ) $$.value = $1.value + $3.value; else { $$.value = $1.value + strlen($3.str); genstr($3.str); free($3.str); } } | data8 { if( pass2 ) genbyte($1.value); $$.value = 1; } | STRING { if( pass1 ) $$.value = $1.value; else { $$.value = strlen($1.str); genstr($1.str); free($1.str); } } ; wlist : wlist ',' data16 { if( pass2 ) genword($3.value); $$.value = $1.value + 2; } | data16 { if( pass2 ) genword($1.value); $$.value = 2; } ; /* -------------------- * EXPRESSIONS: * */ expr : '*' { $$.val.v = lc; $$.val.d = 1; } | '(' expr ')' { $$.val.v = $2.val.v; $$.val.d = $2.val.d; } | '-' expr %prec '*' { $$.val.v = -$2.val.v; $$.val.d = $2.val.d; } | expr '|' expr { $$.val.v = $1.val.v | $3.val.v; $$.val.d = $1.val.d && $3.val.d; } | expr '&' expr { $$.val.v = $1.val.v & $3.val.v; $$.val.d = $1.val.d && $3.val.d; } | expr '*' expr { $$.val.v = $1.val.v * $3.val.v; $$.val.d = $1.val.d && $3.val.d; } | expr '/' expr { $$.val.v = $1.val.v / $3.val.v; $$.val.d = $1.val.d && $3.val.d; } | expr '%' expr { $$.val.v = $1.val.v % $3.val.v; $$.val.d = $1.val.d && $3.val.d; } | expr '-' expr { $$.val.v = $1.val.v - $3.val.v; $$.val.d = $1.val.d && $3.val.d; } | expr '+' expr { $$.val.v = $1.val.v + $3.val.v; $$.val.d = $1.val.d && $3.val.d; } | expr '>' '>' expr { $$.val.v = $1.val.v >> $4.val.v; $$.val.d = $1.val.d && $4.val.d; } | expr '<' '<' expr { $$.val.v = $1.val.v << $4.val.v; $$.val.d = $1.val.d && $4.val.d; } | SYMBOL { if( pass1 ) { $$.val.v = $1.sym->value; $$.val.d = ($1.sym->type != UNDEF); } else { if( $1.sym->type == UNDEF ) warn("Undefined symbol %s",$1.sym->name); $$.val.v = $1.sym->value; $$.val.d = 1; } } | VALUE { $$.val.v = $1.val.v; $$.val.d=1; } ; /* -------------------- * INSTRUCTIONS: * */ instr : NOP { $$.value = makeop($1.op,NULL,0); } | ACALL addr11 { $$.value = makeop($1.op,&$2.mode,0); } | AJMP addr11 { $$.value = makeop($1.op,&$2.mode,0); } | ADD two_op1 { $$.value = makeop($1.op,&$2.mode,0); } | ADDC two_op1 { $$.value = makeop($1.op,&$2.mode,0); } | SUBB two_op1 { $$.value = makeop($1.op,&$2.mode,0); } | XRL two_op1 { $$.value = makeop($1.op,&$2.mode,0); } | XRL two_op2 { $$.value = makeop($1.op,&$2.mode,4); } | ANL two_op1 { $$.value = makeop($1.op,&$2.mode,0); } | ANL two_op2 { $$.value = makeop($1.op,&$2.mode,4); } | ANL two_op3 { $$.value = makeop($1.op,&$2.mode,6); } | ORL two_op1 { $$.value = makeop($1.op,&$2.mode,0); } | ORL two_op2 { $$.value = makeop($1.op,&$2.mode,4); } | ORL two_op3 { $$.value = makeop($1.op,&$2.mode,6); } | XCH two_op1 { if( get_md($2.mode) == 3 ) warn("Immediate mode is illegal"); $$.value = makeop($1.op,&$2.mode,0); } | INC single_op1 { $$.value = makeop($1.op,&$2.mode,0); } | INC DPTR { $$.value = makeop($1.op,NULL,4); } | DEC single_op1 { $$.value = makeop($1.op,&$2.mode,0); } | DA A { $$.value = makeop($1.op,NULL,0); } | DIV AB { $$.value = makeop($1.op,NULL,0); } | JMP '@' A '+' DPTR { $$.value = makeop($1.op,NULL,0); } | JMP '@' DPTR '+' A { $$.value = makeop($1.op,NULL,0); } | MUL AB { $$.value = makeop($1.op,NULL,0); } | RET { $$.value = makeop($1.op,NULL,0); } | RETI { $$.value = makeop($1.op,NULL,0); } | RL A { $$.value = makeop($1.op,NULL,0); } | RLC A { $$.value = makeop($1.op,NULL,0); } | RR A { $$.value = makeop($1.op,NULL,0); } | RRC A { $$.value = makeop($1.op,NULL,0); } | SWAP A { $$.value = makeop($1.op,NULL,0); } | XCHD two_op1 { if( get_md($2.mode) != 2 ) warn("Invalid addressing mode"); $$.value = makeop($1.op,&$2.mode,-2); } | CLR single_op2 { $$.value = makeop($1.op,&$2.mode,0); } | CPL single_op2 { $$.value = makeop($1.op,&$2.mode,0); } | SETB single_op2 { if( get_md($2.mode) == 0 ) warn("Invalid addressing mode"); $$.value = makeop($1.op,&$2.mode,-1); } | PUSH data8 { struct mode tmp; set_md(tmp,0); set_ov(tmp,0); set_sz(tmp,1); set_b1(tmp,$2.value); $$.value = makeop($1.op,&tmp,0); } | POP data8 { struct mode tmp; set_md(tmp,0); set_ov(tmp,0); set_sz(tmp,1); set_b1(tmp,$2.value); $$.value = makeop($1.op,&tmp,0); } | LJMP addr16 { $$.value = makeop($1.op,&$2.mode,0); } | LCALL addr16 { $$.value = makeop($1.op,&$2.mode,0); } | JC relative { $$.value = makeop($1.op,&$2.mode,0); } | JNC relative { $$.value = makeop($1.op,&$2.mode,0); } | JNZ relative { $$.value = makeop($1.op,&$2.mode,0); } | JZ relative { $$.value = makeop($1.op,&$2.mode,0); } | SJMP relative { $$.value = makeop($1.op,&$2.mode,0); } | CJNE three_op1 { $$.value = makeop($1.op,&$2.mode,0); } | JB two_op4 { $$.value = makeop($1.op,&$2.mode,0); } | JNB two_op4 { $$.value = makeop($1.op,&$2.mode,0); } | JBC two_op4 { $$.value = makeop($1.op,&$2.mode,0); } | DJNZ two_op5 { $$.value = makeop($1.op,&$2.mode,0); } | MOV two_op1 { $$.value = makeop($1.op,&$2.mode,0); } | MOV two_op2 { $$.value = makeop($1.op,&$2.mode,4); } | MOV two_op6 { $$.value = makeop($1.op,&$2.mode,6); } | MOVC A ',' '@' A '+' DPTR { $$.value = makeop($1.op,NULL,0); } | MOVC A ',' '@' DPTR '+' A { $$.value = makeop($1.op,NULL,0); } | MOVC A ',' '@' A '+' PC { $$.value = makeop($1.op,NULL,1); } | MOVC A ',' '@' PC '+' A { $$.value = makeop($1.op,NULL,1); } | MOVX A ',' '@' regi { $$.value = makeop($1.op,NULL,$5.value); } | MOVX A ',' '@' DPTR { $$.value = makeop($1.op,NULL,2); } | MOVX '@' regi ',' A { $$.value = makeop($1.op,NULL,$3.value+3); } | MOVX '@' DPTR ',' A { $$.value = makeop($1.op,NULL,5); } ; /* -------------------- * ADDRESSING MODES: * */ two_op1 : A ',' reg { set_md($$.mode,0); set_ov($$.mode, $3.value); set_sz($$.mode, 0); } | A ',' data8 { set_md($$.mode,1); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$3.value); } | A ',' '@' regi { set_md($$.mode,2); set_ov($$.mode,$4.value); set_sz($$.mode,0); } | A ',' '#' data8 { set_md($$.mode,3); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$4.value); } ; two_op2 : data8 ',' A { set_md($$.mode,0); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$1.value); } | data8 ',' '#' data8 { set_md($$.mode,1); set_ov($$.mode,0); set_sz($$.mode,2); set_b1($$.mode,$1.value); set_b2($$.mode,$4.value); } ; two_op3 : C ',' bit { set_md($$.mode,0); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$3.value); } | C ',' '/' bit { set_md($$.mode,1); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$4.value); } | C ',' '!' bit { set_md($$.mode,1); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$4.value); } ; two_op4 : bit ',' rel { set_md($$.mode,0); set_ov($$.mode,0); set_sz($$.mode,2); set_b1($$.mode,$1.value); set_b2($$.mode,$3.value); } ; two_op5 : reg ',' rel2 { set_md($$.mode,0); set_ov($$.mode,$1.value); set_sz($$.mode,1); set_b1($$.mode,$3.value); } | data8 ',' rel { set_md($$.mode,1); set_ov($$.mode,0); set_sz($$.mode,2); set_b1($$.mode,$1.value); set_b2($$.mode,$3.value); } ; two_op6 : reg ',' A { set_md($$.mode,0); set_ov($$.mode,$1.value); set_sz($$.mode,0); } | reg ',' data8 { set_md($$.mode,1); set_ov($$.mode,$1.value); set_sz($$.mode,1); set_b1($$.mode,$3.value); } | reg ',' '#' data8 { set_md($$.mode,2); set_ov($$.mode,$1.value); set_sz($$.mode,1); set_b1($$.mode,$4.value); } | data8 ',' reg { set_md($$.mode,3); set_ov($$.mode,$3.value); set_sz($$.mode,1); set_b1($$.mode,$1.value); } | data8 ',' data8 { set_md($$.mode,4); set_ov($$.mode,0); set_sz($$.mode,2); set_b1($$.mode,$3.value); set_b2($$.mode,$1.value); } | data8 ',' '@' regi { set_md($$.mode,5); set_ov($$.mode,$4.value); set_sz($$.mode,1); set_b1($$.mode,$1.value); } | '@' regi ',' A { set_md($$.mode,6); set_ov($$.mode,$2.value); set_sz($$.mode,0); } | '@' regi ',' data8 { set_md($$.mode,7); set_ov($$.mode,$2.value); set_sz($$.mode,1); set_b1($$.mode,$4.value); } | '@' regi ',' '#' data8 { set_md($$.mode,8); set_ov($$.mode,$2.value); set_sz($$.mode,1); set_b1($$.mode,$5.value); } | DPTR ',' '#' data16 { set_md($$.mode,9); set_ov($$.mode,0); set_sz($$.mode,2); set_b1($$.mode, ($4.value & 0xff00) >> 8 ); set_b2($$.mode, ($4.value & 0x00ff) ); } | C ',' bit { set_md($$.mode,10); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$3.value); } /* * Following two productions cannot be represented by: * * bit ',' C * * Because yacc gives tons of reduce/reduce errors if * that is attempted. * */ | data8 ',' C { set_md($$.mode,11); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$1.value); } | data8 BITPOS ',' C { if( pass2 ) { if( !isbit8($1.value) ) warn("Bit address exceeds 8-bits"); if( isbmram($1.value) ) set_b1($$.mode, ($1.value-0x20)*8+ $2.value ); else if( isbmsfr($1.value) ) set_b1($$.mode, $1.value + $2.value ); else warn("Invalid bit addressable RAM location"); } set_md($$.mode,11); set_ov($$.mode,0); set_sz($$.mode,1); } ; single_op1 : A { set_md($$.mode,0); set_ov($$.mode,0); set_sz($$.mode,0); } | reg { set_md($$.mode,1); set_ov($$.mode,$1.value); set_sz($$.mode,0); } | data8 { set_md($$.mode,2); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$1.value); } | '@' regi { set_md($$.mode,3); set_ov($$.mode,$2.value); set_sz($$.mode,0); } ; single_op2 : A { set_md($$.mode,0); set_ov($$.mode,0); set_sz($$.mode,0); } | C { set_md($$.mode,1); set_ov($$.mode,0); set_sz($$.mode,0); } | bit { set_md($$.mode,2); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,$1.value); } ; three_op1 : A ',' data8 ',' rel { set_md($$.mode,0); set_ov($$.mode,0); set_sz($$.mode,2); set_b1($$.mode,$3.value); set_b2($$.mode,$5.value); } | A ',' '#' data8 ',' rel { set_md($$.mode,1); set_ov($$.mode,0); set_sz($$.mode,2); set_b1($$.mode,$4.value); set_b2($$.mode,$6.value); } | reg ',' '#' data8 ',' rel { set_md($$.mode,2); set_ov($$.mode,$1.value); set_sz($$.mode,2); set_b1($$.mode,$4.value); set_b2($$.mode,$6.value); } | '@' regi ',' '#' data8 ',' rel { set_md($$.mode,3); set_ov($$.mode,$2.value); set_sz($$.mode,2); set_b1($$.mode,$5.value); set_b2($$.mode,$7.value); } ; rel : expr { long offset; if( pass2 ) { offset = $1.val.v - (lc+3); if( offset > 127 || offset < -128 ) warn("Relative offset exceeds -128 / +127"); $$.value = offset; } } ; /* * This production differs from the above, by 1 number! * */ rel2 : expr { long offset; if( pass2 ) { offset = $1.val.v - (lc+2); /* different! */ if( offset > 127 || offset < -128 ) warn("Relative offset exceeds -128 / +127"); $$.value = offset; } } ; bit : bitv BITPOS { if( pass2 ) { if( !isbit8($1.value) ) warn("Bit address exceeds 8-bits"); if( isbmram($1.value) ) $$.value = ($1.value-0x20)*8+$2.value; else if( isbmsfr($1.value) ) $$.value = $1.value + $2.value; else warn("Invalid bit addressable RAM location"); } } | bitv { if( pass2 ) { if( !isbit8($1.value) ) warn("Bit address exceeds 8-bits"); $$.value = $1.value; } } ; bitv : SYMBOL { if( $1.sym->type == UNDEF && pass2 ) warn("Symbol %s undefined",$1.sym->name); $$.value = $1.sym->value; } | VALUE { $$.value = $1.value; } ; reg : R0 { $$.value = 0; } | R1 { $$.value = 1; } | R2 { $$.value = 2; } | R3 { $$.value = 3; } | R4 { $$.value = 4; } | R5 { $$.value = 5; } | R6 { $$.value = 6; } | R7 { $$.value = 7; } ; regi : R0 { $$.value = 0; } | R1 { $$.value = 1; } | R2 { $$.value = 0; warn("Illegal indirect register: @r2"); } | R3 { $$.value = 0; warn("Illegal indirect register: @r3"); } | R4 { $$.value = 0; warn("Illegal indirect register: @r4"); } | R5 { $$.value = 0; warn("Illegal indirect register: @r5"); } | R6 { $$.value = 0; warn("Illegal indirect register: @r6"); } | R7 { $$.value = 0; warn("Illegal indirect register: @r7"); } ; data8 : expr { if( pass2 ) { if( !isbit8($1.val.v) ) warn("Expression greater than 8-bits"); } $$.value = $1.val.v; } ; data16 : expr { if( pass2 ) { if( !isbit16($1.val.v) ) warn("Expression greater than 16-bits"); } $$.value = $1.val.v; } ; addr11 : expr { if( pass2 ) { if( !isbit16($1.val.v) ) warn("Address greater than 16-bits"); if( ($1.val.v & size11) != ((lc+2) & size11) ) warn("Address outside current 2K page"); } set_md($$.mode,0); set_ov($$.mode, ($1.val.v&0x0700)>>3 ); set_sz($$.mode,1); set_b1($$.mode,$1.val.v&0x00ff); } ; addr16 : expr { if( pass2 ) { if( !isbit16($1.val.v) ) warn("Address greater than 16-bits"); } set_md($$.mode,0); set_ov($$.mode, 0 ); set_sz($$.mode,2); set_b1($$.mode, ($1.val.v & 0xff00 ) >> 8 ); set_b2($$.mode, ($1.val.v & 0x00ff ) ); } ; relative : expr { long offset=0; if( pass2 ) { offset = $1.val.v - (lc+2); if( offset>127 || offset<-128 ) warn("Relative offset exceeds -128 / +127"); } set_md($$.mode,0); set_ov($$.mode,0); set_sz($$.mode,1); set_b1($$.mode,offset); } ; %% /* ---------------------------------------------------------------------- */ void yyerror(const char *s) { warn("%s near \"%s\"", s, get_last_token()); } /* ---------------------------------------------------------------------- * makeop: * This function makes an opcode based on the instruction symbol table * entry, and an addressing mode structure. * This function is called from both passes, but * only generates code in pass 2. * * Resultant opcode bytes are passed to genbyte(). * * Returns the nuumber of bytes that the instruction * occupies. * */ int makeop(struct opcode * op, struct mode *m, int add) { register unsigned int newop; if( m == NULL ) { if(pass2) genbyte(op->bytes[0+add]); return(1); } if( pass2 ) { newop = op->bytes[ get_md(*m)+add ] | get_ov(*m); genbyte(newop); if( get_sz(*m) > 0 ) genbyte( get_b1(*m) ); if( get_sz(*m) > 1 ) genbyte( get_b2(*m) ); } return( get_sz(*m)+1 ); } /* ---------------------------------------------------------------------- * inclc: * Increments the Location Counter by 'i' amount. * Check to see if 'i' overflows 64K. * Checks to see if assembler is overlapping previous sections * of code. (using a large bit field). * */ #define indx(a) ( (a)/(32) ) #define bit(a) ( 1 << ((a)%(32)) ) #define getloc(a) (regions[indx(a)] & bit(a)) #define setloc(a) (regions[indx(a)] |= bit(a)) static unsigned long regions[ 0x10000/(32) ]; void inclc(int i) { while (i-- > 0) { if( pass2 && getloc(lc) ) error("Location counter overlaps"); if( pass2 ) setloc(lc); lc += 1; } if( lc > 0xffff ) error("Location counter has exceeded 16-bits"); } void clear_location_counter(void) { memset(regions, 0, sizeof(regions)); } /* ---------------------------------------------------------------------- * padline: * This routine returns a new string, which is equivilant to * 'line' except that all tabs have been expanded to spaces, and * the total length has been truncated to 60 chars. */ char *padline(char *line) { static char newline[61]; char *p1; int pos=0,nxtpos; for(p1=line; pos= 4 ) { j = 0; fprintf(listing,"\n "); } } while(++j <= 4) fprintf(listing," "); fprintf(listing," %s\n",padline(txt)); } /* ---------------------------------------------------------------------- * gen* routines: * Place information into the bytebuf[] array, and also * call emitbyte with the byte. * */ void genbyte(int b) { if( bytecount < sizeof(bytebuf) ) bytebuf[bytecount++] = b; emitbyte(b); } void genstr(const char *s) { while( *s ) genbyte(*s++); } void genword(unsigned long w) { genbyte( (w & 0xff00) >> 8 ); genbyte( (w & 0x00ff) ); } as31-2.3.1/as31/parser.h0000644000175000001440000000734210307071452013726 0ustar erazorusers/* A Bison parser, made by GNU Bison 1.875d. */ /* Skeleton parser for Yacc-like parsing with Bison, Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. 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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { STRING = 258, D_ORG = 259, D_BYTE = 260, D_WORD = 261, D_SKIP = 262, D_EQU = 263, D_FLAG = 264, D_END = 265, ACALL = 266, ADD = 267, ADDC = 268, AJMP = 269, ANL = 270, CJNE = 271, CLR = 272, CPL = 273, DA = 274, DEC = 275, DIV = 276, DJNZ = 277, INC = 278, JB = 279, JBC = 280, JC = 281, JMP = 282, JNB = 283, JNC = 284, JNZ = 285, JZ = 286, LCALL = 287, LJMP = 288, MOV = 289, MOVC = 290, MOVX = 291, NOP = 292, MUL = 293, ORL = 294, POP = 295, PUSH = 296, RET = 297, RETI = 298, RL = 299, RLC = 300, RR = 301, RRC = 302, SETB = 303, SJMP = 304, SUBB = 305, SWAP = 306, XCH = 307, XCHD = 308, XRL = 309, AB = 310, A = 311, C = 312, PC = 313, DPTR = 314, BITPOS = 315, R0 = 316, R1 = 317, R2 = 318, R3 = 319, R4 = 320, R5 = 321, R6 = 322, R7 = 323, VALUE = 324, SYMBOL = 325 }; #endif #define STRING 258 #define D_ORG 259 #define D_BYTE 260 #define D_WORD 261 #define D_SKIP 262 #define D_EQU 263 #define D_FLAG 264 #define D_END 265 #define ACALL 266 #define ADD 267 #define ADDC 268 #define AJMP 269 #define ANL 270 #define CJNE 271 #define CLR 272 #define CPL 273 #define DA 274 #define DEC 275 #define DIV 276 #define DJNZ 277 #define INC 278 #define JB 279 #define JBC 280 #define JC 281 #define JMP 282 #define JNB 283 #define JNC 284 #define JNZ 285 #define JZ 286 #define LCALL 287 #define LJMP 288 #define MOV 289 #define MOVC 290 #define MOVX 291 #define NOP 292 #define MUL 293 #define ORL 294 #define POP 295 #define PUSH 296 #define RET 297 #define RETI 298 #define RL 299 #define RLC 300 #define RR 301 #define RRC 302 #define SETB 303 #define SJMP 304 #define SUBB 305 #define SWAP 306 #define XCH 307 #define XCHD 308 #define XRL 309 #define AB 310 #define A 311 #define C 312 #define PC 313 #define DPTR 314 #define BITPOS 315 #define R0 316 #define R1 317 #define R2 318 #define R3 319 #define R4 320 #define R5 321 #define R6 322 #define R7 323 #define VALUE 324 #define SYMBOL 325 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) typedef int YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif extern YYSTYPE yylval; as31-2.3.1/as31/parser.c0000644000175000001440000025054110307071771013726 0ustar erazorusers/* A Bison parser, made by GNU Bison 1.875d. */ /* Skeleton parser for Yacc-like parsing with Bison, Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. 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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ /* Written by Richard Stallman by simplifying the original so called ``semantic'' parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Using locations. */ #define YYLSP_NEEDED 0 /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { STRING = 258, D_ORG = 259, D_BYTE = 260, D_WORD = 261, D_SKIP = 262, D_EQU = 263, D_FLAG = 264, D_END = 265, ACALL = 266, ADD = 267, ADDC = 268, AJMP = 269, ANL = 270, CJNE = 271, CLR = 272, CPL = 273, DA = 274, DEC = 275, DIV = 276, DJNZ = 277, INC = 278, JB = 279, JBC = 280, JC = 281, JMP = 282, JNB = 283, JNC = 284, JNZ = 285, JZ = 286, LCALL = 287, LJMP = 288, MOV = 289, MOVC = 290, MOVX = 291, NOP = 292, MUL = 293, ORL = 294, POP = 295, PUSH = 296, RET = 297, RETI = 298, RL = 299, RLC = 300, RR = 301, RRC = 302, SETB = 303, SJMP = 304, SUBB = 305, SWAP = 306, XCH = 307, XCHD = 308, XRL = 309, AB = 310, A = 311, C = 312, PC = 313, DPTR = 314, BITPOS = 315, R0 = 316, R1 = 317, R2 = 318, R3 = 319, R4 = 320, R5 = 321, R6 = 322, R7 = 323, VALUE = 324, SYMBOL = 325 }; #endif #define STRING 258 #define D_ORG 259 #define D_BYTE 260 #define D_WORD 261 #define D_SKIP 262 #define D_EQU 263 #define D_FLAG 264 #define D_END 265 #define ACALL 266 #define ADD 267 #define ADDC 268 #define AJMP 269 #define ANL 270 #define CJNE 271 #define CLR 272 #define CPL 273 #define DA 274 #define DEC 275 #define DIV 276 #define DJNZ 277 #define INC 278 #define JB 279 #define JBC 280 #define JC 281 #define JMP 282 #define JNB 283 #define JNC 284 #define JNZ 285 #define JZ 286 #define LCALL 287 #define LJMP 288 #define MOV 289 #define MOVC 290 #define MOVX 291 #define NOP 292 #define MUL 293 #define ORL 294 #define POP 295 #define PUSH 296 #define RET 297 #define RETI 298 #define RL 299 #define RLC 300 #define RR 301 #define RRC 302 #define SETB 303 #define SJMP 304 #define SUBB 305 #define SWAP 306 #define XCH 307 #define XCHD 308 #define XRL 309 #define AB 310 #define A 311 #define C 312 #define PC 313 #define DPTR 314 #define BITPOS 315 #define R0 316 #define R1 317 #define R2 318 #define R3 319 #define R4 320 #define R5 321 #define R6 322 #define R7 323 #define VALUE 324 #define SYMBOL 325 /* Copy the first part of user declarations. */ #line 21 "parser.y" #include #include #define NOPE #include "as31.h" #undef NOPE #define YYSTYPE union ystack static unsigned char bytebuf[1024]; /* used by dumplist() */ static int bytecount; void yyerror(const char *s); int makeop(struct opcode * op, struct mode *m, int add); void inclc(int i); char *padline(char *line); void dumplist(char *txt, int show); void genbyte(int b); void genstr(const char *s); void genword(unsigned long w); /* ------------------------ G R A M M E R ----------------------------- */ /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) typedef int YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 214 of yacc.c. */ #line 255 "y.tab.c" #if ! defined (yyoverflow) || YYERROR_VERBOSE # ifndef YYFREE # define YYFREE free # endif # ifndef YYMALLOC # define YYMALLOC malloc # endif /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # define YYSTACK_ALLOC alloca # endif # else # if defined (alloca) || defined (_ALLOCA_H) # define YYSTACK_ALLOC alloca # else # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # else # if defined (__STDC__) || defined (__cplusplus) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # endif # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # endif #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ #if (! defined (yyoverflow) \ && (! defined (__cplusplus) \ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { short int yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined (__GNUC__) && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ register YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (0) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (0) #endif #if defined (__STDC__) || defined (__cplusplus) typedef signed char yysigned_char; #else typedef short int yysigned_char; #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 155 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 599 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 89 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 35 /* YYNRULES -- Number of rules. */ #define YYNRULES 165 /* YYNRULES -- Number of states. */ #define YYNSTATES 316 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 325 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const unsigned char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 81, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 88, 2, 87, 2, 75, 77, 2, 84, 85, 73, 71, 83, 72, 82, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 80, 2, 79, 2, 78, 2, 86, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 76, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const unsigned short int yyprhs[] = { 0, 0, 3, 5, 8, 10, 14, 16, 19, 22, 24, 25, 29, 33, 37, 41, 45, 51, 57, 60, 62, 65, 67, 69, 71, 75, 79, 81, 83, 87, 89, 91, 95, 98, 102, 106, 110, 114, 118, 122, 126, 131, 136, 138, 140, 142, 145, 148, 151, 154, 157, 160, 163, 166, 169, 172, 175, 178, 181, 184, 187, 190, 193, 196, 199, 205, 211, 214, 216, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, 260, 263, 266, 269, 272, 275, 278, 281, 284, 287, 290, 293, 296, 304, 312, 320, 328, 334, 340, 346, 352, 356, 360, 365, 370, 374, 379, 383, 388, 393, 397, 401, 405, 409, 413, 418, 422, 426, 431, 436, 441, 447, 452, 456, 460, 465, 467, 469, 471, 474, 476, 478, 480, 486, 493, 500, 508, 510, 512, 515, 517, 519, 521, 523, 525, 527, 529, 531, 533, 535, 537, 539, 541, 543, 545, 547, 549, 551, 553, 555, 557, 559, 561 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yysigned_char yyrhs[] = { 90, 0, -1, 91, -1, 91, 92, -1, 92, -1, 99, 80, 93, -1, 93, -1, 95, 81, -1, 103, 81, -1, 81, -1, -1, 1, 94, 81, -1, 82, 4, 96, -1, 82, 5, 100, -1, 82, 6, 101, -1, 82, 7, 96, -1, 82, 8, 99, 83, 102, -1, 82, 9, 70, 83, 97, -1, 82, 10, -1, 102, -1, 98, 60, -1, 70, -1, 69, -1, 70, -1, 100, 83, 119, -1, 100, 83, 3, -1, 119, -1, 3, -1, 101, 83, 120, -1, 120, -1, 73, -1, 84, 102, 85, -1, 72, 102, -1, 102, 76, 102, -1, 102, 77, 102, -1, 102, 73, 102, -1, 102, 74, 102, -1, 102, 75, 102, -1, 102, 72, 102, -1, 102, 71, 102, -1, 102, 78, 78, 102, -1, 102, 79, 79, 102, -1, 70, -1, 69, -1, 37, -1, 11, 121, -1, 14, 121, -1, 12, 104, -1, 13, 104, -1, 50, 104, -1, 54, 104, -1, 54, 105, -1, 15, 104, -1, 15, 105, -1, 15, 106, -1, 39, 104, -1, 39, 105, -1, 39, 106, -1, 52, 104, -1, 23, 110, -1, 23, 59, -1, 20, 110, -1, 19, 56, -1, 21, 55, -1, 27, 86, 56, 71, 59, -1, 27, 86, 59, 71, 56, -1, 38, 55, -1, 42, -1, 43, -1, 44, 56, -1, 45, 56, -1, 46, 56, -1, 47, 56, -1, 51, 56, -1, 53, 104, -1, 17, 111, -1, 18, 111, -1, 48, 111, -1, 41, 119, -1, 40, 119, -1, 33, 122, -1, 32, 122, -1, 26, 123, -1, 29, 123, -1, 30, 123, -1, 31, 123, -1, 49, 123, -1, 16, 112, -1, 24, 107, -1, 28, 107, -1, 25, 107, -1, 22, 108, -1, 34, 104, -1, 34, 105, -1, 34, 109, -1, 35, 56, 83, 86, 56, 71, 59, -1, 35, 56, 83, 86, 59, 71, 56, -1, 35, 56, 83, 86, 56, 71, 58, -1, 35, 56, 83, 86, 58, 71, 56, -1, 36, 56, 83, 86, 118, -1, 36, 56, 83, 86, 59, -1, 36, 86, 118, 83, 56, -1, 36, 86, 59, 83, 56, -1, 56, 83, 117, -1, 56, 83, 119, -1, 56, 83, 86, 118, -1, 56, 83, 87, 119, -1, 119, 83, 56, -1, 119, 83, 87, 119, -1, 57, 83, 115, -1, 57, 83, 74, 115, -1, 57, 83, 88, 115, -1, 115, 83, 113, -1, 117, 83, 114, -1, 119, 83, 113, -1, 117, 83, 56, -1, 117, 83, 119, -1, 117, 83, 87, 119, -1, 119, 83, 117, -1, 119, 83, 119, -1, 119, 83, 86, 118, -1, 86, 118, 83, 56, -1, 86, 118, 83, 119, -1, 86, 118, 83, 87, 119, -1, 59, 83, 87, 120, -1, 57, 83, 115, -1, 119, 83, 57, -1, 119, 60, 83, 57, -1, 56, -1, 117, -1, 119, -1, 86, 118, -1, 56, -1, 57, -1, 115, -1, 56, 83, 119, 83, 113, -1, 56, 83, 87, 119, 83, 113, -1, 117, 83, 87, 119, 83, 113, -1, 86, 118, 83, 87, 119, 83, 113, -1, 102, -1, 102, -1, 116, 60, -1, 116, -1, 70, -1, 69, -1, 61, -1, 62, -1, 63, -1, 64, -1, 65, -1, 66, -1, 67, -1, 68, -1, 61, -1, 62, -1, 63, -1, 64, -1, 65, -1, 66, -1, 67, -1, 68, -1, 102, -1, 102, -1, 102, -1, 102, -1, 102, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned short int yyrline[] = { 0, 126, 126, 131, 132, 135, 145, 148, 153, 159, 164, 164, 183, 190, 191, 192, 195, 204, 210, 213, 223, 236, 242, 246, 254, 259, 270, 275, 287, 292, 306, 309, 312, 315, 318, 321, 324, 327, 330, 333, 336, 339, 341, 354, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 399, 401, 403, 405, 407, 409, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 433, 435, 437, 441, 450, 459, 461, 463, 465, 467, 469, 471, 473, 475, 477, 479, 481, 483, 485, 487, 491, 493, 495, 497, 500, 502, 504, 506, 518, 524, 531, 537, 546, 553, 563, 570, 577, 586, 596, 603, 613, 619, 626, 633, 640, 648, 655, 661, 668, 675, 683, 699, 706, 725, 732, 738, 745, 753, 759, 765, 774, 782, 790, 798, 808, 825, 838, 851, 861, 867, 870, 871, 872, 873, 874, 875, 876, 877, 880, 881, 882, 885, 888, 891, 894, 897, 902, 912, 922, 937, 951 }; #endif #if YYDEBUG || YYERROR_VERBOSE /* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "STRING", "D_ORG", "D_BYTE", "D_WORD", "D_SKIP", "D_EQU", "D_FLAG", "D_END", "ACALL", "ADD", "ADDC", "AJMP", "ANL", "CJNE", "CLR", "CPL", "DA", "DEC", "DIV", "DJNZ", "INC", "JB", "JBC", "JC", "JMP", "JNB", "JNC", "JNZ", "JZ", "LCALL", "LJMP", "MOV", "MOVC", "MOVX", "NOP", "MUL", "ORL", "POP", "PUSH", "RET", "RETI", "RL", "RLC", "RR", "RRC", "SETB", "SJMP", "SUBB", "SWAP", "XCH", "XCHD", "XRL", "AB", "A", "C", "PC", "DPTR", "BITPOS", "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "VALUE", "SYMBOL", "'+'", "'-'", "'*'", "'/'", "'%'", "'|'", "'&'", "'>'", "'<'", "':'", "'\\n'", "'.'", "','", "'('", "')'", "'@'", "'#'", "'!'", "$accept", "program", "linelist", "line", "linerest", "@1", "directive", "defexpr", "flag", "flagv", "undefsym", "blist", "wlist", "expr", "instr", "two_op1", "two_op2", "two_op3", "two_op4", "two_op5", "two_op6", "single_op1", "single_op2", "three_op1", "rel", "rel2", "bit", "bitv", "reg", "regi", "data8", "data16", "addr11", "addr16", "relative", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const unsigned short int yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 43, 45, 42, 47, 37, 124, 38, 62, 60, 58, 10, 46, 44, 40, 41, 64, 35, 33 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { 0, 89, 90, 91, 91, 92, 92, 93, 93, 93, 94, 93, 95, 95, 95, 95, 95, 95, 95, 96, 97, 98, 98, 99, 100, 100, 100, 100, 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 104, 104, 104, 104, 105, 105, 106, 106, 106, 107, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110, 110, 110, 111, 111, 111, 112, 112, 112, 112, 113, 114, 115, 115, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 119, 120, 121, 122, 123 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const unsigned char yyr2[] = { 0, 2, 1, 2, 1, 3, 1, 2, 2, 1, 0, 3, 3, 3, 3, 3, 5, 5, 2, 1, 2, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 3, 3, 4, 4, 3, 4, 3, 4, 4, 3, 3, 3, 3, 3, 4, 3, 3, 4, 4, 4, 5, 4, 3, 3, 4, 1, 1, 1, 2, 1, 1, 1, 5, 6, 6, 7, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const unsigned char yydefact[] = { 0, 10, 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, 44, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 9, 0, 0, 0, 4, 6, 0, 0, 0, 0, 43, 42, 0, 30, 0, 163, 45, 0, 47, 48, 46, 0, 161, 52, 53, 54, 0, 0, 145, 146, 147, 148, 149, 150, 151, 152, 0, 87, 0, 132, 133, 144, 143, 75, 134, 142, 76, 62, 128, 0, 61, 129, 130, 63, 91, 0, 0, 60, 59, 88, 0, 90, 165, 82, 0, 89, 83, 84, 85, 164, 81, 80, 0, 0, 0, 92, 93, 94, 0, 0, 0, 0, 0, 66, 55, 56, 57, 79, 78, 69, 70, 71, 72, 77, 86, 49, 73, 58, 74, 50, 51, 0, 0, 0, 0, 0, 0, 18, 1, 3, 7, 0, 8, 11, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 155, 156, 157, 158, 159, 160, 0, 0, 141, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 19, 27, 13, 26, 14, 162, 29, 15, 0, 0, 5, 31, 39, 38, 35, 36, 37, 33, 34, 0, 0, 0, 0, 103, 104, 0, 0, 109, 107, 0, 0, 0, 0, 0, 140, 113, 139, 114, 112, 0, 0, 125, 0, 0, 115, 0, 116, 0, 126, 0, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 40, 41, 105, 106, 110, 111, 108, 0, 0, 0, 0, 64, 65, 124, 121, 0, 122, 117, 127, 120, 0, 0, 0, 100, 99, 102, 101, 25, 24, 28, 16, 22, 21, 17, 0, 0, 135, 0, 0, 123, 0, 0, 0, 20, 136, 0, 137, 97, 95, 98, 96, 138 }; /* YYDEFGOTO[NTERM-NUM]. */ static const short int yydefgoto[] = { -1, 49, 50, 51, 52, 56, 53, 203, 297, 298, 54, 206, 208, 69, 55, 65, 71, 72, 106, 101, 124, 97, 90, 84, 241, 239, 91, 92, 98, 184, 73, 210, 63, 117, 110 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -239 static const short int yypact[] = { 370, -239, 139, -24, -24, 139, 120, 70, 15, 15, -19, 470, -12, 292, 441, 23, 23, 139, -45, 23, 139, 139, 139, 139, 139, 222, -9, -26, -239, 14, 120, 139, 139, -239, -239, 19, 25, 31, 49, 15, 139, -24, 54, -24, -24, 85, -239, -239, 440, 89, 298, -239, -239, -27, 37, 38, 41, -239, -239, 139, -239, 139, 513, -239, 64, -239, -239, -239, 67, 513, -239, -239, -239, 68, 77, -239, -239, -239, -239, -239, -239, -239, -239, 454, -239, 87, -239, -239, -239, -239, -239, -239, 83, -239, -239, -239, 454, -239, -239, -239, -239, -239, 90, 91, -239, -239, -239, 101, -239, 513, -239, -30, -239, -239, -239, -239, 513, -239, -239, 102, 108, 454, -239, -239, -239, 111, -50, 115, 124, 485, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, -239, 139, 4, 139, 139, 140, 143, -239, -239, -239, -239, 442, -239, -239, 104, 354, 139, 139, 139, 139, 139, 139, 139, 75, 145, 496, 126, -47, 133, -239, -239, -239, -239, -239, -239, -239, -239, 135, 132, -239, -239, 139, 139, 139, 154, 155, 23, 141, 144, -17, 147, 34, 146, 148, 150, 152, -239, 513, -239, 156, -239, 158, 513, -239, -239, 159, 160, -239, -239, 520, 520, 104, 104, 104, 30, 30, 139, 139, 454, 139, -239, -239, 23, 23, -239, -239, 139, 139, 162, 151, 139, 513, -239, 513, -239, -239, 172, 190, -239, 139, 55, -239, 139, -239, 191, -239, 454, -239, -239, 56, 511, 193, 195, 10, 139, 139, 60, -239, -239, -239, -239, -239, -239, -239, 164, 139, 139, 170, -239, -239, -239, -239, 139, -239, -239, -239, -239, 183, 184, 185, -239, -239, -239, -239, -239, -239, -239, 513, -239, -239, -239, 197, 139, -239, 175, 139, -239, 86, 205, 206, -239, -239, 139, -239, -239, -239, -239, -239, -239 }; /* YYPGOTO[NTERM-NUM]. */ static const short int yypgoto[] = { -239, -239, -239, 214, 107, -239, -239, 116, -239, -239, 114, -239, -239, -2, -239, 21, 33, 238, 26, -239, -239, 255, 22, -239, -186, -239, -14, -239, -1, -85, 3, -238, 266, 248, 28 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -3 static const short int yytable[] = { 62, 107, 107, 62, 242, 107, 85, 205, 277, 232, 197, 187, 102, 291, 99, 109, 103, 99, 109, 109, 109, 116, 116, 293, 125, 66, 191, 70, 126, 192, 128, 93, 64, 198, 134, 135, 195, 94, 109, 248, 233, 111, 108, 100, 202, 112, 122, 127, 113, 114, 115, 131, 57, 58, 157, 59, 60, 161, 123, 162, 129, 140, 142, 132, 144, 145, 146, 61, 141, 130, 249, 86, 87, 57, 58, 136, 59, 60, 147, 57, 58, 137, 59, 60, 88, 89, 300, 138, 61, 155, 232, 252, 88, 89, 61, 75, 76, 77, 78, 79, 80, 81, 82, 57, 58, 139, 59, 60, 170, 171, 143, 278, 284, 308, 285, 286, 310, 158, 61, 159, 253, 233, 160, 315, 57, 58, 74, 59, 60, 295, 296, 75, 76, 77, 78, 79, 80, 81, 82, 61, 266, 64, 279, 186, 311, 312, 204, 172, 209, 204, 173, 174, 207, 223, 57, 58, 83, 59, 60, 231, 175, 216, 217, 218, 219, 220, 221, 222, 283, 61, 185, 227, 288, 188, 189, 228, 64, 68, 235, 245, 168, 169, 170, 171, 190, 193, 238, 240, 240, 57, 58, 194, 59, 60, 196, 88, 89, 254, 199, 250, 229, 255, 57, 58, 61, 59, 60, 200, 57, 58, 46, 59, 60, 213, 230, 268, 269, 61, 236, 237, 234, 264, 265, 61, 224, 243, 244, 247, 246, 267, 251, 275, 256, 258, 257, 259, 270, 271, 273, 260, 274, 261, 262, 263, 209, 272, 276, 299, 282, 289, 280, 290, 281, 302, 304, 305, 306, 307, 309, 209, 294, 313, 314, 292, 156, 214, 212, 211, 133, 105, 240, 67, 118, 0, 0, 0, 301, 0, 64, 119, 0, 120, 303, 75, 76, 77, 78, 79, 80, 81, 82, 57, 58, 0, 59, 60, 0, 240, -2, 1, 240, 0, 0, 0, 0, 0, 61, 240, 121, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 75, 76, 77, 78, 79, 80, 81, 82, 57, 58, 0, 59, 60, 0, 0, 46, 0, 0, 1, 0, 0, 0, 0, 61, 0, 0, 47, 48, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 163, 164, 165, 166, 167, 168, 169, 170, 171, 0, 0, 0, 0, 0, 215, 46, 0, 0, 1, 148, 149, 150, 151, 152, 153, 154, 47, 48, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 95, 0, 0, 104, 0, 75, 76, 77, 78, 79, 80, 81, 82, 57, 58, 0, 59, 60, 176, 177, 178, 179, 180, 181, 182, 183, 47, 48, 61, 95, 96, 0, 0, 0, 75, 76, 77, 78, 79, 80, 81, 82, 57, 58, 0, 59, 60, 201, 0, 176, 177, 178, 179, 180, 181, 182, 183, 61, 0, 96, 75, 76, 77, 78, 79, 80, 81, 82, 57, 58, 0, 59, 60, 287, 0, 176, 177, 178, 179, 180, 181, 182, 183, 61, 0, 225, 226, 163, 164, 165, 166, 167, 168, 169, 170, 171, 165, 166, 167, 168, 169, 170, 171 }; static const short int yycheck[] = { 2, 15, 16, 5, 190, 19, 7, 3, 246, 56, 60, 96, 13, 3, 11, 17, 13, 14, 20, 21, 22, 23, 24, 261, 25, 4, 56, 6, 25, 59, 56, 9, 56, 83, 31, 32, 121, 56, 40, 56, 87, 86, 16, 55, 129, 19, 25, 56, 20, 21, 22, 30, 69, 70, 81, 72, 73, 59, 25, 61, 86, 39, 41, 30, 43, 44, 45, 84, 40, 55, 87, 56, 57, 69, 70, 56, 72, 73, 45, 69, 70, 56, 72, 73, 69, 70, 272, 56, 84, 0, 56, 57, 69, 70, 84, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 56, 72, 73, 78, 79, 56, 56, 56, 299, 58, 59, 302, 80, 84, 81, 86, 87, 81, 309, 69, 70, 56, 72, 73, 69, 70, 61, 62, 63, 64, 65, 66, 67, 68, 84, 225, 56, 87, 60, 58, 59, 148, 83, 150, 151, 83, 83, 149, 78, 69, 70, 86, 72, 73, 173, 83, 163, 164, 165, 166, 167, 168, 169, 253, 84, 83, 172, 257, 83, 83, 172, 56, 57, 175, 193, 76, 77, 78, 79, 83, 83, 188, 189, 190, 69, 70, 83, 72, 73, 83, 69, 70, 198, 83, 196, 74, 198, 69, 70, 84, 72, 73, 83, 69, 70, 70, 72, 73, 70, 88, 229, 230, 84, 83, 87, 87, 223, 224, 84, 79, 71, 71, 83, 87, 226, 83, 59, 86, 83, 86, 83, 233, 234, 87, 83, 237, 83, 83, 83, 246, 83, 56, 83, 57, 56, 247, 56, 249, 83, 71, 71, 71, 60, 83, 261, 262, 56, 56, 260, 50, 158, 152, 151, 30, 14, 272, 5, 24, -1, -1, -1, 273, -1, 56, 57, -1, 59, 279, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, 73, -1, 299, 0, 1, 302, -1, -1, -1, -1, -1, 84, 309, 86, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, 73, -1, -1, 70, -1, -1, 1, -1, -1, -1, -1, 84, -1, -1, 81, 82, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 71, 72, 73, 74, 75, 76, 77, 78, 79, -1, -1, -1, -1, -1, 85, 70, -1, -1, 1, 4, 5, 6, 7, 8, 9, 10, 81, 82, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, -1, -1, 59, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, 73, 61, 62, 63, 64, 65, 66, 67, 68, 81, 82, 84, 56, 86, -1, -1, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, 73, 59, -1, 61, 62, 63, 64, 65, 66, 67, 68, 84, -1, 86, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, 73, 59, -1, 61, 62, 63, 64, 65, 66, 67, 68, 84, -1, 86, 87, 71, 72, 73, 74, 75, 76, 77, 78, 79, 73, 74, 75, 76, 77, 78, 79 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { 0, 1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 70, 81, 82, 90, 91, 92, 93, 95, 99, 103, 94, 69, 70, 72, 73, 84, 102, 121, 56, 104, 104, 121, 57, 102, 104, 105, 106, 119, 56, 61, 62, 63, 64, 65, 66, 67, 68, 86, 112, 117, 56, 57, 69, 70, 111, 115, 116, 111, 56, 56, 86, 110, 117, 119, 55, 108, 117, 119, 59, 110, 107, 115, 107, 102, 123, 86, 107, 123, 123, 123, 102, 122, 122, 57, 59, 86, 104, 105, 109, 117, 119, 56, 56, 86, 55, 104, 105, 106, 119, 119, 56, 56, 56, 56, 111, 123, 104, 56, 104, 104, 104, 105, 4, 5, 6, 7, 8, 9, 10, 0, 92, 81, 80, 81, 81, 102, 102, 71, 72, 73, 74, 75, 76, 77, 78, 79, 83, 83, 83, 83, 61, 62, 63, 64, 65, 66, 67, 68, 118, 83, 60, 118, 83, 83, 83, 56, 59, 83, 83, 118, 83, 60, 83, 83, 83, 59, 118, 96, 102, 3, 100, 119, 101, 102, 120, 96, 99, 70, 93, 85, 102, 102, 102, 102, 102, 102, 102, 78, 79, 86, 87, 117, 119, 74, 88, 115, 56, 87, 87, 119, 83, 87, 102, 114, 102, 113, 113, 71, 71, 115, 87, 83, 56, 87, 119, 83, 57, 86, 117, 119, 86, 86, 83, 83, 83, 83, 83, 83, 102, 102, 118, 119, 115, 115, 119, 119, 83, 87, 119, 59, 56, 120, 56, 87, 119, 119, 57, 118, 56, 58, 59, 59, 118, 56, 56, 3, 119, 120, 102, 69, 70, 97, 98, 83, 113, 119, 83, 119, 71, 71, 71, 60, 113, 83, 113, 58, 59, 56, 56, 113 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) # define YYSIZE_T __SIZE_TYPE__ #endif #if ! defined (YYSIZE_T) && defined (size_t) # define YYSIZE_T size_t #endif #if ! defined (YYSIZE_T) # if defined (__STDC__) || defined (__cplusplus) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # endif #endif #if ! defined (YYSIZE_T) # define YYSIZE_T unsigned int #endif #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ { \ yyerror ("syntax error: cannot back up");\ YYERROR; \ } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Compute the default location (before the actions are run). */ #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ ((Current).first_line = (Rhs)[1].first_line, \ (Current).first_column = (Rhs)[1].first_column, \ (Current).last_line = (Rhs)[N].last_line, \ (Current).last_column = (Rhs)[N].last_column) #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) # define YYDSYMPRINT(Args) \ do { \ if (yydebug) \ yysymprint Args; \ } while (0) # define YYDSYMPRINTF(Title, Token, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yysymprint (stderr, \ Token, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if defined (__STDC__) || defined (__cplusplus) static void yy_stack_print (short int *bottom, short int *top) #else static void yy_stack_print (bottom, top) short int *bottom; short int *top; #endif { YYFPRINTF (stderr, "Stack now"); for (/* Nothing. */; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if defined (__STDC__) || defined (__cplusplus) static void yy_reduce_print (int yyrule) #else static void yy_reduce_print (yyrule) int yyrule; #endif { int yyi; unsigned int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", yyrule - 1, yylno); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (Rule); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YYDSYMPRINT(Args) # define YYDSYMPRINTF(Title, Token, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 # undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined (__GLIBC__) && defined (_STRING_H) # define yystrlen strlen # else /* Return the length of YYSTR. */ static YYSIZE_T # if defined (__STDC__) || defined (__cplusplus) yystrlen (const char *yystr) # else yystrlen (yystr) const char *yystr; # endif { register const char *yys = yystr; while (*yys++ != '\0') continue; return yys - yystr - 1; } # endif # endif # ifndef yystpcpy # if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * # if defined (__STDC__) || defined (__cplusplus) yystpcpy (char *yydest, const char *yysrc) # else yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; # endif { register char *yyd = yydest; register const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif #endif /* !YYERROR_VERBOSE */ #if YYDEBUG /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if defined (__STDC__) || defined (__cplusplus) static void yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) #else static void yysymprint (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE *yyvaluep; #endif { /* Pacify ``unused variable'' warnings. */ (void) yyvaluep; if (yytype < YYNTOKENS) { YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); # ifdef YYPRINT YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # endif } else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); switch (yytype) { default: break; } YYFPRINTF (yyoutput, ")"); } #endif /* ! YYDEBUG */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ #if defined (__STDC__) || defined (__cplusplus) static void yydestruct (int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yytype, yyvaluep) int yytype; YYSTYPE *yyvaluep; #endif { /* Pacify ``unused variable'' warnings. */ (void) yyvaluep; switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM # if defined (__STDC__) || defined (__cplusplus) int yyparse (void *YYPARSE_PARAM); # else int yyparse (); # endif #else /* ! YYPARSE_PARAM */ #if defined (__STDC__) || defined (__cplusplus) int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM # if defined (__STDC__) || defined (__cplusplus) int yyparse (void *YYPARSE_PARAM) # else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; # endif #else /* ! YYPARSE_PARAM */ #if defined (__STDC__) || defined (__cplusplus) int yyparse (void) #else int yyparse () #endif #endif { register int yystate; register int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Lookahead token as an internal (translated) token number. */ int yytoken = 0; /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ short int yyssa[YYINITDEPTH]; short int *yyss = yyssa; register short int *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; register YYSTYPE *yyvsp; #define YYPOPSTACK (yyvsp--, yyssp--) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* When reducing, the number of symbols on the RHS of the reduced rule. */ int yylen; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; short int *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow ("parser stack overflow", &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyoverflowlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyoverflowlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { short int *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyoverflowlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* yyresume: */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 127 "parser.y" { } break; case 5: #line 136 "parser.y" { if (abort_asap) {YYABORT;} if( pass1 ) { yyvsp[-2].sym->type = LABEL; yyvsp[-2].sym->value = lc; } inclc(yyvsp[0].value); bytecount = 0; } break; case 6: #line 145 "parser.y" { inclc(yyvsp[0].value); bytecount = 0; } break; case 7: #line 148 "parser.y" { yyval.value = yyvsp[-1].value; if( dashl && pass2 ) dumplist(yyvsp[0].str,1); } break; case 8: #line 153 "parser.y" { yyval.value = yyvsp[-1].value; if( dashl && pass2 ) dumplist(yyvsp[0].str,1); } break; case 9: #line 159 "parser.y" { yyval.value = 0; if( dashl && pass2 ) dumplist(yyvsp[0].str,0); } break; case 10: #line 164 "parser.y" { seek_eol(); } break; case 11: #line 167 "parser.y" { yyval.value = 0; if( dashl && pass2 ) dumplist(yyvsp[-2].str,0); } break; case 12: #line 184 "parser.y" { lc = yyvsp[0].val.v; if( pass2 ) emitaddr(lc); bytecount = 0; yyval.value = 0; } break; case 13: #line 190 "parser.y" { yyval.value = yyvsp[0].value; } break; case 14: #line 191 "parser.y" { yyval.value = yyvsp[0].value; } break; case 15: #line 192 "parser.y" { yyval.value = yyvsp[0].val.v; if( pass2 ) emitaddr(lc+yyval.value); } break; case 16: #line 196 "parser.y" { if( yyvsp[0].val.d == 0 ) warn("Expression is undefined in pass 1"); yyvsp[-2].sym->type = LABEL; yyvsp[-2].sym->value = yyvsp[0].val.v; yyval.value = 0; } break; case 17: #line 205 "parser.y" { yyvsp[-2].sym->type = LABEL; yyvsp[-2].sym->value = yyvsp[0].value; yyval.value = 0; } break; case 18: #line 210 "parser.y" { yyval.value = 0; } break; case 19: #line 214 "parser.y" { if( yyvsp[0].val.d == 0 ) warn("Expression is undefined in pass 1"); if( !(isbit16(yyvsp[0].val.v)) ) warn("Value greater than 16-bits"); yyval.value = yyvsp[0].val.v; } break; case 20: #line 224 "parser.y" { if( !isbit8(yyvsp[-1].value) ) warn("Bit address exceeds 8-bits"); if( isbmram(yyvsp[-1].value) ) yyval.value = (yyvsp[-1].value-0x20)*8+ yyvsp[0].value; else if( isbmsfr(yyvsp[-1].value) ) yyval.value = yyvsp[-1].value + yyvsp[0].value; else warn("Invalid bit addressable RAM location"); } break; case 21: #line 237 "parser.y" { if( yyvsp[0].sym->type == UNDEF ) warn("Symbol %s must be defined in pass 1",yyvsp[0].sym->name); yyval.value = yyvsp[0].sym->value; } break; case 22: #line 242 "parser.y" { yyval.value = yyvsp[0].value; } break; case 23: #line 247 "parser.y" { if( yyvsp[0].sym->type != UNDEF && pass1) warn("Attempt to redefine symbol: %s",yyvsp[0].sym->name); yyval.sym = yyvsp[0].sym; } break; case 24: #line 255 "parser.y" { if( pass2 ) genbyte(yyvsp[0].value); yyval.value = yyvsp[-2].value + 1; } break; case 25: #line 260 "parser.y" { if( pass1 ) yyval.value = yyvsp[-2].value + yyvsp[0].value; else { yyval.value = yyvsp[-2].value + strlen(yyvsp[0].str); genstr(yyvsp[0].str); free(yyvsp[0].str); } } break; case 26: #line 271 "parser.y" { if( pass2 ) genbyte(yyvsp[0].value); yyval.value = 1; } break; case 27: #line 276 "parser.y" { if( pass1 ) yyval.value = yyvsp[0].value; else { yyval.value = strlen(yyvsp[0].str); genstr(yyvsp[0].str); free(yyvsp[0].str); } } break; case 28: #line 288 "parser.y" { if( pass2 ) genword(yyvsp[0].value); yyval.value = yyvsp[-2].value + 2; } break; case 29: #line 293 "parser.y" { if( pass2 ) genword(yyvsp[0].value); yyval.value = 2; } break; case 30: #line 306 "parser.y" { yyval.val.v = lc; yyval.val.d = 1; } break; case 31: #line 309 "parser.y" { yyval.val.v = yyvsp[-1].val.v; yyval.val.d = yyvsp[-1].val.d; } break; case 32: #line 312 "parser.y" { yyval.val.v = -yyvsp[0].val.v; yyval.val.d = yyvsp[0].val.d; } break; case 33: #line 315 "parser.y" { yyval.val.v = yyvsp[-2].val.v | yyvsp[0].val.v; yyval.val.d = yyvsp[-2].val.d && yyvsp[0].val.d; } break; case 34: #line 318 "parser.y" { yyval.val.v = yyvsp[-2].val.v & yyvsp[0].val.v; yyval.val.d = yyvsp[-2].val.d && yyvsp[0].val.d; } break; case 35: #line 321 "parser.y" { yyval.val.v = yyvsp[-2].val.v * yyvsp[0].val.v; yyval.val.d = yyvsp[-2].val.d && yyvsp[0].val.d; } break; case 36: #line 324 "parser.y" { yyval.val.v = yyvsp[-2].val.v / yyvsp[0].val.v; yyval.val.d = yyvsp[-2].val.d && yyvsp[0].val.d; } break; case 37: #line 327 "parser.y" { yyval.val.v = yyvsp[-2].val.v % yyvsp[0].val.v; yyval.val.d = yyvsp[-2].val.d && yyvsp[0].val.d; } break; case 38: #line 330 "parser.y" { yyval.val.v = yyvsp[-2].val.v - yyvsp[0].val.v; yyval.val.d = yyvsp[-2].val.d && yyvsp[0].val.d; } break; case 39: #line 333 "parser.y" { yyval.val.v = yyvsp[-2].val.v + yyvsp[0].val.v; yyval.val.d = yyvsp[-2].val.d && yyvsp[0].val.d; } break; case 40: #line 336 "parser.y" { yyval.val.v = yyvsp[-3].val.v >> yyvsp[0].val.v; yyval.val.d = yyvsp[-3].val.d && yyvsp[0].val.d; } break; case 41: #line 339 "parser.y" { yyval.val.v = yyvsp[-3].val.v << yyvsp[0].val.v; yyval.val.d = yyvsp[-3].val.d && yyvsp[0].val.d; } break; case 42: #line 342 "parser.y" { if( pass1 ) { yyval.val.v = yyvsp[0].sym->value; yyval.val.d = (yyvsp[0].sym->type != UNDEF); } else { if( yyvsp[0].sym->type == UNDEF ) warn("Undefined symbol %s",yyvsp[0].sym->name); yyval.val.v = yyvsp[0].sym->value; yyval.val.d = 1; } } break; case 43: #line 354 "parser.y" { yyval.val.v = yyvsp[0].val.v; yyval.val.d=1; } break; case 44: #line 367 "parser.y" { yyval.value = makeop(yyvsp[0].op,NULL,0); } break; case 45: #line 369 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 46: #line 371 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 47: #line 373 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 48: #line 375 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 49: #line 377 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 50: #line 379 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 51: #line 381 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,4); } break; case 52: #line 383 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 53: #line 385 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,4); } break; case 54: #line 387 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,6); } break; case 55: #line 389 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 56: #line 391 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,4); } break; case 57: #line 393 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,6); } break; case 58: #line 395 "parser.y" { if( get_md(yyvsp[0].mode) == 3 ) warn("Immediate mode is illegal"); yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 59: #line 400 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 60: #line 402 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,4); } break; case 61: #line 404 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 62: #line 406 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,0); } break; case 63: #line 408 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,0); } break; case 64: #line 410 "parser.y" { yyval.value = makeop(yyvsp[-4].op,NULL,0); } break; case 65: #line 412 "parser.y" { yyval.value = makeop(yyvsp[-4].op,NULL,0); } break; case 66: #line 414 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,0); } break; case 67: #line 416 "parser.y" { yyval.value = makeop(yyvsp[0].op,NULL,0); } break; case 68: #line 418 "parser.y" { yyval.value = makeop(yyvsp[0].op,NULL,0); } break; case 69: #line 420 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,0); } break; case 70: #line 422 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,0); } break; case 71: #line 424 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,0); } break; case 72: #line 426 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,0); } break; case 73: #line 428 "parser.y" { yyval.value = makeop(yyvsp[-1].op,NULL,0); } break; case 74: #line 430 "parser.y" { if( get_md(yyvsp[0].mode) != 2 ) warn("Invalid addressing mode"); yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,-2); } break; case 75: #line 434 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 76: #line 436 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 77: #line 438 "parser.y" { if( get_md(yyvsp[0].mode) == 0 ) warn("Invalid addressing mode"); yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,-1); } break; case 78: #line 442 "parser.y" { struct mode tmp; set_md(tmp,0); set_ov(tmp,0); set_sz(tmp,1); set_b1(tmp,yyvsp[0].value); yyval.value = makeop(yyvsp[-1].op,&tmp,0); } break; case 79: #line 451 "parser.y" { struct mode tmp; set_md(tmp,0); set_ov(tmp,0); set_sz(tmp,1); set_b1(tmp,yyvsp[0].value); yyval.value = makeop(yyvsp[-1].op,&tmp,0); } break; case 80: #line 460 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 81: #line 462 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 82: #line 464 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 83: #line 466 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 84: #line 468 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 85: #line 470 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 86: #line 472 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 87: #line 474 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 88: #line 476 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 89: #line 478 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 90: #line 480 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 91: #line 482 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 92: #line 484 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,0); } break; case 93: #line 486 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,4); } break; case 94: #line 488 "parser.y" { yyval.value = makeop(yyvsp[-1].op,&yyvsp[0].mode,6); } break; case 95: #line 492 "parser.y" { yyval.value = makeop(yyvsp[-6].op,NULL,0); } break; case 96: #line 494 "parser.y" { yyval.value = makeop(yyvsp[-6].op,NULL,0); } break; case 97: #line 496 "parser.y" { yyval.value = makeop(yyvsp[-6].op,NULL,1); } break; case 98: #line 498 "parser.y" { yyval.value = makeop(yyvsp[-6].op,NULL,1); } break; case 99: #line 501 "parser.y" { yyval.value = makeop(yyvsp[-4].op,NULL,yyvsp[0].value); } break; case 100: #line 503 "parser.y" { yyval.value = makeop(yyvsp[-4].op,NULL,2); } break; case 101: #line 505 "parser.y" { yyval.value = makeop(yyvsp[-4].op,NULL,yyvsp[-2].value+3); } break; case 102: #line 507 "parser.y" { yyval.value = makeop(yyvsp[-4].op,NULL,5); } break; case 103: #line 519 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode, yyvsp[0].value); set_sz(yyval.mode, 0); } break; case 104: #line 525 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 105: #line 532 "parser.y" { set_md(yyval.mode,2); set_ov(yyval.mode,yyvsp[0].value); set_sz(yyval.mode,0); } break; case 106: #line 538 "parser.y" { set_md(yyval.mode,3); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 107: #line 547 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[-2].value); } break; case 108: #line 554 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,0); set_sz(yyval.mode,2); set_b1(yyval.mode,yyvsp[-3].value); set_b2(yyval.mode,yyvsp[0].value); } break; case 109: #line 564 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 110: #line 571 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 111: #line 578 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 112: #line 587 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode,0); set_sz(yyval.mode,2); set_b1(yyval.mode,yyvsp[-2].value); set_b2(yyval.mode,yyvsp[0].value); } break; case 113: #line 597 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode,yyvsp[-2].value); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 114: #line 604 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,0); set_sz(yyval.mode,2); set_b1(yyval.mode,yyvsp[-2].value); set_b2(yyval.mode,yyvsp[0].value); } break; case 115: #line 614 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode,yyvsp[-2].value); set_sz(yyval.mode,0); } break; case 116: #line 620 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,yyvsp[-2].value); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 117: #line 627 "parser.y" { set_md(yyval.mode,2); set_ov(yyval.mode,yyvsp[-3].value); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 118: #line 634 "parser.y" { set_md(yyval.mode,3); set_ov(yyval.mode,yyvsp[0].value); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[-2].value); } break; case 119: #line 641 "parser.y" { set_md(yyval.mode,4); set_ov(yyval.mode,0); set_sz(yyval.mode,2); set_b1(yyval.mode,yyvsp[0].value); set_b2(yyval.mode,yyvsp[-2].value); } break; case 120: #line 649 "parser.y" { set_md(yyval.mode,5); set_ov(yyval.mode,yyvsp[0].value); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[-3].value); } break; case 121: #line 656 "parser.y" { set_md(yyval.mode,6); set_ov(yyval.mode,yyvsp[-2].value); set_sz(yyval.mode,0); } break; case 122: #line 662 "parser.y" { set_md(yyval.mode,7); set_ov(yyval.mode,yyvsp[-2].value); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 123: #line 669 "parser.y" { set_md(yyval.mode,8); set_ov(yyval.mode,yyvsp[-3].value); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 124: #line 676 "parser.y" { set_md(yyval.mode,9); set_ov(yyval.mode,0); set_sz(yyval.mode,2); set_b1(yyval.mode, (yyvsp[0].value & 0xff00) >> 8 ); set_b2(yyval.mode, (yyvsp[0].value & 0x00ff) ); } break; case 125: #line 684 "parser.y" { set_md(yyval.mode,10); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 126: #line 700 "parser.y" { set_md(yyval.mode,11); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[-2].value); } break; case 127: #line 707 "parser.y" { if( pass2 ) { if( !isbit8(yyvsp[-3].value) ) warn("Bit address exceeds 8-bits"); if( isbmram(yyvsp[-3].value) ) set_b1(yyval.mode, (yyvsp[-3].value-0x20)*8+ yyvsp[-2].value ); else if( isbmsfr(yyvsp[-3].value) ) set_b1(yyval.mode, yyvsp[-3].value + yyvsp[-2].value ); else warn("Invalid bit addressable RAM location"); } set_md(yyval.mode,11); set_ov(yyval.mode,0); set_sz(yyval.mode,1); } break; case 128: #line 726 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode,0); set_sz(yyval.mode,0); } break; case 129: #line 733 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,yyvsp[0].value); set_sz(yyval.mode,0); } break; case 130: #line 739 "parser.y" { set_md(yyval.mode,2); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 131: #line 746 "parser.y" { set_md(yyval.mode,3); set_ov(yyval.mode,yyvsp[0].value); set_sz(yyval.mode,0); } break; case 132: #line 754 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode,0); set_sz(yyval.mode,0); } break; case 133: #line 760 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,0); set_sz(yyval.mode,0); } break; case 134: #line 766 "parser.y" { set_md(yyval.mode,2); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].value); } break; case 135: #line 775 "parser.y" { set_md(yyval.mode,0); set_ov(yyval.mode,0); set_sz(yyval.mode,2); set_b1(yyval.mode,yyvsp[-2].value); set_b2(yyval.mode,yyvsp[0].value); } break; case 136: #line 783 "parser.y" { set_md(yyval.mode,1); set_ov(yyval.mode,0); set_sz(yyval.mode,2); set_b1(yyval.mode,yyvsp[-2].value); set_b2(yyval.mode,yyvsp[0].value); } break; case 137: #line 791 "parser.y" { set_md(yyval.mode,2); set_ov(yyval.mode,yyvsp[-5].value); set_sz(yyval.mode,2); set_b1(yyval.mode,yyvsp[-2].value); set_b2(yyval.mode,yyvsp[0].value); } break; case 138: #line 799 "parser.y" { set_md(yyval.mode,3); set_ov(yyval.mode,yyvsp[-5].value); set_sz(yyval.mode,2); set_b1(yyval.mode,yyvsp[-2].value); set_b2(yyval.mode,yyvsp[0].value); } break; case 139: #line 809 "parser.y" { long offset; if( pass2 ) { offset = yyvsp[0].val.v - (lc+3); if( offset > 127 || offset < -128 ) warn("Relative offset exceeds -128 / +127"); yyval.value = offset; } } break; case 140: #line 826 "parser.y" { long offset; if( pass2 ) { offset = yyvsp[0].val.v - (lc+2); /* different! */ if( offset > 127 || offset < -128 ) warn("Relative offset exceeds -128 / +127"); yyval.value = offset; } } break; case 141: #line 839 "parser.y" { if( pass2 ) { if( !isbit8(yyvsp[-1].value) ) warn("Bit address exceeds 8-bits"); if( isbmram(yyvsp[-1].value) ) yyval.value = (yyvsp[-1].value-0x20)*8+yyvsp[0].value; else if( isbmsfr(yyvsp[-1].value) ) yyval.value = yyvsp[-1].value + yyvsp[0].value; else warn("Invalid bit addressable RAM location"); } } break; case 142: #line 852 "parser.y" { if( pass2 ) { if( !isbit8(yyvsp[0].value) ) warn("Bit address exceeds 8-bits"); yyval.value = yyvsp[0].value; } } break; case 143: #line 862 "parser.y" { if( yyvsp[0].sym->type == UNDEF && pass2 ) warn("Symbol %s undefined",yyvsp[0].sym->name); yyval.value = yyvsp[0].sym->value; } break; case 144: #line 867 "parser.y" { yyval.value = yyvsp[0].value; } break; case 145: #line 870 "parser.y" { yyval.value = 0; } break; case 146: #line 871 "parser.y" { yyval.value = 1; } break; case 147: #line 872 "parser.y" { yyval.value = 2; } break; case 148: #line 873 "parser.y" { yyval.value = 3; } break; case 149: #line 874 "parser.y" { yyval.value = 4; } break; case 150: #line 875 "parser.y" { yyval.value = 5; } break; case 151: #line 876 "parser.y" { yyval.value = 6; } break; case 152: #line 877 "parser.y" { yyval.value = 7; } break; case 153: #line 880 "parser.y" { yyval.value = 0; } break; case 154: #line 881 "parser.y" { yyval.value = 1; } break; case 155: #line 883 "parser.y" { yyval.value = 0; warn("Illegal indirect register: @r2"); } break; case 156: #line 886 "parser.y" { yyval.value = 0; warn("Illegal indirect register: @r3"); } break; case 157: #line 889 "parser.y" { yyval.value = 0; warn("Illegal indirect register: @r4"); } break; case 158: #line 892 "parser.y" { yyval.value = 0; warn("Illegal indirect register: @r5"); } break; case 159: #line 895 "parser.y" { yyval.value = 0; warn("Illegal indirect register: @r6"); } break; case 160: #line 898 "parser.y" { yyval.value = 0; warn("Illegal indirect register: @r7"); } break; case 161: #line 903 "parser.y" { if( pass2 ) { if( !isbit8(yyvsp[0].val.v) ) warn("Expression greater than 8-bits"); } yyval.value = yyvsp[0].val.v; } break; case 162: #line 913 "parser.y" { if( pass2 ) { if( !isbit16(yyvsp[0].val.v) ) warn("Expression greater than 16-bits"); } yyval.value = yyvsp[0].val.v; } break; case 163: #line 923 "parser.y" { if( pass2 ) { if( !isbit16(yyvsp[0].val.v) ) warn("Address greater than 16-bits"); if( (yyvsp[0].val.v & size11) != ((lc+2) & size11) ) warn("Address outside current 2K page"); } set_md(yyval.mode,0); set_ov(yyval.mode, (yyvsp[0].val.v&0x0700)>>3 ); set_sz(yyval.mode,1); set_b1(yyval.mode,yyvsp[0].val.v&0x00ff); } break; case 164: #line 938 "parser.y" { if( pass2 ) { if( !isbit16(yyvsp[0].val.v) ) warn("Address greater than 16-bits"); } set_md(yyval.mode,0); set_ov(yyval.mode, 0 ); set_sz(yyval.mode,2); set_b1(yyval.mode, (yyvsp[0].val.v & 0xff00 ) >> 8 ); set_b2(yyval.mode, (yyvsp[0].val.v & 0x00ff ) ); } break; case 165: #line 952 "parser.y" { long offset=0; if( pass2 ) { offset = yyvsp[0].val.v - (lc+2); if( offset>127 || offset<-128 ) warn("Relative offset exceeds -128 / +127"); } set_md(yyval.mode,0); set_ov(yyval.mode,0); set_sz(yyval.mode,1); set_b1(yyval.mode,offset); } break; } /* Line 1010 of yacc.c. */ #line 2717 "y.tab.c" yyvsp -= yylen; yyssp -= yylen; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if YYERROR_VERBOSE yyn = yypact[yystate]; if (YYPACT_NINF < yyn && yyn < YYLAST) { YYSIZE_T yysize = 0; int yytype = YYTRANSLATE (yychar); const char* yyprefix; char *yymsg; int yyx; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 0; yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); yycount += 1; if (yycount == 5) { yysize = 0; break; } } yysize += (sizeof ("syntax error, unexpected ") + yystrlen (yytname[yytype])); yymsg = (char *) YYSTACK_ALLOC (yysize); if (yymsg != 0) { char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); yyp = yystpcpy (yyp, yytname[yytype]); if (yycount < 5) { yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { yyp = yystpcpy (yyp, yyprefix); yyp = yystpcpy (yyp, yytname[yyx]); yyprefix = " or "; } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else yyerror ("syntax error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ yyerror ("syntax error"); } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* If at end of input, pop the error token, then the rest of the stack, then return failure. */ if (yychar == YYEOF) for (;;) { YYPOPSTACK; if (yyssp == yyss) YYABORT; YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); yydestruct (yystos[*yyssp], yyvsp); } } else { YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); yydestruct (yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: #ifdef __GNUC__ /* Pacify GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) goto yyerrorlab; #endif yyvsp -= yylen; yyssp -= yylen; yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); yydestruct (yystos[yystate], yyvsp); YYPOPSTACK; yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*----------------------------------------------. | yyoverflowlab -- parser overflow comes here. | `----------------------------------------------*/ yyoverflowlab: yyerror ("parser stack overflow"); yyresult = 2; /* Fall through. */ #endif yyreturn: #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif return yyresult; } #line 967 "parser.y" /* ---------------------------------------------------------------------- */ void yyerror(const char *s) { warn("%s near \"%s\"", s, get_last_token()); } /* ---------------------------------------------------------------------- * makeop: * This function makes an opcode based on the instruction symbol table * entry, and an addressing mode structure. * This function is called from both passes, but * only generates code in pass 2. * * Resultant opcode bytes are passed to genbyte(). * * Returns the nuumber of bytes that the instruction * occupies. * */ int makeop(struct opcode * op, struct mode *m, int add) { register unsigned int newop; if( m == NULL ) { if(pass2) genbyte(op->bytes[0+add]); return(1); } if( pass2 ) { newop = op->bytes[ get_md(*m)+add ] | get_ov(*m); genbyte(newop); if( get_sz(*m) > 0 ) genbyte( get_b1(*m) ); if( get_sz(*m) > 1 ) genbyte( get_b2(*m) ); } return( get_sz(*m)+1 ); } /* ---------------------------------------------------------------------- * inclc: * Increments the Location Counter by 'i' amount. * Check to see if 'i' overflows 64K. * Checks to see if assembler is overlapping previous sections * of code. (using a large bit field). * */ #define indx(a) ( (a)/(sizeof(long)*8) ) #define bit(a) ( 1 << ((a)%(sizeof(long)*8)) ) #define getloc(a) (regions[indx(a)] & bit(a)) #define setloc(a) (regions[indx(a)] |= bit(a)) static unsigned long regions[ 0x10000/(sizeof(long)*8) ]; void inclc(int i) { while (i-- > 0) { if( pass2 && getloc(lc) ) error("Location counter overlaps"); if( pass2 ) setloc(lc); lc += 1; } if( lc > 0xffff ) error("Location counter has exceeded 16-bits"); } void clear_location_counter(void) { memset(regions, 0, sizeof(regions)); } /* ---------------------------------------------------------------------- * padline: * This routine returns a new string, which is equivilant to * 'line' except that all tabs have been expanded to spaces, and * the total length has been truncated to 60 chars. */ char *padline(char *line) { static char newline[61]; char *p1; int pos=0,nxtpos; for(p1=line; pos= 4 ) { j = 0; fprintf(listing,"\n "); } } while(++j <= 4) fprintf(listing," "); fprintf(listing," %s\n",padline(txt)); } /* ---------------------------------------------------------------------- * gen* routines: * Place information into the bytebuf[] array, and also * call emitbyte with the byte. * */ void genbyte(int b) { if( bytecount < sizeof(bytebuf) ) bytebuf[bytecount++] = b; emitbyte(b); } void genstr(const char *s) { while( *s ) genbyte(*s++); } void genword(unsigned long w) { genbyte( (w & 0xff00) >> 8 ); genbyte( (w & 0x00ff) ); } as31-2.3.1/as31/lexer.c0000644000175000001440000002060510307071452013541 0ustar erazorusers/* ---------------------------------------------------------------------- * FILE: lexer.c * PACKAGE: as31 - 8031/8051 Assembler. * * DESCRIPTION: * This file contains the lexical tokenizer for the assembler. * Since yacc is being used the lexer is called yylex(). * * In order to produce a listing, some record of the users * source line must be kept. This is done by adding * get_ch(), and unget_ch() routine which returns/ungets a character * but also places information into a secret array. * * When a newline is encountered the text line is returned as * an attribute on the '\n' character. * * REVISION HISTORY: * Jan. 19, 1990 - Created. (Ken Stauffer) * * AUTHOR: * All code in this file written by Ken Stauffer (University of Calgary). * January, 1990. * */ #include #include #include #include "as31.h" #include "parser.h" int lineno; int last_token_len=0; char last_token[256], prev_token[256]; static char line[100]; static char *lineptr=line; /* ---------------------------------------------------------------------- * get_ch: * Get a character from stdin, place char in line[] */ int get_ch(void) { register int c; c = getchar(); if (last_token_len >=0 && last_token_len < 254 && c != EOF && (last_token_len > 0 || !isspace(c))) { last_token[last_token_len++] = c; } if( c != EOF && lineptr - line < sizeof(line) ) *lineptr++ = c; return(c); } /* ---------------------------------------------------------------------- * unget_ch: * Unget a character and move lineptr back by one. */ void unget_ch(int c) { ungetc(c,stdin); if( lineptr > line ) lineptr--; } /* when there is a parse error, yyparse should call here to */ /* advance to the end of the current line, so we can continue */ /* parsing the rest of the file */ int seek_eol(void) { int c; last_token_len = -1; do { c = get_ch(); } while (c != '\n' && c != EOF); if (c == '\n') { unget_ch(c); return 1; } return 0; } /* return a pointer to the last successfully parsed token, so */ /* we can give a nicer error message when there is a syntax error */ const char *get_last_token(void) { /* if (last_token_len < 0) last_token_len = 0; last_token[last_token_len] = '\0'; */ return prev_token; } /* ---------------------------------------------------------------------- * yylex: * The tokens themselves are returned via return(token) * * Some tokens have attributes. These attributes are returned * by setting a global variable yylval: * * yylval.value * numbers (any base) * strings (in pass 1). * bit positions .0, .1, .2, ... * * yylval.str * strings (in pass 2). * '\n' (both passes). * * yylval.sym * User defined symbols. * * yylval.op * Reserved keyword (opcode/directive/misc.) * * No other fields in yylval are used by yylex(). * * Characters that do not have an attribute do * not set anything in the yylval variable. * */ int yylex(void) { static int nl_flag=0; /* sync. error messages and the cur. line */ register int c; char buf[1024]; /* temporary buffer */ char *p; /* general pointer */ struct symbol *sym; struct opcode *op; int octal=0,hex=0,decimal=0,binary=0; register long value = 0; if (last_token_len > 0) { last_token[last_token_len] = '\0'; strcpy(prev_token, last_token); } else { *prev_token = '\0'; } last_token_len=0; if( nl_flag ) { nl_flag = 0; lineno++; } for(;;) { c = get_ch(); switch(c) { case EOF: return(EOF); case ' ': case '\r': case '\t': break; case '\n': nl_flag = 1; yylval.str = line; *lineptr = '\0'; lineptr = line; return('\n'); case ';': while((c=get_ch()) != EOF && c!='\n'); nl_flag= 1; yylval.str = line; *lineptr = '\0'; lineptr = line; return(c); case '"': p = buf; while((c=get_ch()) != EOF && c!='"' && c!='\n') { if( c == '\\' ) { switch(c=get_ch()) { case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'b': c = '\b'; break; case '"': c = '"'; break; case '\\': c = '\\'; break; default: warn("Invalid escape character: \\%c",c); } } if( p-buf='0' && c<='7' ) { yylval.value = c-'0'; return(BITPOS); } unget_ch(c); return('.'); case '\'': c = get_ch(); if( c=='\\' ) { switch(c=get_ch()) { case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'b': c = '\b'; break; case '0': c = 0; break; case 'o': c = 0; break; case 'O': c = 0; break; case '\\': c = '\\'; break; case '\'': c = '\''; break; default: warn("Invalid escape character: \\%c",c); } } if( get_ch() != '\'' ) warn("Missing quote in character constant"); yylval.value = c; return(VALUE); case '0': /* parse a number */ case '1': /* could be followed by a: */ case '2': /* 'b','B' - Binary */ case '3': /* 'h','H' - Hex */ case '4': /* 'd','D' - Decimal */ case '5': /* 'o','O' - Octal */ case '6': /* *** Numbers must start with a digit */ case '7': /* Numbers could be also preceeded by: */ case '8': /* 0x - Hex */ case '9': /* 0b - binary */ p = buf; do { if( p-buf='a' && *p<='f' ) value += *p-'a'+ 10; else if( *p>='A' && *p<='F' ) value += *p-'A'+ 10; else warn("Invalid hex digit: %c",*p); } yylval.value = value; return(VALUE); } if (decimal) { if (hex) warn("ambiguous number, dec or hex"); if (binary) warn("ambiguous number, dec or bin"); if (octal) warn("ambiguous number, dec or oct"); for(p=buf; *p; p++ ) { if( isdigit(*p) ) value = value*10 + *p-'0'; else warn("Invalid decimal digit: %c",*p); } yylval.value = value; return(VALUE); } if (octal) { if (hex) warn("ambiguous number, oct or hex"); if (binary) warn("ambiguous number, oct or bin"); if (decimal) warn("ambiguous number, oct or dec"); for(p=buf; *p; p++ ) { if( *p>='0' && *p<='7' ) value = (value << 3) + (*p - '0'); else warn("Invalid octal digit: %c",*p); } yylval.value = value; return(VALUE); } default: if( isalpha(c) || c=='_' ) { p = buf; do { if( p-buftype); } sym = looksym(buf); yylval.sym = sym; return(SYMBOL); } else return(c); } /* switch */ } /* for */ } /* yylex */ as31-2.3.1/as31/emitter.c0000644000175000001440000003266010307071452014077 0ustar erazorusers/* ---------------------------------------------------------------------- * FILE: emitter.c * PACKAGE: as31 - 8031/8051 Assembler. * * DESCRIPTION: * This file contains the code to generate various * object code formats. Provisions exist to * support many types of output formats within the * same executable. * * REVISION HISTORY: * Jan. 19, 1990 - Created. (Ken Stauffer) * Jan. 29, 1990 - Added S-records (Theo Deraadt) * * * AUTHOR: * All code in this file written by Ken Stauffer (University of Calgary). * January, 1990. */ #include #include #include "as31.h" /* ---------------------------------------------------------------------- * DECLARE your own open(), close(), addr(), and byte() routines here. * */ static int open_tdr(const char *file, const char *ftype, const char *arg); static void close_tdr(void); static void addr_tdr(unsigned long a); static void byte_tdr(unsigned char b); static int open_byte(const char *file, const char *ftype, const char *arg); static void close_byte(void); static void addr_byte(unsigned long a); static void byte_byte(unsigned char b); static int open_od(const char *file, const char *ftype, const char *arg); static void close_od(void); static void addr_od(unsigned long a); static void byte_od(unsigned char b); static int open_srec(const char *file, const char *ftype, const char *arg); static void close_srec(void); static void addr_srec(unsigned long a); static void byte_srec(unsigned char b); static int open_hex(const char *file, const char *ftype, const char *arg); static void close_hex(void); static void addr_hex(unsigned long a); static void byte_hex(unsigned char b); static int open_bin(const char *file, const char *ftype, const char *arg); static void close_bin(void); static void addr_bin(unsigned long a); static void byte_bin(unsigned char b); /* ---------------------------------------------------------------------- * ADD an entry to this table to register your * output format routines. Give your object format * a name to be specified with the -F option. * */ static int format; static struct { char *name; char *extension; char *description; int (*e_open)(const char *file, const char *ftype, const char *arg); void (*e_close)(void); void (*e_addr)(unsigned long a); void (*e_byte)(unsigned char b); } formtab[] = { { "hex", "hex", "Intel-Hex (.hex)", open_hex, close_hex, addr_hex, byte_hex }, { "bin", "bin", "Binary (.bin)", open_bin, close_bin, addr_bin, byte_bin }, { "tdr", "tdr", "TDR Format (.tdr)", open_tdr, close_tdr, addr_tdr, byte_tdr }, { "byte", "byte", "BYTE list (.byte)", open_byte, close_byte, addr_byte, byte_byte }, { "od", "od", "Octal Dump (.od)", open_od, close_od, addr_od, byte_od }, { "srec2", "srec", "S Record, 16 bit Address (.srec)", open_srec, close_srec, addr_srec, byte_srec }, { "srec3", "srec", "S Record, 24 bit Address (.srec)", open_srec, close_srec, addr_srec, byte_srec }, { "srec4", "srec", "S Record, 32 bit Address (.srec)", open_srec, close_srec, addr_srec, byte_srec } }; #define FORMTABSIZE (sizeof(formtab)/sizeof(formtab[0])) void emitusage(void) { int i; fprintf(stderr, "["); for(i=0; i= 0 && num < FORMTABSIZE) return formtab[num].description; return NULL; } const char *emit_desc_to_name_lookup(const char *desc) { int i; if (desc) { for(i=0; i>8)&0xff) + (addr&0xff) ; for (i=0; i < pos; i++) { fprintf(fout,"%02X", bytes[i] & 0xFF ); sum += bytes[i]&0xff; } fprintf(fout, "%02X\n", (-sum)&0xff); addr += pos; pos = 0; } static int open_hex(const char *file, const char *ftype, const char *arg) { if (file == NULL) fout = stdout; else fout = fopen(file, "w"); if( fout == NULL ) { mesg_f("Cannot open %s for writing.\n", file); return -1; } pos = 0; return 0; } static void close_hex(void) { if (fout == NULL) return; if ( pos > 0 ) hexdump(); fprintf(fout, ":00000001FF\n"); /* end of file marker */ fclose(fout); } static void addr_hex(unsigned long a) { if ( pos > 0 ) hexdump(); addr = a; } static void byte_hex(unsigned char b) { bytes[pos] = b; pos += 1; if ( pos == 16) hexdump(); } /*----------------------------------------------------------------------- * "bin" format. Raw binary data */ static int open_bin(const char *file, const char *ftype, const char *arg) { if (file == NULL) fout = stdout; else fout = fopen(file, "w"); if( fout == NULL ) { mesg_f("Cannot open %s for writing.\n", file); return -1; } addr = 0; return 0; } static void close_bin(void) { if (fout == NULL) return; fclose(fout); } static void addr_bin(unsigned long a) { long i; if (fout == NULL) return; if (a > addr) { for (i=0; i < a - addr; i++) { fprintf(fout, "%c", 0); } addr = a; return; } if (a < addr) { error("address changed to %lX, from %lX", a, addr); error("binary output format can't write backwards"); addr = a; return; } } static void byte_bin(unsigned char b) { if (fout == NULL) return; fprintf(fout, "%c", b & 0xFF); addr++; } /* ---------------------------------------------------------------------- * "tdr" format. For tdr's 68008 system. Generates a * script file readable by a debugger. * [addr] : [byte] [byte] .. * * arg: This is a number in decimal which specifies * the offset, -Ftdr -A0000 * * These options specifies the tdr format, with an argument * of 0. This becomes the offset used in generating the * script file. The default if no A is present is 0x10000. * */ static int open_tdr(const char *file, const char *ftype, const char *arg) { if (file == NULL) fout = stdout; else fout = fopen(file,"w"); if( fout == NULL ) { mesg_f("Cannot open %s for writing.\n",file); return -1; } if (arg) { offset = atoi(arg); } else { offset = 0x10000; } return 0; } static void close_tdr(void) { if (fout == NULL) return; if( pos != 15 ) fprintf(fout,"\n"); fclose(fout); } static void addr_tdr(unsigned long a) { addr = a; newaddr = 1; } static void byte_tdr(unsigned char b) { if (fout == NULL) return; if( newaddr ) { if( pos != -666 ) fprintf(fout,"\n"); newaddr = 0; pos = 15; fprintf(fout,"%06lx: ", (addr + offset) & 0xFFFFFF); } else if( pos == 15 ) { fprintf(fout,"%06lx: ", (addr + offset) & 0xFFFFFF); } fprintf(fout,"%02x ", b & 0xFF ); if( pos-- == 0 ) { fprintf(fout, "\n"); pos = 15; } addr += 1; } /* ---------------------------------------------------------------------- * "byte" format. * Like "tdr" but each byte is on a line by itself. * This is nice for debugging. No -A is used. */ static int open_byte(const char *file, const char *ftype, const char *arg) { if (file == NULL) fout = stdout; else fout = fopen(file,"w"); if( fout == NULL ) { mesg_f("Cannot open %s for writing.\n", file); return -1; } return 0; } static void close_byte(void) { if (fout == NULL) return; fclose(fout); } static void addr_byte(unsigned long a) { addr = a; } static void byte_byte(unsigned char b) { if (fout == NULL) return; fprintf(fout,"%04lX: %02X\n", addr & 0xFFFF, b & 0xFF ); addr += 1; } /* ---------------------------------------------------------------------- * "od", this format shows 16 bytes per line, with address. * It also includes ascii on one side. * * The format is similar to the od(1) program under Unix. * */ static int od_pos; static unsigned char od_buf[16]; static unsigned long saveaddr; void dumpline(unsigned long a, unsigned char *b, int len) { int i; if (fout == NULL) return; if(len <= 0 ) return; fprintf(fout,"%04lx: ", a & 0xFFFF); for(i=0; i<8; i++ ) { if( i <= len ) fprintf(fout,"%02x ",b[i]); else fprintf(fout," "); } fprintf(fout,"- "); for(i=8; i<16; i++ ) { if( i <= len ) fprintf(fout,"%02x ",b[i]); else fprintf(fout," "); } fprintf(fout," "); for(i=0; i<16; i++ ) { if( i <= len ) fprintf(fout,"%c", (b[i]>=' ' && b[i]<='~') ? b[i] : '.' ); else break; } fprintf(fout,"\n"); } static int open_od(const char *file, const char *ftype, const char *arg) { if (file == NULL) fout = stdout; else fout = fopen(file,"w"); if( fout == NULL ) { mesg_f("Cannot open %s for writing.\n",file); return -1; } return 0; } static void close_od(void) { if (fout == NULL) return; dumpline(saveaddr, od_buf, od_pos-1); fclose(fout); } static void addr_od(unsigned long a) { newaddr = 1; addr = a; } static void byte_od(unsigned char b) { if( newaddr ) { dumpline(saveaddr, od_buf, od_pos-1); od_pos = 0; newaddr = 0; saveaddr = addr; } else if( od_pos == 16 ) { dumpline(saveaddr, od_buf, od_pos-1); od_pos = 0; saveaddr = addr; } od_buf[od_pos++] = b & 0x00ff; addr += 1; } /* ---------------------------------------------------------------------- * srecord format. This is called with "-Fsrec2", "-Fsrec3", or * "-Fsrec4"... * * arg: This is a number in decimal which specifies * the offset, -Fsrec3 -A0000 * * These options specifies the tdr format, with an argument * of 0. This becomes the offset used in generating the * script file. The default if no A is present is 0x0000. * */ #define SREC_BYTESPERLINE 32 static int srec_format; static int srec_check, srec_index; static char srec_buf[SREC_BYTESPERLINE]; static long srec_address; void srec_finishline(void) { int i; if (fout == NULL) return; srec_check = srec_index + (srec_address & 0xff) + ((srec_address>>8) & 0xff) + 4; switch(srec_format) { case 2: fprintf(fout, "S1%02X%04lX", srec_index + 4, srec_address & 0xFFFF); break; case 3: fprintf(fout, "S2%02X%06lX", srec_index + 6, srec_address & 0xFFFFFF); srec_check += ((srec_address>>16) & 0xff) + 2; break; case 4: fprintf(fout, "S3%02X%08lX", srec_index + 8, srec_address); srec_check += ((srec_address>>16) & 0xff) + ((srec_address>>24) & 0xff) + 4; break; } for(i=0; i 4) { mesg_f("Illegal S Record format %d %s (must be 2, 3, or 4)\n", srec_format, ftype); return -1; } if (file == NULL) fout = stdout; else fout = fopen(file,"w"); if( fout == NULL ) { mesg_f("Cannot open %s for writing.\n",file); return -1; } if(arg) offset = atoi(arg); else offset = 0; fprintf(fout, "S0030000%02X\n", (~3 & 0xff) ); return 0; } static void close_srec(void) { if (fout == NULL) return; if(srec_index) srec_finishline(); switch(srec_format) { case 2: fprintf(fout, "S9030000%02X\n", ~3 & 0xff); break; case 3: fprintf(fout, "S804000000%02X\n", ~4 & 0xff); break; case 4: fprintf(fout, "S70500000000%02X\n", ~5 & 0xff); break; } fclose(fout); } static void addr_srec(unsigned long a) { if(srec_index>0) srec_finishline(); srec_address = a + offset; } static void byte_srec(unsigned char b) { srec_buf[srec_index++] = b; if(srec_index==SREC_BYTESPERLINE) { srec_finishline(); srec_address += SREC_BYTESPERLINE; } } as31-2.3.1/as31/as31_gtk.c0000644000175000001440000001367410307071452014046 0ustar erazorusers/* ---------------------------------------------------------------------- * FILE: main.c * PACKAGE: as31 - 8031/8051 Assembler. * * DESCRIPTION: * The file contains main(). It handles the arguments and makes * sure that pass 1 is done before pass 2 etc... * * REVISION HISTORY: * Jan. 19, 1990 - Created. (Ken Stauffer) * * AUTHOR: * All code in this file written by Ken Stauffer (University of Calgary). * January, 1990. "Written by: Ken Stauffer" * * April, 2000, Paul Stoffregen: see Makefile for details */ #include #include #include #include #include #include #include "as31.h" void do_assemble(GtkWidget *widget, gpointer *data); gint delete_handler(GtkWidget *widget, gpointer *data); /* make all the GTK widgets global, instead of passing lots */ /* of pointers into the callbacks, through the parser, etc */ GtkWidget *file_label, *file_entry, *otype_combo; GtkWidget *list_check, *go_button; GtkWidget *otype_label, *output_text; GtkWidget *main_window, *main_vbox; GtkWidget *top_hbox, *middle_hbox, *bottom_hbox; int main(int argc, char **argv) { GList *otypelist; const char *desc; int n; gtk_init(&argc, &argv); /* create all the gtk widgets... it's a pain to type in all */ /* this stuff, maybe someday I'll have to learn about glade */ file_label = gtk_label_new("ASM File: "); gtk_label_set_justify(GTK_LABEL(file_label), GTK_JUSTIFY_RIGHT); gtk_widget_show(file_label); otype_label = gtk_label_new("Output Format"); gtk_label_set_justify(GTK_LABEL(otype_label), GTK_JUSTIFY_RIGHT); gtk_widget_show(otype_label); file_entry = gtk_entry_new(); /* fill in a default filename, from a previous session ??? */ gtk_widget_show(file_entry); list_check = gtk_check_button_new_with_label("Create List File"); /* check or unchecked based on previous usage */ gtk_widget_show(list_check); otype_combo = gtk_combo_new(); otypelist = NULL; n = 0; while ((desc = emit_desc_lookup(n++)) != NULL) { otypelist = g_list_append(otypelist, strdup(desc)); } gtk_combo_set_popdown_strings(GTK_COMBO(otype_combo), otypelist); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(otype_combo)->entry), FALSE); /* set to same output format as a previous run ?? */ gtk_widget_show(otype_combo); go_button = gtk_button_new_with_label("Assemble"); gtk_widget_show(go_button); output_text = gtk_text_new(NULL, NULL); gtk_text_set_editable(GTK_TEXT(output_text), FALSE); gtk_widget_show(output_text); top_hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(top_hbox), file_label, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(top_hbox), file_entry, TRUE, TRUE, 2); gtk_widget_show(top_hbox); middle_hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(middle_hbox), otype_label, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(middle_hbox), otype_combo, FALSE, FALSE, 2); gtk_widget_show(middle_hbox); bottom_hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(bottom_hbox), go_button, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(bottom_hbox), list_check, FALSE, FALSE, 2); gtk_widget_show(bottom_hbox); main_vbox = gtk_vbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(main_vbox), top_hbox, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(main_vbox), middle_hbox, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(main_vbox), bottom_hbox, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(main_vbox), output_text, TRUE, TRUE, 2); gtk_widget_show(main_vbox); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_add(GTK_CONTAINER(main_window), main_vbox); gtk_widget_show(main_window); /* attach signal handlers so we can actually do something */ gtk_signal_connect(GTK_OBJECT(main_window), "delete_event", GTK_SIGNAL_FUNC(delete_handler), NULL); gtk_signal_connect(GTK_OBJECT(go_button), "pressed", GTK_SIGNAL_FUNC(do_assemble), NULL); /* that's it, everything past here is a callback from GTK */ mesg("WARNING: this is an alpha-quality release.\n"); mesg("It WILL crash the second time you assemble !!\n"); mesg("Please report any problems that occur on the\n"); mesg("first assembly to: paul@pjrc.com\n"); gtk_main(); return 0; } /* actually do the assembly. The entire assembly is done from */ /* start to finish in this callback attached to the "assemble now" */ /* button. It's not so nice to spend a lot of CPU time in a */ /* callback, because all the gtk widgets stop responding until */ /* we're done, but it keeps things simple, and at least the */ /* window manager takes care of raise/lower and reposition, */ /* ...unlike ms windoze where those are handled by the */ /* application's event loop. It would be "nice" to launch a */ /* thread that would do the assembly, but for a simple free */ /* software project (where the assembly completes rapidly on */ /* any modern cpu), I don't want to bother with all the unpleasant */ /* threading issues */ void do_assemble(GtkWidget *widget, gpointer *data) { const char *fmt=NULL, *filename; int r, do_lst; /* collect info from the GTK widgets */ do_lst = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list_check)); filename = gtk_entry_get_text(GTK_ENTRY(file_entry)); if (filename == NULL || *filename == '\0') { mesg("You need to specify the ASM file\n"); return; } fmt = emit_desc_to_name_lookup(gtk_entry_get_text( GTK_ENTRY(GTK_COMBO(otype_combo)->entry))); if (fmt == NULL) { mesg("Please select a valid output type\n"); return; } /* now we can begin working like normal */ r = run_as31(filename, do_lst, 0, fmt, NULL, NULL); if (r == 0) { mesg("Assembly complete, no errors :)\n"); } } /* quit the program if they close it */ gint delete_handler(GtkWidget *widget, gpointer *data) { gtk_main_quit(); return FALSE; } /* the assembler calls here to display any messages */ void mesg(const char *str) { if (str == NULL) str = "(null)"; /* printf("%s", str); */ gtk_text_insert(GTK_TEXT(output_text), NULL, NULL, NULL, str, strlen(str)); } as31-2.3.1/as31/as31.h0000644000175000001440000001151510307071452013176 0ustar erazorusers/* ---------------------------------------------------------------------- * FILE: as31.h * PACKAGE: as31 - 8031/8051 Assembler. * * DESCRIPTION: * The sole header file for the 8031/8051 assembler package. * It defines several structures used by the yacc stack. * It defines several macros for testing the bitsize of numeric * quantities. * * Some macros to extract information from the mode structure. * * REVISION HISTORY: * Jan. 19, 1990 - Created. (Ken Stauffer) * * AUTHOR: * All code in this file written by Ken Stauffer (University of Calgary). * January, 1990. * */ #include #include // include directive #define INC_CMD ".inc" /* ---------------------------------------------------------------------- * user / keyword symbol structures: */ struct opcode { char *name; int type; unsigned char *bytes; }; struct symbol { char *name; char predefined; char type; long value; struct symbol *next; }; #define UNDEF 0 #define LABEL 1 /* these are unused... maybe someday the can be used and the */ /* parser can check that each addressing mode is using the */ /* correct type of data, or a generic LABEL type */ #define BIT 2 #define IMEM 3 #define EMEM 3 #define CONST 4 #define REG 5 /* ---------------------------------------------------------------------- * addressing mode stuff: */ struct mode { unsigned char mode; /* value to index with */ unsigned char size; /* # of bytes used */ unsigned char orval; /* value OR'd to obcode */ unsigned char byte1; /* extra byte 1 */ unsigned char byte2; /* extra byte 2 */ }; #define set_md(m,a) ((m).mode=(a)) #define set_sz(m,a) ((m).size=(a)) #define set_ov(m,a) ((m).orval=(a)) #define set_b1(m,a) ((m).byte1=(a)) #define set_b2(m,a) ((m).byte2=(a)) #define get_md(m) ((m).mode) #define get_sz(m) ((m).size) #define get_ov(m) ((m).orval) #define get_b1(m) ((m).byte1) #define get_b2(m) ((m).byte2) /* ---------------------------------------------------------------------- * yacc stack stuff: */ struct value { long v; unsigned char d; /* expression defined flag */ }; union ystack { long value; struct value val; struct opcode *op; struct symbol *sym; struct mode mode; char *str; }; #define YYSTYPE union ystack /* ---------------------------------------------------------------------- * IS_BIT_MAPPED_RAM: * True is the byte 'a' is the byte address of a bit mapped * RAM location. */ #define isbmram(a) (((a)&0xf0)==0x20) /* ---------------------------------------------------------------------- * IS_BIT_MAPPED_SFR: * True is the byte 'a' is the byte address of a bit mapped * SPECIAL FUCTION REGISTER. */ #define isbmsfr(a) (((a)&0x80) && !((a) & 0x07)) /* ---------------------------------------------------------------------- * isbit8, ... * Macros to check the sizes of values and to convert * a value to a certain, size. * */ #define size8 (~0x00ff) #define size11 (~0x07ff) #define size13 (~0x1fff) #define size16 (~0xffff) #define size10 (~0x03ff) #define size12 (~0x0fff) #define size15 (~0x7fff) #define isbit8(v) ( !( ((v)>=0) ? (v)&size8 : -(v)>=128) ) #define isbit11(v) ( !( ((v)>=0) ? (v)&size11 : (-(v))&size10 ) ) #define isbit13(v) ( !( ((v)>=0) ? (v)&size13 : (-(v))&size12 ) ) #define isbit16(v) ( !( ((v)>=0) ? (v)&size16 : (-(v))&size15 ) ) /* ---------------------------------------------------------------------- * Size of user hash table. Use a prime number for best performance */ #define HASHTABSIZE 4999 /* ---------------------------------------------------------------------- * Macros to nicely test which pass we are in. */ #define pass1 (!pass) #define pass2 (pass) /* from lexer.c */ extern int yylex(void); extern int seek_eol(void); extern const char *get_last_token(void); extern int lineno; /* from parser.y */ extern int yyparse(void); extern void clear_location_counter(void); /* from emitter.c */ extern void emitusage(void); extern const char *emit_extension(const char *ftype); extern const char *emit_desc_lookup(int num); extern const char *emit_desc_to_name_lookup(const char *desc); extern int emitopen(const char *file, const char *ftype, const char *arg); extern void emitclose(void); extern void emitaddr(unsigned long a); extern void emitbyte(int b); /* from symbol.c */ extern struct opcode *lookop(const char *s); extern struct symbol *looksym(const char *s); extern void syminit(void); extern void freesym(void); /* from run.c */ extern int run_as31(const char *infile, int lst, int use_stdout, const char *fmt, const char *arg, const char *customoutfile); extern void error(const char *fmt, ...); extern void warn(const char *fmt, ...); extern void mesg_f(const char *fmt, ...); extern int dashl; extern int pass; extern int abort_asap; extern unsigned long lc; extern FILE *listing; /* from as31.c or as31_gtk.c */ extern void mesg(const char *str); extern void showhelp(const char *cmd); as31-2.3.1/as31/as31.c0000644000175000001440000000527510307071452013177 0ustar erazorusers/* ---------------------------------------------------------------------- * FILE: as31.c * PACKAGE: as31 - 8031/8051 Assembler. * * DESCRIPTION: * The file contains main(). It handles the arguments and makes * sure that pass 1 is done before pass 2 etc... * * REVISION HISTORY: * Jan. 19, 1990 - Created. (Ken Stauffer) * March, 2001, Paul Stoffregen: see ChangeLog for details * July, 2003, Bernd Porr: added ".inc" to include asm files. * March, 23, 2004, Alexander 'E-Razor' Krause: see ChangeLog for details * May, 6, 2004, Alexander 'E-Razor' Krause: see ChangeLog for details * May, 18, 2004, Martin Langer: see ChangeLog for details * * AUTHOR: * All code in this file written by Ken Stauffer (University of Calgary). * January, 1990. "Written by: Ken Stauffer" */ #include #include #include #include "as31.h" int main(int argc, char **argv) { char *dashF=NULL, *dashA=NULL, *dashO=NULL; int use_stdout=0, do_lst=0; int r, i; if (argc < 2) { showhelp(argv[0]); exit(1); } for (i=1; i .br Martin Langer as31-2.3.1/as31/Makefile.am0000644000175000001440000000072610307071452014314 0ustar erazorusers# Makefile for as31 INCLUDES = $(GUI_CFLAGS) $(CFLAGS) if OPTION_GTK AS31GTK_BIN = as31gtk else AS31GTK_BIN = endif bin_PROGRAMS = \ as31 \ $(AS31GTK_BIN) as31_SOURCES = \ as31.h \ run.c \ lexer.c \ parser.y \ parser.h \ symbol.c \ emitter.c \ as31.c as31gtk_SOURCES = \ as31.h \ run.c \ lexer.c \ parser.y \ parser.h \ symbol.c \ emitter.c \ as31_gtk.c as31gtk_LDADD = $(GUI_LIBS) man_MANS = as31.1 EXTRA_DIST = as31.1 CLEANFILES = as31gtk as31-2.3.1/examples/0000755000175000001440000000000010307073600013317 5ustar erazorusersas31-2.3.1/examples/paulmon2.ref0000644000175000001440000002551010307071452015560 0ustar erazorusers:030000000208A44F :080003000220038E828F83228C :08000B0002200BAE82AF83223C :08001300022013742D0173009B :08001B0002201B1173017100AA :080023000220231116017100F7 :03002B0002202B85 :10002E00217601730167216521872194018A01CE12 :10003E0021CE21A802093A020B59017D0201BB0211 :10004E000AA2020AA8020AE602086502082B0207A3 :10005E00B602078C020A21214A3098FDC298E59912 :10006E0022117174203099FDC299F59922117DC02B :10007E00E0740D1173740A1173D0E022C2D51162AF :10008E0031A8B41B03D3E422B40D05D2D5C3E422A8 :10009E00FA314A40E9CA1173116231A8B41B0280C9 :1000AE00E4B40D03EAC322B40804117380D0B4156E :1000BE000280F7FB314A40E0CB1173EAC44BC322F6 :1000CE007A007B007C04C2D5116231A8B41B07D321 :1000DE00E4F583F58222B408028003B47F0CBC04DD :1000EE000280E5117331390C80DEB40D108B838ADA :1000FE0082BC0407E4F583F582D2D5C322FD314AD2 :10010E0040C6CD120073EDC0E03128D0E02AFAE4EB :10011E003BFBDCB4C38A828B8322EBC454F0FBEA34 :10012E00C4540F4BFBEAC454F0FA22EAC4540FFA3B :10013E00EBC454F04AFAEBC4540FFB22C324D05044 :10014E001424F64004240AC32224F9500824FA4049 :10015E00042410C322D322C0E0C4540F24F650024C :10016E002407243A1173D0E0C0E0540F24F6500255 :10017E002407243A1173D0E022C0E0E5833165E50F :10018E00823165D0E022C0E0E493A3600AA2E75476 :10019E007F1173400280F1D0E022C0E0C394614031 :1001AE0009941A5005D0E024E022D0E0227800C055 :1001BE00E0E4936008A2E7084003A380F4D0E022B5 :1001CE00C0E0C3309808E599B41B01D3C298D0E0C3 :1001DE0022900DF51145EF3165EE316531941162C6 :1001EE0031A875F0DFC0F075F001C0F0F5F0901099 :1001FE0000F18C5024758204E493B4FE150582E45C :10020E0093B5F00E11717582203194117D75824077 :10021E00E4730583E583B400D8E5F0B43F07900F8F :10022E005D1145A1D0B44D07900F65114581C0B445 :10023E005207900F6A1145A137B44407900F6E1103 :10024E004541A8B45507900F711145C145B44E07ED :10025E00900F741145E137B44A07900F781145811C :10026E0012B44807900F7E11458149B44507900F8F :10027E008A1145818AB44307900F8F1145E113B45B :10028E005A0B74006012900F931145E147B4490860 :10029E00900F84114502076D017D900E8F114578E8 :1002AE00107A10760008DAFB1167B41B028072B464 :1002BE003A0679007141800A314A40EC7906714163 :1002CE0080E6742E11737C007160F87160F5837195 :1002DE0060F5827160B40102802D7022E8601471A5 :1002EE0060FA79017141EA120865E43402F971414C :1002FE00A3D8E97160EC60B07904714180AAE8601E :10030E00F27160D8FC80ECE860047160D8F3716023 :10031E00EC70E57138900EAE114530987A11678009 :10032E00767138900EA61145806D78007900D9FE51 :10033E00D8FA22E95407232410F907E770020907B7 :10034E0022D3878209878309E5827005E5837001D0 :10035E00C322116731A8B41B06D0E0D0E080C2B42E :10036E003A0A79057141D0E0D0E041D0314A5006C9 :10037E007907714180DCFA116731A8B41B0280D96C :10038E00B43A0280DD314A50067907714180E8CADD :10039E00C44AFA2CFCEA22EEC0E0EFC0E0900EB5A3 :1003AE00114579107EBE7F0E910E7EC47F0E910E8A :1003BE007EC97F0E910E7A05714F4009DAFA900FC1 :1003CE000511458025900ED4114579167ED87F0EE5 :1003DE0091007EE97F0E91007EF17F0E91007EF7F7 :1003EE007F0E91007EFC7F0E9100D0E0FFD0E0FEEC :1003FE00017D714F50091171120AE6110611452245 :10040E00714F80F2900E37114511063187900E050F :10041E00114511CE20D5065002E10E110E117D9020 :10042E000F1311451106E4F5D0F5F0F8F9FAFBFCBF :10043E00FDFEFF758108C0E0C0E0737A10117B11DC :10044E00063187743A111E7B101106E493A33165B1 :10045E001171DBF7116F7B101106E493A3547FB477 :10046E007F01E424E04001E424201173DBEC117DD4 :10047E00D1CA110E31CE4002DAC5017D900E79112E :10048E004511063187743A111E74281173110EE44A :10049E00933165900E521145118A20D510400E11E0 :1004AE0006120865117D1106A3110E8191900E841E :1004BE000145900E41114578151171D8FC11457505 :1004CE008310F18C4002017D116F7582203194757D :1004DE00822031BB7421C398F874201173D8FC7537 :1004EE0082003187780674201173D8FC758204E47B :1004FE0093AA83B4FE05900F4B8018B4FD05900FA0 :10050E00528010B42305900F4F8008B4F90280EE8C :10051E00900F5911458A83117D74FFB5830281D4E2 :10052E000583E583B4009B81D4117B7AFF90100084 :10053E0015830583E583B400028021F18C501D756F :10054E008204E4934403F460E9116F0A74412A11A2 :10055E001E11267582203194117DA140BAFF05909F :10056E000E0E0145900E0011457441117311167453 :10057E00412A1173900E0511451162B41B02017DC3 :10058E00FB741FC39AEB400231A81173FB117DEB74 :10059E00C3944140CFFBEAC39B40C90B901000159A :1005AE00830583E583B400028017F18C50137582A6 :1005BE0004E4934403F460E9DBE7117D7582408126 :1005CE003422900F3311457C3F900F60D13A7C4D11 :1005DE00D13A7C52D13A7C44D13A7C55D13A7C4EB8 :1005EE00D13A7C4AD13A7C48D13A7C49D13A7C45C1 :1005FE00D13A7C43D13A740060047C5AD13A900FC0 :10060E00411145901000F18C5020758204E493B492 :10061E00FE11116F0582E49311731126758220313C :10062E0094117D0583E583B400DC017D116FEC111F :10063E007311261145017DD1DC900F1D1145EB3153 :10064E0065EA31651145ED3165EC3165117D8D83BE :10065E008C82A3AC82AD83900E2D11451167B41B15 :10066E0002E10C117D8A828B83ECC39582FAED95A3 :10067E00837009EA603254F0700280027A10743A84 :10068E001173EA31653187E58325822AFBE43165F2 :10069E00E49331652BFBA3DAF7EBF4043165117D9E :1006AE00D1CA31CE50C38056743A1173E4316531DC :1006BE0065316504316574FF3165017BE8C0E07812 :1006CE000CE58C04000070FBD8F7D0E0F822117B0B :1006DE00900E5B114511CE402120D51EC083C082E5 :1006EE00117D900E65114511CEAD83AC82D0E0FA2E :1006FE00D0E0FB400520D502017DD0E0D0E0117D99 :10070E00900DED0145D1DC900E6F1145116231A8AF :10071E00B459EB117B8B838A82E4120865EDB583A5 :10072E0005ECB5820122A380F0900E24114511CE66 :10073E0040CE20D5CB110E017B117B900F9311452E :10074E00742C111E900E6F1145116231A8B459AE62 :10075E00117B1207B6900F985003900F9F01451111 :10076E007D7800117DB88002017DE83165743A1103 :10077E00731171E6316508E8540F70F580E57582E6 :10078E0000E493B4A517A3E493B4E511A3E493B4E2 :10079E00E00BA3E493B4A505758200D32274FFB5D4 :1007AE008302C322058380D674006038908000E4F3 :1007BE0093F4700DA37400B582F57400B583F0C385 :1007CE0022908000E4936006E412082B4016A37476 :1007DE0000B582F07400B583EB9080007CE87D0458 :1007EE00DC04DD02D3227420A2AF92D1C2AFF0F0AE :1007FE007B147AE5DAFEDBFA74A0F07A05DAFEE411 :10080E0093A2D192AFF470D8A37400B583EA7400AA :10081E00B582E574FF908000F0E4F0C322F5F0EAB3 :10082E00C0E0EBC0E07A197440A2AF92D1C2AFF033 :10083E00E5F0F07B13DBFE74C0F07B05DBFEE4938A :10084E00A2D192AFC395F06003DADCD3E4F0D0E02E :10085E00FBD0E0FAE5F022C0E0C0F0F5F0740060E5 :10086E001BE583B4FF02800B5012B480028004504B :10087E00028009E5F0112BD0F0D0E022E5F0F0E493 :10088E0093C395F06009E0C395F06003D38001C374 :10089E00D0F0D0E02232E4F5A8F5B875D00011A35F :1008AE0011A3F4F580F590F5A0F5B075813079C8F7 :1008BE007AF9DAFED9FA740060137400600F78FAD0 :1008CE00A20079C8D9FE4005D8F61207B675F0F920 :1008DE00310D313A75F0FD310D781812007DD8FBCF :1008EE00780F7420120073D8FB900DBB120B599029 :1008FE000DCF120B591204C07E007F200201DF9033 :10090E00100012078C5024758204E493B5F015C0C4 :10091E00F0C083742EC0E07409C0E0758240E473A9 :10092E00D083D0F00583E583B400D7227400701411 :10093E00E57B637A556379CC63781DB57A08B57912 :10094E0005B578024100758780759842758911E466 :10095E00F588F58AF58CF58BF58D78C8791E30B053 :10096E00E5D9FBD8F720B0FD20B0FA20B0F720B0C3 :10097E00F420B0F130B0FDD28E208FCA20B0FA2014 :10098E008FC430B0FA208FBE20B0FAD28C208FB632 :10099E0030B0FAC28EC28C208FACE58B33F5F0E509 :1009AE008D3340A2A2F73400F404609AF58D758B56 :1009BE00FF758921D29CD28EE58DF404F978FFD88B :1009CE00FED9FA309811C298E599547F24F6600743 :1009DE0024056003020954E58A33F8E58C33F940A7 :1009EE00F3E833F5F0E933A2F7340060E7F404B529 :1009FE008DE2F57BF57AF579F578637A556379CCE6 :100A0E0063781DF58DF58B758921758780759852E4 :100A1E00D28E22309806120067B41B51120067B4B2 :100A2E001B4B518F209803741B22120067B45B443A :100A3E00518F3098DE120067B44103740B22B4421A :100A4E0003740A22B44303741522B44403740822B7 :100A5E00B435028007B4360280028018C0E0518F90 :100A6E0030980B120067B47E09D0E024E422D0E067 :100A7E0080A1D0E0518F30989A120067B41BF58098 :100A8E00A1EAC0E07A14E58C2098050470FADAF633 :100A9E00D0E0FA22C0F0C0E08013C0F0C0E030E732 :100AAE000C742D120073D0E0C0E0F4240175F064D4 :100ABE0084D2D56007C2D52430120073E5F075F0EC :100ACE000A8430D50260052430120073E5F024301C :100ADE00120073D0E0D0F022C0E0E8C0E0C2D5AA88 :100AEE0082AB837C107D2771446007243012007323 :100AFE00D2D57CE87D037144700330D507243012C3 :100B0E000073D2D57C647D007144700330D5072408 :100B1E0030120073D2D5EAABF075F00A8470033050 :100B2E00D5052430120073E5F08BF02430120073DB :100B3E00D0E0F8D0E022780008C3EA9CFAEB9DFBE7 :100B4E0050F618EA2CFAEB3DFBE822C0E0E8C0E0D4 :100B5E00E9C0E0ECC0E0D2D1D2D5E493A360252069 :100B6E00E72E547FB40D0712007DD2D180ECB41F56 :100B7E0004C2D580E5B40E0512007D8007C2D112E5 :100B8E00007380D6D0E0FCD0E0F9D0E0F8D0E022BF :100B9E00547FF820D103120071C2D1C082C083905D :100BAE000C137C00E86007F9910270FCD9FA9102EF :100BBE00603CB40F1291020483801E6866776779D9 :100BCE006278766B716A7A0483800E657461726ED8 :100BDE0069736F6C756D706463A2D592E5D2D5B8EA :100BEE001402C2E5B80C02C2E512007380C0D083B5 :100BFE00D0826168E493BC00057CFF540F227C0018 :100C0E00A3C4540F228290E82386054CF844B3B057 :100C1E00B1485FF0117FA0157F1C2ED1405A50F1C4 :100C2E0003BFBA0C2F96018D3F95380D6F5F1207DB :100C3E00710E562F483B6258201F7670322440B8F2 :100C4E0040E1618F01340BCA89D3C0A3B958800427 :100C5E00F80285602591F092731F107F1254931045 :100C6E00444807D126564FD0F66472E0B83BD5F013 :100C7E00164F56306F48025FA8201F017630D560A0 :100C8E002541A42C60056F013F261F30078E1DF0F5 :100C9E006399F042B8201F2330027AD1602FF0F60C :100CAE00058F931A5028F082046FA30D3F1F5140F9 :100CBE0023013E0543017A01176493302A088C24E0 :100CCE003099B0F31960254135098ECB19123005D4 :100CDE001F311D04144F761204AB279056012FA816 :100CEE00D5F0AA26205F1CF0F361FE0141730127A7 :100CFE00C1C0848FD6018770564F19701FA8D99026 :100D0E0076021743FE01C1840B157F028B14308FC0 :100D1E0063396F19F011C9106D023F91097A41D0F4 :100D2E00BA0C1D395F07F2111720416B3509F775A3 :100D3E00120BA7CC48023F6412A00C27E39FC014ED :100D4E00777011407121C0682541F0627FD1D021AA :100D5E00E16258B0F3051F733077B16F19E0194394 :100D6E00E0582FF6A414D02303FE31F5143099F871 :100D7E00033F6422516025412FE30156279309FE5C :100D8E0011FE79BA607542EA6258A0E51F534FD141 :100D9E00C0A3094253F71204621B30F505F7690C24 :100DAE00351B70822F2F144F51C064250057656C70 :100DBE00636F6D658094322C2062791FF81FFE0DD3 :100DCE000E202053656594322E444F432C94322EC0 :100DDE00455155A494322E484452B4D58D2E0E2032 :100DEE001F9E1FA0210D0E9432204C6F633A0020DF :100DFE003EA086CA822800292C958C80C83A2000F5 :100E0E001F9782C373C7A6832CBA204A554D5080B4 :100E1E0086A172820D0E0D0D1F8783813A20001F51 :100E2E00E4FB206B65793A20000D0D1F88808381CD :100E3E002028000D0D1F821FFD001F812020202065 :100E4E00201FC90E29201F871FB23A200046697243 :100E5E0073741F813A20004C6173741F813A2020F5 :100E6E00001FB9A120737572653F000D0D1F9C9A6E :100E7E00922C8C80C80E20201F9CC12C8E81F70DC9 :100E8E000E0D0D1F9F206173636969F9961F98847B :100E9E00892C958C80A00D0E0D1F8AA065640D0EF9 :100EAE000D1F8AC1640D0E53756D6D6172793A0E08 :100EBE0020C67391640E208B91640E208B20777266 :100ECE00697474656E0E1F9B3A0E208B20756E61D1 :100EDE00626C65802077726974650E202062616491 :100EEE00F5730E20859F96C60E2085849D0E208557 :100EFE00206E6F6E849D0E1F979B206465746563D4 :100F0E007465640D0E0D866E696E67823A0D0E0D58 :100F1E000D53656E64696E671F988489AC2020003E :100F2E0020802020000D0D5374616E646172641F69 :100F3E009E730E1FDA1FF465641F9E730E1F9A9E1A :100F4E00001F82001F8F1FE21FAA003F3F3F001F9E :100F5E00D7001F8ED7D1001FD18273001F8682004B :100F6E001F8A001F93001F8781001F8880838100C6 :100F7E001F84DB9A83001F84DBC083001F9C9A9220 :100F8E00001FED83001FCB9990001F9990CB640D2D :060F9E000E1F859B0D0EE5 :00000001FF as31-2.3.1/examples/paulmon2.asm0000644000175000001440000016713410307071452015575 0ustar erazorusers; PAULMON2, a user-friendly 8051 monitor, by Paul Stoffregen ; Please email comments, suggestions, bugs to paul@pjrc.com ; It's free. PAULMON2 is in the public domain. You may copy ; sections of code from PAULMON2 into your own programs, even ; for commercial purposes. PAULMON2 should only be distributed ; free of charge, but may be bundled as 'value-added' with other ; products, such as development boards, CDROMs, etc. Please ; distribute the PAULMON2.DOC file and other files, not just ; the object code! ; The PAULMON2.EQU and PAULMON2.HDR files contain valuable ; information that could help you to write programs for use ; with PAULMON2. ; PAULMON2 is in the public domain. PAULMON2 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. ; You are probably reading this code to see what it looks like ; and possibly learn something, or to modify it for some reason. ; Either is ok, but please remember that this code uses a number ; of tricks to cram all the functionality into just 4k. As a ; result, the code can be difficult to read, and adding new ; features can be very difficult without growing beyond 4k. To ; add or modify commands in PAULMON2, please consider using the ; "external command" functionality. It is easier to develop ; new commands this way, and you can distribute them to other ; users. Email paul@pjrc.com if you have new PAULMON2 ; commands to contribute to others. Details about adding new ; commands to PAULMON2 (with examples) can be found at: ; http://www.pjrc.com/tech/8051/pm2_docs/addons.html ;---------------------------------------------------------; ; ; ; PAULMON2's default configuration ; ; ; ;---------------------------------------------------------; ; PAULMON2 should be assembled using the modified AS31 assembler, ; originally written by Ken Stauffer, many small changes by Paul ; Stoffregen. This free assembler is available on the web at ; http://www.pjrc.com/tech/8051/index.html ; As well, these web pages have a fill-out form which makes it ; very easy to custom configure PAULMON2. Using this form will ; edit the code for you, run the AS31 assmebler, and send you the ; object code to program into your chip. ; These two parameters control where PAULMON2 will be assembled, ; and where it will attempt to LJMP at the interrupt vector locations. .equ base, 0x0000 ;location for PAULMON2 .equ vector, 0x2000 ;location to LJMP interrupt vectors ; These three parameters tell PAULMON2 where the user's memory is ; installed. "bmem" and "emem" define the space that will be searched ; for program headers, user installed commands, start-up programs, etc. ; "bmem" and "emem" should be use so they exclude memory areas where ; perphreal devices may be mapped, as reading memory from an io chip ; may reconfigure it unexpectedly. If flash rom is used, "bmem" and "emem" ; should also include the space where the flash rom is mapped. .equ pgm, 0x2000 ;default location for the user program .equ bmem, 0x1000 ;where is the beginning of memory .equ emem, 0xFFFF ;end of the memory ; Flash ROM parameters. If "has_flash" is set to zero, all flash rom ; features are turned off, otherwise "bflash" and "eflash" should specify ; the memory range which is flash rom. Though AMD doesn't suggest it, ; you may be able to map only a part of the flash rom with your address ; decoder logic (and not use the rest), but you should be careful that ; "bflash" and "eflash" don't include and memory which is NOT flash rom ; so that the erase algorithm won't keep applying erase pulses until it ; finally gives up (which will stress the thin oxide and degrade the ; flash rom's life and reliability). "erase_pin" allows you to specify ; the bit address for a pin which (if held low) will tell PAULMON2 to ; erase the flash rom chip when it starts up. This is useful if you ; download programs with the "start-up" headers on them and the code you've ; put in the flash rom crashes! .equ has_flash, 0 ;set to non-zero value if flash installed .equ bflash, 0x8000 ;first memory location of Flash ROM .equ eflash, 0xFFFF ;last memory location of Flash ROM .equ erase_pin, 0 ;00 = disable erase pin feature ;.equ erase_pin, 0xB5 ;B5 = pin 15, P3.5 (T1) ; Please note... much of the memory management code only looks at the ; upper 8 bits of an address, so it's not a good idea to somehow map ; your memory chips (with complex address decoding logic) into chunks ; less than 256 bytes. In other words, only using a piece of a flash ; rom chip and mapping it between C43A to F91B would confuse PAULMON2 ; (as well as require quit a bit of address decoding logic circuitry) ; To set the baud rate, use this formula or set to 0 for auto detection ; baud_const = 256 - (crystal / (12 * 16 * baud)) .equ baud_const, 0 ;automatic baud rate detection ;.equ baud_const, 255 ;57600 baud w/ 11.0592 MHz ;.equ baud_const, 253 ;19200 baud w/ 11.0592 MHz ;.equ baud_const, 252 ;19200 baud w/ 14.7456 MHz ;.equ baud_const, 243 ;4808 baud w/ 12 MHz .equ line_delay, 6 ;num of char times to pause during uploads ; About download speed: when writing to ram, PAULMON2 can accept data ; at the maximum baud rate (baud_const=255 or 57600 baud w/ 11.0592 MHz). ; Most terminal emulation programs introduce intentional delays when ; sending ascii data, which you would want to turn off for downloading ; larger programs into ram. For Flash ROM, the maximum speed is set by ; the time it takes to program each location... 9600 baud seems to work ; nicely for the AMD 28F256 chip. The "character pacing" delay in a ; terminal emulation program should be sufficient to download to flash ; rom and any baud rate. Some flash rom chips can write very quickly, ; allowing high speed baud rates, but other chips can not. You milage ; will vary... ; Several people didn't like the key definations in PAULMON1. ; Actually, I didn't like 'em either, but I never took the time ; to change it. Eventually I got used to them, but now it's ; really easy to change which keys do what in PAULMON2. You ; can guess what to do below, but don't use lowercase. .equ help_key, '?' ;help screen .equ dir_key, 'M' ;directory .equ run_key, 'R' ;run program .equ dnld_key, 'D' ;download .equ upld_key, 'U' ;upload .equ nloc_key, 'N' ;new memory location .equ jump_key, 'J' ;jump to memory location .equ dump_key, 'H' ;hex dump memory .equ intm_key, 'I' ;hex dump internal memory .equ edit_key, 'E' ;edit memory .equ clrm_key, 'C' ;clear memory .equ erfr_key, 'Z' ;erase flash rom ; timing parameters for AMD Flash ROM 28F256. These parameters ; and pretty conservative and they seem to work with crystals ; between 6 MHz to 24 MHz... (tested with AMD 28F256 chips only) ; unless you know this is a problem, it is probably not a good ; idea to fiddle with these. ;.equ pgmwait, 10 ;22.1184 MHz crystal assumed .equ pgmwait, 19 ;11.0592 MHz .equ verwait, 5 ;.equ erwait1, 40 ;fourty delays @22.1184 .equ erwait1, 20 ;twenty delays for 11.0592 MHz .equ erwait2, 229 ;each delay .5 ms @22.1184MHz ; These symbols configure paulmon2's internal memory usage. ; It is usually not a good idea to change these unless you ; know that you really have to. .equ psw_init, 0 ;value for psw (which reg bank to use) .equ dnld_parm, 0x10 ;block of 16 bytes for download .equ stack, 0x30 ;location of the stack .equ baud_save, 0x78 ;save baud for warm boot, 4 bytes ;---------------------------------------------------------; ; ; ; Interrupt Vectors ; ; (and little bits of code crammed in the empty spaces) ; ; ; ;---------------------------------------------------------; .org base ljmp poweron ;reset vector .org base+3 ljmp vector+3 ;ext int0 vector r6r7todptr: mov dpl, r6 mov dph, r7 ret .org base+11 ljmp vector+11 ;timer0 vector dptrtor6r7: mov r6, dpl mov r7, dph ret .org base+19 ljmp vector+19 ;ext int1 vector dash: mov a, #'-' ;seems kinda trivial, but each time ajmp cout ;this appears in code, it takes 4 nop ;bytes, but an acall takes only 2 .org base+27 ljmp vector+27 ;timer1 vector cout_sp:acall cout ajmp space nop .org base+35 ljmp vector+35 ;uart vector dash_sp:acall dash ajmp space nop .org base+43 ljmp vector+43 ;timer2 vector (8052) ;---------------------------------------------------------; ; ; ; The jump table for user programs to call ; ; subroutines within PAULMON ; ; ; ;---------------------------------------------------------; .org base+46 ;never change this line!! Other ;programs depend on these locations ;to access paulmon2 functions ajmp phex1 ;2E ajmp cout ;30 ajmp cin ;32 ajmp phex ;34 ajmp phex16 ;36 ajmp pstr ;38 ajmp ghex ;3A ajmp ghex16 ;3C ajmp esc ;4E ajmp upper ;40 ljmp autobaud ;42 pcstr_h:ljmp pcstr ;45 ajmp newline ;48 ljmp lenstr ;4A ljmp pint8u ;4D ljmp pint8 ;50 ljmp pint16u ;53 ljmp smart_wr ;56 ljmp prgm ;59 ljmp erall ;5C ljmp find ;5F cin_filter_h: ljmp cin_filter ;62 ajmp asc2hex ;64 ;---------------------------------------------------------; ; ; ; Subroutines for serial I/O ; ; ; ;---------------------------------------------------------; cin: jnb ri, cin clr ri mov a, sbuf ret dspace: acall space space: mov a, #' ' cout: jnb ti, cout clr ti ;clr ti before the mov to sbuf! mov sbuf, a ret ;clearing ti before reading sbuf takes care of the case where ;interrupts may be enabled... if an interrupt were to happen ;between those two instructions, the serial port will just ;wait a while, but in the other order and the character could ;finish transmitting (during the interrupt routine) and then ;ti would be cleared and never set again by the hardware, causing ;the next call to cout to hang forever! newline2: ;print two newlines acall newline newline:push acc ;print one newline mov a, #13 acall cout mov a, #10 acall cout pop acc ret ;get 2 digit hex number from serial port ; c = set if ESC pressed, clear otherwise ; psw.5 = set if return w/ no input, clear otherwise ghex: ghex8: clr psw.5 ghex8c: acall cin_filter_h ;get first digit acall upper cjne a, #27, ghex8f ghex8d: setb c clr a ret ghex8f: cjne a, #13, ghex8h setb psw.5 clr c clr a ret ghex8h: mov r2, a acall asc2hex jc ghex8c xch a, r2 ;r2 will hold hex value of 1st digit acall cout ghex8j: acall cin_filter_h ;get second digit acall upper cjne a, #27, ghex8k sjmp ghex8d ghex8k: cjne a, #13, ghex8m mov a, r2 clr c ret ghex8m: cjne a, #8, ghex8p ghex8n: acall cout sjmp ghex8c ghex8p: cjne a, #21, ghex8q sjmp ghex8n ghex8q: mov r3, a acall asc2hex jc ghex8j xch a, r3 acall cout mov a, r2 swap a orl a, r3 clr c ret ;carry set if esc pressed ;psw.5 set if return pressed w/ no input ghex16: mov r2, #0 ;start out with 0 mov r3, #0 mov r4, #4 ;number of digits left clr psw.5 ghex16c: acall cin_filter_h acall upper cjne a, #27, ghex16d setb c ;handle esc key clr a mov dph, a mov dpl, a ret ghex16d:cjne a, #8, ghex16f sjmp ghex16k ghex16f:cjne a, #127, ghex16g ;handle backspace ghex16k:cjne r4, #4, ghex16e ;have they entered anything yet? sjmp ghex16c ghex16e:acall cout acall ghex16y inc r4 sjmp ghex16c ghex16g:cjne a, #13, ghex16i ;return key mov dph, r3 mov dpl, r2 cjne r4, #4, ghex16h clr a mov dph, a mov dpl, a setb psw.5 ghex16h:clr c ret ghex16i:mov r5, a ;keep copy of original keystroke acall asc2hex jc ghex16c xch a, r5 lcall cout mov a, r5 push acc acall ghex16x pop acc add a, r2 mov r2, a clr a addc a, r3 mov r3, a djnz r4, ghex16c clr c mov dpl, r2 mov dph, r3 ret ghex16x: ;multiply r3-r2 by 16 (shift left by 4) mov a, r3 swap a anl a, #11110000b mov r3, a mov a, r2 swap a anl a, #00001111b orl a, r3 mov r3, a mov a, r2 swap a anl a, #11110000b mov r2, a ret ghex16y: ;divide r3-r2 by 16 (shift right by 4) mov a, r2 swap a anl a, #00001111b mov r2, a mov a, r3 swap a anl a, #11110000b orl a, r2 mov r2, a mov a, r3 swap a anl a, #00001111b mov r3, a ret ;carry set if invalid input asc2hex: clr c add a, #208 jnc hex_not add a, #246 jc hex_maybe add a, #10 clr c ret hex_maybe: add a, #249 jnc hex_not add a, #250 jc hex_not add a, #16 clr c ret hex_not:setb c ret phex: phex8: push acc swap a anl a, #15 add a, #246 jnc phex_b add a, #7 phex_b: add a, #58 acall cout pop acc phex1: push acc anl a, #15 add a, #246 jnc phex_c add a, #7 phex_c: add a, #58 acall cout pop acc ret phex16: push acc mov a, dph acall phex mov a, dpl acall phex pop acc ret ;a not so well documented feature of pstr is that you can print ;multiple consecutive strings without needing to reload dptr ;(which takes 3 bytes of code!)... this is useful for inserting ;numbers or spaces between strings. pstr: push acc pstr1: clr a movc a, @a+dptr inc dptr jz pstr2 mov c, acc.7 anl a, #0x7F acall cout jc pstr2 sjmp pstr1 pstr2: pop acc ret upper: ;converts the ascii code in Acc to uppercase, if it is lowercase push acc clr c subb a, #97 jc upper2 ;is it a lowercase character subb a, #26 jnc upper2 pop acc add a, #224 ;convert to uppercase ret upper2: pop acc ;don't change anything ret lenstr: mov r0, #0 ;returns length of a string in r0 push acc lenstr1:clr a movc a,@a+dptr jz lenstr2 mov c,acc.7 inc r0 Jc lenstr2 inc dptr sjmp lenstr1 lenstr2:pop acc ret esc: ;checks to see if is waiting on serial port ;C=clear if no , C=set if pressed ;buffer is flushed push acc clr c jnb ri,esc2 mov a,sbuf cjne a,#27,esc1 setb c esc1: clr ri esc2: pop acc ret ;---------------------------------------------------------; ; ; ; The 'high-level' stuff to interact with the user ; ; ; ;---------------------------------------------------------; menu: ;first we print out the prompt, which isn't as simple ;as it may seem, since external code can add to the ;prompt, so we've got to find and execute all of 'em. mov dptr, #prompt1 ;give 'em the first part of prompt acall pcstr_h mov a, r7 acall phex mov a, r6 acall phex ;mov dptr, #prompt2 acall pstr ;now we're finally past the prompt, so let's get some input acall cin_filter_h ;get the input, finally acall upper ;push return address onto stack so we can just jump to the program mov b, #(menu & 255) ;we push the return address now, push b ;to save code later... mov b, #(menu >> 8) ;if bogus input, just ret for push b ;another prompt. ;first we'll look through memory for a program header that says ;it's a user installed command which matches what the user pressed ;user installed commands need to avoid changing R6/R7, which holds ;the memory pointer. The stack pointer can't be changed obviously. ;all the other general purpose registers should be available for ;user commands to alter as they wish. menux: mov b, a ;now search for external commands... mov dptr, #bmem menux1: acall find jnc menuxend ;searched all the commands? mov dpl, #4 clr a movc a,@a+dptr cjne a, #254, menux2 ;only FE is an ext command inc dpl clr a movc a,@a+dptr cjne a, b, menux2 ;only run if they want it acall space mov dpl, #32 acall pstr ;print command name acall newline mov dpl, #64 clr a jmp @a+dptr ;take a leap of faith and jump to it! menux2: inc dph mov a, dph cjne a, #((emem+1) >> 8) & 255, menux1 menuxend: mov a, b ;since we didn't find a user installed command, use the builtin ones menu1a: cjne a, #help_key, menu1b mov dptr, #help_cmd2 acall pcstr_h ajmp help menu1b: cjne a, #dir_key, menu1c mov dptr, #dir_cmd acall pcstr_h ajmp dir menu1c: cjne a, #run_key, menu1d mov dptr, #run_cmd acall pcstr_h ajmp run menu1d: cjne a, #dnld_key, menu1e mov dptr, #dnld_cmd acall pcstr_h ajmp dnld menu1e: cjne a, #upld_key, menu1f mov dptr, #upld_cmd acall pcstr_h ajmp upld menu1f: cjne a, #nloc_key, menu1g mov dptr, #nloc_cmd acall pcstr_h ajmp nloc menu1g: cjne a, #jump_key, menu1h mov dptr, #jump_cmd acall pcstr_h ajmp jump menu1h: cjne a, #dump_key, menu1i mov dptr, #dump_cmd acall pcstr_h ajmp dump menu1i: cjne a, #edit_key, menu1j mov dptr, #edit_cmd acall pcstr_h ajmp edit menu1j: cjne a, #clrm_key, menu1k mov dptr, #clrm_cmd acall pcstr_h ajmp clrm menu1k: cjne a, #erfr_key, menu1l mov a, #has_flash jz menu_end mov dptr, #erfr_cmd acall pcstr_h ajmp erfr menu1l: cjne a, #intm_key, menu1m mov dptr, #intm_cmd acall pcstr_h ljmp intm menu1m: ;invalid input, no commands to run... menu_end: ;at this point, we have not found ajmp newline ;anything to run, so we give up. ;remember, we pushed menu, so newline ;will just return to menu. ;.......................................................... ;---------------------------------------------------------; ;dnlds1 = "Begin sending Intel HEX format file to abort" ;dnlds2 = "Download aborted" ;dnlds3 = "Download completed" ;16 byte parameter table: (eight 16 bit values) ; * 0 = lines received ; * 1 = bytes received ; * 2 = bytes written ; * 3 = bytes unable to write ; * 4 = incorrect checksums ; * 5 = unexpected begin of line ; * 6 = unexpected hex digits (while waiting for bol) ; * 7 = unexpected non-hex digits (in middle of a line) dnld: mov dptr, #dnlds1 acall pcstr_h ;"begin sending file to abort" mov r0, #dnld_parm mov r2, #16 dnld0: mov @r0, #0 ;initialize all parameters to 0 inc r0 djnz r2, dnld0 ;look for begining of line marker ':' dnld1: acall cin cjne a, #27, dnld2 ;Test for escape sjmp dnld_esc dnld2: cjne a, #':', dnld2b mov r1, #0 acall dnld_inc sjmp dnld3 dnld2b: ;check to see if it's a hex digit, error if it is acall asc2hex jc dnld1 mov r1, #6 acall dnld_inc sjmp dnld1 ;begin taking in the line of data dnld3: mov a, #'.' acall cout mov r4, #0 ;r4 will count up checksum acall dnld_ghex mov r0, a ;R0 = # of data bytes acall dnld_ghex mov dph, a ;High byte of load address acall dnld_ghex mov dpl, a ;Low byte of load address acall dnld_ghex ;Record type cjne a, #1, dnld4 ;End record? sjmp dnld_end dnld4: jnz dnld_unknown ;is it a unknown record type??? dnld5: mov a, r0 jz dnld_get_cksum acall dnld_ghex ;Get data byte mov r2, a mov r1, #1 acall dnld_inc ;count total data bytes received mov a, r2 lcall smart_wr ;c=1 if an error writing clr a addc a, #2 mov r1, a ; 2 = bytes written ; 3 = bytes unable to write acall dnld_inc inc dptr djnz r0, dnld5 dnld_get_cksum: acall dnld_ghex ;get checksum mov a, r4 jz dnld1 ;should always add to zero dnld_sumerr: mov r1, #4 acall dnld_inc ;all we can do it count # of cksum errors sjmp dnld1 dnld_unknown: ;handle unknown line type mov a, r0 jz dnld_get_cksum ;skip data if size is zero dnld_ukn2: acall dnld_ghex ;consume all of unknown data djnz r0, dnld_ukn2 sjmp dnld_get_cksum dnld_end: ;handles the proper end-of-download marker mov a, r0 jz dnld_end_3 ;should usually be zero dnld_end_2: acall dnld_ghex ;consume all of useless data djnz r0, dnld_ukn2 dnld_end_3: acall dnld_ghex ;get the last checksum mov a, r4 jnz dnld_sumerr acall dnld_dly mov dptr, #dnlds3 acall pcstr_h ;"download went ok..." ;consume any cr or lf character that may have been ;on the end of the last line jnb ri, dnld_sum acall cin sjmp dnld_sum dnld_esc: ;handle esc received in the download stream acall dnld_dly mov dptr, #dnlds2 acall pcstr_h ;"download aborted." sjmp dnld_sum dnld_dly: ;a short delay since most terminal emulation programs ;won't be ready to receive anything immediately after ;they've transmitted a file... even on a fast Pentium(tm) ;machine with 16550 uarts! mov r0, #0 dnlddly2:mov r1, #0 djnz r1, * ;roughly 128k cycles, appox 0.1 sec djnz r0, dnlddly2 ret dnld_inc: ;increment parameter specified by R1 ;note, values in Acc and R1 are destroyed mov a, r1 anl a, #00000111b ;just in case rl a add a, #dnld_parm mov r1, a ;now r1 points to lsb inc @r1 mov a, @r1 jnz dnldin2 inc r1 inc @r1 dnldin2:ret dnld_gp: ;get parameter, and inc to next one (@r1) ;carry clear if parameter is zero. ;16 bit value returned in dptr setb c mov dpl, @r1 inc r1 mov dph, @r1 inc r1 mov a, dpl jnz dnldgp2 mov a, dph jnz dnldgp2 clr c dnldgp2:ret ;a spacial version of ghex just for the download. Does not ;look for carriage return or backspace. Handles ESC key by ;poping the return address (I know, nasty, but it saves many ;bytes of code in this 4k ROM) and then jumps to the esc ;key handling. This ghex doesn't echo characters, and if it ;sees ':', it pops the return and jumps to an error handler ;for ':' in the middle of a line. Non-hex digits also jump ;to error handlers, depending on which digit. dnld_ghex: dnldgh1:acall cin acall upper cjne a, #27, dnldgh3 dnldgh2:pop acc pop acc sjmp dnld_esc dnldgh3:cjne a, #':', dnldgh5 dnldgh4:mov r1, #5 ;handle unexpected beginning of line acall dnld_inc pop acc pop acc ajmp dnld3 ;and now we're on a new line! dnldgh5:acall asc2hex jnc dnldgh6 mov r1, #7 acall dnld_inc sjmp dnldgh1 dnldgh6:mov r2, a ;keep first digit in r2 dnldgh7:acall cin acall upper cjne a, #27, dnldgh8 sjmp dnldgh2 dnldgh8:cjne a, #':', dnldgh9 sjmp dnldgh4 dnldgh9:acall asc2hex jnc dnldghA mov r1, #7 acall dnld_inc sjmp dnldgh7 dnldghA:xch a, r2 swap a orl a, r2 mov r2, a add a, r4 ;add into checksum mov r4, a mov a, r2 ;return value in acc ret ;dnlds4 = "Summary:" ;dnlds5 = " lines received" ;dnlds6a = " bytes received" ;dnlds6b = " bytes written" dnld_sum: ;print out download summary mov a, r6 push acc mov a, r7 push acc mov dptr, #dnlds4 acall pcstr_h mov r1, #dnld_parm mov r6, #dnlds5 & 255 mov r7, #dnlds5 >> 8 acall dnld_i0 mov r6, #dnlds6a & 255 mov r7, #dnlds6a >> 8 acall dnld_i0 mov r6, #dnlds6b & 255 mov r7, #dnlds6b >> 8 acall dnld_i0 dnld_err: ;now print out error summary mov r2, #5 dnlder2:acall dnld_gp jc dnlder3 ;any errors? djnz r2, dnlder2 ;no errors, so we print the nice message mov dptr, #dnlds13 acall pcstr_h sjmp dlnd_sum_done dnlder3: ;there were errors, so now we print 'em mov dptr, #dnlds7 acall pcstr_h ;but let's not be nasty... only print if necessary mov r1, #(dnld_parm+6) mov r6, #dnlds8 & 255 mov r7, #dnlds8 >> 8 acall dnld_item mov r6, #dnlds9 & 255 mov r7, #dnlds9 >> 8 acall dnld_item mov r6, #dnlds10 & 255 mov r7, #dnlds10 >> 8 acall dnld_item mov r6, #dnlds11 & 255 mov r7, #dnlds11 >> 8 acall dnld_item mov r6, #dnlds12 & 255 mov r7, #dnlds12 >> 8 acall dnld_item dlnd_sum_done: pop acc mov r7, a pop acc mov r6, a ajmp newline dnld_item: acall dnld_gp ;error conditions jnc dnld_i3 dnld_i2:acall space lcall pint16u acall r6r7todptr acall pcstr_h dnld_i3:ret dnld_i0:acall dnld_gp ;non-error conditions sjmp dnld_i2 ;dnlds7: = "Errors:" ;dnlds8: = " bytes unable to write" ;dnlds9: = " incorrect checksums" ;dnlds10: = " unexpected begin of line" ;dnlds11: = " unexpected hex digits" ;dnlds12: = " unexpected non-hex digits" ;dnlds13: = "No errors detected" ;---------------------------------------------------------; jump: mov dptr, #prompt8 acall pcstr_h acall r6r7todptr acall phex16 mov dptr, #prompt4 acall pcstr_h acall ghex16 jb psw.5, jump3 jnc jump2 ajmp abort2 jump2: acall dptrtor6r7 jump3: acall newline mov dptr, #runs1 acall pcstr_h acall r6r7todptr jump_doit: ;jump to user code @dptr (this used by run command also) clr a mov psw, a mov b, a mov r0, a mov r1, a mov r2, a mov r3, a mov r4, a mov r5, a mov r6, a mov r7, a mov sp, #8 ;start w/ sp=7, like a real reset push acc ;unlike a real reset, push 0000 push acc ;in case they end with a RET jmp @a+dptr ;---------------------------------------------------------; dump: mov r2, #16 ;number of lines to print acall newline2 dump1: acall r6r7todptr acall phex16 ;tell 'em the memory location mov a,#':' acall cout_sp mov r3, #16 ;r3 counts # of bytes to print acall r6r7todptr dump2: clr a movc a, @a+dptr inc dptr acall phex ;print each byte in hex acall space djnz r3, dump2 acall dspace ;print a couple extra space mov r3, #16 acall r6r7todptr dump3: clr a movc a, @a+dptr inc dptr anl a, #01111111b ;avoid unprintable characters cjne a, #127, dump3b clr a ;avoid 127/255 (delete/rubout) char dump3b: add a, #224 jc dump4 clr a ;avoid control characters dump4: add a, #32 acall cout djnz r3, dump3 acall newline acall line_dly acall dptrtor6r7 acall esc jc dump5 djnz r2, dump1 ;loop back up to print next line dump5: ajmp newline ;---------------------------------------------------------; edit: ;edit external ram... mov dptr, #edits1 acall pcstr_h acall r6r7todptr edit1: acall phex16 mov a,#':' acall cout_sp mov a,#'(' acall cout acall dptrtor6r7 clr a movc a, @a+dptr acall phex mov dptr,#prompt10 acall pcstr_h acall ghex jb psw.5,edit2 jc edit2 acall r6r7todptr lcall smart_wr acall newline acall r6r7todptr inc dptr acall dptrtor6r7 ajmp edit1 edit2: mov dptr,#edits2 ajmp pcstr_h ;---------------------------------------------------------; dir: mov dptr, #prompt9 acall pcstr_h mov r0, #21 dir0a: acall space djnz r0, dir0a ;mov dptr, #prompt9b acall pcstr_h mov dph, #(bmem >> 8) dir1: acall find ;find the next program in memory jc dir2 dir_end:ajmp newline ;we're done if no more found dir2: acall dspace mov dpl, #32 ;print its name acall pstr mov dpl, #32 ;how long is the name acall lenstr mov a, #33 clr c subb a, r0 mov r0, a mov a, #' ' ;print the right # of spaces dir3: acall cout djnz r0, dir3 mov dpl, #0 acall phex16 ;print the memory location mov r0, #6 mov a, #' ' dir4: acall cout djnz r0, dir4 mov dpl, #4 ;now figure out what type it is clr a movc a, @a+dptr mov r2, dph ;save this, we're inside a search dir5: cjne a, #254, dir5b mov dptr, #type1 ;it's an external command sjmp dir7 dir5b: cjne a, #253, dir5c dir5bb: mov dptr, #type4 ;it's a startup routine sjmp dir7 dir5c: cjne a, #35, dir5d mov dptr, #type2 ;it's an ordinary program sjmp dir7 dir5d: cjne a, #249, dir5e sjmp dir5bb dir5e: dir6: mov dptr, #type5 ;who knows what the hell it is dir7: acall pcstr_h ;print out the type mov dph, r2 ;go back and find the next one acall newline mov a, #(emem >> 8) cjne a, dph, dir8 ;did we just print the last one? ajmp dir_end dir8: inc dph mov a, dph cjne a, #((emem+1) >> 8) & 255, dir1 ajmp dir_end ;type1=Ext Command ;type4=Startup ;type2=Program ;type5=??? ;---------------------------------------------------------; run: acall newline2 mov r2, #255 ;first print the menu, count items mov dptr, #bmem dec dph run2: inc dph mov a, dph cjne a, #((emem+1) >> 8) & 255, run2b sjmp run3 run2b: acall find jnc run3 ;have we found 'em all?? mov dpl, #4 clr a movc a, @a+dptr orl a, #00000011b cpl a jz run2 ;this one doesn't run... find next acall dspace inc r2 mov a, #'A' ;print the key to press add a, r2 acall cout_sp acall dash_sp mov dpl, #32 acall pstr ;and the command name acall newline ajmp run2 ;and continue doing this run3: cjne r2, #255, run4 ;are there any to run?? mov dptr, #prompt5 ajmp pcstr_h run4: mov dptr, #prompt3 ;ask the big question! acall pcstr_h mov a, #'A' acall cout acall dash mov a, #'A' ;such user friendliness... add a, r2 ;even tell 'em the choices acall cout mov dptr, #prompt4 acall pcstr_h acall cin_filter_h cjne a, #27, run4aa ;they they hit ajmp newline run4aa: mov r3, a mov a, #31 clr c subb a, r2 mov a, r3 jc run4a acall upper run4a: acall cout mov r3, a acall newline ;check to see if it's under 32, if so convert to uppercase mov a, r3 clr c subb a, #'A' jc run4 ;if they typed less than 'A' mov r3, a ;R3 has the number they typed mov a, r2 ;A=R2 has the maximum number clr c subb a, r3 jc run4 ;if they typed over the max inc r3 mov dptr, #bmem dec dph run5: inc dph mov a, dph cjne a, #((emem+1) >> 8) & 255, run5b sjmp run8 run5b: acall find jnc run8 ;Shouldn't ever do this jump! mov dpl, #4 clr a movc a, @a+dptr orl a, #00000011b cpl a jz run5 ;this one doesn't run... find next djnz r3, run5 ;count til we find the one they want acall newline mov dpl, #64 ajmp jump_doit run8: ret ;---------------------------------------------------------; help: mov dptr, #help1txt acall pcstr_h mov r4, #help_key mov dptr, #help_cmd acall help2 mov r4, #dir_key ;mov dptr, #dir_cmd acall help2 mov r4, #run_key ;mov dptr, #run_cmd acall help2 mov r4, #dnld_key ;mov dptr, #dnld_cmd acall help2 mov r4, #upld_key ;mov dptr, #upld_cmd acall help2 mov r4, #nloc_key ;mov dptr, #nloc_cmd acall help2 mov r4, #jump_key ;mov dptr, #jump_cmd acall help2 mov r4, #dump_key ;mov dptr, #dump_cmd acall help2 mov r4, #intm_key ;mov dptr, #intm_cmd acall help2 mov r4, #edit_key ;mov dptr, #edit_cmd acall help2 mov r4, #clrm_key ;mov dptr, #clrm_cmd acall help2 mov a, #has_flash jz help_skerfm mov r4, #erfr_key ;mov dptr, #erfr_cmd acall help2 help_skerfm: mov dptr, #help2txt acall pcstr_h mov dptr, #bmem help3: acall find jnc help4 mov dpl, #4 clr a movc a,@a+dptr cjne a, #254, help3a ;only FE is an ext command acall dspace inc dpl clr a movc a,@a+dptr acall cout acall dash_sp mov dpl, #32 acall pstr acall newline help3a: inc dph mov a, dph cjne a, #((emem+1) >> 8) & 255, help3 help4: ajmp newline help2: ;print 11 standard lines acall dspace ;given key in R4 and name in dptr mov a, r4 acall cout acall dash_sp acall pcstr_h ajmp newline ;---------------------------------------------------------; upld: acall get_mem ;assume we've got the beginning address in r3/r2 ;and the final address in r5/r4 (r4=lsb)... ;print out what we'll be doing mov dptr, #uplds3 acall pcstr_h mov a, r3 acall phex mov a, r2 acall phex ;mov dptr, #uplds4 acall pcstr_h mov a, r5 acall phex mov a, r4 acall phex acall newline ;need to adjust end location by 1... mov dph, r5 mov dpl, r4 inc dptr mov r4, dpl mov r5, dph mov dptr, #prompt7 acall pcstr_h acall cin cjne a, #27, upld2e ajmp abort_it upld2e: acall newline mov dpl, r2 mov dph, r3 upld3: mov a, r4 ;how many more bytes to output?? clr c subb a, dpl mov r2, a mov a, r5 subb a, dph jnz upld4 ;if >256 left, then do next 16 mov a, r2 jz upld7 ;if we're all done anl a, #11110000b jnz upld4 ;if >= 16 left, then do next 16 sjmp upld5 ;otherwise just finish it off upld4: mov r2, #16 upld5: mov a, #':' ;begin the line acall cout mov a, r2 acall phex ;output # of data bytes acall phex16 ;output memory location mov a, dph add a, dpl add a, r2 mov r3, a ;r3 will become checksum clr a acall phex ;output 00 code for data upld6: clr a movc a, @a+dptr acall phex ;output each byte add a, r3 mov r3, a inc dptr djnz r2, upld6 ;do however many bytes we need mov a, r3 cpl a inc a acall phex ;and finally the checksum acall newline acall line_dly acall esc jnc upld3 ;keep working if no esc pressed sjmp abort_it upld7: mov a, #':' acall cout clr a acall phex acall phex acall phex inc a acall phex mov a, #255 acall phex upld8: ajmp newline2 line_dly: ;a brief delay between line while uploading, so the ;receiving host can be slow (i.e. most windows software) mov a, r0 push acc mov r0, #line_delay*2 line_d2:mov a, th0 ;get baud rate const line_d3:inc a nop nop jnz line_d3 djnz r0, line_d2 pop acc mov r0, a ret ;---------------------------------------------------------; get_mem: ;this thing gets the begin and end locations for ;a few commands. If an esc or enter w/ no input, ;it pops it's own return and returns to the menu ;(nasty programming, but we need tight code for 4k rom) acall newline2 mov dptr, #beg_str acall pcstr_h acall ghex16 jc pop_it jb psw.5, pop_it push dph push dpl acall newline mov dptr, #end_str acall pcstr_h acall ghex16 mov r5, dph mov r4, dpl pop acc mov r2, a pop acc mov r3, a jc pop_it jb psw.5, pop_it ajmp newline pop_it: pop acc pop acc abort_it: acall newline abort2: mov dptr, #abort ajmp pcstr_h clrm: acall get_mem mov dptr, #sure acall pcstr_h acall cin_filter_h acall upper cjne a, #'Y', abort_it acall newline2 ;now we actually do it clrm2: mov dph, r3 mov dpl, r2 clrm3: clr a lcall smart_wr mov a, r5 cjne a, dph, clrm4 mov a, r4 cjne a, dpl, clrm4 ret clrm4: inc dptr sjmp clrm3 ;---------------------------------------------------------; nloc: mov dptr, #prompt6 acall pcstr_h acall ghex16 jc abort2 jb psw.5, abort2 acall dptrtor6r7 ajmp newline2 ;---------------------------------------------------------; erfr: acall newline2 mov dptr, #erfr_cmd acall pcstr_h mov a, #',' acall cout_sp mov dptr, #sure acall pcstr_h acall cin_filter_h acall upper cjne a, #'Y', abort_it acall newline2 lcall erall mov dptr, #erfr_ok jnc erfr_end mov dptr, #erfr_err erfr_end: ajmp pcstr_h ;---------------------------------------------------------; intm: acall newline mov r0, #0 intm2: acall newline cjne r0, #0x80, intm3 ajmp newline intm3: mov a, r0 acall phex mov a, #':' acall cout intm4: acall space mov a, @r0 acall phex inc r0 mov a, r0 anl a, #00001111b jnz intm4 sjmp intm2 ;************************************************************** ;************************************************************** ;***** ***** ;***** 2k page boundry is somewhere near here ***** ;***** (no ajmp or acall past this point) ***** ;***** ***** ;************************************************************** ;************************************************************** ;---------------------------------------------------------; ; ; ; Subroutines for memory managment and non-serial I/O ; ; ; ;---------------------------------------------------------; ;finds the next header in the external memory. ; Input DPTR=point to start search (only MSB used) ; Output DPTR=location of next module ; C=set if a header found, C=clear if no more headers find: mov dpl, #0 clr a movc a, @a+dptr cjne a, #0xA5, find3 inc dptr clr a movc a, @a+dptr cjne a, #0xE5, find3 inc dptr clr a movc a, @a+dptr cjne a, #0xE0, find3 inc dptr clr a movc a, @a+dptr cjne a, #0xA5, find3 mov dpl, #0 ;found one here! setb c ret find3: mov a, #(emem >> 8) cjne a, dph, find4 ;did we just check the end clr c ret find4: inc dph ;keep on searching sjmp find ;routine that erases the whole flash rom! C=1 if failure, C=0 if ok erall: mov a, #has_flash jz erallno mov dptr, #bflash ;is it already erased ?? erall0: clr a movc a, @a+dptr cpl a jnz erall_b ;do actual erase if any byte not 255 inc dptr mov a, #((eflash+1) & 255) cjne a, dpl, erall0 mov a, #(((eflash+1) >> 8) & 255) cjne a, dph, erall0 ;if we get here, the entire chip was already erased, ;so there is no need to do anything clr c ret erall_b: mov dptr, #bflash ;first program to all 00's erall1: clr a movc a, @a+dptr jz erall2 ;don't waste time! clr a lcall prgm ;ok, program this byte ;if the program operation failed... we should abort because ;they are all likely to fail and it will take a long time... ;which give the appearance that the program has crashed, ;when it's really following the flash rom algorithm ;correctly and getting timeouts. jc erallno ;mov a, #'.' ;lcall cout erall2: inc dptr mov a, #((eflash+1) & 255) cjne a, dpl, erall1 mov a, #(((eflash+1) >> 8) & 255) cjne a, dph, erall1 ;after this it's all 00's mov dptr, #bflash ;beginning address mov r4, #232 ;max # of trials, lsb mov r5, #4 ;max # of trials, msb-1 erall3: ;mov a, #'#' ;lcall cout djnz r4, erall3a djnz r5, erall3a erallno:setb c ret ;if it didn't work! erall3a:mov a, #0x20 mov c, ea ;- ;turn off all interrupts!! mov psw.1, c clr ea movx @dptr, a ;send the erase setup movx @dptr, a ;and begin the erase mov r3, #erwait1 erwt: mov r2, #erwait2 ;now wait 10ms... djnz r2, * djnz r3, erwt erall4: mov a, #0xA0 movx @dptr, a ;send erase verify mov r2, #verwait ;wait for 6us djnz r2, * clr a movc a, @a+dptr mov c, psw.1 mov ea, c ;- ;turn interrupts back on cpl a jnz erall3 ;erase again if not FF inc dptr mov a, #(((eflash+1) >> 8) & 255) ;verify whole array cjne a, dph, erall4 mov a, #((eflash+1) & 255) cjne a, dpl, erall4 mov a, #255 mov dptr, #bflash movx @dptr, a ;reset the flash rom clr a movx @dptr, a ;and go back to read mode clr c ret ;a routine that writes ACC to into flash memory at DPTR ; assumes that Vpp is active and stable already. ; C is set if error occurs, C is clear if it worked prgm: mov b, a mov a, r2 push acc mov a, r3 push acc mov r2, #25 ;try to program 25 times if needed prgm2: mov a, #40h mov c, ea ;- ;turn off all interrupts!! mov psw.1, c clr ea movx @dptr, a ;send setup programming command mov a, b movx @dptr, a ;write to the cell mov r3, #pgmwait ;now wait for 10us djnz r3, * mov a, #0xC0 movx @dptr, a ;send program verify command mov r3, #verwait ;wait 6us while it adds margin djnz r3, * clr a movc a, @a+dptr mov c, psw.1 mov ea, c ;- ;turn interrupts back on clr c subb a, b jz prgmok ;note, C is still clear is ACC=0 djnz r2, prgm2 prgmbad:setb c ;it gets here if programming failure prgmok: clr a movx @dptr, a ;and go back into read mode pop acc mov r3, a pop acc mov r2, a mov a, b ;restore ACC to original value ret ;************************************ ;To make PAULMON2 able to write to other ;types of memory than RAM and flash rom, ;modify this "smart_wr" routine. This ;code doesn't accept any inputs other ;that the address (dptr) and value (acc), ;so this routine must know which types ;of memory are in what address ranges ;************************************ ;Write to Flash ROM or ordinary RAM. Carry bit will indicate ;if the value was successfully written, C=1 if not written. smart_wr: push acc push b mov b, a ;do we even have a flash rom? mov a, #has_flash jz wr_ram ;there is a flash rom, but is this address in it? mov a, dph cjne a, #(eflash >> 8), isfl3 sjmp wr_flash isfl3: jnc wr_ram cjne a, #(bflash >> 8), isfl4 sjmp wr_flash isfl4: jnc wr_flash sjmp wr_ram wr_flash: mov a, b acall prgm pop b pop acc ret wr_ram: mov a, b movx @dptr, a ;write the value to memory clr a movc a, @a+dptr ;read it back from code memory clr c subb a, b jz smwrok movx a, @dptr ;read it back from data memory clr c subb a, b jz smwrok smwrbad:setb c sjmp smwrxit smwrok: clr c smwrxit:pop b pop acc ret ;---------------------------------------------------------; ; ; ; Power-On initialization code and such... ; ; ; ;---------------------------------------------------------; ;first the hardware has to get initialized. intr_return: reti poweron: clr a mov ie, a ;all interrupts off mov ip, a mov psw, #psw_init ;clear any interrupt status, just in case the user put ;"ljmp 0" inside their interrupt service code. acall intr_return acall intr_return cpl a mov p0, a mov p1, a mov p2, a mov p3, a mov sp, #stack ;Before we start doing any I/O, a short delay is required so ;that any external hardware which may be in "reset mode" can ;initialize. This is typically a problem when a 82C55 chip ;is used and its reset line is driven from the R-C reset ;circuit used for the 8051. Because the 82C55 reset pin ;switches from zero to one at a higher voltage than the 8051, ;any 82C55 chips would still be in reset mode right now... rst_dly: mov r1, #200 ;approx 100000 cycles rdly2: mov r2, #249 ;500 cycles djnz r2, * djnz r1, rdly2 ;Check for the Erase-on-startup signal and erase Flash ROM ;if it's there. mov a, #has_flash jz skip_erase mov a, #erase_pin jz skip_erase mov r0, #250 ;check it 250 times, just to be sure chk_erase: mov c, erase_pin mov r1, #200 djnz r1, * ;short delay jc skip_erase ;skip erase if this bit is not low djnz r0, chk_erase lcall erall ;and this'll delete the flash rom skip_erase: ;run any user initialization programs in external memory mov b, #249 acall stcode ;initialize the serial port, auto baud detect if necessary acall autobaud ;set up the serial port ;mov a, th1 ;lcall phex ;run the start-up programs in external memory. mov b, #253 acall stcode ;now print out the nice welcome message welcome: mov r0, #24 welcm2: lcall newline djnz r0, welcm2 mov r0, #15 mov a, #' ' welcm4: lcall cout djnz r0, welcm4 mov dptr, #logon1 lcall pcstr mov dptr, #logon2 lcall pcstr lcall dir mov r6, #(pgm & 255) mov r7, #(pgm >> 8) ljmp menu stcode: mov dptr, #bmem ;search for startup routines stcode2:lcall find jnc stcode5 mov dpl, #4 clr a movc a, @a+dptr cjne a, b, stcode4 ;only startup code if matches B push b push dph mov a, #(stcode3 & 255) push acc mov a, #(stcode3 >> 8) push acc mov dpl, #64 clr a jmp @a+dptr ;jump to the startup code stcode3:pop dph ;hopefully it'll return to here pop b stcode4:inc dph mov a, dph cjne a, #((emem+1) >> 8) & 255, stcode2 stcode5:ret ;now we've executed all of 'em ;to do automatic baud rate detection, we assume the user will ;press the carriage return, which will cause this bit pattern ;to appear on port 3 pin 0 (CR = ascii code 13, assume 8N1 format) ; ; 0 1 0 1 1 0 0 0 0 1 ; | | | | ; start bit----+ +--lsb msb--+ +----stop bit ; ;we'll start timer #1 in 16 bit mode at the transition between the ;start bit and the LSB and stop it between the MBS and stop bit. ;That will give approx the number of cpu cycles for 8 bits. Divide ;by 8 for one bit and by 16 since the built-in UART takes 16 timer ;overflows for each bit. We need to be careful about roundoff during ;division and the result has to be inverted since timer #1 counts up. Of ;course, timer #1 gets used in 8-bit auto reload mode for generating the ;built-in UART's baud rate once we know what the reload value should be. autobaud: mov a, #baud_const ;skip if user supplied baud rate constant jnz autoend_jmp mov a, baud_save+3 ;is there a value from a previous boot? xrl baud_save+2, #01010101b xrl baud_save+1, #11001100b xrl baud_save+0, #00011101b cjne a, baud_save+2, autob1 cjne a, baud_save+1, autob1 cjne a, baud_save+0, autob1 autoend_jmp: ajmp autoend autob1: ;wait for inactivity mov pcon, #0x80 ;configure uart, fast baud mov scon, #0x42 ;configure uart, but receive disabled mov tmod, #0x11 ;get timers ready for action (16 bit mode) clr a mov tcon, a mov tl0, a mov th0, a mov tl1, a mov th1, a ;make sure there is no activity on the line ;before we actually begin looking for the carriage return mov r0, #200 autob1b:mov r1, #30 autob1c:jnb p3.0, autob1 djnz r1, autob1c djnz r0, autob1b autob2: ;look for the bits of the carriage return jb p3.0, autob2 ;wait for start bit jb p3.0, autob2 jb p3.0, autob2 ; check it a few more times to make jb p3.0, autob2 ; sure we don't trigger on some noise jb p3.0, autob2 autob2b:jnb p3.0, autob2b ;wait for bit #0 to begin setb tr1 ;and now we're timing it autob2c:jb tf1, autob1 ;check for timeout while waiting jb p3.0, autob2c ;wait for bit #1 to begin autob2d:jb tf1, autob1 ;check for timeout while waiting jnb p3.0, autob2d ;wait for bit #2 to begin autob2e:jb tf1, autob1 ;check for timeout while waiting jb p3.0, autob2e ;wait for bit #4 to begin setb tr0 ;start timing last 4 bits autob2f:jb tf1, autob1 ;check for timeout while waiting jnb p3.0, autob2f ;wait for stop bit to begin clr tr1 ;stop timing (both timers) clr tr0 jb tf1, autob1 ;check for timeout one last time ;compute the baud rate based on timer1 mov a, tl1 rlc a mov b, a mov a, th1 rlc a jc autob1 ;error if timer0 > 32767 mov c, b.7 addc a, #0 cpl a inc a ;now a has the value to load into th1 jz autob1 ;error if baud rate too fast ;after we get the carriage return, we need to make sure there ;isn't any "crap" on the serial line, as there is in the case ;were we get the letter E (and conclude the wrong baud rate). ;unfortunately the simple approach of just looking at the line ;for silence doesn't work, because we have to accept the case ;where the user's terminal emulation is configured to send a ;line feed after the carriage return. The best thing to do is ;use the uart and look see if it receives anything autob3: mov th1, a ;config timer1 mov tl1, #255 ;start asap! mov tmod, #0x21 ;autoreload mode setb ren ;turn on the uart setb tr1 ;turn on timer1 for its clock mov a, th1 cpl a inc a mov r1, a autob3b:mov r0, #255 autob3c:djnz r0, autob3c djnz r1, autob3b jnb ri, autob4 ;if we got here, there was some stuff after the carriage ;return, so we'll read it and see if it was the line feed clr ri mov a, sbuf anl a, #01111111b add a, #246 jz autob4 ;ok if 0A, the line feed character add a, #5 jz autob4 ;of if 05, since we may have missed start bit autob1_jmp: ljmp autob1 autob4: ;compute the baud rate based on timer0, check against timer1 value mov a, tl0 rlc a mov r0, a mov a, th0 rlc a mov r1, a jc autob1_jmp ;error if timer0 > 32767 mov a, r0 rlc a mov b, a mov a, r1 rlc a mov c, b.7 addc a, #0 jz autob1_jmp ;error if baud too fast! cpl a inc a cjne a, th1, autob1_jmp ;acc has th1 value at this point autoend:mov baud_save+3, a mov baud_save+2, a ;store the baud rate for next warm boot. mov baud_save+1, a mov baud_save+0, a xrl baud_save+2, #01010101b xrl baud_save+1, #11001100b xrl baud_save+0, #00011101b mov th1, a mov tl1, a mov tmod, #0x21 ;set timer #1 for 8 bit auto-reload mov pcon, #0x80 ;configure built-in uart mov scon, #0x52 setb tr1 ;start the baud rate timer ret ;---------------------------------------------------------; ; ; ; More subroutines, but less frequent used, so ; ; they're down here in the second 2k page. ; ; ; ;---------------------------------------------------------; ;this twisted bit of code looks for escape sequences for ;up, down, left, right, pageup, and pagedown, as well ;as ordinary escape and ordinary characters. Escape ;sequences are required to arrive with each character ;nearly back-to-back to the others, otherwise the characters ;are treated as ordinary user keystroaks. cin_filter ;returns a single byte when it sees the multi-byte escape ;sequence, as shown here. ; return value key escape sequence ; 11 (^K) up 1B 5B 41 ; 10 (^J) down 1B 5B 42 ; 21 (^U) right 1B 5B 43 ; 8 (^H) left 1B 5B 44 ; 25 (^Y) page up 1B 5B 35 7E ; 26 (^Z) page down 1B 5B 36 7E .equ esc_char, 27 cin_filter: jnb ri, cinf1 lcall cin cjne a, #esc_char, cinf_end ;if esc was already in sbuf, just ignore it cinf1: lcall cin cjne a, #esc_char, cinf_end cinf2: acall cinf_wait jb ri, cinf4 mov a, #esc_char ret ;an ordinary ESC cinf4: ;if we get here, it's a control code, since a character ;was received shortly after receiving an ESC character lcall cin cjne a, #'[', cinf_consume acall cinf_wait jnb ri, cin_filter lcall cin cinf5a: cjne a, #'A', cinf5b mov a, #11 ret cinf5b: cjne a, #'B', cinf5c mov a, #10 ret cinf5c: cjne a, #'C', cinf5d mov a, #21 ret cinf5d: cjne a, #'D', cinf5e mov a, #8 ret cinf5e: cjne a, #0x35, cinf5f sjmp cinf8 cinf5f: cjne a, #0x36, cinf5g sjmp cinf8 cinf5g: sjmp cinf_consume ;unknown escape sequence cinf8: ;when we get here, we've got the sequence for pageup/pagedown ;but there's one more incoming byte to check... push acc acall cinf_wait jnb ri, cinf_restart lcall cin cjne a, #0x7E, cinf_notpg pop acc add a, #228 cinf_end: ret cinf_restart: pop acc sjmp cin_filter cinf_notpg: pop acc ;unrecognized escape... eat up everything that's left coming in ;quickly, then begin looking again cinf_consume: acall cinf_wait jnb ri, cin_filter lcall cin cjne a, #esc_char, cinf_consume sjmp cinf2 ;this thing waits for a character to be received for approx ;4 character transmit time periods. It returns immedately ;or after the entire wait time. It does not remove the character ;from the buffer, so ri should be checked to see if something ;actually did show up while it was waiting .equ char_delay, 4 ;number of char xmit times to wait cinf_wait: mov a, r2 push acc mov r2, #char_delay*5 cinfw2: mov a, th0 cinfw3: jb ri, cinfw4 inc a jnz cinfw3 djnz r2, cinfw2 cinfw4: pop acc mov r2, a ret pint8u: ;prints the unsigned 8 bit value in Acc in base 10 push b push acc sjmp pint8b pint8: ;prints the signed 8 bit value in Acc in base 10 push b push acc jnb acc.7, pint8b mov a, #'-' lcall cout pop acc push acc cpl a add a, #1 pint8b: mov b, #100 div ab setb f0 jz pint8c clr f0 add a, #'0' lcall cout pint8c: mov a, b mov b, #10 div ab jnb f0, pint8d jz pint8e pint8d: add a, #'0' lcall cout pint8e: mov a, b add a, #'0' lcall cout pop acc pop b ret ;print 16 bit unsigned integer in DPTR, using base 10. pint16u: ;warning, destroys r2, r3, r4, r5, psw.5 push acc mov a, r0 push acc clr psw.5 mov r2, dpl mov r3, dph pint16a:mov r4, #16 ;ten-thousands digit mov r5, #39 acall pint16x jz pint16b add a, #'0' lcall cout setb psw.5 pint16b:mov r4, #232 ;thousands digit mov r5, #3 acall pint16x jnz pint16c jnb psw.5, pint16d pint16c:add a, #'0' lcall cout setb psw.5 pint16d:mov r4, #100 ;hundreds digit mov r5, #0 acall pint16x jnz pint16e jnb psw.5, pint16f pint16e:add a, #'0' lcall cout setb psw.5 pint16f:mov a, r2 ;tens digit mov r3, b mov b, #10 div ab jnz pint16g jnb psw.5, pint16h pint16g:add a, #'0' lcall cout pint16h:mov a, b ;and finally the ones digit mov b, r3 add a, #'0' lcall cout pop acc mov r0, a pop acc ret ;ok, it's a cpu hog and a nasty way to divide, but this code ;requires only 21 bytes! Divides r2-r3 by r4-r5 and leaves ;quotient in r2-r3 and returns remainder in acc. If Intel ;had made a proper divide, then this would be much easier. pint16x:mov r0, #0 pint16y:inc r0 clr c mov a, r2 subb a, r4 mov r2, a mov a, r3 subb a, r5 mov r3, a jnc pint16y dec r0 mov a, r2 add a, r4 mov r2, a mov a, r3 addc a, r5 mov r3, a mov a, r0 ret ;pcstr prints the compressed strings. A dictionary of 128 words is ;stored in 4 bit packed binary format. When pcstr finds a byte in ;a string with the high bit set, it prints the word from the dictionary. ;A few bytes have special functions and everything else prints as if ;it were an ordinary string. ; special codes for pcstr: ; 0 = end of string ; 13 = CR/LF ; 14 = CR/LF and end of string ; 31 = next word code should be capitalized pcstr: push acc mov a, r0 push acc mov a, r1 push acc mov a, r4 push acc setb psw.1 setb psw.5 pcstr1: clr a movc a, @a+dptr inc dptr jz pcstr2 jb acc.7, decomp anl a, #0x7F pcstrs1:cjne a, #13, pcstrs2 lcall newline setb psw.1 sjmp pcstr1 pcstrs2:cjne a, #31, pcstrs3 clr psw.5 sjmp pcstr1 pcstrs3:cjne a, #14, pcstrs4 lcall newline sjmp pcstr2 pcstrs4: clr psw.1 lcall cout sjmp pcstr1 pcstr2: pop acc mov r4, a pop acc mov r1, a pop acc mov r0, a pop acc ret ;dcomp actually takes care of printing a word from the dictionary ; dptr = position in packed words table ; r4=0 if next nibble is low, r4=255 if next nibble is high decomp: anl a, #0x7F mov r0, a ;r0 counts which word jb psw.1, decomp1 ;avoid leading space if first word lcall space decomp1:clr psw.1 push dpl push dph mov dptr, #words mov r4, #0 mov a, r0 jz dcomp3 ;here we must seek past all the words in the table ;that come before the one we're supposed to print mov r1, a dcomp2: acall get_next_nibble jnz dcomp2 ;when we get here, a word has been skipped... keep doing ;this until we're pointing to the correct one djnz r1, dcomp2 dcomp3: ;now we're pointing to the correct word, so all we have ;to do is print it out acall get_next_nibble jz dcomp_end cjne a, #15, dcomp4 ;the character is one of the 12 least commonly used acall get_next_nibble inc a movc a, @a+pc sjmp dcomp5 .db "hfwgybxvkqjz" dcomp4: ;the character is one of the 14 most commonly used inc a movc a, @a+pc sjmp dcomp5 .db "etarnisolumpdc" dcomp5: ;decide if it should be uppercase or lowercase mov c, psw.5 mov acc.5, c setb psw.5 cjne r0, #20, dcomp6 clr acc.5 dcomp6: cjne r0, #12, dcomp7 clr acc.5 dcomp7: lcall cout sjmp dcomp3 dcomp_end: pop dph pop dpl ajmp pcstr1 get_next_nibble: ;...and update dptr and r4, of course clr a movc a, @a+dptr cjne r4, #0, gnn2 mov r4, #255 anl a, #00001111b ret gnn2: mov r4, #0 inc dptr swap a anl a, #00001111b ret ;---------------------------------------------------------; ; ; ; Here begins the data tables and strings ; ; ; ;---------------------------------------------------------; ;this is the dictionary of 128 words used by pcstr. words: .db 0x82, 0x90, 0xE8, 0x23, 0x86, 0x05, 0x4C, 0xF8 .db 0x44, 0xB3, 0xB0, 0xB1, 0x48, 0x5F, 0xF0, 0x11 .db 0x7F, 0xA0, 0x15, 0x7F, 0x1C, 0x2E, 0xD1, 0x40 .db 0x5A, 0x50, 0xF1, 0x03, 0xBF, 0xBA, 0x0C, 0x2F .db 0x96, 0x01, 0x8D, 0x3F, 0x95, 0x38, 0x0D, 0x6F .db 0x5F, 0x12, 0x07, 0x71, 0x0E, 0x56, 0x2F, 0x48 .db 0x3B, 0x62, 0x58, 0x20, 0x1F, 0x76, 0x70, 0x32 .db 0x24, 0x40, 0xB8, 0x40, 0xE1, 0x61, 0x8F, 0x01 .db 0x34, 0x0B, 0xCA, 0x89, 0xD3, 0xC0, 0xA3, 0xB9 .db 0x58, 0x80, 0x04, 0xF8, 0x02, 0x85, 0x60, 0x25 .db 0x91, 0xF0, 0x92, 0x73, 0x1F, 0x10, 0x7F, 0x12 .db 0x54, 0x93, 0x10, 0x44, 0x48, 0x07, 0xD1, 0x26 .db 0x56, 0x4F, 0xD0, 0xF6, 0x64, 0x72, 0xE0, 0xB8 .db 0x3B, 0xD5, 0xF0, 0x16, 0x4F, 0x56, 0x30, 0x6F .db 0x48, 0x02, 0x5F, 0xA8, 0x20, 0x1F, 0x01, 0x76 .db 0x30, 0xD5, 0x60, 0x25, 0x41, 0xA4, 0x2C, 0x60 .db 0x05, 0x6F, 0x01, 0x3F, 0x26, 0x1F, 0x30, 0x07 .db 0x8E, 0x1D, 0xF0, 0x63, 0x99, 0xF0, 0x42, 0xB8 .db 0x20, 0x1F, 0x23, 0x30, 0x02, 0x7A, 0xD1, 0x60 .db 0x2F, 0xF0, 0xF6, 0x05, 0x8F, 0x93, 0x1A, 0x50 .db 0x28, 0xF0, 0x82, 0x04, 0x6F, 0xA3, 0x0D, 0x3F .db 0x1F, 0x51, 0x40, 0x23, 0x01, 0x3E, 0x05, 0x43 .db 0x01, 0x7A, 0x01, 0x17, 0x64, 0x93, 0x30, 0x2A .db 0x08, 0x8C, 0x24, 0x30, 0x99, 0xB0, 0xF3, 0x19 .db 0x60, 0x25, 0x41, 0x35, 0x09, 0x8E, 0xCB, 0x19 .db 0x12, 0x30, 0x05, 0x1F, 0x31, 0x1D, 0x04, 0x14 .db 0x4F, 0x76, 0x12, 0x04, 0xAB, 0x27, 0x90, 0x56 .db 0x01, 0x2F, 0xA8, 0xD5, 0xF0, 0xAA, 0x26, 0x20 .db 0x5F, 0x1C, 0xF0, 0xF3, 0x61, 0xFE, 0x01, 0x41 .db 0x73, 0x01, 0x27, 0xC1, 0xC0, 0x84, 0x8F, 0xD6 .db 0x01, 0x87, 0x70, 0x56, 0x4F, 0x19, 0x70, 0x1F .db 0xA8, 0xD9, 0x90, 0x76, 0x02, 0x17, 0x43, 0xFE .db 0x01, 0xC1, 0x84, 0x0B, 0x15, 0x7F, 0x02, 0x8B .db 0x14, 0x30, 0x8F, 0x63, 0x39, 0x6F, 0x19, 0xF0 .db 0x11, 0xC9, 0x10, 0x6D, 0x02, 0x3F, 0x91, 0x09 .db 0x7A, 0x41, 0xD0, 0xBA, 0x0C, 0x1D, 0x39, 0x5F .db 0x07, 0xF2, 0x11, 0x17, 0x20, 0x41, 0x6B, 0x35 .db 0x09, 0xF7, 0x75, 0x12, 0x0B, 0xA7, 0xCC, 0x48 .db 0x02, 0x3F, 0x64, 0x12, 0xA0, 0x0C, 0x27, 0xE3 .db 0x9F, 0xC0, 0x14, 0x77, 0x70, 0x11, 0x40, 0x71 .db 0x21, 0xC0, 0x68, 0x25, 0x41, 0xF0, 0x62, 0x7F .db 0xD1, 0xD0, 0x21, 0xE1, 0x62, 0x58, 0xB0, 0xF3 .db 0x05, 0x1F, 0x73, 0x30, 0x77, 0xB1, 0x6F, 0x19 .db 0xE0, 0x19, 0x43, 0xE0, 0x58, 0x2F, 0xF6, 0xA4 .db 0x14, 0xD0, 0x23, 0x03, 0xFE, 0x31, 0xF5, 0x14 .db 0x30, 0x99, 0xF8, 0x03, 0x3F, 0x64, 0x22, 0x51 .db 0x60, 0x25, 0x41, 0x2F, 0xE3, 0x01, 0x56, 0x27 .db 0x93, 0x09, 0xFE, 0x11, 0xFE, 0x79, 0xBA, 0x60 .db 0x75, 0x42, 0xEA, 0x62, 0x58, 0xA0, 0xE5, 0x1F .db 0x53, 0x4F, 0xD1, 0xC0, 0xA3, 0x09, 0x42, 0x53 .db 0xF7, 0x12, 0x04, 0x62, 0x1B, 0x30, 0xF5, 0x05 .db 0xF7, 0x69, 0x0C, 0x35, 0x1B, 0x70, 0x82, 0x2F .db 0x2F, 0x14, 0x4F, 0x51, 0xC0, 0x64, 0x25, 0x00 ;STR logon1: .db "Welcome",128,148,"2, by",31,248,31,254,13,14 logon2: .db 32,32,"See",148,"2.DOC,",148,"2.EQU",164 .db 148,"2.HDR",180,213,141,".",14 abort: .db " ",31,158,31,160,"!",13,14 prompt1:.db 148,"2 Loc:",0 prompt2:.db " >", 160 ;must follow after prompt1 prompt3:.db 134,202,130,'(',0 prompt4:.db "),",149,140,128,200,": ",0 prompt5:.db 31,151,130,195,"s",199,166,131,"," .db 186," JUMP",128,134,161,"r",130,13,14 prompt6:.db 13,13,31,135,131,129,": ",0 prompt7:.db 31,228,251," key: ",0 prompt8:.db 13,13,31,136,128,131,129," (",0 prompt9:.db 13,13,31,130,31,253,0 prompt9b:.db 31,129,32,32,32,32,32,31,201,14 ;must follow prompt9 prompt10:.db ") ",31,135,31,178,": ",0 beg_str:.db "First",31,129,": ",0 end_str:.db "Last",31,129,":",32,32,0 sure: .db 31,185,161," sure?",0 edits1: .db 13,13,31,156,154,146,",",140,128,200,14 edits2: .db " ",31,156,193,",",142,129,247,13,14 dnlds1: .db 13,13,31,159," ascii",249,150,31,152,132,137 .db ",",149,140,128,160,13,14 dnlds2: .db 13,31,138,160,"ed",13,14 dnlds3: .db 13,31,138,193,"d",13,14 dnlds4: .db "Summary:",14 dnlds5: .db " ",198,"s",145,"d",14 dnlds6a:.db " ",139,145,"d",14 dnlds6b:.db " ",139," written",14 dnlds7: .db 31,155,":",14 dnlds8: .db " ",139," unable",128," write",14 dnlds9: .db 32,32,"bad",245,"s",14 dnlds10:.db " ",133,159,150,198,14 dnlds11:.db " ",133,132,157,14 dnlds12:.db " ",133," non",132,157,14 dnlds13:.db 31,151,155," detected",13,14 runs1: .db 13,134,"ning",130,":",13,14 uplds3: .db 13,13,"Sending",31,152,132,137,172,32,32,0 uplds4: .db " ",128,32,32,0 ;must follow uplds3 help1txt:.db 13,13,"Standard",31,158,"s",14 help2txt:.db 31,218,31,244,"ed",31,158,"s",14 type1: .db 31,154,158,0 type2: .db 31,130,0 type4: .db 31,143,31,226,31,170,0 type5: .db "???",0 help_cmd2:.db 31,215,0 help_cmd: .db 31,142,215,209,0 ;these 11 _cmd string must be in order dir_cmd: .db 31,209,130,"s",0 run_cmd: .db 31,134,130,0 dnld_cmd: .db 31,138,0 upld_cmd: .db 31,147,0 nloc_cmd: .db 31,135,129,0 jump_cmd: .db 31,136,128,131,129,0 dump_cmd: .db 31,132,219,154,131,0 intm_cmd: .db 31,132,219,192,131,0 edit_cmd: .db 31,156,154,146,0 clrm_cmd: .db 31,237,131,0 erfr_cmd: .db 31,203,153,144,0 erfr_ok: .db 31,153,144,203,'d',13,14 erfr_err: .db 31,133,155,13,14 as31-2.3.1/examples/paulmon1.ref0000644000175000001440000005155410307071452015566 0ustar erazorusers:03000000020B08E8 :03000300022003D5 :03000B0002200BC5 :08001300308A030220130145AD :03001B0002201BA5 :0300230002202395 :03002B0002202B85 :10003000A188A180C183C1E5C1F2A1DEC104A19064 :10004000C1C30202E9C0D0C0E0C2D3C2D4B180D1E2 :10005000C3B40D020193B42002212EB43F04313306 :10006000014DB45111C082C083901454D1F2D08399 :10007000D082C2AA212EB448043152014DB452029A :10008000219BB453024131B441024167014D743D9B :10009000B18822E8C0E0D1DC7453B1887450B188D3 :1000A000118EA881C0F0D18318D1DC120AE8118E1C :1000B000E6D18318D1DC120AEE118EE6A2E7E43312 :1000C000D18DD1DC120AF9118EE583D183E582D17D :1000D00083E43143A88118E6D18374013143E9D127 :1000E0008374023143EAD18374033143EBD18374C7 :1000F000043143ECD18374053143EDD1837406316F :1001000043EED18374073143EFD183B1A1D1DC74C5 :1001100050B188120AEE118EC3E5819404F8C082B2 :10012000C083120BA5D083D082D0F0D0E0F8D0E00D :10013000D0D032C082C083B1A1901CD5D1F2D0837F :10014000D08222C0E0D1DC7452B188D0E0D18D11D0 :100150008E22C000C001C0F0C082C08390141FD1A5 :10016000F2D083D082E4D183743AB188D1DCE8D173 :1001700083D1DCE9D1837802790E2185E8D18374BB :100180003AB1887910D1DCE6D18308D9F8B1A1B8A9 :1001900080EAB1A1D0F0D001D00022C0F0D1DC744F :1001A00042B188118EE5F0D183D1DC7450B18874EE :1001B00053B1887457B188118EE8C0E0A88118182F :1001C00018E6D183D1DCC082C08390100DA8A8515D :1001D00027901010A8B85127901013A88951279084 :1001E0001018A888512790101DA898512790102208 :1001F000A88751277454B1887430B188118EE58C6A :10020000D183E58AD183D1DC7454B1887431B1884B :10021000118EE58DD183E58BD183B1A1D083D082BE :10022000D0E0F8D0F0014DD1F2118EE8D183D1DCCD :1002300022C0F0E8C0E0E581C39404F8C082C08326 :100240009013FDD1F2120BA5E581C39406F8A683A5 :1002500018A68290140ED1F208120BA5D083D0827A :10026000D0E0F8D0F0014DE8C0E0C0F0A881181847 :10027000C082C083901444D1F2B1DE400EF6B1A129 :10028000D083D082D0F0D0E0F8014D9008ABD1F20D :10029000D083D082D0F0D0E0F8014DC082C08390EE :1002A000128CD1F2B180B41B0A9012D5D1F2D08356 :1002B000D08222B43AEEB1DE40EFF8B1DE40EAF58A :1002C00083B1DE40E4F582B1DE40DEB4010A901273 :1002D000F0D1F2D083D082220841E1B1DE40CAF0F1 :1002E000A3D8F8B1DE40C241A44387807589117557 :1002F0009850438852E57BA97AAA79AB7863015577 :100300006302CC63031DB50108B50205B503028085 :1003100048C28E758D00758B0020B0FD20B0F22094 :10032000B0EF20B0EC20B0E930B0FDD28E20B0FDAF :1003300030B0FD20B0FD30B0FDC28EE58B33E58DD1 :1003400033F404F5F0F57B6455F57AE5F064CCF50B :1003500079E5F0641DF578E5F0F58D758921D28E8B :1003600022C082C083901538D1F2901489E4936042 :1003700029A3D1DCB1887804D1DCD8FCE493F5F072 :10038000A3E493A3A3A3C082C083F58285F083E492 :10039000D1F2B1A1D083D08280D4901563D1F2D0B4 :1003A00083D08222C082C083900812D1F2B180D162 :1003B000C3B41B0A9008ABD1F2D083D08222B43FE1 :1003C000239016B5D1F290083FD1F2B180B41B054D :1003D000D083D08222901B8FD1F2901CD5D1F2D045 :1003E00083D08222B45307901334D1F28133901317 :1003F00009D1F290084FD1F2D083D082D1E5C082EA :10040000C0839007E8D1F2D083D082D10450069007 :1004100008ABD1F222740DB188C082C0839013164C :10042000D1F2D083D0827400C0E07400C0E0C082FA :10043000C0832290084FD1F2D083D082C082C08383 :10044000D1E59007E8D1F2D083D082D104C082C038 :1004500083500C9008ABD1F2B1A1D083D08222C2DC :100460008A30B30A90134CD1F2D083D08222900804 :100470006CD1F2B180D1C3B41B0A9008ABD1F2D0D9 :1004800083D08222B44C0575B800800375B80490FF :1004900013C2D1F2D083D0827581387400C0E07469 :1004A00000C0E0E4C3780079017A007B007C007D25 :1004B000007E007F00C28AD2B375A884737A10B11F :1004C000A17820D1E5743AB1887420B188E493F61C :1004D000D1837420B188A308B830F2B1887820E6BF :1004E000547FF5F0C39420500375F020E5F0B188F7 :1004F00008B830EBB1A1B1904002DAC5B1A122C079 :1005000083C082B1A19007F4D1F2D082D083C0839E :10051000C082D104B1A14007B1A1D0E0D0E02290C7 :1005200008ABD1F2D082D083B1A122C082C0839027 :100530001237D1F2D083D082D1E5743AB188D1DCC0 :100540007428B188E0D183C082C08390089CD1F226 :10055000B1DE20D50C400AD083D082F0B1A1A3A196 :100560003890125ED1F2D083D082227A12B1A1EA01 :10057000C0E0F11BD0E0FAB1904002DAF2B1A12262 :100580003098FDC298E599223099FDF599C29922DB :10059000C0E0C3309808E599B41B03D3C298D0E0FB :1005A00022C0E0740DB188D0E022B180D1C3C3C2B3 :1005B000D5C2D2B40D03D2D522B41B02B322B408E3 :1005C00003D2D222B47F0280F8C0F0F5F0D1A5406A :1005D00009C5F0B188C5F0D0F022D0F080CCB1AA26 :1005E00030D50122500122C4F5F0B1AA20D20F303B :1005F000D506C2D5E5F0C42250012245F022740888 :10060000B18880DAC0E0E8C0E0E9C0E0EAC0E0EB31 :10061000C0E0B1AAF8405D20D55A20D2F5B1AAF9C0 :10062000405220D52B30D2067408B18880E4B1AA9C :10063000FA404120D52130D2067408B18880DEB15D :10064000AAFB403020D51A30D2207408B18880DE51 :100650007583008882801D758300E8C449F5828017 :10066000138883E9C44AF582800AE8C449F583EA1D :10067000C44BF582D0E0FBD0E0FAD0E0F9D0E0F84E :10068000D0E022C0E0C4D18DD0E0D18D22540F241F :100690000383B1882230313233343536373839412B :1006A0004243444546C3C0F09430F5F0940A4006F6 :1006B000E5F09407F5F0E5F0C354F06001D3E5F000 :1006C000D0F022C0F0F5F0C39461400B941A5007AB :1006D000C3E5F09420F5F0E5F0D0F022C0E07420FE :1006E000B188D0E022C0E0E583D183E582D183D018 :1006F000E022C0E0E4932098156010A2E7547F3018 :1007000099FDF599C2994003A380E9D0E022C298EF :10071000E599B41BDF740DB18880F0D1E5E493A3B3 :10072000FBC083C08290102793FAEB90113793FEA1 :1007300054FC0303FFEE5403D082D083FE14600FF9 :10074000C0E0E493A3FCD0E0146004E493A3FDF1C3 :1007500081C082C083900EFEF1A9EFF8D0E0D0F006 :10076000C0F0C0E0FEE5F0FFE814C33375F07AC0D6 :10077000F075F007C0F09008BF73D083D082B1A1AC :1007800022743AB188D1DCEBD183D1DCBE0104798B :100790000B8011ECD183D1DCBE020479088005ED19 :1007A000D1837906D1DCD9FC227808EA930A18A211 :1007B000E7547FB188400280F2D1DCD8FC223E4C65 :1007C0006F633D003A202856657273696F6E203161 :1007D0002E302920436F6D6D616E643E004C6F6357 :1007E0006174696F6E2028003D44656661756C74A4 :1007F000293A20004E6577206D656D6F7279207003 :100800006F696E746572206C6F636174696F6E3AA4 :1008100020000D533D53696E676C652053746570FD :100820002C204E3D4E6F726D616C202864656661B0 :10083000756C74292C203F3D48656C70203E00503B :100840007265737320616E79206B65793A20000DB3 :100850000D52756E2066726F6D206D656D6F7279C9 :10086000206C6F616374696F6E2028000D0D496EF6 :1008700074657272757074207072696F72697479C0 :100880003E204C3D4C6F772C20483D4869676820DE :100890002864656661756C74293A20002920204E11 :1008A00065772056616C75653A20002020436F6D96 :1008B0006D616E642041626F72746564210D002168 :1008C000A521B721BC21C121C621D121D821DE21FA :1008D000E521F121FC4108410C4110411341164131 :1008E00019411C411F4127412E41324135413841B8 :1008F0003C413F4199414B41524159415D41644125 :1009000073417A41814188418C419341A241B04178 :10091000C341CA41D27452120588EB540712068DA6 :100920002274401205887452120588EB5401120695 :100930008D22EC20E705EC12068322900FBAE49397 :10094000A360F3F8C39C70041206F222E493A33070 :10095000E7FA80EAEC547823C4F8EC5480601590F0 :100960001127E893900F933582F582500205831288 :1009700006F28006E82420120683742E120588EC05 :10098000540712068D22EC20E708C33FFF500D0EDE :10099000800AF404FCEFC39CFF50011EEE12068394 :1009A000EF12068322EE54F8F8EBC4035407481202 :1009B0000683EC1206832251F431152251F43132B0 :1009C0002251F431212251E851D951E2EC1206832F :1009D00022313251D951E8223132EDFC21C851EE99 :1009E00051D931542251EE51D9742F120588315406 :1009F0002251F4313251D9EDFC31862251E851D9DE :100A000051E2EC12068321F5311521FE312121FE40 :100A100051E82251EE223154223132223121225129 :100A2000E8744212058822311551D93186223132BB :100A300021F531152251F922315421F53186225107 :100A4000D351E8742B12058851F922311551D9512F :100A5000E822311551D9313222311521C8313251B4 :100A6000D9311522ECC0E0EDFC313251D9D0E0FC97 :100A7000313222313251D9312122312151D951E83B :100A800022312151D9313222312121C8315451D959 :100A900051EE2251F951D951E2EC120683ED1206C2 :100AA000832251F451D351E8742B12058851F92255 :100AB00051F451D351E8742B1205887450120588F3 :100AC00051EE2251F451D351F92251D351F951D958 :100AD00051E822744012058822742C1205881206EF :100AE000DC22742312058822744112058822744383 :100AF0001205882251E851D922C083C08290148403 :100B00001206F2D082D08322758130C2D3C2D412B1 :100B100002E9D299C29878081205A1D8FE900BD8A4 :100B20001206F2902000C082C0839007BE1206F227 :100B3000D083D0821206E5C082C0839007C412061B :100B4000F21205801206C3F520901489E493604BDD :100B5000B52040A3E493C0E0A3E493D0F0C082C0EA :100B600083F58285F0831206F21205A1D083D0822C :100B7000A3E493F522E4A393F521D023D024900B92 :100B800026C082C083852482852383C021C022227F :100B9000020B26A3A3A3A3A3020B4CD083D08212E3 :100BA00005A1020B26E9C0E0EAC0E0EBC0E0ECC022 :100BB000E0EDC0E0EEC0E0EFC0E086831886821270 :100BC000071BD0E0FFD0E0FED0E0FDD0E0FCD0E09D :100BD000FBD0E0FAD0E0F9220D2020200D202020CB :100BE00020202020200C57656C636F6D6520746F8A :100BF00020746865206E657720616E6420706F7365 :100C00007369626C79206576656E20696D70726FAC :100C10007665642038303331206D6F6E69746F7281 :100C20002F64656275676765720D62792050617522 :100C30006C2053746F6666726567656E206F6E20F8 :100C400031342D4F43542D393120666F72206E6F31 :100C500020676F6F6420726561736F6E20776861C3 :100C600074736F657665722E2E2E0D0D5468657344 :100C7000652061726520736F6D65206F66207468F2 :100C800065206665617475726573206F666665724E :100C90006564206279207468697320706172746978 :100CA00063756C61722064656275676765723A0D81 :100CB0000D2020202020446F776E6C6F61642070BF :100CC000726F6772616D732066726F6D2050432082 :100CD000202020202020202020557365722D467270 :100CE00069656E646C696E65737321212121210D24 :100CF000202020202052756E2050726F6772616D27 :100D000020202020202020202020202020202020E3 :100D1000202020202020202055736573206E6F2016 :100D200065787465726E616C2052414D0D202020F3 :100D300020202020284E6F726D616C2C206F722055 :100D400073696E676C652D7374657029202020208F :100D500020202020203C4553433E206B65792069AC :100D60007320737570706F727465640D202020207D :100D7000204C69737420617373656D626C652063C8 :100D80006F64652066726F6D206D656D6F7279207E :100D9000202020206175746F6D6174696320626129 :100DA0007564207261746520646574656374696F2D :100DB0006E0D20202020204865782044756D70201D :100DC000616E6420456469742065787465726E6133 :100DD0006C2052414D20202020204F6E2D6C696EDA :100DE000652068656C7020287479706520273F271E :100DF000290D0D486F77657665722C20796F752007 :100E0000646F6E27742067657420736F6D657468F6 :100E1000696E2720666F72206E6F7468696E272E68 :100E20002E2E202054686520636F646520666F72E3 :100E300020746869732064656275676765720D72F6 :100E400065717569726573207175697465206120BB :100E5000626974206D6F726520726F6F6D207468A7 :100E6000616E206973207479706963616C20666FAC :100E70007220612064656275676765722C206275F7 :100E8000742069742077696C6C20616C6C0D6669E4 :100E90007420696E746F2061203237363420283810 :100EA0004B2078203829204550524F4D2E0D0D4EA5 :100EB0004F20436F70797269676874212120205038 :100EC0006C656173652064697374726962757465B9 :100ED00020667265656C792E20204D616B652061FE :100EE00073206D616E7920636F7069657320617323 :100EF00020796F752077616E742E0D0D0D004143C2 :100F0000414CCC4144C420414444C3414A4DD041AA :100F10004ECC434A4EC5434CD24350CC44C14445C9 :100F2000C34449D6444A4EDA494EC34AC24A42C330 :100F30004AC34A4DD04A4EC24A4EC34A4EDA4ADAF2 :100F40004C43414CCC4C4A4DD04D4FD64D4F56C3DF :100F50004D4F56D84D55CC4E4FD04F52CC504FD010 :100F6000505553C85245D4524554C952CC524CC323 :100F700052D25252C3534554C2534A4DD053554294 :100F8000C2535741D05843C8584348C45852CC3F25 :100F90003FBF0050B054434FCE50B153434FCE509B :100FA000B249C550B349D043B05432434FCE5053E9 :100FB000D744B84143C3FDC2FE00E04143C381535F :100FC000D0824450CC834450C88050B09050B1A0DF :100FD00050B2B050B399534255C6CD5448B2C854DC :100FE00032434FCECC544CB2CB5243415032C8CA9C :100FF0005243415032CC8C5448B08A544CB08D543A :1010000048B18B544CB1F0C2D05053D7A849C5B8A1 :1010100049D089544D4FC48854434FCE9853434FC1 :10102000CE8750434FCE005A0E48732B2B2B2B2BC1 :101030002B2B2B2B2B2B2B300043752121212121F6 :10104000212121212121212E0E676E06060606068A :101050000606060606060638006A700A0A0A0A0A22 :101060000A0A0A0A0A0A0A330E5D5D5D5D5D5D5D6E :101070005D5D5D5D5D5D5D3B00121212121212122C :1010800012121212121212410E8F8F8F8F8F8F8FAA :101090008F8F8F8F8F8F8F3E005D354C4C4C4C4C1B :1010A0004C4C4C4C4C4C4C7C0E124F244C4C4C4CED :1010B0004C4C4C4C4C4C4C4C004C4F8080808080B5 :1010C000808080808080805D0E4C2B57924C4C4CF1 :1010D0004C4C4C4C4C4C4C12001C1C151515151549 :1010E00015151515151515630E1919848888888826 :1010F00088888888888888600078781F278B8B2765 :1011000027272727272727530E5353194C4C4C4C7E :101110004C4C4C4C4C4C4C530053531C4C4C4C4C76 :101120004C4C4C4C4C4C4C000206080C0E1012144B :10113000161B1E20232425AD066F3939464949590F :101140005959595959595963066F393946494959B5 :10115000595959595959596306AD39160E11110982 :10116000090909090909096306AD39160E111109A2 :101170000909090909090966061A1F160E1111093C :101180000909090909090966061A1F160E1111092C :101190000909090909090966061A1F160E1111091C :1011A0000909090909090966062269161F92867A42 :1011B0007A7A7A7A7A7A7A660622A14D8386867E50 :1011C0007E7E7E7E7E7E7E9B06969D160E1111098A :1011D000090909090909092606225D4DAD8E8E7699 :1011E000767676767676762606423D2F2B3737331F :1011F000333333333333334606423D390E1111094D :10120000090909090909094606423D3957111152D0 :1012100052525252525252A5061111390E11110951 :1012200009090909090909A9068989391A898971E8 :10123000717171717171710D45646974696E6720A6 :1012400045787465726E616C2052414D2E2E2E3C95 :101250004553433E20746F20717569740D00202042 :1012600045646974696E672066696E697368656450 :101270002C2074686973206C6F636174696F6E20D1 :10128000756E6368616E6765640D0D000D0D4265D6 :1012900067696E206173636969207472616E736D32 :1012A000697373696F6E206F6620496E74656C2078 :1012B00048455820666F726D61742066696C652CB4 :1012C000206F72203C4553433E20746F2061626F53 :1012D00072740D0D00446F776E6C6F6164206162F3 :1012E0006F7274656420627920757365720D0D00EC :1012F0000D0D0D0D446F776E6C6F616420636F6D23 :10130000706C657465640D0D0052756E206E6F72A1 :101310006D616C6C79000D4E6F772072756E6E6921 :101320006E67207468652070726F6772616D2E2E13 :101330002E0D0D0052756E20696E2073696E676CFC :10134000652073746570206D6F6465000D0D5468C1 :10135000652073696E676C652073746570207275A3 :101360006E20666561747572652077696C6C206E9D :101370006F742066756E6374696F6E20756E6C6530 :10138000737320494E5431202870696E2023313305 :10139000292069730D636F6E6E65637465642074D4 :1013A0006F2067726F756E64206F72206F7468654E :1013B00072776973652068656C64206C6F772E0D99 :1013C0000D000D4E6F772072756E6E696E67206925 :1013D0006E2073696E676C652073746570206D6F25 :1013E00064653A20203C5245543E3D646566617513 :1013F0006C742C203F3D48656C700D0D00536B697B :101400007070696E67202D2D2D2D2D2D3E004E659F :1014100078742077696C6C206265202D2D3E000D5C :101420004C6F633A2020496E7465726E616C205275 :10143000616D204D656D6F727920436F6E74656EBE :1014400074730D004E6577204163632056616C759F :10145000653A20000D517569742073696E676C657B :101460002073746570206D6F64652C206E6F77201B :1014700072756E6E696E67206E6F726D616C6C79DD :101480002E0D0D0044505452003F150203615214BA :10149000AD03A444150B029B4E14BA04FF4814CFAD :1014A00004BD4C14EE056B451525052B0020527527 :1014B0006E2070726F6772616D00204E6577206DCF :1014C000656D6F7279206C6F636174696F6E002057 :1014D0004845582044756D70204D656D6F727920B8 :1014E000746F207468652053637265656E00204CCC :1014F00069737420617373656D626C7920636F64C6 :1015000065002048656C703F3F3F0020446F776E58 :101510006C6F61642070726F6772616D2066726FAC :101520006D205043002045646974206578746572AD :101530006E616C2072616D000C5468657365206388 :101540006F6D6D616E647320617265206375727278 :10155000656E746C7920737570706F727465643A1F :101560000D0D000D416C6C206E756D6572696361C7 :101570006C2076616C756573206172652073686F8D :10158000776E20696E206865782E20205072657312 :1015900073696E67203C4553433E206B6579207725 :1015A000696C6C2065786974207468650D63757268 :1015B00072656E7420636F6D6D616E642C2065764C :1015C000656E207768696C65206C697374696E67F5 :1015D0002F64756D70696E672E20204D6F737420B7 :1015E00070726F6D707473207265717569726520A9 :1015F000610D73696E676C65206368617261637405 :1016000065722C207479706963616C6C79207468E0 :1016100065206669727374206C6574746572206FDE :1016200066207468652064657369726564206F70F4 :1016300074696F6E2E0D0D466F7220696E666F7243 :101640006D6174696F6E20726567617264696E673F :10165000207468652073696E676C652D737465709E :101660002072756E20666561747572652C0D7479D3 :10167000706520273F27207768656E2061736B6552 :1016800064202753696E676C652D737465702F4EE7 :101690006F726D616C27206265666F72652072756E :1016A0006E6E696E67207468652070726F67726114 :1016B0006D2E0D0D000C5468652073696E676C65A6 :1016C00020737465702072756E2066656174757222 :1016D0006520616C6C6F777320796F7520746F2053 :1016E0006578656375746520796F75722070726FA7 :1016F0006772616D2066726F6D206D656D6F7279B6 :101700000D6F6E6520696E737472756374696F6EA8 :1017100020617420612074696D652C207768696C84 :1017200065206D6F6E69746F72696E67207468658D :101730002072656769737465727320616E642069D5 :101740006E737472756374696F6E732E0D497420B5 :101750006974204E4F5420612073696D756C6174FB :10176000696F6E2C207468652070726F6772616D8E :1017700020697320657865637574656420627920DB :1017800074686520383033312F35312070726F63C3 :101790006573736F722E0D45787465726E616C207F :1017A000496E74657272757074202331206D757383 :1017B000742062652068656C64206C6F7720746F9C :1017C000206D616B65207468652073696E676C6558 :1017D00020737465702066756E6374696F6E2E0D6C :1017E0000D4465737069746520617474656D7074FF :1017F0007320746F206D616B652074686520736958 :101800006E676C6520737465702072756E20636FEF :101810006D70617469626C65207769746820616CB1 :101820006C2070726F6772616D732C0D74686572D5 :10183000652077696C6C20616C77617973206265D3 :1018400020736F6D65206261736963206C696D69D7 :10185000746174696F6E732064756520746F20699C :101860007473206E61747572653A0D0D20312D20F0 :1018700045787465726E616C20496E74657272751C :101880007074202331206D757374206E6F74206224 :10189000652064697361626C65642C20652E672E17 :1018A000204D4F562049452C233831680D20322DCC :1018B0002054696D6572202331206D757374206228 :1018C0006520636F72726563746C792067656E65FD :1018D000726174696E672020746865206261756446 :1018E000207261746520666F72207468652073656C :1018F0007269616C20706F72740D20332D20544911 :1019000020616E642052492077696C6C206E6F7480 :1019100020776F726B206E6F726D616C6C792C200A :10192000652E672E20323030333A204A4E42205204 :10193000492C323030332C2075736520736B6970FD :101940002E2E2E0D20342D20496E74657272757006 :1019500074732077696C6C206E6F742067657420D7 :1019600073657276696365206F722077696C6C208D :10197000696E74657272757074207468652073691D :101980006E676C6520737465700D20352D20416283 :101990006F7574203330206279746573206F662010 :1019A0007370616365206D757374206265206C656A :1019B000667420617661696C61626C65206F6E206F :1019C00074686520737461636B210D20362D203F90 :1019D0003F3F20204F746865722070726F626C65A3 :1019E0006D73206D617920616C736F206578697308 :1019F000742C2028746869732070726F6772616D2F :101A000020697320465245452C20796F75206B6EF6 :101A10006F77290D0D506572686170732074686569 :101A200020776F727374206C696D69746174696F6B :101A30006E206F66207468652073696E676C652020 :101A4000737465702072756E206973207468617498 :101A50002069742074616B657320610D76657279FD :101A6000206C6F6E672074696D6520746F206578D7 :101A70006563757465206576656E2073686F727432 :101A800020706965636573206F6620636F64652EDF :101A900020204974206973207265636F6D6D656ED7 :101AA00064656420746861740D61206E6F726D618D :101AB0006C2072756E20626520617474656D70743F :101AC000656420666972737420746F20657374692D :101AD0006D61746520776865726520746865207033 :101AE000726F6772616D20676F65732061737472C6 :101AF00061792C0D74686520617474656D70742053 :101B0000612073696E676C65207374657020617401 :101B10002074686520626567696E6E696E67206F04 :101B20006620746865207175657374696F6E616293 :101B30006C6520636F64652C207769746820610D83 :101B400068617264636F7079206F662074686520C5 :101B5000617373656D626C79206C697374696E670B :101B60002066696C65206F6E2D68616E6420666FFB :101B700072206D656D6F7279206C6F636174696F2F :101B80006E207265666572656E63652E0D0D000CC4 :101B90004265747765656E2073746570732C20746C :101BA0006865206D6F6E69746F7220757365732040 :101BB0006162736F6C7574656C79204E4F20696E2D :101BC0007465726E616C206F722065787465726ED8 :101BD000616C206D656D6F72792E0D486F7765763B :101BE00065722C2061626F757420333020627974C5 :101BF0006573206F6620737461636B20737061631B :101C000065206D757374206265206C656674206153 :101C10007661696C61626C652E2E2E0D0D447572B5 :101C2000696E6720612073696E676C6520737465E7 :101C3000702072756E2C207072657373696E6720E8 :101C400052455455524E2072657065617465646CDE :101C5000792077696C6C20626520746865207573E3 :101C600075616C20636F757273650D6F66206163BB :101C700074696F6E2E2020486F77657665722C2010 :101C80006F74686572206F7074696F6E7320617213 :101C90006520617661696C61626C652E0D0D202096 :101CA00020202020202020202020547970696E6779 :101CB00020273F272077696C6C20646973706C6102 :101CC0007920746869732068656C7020736372652D :101CD000656E0D0D0053696E676C652053746570F9 :101CE00020436F6D6D616E64733A0D0D203C52455B :101CF000543E202020205072696E74205374617409 :101D0000757320616E6420657865637574652074F1 :101D10006865206E65787420696E7374727563747B :101D2000696F6E0D203C53504143453E202045785D :101D30006563757465206E65787420696E7374725E :101D4000756374696F6E20772F6F7574207374617B :101D5000747573206C696E65730D2020273F2720F2 :101D600020202020446973706C6179207468697345 :101D7000206F6E2D6C696E652068656C700D20207B :101D800027522720202020205072696E74206F7502 :101D900074205370656369616C2046756E63746965 :101DA0006F6E205265676973746572730D2020270A :101DB000482720202020204865782064756D7020F9 :101DC000696E7465726E616C2072616D0D202027E2 :101DD00053272020202020536B697020746869737A :101DE00020696E737472756374696F6E0D2020279D :101DF000412720202020204368616E676520746899 :101E00006520416363756D756C61746F7227732013 :101E100076616C75650D2020275127202020202019 :101E2000517569742053696E676C652053746570D1 :101E30002C20636F6E74696E7565206578656375B7 :101E400074696E67206E6F726D616C6C790D0D0038 :00000001FF as31-2.3.1/examples/paulmon1.asm0000644000175000001440000015707610307071452015600 0ustar erazorusers; PAULMON 8051 Debugger by Paul Stoffregen ; Please distribute freely -- may not be sold, period. ; .command +h58 ;set page height to 58 in listing file... .equ start,0000h ;address for start of EPROM (0000h) .equ program,2000h ;address for program loading location .ORG start rst: lJMP poweron .org start+3 ;ext int #0 LJMP program+3 .org start+11 ;timer #0 LJMP program+11 .org start+13h ;external interrupt routine #1 jnb tcon.2,intr0 ljmp program+13h ;don't do ssrun if edge trigger'd intr0: ajmp step ;but do ssrun if level trigger'd .org start+1bh ;timer #1 ljmp program+1bh .org start+23h ;serial port ljmp program+23h .org start+2bh ;timer #2 (8052 only) ljmp program+2bh .org start+30h ;the jump table ajmp cout ajmp cin ajmp phex ajmp phex16 ajmp pstr ajmp ghex ajmp ghex16 ajmp esc ajmp upper ljmp init step: ;this is the single step interrupt processor code... push psw ;better save these while we still can push acc clr psw.3 ;gotta be set to bank zero... clr psw.4 step1: acall cin acall upper step2: cjne a,#13,step7 ajmp status step7: cjne a,#32,step8 ;check space ajmp done step8: cjne a,#'?',step10 ;check '?' acall sshelp ajmp step1 step10: cjne a,#'Q',step11 ;check 'Q'=quit and run normal push dpl push dph mov dptr,#squit acall pstr pop dph pop dpl clr ie.2 ajmp done step11: cjne a,#'H',step12 ;check 'H'=hex dump internal ram acall ssdmp ajmp step1 step12: cjne a,#'R',step13 ;check 'R'=print out registers ajmp ssreg step13: cjne a,#'S',step14 ;check 'S'=skip this inst ajmp skip0 step14: cjne a,#'A',step20 ;check 'A'=change acc value ajmp chacc step20: ajmp step1 pequal: ; prints '=' mov a,#'=' acall cout ret status: ;prints two-line status during single step run mov a,r0 push acc acall space mov a,#'S' acall cout mov a,#'P' acall cout acall pequal mov r0,sp push b acall phex dec r0 acall space lcall pa acall pequal mov a,@r0 acall phex dec r0 acall space lcall prc acall pequal mov a,@r0 mov c,acc.7 clr a rlc a acall phex1 acall space lcall pdptr acall pequal mov a,dph acall phex mov a,dpl acall phex clr a acall pregsn mov r0,sp dec r0 mov a,@r0 acall phex mov a,#1 acall pregsn mov a,r1 acall phex mov a,#2 acall pregsn mov a,r2 acall phex mov a,#3 acall pregsn mov a,r3 acall phex mov a,#4 acall pregsn mov a,r4 acall phex mov a,#5 acall pregsn mov a,r5 acall phex mov a,#6 acall pregsn mov a,r6 acall phex mov a,#7 acall pregsn mov a,r7 acall phex acall newline acall space ;now begin printing the 2nd line mov a,#'P' acall cout lcall prc acall pequal clr c mov a,sp subb a,#4 mov r0,a push dpl push dph lcall inst pop dph pop dpl pop b pop acc mov r0,a done: pop acc pop psw reti sshelp: push dpl push dph acall newline mov dptr,#help5txt acall pstr pop dph pop dpl ret pregsn: push acc acall space mov a,#'R' acall cout pop acc acall phex1 acall pequal ret ssdmp: ;. push 0 push 1 push b push dpl push dph mov dptr,#ssdmps1 acall pstr pop dph pop dpl clr a acall phex mov a,#':' acall cout acall space mov a,r0 acall phex acall space mov a,r1 acall phex mov r0,#2 mov r1,#14 ajmp ssdmp2 ssdmp1: mov a,r0 acall phex mov a,#':' acall cout mov r1,#16 ssdmp2: acall space mov a,@r0 acall phex inc r0 djnz r1,ssdmp2 acall newline cjne r0,#80h,ssdmp1 acall newline pop b pop 1 pop 0 ret ssreg: push b ;. acall space mov a,#'B' acall cout acall pequal mov a,b acall phex acall space mov a,#'P' acall cout mov a,#'S' acall cout mov a,#'W' acall cout acall pequal mov a,r0 push acc mov r0,sp dec r0 dec r0 dec r0 mov a,@r0 acall phex acall space push dpl push dph mov dptr,#sfr3+1 mov r0,0xA8 acall psfr mov dptr,#sfr4+1 mov r0,0xB8 acall psfr mov dptr,#sfr5+1 mov r0,0x89 acall psfr mov dptr,#sfr6+1 mov r0,0x88 acall psfr mov dptr,#sfr7+1 mov r0,0x98 acall psfr mov dptr,#sfr8+1 mov r0,0x87 acall psfr mov a,#'T' acall cout mov a,#'0' acall cout acall pequal mov a,8Ch acall phex mov a,8Ah acall phex acall space mov a,#'T' acall cout mov a,#'1' acall cout acall pequal mov a,8Dh acall phex mov a,8Bh acall phex acall newline pop dph pop dpl pop acc mov r0,a pop b ajmp step1 psfr: acall pstr acall pequal mov a,r0 acall phex acall space ret skip0: ;. push b mov a,r0 push acc mov a,sp clr c subb a,#4 mov r0,a push dpl push dph mov dptr,#sskip1 acall pstr lcall inst ;print skipped instruction r0 points to pc mov a,sp clr c subb a,#6 mov r0,a mov @r0,dph ;actually change the pc! dec r0 mov @r0,dpl mov dptr,#sskip2 acall pstr inc r0 lcall inst ;print new instruction pop dph pop dpl pop acc mov r0,a pop b ajmp step1 chacc: mov a,r0 push acc push b mov r0,sp dec r0 dec r0 push dpl push dph mov dptr,#chaccs1 acall pstr acall ghex jc chacc2 mov @r0,a acall newline pop dph pop dpl pop b pop acc mov r0,a ajmp step1 chacc2: mov dptr,#abort acall pstr pop dph pop dpl pop b pop acc mov r0,a ajmp step1 DownLoad: ;Note, this is a modified version of the ;auto baud rate detection routine from ;MDP/51. Thank You, Kei-Yong Khoo (3-31-87) push dpl push dph mov dptr,#dwlds1 acall pstr ;"begin sending file to abort" dwld0a: aCALL cin CJNE A, #27, DWLD0 ; Test for escape dwldesc:mov dptr,#dwlds2 acall pstr ;"download aborted." pop dph pop dpl ret DWLD0: CJNE a, #0x3A, DWLD0a ; wait for ':' ACALL ghex jc dwldesc MOV R0, A ; R0 = # of data bytes ACALL ghex jc dwldesc MOV DPH, A ; High byte of load address ACALL ghex jc dwldesc MOV DPL, A ; Low byte of load address ACALL ghex ; Record type jc dwldesc CJNE A, #1, DWLD1 ; End record? mov dptr,#dwlds3 acall pstr ;"download went ok..." pop dph pop dpl ret DWLD1: INC R0 ; adjust for repeat loop AJMP DWLD3 DWLD2: ACALL ghex ; Get data byte jc dwldesc MOVX @DPTR, A INC DPTR DWLD3: DJNZ R0, DWLD2 ACALL ghex ; Discard checksum jc dwldesc aJMP DWLD0a INIT: ;Note, this is a modified version of the ;auto baud rate detection routine from ;MDP/51. Thank You, Kei-Yong Khoo (3-31-87) orl PCON,#10000000b ; set double baud rate MOV TMOD,#00010001b MOV SCON,#01010000b ; Set Serial for mode 1 & ; Enable reception ORL TCON,#01010010b ; Start timer 1 both timer mov a,7Bh mov r1,7Ah mov r2,79h mov r3,78h xrl 1,#01010101b xrl 2,#11001100b xrl 3,#00011101b cjne a,1,auto cjne a,2,auto cjne a,3,auto sjmp autoend ;baud rate is known from last time... AUTO: CLR TR1 ; Stop timer 1 MOV TH1, #0 ; Clear timer 1 MOV TL1, #0 JB RXD, * ; Wait for start bit JB RXD,AUTO ; make sure it's not just noise JB RXD,AUTO JB RXD,AUTO JB RXD,AUTO JNB RXD, * ; skip start bit SETB TR1 JB RXD, * JNB RXD, * JB RXD, * JNB RXD, * ; Count 3 more bits CLR TR1 ; Compute baud rate MOV A, TL1 ; divide TH1-TL1 by 128 RLC A MOV A, TH1 RLC A CPL A INC A ; 2's complement mov b,a ; store the reload value four times mov 7Bh,a ;so that it might be there later xrl a,#01010101b ;we'll store the reload value mov 7Ah,a ;four times, just to be safe mov a,b xrl a,#11001100b mov 79h,a mov a,b xrl a,#00011101b mov 78h,a mov a,b autoend:MOV TH1,A mov tmod,#00100001b ;now it's 8 bit auto-reload SETB TR1 RET HELP: push dpl push dph MOV DPTR,#HELP1txt ACALL PSTR mov dptr,#cmd_tbl clr a help0: movc a,@a+dptr jz help_2 inc dptr acall space acall cout mov r0,#4 help1: acall space djnz r0,help1 clr a movc a,@a+dptr ;(high) mov b,a inc dptr clr a movc a,@a+dptr ;(low) inc dptr inc dptr inc dptr push dpl push dph mov dpl,a mov dph,b clr a acall pstr acall newline pop dph pop dpl sjmp help0 help_2: mov dptr,#help2txt acall pstr pop dph pop dpl RET run: push dpl push dph mov dptr,#prompt6 acall pstr acall cin acall upper cjne a,#27,run1 mov dptr,#abort ;if they press acall pstr pop dph pop dpl ret run1: cjne a,#'?',run3 mov dptr,#help3txt ;if they pressed ? acall pstr mov dptr,#prompt7 acall pstr acall cin cjne a,#27,run2 pop dph pop dpl ret run2: mov dptr,#help4txt acall pstr mov dptr,#help5txt acall pstr pop dph pop dpl ret run3: cjne a,#'S',run4 mov dptr,#runss acall pstr ajmp ssrun run4: mov dptr,#runstd acall pstr mov dptr,#prompt8 ;run the user's program acall pstr pop dph pop dpl acall phex16 push dpl push dph mov dptr,#prompt4 acall pstr pop dph pop dpl acall ghex16 jnc run5 mov dptr,#abort acall pstr ret run5: mov a,#'\r' acall cout push dpl push dph mov dptr,#runs1 acall pstr pop dph pop dpl mov a,#rst & 0xFF push acc mov a,#rst push acc push dpl push dph ret ;<-- actually jumps to user's program ssrun: mov dptr,#prompt8 ;run single step acall pstr pop dph pop dpl push dpl push dph acall phex16 mov dptr,#prompt4 acall pstr pop dph pop dpl acall ghex16 push dpl push dph jnc ssrun1 mov dptr,#abort acall pstr acall newline pop dph pop dpl ret ssrun1: clr tcon.2 jnb p3.3,ssrun2 mov dptr,#sserr1 ;give error msg if int1 not grounded acall pstr pop dph pop dpl ret ssrun2: mov dptr,#prompt9 ;ask for priority acall pstr acall cin acall upper cjne a,#27,ssrun3 mov dptr,#abort acall pstr pop dph pop dpl ret ssrun3: cjne a,#'L',ssrun4 mov ip,#00000000b sjmp ssrun5 ssrun4: mov ip,#00000100b ssrun5: mov dptr,#ssmsg ;tell 'em it now time, remind to acall pstr ;to hit for next inst pop dph pop dpl mov sp,#38h mov a,#rst & 0xFF push acc mov a,#0 push acc clr a clr c mov r0,#0 mov r1,#1 mov r2,#0 mov r3,#0 mov r4,#0 mov r5,#0 mov r6,#0 mov r7,#0 clr tcon.2 setb p3.3 mov ie,#10000100b jmp @a+dptr dump: mov r2,#16 ;number of lines to print acall newline dump1: mov r0,#20h ;pointer to memory to store bytes acall phex16 mov a,#':' acall cout mov a,#' ' acall cout dump2: clr A ;<--acquire 16 bytes movc a,@a+dptr ;and store from 20 to 2F mov @r0,a acall phex mov a,#' ' acall cout inc dptr inc r0 cjne r0,#30h,dump2 acall cout mov r0,#20h ;now we'll print it in ascii dump3: mov a,@r0 anl a,#01111111b ;avoid unprintable characters mov b,a clr c subb a,#20h jnc dump4 mov b,#' ' dump4: mov a,b acall cout inc r0 cjne r0,#30h,dump3 acall newline acall esc jc dump5 djnz r2,dump1 ;loop back up to print next line dump5: acall newline ret new_loc:push dph push dpl acall newline mov dptr,#prompt5 acall pstr pop dpl pop dph push dph push dpl acall ghex16 acall newline jc newloc1 acall newline pop acc pop acc ret newloc1:mov dptr,#abort acall pstr pop dpl pop dph acall newline ret edit: ;edit external ram... push dpl push dph mov dptr,#edits1 acall pstr pop dph pop dpl edit1: acall phex16 mov a,#':' acall cout acall space mov a,#'(' acall cout movx a,@dptr acall phex push dpl push dph mov dptr,#prompt10 acall pstr acall ghex jb psw.5,edit2 jc edit2 pop dph pop dpl movx @dptr,a acall newline inc dptr ajmp edit1 edit2: mov dptr,#edits2 acall pstr pop dph pop dpl ret list: ;prints out dis-assembly list of memory mov r2,#18 ;# of lines to list acall newline list1: mov a,r2 push acc acall disasm ;this obviously does all the work pop acc mov r2,a acall esc jc list2 djnz r2,list1 list2: acall newline ret CIN: JNB RI,cin ; wait for character CLR RI MOV A,SBUF RET COUT: ;note, improved... much faster transmission jnb ti,* ;wait if a character is still sending MOV SBUF,A CLR TI ;note: hardware will set ti when the RET ; character finishes sending... esc: ;checks to see if is waiting on serial port. ;C=clear if no , C=set if pressed, buffer flushed push acc clr c jnb ri,esc1 mov a,sbuf cjne a,#27,esc1 setb c clr ri esc1: pop acc ret NEWLINE: PUSH ACC MOV A,#'\r' ACALL COUT POP ACC RET g1hex: ;gets one character. Converts to hex and places in Acc ;C=1 if pressed, 0 otherwise ;PSW.5=1 if pressed, 0 otherwise ;PSW.2=1 if backspace or delete, 0 otherwise (not yet) acall cin acall upper clr c clr psw.5 clr psw.2 cjne a,#13,g1hex2 setb psw.5 ret g1hex2: cjne a,#27,g1hex2a cpl c ret g1hex2a:cjne a,#8,g1hex2c g1hex2b:setb psw.2 ret g1hex2c:cjne a,#127,g1hex3 sjmp g1hex2b g1hex3: push b mov b,a acall asc2hex jc g1hex4 ;they typed a bad char, so go back xch a,b acall cout xch a,b pop b ret g1hex4: pop b sjmp g1hex ghex: ; gets an 8-bit hex value from keyboard, returned in A. ; C=1 if pressed, 0 otherwise ; PSW.5 if pressed w/ no input, 0 otherwise acall g1hex jnb psw.5,ghex1 ret ghex1: jnc ghex2 ret ghex2: swap a mov b,a ghex3: acall g1hex jb psw.2,ghex6 jnb psw.5,ghex4 clr psw.5 mov a,b swap a ret ghex4: jnc ghex5 ret ghex5: orl a,b ret ghex6: mov a,#8 acall cout sjmp ghex ghex16: ; gets a 16-bit hex value from keyboard, returned in DPTR. ; C=0 if normal , C=1 if pressed push acc mov a,r0 push acc mov a,r1 push acc mov a,r2 push acc mov a,r3 push acc ghex16a:acall g1hex ;get first character mov r0,a jc ghex16z jb psw.5,ghex16z jb psw.2,ghex16a ghex16e:acall g1hex ;get second character mov r1,a jc ghex16z jb psw.5,ghex16s jnb psw.2,ghex16i mov a,#8 acall cout sjmp ghex16a ghex16i:acall g1hex ;get third character mov r2,a jc ghex16z jb psw.5,ghex16t jnb psw.2,ghex16m mov a,#8 acall cout sjmp ghex16e ghex16m:acall g1hex ;get fourth character mov r3,a jc ghex16z jb psw.5,ghex16u jnb psw.2,ghex16v mov a,#8 acall cout sjmp ghex16i ghex16s:mov dph,#0 ;one digit entered mov dpl,r0 sjmp ghex16z ghex16t:mov dph,#0 ;two digit entered mov a,r0 swap a orl a,r1 mov dpl,a sjmp ghex16z ghex16u:mov dph,r0 ;three digit entered mov a,r1 swap a orl a,r2 mov dpl,a sjmp ghex16z ghex16v:mov a,r0 ;all four digit entered swap a orl a,r1 mov dph,a mov a,r2 swap a orl a,r3 mov dpl,a ghex16z:pop acc ;exit, at last... mov r3,a pop acc mov r2,a pop acc mov r1,a pop acc mov r0,a pop acc ret PHEX: PUSH ACC SWAP A ACALL PHEX1 POP ACC ACALL PHEX1 RET PHEX1: ANL A,#0FH ADD A,#3 MOVC A,@A+PC ACALL COUT RET .DB "0123456789ABCDEF" asc2hex: ;carry set if invalid input clr c push b subb a,#'0' mov b,a subb a,#10 jc a2h1 mov a,b subb a,#7 mov b,a a2h1: mov a,b clr c anl a,#11110000b ;just in case... jz a2h2 setb c a2h2: mov a,b pop b ret upper: ;converts the ascii code in Acc to uppercase, if it is lowercase push b mov b,a clr c subb a,#61h jc upper1; not a lowercase character subb a,#26 jnc upper1 clr c mov a,b subb a,#20h mov b,a upper1: mov a,b pop b ret space: push acc mov a,#' ' acall cout pop acc ret PHEX16: PUSH ACC MOV A,DPH ACALL PHEX MOV A,DPL ACALL PHEX POP ACC RET PSTR: ;print string PUSH ACC PSTR1: CLR A MOVC A,@A+DPTR jb ri,pstr3 JZ PSTR2 mov c,acc.7 anl a,#01111111b jnb ti,* ;wait for last character to finish sending mov sbuf,a clr ti Jc pstr2 inc dptr SJMP PSTR1 PSTR2: POP ACC RET pstr3: clr ri mov a,sbuf cjne a,#27,pstr1 mov a,#13 acall cout sjmp pstr2 disasm: ;prints out instruction @dptr, and advances dptr acall phex16 ;they'd like to know the address... clr a movc a,@a+dptr inc dptr mov r3,a push dph push dpl mov dptr,#mnot ;mnot=mnunonic offset table movc a,@a+dptr mov r2,a mov a,r3 mov dptr,#opot ;opot=operand offset table movc a,@a+dptr mov r6,a ;these 2 tables are a bitch to enter!!! anl a,#11111100b rr a rr a mov r7,a mov a,r6 anl a,#00000011b pop dpl pop dph mov r6,a dec a jz disasm1 push acc clr a movc a,@a+dptr ;fetch 2nd byte (if nec) inc dptr mov r4,a pop acc dec a jz disasm1 clr a movc a,@a+dptr ;fetch 3rd byte (if nec) inc dptr mov r5,a disasm1:acall disasm4 ;prints the bytes+spaces push dpl push dph mov dptr,#mnu_tbl ;mnu_tlb: table with actual text... acall disasm5 ;prints the mnenonic+spaces mov a,r7 mov r0,a pop acc pop b push b push acc mov r6,a ;(high) in case of ajmp or acall or rel mov a,b mov r7,a ;(low) mov a,r0 dec a clr c rlc a mov b,#dasm2 & 0xff ;(low) push b mov b,#dasm2 / 256 ;(high) push b mov dptr,#oprt ;oprt=operand routine table jmp @a+dptr dasm2: pop dph pop dpl acall newline ret disasm4:mov a,#':' ;print bytes and some punctuation acall cout acall space mov a,r3 acall phex acall space cjne r6,#1,dis4a mov r1,#11 sjmp dis4c dis4a: mov a,r4 acall phex acall space cjne r6,#2,dis4b mov r1,#8 sjmp dis4c dis4b: mov a,r5 acall phex mov r1,#6 dis4c: acall space djnz r1,dis4c ret disasm5:mov r0,#7+1 ;prints the mnunonic+spaces dis5a: mov a,r2 MOVC A,@A+DPTR INC r2 dec r0 mov c,acc.7 anl a,#01111111b acall cout Jc dis5b SJMP dis5a dis5b: acall space djnz r0,dis5b RET ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; ; 2k page boundry must exist between these dividers ; ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; prompt1:.db ">Loc=",0 prompt2:.db ": (Version 1.0) Command>",0 prompt3:.db "Location (",0 prompt4:.db "=Default): ",0 prompt5:.db "New memory pointer location: ",0 prompt6:.db "\rS=Single Step, N=Normal (default), ?=Help >",0 prompt7:.db "Press any key: ",0 prompt8:.db "\r\rRun from memory loaction (",0 prompt9:.db "\r\rInterrupt priority> " .db "L=Low, H=High (default): ",0 prompt10:.db ") New Value: ",0 abort: .db " Command Aborted!\r",0 ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; ; 2k page boundry must exist between these dividers ; ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-; oprt: ajmp opcd1 ;addr11 ajmp opcd2 ;A,Rn ajmp opcd3 ;A,direct ajmp opcd4 ;A,@Ri ajmp opcd5 ;A,#data ajmp opcd6 ;direct,A ajmp opcd7 ;direct,#data ajmp opcd8 ;C,bit ajmp opcd9 ;C,/bit ajmp opcd10 ;A,direct,rel ajmp opcd11 ;A,#data,rel ajmp opcd12 ;Rn,#data,rel ajmp opcd13 ;@Ri,#data,rel ajmp opcd14 ;A ajmp opcd15 ;C ajmp opcd16 ;bit ajmp opcd17 ;direct ajmp opcd18 ;@Ri ajmp opcd19 ;AB ajmp opcd20 ;Rn,rel ajmp opcd21 ;direct,rel ajmp opcd22 ;Rn ajmp opcd23 ;DPTR ajmp opcd24 ;bit,rel ajmp opcd25 ;rel ajmp opcd26 ;@A+DPTR ajmp opcd27 ;addr16 ajmp opcd28 ;Rn,A ajmp opcd29 ;Rn,direct ajmp opcd30 ;Rn,#data ajmp opcd31 ;direct,Rn ajmp opcd32 ;direct,direct ajmp opcd33 ;direct,@Ri ajmp opcd34 ;@Ri,A ajmp opcd35 ;@Ri,direct ajmp opcd36 ;@Ri,#data ajmp opcd37 ;bit,C ajmp opcd38 ;DPTR,#data16 ajmp opcd39 ;A,@A+DPTR ajmp opcd40 ;A,@A+PC ajmp opcd41 ;A,@DPTR ajmp opcd42 ;@DPTR,A ajmp opcd43 ; p_reg_n:mov a,#'R' lcall cout mov a,r3 anl a,#00000111b lcall phex1 ret p_reg_i:mov a,#'@' lcall cout mov a,#'R' lcall cout mov a,r3 anl a,#00000001b lcall phex1 ret pdirect: mov a,r4 jb acc.7,pdir1 pdir0: mov a,r4 lcall phex ret pdir1: mov dptr,#sfrmnu pdir2: clr a movc a,@a+dptr inc dptr jz pdir0 mov r0,a clr c subb a,r4 jnz pdir3 lcall pstr ret pdir3: clr a movc a,@a+dptr inc dptr jnb acc.7,pdir3 sjmp pdir2 pbit: mov a,r4 anl a,#01111000b rl a swap a mov r0,a mov a,r4 anl a,#10000000b jz pbit1 mov dptr,#bitptr ;it's a Special Function Reg. mov a,r0 movc a,@a+dptr mov dptr,#bitmnu addc a,dpl mov dpl,a jnc pbit0 inc dph pbit0: lcall pstr sjmp pbit2 pbit1: mov a,r0 ;it's between 20h and 2Fh add a,#20h lcall phex pbit2: mov a,#'.' lcall cout mov a,r4 anl a,#00000111b lcall phex1 ret prel: mov a,r4 jb acc.7,prel4 clr c addc a,r7 mov r7,a jnc prel8 inc r6 sjmp prel8 prel4: cpl a inc a mov r4,a mov a,r7 clr c subb a,r4 mov r7,a jnc prel8 dec r6 prel8: mov a,r6 lcall phex mov a,r7 lcall phex ret opcd1: mov a,r6 ;addr11 done anl a,#11111000b mov r0,a mov a,r3 swap a rr a anl a,#00000111b orl a,r0 lcall phex mov a,r4 lcall phex ret opcd2: ;A,Rn done acall pac acall p_reg_n ret opcd3: ;A,direct done acall pac acall pdirect ret opcd4: ;A,@Ri done acall pac acall p_reg_i ret opcd5: ;A,#data done acall pa pdata: acall pcomma acall plb mov a,r4 lcall phex ret opcd6: ;direct,A done acall pdirect acall pcomma acall pa ret opcd7: ;direct,#data done acall pdirect mov a,r5 mov r4,a ajmp pdata opcd8: ;C,bit done acall prc acall pcomma acall pbit ret opcd9: ;C,/bit done acall prc acall pcomma mov a,#'/' lcall cout acall pbit ret opcd10: ;A,direct,rel done acall pac acall pdirect opcd10a:acall pcomma mov a,r5 mov r4,a acall prel ret opcd11: ;A,#data,rel done acall pa opcd11a:acall pcomma acall plb mov a,r4 lcall phex ajmp opcd10a opcd12: ;Rn,#data,rel done acall p_reg_n ajmp opcd11a opcd13: ;@Ri,#data,rel done acall p_reg_i ajmp opcd11a opcd14: ;A done acall pa ret opcd15: ;C done acall prc ret opcd16: ;bit done acall pbit ret opcd17: ;direct done acall pdirect ret opcd18: ;@Ri done acall p_reg_i ret opcd19: ;AB done acall pa mov a,#'B' lcall cout ret opcd20: ;Rn,rel done acall p_reg_n acall pcomma acall prel ret opcd21: ;direct,rel done acall pdirect ajmp opcd10a opcd22: ;Rn done acall p_reg_n ret opcd23: ;DPTR done acall pdptr ret opcd24: ;bit,rel done acall pbit ajmp opcd10a opcd25: ;rel done acall prel ret opcd26: ;@A+DPTR done acall pat acall pa mov a,#'+' lcall cout acall pdptr ret opcd28: ;Rn,A done acall p_reg_n acall pcomma acall pa ret opcd29: ;Rn,direct done acall p_reg_n acall pcomma acall pdirect ret opcd30: ;Rn,#data done acall p_reg_n ajmp pdata opcd31: ;direct,Rn done acall pdirect acall pcomma acall p_reg_n ret opcd32: ;direct,direct done mov a,r4 push acc mov a,r5 mov r4,a acall pdirect acall pcomma pop acc mov r4,a acall pdirect ret opcd33: ;direct,@Ri done acall pdirect acall pcomma acall p_reg_i ret opcd34: ;@Ri,A done acall p_reg_i acall pcomma acall pa ret opcd35: ;@Ri,direct done acall p_reg_i acall pcomma acall pdirect ret opcd36: ;@Ri,#data done acall p_reg_i ajmp pdata opcd37: ;bit,C done acall pbit acall pcomma acall prc ret opcd38: ;DPTR,#data16 done acall pdptr acall pcomma acall plb opcd27: mov a,r4 ;addr16 done lcall phex mov a,r5 lcall phex ret opcd39: ;A,@A+DPTR done acall pac acall pat acall pa mov a,#'+' lcall cout acall pdptr ret opcd40: ;A,@A+PC done acall pac acall pat acall pa mov a,#'+' lcall cout mov a,#'P' lcall cout acall prc ret opcd41: ;A,@DPTR done acall pac acall pat acall pdptr ret opcd42: ;@DPTR,A done acall pat acall pdptr acall pcomma acall pa opcd43: ret ; done pat: ;prints the '@' symbol mov a,#'@' lcall cout ret pcomma: ;prints a comma mov a,#',' lcall cout lcall space ret plb: ;prints the '#' symbol mov a,#'#' lcall cout ret pa: ;prints 'A' mov a,#'A' lcall cout ret prc: ;prints 'C' mov a,#'C' lcall cout ret pac: ;print "A," acall pa acall pcomma ret pdptr: ;prints DPTR push dph push dpl mov dptr,#sdptr lcall pstr pop dpl pop dph ret poweron: MOV SP,#30H clr psw.3 ;set for register bank 0 (init needs it) clr psw.4 LCALL INIT setb ti ;ti is normally set in this program clr ri ;ri is normallt cleared mov r0,#8 lcall newline djnz r0,* MOV DPTR,#logon lCALL PSTR mov dptr,#program MENU: PUSH DPL PUSH DPH MOV DPTR,#PROMPT1 lCALL PSTR POP DPH POP DPL lCALL PHEX16 PUSH DPL PUSH DPH MOV DPTR,#PROMPT2 lCALL PSTR lCALL CIN ;GET THE INPUT CHARACTER lcall upper .equ char, 0x20 MOV CHAR,A MOV DPTR,#CMD_TBL ;BEGIN SEARCH THRU THE TABLE MENU1: CLR A MOVC A,@A+DPTR JZ MENU3 ;JUMP IF END OF TABLE REACHED CJNE A,CHAR,MENU2 ;JUMP IF THIS IS NOT THE COMMAND TYPED INC DPTR ;OK, SO THIS IS THE RIGHT ONE... CLR A MOVC A,@A+DPTR PUSH Acc INC DPTR CLR A MOVC A,@A+DPTR pop b push dpl push dph MOV DPL,A mov DPH,b lCALL PSTR ;PRINT THE COMMAND NAME lCALL NEWLINE pop dph pop dpl INC DPTR CLR A MOVC A,@A+DPTR MOV 22h,A CLR A INC DPTR MOVC A,@A+DPTR mov 21h,a POP 23h POP 24h mov dptr,#menu push dpl push dph mov dpl,24h mov dph,23h PUSH 21h PUSH 22h RET ;SIMULATED CALL TO THE ROUTINE lJMP MENU MENU2: INC DPTR ;SKIP THIS TABLE ENTRY INC DPTR INC DPTR INC DPTR INC DPTR lJMP MENU1 MENU3: POP DPH ;NOW WE TELL 'EM THEY TYPED POP DPL ;AN ILLEGAL CHARACTER lCALL NEWLINE lJMP MENU ;this prints the instructions for status and skip in single-step inst: mov a,r1 ;r0 must point to pc push acc mov a,r2 push acc mov a,r3 push acc mov a,r4 push acc mov a,r5 push acc mov a,r6 push acc mov a,r7 push acc mov dph,@r0 ;put pc into dptr for disasm dec r0 mov dpl,@r0 lcall disasm pop acc mov r7,a pop acc mov r6,a pop acc mov r5,a pop acc mov r4,a pop acc mov r3,a pop acc mov r2,a pop acc mov r1,a ret ;---------------------------------------------------------; ; ; ; Here begins the data tables and strings: ; ; ; ;---------------------------------------------------------; logon: .db "\r \r " .db 12,"Welcome to the new and possibly even " .db "improved 8031 monitor/debugger\r" .db "by Paul Stoffregen on 14-OCT-91 " .db "for no good reason whatsoever...\r\r" ;columbs 1234567890123456789012345678901234567890 .db "These are some of the features offered " .db "by this particular debugger:\r\r" .db " Download programs from PC " .db "User-Friendliness!!!!!\r" .db " Run Program " .db "Uses no external RAM\r" .db " (Normal, or single-step) " .db " key is supported\r" .db " List assemble code from memory " .db "automatic baud rate detection\r" .db " Hex Dump and Edit external RAM " .db "On-line help (type '?')\r" .db "\rHowever, you don't get somethin' for " .db "nothin'... The code for this debugger\r" .db "requires quite a bit more room than is " .db "typical for a debugger, but it will all\r" .db "fit into a 2764 (8K x 8) EPROM.\r" .db "\rNO Copyright!! Please distribute freely. " .db "Make as many copies as you want.\r\r\r",0 mnu_tbl:.db "ACAL",'L'+128 ;comma is ok .db "AD",'D'+128,' ' .db "ADD",'C'+128 .db "AJM",'P'+128 .db "AN",'L'+128 .DB "CJN",'E'+128 .DB "CL",'R'+128 .DB "CP",'L'+128 .DB "D",'A'+128 .DB "DE",'C'+128 .DB "DI",'V'+128 .DB "DJN",'Z'+128 .DB "IN",'C'+128 .DB "J",'B'+128 .DB "JB",'C'+128 .DB "J",'C'+128 .DB "JM",'P'+128 .DB "JN",'B'+128 .DB "JN",'C'+128 .DB "JN",'Z'+128 .DB "J",'Z'+128 .DB "LCAL",'L'+128 .DB "LJM",'P'+128 .DB "MO",'V'+128 .DB "MOV",'C'+128 .DB "MOV",'X'+128 .DB "MU",'L'+128 .DB "NO",'P'+128 .DB "OR",'L'+128 .DB "PO",'P'+128 .DB "PUS",'H'+128 .DB "RE",'T'+128 .DB "RET",'I'+128 .DB "R",'L'+128 .DB "RL",'C'+128 .DB "R",'R'+128 .DB "RR",'C'+128 .DB "SET",'B'+128 .DB "SJM",'P'+128 .DB "SUB",'B'+128 .DB "SWA",'P'+128 .DB "XC",'H'+128 .DB "XCH",'D'+128 .DB "XR",'L'+128 .DB "??",'?'+128,0 bitmnu: .db 'P','0'+128 .db "TCO",'N'+128 .db 'P','1'+128 .db "SCO",'N'+128 .DB 'P','2'+128 .DB 'I','E'+128 .DB 'P','3'+128 .DB 'I','P'+128 .DB 'C','0'+128 .DB "T2CO",'N'+128 .DB "PS",'W'+128 .DB 'D','8'+128 .DB "AC",'C'+128 .DB 'E'+'8'+128 .DB 'B'+128 .DB 'F'+'8'+128 .DB 0 sfrmnu: .db 0xE0,"AC",'C'+128 .db 0x81,'S','P'+128 .DB 0x82,"DP",'L'+128 .DB 0x83,"DP",'H'+128 .DB 0x80,'P','0'+128 .DB 0x90,'P','1'+128 .DB 0xA0,'P','2'+128 .DB 0xB0,'P','3'+128 .DB 0x99,"SBU",'F'+128 .DB 0xCD,"TH",'2'+128 .DB 0xC8,"T2CO",'N'+128 .DB 0xCC,"TL",'2'+128 .DB 0xCB,"RCAP2",'H'+128 .DB 0xCA,"RCAP2",'L'+128 .DB 0x8C,"TH",'0'+128 .DB 0x8A,"TL",'0'+128 .DB 0x8D,"TH",'1'+128 .DB 0x8B,"TL",'1'+128 sfr1: .db 0xF0,'B'+128 ;5 sfr2: .db 0xD0,"PS",'W'+128 ;7 sfr3: .DB 0xA8,'I','E'+128 sfr4: .DB 0xB8,'I','P'+128 sfr5: .DB 0x89,"TMO",'D'+128 ;8 sfr6: .DB 0x88,"TCO",'N'+128 ;8 sfr7: .DB 0x98,"SCO",'N'+128 ;8 sfr8: .DB 0x87,"PCO",'N'+128 ;8 .DB 0 mnot: ;mnunonic offset table (gives offset into above table) .db 5Ah,0Eh,48h,73h,2Bh,2Bh,2Bh,2Bh .DB 2Bh,2Bh,2Bh,2Bh,2Bh,2Bh,2Bh,2Bh ;INC .DB 30h,00h,43h,75h,21h,21h,21h,21h .DB 21h,21h,21h,21h,21h,21h,21h,21h ;DEC .DB 2Eh,0Eh,67h,6Eh,06h,06h,06h,06h .DB 06h,06h,06h,06h,06h,06h,06h,06h ;ADD .DB 38h,00h,6Ah,70h,0Ah,0Ah,0Ah,0Ah .DB 0Ah,0Ah,0Ah,0Ah,0Ah,0Ah,0Ah,0Ah ;ADDC .DB 33h,0Eh,5Dh,5Dh,5Dh,5Dh,5Dh,5Dh .DB 5Dh,5Dh,5Dh,5Dh,5Dh,5Dh,5Dh,5Dh ;ORL .DB 3Bh,00h,12h,12h,12h,12h,12h,12h .DB 12h,12h,12h,12h,12h,12h,12h,12h ;ANL .DB 41h,0Eh,8Fh,8Fh,8Fh,8Fh,8Fh,8Fh .DB 8Fh,8Fh,8Fh,8Fh,8Fh,8Fh,8Fh,8Fh ;XLR .DB 3Eh,00h,5Dh,35h,4Ch,4Ch,4Ch,4Ch .DB 4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch ;MOV .DB 7Ch,0Eh,12h,4Fh,24h,4Ch,4Ch,4Ch .DB 4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch ;MOV .DB 4Ch,00h,4Ch,4Fh,80h,80h,80h,80h .DB 80h,80h,80h,80h,80h,80h,80h,80h ;SUBB .DB 5Dh,0Eh,4Ch,2Bh,57h,92h,4Ch,4Ch .DB 4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch ;MOV .DB 12h,00h,1Ch,1Ch,15h,15h,15h,15h .DB 15h,15h,15h,15h,15h,15h,15h,15h ;CJNE .DB 63h,0Eh,19h,19h,84h,88h,88h,88h .DB 88h,88h,88h,88h,88h,88h,88h,88h ;XCH .DB 60h,00h,78h,78h,1Fh,27h,8Bh,8Bh .DB 27h,27h,27h,27h,27h,27h,27h,27h ;DJNZ .DB 53h,0Eh,53h,53h,19h,4Ch,4Ch,4Ch .DB 4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch ;MOV .DB 53h,00h,53h,53h,1Ch,4Ch,4Ch,4Ch .DB 4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch,4Ch ;MOV bitptr: .db 00h,02h,06h,08h,0Ch,0Eh,10h,12h .db 14h,16h,1Bh,1Eh,20h,23h,24h,25h opot: ;opcode offset table (gives #bytes for the instruction ;and the number of the routine to print the operands) .db 43*4+1,1*4+2,27*4+3,14*4+1 ;00 .db 14*4+1,17*4+2,18*4+1,18*4+1 .db 89,89,89,89,89,89,89,89 ;inc .db 24*4+3,1*4+2,27*4+3,14*4+1 ;10 .db 14*4+1,17*4+2,18*4+1,18*4+1 .db 89,89,89,89,89,89,89,89 ;dec .db 24*4+3,1*4+2,43*4+1,14*4+1 ;20 .db 5*4+2,3*4+2,4*4+1,4*4+1 .db 9,9,9,9,9,9,9,9 ;add .db 24*4+3,1*4+2,43*4+1,14*4+1 ;30 .db 5*4+2,3*4+2,4*4+1,4*4+1 .db 9,9,9,9,9,9,9,9 ;addc .db 25*4+2,1*4+2,6*4+2,7*4+3 ;40 .db 5*4+2,3*4+2,4*4+1,4*4+1 .db 9,9,9,9,9,9,9,9 ;orl .db 25*4+2,1*4+2,6*4+2,7*4+3 ;50 .db 5*4+2,3*4+2,4*4+1,4*4+1 .db 9,9,9,9,9,9,9,9 ;anl .db 25*4+2,1*4+2,6*4+2,7*4+3 ;60 .db 5*4+2,3*4+2,4*4+1,4*4+1 .db 9,9,9,9,9,9,9,9 ;xrl .db 25*4+2,1*4+2,8*4+2,26*4+1 ;70 .db 5*4+2,7*4+3,36*4+2,33*4+2 .db 122,122,122,122,122,122,122,122 ;mov .db 25*4+2,1*4+2,34,40*4+1 ;80 .db 19*4+1,32*4+3,33*4+2,33*4+2 .db 126,126,126,126,126,126,126,126 ;mov .db 38*4+3,1*4+2,37*4+2,39*4+1 ;90 .db 5*4+2,3*4+2,4*4+1,4*4+1 .db 9,9,9,9,9,9,9,9 ;subb .db 9*4+2,1*4+2,8*4+2,23*4+1 ;A0 .db 19*4+1,43*4+1,35*4+2,35*4+2 .db 118,118,118,118,118,118,118,118 ;mov .db 9*4+2,1*4+2,16*4+2,15*4+1 ;B0 .db 11*4+3,10*4+3,13*4+3,13*4+3 .db 51,51,51,51,51,51,51,51 ;cjne .db 17*4+2,1*4+2,16*4+2,15*4+1 ;C0 .db 14*4+1,3*4+2,4*4+1,4*4+1 .db 9,9,9,9,9,9,9,9 ;xch .db 17*4+2,1*4+2,16*4+2,15*4+1 ;D0 .db 14*4+1,21*4+3,4*4+1,4*4+1 .db 82,82,82,82,82,82,82,82 ;djnz .db 41*4+1,1*4+2,4*4+1,4*4+1 ;E0 .db 14*4+1,3*4+2,4*4+1,4*4+1 .db 9,9,9,9,9,9,9,9 ;mov .db 42*4+1,1*4+2,34*4+1,34*4+1 ;F0 .db 14*4+1,6*4+2,34*4+1,34*4+1 .db 113,113,113,113,113,113,113,113 ;mov edits1: .db "\rEditing External RAM... to quit\r",0 edits2: .db " Editing finished, this location unchanged\r\r",0 dwlds1: .db "\r\rBegin ascii transmission of " .db "Intel HEX format file, " .db "or to abort\r\r",0 dwlds2: .db "Download aborted by user\r\r",0 dwlds3: .db "\r\r\r\rDownload completed\r\r",0 runstd: .db "Run normally",0 runs1: .db "\rNow running the program...\r\r",0 runss: .db "Run in single step mode",0 sserr1: .db "\r\rThe single step run feature will not function" .db " unless INT1 (pin #13) is\r" .db "connected to ground or otherwise held low.\r\r",0 ssmsg: .db "\rNow running in single step mode: " .db "=default, ?=Help\r\r",0 sskip1: .db "Skipping ------>",0 sskip2: .db "Next will be -->",0 ssdmps1:.db "\rLoc: Internal Ram Memory Contents\r",0 chaccs1:.db "New Acc Value: ",0 squit: .db "\rQuit single step mode, now running normally.\r\r",0 sdptr: .db "DPTR",0 CMD_TBL:.DB '?' .DW CMD_hlp .DW HELP .db 'R' .dw CMD_run .dw run .db 'D' .dw CMD_dwl .dw download .db 'N' .dw CMD_new .dw new_loc .db 'H' .dw CMD_dmp .dw dump .db 'L' .dw CMD_lst .dw list .db 'E' .dw CMD_edt .dw edit .DB 00h CMD_run:.db " Run program",0 CMD_new:.db " New memory location",0 CMD_dmp:.db " HEX Dump Memory to the Screen",0 CMD_lst:.db " List assembly code",0 CMD_hlp:.DB " Help???",0 CMD_dwl:.Db " Download program from PC",0 CMD_edt:.db " Edit external ram",0 Help1txt: .db 12,"These commands are currently " .db "supported:\r\r",0 help2txt: ; 1234567890123456789012345678901234567890 .db "\rAll numerical values are shown in hex. " .db "Pressing key will exit the\r" .db "current command, even while listing/dumping. " .db "Most prompts require a\r" .db "single character, typically the first letter " .db "of the desired option.\r\rFor information " .db "regarding the single-step run feature,\r" .db "type '?' when asked 'Single-step/Normal' " .db "before running the program.\r\r",0 Help3txt: ; 1234567890123456789012345678901234567890 .db 12,"The single step run feature allows you " .db "to execute your program from memory\r" ;1 .db "one instruction at a time, while monitoring " .db "the registers and instructions.\r" ;2 .db "It it NOT a simulation, the program is " .db "executed by the 8031/51 processor.\r" ;3 .db "External Interrupt #1 must be held low " .db "to make the single step function.\r" ;4 .db "\r" ;5 .db "Despite attempts to make the single " .db "step run compatible with all programs,\r" ;6 .db "there will always be some basic limitations " .db "due to its nature:\r\r" ;7 8 .db " 1- External Interrupt #1 must not be" .db " disabled, e.g. MOV IE,#81h\r" ;9 .db " 2- Timer #1 must be correctly generating " .db " the baud rate for the serial port\r" ;10 .db " 3- TI and RI will not work normally, " .db "e.g. 2003: JNB RI,2003, use skip...\r" ;11 .db " 4- Interrupts will not get service " .db "or will interrupt the single step\r" ;12 .db " 5- About 30 bytes of space must be " .db "left available on the stack!\r" ;13 .db " 6- ??? Other problems may also " .db "exist, (this program is FREE, you know)\r" ;14 ; 1234567890123456789012345678901234567890 .db "\r" ;15 .db "Perhaps the worst limitation of the " .db "single step run is that it takes a\r" ;16 .db "very long time to execute even short " .db "pieces of code. It is recommended that\r" ;17 .db "a normal run be attempted first to " .db "estimate where the program goes astray,\r" ;18 .db "the attempt a single step at the beginning " .db "of the questionable code, with a\r" ;19 .db "hardcopy of the assembly listing file " .db "on-hand for memory location reference.\r\r",0 ;20 21 ; 1234567890123456789012345678901234567890 Help4txt: .db 12,"Between steps, the monitor uses absolutely " .db "NO internal or external memory.\r" .db "However, about 30 bytes of stack space " .db "must be left available...\r\r" .db "During a single step run, pressing RETURN " .db "repeatedly will be the usual course\r" .db "of action. However, other options are " .db "available.\r\r" .db " " .db "Typing '?' will display this help screen\r\r",0 Help5txt: .db "Single Step Commands:\r\r" .db " Print Status and execute " .db "the next instruction\r" .db " Execute next instruction w/out status lines\r" .db " '?' Display this on-line help\r" .db " 'R' Print out Special Function Registers\r" .db " 'H' Hex dump internal ram\r" .db " 'S' Skip this instruction\r" .db " 'A' Change the Accumulator's value\r" .db " 'Q' Quit Single Step, continue executing normally\r" .db "\r",0 as31-2.3.1/examples/extra.ref0000644000175000001440000002455010307071452015151 0ustar erazorusers:10100000A5E5E0A5FE4C0000000000000000000087 :10101000000000000000000000000000FFFFFFFFD4 :081020004C69737400020048E2 :1010400011257D14C2D1114CDDFC0125EFF5835132 :101050004FEEF582514FE493FAA3E493FBA3E4939C :10106000FCEA5408700FEA035478F8EA54074890F1 :1010700016C8938008EAC4540F901362935403F87F :101080002EFEEF3400FF743A512A719D20D121EADF :10109000514F719DB80104790B8011EB514F719D37 :1010A000B8020479088005EC514F7906719DD9FC8E :1010B000EA54087010901748EA035478F8EA540785 :1010C0004893F980099017C8EAC4540F93F9901E09 :1010D000FE7808C374204007E99309A2E7547F51C2 :1010E0002AD8F1741BC0E07411C0E0EA5408700FF4 :1010F000EA035478F8EA5407489016C8938008EA3F :10110000C4540F9013629354FC03031490111D23D5 :101110002582F582E43583F583E4730125412D4171 :101120003C21812172414841044152415821A22170 :10113000D7415E4169416D4108411021AA218321B7 :101140007441714177417D413E411C418121DF4124 :101150001441C54185418B41914195419B41A94134 :10116000AF41B541BB410C41BF41CB41D741E74104 :10117000ED2231F67440512A7452512AEA54014149 :101180004531F6EB20E703EB414F9012F5E493A3D2 :1011900060F5F8C39B7003020038E493A330E7FACC :1011A00080EB511031F8742F512AEB547823C4F896 :1011B000EB54806014901372E893901F933582F57E :1011C000825002058331978005E82420514F742E08 :1011D000512AEB5407414531F6318331F8ECFBEBF2 :1011E0002EF582EB20E703E48002E4F43FF583026E :1011F00000367440412A5108742C512A7420412A27 :101200007423412A318331F87441412A31AA31F8DB :101210007443412A31F25108742B512A7444512AE3 :101220007450512A7454512A7452020030EF54F809 :10123000F8EAC403540748514FEB414F31F674525A :10124000512AEA540702002E510831F85100EB02EE :1012500000343183ECFB414A511031F821AA510886 :1012600031F85100EB514F21DB513E416031744167 :101270006051087442412A513E31F821DF31832107 :10128000DB31AA21DB513E31F84108513E31F821D2 :1012900083513E414A318331F8413EEBC0E0ECFBE3 :1012A000318331F8D0E0FB2183318331F82174316F :1012B0007431F84108317431F821833174414A5155 :1012C0001C31F85100EB514FEC414F31F631F251E6 :1012D00008742B512A411C31F631F25108742B51FC :1012E0002A7450512A411031F631F2411C31F25129 :1012F0001C31F84108E04143C38153D0824450CCB3 :10130000834450C88050B09050B1A050B2B050B398 :1013100099534255C6CD5448B2C85432434FCECCEF :10132000544CB2CB5243415032C8CA52434150325E :10133000CC8C5448B08A544CB08D5448B18B544C2A :10134000B1F0C2D05053D7A849C5B849D089544D3F :101350004FC48854434FCE9853434FCE8750434F8A :10136000CE00595909090909097A7E0976330952CB :101370000971000206080C0E101214161B1E202301 :101380002425F8F0E493C398227950E58DF404F80D :10139000D8FED9F722514F743A412A514F74204157 :0113A0002A22 :10140000A5E5E0A5FE53000000000000000000007C :10141000000000000000000000000000FFFFFFFFD0 :0C14200053696E676C652D537465700095 :1014400030B306901D85020045900013E49324FEFE :101450006005901DA88146A393F8E4A393F58288C4 :101460008374027182700EA3741471827007A37466 :10147000EF71826011A882A983901DB59146E95150 :101480004FE8514F0125E5B85404F5B8901D689117 :1014900046EF514FEE514F901D52914612003C20A5 :1014A000D50D5007901D7131970125AE82AF83C2D3 :1014B0008A901DC49146901EBC3197E4758108C086 :1014C000E0C0E08E828F83F5D0F8F9FAFBFCFDFED8 :1014D000FFF5F0757CDD757D14D2AAD2AF737189EA :1014E000D0E0F9D0E0F8D082D083D0D0D0E032C0C4 :1014F000E0C0D0C083C082E8C0E0E9C0E07189D21A :1015000099719D719DE58124FBF8E6719BE5F07171 :101510009B08E62354015145719D08E6514F08E6AA :10152000719B719D08E6719508E67195EA7195EBDE :101530007195EC7195ED7195EE7195EF719B719DC3 :10154000E824F8719B719D719DE57C8E7CFEE57DA4 :101550008F7DFFEAC0E0EBC0E0ECC0E0D2D1114CDF :10156000D0E0FCD0E0FBD0E0FAAF7DAE7CE581249A :10157000F9F8E6F57C08E6F57D120062120040B449 :101580000D0281DEB4200281DEB43F07901E35914A :1015900046A179B45113901EB53197C2AA718975CD :1015A000080075090075810932B44802A1CDB45212 :1015B00002A1FDB45302C167B44102C1AAB42E070F :1015C000901EBC3197A179A179743D412A901E03E8 :1015D0003197E47195719DA88118E6719B08E651D9 :1015E0004F7802790EA1ECE871957910719DE65162 :1015F0004F08D9F81125B880EE1125A17990134430 :101600003197B1C9E58124FCF8E6719B901348A895 :10161000A8D16090134BA8B8D16090134EA889D17F :1016200060901353A888D160901358A898D1609007 :10163000135DA887D1607454512A7430512AB1C9FE :10164000E58C514FE58A514F719D7454512A743184 :10165000512AB1C9E58D514FE58B514F1125A17923 :101660003197B1C9E8619B7817719DD8FC901DEB4B :101670003197E58124F9F8E68E7CFE08E68F7DFF40 :10168000EAC0E0EBC0E0ECC0E0D2D1114CD0E0FC0D :10169000D0E0FBD0E0FAE58124F9F8EEAE7CF57CF1 :1016A000F608EFAF7DF57DF6A179E58124FBF89092 :1016B0001E25319712003A400820D505F61125A1C4 :1016C00079901D713197A179AD066F393946494935 :1016D00063066F39394649496306AD39160E111153 :1016E0006306AD39160E111166061A1F160E11117A :1016F00066061A1F160E111166061A1F160E111114 :1017000066062269161F9292660622A14D8386867E :101710009B06969D160E11112606225D4DAD8E8EEE :101720002606423D2F2B37374606423D390E111112 :101730004606423D39571111A5061111390E1111F6 :10174000A9068989391A89895A0E48732B2B2B2BA4 :1017500030004375212121212E0E676E06060606F4 :1017600038006A700A0A0A0A330E5D5D5D5D5D5DD0 :101770003B00121212121212410E8F8F8F8F8F8F19 :101780003E005D354C4C4C4C7C0E124F244C4C4C66 :101790004C004C4F808080805D0E4C2B57924C4CFF :1017A00012001C1C15151515630E191984888888DC :1017B000600078781F278B8B530E5353194C4C4C79 :1017C000530053531C4C4C4C2B21060A5D128F4C7A :0817D0004C804C1588274C4C9D :10180000A5E5E0A5FE450000000000000000000086 :10181000000000000000000000000000FFFFFFFFCC :101820004D656D6F727920456469746F722028561A :06183000543130302900A4 :101840007C0051C6ECC2E3FC1200623119B41B02E9 :10185000618DB40B024124B40A02414BB408024129 :1018600066B415024195B40C0451C60144B411028A :10187000618DB4030FEC54FEFC71CF901D36B14660 :1018800051E10144B4040FEC4401FC71CF901D3BC5 :10189000B14651E10144B4070221ECB4050221E054 :1018A000B406022159B4010FEC30E198D2E2FC9168 :1018B00054916471210144B4180FEC30E186C2E206 :1018C000FC9154916471210144B419024141B41A4C :1018D000024146F5F0EC20E102014430E210E5F06F :1018E0007198B5F0F48F838E821200564195E5F021 :1018F00012004012006540E1F88F838E82EC20E3F5 :101900000AE8FDECD2E3FC71210148EDC454F02853 :10191000120056ECC2E3FC4195C0E0EC20E106C2A7 :10192000E3FCD0E02230E3F9D0E0C0E01200401246 :10193000006550EED0E0C0E0B41B0EECC2E3FC71D9 :1019400021D0E0D0E0D0E001448F838E82ED120000 :1019500056ECC2E3FC712180C9EC540270020144D0 :101960009154ECC0E09019C2B14C12003C404820A8 :10197000D545A882A9839019D2B14612003C4037C0 :1019800020D534AC82AD839019DBB14C12003A40C3 :101990002620D523FAECFEEDFFD0E0FC8882898377 :1019A000EA120056EEB5820CEFB5830891549164AB :1019B00051E10144A380E9D0E0FC9154916471218C :1019C000014446696C6C1F833B2046697273743A0C :1019D000200020204C6173743A200020A83A200097 :1019E0009154EC6402FC9164712101449154901A69 :1019F0001DB14CECC0E012003CD0E0FC401320D5FF :101A000010AE82AF8371CF741471D5916451E1012E :101A10004471CF741471D59164712101441F831FE7 :101A2000813A2000714DEEC39410FEEF9400FFEE5A :101A3000F454F06008740171DD7169014451E101F1 :101A4000441F51E101440F51E10144714DEE241056 :101A5000FEEF3400FFEE54F06008740171D5716937 :101A6000014451E10144714D740371E5EEC39401E9 :101A7000FEEF9400FFEE44F0F4600471690144EE5F :101A8000F454F0600C743071ED740171DD71690112 :101A90004451E10144714D740371ED8E828F83A333 :101AA000AE82AF83EE540F600471690144EE54F0CE :101AB000600C743071E5740171D57169014451E1B4 :101AC00001447420A140901CFCB146913BB1499166 :101AD00018B1499132B149741071D59132B149911F :101AE0006471CF740271D57582008F837810B1490B :101AF000120036743AB140AA82AB8351C271AAB1C6 :101B000043A3E582540F70F38A828B8351C251C282 :101B100051C271AA7198B140A3E582540F70F3D8F5 :101B2000CD71CFEEC4540F240371D5EE540F243879 :101B300071ED71F571B37198B1409101EE540F23BD :101B4000F4243471E571F571B3B1438101EE540FA2 :101B500023F4243171ED71B37198B140EE540F2329 :101B6000F4243471E571B3A143EE540F23F424310E :101B700071ED71B3719871F5B1409101EE540F237D :101B8000F4243471E571B371F5B1438101EE54F081 :101B9000C4F4241371D5A149547FB47F0374202267 :101BA000C3942050027400242022EC20E003E4932C :101BB00022E022C083C0828F838E82EC20E30D203E :101BC000E004E4938001E0D082D08322ED80F8919C :101BD0000B7448A140910BB14F7442A140910BB1DD :101BE0004F7441A140910BB14F7444A140910BB18E :101BF0004F7443A140901BFAA1461B5B303B376DED :101C000000901C06A1461B5B306D00C0E0741BB148 :101C100040745BB140D0E022901D04B14678005181 :101C2000C2742BB140E812002E08B810F2901D0AC1 :101C3000A1467848742DB140D8FA22EC20E00590F6 :101C40001D368003901D3BB146780851C2D8FC90E8 :101C50001D1EA14C71CF741471D57A4851C2DAFCA3 :101C6000744861E5EC30E112901CBC20E203901C4A :101C7000D7B146901CF2B1468005901CB4B1469095 :101C80001C84A14620205E473D476F746F20205E74 :101C9000433D436F646520205E443D446174612090 :101CA000205E4C3D52656472617720205E513D514B :101CB000756974005E452D45646974005E413D1B85 :101CC0005B303B376D41534349491B5B306D2020EE :101CD0005E583D486578005E413D41534349492087 :101CE000205E583D1B5B303B376D4865781B5B3091 :101CF0006D0020205E463D46696C6C001B5B481BF6 :101D00005B324A00414444523A0020202041534370 :101D10004949204551554956494C414E54003830A7 :101D200035311F9A1F831FD86F722C1FF81FFE2C8E :101D3000203139393600434F444500444154410075 :101D4000020030020034020038020048020045025E :101D50000050292C206F72203C4553433E20746F65 :101D600020657869743A20000D1F888083812028BF :101D70000020436F6D6D616E642041626F72746507 :101D8000642E0D0A000DA1C520636F6E6E6563742D :101D900020494E5431202870696E20313329206C3F :101DA0006F7780BACFCC0D009432B3C7AE812030AC :101DB0003031330D001FB8B3FFA520766563746F13 :101DC00072AE20000D4E6F77866E696E67A6CFCC1F :101DD000206D6F64653A20203C5245543E3DCC2C2A :101DE000203F3D2048656C700D0D00536B6970708D :101DF000696E6720496E737472756374696F6E2DB6 :101E00003E20000D0A4C6F633A2020496E74205228 :101E1000414D204D656D6F727920436F6E74656E14 :101E200074730D0A004E6577204163632056616C20 :101E300075653A20000D1FCF1FCC1F9E3A0D3C52F6 :101E400045543E2086D4F60D203C53503E2086D487 :101E5000F60D20273F272020FF8ED70D20272E2785 :101E60002020FFC4FD730D202752272020FF207360 :101E700070656369616C2066756E6374696F6EC4AA :101E8000730D20274827202084DBC0920D20275384 :101E9000272020FCD4F60D202741272020F0A22067 :101EA0004163632076616C75650D202751272020E2 :101EB000C8CFCC0D0E517569740D0A002020414326 :101EC000432042204320445054522020523020527C :101ED0003120523220523320523420523520523693 :101EE000205237202053502020204164647220204B :101EF000496E737472756374696F6E0D0A004143A5 :101F0000414CCC004144C400414444C3414A4DD0FB :101F1000414ECC434A4EC5434CD24350CC44C144BD :101F200045C34449D6444A4EDA494EC34AC24A429E :101F3000C34AC34A4DD04A4EC24A4EC34A4EDA4AF9 :101F4000DA4C43414CCC4C4A4DD04D4FD64D4F56B8 :101F5000C34D4F56D84D55CC4E4FD04F52CC504F0D :101F6000D0505553C85245D4524554C952CC524C06 :101F7000C352D25252C3534554C2534A4DD0535503 :101F800042C2535741D05843C8584348C45852CC12 :101F90003F3FBF50B054434FCE50B153434FCE504C :101FA000B249C550B349D043B05432434FCE5053D9 :091FB000D744B84143C3FDC2FE51 :00000001FF as31-2.3.1/examples/extra.asm0000644000175000001440000013603610307071452015160 0ustar erazorusers; User installable disassembler and single-step run for paulmon2 ; Please email comments, suggestions, bugs to paul@pjrc.com ; This code is in the public domain. It 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. ; For more information, please see ; http://www.pjrc.com/tech/8051/pm2_docs/index.html .equ locat, 0x1000 ;location for these commands (usually 1000) .equ paulmon2, 0x0000 ;location where paulmon2 is at (usually 0000) .equ phex1, 0x2E+paulmon2 .equ cout, 0x30+paulmon2 ;send acc to uart .equ phex, 0x34+paulmon2 ;print acc in hex .equ phex16, 0x36+paulmon2 ;print dptr in hex .equ pstr, 0x38+paulmon2 ;print string @dptr .equ ghex, 0x3A+paulmon2 ;get two-digit hex (acc) .equ ghex16, 0x3C+paulmon2 ;get four-digit hex (dptr) .equ upper, 0x40+paulmon2 ;convert acc to uppercase .equ newline, 0x48+paulmon2 .equ pcstr, 0x45+paulmon2 .equ pint, 0x50+paulmon2 .equ smart_wr, 0x56+paulmon2 .equ cin_filter, 0x62+paulmon2 .equ asc2hex, 0x65+paulmon2 .equ list_key, 'L' ;list (disassemble) .equ step_key, 'S' ;single step run .equ vtedit_key, 'E' ;memory editor ;for testing in ram ;.equ list_key, 'K' ;list (disassemble) ;.equ step_key, 'W' ;single step run ;.equ vtedit_key, 'E' ;memory editor ;location of two bytes used by single-step in internal ram which we ;hope the user's program won't write over while it's running. These ;two bytes hold the address of the previous instruction, so we can ;show the last executed instruction with the current value of the ;registers, which is much more intuitive than displaying the next ;instruction by grabbing the program counter from the stack as was ;done in PAULMON1's single step. .equ lastpc, 0x7C ;don't forget to update the docs below ;DIS ;---------------------------------------------------------; ; ; ; list command ; ; ; ;---------------------------------------------------------; .org locat .db 0xA5,0xE5,0xE0,0xA5 ;signiture .db 254,list_key,0,0 ;id (254=user installed command) .db 0,0,0,0 ;prompt code vector .dB 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;user defined .db 255,255,255,255 ;length and checksum (255=unused) .db "List",0 newline_h:ljmp newline .org locat+64 ;executable code begins here ; disassembler register usage ; r0 = temporary storage ; r1 = temporart storage ; r2 = first instruction byte ; r3 = second instruction byte ; r4 = third instruction byte ; r5 = line count ; r6 = program counter (lsb) ; r7 = program counter (msb) list: acall newline_h mov r5, #20 clr psw.1 ;use ordinary long format list2: acall disasm djnz r5, list2 ajmp newline_h disasm: ;print out the memory location and fetch the next three bytes mov a, r7 mov dph, a acall phex_h mov a, r6 mov dpl, a acall phex_h clr a movc a, @a+dptr mov r2, a inc dptr clr a movc a, @a+dptr mov r3, a inc dptr clr a movc a, @a+dptr mov r4, a mov a, r2 anl a, #00001000b jnz lookup2 ;fetch constants for instructions not using R0-R7 lookup1: mov a, r2 rr a anl a, #01111000b ;grab upper 4 bits mov r0, a ;keep in r0 for a moment mov a, r2 anl a, #00000111b ;get lower 3 bits orl a, r0 ;combine in upper 4 mov dptr, #opot1 ;opot=operand offset table movc a, @a+dptr sjmp unpack ;fetch constants for R0-R7 instructions lookup2: mov a, r2 swap a anl a, #00001111b mov dptr, #opot2 movc a, @a+dptr ;now we'll unpack the operand code (# bytes and addr mode) unpack: anl a, #00000011b mov r0, a ;increment the r7/r6 pointer add a, r6 mov r6, a mov a, r7 addc a, #0 mov r7, a ;now print the bytes and spaces (r0 has # of bytes to print) pbytes: mov a, #':' acall cout_h acall space_h jb psw.1, pmnu ;skip bytes if running single-step mov a, r2 acall phex_h acall space_h cjne r0, #1, pbytes2 mov r1, #11 sjmp pbytes4 pbytes2:mov a, r3 acall phex_h acall space_h cjne r0, #2, pbytes3 mov r1, #8 sjmp pbytes4 pbytes3:mov a, r4 acall phex_h mov r1, #6 pbytes4:acall space_h djnz r1, pbytes4 ;prints the mnunonic name and spaces pmnu: mov a, r2 anl a, #00001000b jnz pmnu_lookup2 pmnu_lookup1: mov dptr, #mnot1 ;mnot=mnunonic offset table mov a, r2 rr a anl a, #01111000b ;grab upper 4 bits mov r0, a ;keep in r0 for a moment mov a, r2 anl a, #00000111b ;get lower 3 bits orl a, r0 ;combine in upper 4 movc a, @a+dptr mov r1, a sjmp pmnu0 pmnu_lookup2: mov dptr, #mnot2 ;16 byte table for r0-r7 instructions mov a, r2 swap a anl a, #00001111b movc a, @a+dptr mov r1, a pmnu0: mov dptr, #mnu_tbl mov r0, #8 clr c pmnu1: mov a, #' ' jc pmnu2 mov a, r1 movc a, @a+dptr inc r1 mov c, acc.7 anl a, #0x7F pmnu2: acall cout_h djnz r0, pmnu1 ;print the operands mov a, #dasm2 & 255 ;(low) push acc mov a, #dasm2 >> 8 ;(high) push acc am_lookup0: mov a, r2 anl a, #00001000b jnz am_lookup2 ;fetch constants for instructions not using R0-R7 am_lookup1: mov a, r2 rr a anl a, #01111000b ;grab upper 4 bits mov r0, a ;keep in r0 for a moment mov a, r2 anl a, #00000111b ;get lower 3 bits orl a, r0 ;combine in upper 4 mov dptr, #opot1 ;opot=operand offset table movc a, @a+dptr sjmp am_unpack ;fetch constants for R0-R7 instructions am_lookup2: mov a, r2 swap a anl a, #00001111b mov dptr, #opot2 movc a, @a+dptr am_unpack: anl a, #11111100b rr a rr a dec a mov dptr, #oprt ;oprt=operand routine table rl a add a, dpl mov dpl, a clr a addc a, dph mov dph, a clr a jmp @a+dptr dasm2: ajmp newline_h oprt: ajmp opcd1 ;addr11 ajmp opcd2 ;A,Rn ajmp opcd3 ;A,direct ajmp opcd4 ;A,@Ri ajmp opcd5 ;A,#data ajmp opcd6 ;direct,A ajmp opcd7 ;direct,#data ajmp opcd8 ;C,bit ajmp opcd9 ;C,/bit ajmp opcd10 ;A,direct,rel ajmp opcd11 ;A,#data,rel ajmp opcd12 ;Rn,#data,rel ajmp opcd13 ;@Ri,#data,rel ajmp pa ;A ajmp prc ;C ajmp pbit ;bit ajmp pdirect ;direct ajmp p_reg_i ;@Ri ajmp opcd19 ;AB ajmp opcd20 ;Rn,rel ajmp opcd21 ;direct,rel ajmp p_reg_n ;Rn ajmp pdptr ;DPTR ajmp opcd24 ;bit,rel ajmp prel ;rel ajmp opcd26 ;@A+DPTR ajmp opcd27 ;addr16 ajmp opcd28 ;Rn,A ajmp opcd29 ;Rn,direct ajmp opcd30 ;Rn,#data ajmp opcd31 ;direct,Rn ajmp opcd32 ;direct,direct ajmp opcd33 ;direct,@Ri ajmp opcd34 ;@Ri,A ajmp opcd35 ;@Ri,direct ajmp opcd36 ;@Ri,#data ajmp opcd37 ;bit,C ajmp opcd38 ;DPTR,#data16 ajmp opcd39 ;A,@A+DPTR ajmp opcd40 ;A,@A+PC ajmp opcd41 ;A,@DPTR ajmp opcd42 ;@DPTR,A ret ; opcd4: ;A,@Ri done acall pac p_reg_i:mov a,#'@' acall cout_h mov a,#'R' acall cout_h mov a, r2 anl a,#00000001b ajmp phex1_h opcd3: ;A,direct done acall pac pdirect: mov a, r3 jb acc.7,pdir1 pdir0: mov a, r3 ajmp phex_h pdir1: mov dptr,#sfrmnu pdir2: clr a movc a,@a+dptr inc dptr jz pdir0 mov r0,a clr c subb a, r3 jnz pdir3 pstr_h: ljmp pstr pdir3: clr a movc a,@a+dptr inc dptr jnb acc.7,pdir3 sjmp pdir2 opcd9: ;C,/bit done acall prc acall pcomma mov a, #'/' acall cout_h pbit: mov a, r3 anl a,#01111000b rl a swap a mov r0,a mov a, r3 anl a,#10000000b jz pbit1 mov dptr,#bitptr ;it's a Special Function Reg. mov a,r0 movc a,@a+dptr mov dptr,#bitmnu addc a,dpl mov dpl,a jnc pbit0 inc dph pbit0: acall pstr_h sjmp pbit2 pbit1: mov a,r0 ;it's between 20h and 2Fh add a,#20h acall phex_h pbit2: mov a,#'.' acall cout_h mov a, r3 anl a,#00000111b ajmp phex1_h opcd10: ;A,direct,rel done acall pac acall pdirect opcd10a:acall pcomma mov a, r4 mov r3, a prel: mov a, r3 add a, r6 mov dpl, a mov a, r3 jb acc.7, prel2 clr a sjmp prel3 prel2: clr a cpl a prel3: addc a, r7 mov dph, a ljmp phex16 pat: ;prints the '@' symbol mov a,#'@' ajmp cout_h pac: ;print "A," acall pa pcomma: ;prints a comma mov a,#',' acall cout_h pspace: mov a, #' ' ajmp cout_h plb: ;prints the '#' symbol mov a,#'#' ajmp cout_h opcd6: ;direct,A done acall pdirect acall pcomma pa: ;prints 'A' mov a,#'A' ajmp cout_h opcd37: ;bit,C done acall pbit acall pcomma prc: ;prints 'C' mov a,#'C' ajmp cout_h opcd26: ;@A+DPTR done acall pat acall pa mov a,#'+' acall cout_h pdptr: ;prints DPTR mov a, #'D' acall cout_h mov a, #'P' acall cout_h mov a, #'T' acall cout_h mov a, #'R' cout_h: ljmp cout opcd1: mov a, r7 ;addr11 done anl a, #11111000b mov r0, a mov a, r2 swap a rr a anl a, #00000111b orl a, r0 acall phex_h mov a, r3 ajmp phex_h opcd2: ;A,Rn done acall pac p_reg_n:mov a,#'R' acall cout_h mov a, r2 anl a,#00000111b phex1_h: ljmp phex1 opcd5: ;A,#data done acall pa pdata: acall pcomma acall plb mov a, r3 phex_h: ljmp phex opcd7: ;direct,#data done acall pdirect mov a, r4 mov r3, a ajmp pdata opcd8: ;C,bit done acall prc acall pcomma ajmp pbit opcd11: ;A,#data,rel done acall pa opcd11a:acall pcomma acall plb mov a, r3 acall phex_h ajmp opcd10a opcd12: ;Rn,#data,rel done acall p_reg_n ajmp opcd11a opcd13: ;@Ri,#data,rel done acall p_reg_i ajmp opcd11a opcd19: ;AB done acall pa mov a, #'B' ajmp cout_h opcd20: ;Rn,rel done acall p_reg_n acall pcomma ajmp prel opcd21: ;direct,rel done acall pdirect ajmp opcd10a opcd24: ;bit,rel done acall pbit ajmp opcd10a opcd28: ;Rn,A done acall p_reg_n acall pcomma ajmp pa opcd29: ;Rn,direct done acall p_reg_n acall pcomma ajmp pdirect opcd30: ;Rn,#data done acall p_reg_n ajmp pdata opcd31: ;direct,Rn done acall pdirect acall pcomma ajmp p_reg_n opcd32: ;direct,direct done mov a, r3 push acc mov a, r4 mov r3, a acall pdirect acall pcomma pop acc mov r3, a ajmp pdirect opcd33: ;direct,@Ri done acall pdirect acall pcomma ajmp p_reg_i opcd34: ;@Ri,A done acall p_reg_i acall pcomma ajmp pa opcd35: ;@Ri,direct done acall p_reg_i acall pcomma ajmp pdirect opcd36: ;@Ri,#data done acall p_reg_i ajmp pdata opcd38: ;DPTR,#data16 done acall pdptr acall pcomma acall plb opcd27: mov a, r3 ;addr16 done acall phex_h mov a, r4 ajmp phex_h opcd39: ;A,@A+DPTR done acall pac acall pat acall pa mov a,#'+' acall cout_h ajmp pdptr opcd40: ;A,@A+PC done acall pac acall pat acall pa mov a,#'+' acall cout_h mov a,#'P' acall cout_h ajmp prc opcd41: ;A,@DPTR done acall pac acall pat ajmp pdptr opcd42: ;@DPTR,A done acall pat acall pdptr acall pcomma ajmp pa sfrmnu: .db 0xE0,"AC",'C'+128 .db 0x81,'S','P'+128 .db 0x82,"DP",'L'+128 .db 0x83,"DP",'H'+128 .db 0x80,'P','0'+128 .db 0x90,'P','1'+128 .db 0xA0,'P','2'+128 .db 0xB0,'P','3'+128 .db 0x99,"SBU",'F'+128 .db 0xCD,"TH",'2'+128 .db 0xC8,"T2CO",'N'+128 .db 0xCC,"TL",'2'+128 .db 0xCB,"RCAP2",'H'+128 .db 0xCA,"RCAP2",'L'+128 .db 0x8C,"TH",'0'+128 .db 0x8A,"TL",'0'+128 .db 0x8D,"TH",'1'+128 .db 0x8B,"TL",'1'+128 sfr1: .db 0xF0,'B'+128 ;5 sfr2: .db 0xD0,"PS",'W'+128 ;7 sfr3: .db 0xA8,'I','E'+128 sfr4: .db 0xB8,'I','P'+128 sfr5: .db 0x89,"TMO",'D'+128 ;8 sfr6: .db 0x88,"TCO",'N'+128 ;8 sfr7: .db 0x98,"SCO",'N'+128 ;8 sfr8: .db 0x87,"PCO",'N'+128 ;8 .db 0 ;just in case opot2: .db 0x59, 0x59, 0x09, 0x09 ;inc, dec, add, addc .db 0x09, 0x09, 0x09, 0x7A ;orl, anl, xrl, mov .db 0x7E, 0x09, 0x76, 0x33 ;mov, subb, mov, cjne .db 0x09, 0x52, 0x09, 0x71 ;xch, djnz, mov, mov bitptr: .db 0x00, 0x02, 0x06, 0x08, 0x0C, 0x0E, 0x10, 0x12 .db 0x14, 0x16, 0x1B, 0x1E, 0x20, 0x23, 0x24, 0x25 ;some stuff used by single step... it's here to fill up some of ;the unused space from the end of the disassembler code and the ;beginning of the single-step header (which must begin on a 256 ;byte page boundry) wr_check: ;write to memory and check that it worked. ;acc=0 if it worked, nonzero if it didn't write mov r0, a ;keep a copy of the data in r0 movx @dptr, a clr a movc a, @a+dptr clr c subb a, r0 ret ;delay for approx 1 character transmit time chardly:mov r1, #80 chdly2: mov a, th1 cpl a inc a mov r0, a djnz r0, * djnz r1, chdly2 ret prcolon:acall phex_h mov a, #':' ajmp cout_h phexsp: acall phex_h space_h: mov a, #' ' ajmp cout_h ;SINGLE ;---------------------------------------------------------; ; ; ; single step command ; ; ; ;---------------------------------------------------------; .org locat+0x400 .db 0xA5,0xE5,0xE0,0xA5 ;signiture .db 254,step_key,0,0 ;id (254=user installed command) .db 0,0,0,0 ;prompt code vector .dB 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;user defined .db 255,255,255,255 ;length and checksum (255=unused) .db "Single-Step",0 .org locat+0x440 ;executable code begins here ssrun: ;first check to make sure they connect int1 low jnb p3.3, ssrun2 mov dptr, #sserr1 ;give error msg if int1 not grounded pcstr_h: ljmp pcstr ssrun2: ;make sure there's a ljmp at the int1 vector location mov dptr, #0x0013 clr a movc a, @a+dptr add a, #254 jz ssrun3 mov dptr, #sserr2 ;give error that paulmon2 was not found. ajmp pcstr_h ssrun3: ;now write an ljmp to "step" in the ram and check it. inc dptr movc a, @a+dptr mov r0, a clr a inc dptr movc a, @a+dptr mov dpl, a mov dph, r0 ;now data pointer points to int1 target mov a, #2 acall wr_check jnz ssrun4 inc dptr mov a, #(step >> 8) acall wr_check jnz ssrun4 inc dptr mov a, #(step & 255) acall wr_check jz ssrun5 ssrun4: mov r0, dpl mov r1, dph mov dptr, #sserr3 ;error: couldn't write to memory @xxxx acall pcstr_h mov a, r1 acall phex_h mov a, r0 acall phex_h ajmp newline_h ssrun5: mov a, ip ;set to high priority interrupt anl a, #00000100b mov ip, a ;let's not beat around the bush (like paulmon1), all ;we need to know is where to jump into memory. mov dptr, #prompt8 acall pcstr_h mov a, r7 acall phex_h mov a, r6 acall phex_h mov dptr,#prompt4 acall pcstr_h lcall ghex16 ;ask for the jump location jb psw.5, ssrun7 jnc ssrun6 mov dptr,#abort acall pstr_h ajmp newline_h ssrun6: mov r6, dpl ;where we'll begin executing mov r7, dph ssrun7: clr tcon.2 ;need low-level triggered int1 mov dptr,#ssmsg ;tell 'em we're starting acall pcstr_h mov dptr,#ssnames acall pstr_h clr a mov sp, #8 ;just like after a reset push acc ;unlike a 8051 start-up, push return addr push acc ;of 0000, just in case they end w/ ret mov dpl, r6 ;load the program's address into dptr mov dph, r7 mov psw, a ;and clear everything to zero mov r0, a mov r1, a mov r2, a mov r3, a mov r4, a mov r5, a mov r6, a mov r7, a mov b, a mov lastpc, #ssstart & 255 mov (lastpc+1), #ssstart >> 8 setb ie.2 setb ea ;turn on the interrupt ssstart:jmp @a+dptr done: acall chardly pop acc mov r1, a pop acc mov r0, a pop dpl pop dph pop psw pop acc reti step: ;this is the single step interrupt service code... push acc push psw ;Stack Contents: (in this order) push dph ;PC_L PC_H ACC PSW DPH DPL R0 R1 push dpl mov a, r0 push acc mov a, r1 push acc ;in case the previous instruction was "clr ti", we ;must wait for a character transmit time "in case it ;was a move to SBUF) and then set ti so that our cout ;doesn't hang when we transmit the first character! acall chardly setb ti ;now print out a line that looks like this: ;ACC B C DPTR R0 R1 R2 R3 R4 R5 R6 R7 SP PC Instruction ;00 00 0 3F00 00:00:00:00:00:00:00:00 00 - 0000: LJMP 0825 acall space_h acall space_h mov a, sp add a, #251 mov r0, a ;r0 points to user's acc on stack mov a, @r0 acall phexsp ;print acc mov a, b acall phexsp ;print b register inc r0 mov a, @r0 rl a anl a, #1 acall phex1_h ;print carry bit acall space_h inc r0 mov a, @r0 acall phex_h ;print dptr (msb) inc r0 mov a, @r0 acall phexsp ;print dptr (lsb) acall space_h inc r0 mov a, @r0 acall prcolon ;print r0 inc r0 mov a, @r0 acall prcolon ;print r1 mov a, r2 acall prcolon ;print r2 mov a, r3 acall prcolon ;print r3 mov a, r4 acall prcolon ;print r4 mov a, r5 acall prcolon ;print r5 mov a, r6 acall prcolon ;print r6 mov a, r7 acall phexsp ;print r7 acall space_h mov a, r0 add a, #248 acall phexsp ;print stack pointer acall space_h acall space_h ;now the trick is to disassemble the instruction... this isn't ;easy, since the user wants to see the last instruction that ;just executed, but program counter on the stack points to the ;next instruction to be executed. The dirty trick is to grab ;the program counter from last time where we stashed it in some ;memory that hopefully the user's program hasn't overwritten. mov a, lastpc mov lastpc, r6 mov r6, a mov a, (lastpc+1) mov (lastpc+1), r7 mov r7, a mov a, r2 push acc mov a, r3 push acc mov a, r4 push acc setb psw.1 ;tell it to use a compact format ;the disassembler uses quite a bit of stack space... if the ;user didn't leave enough room for the stack to grow with ;all this overhead, it will likely crash somewhere in the ;disassembler... oh well, not much I can do about it. The ;worst case stack usage for disasm is 9 bytes. We just ;pushed 5 and 6 at the beginning of step. With the two ;bytes for the interrupt, a total of 22 bytes of free stack ;space must be available to use the single-step feature. acall disasm pop acc mov r4, a pop acc mov r3, a pop acc mov r2, a mov r7, (lastpc+1) mov r6, lastpc ;now grab the user's PC value to keep it for next time mov a, sp add a, #249 mov r0, a ;r0 points to user's acc on stack mov a, @r0 mov lastpc, a inc r0 mov a, @r0 mov (lastpc+1), a ;SINGLE STEP step1: lcall cin_filter lcall upper step2: cjne a, #13, step7 ajmp done step7: cjne a, #' ', step8 ;check space ajmp done step8: cjne a,#'?',step10 ;check '?' mov dptr,#help5txt acall pcstr_h ajmp step1 step10: cjne a,#'Q',step11 ;check 'Q'=quit and run normal mov dptr, #squit acall pstr_h clr ie.2 acall chardly mov 8, #0 ;force return to 0000 mov 9, #0 mov sp, #9 reti step11: cjne a,#'H',step12 ;check 'H'=hex dump internal ram ajmp ssdmp step12: cjne a,#'R',step13 ;check 'R'=print out registers ajmp ssreg step13: cjne a,#'S',step14 ;check 'S'=skip next inst ajmp ssskip step14: cjne a,#'A',step15 ;check 'A'=change acc value ajmp sschacc step15: cjne a,#'.',step20 mov dptr, #ssnames acall pstr_h ajmp step1 step20: ajmp step1 pequal: ; prints '=' mov a,#'=' ajmp cout_h ssdmp: mov dptr, #ssdmps1 acall pstr_h clr a acall prcolon acall space_h mov r0, sp dec r0 mov a, @r0 acall phexsp inc r0 mov a, @r0 acall phex_h mov r0, #2 mov r1, #14 ajmp ssdmp2 ssdmp1: mov a, r0 acall prcolon mov r1, #16 ssdmp2: acall space_h mov a, @r0 acall phex_h inc r0 djnz r1, ssdmp2 acall newline_h cjne r0, #0x80, ssdmp1 acall newline_h ajmp step1 ssreg: mov dptr, #sfr2+1 acall pstr_h acall pequal mov a, sp add a, #252 mov r0, a mov a, @r0 acall phexsp ;print psw mov dptr,#sfr3+1 mov r0, 0xA8 acall psfr ;print ie mov dptr,#sfr4+1 mov r0, 0xB8 acall psfr ;print ip mov dptr,#sfr5+1 mov r0, 0x89 acall psfr ;print tmod mov dptr,#sfr6+1 mov r0, 0x88 acall psfr ;print tcon mov dptr,#sfr7+1 mov r0, 0x98 acall psfr ;print smod mov dptr,#sfr8+1 mov r0, 0x87 acall psfr ;print pcon mov a, #'T' acall cout_h mov a, #'0' acall cout_h acall pequal mov a, 8Ch acall phex_h ;print Timer 0 mov a, 8Ah acall phex_h acall space_h mov a, #'T' acall cout_h mov a, #'1' acall cout_h acall pequal mov a, 8Dh ;print Timer 1 acall phex_h mov a, 8Bh acall phex_h acall newline_h ajmp step1 psfr: acall pstr_h acall pequal mov a, r0 ajmp phexsp ;skip the next instruction ssskip: mov r0, #23 ssskip2:acall space_h djnz r0, ssskip2 mov dptr,#sskip1 acall pstr_h mov a, sp add a, #249 mov r0, a ;set r0 to point to pc on stack mov a, @r0 mov lastpc, r6 ;keep r6/r7 safe in lastpc mov r6, a ;put user's pc into r6/r7 inc r0 mov a, @r0 mov (lastpc+1), r7 mov r7, a mov a, r2 push acc mov a, r3 push acc mov a, r4 push acc setb psw.1 ;tell it to use a compact format acall disasm ;run disasm to show 'em what was skipped pop acc mov r4, a pop acc mov r3, a pop acc mov r2, a mov a, sp add a, #249 mov r0, a ;set r0 to point to pc on stack mov a, r6 mov r6, lastpc ;restore r6/r7 mov lastpc, a ;update lastpc with next inst addr mov @r0, a ;also update user's pc!! inc r0 mov a, r7 mov r7, (lastpc+1) mov (lastpc+1), a mov @r0, a ajmp step1 sschacc: mov a, sp add a, #251 mov r0, a ;r0 points to acc on stack mov dptr, #chaccs1 acall pstr_h lcall ghex jc chacc2 jb psw.5, chacc2 mov @r0, a acall newline_h ajmp step1 chacc2: mov dptr, #abort acall pstr_h ajmp step1 ;stuff some of the disassembler tables, strings, etc since we have a ;bit of space before the beginning of the editor command code ;opcode offset table (gives #bytes for the instruction ;and the number of the routine to print the operands) opot1: .db 0xAD, 0x06, 0x6F, 0x39, 0x39, 0x46, 0x49, 0x49 ;0 .db 0x63, 0x06, 0x6F, 0x39, 0x39, 0x46, 0x49, 0x49 ;1 .db 0x63, 0x06, 0xAD, 0x39, 0x16, 0x0E, 0x11, 0x11 ;2 .db 0x63, 0x06, 0xAD, 0x39, 0x16, 0x0E, 0x11, 0x11 ;3 .db 0x66, 0x06, 0x1A, 0x1F, 0x16, 0x0E, 0x11, 0x11 ;4 .db 0x66, 0x06, 0x1A, 0x1F, 0x16, 0x0E, 0x11, 0x11 ;5 .db 0x66, 0x06, 0x1A, 0x1F, 0x16, 0x0E, 0x11, 0x11 ;6 .db 0x66, 0x06, 0x22, 0x69, 0x16, 0x1F, 0x92, 0x92 ;7 .db 0x66, 0x06, 0x22, 0xA1, 0x4D, 0x83, 0x86, 0x86 ;8 .db 0x9B, 0x06, 0x96, 0x9D, 0x16, 0x0E, 0x11, 0x11 ;9 .db 0x26, 0x06, 0x22, 0x5D, 0x4D, 0xAD, 0x8E, 0x8E ;A .db 0x26, 0x06, 0x42, 0x3D, 0x2F, 0x2B, 0x37, 0x37 ;B .db 0x46, 0x06, 0x42, 0x3D, 0x39, 0x0E, 0x11, 0x11 ;C .db 0x46, 0x06, 0x42, 0x3D, 0x39, 0x57, 0x11, 0x11 ;D .db 0xA5, 0x06, 0x11, 0x11, 0x39, 0x0E, 0x11, 0x11 ;E .db 0xA9, 0x06, 0x89, 0x89, 0x39, 0x1A, 0x89, 0x89 ;F mnot1: ;mnunonic offset table (gives offset into above table) .db 0x5A, 0x0E, 0x48, 0x73 ;nop, ajmp, ljmp, rr .db 0x2B, 0x2B, 0x2B, 0x2B ;inc, inc, inc, inc .db 0x30, 0x00, 0x43, 0x75 ;jbc, acall, lcall rrc .db 0x21, 0x21, 0x21, 0x21 ; .db 0x2E, 0x0E, 0x67, 0x6E ; etc... .db 0x06, 0x06, 0x06, 0x06 ; .db 0x38, 0x00, 0x6A, 0x70 ; .db 0x0A, 0x0A, 0x0A, 0x0A ; .db 0x33, 0x0E, 0x5D, 0x5D ; .db 0x5D, 0x5D, 0x5D, 0x5D ; .db 0x3B, 0x00, 0x12, 0x12 ; .db 0x12, 0x12, 0x12, 0x12 ; .db 0x41, 0x0E, 0x8F, 0x8F ; .db 0x8F, 0x8F, 0x8F, 0x8F ; .db 0x3E, 0x00, 0x5D, 0x35 ; .db 0x4C, 0x4C, 0x4C, 0x4C ; .db 0x7C, 0x0E, 0x12, 0x4F ; .db 0x24, 0x4C, 0x4C, 0x4C ; .db 0x4C, 0x00, 0x4C, 0x4F ; .db 0x80, 0x80, 0x80, 0x80 ; .db 0x5D, 0x0E, 0x4C, 0x2B ; .db 0x57, 0x92, 0x4C, 0x4C ; .db 0x12, 0x00, 0x1C, 0x1C ; .db 0x15, 0x15, 0x15, 0x15 ; .db 0x63, 0x0E, 0x19, 0x19 ; .db 0x84, 0x88, 0x88, 0x88 ; .db 0x60, 0x00, 0x78, 0x78 ; .db 0x1F, 0x27, 0x8B, 0x8B ; .db 0x53, 0x0E, 0x53, 0x53 ; .db 0x19, 0x4C, 0x4C, 0x4C ; .db 0x53, 0x00, 0x53, 0x53 ; .db 0x1C, 0x4C, 0x4C, 0x4C ; mnot2: .db 0x2B, 0x21, 0x06, 0x0A ;inc, dec, add, addc .db 0x5D, 0x12, 0x8F, 0x4C ;orl, anl, xlr, mov .db 0x4C, 0x80, 0x4C, 0x15 ;mov, subb, mov, cjne .db 0x88, 0x27, 0x4C, 0x4C ;xch, djnz, mov, mov ;---------------------------------------------------------; ; ; ; External Memory Editor ; ; ; ;---------------------------------------------------------; ;register usage: ; R4, Flags: ; bit0: 0=display CODE memory, 1=display DATA memory ; bit1: 0=editing disabled, 1=editing enabled ; bit2: 0=editing in hex, 1=editing in ascii ; bit3: 0=normal, 1=in middle of hex entry (value in r5) ; R6/R7, current memory location ; .org locat+0x800 .db 0xA5,0xE5,0xE0,0xA5 ;signiture .db 254,vtedit_key,0,0 ;id (254=user installed command) .db 0,0,0,0 ;prompt code vector .dB 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;reserved .db 0,0,0,0 ;user defined .db 255,255,255,255 ;length and checksum (255=unused) .db "Memory Editor (VT100)",0 .org locat+0x0840 ;executable code begins here mov r4, #0 acall redraw main: mov a, r4 clr acc.3 mov r4, a main2: lcall cin_filter acall input_ck_2nd cmd1: cjne a, #27, cmd2 ;quit ajmp quit cmd2: cjne a, #11, cmd3 ;up ajmp cmd_up cmd3: cjne a, #10, cmd4 ;down ajmp cmd_down cmd4: cjne a, #8, cmd5 ;left ajmp cmd_left cmd5: cjne a, #21, cmd6 ;right ajmp cmd_right cmd6: cjne a, #12, cmd7 ;redraw acall redraw ajmp main cmd7: cjne a, #17, cmd8 ;quit ajmp quit cmd8: cjne a, #3, cmd9 ;code memory mov a, r4 anl a, #11111110b mov r4, a acall cursor_home mov dptr, #str_code acall pstr_hh acall redraw_data ajmp main cmd9: cjne a, #4, cmd10 ;data memory mov a, r4 orl a, #00000001b mov r4, a acall cursor_home mov dptr, #str_data acall pstr_hh acall redraw_data ajmp main cmd10: cjne a, #7, cmd11 ;goto memory loc ajmp cmd_goto cmd11: cjne a, #5, cmd12 ;toggle editing ajmp cmd_edit cmd12: cjne a, #6, cmd13 ;fill memory ajmp cmd_fill cmd13: cjne a, #1, cmd14 ;edit in ascii mov a, r4 jnb acc.1, main setb acc.2 mov r4, a acall erase_commands acall print_commands acall redraw_cursor ajmp main cmd14: cjne a, #24, cmd15 ;edit in hex mov a, r4 jnb acc.1, main clr acc.2 mov r4, a acall erase_commands acall print_commands acall redraw_cursor ajmp main cmd15: cjne a, #25, cmd16 ;page up ajmp cmd_pgup cmd16: cjne a, #26, cmd17 ;page down ajmp cmd_pgdown cmd17: cmd_data: ;the input character wasn't any particular command, so ;maybe it's some input data being typed for edit mode mov b, a ;keep a copy of user data in b mov a, r4 jb acc.1, cmd_data2 cmd_abort: ajmp main ;ignore if not in edit mode cmd_data2: jnb acc.2, input_hex input_ascii: mov a, b acall ascii_only cjne a, b, cmd_abort ;check that input is an ascii char mov dph, r7 mov dpl, r6 lcall smart_wr ;write the char to memory ajmp cmd_right input_hex: mov a, b lcall upper lcall asc2hex jc cmd_abort ;ignore if not hex mov r0, a ;keep hex value of input in r0 mov dph, r7 ;load dptr with address mov dpl, r6 mov a, r4 jb acc.3, input_hex_2nd input_hex_1st: mov a, r0 mov r5, a mov a, r4 setb acc.3 ;remember that we're waiting for 2nd char mov r4, a acall redraw_cursor ajmp main2 input_hex_2nd: mov a, r5 ;get data from memory swap a ;shift nibbles anl a, #11110000b ;just in case add a, r0 ;add in this input to lower part lcall smart_wr ;write back to memory mov a, r4 clr acc.3 mov r4, a ajmp cmd_right input_ck_2nd: ;the main input routine will always call here when a new ;byte is entered... so we can do something special if we ;were waiting for the second character and it is not a ;legal hex character push acc mov a, r4 jb acc.1, inck2d ;if editing is disabled, don't do anything clr acc.3 inck2b: mov r4, a inck2c: pop acc ret inck2d: jnb acc.3, inck2b ;if we get here, we were actually waiting for the 2nd char pop acc push acc lcall upper lcall asc2hex jnc inck2c ;proceed normally if it is valid ;if we get here, we did not get a hex legal char pop acc push acc cjne a, #esc_char, inck2e mov a, r4 clr acc.3 mov r4, a acall redraw_cursor pop acc pop acc ;don't return and do the quit cmd pop acc ;just quit this entry and wait for next cmd ajmp main inck2e: mov dph, r7 ;load dptr with address mov dpl, r6 mov a, r5 lcall smart_wr ;write to memory mov a, r4 clr acc.3 mov r4, a acall redraw_cursor sjmp inck2c ; R4, Flags: ; bit0: 0=display CODE memory, 1=display DATA memory ; bit1: 0=editing disabled, 1=editing enabled ; bit2: 0=editing in hex, 1=editing in ascii ; bit3: 0=normal, 1=in middle of hex entry (value in r5) cmd_fill: mov a, r4 anl a, #00000010b jnz cmd_fill_ok ajmp main ;don't allow if not in editing mode cmd_fill_ok: acall erase_commands mov a, r4 push acc mov dptr, #fill_prompt1 acall pcstr_hh lcall ghex16 jc cmd_fill_abort jb psw.5, cmd_fill_abort mov r0, dpl mov r1, dph mov dptr, #fill_prompt2 acall pstr_hh lcall ghex16 jc cmd_fill_abort jb psw.5, cmd_fill_abort mov r4, dpl mov r5, dph mov dptr, #fill_prompt3 acall pcstr_hh lcall ghex jc cmd_fill_abort jb psw.5, cmd_fill_abort mov r2, a mov a, r4 mov r6, a mov a, r5 mov r7, a pop acc mov r4, a mov dpl, r0 mov dph, r1 ;now r4 is restored to its normal value, dptr holds the ;first location to fill, and r6/r7 holds the last location to ;fill, and r2 has the fill value. cmd_fill_loop: mov a, r2 lcall smart_wr mov a, r6 cjne a, dpl, cmd_fill_next mov a, r7 cjne a, dph, cmd_fill_next ;when we get here, we're done! acall erase_commands acall print_commands acall redraw_data ajmp main cmd_fill_next: inc dptr sjmp cmd_fill_loop cmd_fill_abort: pop acc mov r4, a acall erase_commands acall print_commands acall redraw_cursor ajmp main fill_prompt1: .db "Fill",31,131,"; First: ",0 fill_prompt2: .db " Last: ",0 fill_prompt3: .db " ",168,": ",0 cmd_edit: acall erase_commands mov a, r4 xrl a, #00000010b mov r4, a acall print_commands acall redraw_cursor ajmp main cmd_goto: acall erase_commands mov dptr, #goto_prompt acall pcstr_hh mov a, r4 push acc lcall ghex16 pop acc mov r4, a jc cmdgt_abort jb psw.5, cmdgt_abort mov r6, dpl mov r7, dph acall cursor_home mov a, #20 acall cursor_down acall print_commands acall redraw_data ajmp main cmdgt_abort: acall cursor_home mov a, #20 acall cursor_down acall print_commands acall redraw_cursor ajmp main goto_prompt: .db 31,131,31,129,": ",0 cmd_up: acall blank_it mov a, r6 clr c subb a, #16 mov r6, a mov a, r7 subb a, #0 mov r7, a mov a, r6 cpl a anl a, #11110000b jz cmd_up_scroll mov a, #1 acall cursor_up acall invert_it ajmp main cmd_up_scroll: acall redraw_data ajmp main cmd_pgup: dec r7 acall redraw_data ajmp main cmd_pgdown: inc r7 acall redraw_data ajmp main cmd_down: acall blank_it mov a, r6 add a, #16 mov r6, a mov a, r7 addc a, #0 mov r7, a mov a, r6 anl a, #11110000b jz cmd_down_scroll mov a, #1 acall cursor_down acall invert_it ajmp main cmd_down_scroll: acall redraw_data ajmp main cmd_left: acall blank_it mov a, #3 acall cursor_left mov a, r6 clr c subb a, #1 mov r6, a mov a, r7 subb a, #0 mov r7, a mov a, r6 orl a, #11110000b cpl a jz cmdlf2 acall invert_it ajmp main cmdlf2: mov a, r6 cpl a anl a, #11110000b jz cmd_left_scroll mov a, #48 acall cursor_right mov a, #1 acall cursor_up acall invert_it ajmp main cmd_left_scroll: acall redraw_data ajmp main cmd_right: acall blank_it mov a, #3 acall cursor_right mov dpl, r6 mov dph, r7 inc dptr mov r6, dpl mov r7, dph mov a, r6 anl a, #00001111b jz cmdrt2 acall invert_it ajmp main cmdrt2: mov a, r6 anl a, #11110000b jz cmd_right_scroll mov a, #48 acall cursor_left mov a, #1 acall cursor_down acall invert_it ajmp main cmd_right_scroll: acall redraw_data ajmp main space: mov a, #' ' ajmp cout_hh ;register usage: ; R4, Flags: ; bit0: 0=display CODE memory, 1=display DATA memory ; bit1: 0=editing disabled, 1=editing enabled ; bit2: 0=editing in hex, 1=editing in ascii ; bit3: 0=normal, 1=in middle of hex entry (value in r5) ; R6/R7, current memory location ; redraw: mov dptr, #str_cl ;clear screen acall pstr_hh acall print_title_line acall newline_hh acall print_addr_line acall newline_hh acall print_dash_line acall newline_hh mov a, #16 acall cursor_down acall print_dash_line acall newline_hh acall print_commands redraw_data: acall cursor_home mov a, #2 acall cursor_down ;compute first byte address to display on the screen mov dpl, #0 mov dph, r7 ;now display the data mov r0, #16 rd2: acall newline_hh lcall phex16 mov a, #':' acall cout_hh mov r2, dpl mov r3, dph rd3: acall space acall read_dptr acall phex_hh inc dptr mov a, dpl anl a, #00001111b jnz rd3 mov dpl, r2 mov dph, r3 acall space acall space acall space rd4: acall read_dptr acall ascii_only acall cout_hh inc dptr mov a, dpl anl a, #00001111b jnz rd4 djnz r0, rd2 redraw_cursor: acall cursor_home mov a, r6 swap a anl a, #00001111b add a, #3 acall cursor_down ;make the ascii character inverse mov a, r6 anl a, #00001111b add a, #56 acall cursor_right acall inverse_on acall read_r6r7 acall ascii_only acall cout_hh acall inverse_off ;now make the hex value inverse mov a, r6 anl a, #00001111b rl a cpl a add a, #52 acall cursor_left acall inverse_on acall read_r6r7 acall phex_hh ajmp inverse_off blank_it: mov a, r6 anl a, #00001111b rl a cpl a add a, #49 acall cursor_right acall read_r6r7 acall ascii_only acall cout_hh mov a, r6 anl a, #00001111b rl a cpl a add a, #52 acall cursor_left acall read_r6r7 ajmp phex_hh invert_it: mov a, r6 anl a, #00001111b rl a cpl a add a, #49 acall cursor_right acall read_r6r7 acall ascii_only acall inverse_on acall cout_hh acall inverse_off mov a, r6 anl a, #00001111b rl a cpl a add a, #52 acall cursor_left acall read_r6r7 acall inverse_on acall phex_hh ajmp inverse_off quit: mov a, r6 anl a, #11110000b swap a cpl a add a, #19 acall cursor_down ajmp newline_hh ascii_only: anl a, #01111111b ;avoid unprintable characters cjne a, #127, aonly2 mov a, #' ' ret aonly2: clr c subb a, #32 jnc aonly3 ;avoid control characters mov a, #(' ' - 32) aonly3: add a, #32 ret read_dptr: mov a, r4 jb acc.0, rddptr2 clr a movc a, @a+dptr ret rddptr2:movx a, @dptr ret read_r6r7: push dph push dpl mov dph, r7 mov dpl, r6 mov a, r4 jb acc.3, rdr6r7d jb acc.0, rdr6r7b clr a movc a, @a+dptr sjmp rdr6r7c rdr6r7b:movx a, @dptr rdr6r7c:pop dpl pop dph ret rdr6r7d:mov a, r5 sjmp rdr6r7c .equ esc_char, 27 cursor_home: acall term_esc mov a, #'H' ajmp cout_hh cursor_down: ;acc is # of lines to move down acall term_esc acall pint_hh mov a, #'B' ajmp cout_hh cursor_up: ;acc is # of lines to move up acall term_esc acall pint_hh mov a, #'A' ajmp cout_hh cursor_left: ;acc is # of characters to move left acall term_esc acall pint_hh mov a, #'D' ajmp cout_hh cursor_right: ;acc is # of characters to move right acall term_esc acall pint_hh mov a, #'C' ajmp cout_hh inverse_on: mov dptr, #str_so ajmp pstr_hh str_so: .db esc_char, "[0;7m", 0 inverse_off: mov dptr, #str_se ajmp pstr_hh str_se: .db esc_char, "[0m", 0 term_esc: push acc mov a, #esc_char acall cout_hh mov a, #'[' acall cout_hh pop acc ret print_addr_line: mov dptr, #str_addr acall pstr_hh mov r0, #0 paddrl: acall space mov a, #'+' acall cout_hh mov a, r0 lcall phex1 inc r0 cjne r0, #16, paddrl mov dptr, #str_ascii_equiv ajmp pstr_hh print_dash_line: mov r0, #72 pdashl: mov a, #'-' acall cout_hh djnz r0, pdashl ret print_title_line: mov a, r4 jb acc.0, ptitle2 mov dptr, #str_code sjmp ptitle3 ptitle2:mov dptr, #str_data ptitle3:acall pstr_hh mov r0, #8 ptitlel:acall space djnz r0, ptitlel mov dptr, #str_title ajmp pcstr_hh erase_commands: acall cursor_home mov a, #20 acall cursor_down mov r2, #72 ercmd2: acall space djnz r2, ercmd2 mov a, #72 ajmp cursor_left ; R4, Flags: ; bit0: 0=display CODE memory, 1=display DATA memory ; bit1: 0=editing disabled, 1=editing enabled ; bit2: 0=editing in hex, 1=editing in ascii ; bit3: 0=normal, 1=in middle of hex entry (value in r5) print_commands: mov a, r4 jnb acc.1, pcmd_no_edit mov dptr, #str_cmd3 jb acc.2, pcmd_ascii mov dptr, #str_cmd4 pcmd_ascii: acall pstr_hh mov dptr, #str_cmd5 acall pstr_hh sjmp pcmd_finish pcmd_no_edit: mov dptr, #str_cmd2 acall pstr_hh pcmd_finish: mov dptr, #str_cmd1 ajmp pstr_hh str_cmd1: .db " ^G=Goto ^C=Code ^D=Data ^L=Redraw ^Q=Quit", 0 str_cmd2: .db "^E-Edit",0 str_cmd3: .db "^A=", esc_char, "[0;7m", "ASCII", esc_char, "[0m", " ^X=Hex", 0 str_cmd4: .db "^A=ASCII ^X=", esc_char, "[0;7m", "Hex", esc_char, "[0m", 0 str_cmd5: .db " ^F=Fill",0 str_cl: .db esc_char, "[H", esc_char, "[2J", 0 str_addr: .db "ADDR:",0 str_ascii_equiv: .db " ASCII EQUIVILANT",0 str_title: .db "8051",31,154,31,131,31,216,"or,",31,248,31,254,", 1996",0 str_code: .db "CODE",0 str_data: .db "DATA",0 cout_hh:ljmp cout phex_hh:ljmp phex pstr_hh:ljmp pstr newline_hh:ljmp newline pcstr_hh:ljmp pcstr pint_hh:ljmp pint ;---------------------------------------------------------; ; ; ; single step strings ; ; ; ;---------------------------------------------------------; prompt4:.db "), or to exit: ",0 prompt8:.db 13,31,136,128,131,129," (",0 abort: .db " Command Aborted.",13,10,0 sserr1: .db 13,161,197," connect INT1 (pin 13) low" .db 128,186,207,204,13,0 sserr2: .db 148,"2",179,199,174,129," 0013",13,0 sserr3: .db 31,184,179,255,165," vector",174," ",0 ssmsg: .db 13,"Now",134,"ning",166,207,204," mode: " .db "=",204,", ?= Help",13,13,0 sskip1: .db "Skipping Instruction-> ",0 ssdmps1:.db 13,10,"Loc: Int RAM Memory Contents",13,10,0 chaccs1:.db "New Acc Value: ",0 help5txt:.db 13 .db 31,207,31,204,31,158,":",13 .db " ",134,212,246,13 .db " ",134,212,246,13 .db " '?' ",255,142,215,13 .db " '.' ",255,196,253,"s",13 .db " 'R' ",255," special function",196,"s",13 .db " 'H' ",132,219,192,146,13 .db " 'S' ",252,212,246,13 .db " 'A' ",240,162," Acc value",13 .db " 'Q' ",200,207,204,13,14 squit: .db "Quit",13,10,0 ssnames:.db " ACC B C DPTR R0 R1 R2 R3 R4 R5 R6 R7 SP" .db " Addr Instruction",13,10,0 ;---------------------------------------------------------; ; ; ; disassembler data ; ; ; ;---------------------------------------------------------; mnu_tbl:.db "ACAL",'L'+128 .db 0 .db "AD",'D'+128 .db 0 .db "ADD",'C'+128 .db "AJM",'P'+128 .db "AN",'L'+128 .db "CJN",'E'+128 .db "CL",'R'+128 .db "CP",'L'+128 .db "D",'A'+128 .db "DE",'C'+128 .db "DI",'V'+128 .db "DJN",'Z'+128 .db "IN",'C'+128 .db "J",'B'+128 .db "JB",'C'+128 .db "J",'C'+128 .db "JM",'P'+128 .db "JN",'B'+128 .db "JN",'C'+128 .db "JN",'Z'+128 .db "J",'Z'+128 .db "LCAL",'L'+128 .db "LJM",'P'+128 .db "MO",'V'+128 .db "MOV",'C'+128 .db "MOV",'X'+128 .db "MU",'L'+128 .db "NO",'P'+128 .db "OR",'L'+128 .db "PO",'P'+128 .db "PUS",'H'+128 .db "RE",'T'+128 .db "RET",'I'+128 .db "R",'L'+128 .db "RL",'C'+128 .db "R",'R'+128 .db "RR",'C'+128 .db "SET",'B'+128 .db "SJM",'P'+128 .db "SUB",'B'+128 .db "SWA",'P'+128 .db "XC",'H'+128 .db "XCH",'D'+128 .db "XR",'L'+128 .db "??",'?'+128 bitmnu: .db 'P','0'+128 .db "TCO",'N'+128 .db 'P','1'+128 .db "SCO",'N'+128 .db 'P','2'+128 .db 'I','E'+128 .db 'P','3'+128 .db 'I','P'+128 .db 'C','0'+128 .db "T2CO",'N'+128 .db "PS",'W'+128 .db 'D','8'+128 .db "AC",'C'+128 .db 'E'+'8'+128 .db 'B'+128 .db 'F'+'8'+128 as31-2.3.1/examples/Makefile.in0000644000175000001440000001045210307071452015371 0ustar erazorusers# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CFLAGS = @CFLAGS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GUI_CFLAGS = @GUI_CFLAGS@ GUI_LIBS = @GUI_LIBS@ LIBS = @LIBS@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ YACC = @YACC@ EXTRA_DIST = extra.asm extra.ref paulmon1.asm paulmon1.ref paulmon2.asm paulmon2.ref mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best all: all-redirect .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps examples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status tags: TAGS TAGS: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = examples distdir: $(DISTFILES) @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am install-exec-am: install-exec: install-exec-am install-data-am: install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall: uninstall-am all-am: Makefile all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am .PHONY: tags distdir info-am info dvi-am dvi check check-am \ installcheck-am installcheck install-exec-am install-exec \ install-data-am install-data install-am install uninstall-am uninstall \ all-redirect all-am all installdirs mostlyclean-generic \ distclean-generic clean-generic maintainer-clean-generic clean \ mostlyclean distclean maintainer-clean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: as31-2.3.1/examples/Makefile.am0000644000175000001440000000014510307071452015356 0ustar erazorusersEXTRA_DIST = extra.asm extra.ref \ paulmon1.asm paulmon1.ref \ paulmon2.asm paulmon2.ref as31-2.3.1/mkinstalldirs0000644000175000001440000000132210307071452014305 0ustar erazorusers#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here as31-2.3.1/missing0000644000175000001440000001452010307071452013102 0ustar erazorusers#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997, 2001, 2002 Free Software Foundation, Inc. # Franc,ois Pinard , 1996. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.in; then configure_ac=configure.ac else configure_ac=configure.in fi case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing - GNU libit 0.0" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`$configure_ac'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`$configure_ac'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`$configure_ac'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 as31-2.3.1/install-sh0000644000175000001440000001440610307071452013512 0ustar erazorusers#!/bin/sh # # install - install a program, script, or datafile # # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 as31-2.3.1/configure.in0000644000175000001440000000325610307071452014023 0ustar erazorusersAC_INIT(as31/as31.c) AM_INIT_AUTOMAKE(as31, 2.3.0) dnl ******************************************************************** dnl Minimal Requirements dnl ******************************************************************** AC_PROG_CC AC_PROG_YACC AC_PROG_INSTALL LIBS="$LIBS" CFLAGS="$CFLAGS" AC_SUBST(LIBS) AC_SUBST(CFLAGS) dnl ******************************************************************** dnl Options dnl ******************************************************************** option_gtk=false AC_MSG_CHECKING(for gtk) AC_ARG_ENABLE(gtk, [ --enable-gtk build as31 with graphical user interface (alpha)], gtk="$enableval", gtk="no") case "$gtk" in yes) option_gtk=true AC_DEFINE(OPTION_GTK, 1) AC_MSG_RESULT(yes) ;; *) AC_DEFINE(OPTION_GTK, 0) AC_MSG_RESULT(no) ;; esac dnl ******************************************************************** dnl Check for Gtk GUI dnl ******************************************************************** GUI_LIBS="" GUI_CFLAGS="" AC_SUBST(GUI_LIBS) AC_SUBST(GUI_CFLAGS) if test x$option_gtk = xtrue ; then have_gtk=false AM_PATH_GTK(1.0.1, have_gtk=true) if test x$have_gtk = xfalse ; then option_gtk=false else GUI_LIBS="$GTK_LIBS" GUI_CFLAGS="$GTK_CFLAGS" fi fi dnl ******************************************************************** dnl Conditional dnl ******************************************************************** AM_CONDITIONAL(OPTION_GTK, test x$option_gtk = xtrue) dnl ******************************************************************** dnl Output dnl ******************************************************************** AC_OUTPUT(Makefile as31/Makefile examples/Makefile) as31-2.3.1/configure0000644000175000001440000035355210307071452013425 0ustar erazorusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="as31/as31.c" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT YACC GUI_LIBS GUI_CFLAGS GTK_CONFIG GTK_CFLAGS GTK_LIBS OPTION_GTK_TRUE OPTION_GTK_FALSE LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-gtk build as31 with graphical user interface (alpha) --disable-gtktest Do not try to compile and run a test GTK program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gtk-prefix=PFX Prefix where GTK is installed (optional) --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd "$ac_popdir" done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version="1.4" ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftestfile # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftestfile` fi if test "$*" != "X $srcdir/configure conftestfile" \ && test "$*" != "X conftestfile $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftestfile ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi rm -f conftest* echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi PACKAGE=as31 VERSION=2.3.0 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF missing_dir=`cd $ac_aux_dir && pwd` echo "$as_me:$LINENO: checking for working aclocal-${am__api_version}" >&5 echo $ECHO_N "checking for working aclocal-${am__api_version}... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (aclocal-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then ACLOCAL=aclocal-${am__api_version} echo "$as_me:$LINENO: result: found" >&5 echo "${ECHO_T}found" >&6 else ACLOCAL="$missing_dir/missing aclocal-${am__api_version}" echo "$as_me:$LINENO: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi echo "$as_me:$LINENO: checking for working autoconf" >&5 echo $ECHO_N "checking for working autoconf... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (autoconf --version) < /dev/null > /dev/null 2>&1; then AUTOCONF=autoconf echo "$as_me:$LINENO: result: found" >&5 echo "${ECHO_T}found" >&6 else AUTOCONF="$missing_dir/missing autoconf" echo "$as_me:$LINENO: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi echo "$as_me:$LINENO: checking for working automake-${am__api_version}" >&5 echo $ECHO_N "checking for working automake-${am__api_version}... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (automake-${am__api_version} --version) < /dev/null > /dev/null 2>&1; then AUTOMAKE=automake-${am__api_version} echo "$as_me:$LINENO: result: found" >&5 echo "${ECHO_T}found" >&6 else AUTOMAKE="$missing_dir/missing automake-${am__api_version}" echo "$as_me:$LINENO: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi echo "$as_me:$LINENO: checking for working autoheader" >&5 echo $ECHO_N "checking for working autoheader... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (autoheader --version) < /dev/null > /dev/null 2>&1; then AUTOHEADER=autoheader echo "$as_me:$LINENO: result: found" >&5 echo "${ECHO_T}found" >&6 else AUTOHEADER="$missing_dir/missing autoheader" echo "$as_me:$LINENO: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi echo "$as_me:$LINENO: checking for working makeinfo" >&5 echo $ECHO_N "checking for working makeinfo... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (makeinfo --version) < /dev/null > /dev/null 2>&1; then MAKEINFO=makeinfo echo "$as_me:$LINENO: result: found" >&5 echo "${ECHO_T}found" >&6 else MAKEINFO="$missing_dir/missing makeinfo" echo "$as_me:$LINENO: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_YACC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then echo "$as_me:$LINENO: result: $YACC" >&5 echo "${ECHO_T}$YACC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' LIBS="$LIBS" CFLAGS="$CFLAGS" option_gtk=false echo "$as_me:$LINENO: checking for gtk" >&5 echo $ECHO_N "checking for gtk... $ECHO_C" >&6 # Check whether --enable-gtk or --disable-gtk was given. if test "${enable_gtk+set}" = set; then enableval="$enable_gtk" gtk="$enableval" else gtk="no" fi; case "$gtk" in yes) option_gtk=true cat >>confdefs.h <<\_ACEOF #define OPTION_GTK 1 _ACEOF echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 ;; *) cat >>confdefs.h <<\_ACEOF #define OPTION_GTK 0 _ACEOF echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac GUI_LIBS="" GUI_CFLAGS="" if test x$option_gtk = xtrue ; then have_gtk=false # Check whether --with-gtk-prefix or --without-gtk-prefix was given. if test "${with_gtk_prefix+set}" = set; then withval="$with_gtk_prefix" gtk_config_prefix="$withval" else gtk_config_prefix="" fi; # Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given. if test "${with_gtk_exec_prefix+set}" = set; then withval="$with_gtk_exec_prefix" gtk_config_exec_prefix="$withval" else gtk_config_exec_prefix="" fi; # Check whether --enable-gtktest or --disable-gtktest was given. if test "${enable_gtktest+set}" = set; then enableval="$enable_gtktest" else enable_gtktest=yes fi; for module in . do case "$module" in gthread) gtk_config_args="$gtk_config_args gthread" ;; esac done if test x$gtk_config_exec_prefix != x ; then gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config fi fi if test x$gtk_config_prefix != x ; then gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_prefix/bin/gtk-config fi fi # Extract the first word of "gtk-config", so it can be a program name with args. set dummy gtk-config; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_GTK_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $GTK_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTK_CONFIG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no" ;; esac fi GTK_CONFIG=$ac_cv_path_GTK_CONFIG if test -n "$GTK_CONFIG"; then echo "$as_me:$LINENO: result: $GTK_CONFIG" >&5 echo "${ECHO_T}$GTK_CONFIG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi min_gtk_version=1.0.1 echo "$as_me:$LINENO: checking for GTK - version >= $min_gtk_version" >&5 echo $ECHO_N "checking for GTK - version >= $min_gtk_version... $ECHO_C" >&6 no_gtk="" if test "$GTK_CONFIG" = "no" ; then no_gtk=yes else GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_gtktest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" rm -f conf.gtktest if test "$cross_compiling" = yes; then echo $ac_n "cross compiling; assumed OK... $ac_c" else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include int main () { int major, minor, micro; char *tmp_version; system ("touch conf.gtktest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_gtk_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_gtk_version"); exit(1); } if ((gtk_major_version != $gtk_config_major_version) || (gtk_minor_version != $gtk_config_minor_version) || (gtk_micro_version != $gtk_config_micro_version)) { printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, gtk_major_version, gtk_minor_version, gtk_micro_version); printf ("*** was found! If gtk-config was correct, then it is best\n"); printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } #if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) else if ((gtk_major_version != GTK_MAJOR_VERSION) || (gtk_minor_version != GTK_MINOR_VERSION) || (gtk_micro_version != GTK_MICRO_VERSION)) { printf("*** GTK+ header files (version %d.%d.%d) do not match\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", gtk_major_version, gtk_minor_version, gtk_micro_version); } #endif /* defined (GTK_MAJOR_VERSION) ... */ else { if ((gtk_major_version > major) || ((gtk_major_version == major) && (gtk_minor_version > minor)) || ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", gtk_major_version, gtk_minor_version, gtk_micro_version); printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); printf("*** correct copy of gtk-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) no_gtk=yes fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gtk" = x ; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 have_gtk=true else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 if test "$GTK_CONFIG" = "no" ; then echo "*** The gtk-config script installed by GTK could not be found" echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GTK_CONFIG environment variable to the" echo "*** full path to gtk-config." else if test -f conf.gtktest ; then : else echo "*** Could not run GTK test program, checking why..." CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GTK or finding the wrong" echo "*** version of GTK. If it is not finding GTK, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" echo "***" echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" echo "*** came with the system with the command" echo "***" echo "*** rpm --erase --nodeps gtk gtk-devel" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GTK was incorrectly installed" echo "*** or that you have moved GTK since it was installed. In the latter case, you" echo "*** may want to edit the gtk-config script: $GTK_CONFIG" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GTK_CFLAGS="" GTK_LIBS="" : fi rm -f conf.gtktest if test x$have_gtk = xfalse ; then option_gtk=false else GUI_LIBS="$GTK_LIBS" GUI_CFLAGS="$GTK_CFLAGS" fi fi if test x$option_gtk = xtrue; then OPTION_GTK_TRUE= OPTION_GTK_FALSE='#' else OPTION_GTK_TRUE='#' OPTION_GTK_FALSE= fi ac_config_files="$ac_config_files Makefile as31/Makefile examples/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "as31/Makefile" ) CONFIG_FILES="$CONFIG_FILES as31/Makefile" ;; "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@YACC@,$YACC,;t t s,@GUI_LIBS@,$GUI_LIBS,;t t s,@GUI_CFLAGS@,$GUI_CFLAGS,;t t s,@GTK_CONFIG@,$GTK_CONFIG,;t t s,@GTK_CFLAGS@,$GTK_CFLAGS,;t t s,@GTK_LIBS@,$GTK_LIBS,;t t s,@OPTION_GTK_TRUE@,$OPTION_GTK_TRUE,;t t s,@OPTION_GTK_FALSE@,$OPTION_GTK_FALSE,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi as31-2.3.1/aclocal.m40000644000175000001440000003176110307071452013354 0ustar erazorusersdnl aclocal.m4 generated automatically by aclocal 1.4-p6 dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A dnl PARTICULAR PURPOSE. # Do all the work for Automake. This macro actually does too much -- # some checks are only needed if your package does certain things. # But this isn't really a big deal. # serial 1 dnl Usage: dnl AM_INIT_AUTOMAKE(package,version, [no-define]) AC_DEFUN([AM_INIT_AUTOMAKE], [AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL]) PACKAGE=[$1] AC_SUBST(PACKAGE) VERSION=[$2] AC_SUBST(VERSION) dnl test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi ifelse([$3],, AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) AC_REQUIRE([AM_SANITY_CHECK]) AC_REQUIRE([AC_ARG_PROGRAM]) dnl FIXME This is truly gross. missing_dir=`cd $ac_aux_dir && pwd` AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}, $missing_dir) AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}, $missing_dir) AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) AC_REQUIRE([AC_PROG_MAKE_SET])]) # Copyright 2002 Free Software Foundation, Inc. # 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, 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., 59 Temple Place - Suite 330, Boston, MA # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.4"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.4-p6])]) # # Check to make sure that the build environment is sane. # AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftestfile # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` if test "[$]*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftestfile` fi if test "[$]*" != "X $srcdir/configure conftestfile" \ && test "[$]*" != "X conftestfile $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "[$]2" = conftestfile ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi rm -f conftest* AC_MSG_RESULT(yes)]) dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) dnl The program must properly implement --version. AC_DEFUN([AM_MISSING_PROG], [AC_MSG_CHECKING(for working $2) # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if ($2 --version) < /dev/null > /dev/null 2>&1; then $1=$2 AC_MSG_RESULT(found) else $1="$3/missing $2" AC_MSG_RESULT(missing) fi AC_SUBST($1)]) # Configure paths for GTK+ # Owen Taylor 97-11-3 dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS dnl AC_DEFUN(AM_PATH_GTK, [dnl dnl Get the cflags and libraries from the gtk-config script dnl AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], gtk_config_prefix="$withval", gtk_config_prefix="") AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], , enable_gtktest=yes) for module in . $4 do case "$module" in gthread) gtk_config_args="$gtk_config_args gthread" ;; esac done if test x$gtk_config_exec_prefix != x ; then gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config fi fi if test x$gtk_config_prefix != x ; then gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" if test x${GTK_CONFIG+set} != xset ; then GTK_CONFIG=$gtk_config_prefix/bin/gtk-config fi fi AC_PATH_PROG(GTK_CONFIG, gtk-config, no) min_gtk_version=ifelse([$1], ,0.99.7,$1) AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) no_gtk="" if test "$GTK_CONFIG" = "no" ; then no_gtk=yes else GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_gtktest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$GTK_LIBS $LIBS" dnl dnl Now check if the installed GTK is sufficiently new. (Also sanity dnl checks the results of gtk-config to some extent dnl rm -f conf.gtktest AC_TRY_RUN([ #include #include #include int main () { int major, minor, micro; char *tmp_version; system ("touch conf.gtktest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = g_strdup("$min_gtk_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_gtk_version"); exit(1); } if ((gtk_major_version != $gtk_config_major_version) || (gtk_minor_version != $gtk_config_minor_version) || (gtk_micro_version != $gtk_config_micro_version)) { printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, gtk_major_version, gtk_minor_version, gtk_micro_version); printf ("*** was found! If gtk-config was correct, then it is best\n"); printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } #if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) else if ((gtk_major_version != GTK_MAJOR_VERSION) || (gtk_minor_version != GTK_MINOR_VERSION) || (gtk_micro_version != GTK_MICRO_VERSION)) { printf("*** GTK+ header files (version %d.%d.%d) do not match\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); printf("*** library (version %d.%d.%d)\n", gtk_major_version, gtk_minor_version, gtk_micro_version); } #endif /* defined (GTK_MAJOR_VERSION) ... */ else { if ((gtk_major_version > major) || ((gtk_major_version == major) && (gtk_minor_version > minor)) || ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", gtk_major_version, gtk_minor_version, gtk_micro_version); printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); printf("*** correct copy of gtk-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gtk" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$GTK_CONFIG" = "no" ; then echo "*** The gtk-config script installed by GTK could not be found" echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GTK_CONFIG environment variable to the" echo "*** full path to gtk-config." else if test -f conf.gtktest ; then : else echo "*** Could not run GTK test program, checking why..." CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS" AC_TRY_LINK([ #include #include ], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GTK or finding the wrong" echo "*** version of GTK. If it is not finding GTK, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" echo "***" echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" echo "*** came with the system with the command" echo "***" echo "*** rpm --erase --nodeps gtk gtk-devel" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GTK was incorrectly installed" echo "*** or that you have moved GTK since it was installed. In the latter case, you" echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GTK_CFLAGS="" GTK_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) rm -f conf.gtktest ]) # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_SUBST($1_TRUE) AC_SUBST($1_FALSE) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi]) as31-2.3.1/README0000644000175000001440000000044510307071452012367 0ustar erazorusers as31 - 8031/8051 Assembler -------------------------- This is a beta test release of AS31. To build and install as31 on Linux, read INSTALL Please report any problems to Paul Stoffregen Martin Langer Thank you. We hope you find AS31 useful. as31-2.3.1/NEWS0000644000175000001440000000054610307071452012210 0ustar erazorusers as31 - 8031/8051 Assembler -------------------------- v2.3.0 Martin Langer : ************************************************************** Dear original authors, please correct COPYING if I put the wrong license in that file or remove these lines. Thanks. ************************************************************** as31-2.3.1/Makefile.in0000644000175000001440000002316210307071452013555 0ustar erazorusers# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CFLAGS = @CFLAGS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GUI_CFLAGS = @GUI_CFLAGS@ GUI_LIBS = @GUI_LIBS@ LIBS = @LIBS@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ YACC = @YACC@ SUBDIRS = as31 examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \ Makefile.in NEWS aclocal.m4 configure configure.in install-sh missing \ mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best all: all-redirect .SUFFIXES: $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. @SET_MAKE@ all-recursive install-data-recursive install-exec-recursive \ installdirs-recursive install-recursive uninstall-recursive \ check-recursive installcheck-recursive info-recursive dvi-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $(MAKEFLAGS); amf=$$2; \ dot_seen=no; \ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ rev="$$subdir $$rev"; \ test "$$subdir" != "." || dot_seen=yes; \ done; \ test "$$dot_seen" = "no" && rev=". $$rev"; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags -o $$here/TAGS $(ETAGS_ARGS) $$tags $$unique $(LISP)) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -rm -rf $(distdir) GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz mkdir $(distdir)/=build mkdir $(distdir)/=inst dc_install_base=`cd $(distdir)/=inst && pwd`; \ cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) dist -rm -rf $(distdir) @banner="$(distdir).tar.gz is ready for distribution"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes" dist: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) dist-all: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) distdir: $(DISTFILES) -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done for subdir in $(SUBDIRS); do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ chmod 777 $(distdir)/$$subdir; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ || exit 1; \ fi; \ done info-am: info: info-recursive dvi-am: dvi: dvi-recursive check-am: all-am check: check-recursive installcheck-am: installcheck: installcheck-recursive install-exec-am: install-exec: install-exec-recursive install-data-am: install-data: install-data-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-recursive uninstall-am: uninstall: uninstall-recursive all-am: Makefile all-redirect: all-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: installdirs-recursive installdirs-am: mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-recursive clean-am: clean-tags clean-generic mostlyclean-am clean: clean-recursive distclean-am: distclean-tags distclean-generic clean-am distclean: distclean-recursive -rm -f config.status maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-recursive -rm -f config.status .PHONY: install-data-recursive uninstall-data-recursive \ install-exec-recursive uninstall-exec-recursive installdirs-recursive \ uninstalldirs-recursive all-recursive check-recursive \ installcheck-recursive info-recursive dvi-recursive \ mostlyclean-recursive distclean-recursive clean-recursive \ maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ install-exec install-data-am install-data install-am install \ uninstall-am uninstall all-redirect all-am all installdirs-am \ installdirs mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: as31-2.3.1/Makefile.am0000644000175000001440000000003010307071452013531 0ustar erazorusersSUBDIRS = as31 examples as31-2.3.1/INSTALL0000644000175000001440000000020610307071452012533 0ustar erazorusers as31 - 8031/8051 Assembler -------------------------- To build and install as31 on Linux, type ./configure make make install as31-2.3.1/ChangeLog0000644000175000001440000000314610307073227013264 0ustar erazorusers as31 - 8031/8051 Assembler http://wiki.erazor-zone.de/doku.php/wiki:projects:linux:as31 -------------------------- REVISION HISTORY: Jan. 19, 1990 Created. (Ken Stauffer). Jan. 30, 1990 Theo played here. Late 1994 Paul Stoffregen updates the code Sept 1995 bug fixes, add obsure option for cgi April 2000 fix filename handling convert everything to ANSI C and bison properly handle 0b0h as hex 0xB0, not binary 0 Make most errors into warning, and modify parser to recover and continue to the end of the file so that all warning are shown. March 2001 fix crash with srecord format command line version returns non-zero on error July 2003 added include directive (Bernd Porr) March 2004 Alexander 'E-Razor' Krause : removed bug when using more than 1 .inc tmp filename is now as-uid-random remove tmp_file when ready May 06, 2004 Alexander 'E-Razor' Krause : compiler error on gcc < 3 solved May 18, 2004 Martin Langer : (Version 2.2.1) - fixing some visible bugs - adds the missing -s option Mar 09, 2005 Martin Langer : (Version 2.3.0) - automake scripts introduced - old static Makefile removed - write output to custom file added, using -Ofilename - command options -v and -h added - I've tried to figure out the license, see NEWS - manpage modifications - lots of small fixes and cleanups Sep 05, 2005 Alexander 'E-Razor' Krause : (Version 2.3.1) - 'Location counter overlaps' on 64bit systems solved as31-2.3.1/COPYING0000644000175000001440000000054010307071452012536 0ustar erazorusers as31 - 8031/8051 Assembler -------------------------- The home of as31 at http://www.pjrc.com/tech/8051/ says: AS31 is Free Software, provided under the BSD license. AS31 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. as31-2.3.1/AUTHORS0000644000175000001440000000100510307071452012550 0ustar erazorusers as31 - 8031/8051 Assembler -------------------------- Written by: Ken Stauffer Paul Stoffregen Bernd Porr Alexander 'E-Razor' Krause Martin Langer Maintained at: http://www.pjrc.com/tech/8051/ http://www.cn.stir.ac.uk/~bp1/as31/ Please report problems to: Paul Stoffregen Bernd Porr Martin Langer