baycomusb-0.10.orig/0042755000175100017510000000000007340500013012405 5ustar abaababaycomusb-0.10.orig/Makefile.in0100644000175100017510000003043707340500000014450 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ SUBDIRS = intl po firmware fpga directx kerneldrv wdmdrv misc usbdrv trxapi trxctrl flexdrv trxclient winserv diag trxapp coinstaller INCLUDES = $(GTK_CFLAGS) -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir) -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 EXTRA_DIST = ABOUT-NLS baycomusb.spec baycomusb.initscript baycomusb.ifchange sdccasmcs51.diff cfgwindows cfgwindowsnodebug cfgwindowsnative ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = DIST_COMMON = README ./stamp-h.in ABOUT-NLS AUTHORS COPYING ChangeLog \ INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 config.guess \ config.h.in config.sub configure configure.in install-sh missing \ mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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) config.h: stamp-h @if test ! -f $@; then \ rm -f stamp-h; \ $(MAKE) stamp-h; \ else :; fi stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h cd $(top_srcdir) && $(AUTOHEADER) @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: clean-hdr: distclean-hdr: -rm -f config.h maintainer-clean-hdr: # 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) config.h.in $(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)config.h.in$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) 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 --with-included-gettext --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 all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-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 config.h all-redirect: all-recursive-am 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-hdr mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-recursive clean-am: clean-hdr clean-tags clean-generic mostlyclean-am clean: clean-recursive distclean-am: distclean-hdr distclean-tags distclean-generic clean-am distclean: distclean-recursive -rm -f config.status maintainer-clean-am: maintainer-clean-hdr 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: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ 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 all-recursive-am \ 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: baycomusb-0.10.orig/README0100644000175100017510000000171007326537236013304 0ustar abaabaKnown Software Bugs: Windows: - LED's of baycomusbtrx do not work in 256bit color mode Windows 2000: - Kernel coredumps during shutdown when modem plugged in => solved by setting DO_POWER_PAGEABLE UHCI Host Controller Limitations: The way Intel designed UHCI there is a hard limit of one received packet per USB frame, i.e. 1000 packets/second. Also there is one host controller interrupt per received packet. For high-performance applications, OHCI is to be preferred over UHCI. Modifikationen TODO: - USBD+/USBD- am Stecker vertauscht - 3.3V Power: Schaltung verkehrt (Feedback am Opamp). 3.3V Regler verwenden? - RSSI ADC: Widerstaende anders: R46: 68k R48: 82k (2.7V am Komparator Pin 2) R17: 82k (zum FPGA) R16: 1k (Schutzwiderstand nach Aussen) Modifikationen am T7F: Squelchpoti voll links an den Anschlag, sonst macht die Squelchschaltung das RSSI-Signal kaputt. R57 verkleinern, z.B. auf 2.2k, sonst tut die UART nicht mit 5V-Pegeln. baycomusb-0.10.orig/stamp-h.in0100644000175100017510000000001207340435146014310 0ustar abaabatimestamp baycomusb-0.10.orig/ABOUT-NLS0100644000175100017510000002660307325134422013650 0ustar abaabaNotes on the Free Translation Project ************************************* Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do *not* need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work at translations should contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. One advise in advance ===================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias or message inheritance) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need not provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. INSTALL Matters =============== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system provides usable `catgets' (if using this is selected by the installer) or `gettext' functions. If neither is available, the GNU `gettext' own library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is *not* required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --with-catgets ./configure --disable-nls will respectively bypass any pre-existing `catgets' or `gettext' to use the internationalizing routines provided within this package, enable the use of the `catgets' functions (if found on the locale system), or else, *totally* disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might be not what is desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. By default the configuration process will not test for the `catgets' function and therefore they will not be used. The reasons are already given above: the emulation on top of `catgets' cannot provide all the extensions provided by the GNU `gettext' library. If you nevertheless want to use the `catgets' functions use ./configure --with-catgets to enable the test for `catgets' (this causes no harm if `catgets' is not available on your system). If you really select this option we would like to hear about the reasons because we cannot think of any good one ourself. Internationalized packages have usually many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. Using This Package ================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate ISO 639 `LL' two-letter code prior to using the programs in the package. For example, let's suppose that you speak German. At the shell prompt, merely execute `setenv LANG de' (in `csh'), `export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. An operating system might already offer message localization for many of its programs, while other programs have been installed locally with the full capabilities of GNU `gettext'. Just using `gettext' extended syntax for `LANG' would break proper localization of already available operating system programs. In this case, users should set both `LANGUAGE' and `LANG' variables in their environment, as programs using GNU `gettext' give preference to `LANGUAGE'. For example, some Swedish users would rather read translations in German than English for when Swedish is not available. This is easily accomplished by setting `LANGUAGE' to `sv:de' while leaving `LANG' to `sv'. Translating Teams ================= For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list, courtesy of Linux International. You may reach your translation team at the address `LL@li.org', replacing LL by the two-letter ISO 639 code for your language. Language codes are *not* the same as the country codes given in ISO 3166. The following translation teams exist, as of December 1997: Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en', Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja', Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es', Swedish `sv', and Turkish `tr'. For example, you may reach the Chinese translation team by writing to `zh@li.org'. If you'd like to volunteer to *work* at translating messages, you should become a member of the translating team for your own language. The subscribing address is *not* the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate *actively* in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skill are praised more than programming skill, here. Available Packages ================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of December 1997. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination. Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv .----------------------------------------------------. bash | [] [] [] | 3 bison | [] [] [] | 3 clisp | [] [] [] [] | 4 cpio | [] [] [] [] [] [] | 6 diffutils | [] [] [] [] [] | 5 enscript | [] [] [] [] [] [] | 6 fileutils | [] [] [] [] [] [] [] [] [] [] | 10 findutils | [] [] [] [] [] [] [] [] [] | 9 flex | [] [] [] [] | 4 gcal | [] [] [] [] [] | 5 gettext | [] [] [] [] [] [] [] [] [] [] [] | 12 grep | [] [] [] [] [] [] [] [] [] [] | 10 hello | [] [] [] [] [] [] [] [] [] [] [] | 11 id-utils | [] [] [] | 3 indent | [] [] [] [] [] | 5 libc | [] [] [] [] [] [] [] | 7 m4 | [] [] [] [] [] [] | 6 make | [] [] [] [] [] [] | 6 music | [] [] | 2 ptx | [] [] [] [] [] [] [] [] | 8 recode | [] [] [] [] [] [] [] [] [] | 9 sh-utils | [] [] [] [] [] [] [] [] | 8 sharutils | [] [] [] [] [] [] | 6 tar | [] [] [] [] [] [] [] [] [] [] [] | 11 texinfo | [] [] [] | 3 textutils | [] [] [] [] [] [] [] [] [] | 9 wdiff | [] [] [] [] [] [] [] [] | 8 `----------------------------------------------------' 17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv 27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If December 1997 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. baycomusb-0.10.orig/AUTHORS0100644000175100017510000000004707325134422013463 0ustar abaabaThomas Sailer, baycomusb-0.10.orig/COPYING0100644000175100017510000004307607325134422013457 0ustar abaaba GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. baycomusb-0.10.orig/ChangeLog0100644000175100017510000000064507337537307014205 0ustar abaaba2001-08-18 Thomas Sailer * firmware/reset2firmware/main.asm (doneactive): fix control register value to prevent PTT transient 2001-07-02 Thomas Sailer * changed MaxPower to 0mA 2001-06-13 Thomas Sailer * changed USB VID/PID 2001-03-09 Thomas Sailer * trxctrl/server.c: Requiring T7F Firmware 1.44 baycomusb-0.10.orig/INSTALL0100644000175100017510000000000007325134422013431 0ustar abaababaycomusb-0.10.orig/Makefile.am0100644000175100017510000000102307331011226014433 0ustar abaaba## Process this file with automake to produce Makefile.in SUBDIRS = intl po firmware fpga directx kerneldrv wdmdrv misc usbdrv trxapi \ trxctrl flexdrv trxclient winserv diag trxapp coinstaller INCLUDES = $(GTK_CFLAGS) -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \ -I$(top_srcdir) -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 EXTRA_DIST = ABOUT-NLS baycomusb.spec baycomusb.initscript baycomusb.ifchange sdccasmcs51.diff \ cfgwindows cfgwindowsnodebug cfgwindowsnative baycomusb-0.10.orig/NEWS0100644000175100017510000000055407337537202013123 0ustar abaabaVersion 0.7 - Asynchronous Bulk Queueing - hopefully much better performance (lower latency) - Audio Version 0.8 - nasty bit stuffing bug in fsk transmitter fixed - better sample rate converter in audio mode Version 0.9 - Win32: shmem IPC for flex driver - Audio: PTT indicator works now Version 0.10 - Prevent transient on PTT line during configuration baycomusb-0.10.orig/acconfig.h0100644000175100017510000000210407331750716014340 0ustar abaaba/* define if int8_t and friends are available */ #undef HAVE_BITTYPES /* define if struct ifreq has the ifr_newname symbol */ #undef HAVE_GETSYSTEMTIME /* define if MMX is to be used */ #undef USEMMX /* define if VIS is to be used */ #undef USEVIS /* define if we have found the MKISS driver (line discipline) */ #undef HAVE_MKISS /* define if we want baycomusbserv to not require the kernel mode driver */ #undef USERMODEDRV /* use ORBit for interprocess communication */ #undef ORBITIPC /* define if M_PI is not defined by math.h */ #undef M_PI /* define if M_LN10 is not defined by math.h */ #undef M_LN10 /* define if struct ifreq has the ifr_newname symbol */ #undef HAVE_IFRNEWNAME /* define if we have DirectX includes */ #undef HAVE_DIRECTX /* define if National Language Support is requested */ #undef ENABLE_NLS /* define if compiling under Windows32 */ #undef WIN32 /* NLS stuff */ #undef HAVE_CATGETS #undef HAVE_GETTEXT #undef HAVE_LC_MESSAGES #undef HAVE_STPCPY /* various directories */ #undef PACKAGE_LOCALE_DIR #undef PACKAGE_DATA_DIR #undef PACKAGE_SOURCE_DIR baycomusb-0.10.orig/aclocal.m40100644000175100017510000006642507340435135014271 0ustar abaabadnl aclocal.m4 generated automatically by aclocal 1.4 dnl Copyright (C) 1994, 1995-8, 1999 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([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, $missing_dir) AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) AC_REQUIRE([AC_PROG_MAKE_SET])]) # # 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)]) # Like AC_CONFIG_HEADER, but automatically create stamp file. AC_DEFUN(AM_CONFIG_HEADER, [AC_PREREQ([2.12]) AC_CONFIG_HEADER([$1]) dnl When config.status generates a header, we must update the stamp-h file. dnl This file resides in the same directory as the config header dnl that is generated. We must strip everything past the first ":", dnl and everything past the last "/". AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, <>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, <>; do case " <<$>>CONFIG_HEADERS " in *" <<$>>am_file "*<<)>> echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx ;; esac am_indx=`expr "<<$>>am_indx" + 1` done<<>>dnl>>) changequote([,]))]) # serial 1 # @defmac AC_PROG_CC_STDC # @maindex PROG_CC_STDC # @ovindex CC # If the C compiler in not in ANSI C mode by default, try to add an option # to output variable @code{CC} to make it so. This macro tries various # options that select ANSI C on some system or another. It considers the # compiler to be in ANSI C mode if it handles function prototypes correctly. # # If you use this macro, you should check after calling it whether the C # compiler has been set to accept ANSI C; if not, the shell variable # @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source # code in ANSI C, you can make an un-ANSIfied copy of it by using the # program @code{ansi2knr}, which comes with Ghostscript. # @end defmac AC_DEFUN(AM_PROG_CC_STDC, [AC_REQUIRE([AC_PROG_CC]) AC_BEFORE([$0], [AC_C_INLINE]) AC_BEFORE([$0], [AC_C_CONST]) dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require dnl a magic option to avoid problems with ANSI preprocessor commands dnl like #elif. dnl FIXME: can't do this because then AC_AIX won't work due to a dnl circular dependency. dnl AC_BEFORE([$0], [AC_PROG_CPP]) AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C) AC_CACHE_VAL(am_cv_prog_cc_stdc, [am_cv_prog_cc_stdc=no ac_save_CC="$CC" # 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 -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" AC_TRY_COMPILE( [#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; } 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; ], [ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ], [am_cv_prog_cc_stdc="$ac_arg"; break]) done CC="$ac_save_CC" ]) if test -z "$am_cv_prog_cc_stdc"; then AC_MSG_RESULT([none needed]) else AC_MSG_RESULT($am_cv_prog_cc_stdc) fi case "x$am_cv_prog_cc_stdc" in x|xno) ;; *) CC="$CC $am_cv_prog_cc_stdc" ;; esac ]) # 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 ]) # Macro to add for using GNU gettext. # Ulrich Drepper , 1995. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. # serial 5 AC_DEFUN(AM_WITH_NLS, [AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) USE_INCLUDED_LIBINTL=no dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then AC_DEFINE(ENABLE_NLS) AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If gettext or catgets are available (in this order) we dnl use this. Else we have to fall back to GNU NLS library. dnl catgets is only used if permitted by option --with-catgets. nls_cv_header_intl= nls_cv_header_libgt= CATOBJEXT=NONE AC_CHECK_HEADER(libintl.h, [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc, [AC_TRY_LINK([#include ], [return (int) gettext ("")], gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)]) if test "$gt_cv_func_gettext_libc" != "yes"; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CACHE_CHECK([for gettext in libintl], gt_cv_func_gettext_libintl, [AC_CHECK_LIB(intl, gettext, gt_cv_func_gettext_libintl=yes, gt_cv_func_gettext_libintl=no)], gt_cv_func_gettext_libintl=no)]) fi if test "$gt_cv_func_gettext_libc" = "yes" \ || test "$gt_cv_func_gettext_libintl" = "yes"; then AC_DEFINE(HAVE_GETTEXT) AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then AC_CHECK_FUNCS(dcgettext) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) INSTOBJEXT=.mo fi fi ]) if test "$CATOBJEXT" = "NONE"; then AC_MSG_CHECKING([whether catgets can be used]) AC_ARG_WITH(catgets, [ --with-catgets use catgets functions if available], nls_cv_use_catgets=$withval, nls_cv_use_catgets=no) AC_MSG_RESULT($nls_cv_use_catgets) if test "$nls_cv_use_catgets" = "yes"; then dnl No gettext in C library. Try catgets next. AC_CHECK_LIB(i, main) AC_CHECK_FUNC(catgets, [AC_DEFINE(HAVE_CATGETS) INTLOBJS="\$(CATOBJS)" AC_PATH_PROG(GENCAT, gencat, no)dnl if test "$GENCAT" != "no"; then AC_PATH_PROG(GMSGFMT, gmsgfmt, no) if test "$GMSGFMT" = "no"; then AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no) fi AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) USE_INCLUDED_LIBINTL=yes CATOBJEXT=.cat INSTOBJEXT=.cat DATADIRNAME=lib INTLDEPS='$(top_builddir)/intl/libintl.a' INTLLIBS=$INTLDEPS LIBS=`echo $LIBS | sed -e 's/-lintl//'` nls_cv_header_intl=intl/libintl.h nls_cv_header_libgt=intl/libgettext.h fi]) fi fi if test "$CATOBJEXT" = "NONE"; then dnl Neither gettext nor catgets in included in the C library. dnl Fall back on GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. INTLOBJS="\$(GETTOBJS)" AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_SUBST(MSGFMT) USE_INCLUDED_LIBINTL=yes CATOBJEXT=.gmo INSTOBJEXT=.mo DATADIRNAME=share INTLDEPS='$(top_builddir)/intl/libintl.a' INTLLIBS=$INTLDEPS LIBS=`echo $LIBS | sed -e 's/-lintl//'` nls_cv_header_intl=intl/libintl.h nls_cv_header_libgt=intl/libgettext.h fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is no GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po else DATADIRNAME=share nls_cv_header_intl=intl/libintl.h nls_cv_header_libgt=intl/libgettext.h fi AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl) AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) # If this is used in GNU gettext we have to set USE_NLS to `yes' # because some of the sources are only built for this goal. if test "$PACKAGE" = gettext; then USE_NLS=yes USE_INCLUDED_LIBINTL=yes fi dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.in. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLDEPS) AC_SUBST(INTLLIBS) AC_SUBST(INTLOBJS) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) AC_DEFUN(AM_GNU_GETTEXT, [AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([AC_ISC_POSIX])dnl AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_OFF_T])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \ unistd.h sys/param.h]) AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \ strdup __argz_count __argz_stringify __argz_next]) if test "${ac_cv_func_stpcpy+set}" != "set"; then AC_CHECK_FUNCS(stpcpy) fi if test "${ac_cv_func_stpcpy}" = "yes"; then AC_DEFINE(HAVE_STPCPY) fi AM_LC_MESSAGES AM_WITH_NLS if test "x$CATOBJEXT" != "x"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for lang in ${LINGUAS=$ALL_LINGUAS}; do case "$ALL_LINGUAS" in *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; esac done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl The reference to in the installed file dnl must be resolved because we cannot expect the users of this dnl to define HAVE_LOCALE_H. if test $ac_cv_header_locale_h = yes; then INCLUDE_LOCALE_H="#include " else INCLUDE_LOCALE_H="\ /* The system does not provide the header . Take care yourself. */" fi AC_SUBST(INCLUDE_LOCALE_H) dnl Determine which catalog format we have (if any is needed) dnl For now we know about two different formats: dnl Linux libc-5 and the normal X/Open format test -d intl || mkdir intl if test "$CATOBJEXT" = ".cat"; then AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen) dnl Transform the SED scripts while copying because some dumb SEDs dnl cannot handle comments. sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed fi dnl po2tbl.sed is always needed. sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed dnl In the intl/Makefile.in we have a special dependency which makes dnl only sense for gettext. We comment this out for non-gettext dnl packages. if test "$PACKAGE" = "gettext"; then GT_NO="#NO#" GT_YES= else GT_NO= GT_YES="#YES#" fi AC_SUBST(GT_NO) AC_SUBST(GT_YES) dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl *** For now the libtool support in intl/Makefile is not for real. l= AC_SUBST(l) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # Search path for a program which passes the given test. # Ulrich Drepper , 1996. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. # serial 1 dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN(AM_PATH_PROG_WITH_TEST, [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test -n "[$]$1"; then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # Check whether LC_MESSAGES is available in . # Ulrich Drepper , 1995. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. # serial 1 AC_DEFUN(AM_LC_MESSAGES, [if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES) fi fi]) # 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]) baycomusb-0.10.orig/config.guess0100755000175100017510000007477407325134422014755 0ustar abaaba#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 # Free Software Foundation, Inc. # # This file 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 of the License, 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Written by Per Bothner . # The master version of this file is at the FSF in /home/gd/gnu/lib. # Please send patches to . # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit system type (host/target name). # # Only a few systems have been added to this list; please add others # (but try to keep the structure clean). # # Use $HOST_CC if defined. $CC may point to a cross-compiler if test x"$CC_FOR_BUILD" = x; then if test x"$HOST_CC" != x; then CC_FOR_BUILD="$HOST_CC" else if test x"$CC" != x; then CC_FOR_BUILD="$CC" else CC_FOR_BUILD=cc fi fi fi # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 8/24/94.) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown dummy=dummy-$$ trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15 # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. cat <$dummy.s .globl main .ent main main: .frame \$30,0,\$26,0 .prologue 0 .long 0x47e03d80 # implver $0 lda \$2,259 .long 0x47e20c21 # amask $2,$1 srl \$1,8,\$2 sll \$2,2,\$2 sll \$0,3,\$0 addl \$1,\$0,\$0 addl \$2,\$0,\$0 ret \$31,(\$26),1 .end main EOF $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then ./$dummy case "$?" in 7) UNAME_MACHINE="alpha" ;; 15) UNAME_MACHINE="alphaev5" ;; 14) UNAME_MACHINE="alphaev56" ;; 10) UNAME_MACHINE="alphapca56" ;; 16) UNAME_MACHINE="alphaev6" ;; esac fi rm -f $dummy.s $dummy echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-cbm-sysv4 exit 0;; amiga:NetBSD:*:*) echo m68k-cbm-netbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; arc64:OpenBSD:*:*) echo mips64el-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hkmips:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mips-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; arm32:NetBSD:*:*) echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; SR2?01:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; atari*:NetBSD:*:*) echo m68k-atari-netbsd${UNAME_RELEASE} exit 0 ;; atari*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; sun3*:NetBSD:*:*) echo m68k-sun-netbsd${UNAME_RELEASE} exit 0 ;; sun3*:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:NetBSD:*:*) echo m68k-apple-netbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; macppc:NetBSD:*:*) echo powerpc-apple-netbsd${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD $dummy.c -o $dummy \ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i?86:AIX:*:*) echo i386-ibm-aix exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:4) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=4.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) sed 's/^ //' << EOF >$dummy.c #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` rm -f $dummy.c $dummy esac HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i?86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; hppa*:OpenBSD:*:*) echo hppa-unknown-openbsd exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*X-MP:*:*:*) echo xmp-cray-unicos exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} exit 0 ;; CRAY*T3E:*:*:*) echo alpha-cray-unicosmk${UNAME_RELEASE} exit 0 ;; CRAY-2:*:*:*) echo cray2-cray-unicos exit 0 ;; F300:UNIX_System_V:*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; F301:UNIX_System_V:*:*) echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` exit 0 ;; hp3[0-9][05]:NetBSD:*:*) echo m68k-hp-netbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; i?86:BSD/386:*:* | i?86:BSD/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) if test -x /usr/bin/objformat; then if test "elf" = "`/usr/bin/objformat`"; then echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` exit 0 fi fi echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:NetBSD:*:*) echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i386-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. ld_help_string=`cd /; ld --help 2>&1` ld_supported_emulations=`echo $ld_help_string \ | sed -ne '/supported emulations:/!d s/[ ][ ]*/ /g s/.*supported emulations: *// s/ .*// p'` case "$ld_supported_emulations" in *ia64) echo "${UNAME_MACHINE}-unknown-linux" exit 0 ;; i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" exit 0 ;; armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" exit 0 ;; elf32arm*) echo "${UNAME_MACHINE}-unknown-linux-gnu" exit 0 ;; armelf_linux*) echo "${UNAME_MACHINE}-unknown-linux-gnu" exit 0 ;; m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" exit 0 ;; elf32ppc) # Determine Lib Version cat >$dummy.c < #if defined(__GLIBC__) extern char __libc_version[]; extern char __libc_release[]; #endif main(argc, argv) int argc; char *argv[]; { #if defined(__GLIBC__) printf("%s %s\n", __libc_version, __libc_release); #else printf("unkown\n"); #endif return 0; } EOF LIBC="" $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null if test "$?" = 0 ; then ./$dummy | grep 1\.99 > /dev/null if test "$?" = 0 ; then LIBC="libc1" fi fi rm -f $dummy.c $dummy echo powerpc-unknown-linux-gnu${LIBC} exit 0 ;; esac if test "${UNAME_MACHINE}" = "alpha" ; then sed 's/^ //' <$dummy.s .globl main .ent main main: .frame \$30,0,\$26,0 .prologue 0 .long 0x47e03d80 # implver $0 lda \$2,259 .long 0x47e20c21 # amask $2,$1 srl \$1,8,\$2 sll \$2,2,\$2 sll \$0,3,\$0 addl \$1,\$0,\$0 addl \$2,\$0,\$0 ret \$31,(\$26),1 .end main EOF LIBC="" $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then ./$dummy case "$?" in 7) UNAME_MACHINE="alpha" ;; 15) UNAME_MACHINE="alphaev5" ;; 14) UNAME_MACHINE="alphaev56" ;; 10) UNAME_MACHINE="alphapca56" ;; 16) UNAME_MACHINE="alphaev6" ;; esac objdump --private-headers $dummy | \ grep ld.so.1 > /dev/null if test "$?" = 0 ; then LIBC="libc1" fi fi rm -f $dummy.s $dummy echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 elif test "${UNAME_MACHINE}" = "mips" ; then cat >$dummy.c </dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy else # Either a pre-BFD a.out linker (linux-gnuoldld) # or one that does not give us useful --help. # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. # If ld does not provide *any* "supported emulations:" # that means it is gnuoldld. echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:" test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 case "${UNAME_MACHINE}" in i?86) VENDOR=pc; ;; *) VENDOR=unknown; ;; esac # Determine whether the default compiler is a.out or elf cat >$dummy.c < #ifdef __cplusplus int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); # else printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); # endif # else printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); # endif #else printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); #endif return 0; } EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy fi ;; # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions # are messed up and put the nodename in both sysname and nodename. i?86:DYNIX/ptx:4*:*) echo i386-sequent-sysv4 exit 0 ;; i?86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i?86:*:5:7*) # Fixed at (any) Pentium or better UNAME_MACHINE=i586 if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} fi exit 0 ;; i?86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:*:6*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-qnx-qnx${UNAME_VERSION} exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) printf ("vax-dec-bsd\n"); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 rm -f $dummy.c $dummy # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi #echo '(Unable to guess system type)' 1>&2 exit 1 baycomusb-0.10.orig/config.h.in0100644000175100017510000001604707331751004014443 0ustar abaaba/* config.h.in. Generated automatically from configure.in by autoheader. */ /* Define if using alloca.c. */ #undef C_ALLOCA /* Define to empty if the keyword does not work. */ #undef const /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ #undef CRAY_STACKSEG_END /* Define if you have alloca, as a function or macro. */ #undef HAVE_ALLOCA /* Define if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define as __inline if that's what the C compiler calls it. */ #undef inline /* Define to `long' if doesn't define. */ #undef off_t /* Define if you need to in order for stat and other things to work. */ #undef _POSIX_SOURCE /* Define as the return type of signal handlers (int or void). */ #undef RETSIGTYPE /* Define to `unsigned' if doesn't define. */ #undef size_t /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* define if int8_t and friends are available */ #undef HAVE_BITTYPES /* define if struct ifreq has the ifr_newname symbol */ #undef HAVE_GETSYSTEMTIME /* define if MMX is to be used */ #undef USEMMX /* define if VIS is to be used */ #undef USEVIS /* define if we have found the MKISS driver (line discipline) */ #undef HAVE_MKISS /* define if we want baycomusbserv to not require the kernel mode driver */ #undef USERMODEDRV /* use ORBit for interprocess communication */ #undef ORBITIPC /* define if M_PI is not defined by math.h */ #undef M_PI /* define if M_LN10 is not defined by math.h */ #undef M_LN10 /* define if struct ifreq has the ifr_newname symbol */ #undef HAVE_IFRNEWNAME /* define if we have DirectX includes */ #undef HAVE_DIRECTX /* define if National Language Support is requested */ #undef ENABLE_NLS /* define if compiling under Windows32 */ #undef WIN32 /* NLS stuff */ #undef HAVE_CATGETS #undef HAVE_GETTEXT #undef HAVE_LC_MESSAGES #undef HAVE_STPCPY /* various directories */ #undef PACKAGE_LOCALE_DIR #undef PACKAGE_DATA_DIR #undef PACKAGE_SOURCE_DIR /* Define if you have the __argz_count function. */ #undef HAVE___ARGZ_COUNT /* Define if you have the __argz_next function. */ #undef HAVE___ARGZ_NEXT /* Define if you have the __argz_stringify function. */ #undef HAVE___ARGZ_STRINGIFY /* Define if you have the dcgettext function. */ #undef HAVE_DCGETTEXT /* Define if you have the getcwd function. */ #undef HAVE_GETCWD /* Define if you have the getopt_long function. */ #undef HAVE_GETOPT_LONG /* Define if you have the getpagesize function. */ #undef HAVE_GETPAGESIZE /* Define if you have the gettimeofday function. */ #undef HAVE_GETTIMEOFDAY /* Define if you have the munmap function. */ #undef HAVE_MUNMAP /* Define if you have the openpty function. */ #undef HAVE_OPENPTY /* Define if you have the putenv function. */ #undef HAVE_PUTENV /* Define if you have the random function. */ #undef HAVE_RANDOM /* Define if you have the revoke function. */ #undef HAVE_REVOKE /* Define if you have the setenv function. */ #undef HAVE_SETENV /* Define if you have the setlocale function. */ #undef HAVE_SETLOCALE /* Define if you have the snprintf function. */ #undef HAVE_SNPRINTF /* Define if you have the stpcpy function. */ #undef HAVE_STPCPY /* Define if you have the strcasecmp function. */ #undef HAVE_STRCASECMP /* Define if you have the strchr function. */ #undef HAVE_STRCHR /* Define if you have the strdup function. */ #undef HAVE_STRDUP /* Define if you have the syslog function. */ #undef HAVE_SYSLOG /* Define if you have the vsnprintf function. */ #undef HAVE_VSNPRINTF /* Define if you have the vsyslog function. */ #undef HAVE_VSYSLOG /* Define if you have the header file. */ #undef HAVE_ARGZ_H /* Define if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define if you have the header file. */ #undef HAVE_ERRNO_H /* Define if you have the header file. */ #undef HAVE_GETOPT_H /* Define if you have the header file. */ #undef HAVE_LIMITS_H /* Define if you have the header file. */ #undef HAVE_LINUX_AX25_H /* Define if you have the header file. */ #undef HAVE_LINUX_BAYCOM_USB_H /* Define if you have the header file. */ #undef HAVE_LINUX_IF_H /* Define if you have the header file. */ #undef HAVE_LINUX_IF_ETHER_H /* Define if you have the header file. */ #undef HAVE_LINUX_SOCKIOS_H /* Define if you have the header file. */ #undef HAVE_LINUX_SOUNDCARD_H /* Define if you have the header file. */ #undef HAVE_LINUX_USBDEVICE_FS_H /* Define if you have the header file. */ #undef HAVE_LOCALE_H /* Define if you have the header file. */ #undef HAVE_MALLOC_H /* Define if you have the header file. */ #undef HAVE_NET_IF_H /* Define if you have the header file. */ #undef HAVE_NET_IF_ARP_H /* Define if you have the header file. */ #undef HAVE_NET_ROUTE_H /* Define if you have the header file. */ #undef HAVE_NETAX25_AX25_H /* Define if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define if you have the header file. */ #undef HAVE_NL_TYPES_H /* Define if you have the header file. */ #undef HAVE_PTHREAD_H /* Define if you have the header file. */ #undef HAVE_STRING_H /* Define if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define if you have the header file. */ #undef HAVE_SYS_SOUNDCARD_H /* Define if you have the header file. */ #undef HAVE_SYS_SYSLOG_H /* Define if you have the header file. */ #undef HAVE_SYS_UIO_H /* Define if you have the header file. */ #undef HAVE_UNISTD_H /* Define if you have the header file. */ #undef HAVE_WINDOWS_H /* Define if you have the i library (-li). */ #undef HAVE_LIBI /* Define if you have the m library (-lm). */ #undef HAVE_LIBM /* Define if you have the util library (-lutil). */ #undef HAVE_LIBUTIL /* Define if you have the uuid library (-luuid). */ #undef HAVE_LIBUUID /* Define if you have the xml library (-lxml). */ #undef HAVE_LIBXML /* Name of package */ #undef PACKAGE /* Version number of package */ #undef VERSION baycomusb-0.10.orig/config.sub0100755000175100017510000005772707325134422014417 0ustar abaaba#! /bin/sh # Configuration validation subroutine script, version 1.1. # Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc. # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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 of the License, 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. if [ x$1 = x ] then echo Configuration name missing. 1>&2 echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 echo "or $0 ALIAS" 1>&2 echo where ALIAS is a recognized configuration type. 1>&2 exit 1 fi # First pass through any local machine types. case $1 in *local*) echo $1 exit 0 ;; *) ;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in linux-gnu*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ | 580 | i960 | h8300 \ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \ | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ | mips64orion | mips64orionel | mipstx39 | mipstx39el \ | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ | mips64vr5000 | miprs64vr5000el | mcore \ | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ | thumb | d10v | fr30) basic_machine=$basic_machine-unknown ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i[34567]86) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. # FIXME: clean up the formatting here. vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ | xmp-* | ymp-* \ | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \ | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \ | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ | clipper-* | orion-* \ | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ | mips64el-* | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ | mipstx39-* | mipstx39el-* | mcore-* \ | f301-* | armv*-* | t3e-* \ | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* ) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-cbm ;; amigaos | amigados) basic_machine=m68k-cbm os=-amigaos ;; amigaunix | amix) basic_machine=m68k-cbm os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | ymp) basic_machine=ymp-cray os=-unicos ;; cray2) basic_machine=cray2-cray os=-unicos ;; [ctj]90-cray) basic_machine=c90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i[34567]86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i[34567]86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i[34567]86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i[34567]86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; i386-go32 | go32) basic_machine=i386-unknown os=-go32 ;; i386-mingw32 | mingw32) basic_machine=i386-unknown os=-mingw32 ;; i386-qnx | qnx) basic_machine=i386-qnx ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsel*-linux*) basic_machine=mipsel-unknown os=-linux-gnu ;; mips*-linux*) basic_machine=mips-unknown os=-linux-gnu ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; msdos) basic_machine=i386-unknown os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; np1) basic_machine=np1-gould ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexen) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86) basic_machine=i686-pc ;; pentiumii | pentium2) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexen-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=rs6000-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sparclite-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=t3e-cray os=-unicos ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xmp) basic_machine=xmp-cray os=-unicos ;; xps | xps100) basic_machine=xps100-honeywell ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; mips) if [ x$os = x-linux-gnu ]; then basic_machine=mips-unknown else basic_machine=mips-mips fi ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sparc | sparcv9) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; c4x*) basic_machine=c4x-none os=-coff ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*) # Remember, each alternative MUST END IN *, to match a version number. ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -ns2 ) os=-nextstep2 ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -qnx) os=-qnx4 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -*MiNT) os=-mint ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f301-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -*MiNT) vendor=atari ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os baycomusb-0.10.orig/configure0100755000175100017510000052576307340435136014346 0ustar abaaba#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-gtk-prefix=PFX Prefix where GTK is installed (optional)" ac_help="$ac_help --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)" ac_help="$ac_help --disable-gtktest Do not try to compile and run a test GTK program" ac_help="$ac_help --enable-orbit Enable ORBit interprocess communication" ac_help="$ac_help --disable-nls do not use Native Language Support" ac_help="$ac_help --with-included-gettext use the GNU gettext library included here" ac_help="$ac_help --with-catgets use catgets functions if available" ac_help="$ac_help --enable-userdrv Build user mode driver" ac_help="$ac_help --disable-mkiss Don not use the MKISS driver even if available" ac_help="$ac_help --enable-mmx Utilize MMX(tm) instructions if available (x86 only)" ac_help="$ac_help --enable-vis Utilize VIS(tm) instructions if available (ultrasparc only)" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE 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' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 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 case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # 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 ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$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" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) 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) # 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 << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --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 EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$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) 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 ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi 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 "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # 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 # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=baycomusb.spec # 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_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. 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 "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # 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 "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi 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 fi done if test -z "$ac_aux_dir"; then { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # Do some error checking and defaulting for the host and target type. # The inputs are: # configure --host=HOST --target=TARGET --build=BUILD NONOPT # # The rules are: # 1. You are not allowed to specify --host, --target, and nonopt at the # same time. # 2. Host defaults to nonopt. # 3. If nonopt is not specified, then host defaults to the current host, # as determined by config.guess. # 4. Target and build default to nonopt. # 5. If nonopt is not specified, then target and build default to host. # The aliases save the names the user supplied, while $host etc. # will get canonicalized. case $host---$target---$nonopt in NONE---*---* | *---NONE---* | *---*---NONE) ;; *) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; esac # Make sure we can run config.sub. if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 echo "configure:594: checking host system type" >&5 host_alias=$host case "$host_alias" in NONE) case $nonopt in NONE) if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } fi ;; *) host_alias=$nonopt ;; esac ;; esac host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 echo "configure:615: checking target system type" >&5 target_alias=$target case "$target_alias" in NONE) case $nonopt in NONE) target_alias=$host_alias ;; *) target_alias=$nonopt ;; esac ;; esac target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$target" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6 echo "configure:633: checking build system type" >&5 build_alias=$build case "$build_alias" in NONE) case $nonopt in NONE) build_alias=$host_alias ;; *) build_alias=$nonopt ;; esac ;; esac build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$ac_t""$build" 1>&6 test "$host_alias" != "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- # 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 # 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" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:668: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/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 if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" 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 "$ac_t""$INSTALL" 1>&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_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 echo "configure:721: checking whether build environment is sane" >&5 # 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 "configure: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" 1>&2; exit 1; } fi test "$2" = conftestfile ) then # Ok. : else { echo "configure: error: newly created file is older than distributed files! Check your system clock" 1>&2; exit 1; } fi rm -f conftest* echo "$ac_t""yes" 1>&6 if test "$program_transform_name" = s,x,x,; then program_transform_name= else # Double any \ or $. echo might interpret backslashes. cat <<\EOF_SED > conftestsed s,\\,\\\\,g; s,\$,$$,g EOF_SED program_transform_name="`echo $program_transform_name|sed -f conftestsed`" rm -f conftestsed fi 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" # sed with no file args requires a program. test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 echo "configure:778: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftestmake <<\EOF all: @echo 'ac_maketemp="${MAKE}"' EOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftestmake 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 conftestmake fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$ac_t""yes" 1>&6 SET_MAKE= else echo "$ac_t""no" 1>&6 SET_MAKE="MAKE=${MAKE-make}" fi PACKAGE=baycomusb VERSION=0.10 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } fi cat >> confdefs.h <> confdefs.h <&6 echo "configure:824: checking for working aclocal" >&5 # 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 --version) < /dev/null > /dev/null 2>&1; then ACLOCAL=aclocal echo "$ac_t""found" 1>&6 else ACLOCAL="$missing_dir/missing aclocal" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 echo "configure:837: checking for working autoconf" >&5 # 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 "$ac_t""found" 1>&6 else AUTOCONF="$missing_dir/missing autoconf" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 echo "configure:850: checking for working automake" >&5 # 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 --version) < /dev/null > /dev/null 2>&1; then AUTOMAKE=automake echo "$ac_t""found" 1>&6 else AUTOMAKE="$missing_dir/missing automake" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 echo "configure:863: checking for working autoheader" >&5 # 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 "$ac_t""found" 1>&6 else AUTOHEADER="$missing_dir/missing autoheader" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 echo "configure:876: checking for working makeinfo" >&5 # 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 "$ac_t""found" 1>&6 else MAKEINFO="$missing_dir/missing makeinfo" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 echo "configure:895: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftestmake <<\EOF all: @echo 'ac_maketemp="${MAKE}"' EOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftestmake 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 conftestmake fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$ac_t""yes" 1>&6 SET_MAKE= else echo "$ac_t""no" 1>&6 SET_MAKE="MAKE=${MAKE-make}" fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:924: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:954: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" 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 $# -gt 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 set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1005: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:1037: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 1048 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:1053: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:1079: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:1084: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:1112: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&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 $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 echo "configure:1144: checking for POSIXized ISC" >&5 if test -d /etc/conf/kconfig.d && grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 then echo "$ac_t""yes" 1>&6 ISC=yes # If later tests want to check for ISC. cat >> confdefs.h <<\EOF #define _POSIX_SOURCE 1 EOF if test "$GCC" = yes; then CC="$CC -posix" else CC="$CC -Xp" fi else echo "$ac_t""no" 1>&6 ISC= fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1167: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1197: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" 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 $# -gt 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 set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1248: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:1280: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 1291 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:1296: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:1322: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:1327: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:1355: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&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 $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6 echo "configure:1390: checking for ${CC-cc} option to accept ANSI C" >&5 if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else am_cv_prog_cc_stdc=no ac_save_CC="$CC" # 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 -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" cat > conftest.$ac_ext < #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; } 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; } EOF if { (eval echo configure:1443: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* am_cv_prog_cc_stdc="$ac_arg"; break else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* done CC="$ac_save_CC" fi if test -z "$am_cv_prog_cc_stdc"; then echo "$ac_t""none needed" 1>&6 else echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6 fi case "x$am_cv_prog_cc_stdc" in x|xno) ;; *) CC="$CC $am_cv_prog_cc_stdc" ;; esac echo $ac_n "checking for working const""... $ac_c" 1>&6 echo "configure:1467: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } ; return 0; } EOF if { (eval echo configure:1521: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_c_const=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_c_const" 1>&6 if test $ac_cv_c_const = no; then cat >> confdefs.h <<\EOF #define const EOF fi echo $ac_n "checking for inline""... $ac_c" 1>&6 echo "configure:1542: checking for inline" >&5 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* done fi echo "$ac_t""$ac_cv_c_inline" 1>&6 case "$ac_cv_c_inline" in inline | yes) ;; no) cat >> confdefs.h <<\EOF #define inline EOF ;; *) cat >> confdefs.h <&6 echo "configure:1582: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1603: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1620: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1637: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:1662: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1675: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:1742: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1769: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_RANLIB="ranlib" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" fi fi RANLIB="$ac_cv_prog_RANLIB" if test -n "$RANLIB"; then echo "$ac_t""$RANLIB" 1>&6 else echo "$ac_t""no" 1>&6 fi # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1799: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_DLLTOOL="dlltool" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="dlltool" fi fi DLLTOOL="$ac_cv_prog_DLLTOOL" if test -n "$DLLTOOL"; then echo "$ac_t""$DLLTOOL" 1>&6 else echo "$ac_t""no" 1>&6 fi # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1829: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_AS="as" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as" fi fi AS="$ac_cv_prog_AS" if test -n "$AS"; then echo "$ac_t""$AS" 1>&6 else echo "$ac_t""no" 1>&6 fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1859: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_AR="ar" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" fi fi AR="$ac_cv_prog_AR" if test -n "$AR"; then echo "$ac_t""$AR" 1>&6 else echo "$ac_t""no" 1>&6 fi # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1889: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_WINDRES="windres" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_WINDRES" && ac_cv_prog_WINDRES="i686-pc-cygwin-windres" fi fi WINDRES="$ac_cv_prog_WINDRES" if test -n "$WINDRES"; then echo "$ac_t""$WINDRES" 1>&6 else echo "$ac_t""no" 1>&6 fi echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 echo "configure:1918: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_cygwin=no fi rm -f conftest* rm -f conftest* fi echo "$ac_t""$ac_cv_cygwin" 1>&6 CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 echo "configure:1951: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_mingw32=no fi rm -f conftest* rm -f conftest* fi echo "$ac_t""$ac_cv_mingw32" 1>&6 MINGW32= test "$ac_cv_mingw32" = yes && MINGW32=yes echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 echo "configure:1982: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$CYGWIN" = yes || test "$MINGW32" = yes; then ac_cv_exeext=.exe else rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= if { (eval echo configure:1992: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done else { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; } fi rm -f conftest* test x"${ac_cv_exeext}" = x && ac_cv_exeext=no fi fi EXEEXT="" test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext} echo "$ac_t""${ac_cv_exeext}" 1>&6 ac_exeext=$EXEEXT echo $ac_n "checking for object suffix""... $ac_c" 1>&6 echo "configure:2013: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext if { (eval echo configure:2019: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;; esac done else { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; } fi rm -f conftest* fi echo "$ac_t""$ac_cv_objext" 1>&6 OBJEXT=$ac_cv_objext ac_objext=$ac_cv_objext echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 echo "configure:2038: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #ifdef signal #undef signal #endif #ifdef __cplusplus extern "C" void (*signal (int, void (*)(int)))(int); #else void (*signal ()) (); #endif int main() { int i; ; return 0; } EOF if { (eval echo configure:2060: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_type_signal=int fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_signal" 1>&6 cat >> confdefs.h <&6 echo "configure:2081: checking for cross compiler path" >&5 if test -d /usr/local/cross/i686-pc-cygwin; then CROSSCOMPPATH=/usr/local/cross/i686-pc-cygwin elif test -d /usr/local/cygwin/i686-pc-cygwin; then CROSSCOMPPATH=/usr/local/cygwin/i686-pc-cygwin else { echo "configure: error: "cross compiler not found"" 1>&2; exit 1; } fi echo "$ac_t""$CROSSCOMPPATH" 1>&6 fi if test x$ac_cv_mingw32 != xyes; then echo $ac_n "checking for cos in -lm""... $ac_c" 1>&6 echo "configure:2094: checking for cos in -lm" >&5 ac_lib_var=`echo m'_'cos | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi fi echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6 echo "configure:2142: checking for pthread_create in -lpthread" >&5 ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lpthread $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 LIBTHREAD="$LIBTHREAD -lpthread" else echo "$ac_t""no" 1>&6 fi echo $ac_n "checking for GUID_NULL in -luuid""... $ac_c" 1>&6 echo "configure:2182: checking for GUID_NULL in -luuid" >&5 ac_lib_var=`echo uuid'_'GUID_NULL | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-luuid $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo uuid | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi for ac_hdr in getopt.h sys/ioctl.h windows.h sys/syslog.h sys/uio.h errno.h unistd.h pthread.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:2232: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:2242: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done for ac_hdr in net/if.h net/if_arp.h net/route.h sys/socket.h arpa/inet.h netinet/in.h netax25/ax25.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:2272: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:2282: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done for ac_hdr in linux/if.h linux/if_ether.h linux/ax25.h linux/sockios.h linux/baycom_usb.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:2312: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:2322: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done for ac_hdr in sys/soundcard.h linux/soundcard.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:2352: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:2362: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done for ac_func in snprintf gettimeofday random syslog vsyslog revoke do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:2391: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:2419: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done for ac_func in vsnprintf do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:2446: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:2474: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}" fi done for ac_func in getopt_long do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:2503: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:2531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 LIBOBJS="$LIBOBJS getopt.o getopt1.o" fi done xlibs=$LIBS LIBS= echo $ac_n "checking for openpty in -lutil""... $ac_c" 1>&6 echo "configure:2559: checking for openpty in -lutil" >&5 ac_lib_var=`echo util'_'openpty | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lutil $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo util | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi for ac_func in openpty do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:2608: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:2636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 DRVLIBOBJS="$DRVLIBOBJS openpty.o" fi done LIBS=$xlibs # Extract the first word of "asx8051", so it can be a program name with args. set dummy asx8051; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:2666: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AS8051'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$AS8051"; then ac_cv_prog_AS8051="$AS8051" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="/usr/local/8051/bin:/usr/local/cross/8051/bin" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_AS8051="asx8051" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_AS8051" && ac_cv_prog_AS8051=":" fi fi AS8051="$ac_cv_prog_AS8051" if test -n "$AS8051"; then echo "$ac_t""$AS8051" 1>&6 else echo "$ac_t""no" 1>&6 fi # Extract the first word of "aslink", so it can be a program name with args. set dummy aslink; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:2696: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LD8051'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$LD8051"; then ac_cv_prog_LD8051="$LD8051" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="/usr/local/8051/bin:/usr/local/cross/8051/bin" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_LD8051="aslink" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_LD8051" && ac_cv_prog_LD8051=":" fi fi LD8051="$ac_cv_prog_LD8051" if test -n "$LD8051"; then echo "$ac_t""$LD8051" 1>&6 else echo "$ac_t""no" 1>&6 fi for ac_hdr in linux/usbdevice_fs.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:2728: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:2738: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 echo "configure:2765: checking whether time.h and sys/time.h may both be included" >&5 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include int main() { struct tm *tp; ; return 0; } EOF if { (eval echo configure:2779: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_time=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_header_time" 1>&6 if test $ac_cv_header_time = yes; then cat >> confdefs.h <<\EOF #define TIME_WITH_SYS_TIME 1 EOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 echo "configure:2802: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF if { (eval echo configure:2814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_alloca_h=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 if test $ac_cv_header_alloca_h = yes; then cat >> confdefs.h <<\EOF #define HAVE_ALLOCA_H 1 EOF fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 echo "configure:2835: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < # define alloca _alloca # else # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif # endif #endif int main() { char *p = (char *) alloca(1); ; return 0; } EOF if { (eval echo configure:2868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_func_alloca_works=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 if test $ac_cv_func_alloca_works = yes; then cat >> confdefs.h <<\EOF #define HAVE_ALLOCA 1 EOF fi if test $ac_cv_func_alloca_works = no; then # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=alloca.${ac_objext} cat >> confdefs.h <<\EOF #define C_ALLOCA 1 EOF echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 echo "configure:2900: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5 | egrep "webecray" >/dev/null 2>&1; then rm -rf conftest* ac_cv_os_cray=yes else rm -rf conftest* ac_cv_os_cray=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_os_cray" 1>&6 if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:2930: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:2958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <&6 fi done fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 echo "configure:2985: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext < addr) ? 1 : -1; } main () { exit (find_stack_direction() < 0); } EOF if { (eval echo configure:3012: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_c_stack_direction=-1 fi rm -fr conftest* fi fi echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 cat >> confdefs.h <&6 echo "configure:3035: checking for GetSystemTime" >&5 getsystemtime=no cat > conftest.$ac_ext < int main() { SYSTEMTIME tm; GetSystemTime(&tm); ; return 0; } EOF if { (eval echo configure:3045: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_GETSYSTEMTIME 1 EOF getsystemtime=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* echo "$ac_t""$getsystemtime" 1>&6 echo $ac_n "checking for size_t""... $ac_c" 1>&6 echo "configure:3060: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_size_t=yes else rm -rf conftest* ac_cv_type_size_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_size_t" 1>&6 if test $ac_cv_type_size_t = no; then cat >> confdefs.h <<\EOF #define size_t unsigned int EOF fi echo $ac_n "checking for bittypes""... $ac_c" 1>&6 echo "configure:3094: checking for bittypes" >&5 bittypes=no cat > conftest.$ac_ext < int main() { int8_t a; u_int8_t b; int16_t c; u_int16_t d; int32_t e; u_int32_t f; ; return 0; } EOF if { (eval echo configure:3104: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_BITTYPES 1 EOF bittypes=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* echo "$ac_t""$bittypes" 1>&6 echo $ac_n "checking for M_PI""... $ac_c" 1>&6 echo "configure:3118: checking for M_PI" >&5 mpi=no cat > conftest.$ac_ext < int main() { double f = M_PI; ; return 0; } EOF if { (eval echo configure:3128: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* mpi=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* cat >> confdefs.h <<\EOF #define M_PI 3.14159265358979323846 EOF fi rm -f conftest* echo "$ac_t""$mpi" 1>&6 echo $ac_n "checking for M_LN10""... $ac_c" 1>&6 echo "configure:3144: checking for M_LN10" >&5 mln10=no cat > conftest.$ac_ext < int main() { double f = M_LN10; ; return 0; } EOF if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* mln10=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* cat >> confdefs.h <<\EOF #define M_LN10 2.30258509299404568402 EOF fi rm -f conftest* echo "$ac_t""$mln10" 1>&6 echo $ac_n "checking for MKISS (N_AX25 line discipline)""... $ac_c" 1>&6 echo "configure:3170: checking for MKISS (N_AX25 line discipline)" >&5 mkiss=no cat > conftest.$ac_ext < #ifdef N_AX25 yes #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "yes" >/dev/null 2>&1; then rm -rf conftest* mkiss=yes fi rm -f conftest* echo "$ac_t""$mkiss" 1>&6 echo $ac_n "checking for ifr_newname in struct ifreq""... $ac_c" 1>&6 echo "configure:3191: checking for ifr_newname in struct ifreq" >&5 ifrnewname=no cat > conftest.$ac_ext < int main() { struct ifreq ifr; ifr.ifr_newname[0]=0; ; return 0; } EOF if { (eval echo configure:3201: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_IFRNEWNAME 1 EOF ifrnewname=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* echo "$ac_t""$ifrnewname" 1>&6 if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then cat >> confdefs.h <<\EOF #define WIN32 1 EOF LIBS="$LIBS -lgdi32" fi if test x$ac_cv_prog_cc_cross = xyes; then gtk=no xlibs="$LIBS" LIBS="$LIBS -L$CROSSCOMPPATH/gtk/lib" echo $ac_n "checking for gtk_main in -lgtk""... $ac_c" 1>&6 echo "configure:3227: checking for gtk_main in -lgtk" >&5 ac_lib_var=`echo gtk'_'gtk_main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lgtk $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 gtk=yes else echo "$ac_t""no" 1>&6 fi LIBS="$xlibs" if test x$gtk = xyes; then GTK_CFLAGS="-I$CROSSCOMPPATH/gtk/include" GTK_LIBS="-L$CROSSCOMPPATH/gtk/lib -lgtk -lgdk -lglib" PTHREAD_CFLAGS="-L$CROSSCOMPPATH/gtk/include" PTHREAD_LIBS="-L$CROSSCOMPPATH/gtk/lib" fi else # 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:3324: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$GTK_CONFIG" in /*) ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" 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 "$ac_t""$GTK_CONFIG" 1>&6 else echo "$ac_t""no" 1>&6 fi min_gtk_version=1.2.0 echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6 echo "configure:3359: checking for GTK - version >= $min_gtk_version" >&5 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 < #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; } EOF if { (eval echo configure:3460: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* no_gtk=yes fi rm -fr conftest* fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gtk" = x ; then echo "$ac_t""yes" 1>&6 gtk=yes else echo "$ac_t""no" 1>&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 < #include int main() { return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ; return 0; } EOF if { (eval echo configure:3504: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* 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 "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* 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* CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi GTK_CFLAGS="" GTK_LIBS="" { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; } fi rm -f conf.gtktest fi if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then # Check whether --enable-orbit or --disable-orbit was given. if test "${enable_orbit+set}" = set; then enableval="$enable_orbit" case "${enableval}" in yes) orbitipc=true ;; no) orbitipc=false ;; *) { echo "configure: error: bad value ${enableval} for --enable-orbit" 1>&2; exit 1; } ;; esac else orbitipc=false fi else orbitipc=true fi if test x$orbitipc = xtrue; then cat >> confdefs.h <<\EOF #define ORBITIPC 1 EOF # Extract the first word of "orbit-config", so it can be a program name with args. set dummy orbit-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:3569: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_ORBIT_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$ORBIT_CONFIG" in /*) ac_cv_path_ORBIT_CONFIG="$ORBIT_CONFIG" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_ORBIT_CONFIG="$ORBIT_CONFIG" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_ORBIT_CONFIG="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_ORBIT_CONFIG" && ac_cv_path_ORBIT_CONFIG="no" ;; esac fi ORBIT_CONFIG="$ac_cv_path_ORBIT_CONFIG" if test -n "$ORBIT_CONFIG"; then echo "$ac_t""$ORBIT_CONFIG" 1>&6 else echo "$ac_t""no" 1>&6 fi if test "$ORBIT_CONFIG" = "no"; then { echo "configure: error: "orbit not found"" 1>&2; exit 1; } fi ORBIT_EXEC_PREFIX=`$ORBIT_CONFIG --exec-prefix` ORBIT_IDL=$ORBIT_EXEC_PREFIX/bin/orbit-idl if test x$ac_cv_prog_cc_cross = xyes; then ORBIT_CFLAGS="-I$CROSSCOMPPATH/orbit/include/ -mno-cygwin" ORBIT_VERSION=5.0.1 ORBIT_LIBS="-L$CROSSCOMPPATH/orbit/lib/ -L$CROSSCOMPPATH/gtk/lib/ -lORBit -lIIOP -lORBitutil -lglib -lwsock32 -mno-cygwin" else ORBIT_CFLAGS=`$ORBIT_CONFIG --cflags server` ORBIT_VERSION=`$ORBIT_CONFIG --version server` ORBIT_LIBS=`$ORBIT_CONFIG --libs server` fi else ORBIT_IDL=true ORBIT_CFLAGS="" ORBIT_VERSION=5.0.1 ORBIT_LIBS="" fi if test "x$GCC" = "xyes"; then if test -z "`echo "$CFLAGS" | grep "\-Wall" 2> /dev/null`" ; then CFLAGS="$CFLAGS -Wall -O2" fi fi if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then XMLCFLAGS= XMLLIBS= else xlibs=$LIBS LIBS= echo $ac_n "checking for openpty in -lutil""... $ac_c" 1>&6 echo "configure:3637: checking for openpty in -lutil" >&5 ac_lib_var=`echo util'_'openpty | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lutil $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo util | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi for ac_func in openpty do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:3686: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:3714: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 LIBOBJS="$LIBOBJS openpty.o" fi done LIBS=$xlibs # Extract the first word of "xml-config", so it can be a program name with args. set dummy xml-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:3744: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_XML_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$XML_CONFIG" in /*) ac_cv_path_XML_CONFIG="$XML_CONFIG" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_XML_CONFIG="$XML_CONFIG" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_XML_CONFIG="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XML_CONFIG" && ac_cv_path_XML_CONFIG=":" ;; esac fi XML_CONFIG="$ac_cv_path_XML_CONFIG" if test -n "$XML_CONFIG"; then echo "$ac_t""$XML_CONFIG" 1>&6 else echo "$ac_t""no" 1>&6 fi if test "$XML_CONFIG" = ":" ; then { echo "configure: error: Could not find xml-config; libxml installed?" 1>&2; exit 1; } fi XMLCFLAGS=`$XML_CONFIG --cflags` XMLLIBS=`$XML_CONFIG --libs` xcflags=$CFLAGS xlibs=$LIBS LIBS="$LIBS $XMLLIBS" CFLAGS="$CFLAGS $XMLCFLAGS" echo $ac_n "checking for xmlNewDoc in -lxml""... $ac_c" 1>&6 echo "configure:3787: checking for xmlNewDoc in -lxml" >&5 ac_lib_var=`echo xml'_'xmlNewDoc | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lxml $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo xml | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 { echo "configure: error: Cannot link libxml" 1>&2; exit 1; } fi LIBS=$xlibs CFLAGS=$xcflags fi if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then xcflags="$CFLAGS" CFLAGS="$CFLAGS -I$srcdir/directx/include -I$srcdir/directx/include/directx6" echo $ac_n "checking for DirectX includes""... $ac_c" 1>&6 echo "configure:3842: checking for DirectX includes" >&5 directx=no cat > conftest.$ac_ext < int main() { LPDIRECTSOUND dsplay; LPDIRECTSOUNDCAPTURE dsrec; ; return 0; } EOF if { (eval echo configure:3852: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_DIRECTX 1 EOF directx=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* echo "$ac_t""$directx" 1>&6 CFLAGS="$xcflags" fi ALL_LINGUAS="" # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:3871: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_RANLIB="ranlib" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" fi fi RANLIB="$ac_cv_prog_RANLIB" if test -n "$RANLIB"; then echo "$ac_t""$RANLIB" 1>&6 else echo "$ac_t""no" 1>&6 fi echo $ac_n "checking for off_t""... $ac_c" 1>&6 echo "configure:3899: checking for off_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_off_t=yes else rm -rf conftest* ac_cv_type_off_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_off_t" 1>&6 if test $ac_cv_type_off_t = no; then cat >> confdefs.h <<\EOF #define off_t long EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 echo "configure:3932: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_size_t=yes else rm -rf conftest* ac_cv_type_size_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_size_t" 1>&6 if test $ac_cv_type_size_t = no; then cat >> confdefs.h <<\EOF #define size_t unsigned EOF fi for ac_hdr in unistd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:3968: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:3978: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done for ac_func in getpagesize do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:4007: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:4035: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done echo $ac_n "checking for working mmap""... $ac_c" 1>&6 echo "configure:4060: checking for working mmap" >&5 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then ac_cv_func_mmap_fixed_mapped=no else cat > conftest.$ac_ext < #include #include /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef HAVE_UNISTD_H # include # endif /* Assume that all systems that can run configure have sys/param.h. */ # ifndef HAVE_SYS_PARAM_H # define HAVE_SYS_PARAM_H 1 # endif # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ #ifdef __cplusplus extern "C" { void *malloc(unsigned); } #else char *malloc(); #endif int main() { char *data, *data2, *data3; int i, pagesize; int fd; pagesize = getpagesize(); /* * First, make a file with some known garbage in it. */ data = malloc(pagesize); if (!data) exit(1); for (i = 0; i < pagesize; ++i) *(data + i) = rand(); umask(0); fd = creat("conftestmmap", 0600); if (fd < 0) exit(1); if (write(fd, data, pagesize) != pagesize) exit(1); close(fd); /* * Next, try to mmap the file at a fixed address which * already has something else allocated at it. If we can, * also make sure that we see the same garbage. */ fd = open("conftestmmap", O_RDWR); if (fd < 0) exit(1); data2 = malloc(2 * pagesize); if (!data2) exit(1); data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) exit(1); for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) exit(1); /* * Finally, make sure that changes to the mapped area * do not percolate back to the file as seen by read(). * (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = malloc(pagesize); if (!data3) exit(1); if (read(fd, data3, pagesize) != pagesize) exit(1); for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) exit(1); close(fd); unlink("conftestmmap"); exit(0); } EOF if { (eval echo configure:4208: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_mmap_fixed_mapped=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_func_mmap_fixed_mapped=no fi rm -fr conftest* fi fi echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 if test $ac_cv_func_mmap_fixed_mapped = yes; then cat >> confdefs.h <<\EOF #define HAVE_MMAP 1 EOF fi for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \ unistd.h sys/param.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:4236: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:4246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \ strdup __argz_count __argz_stringify __argz_next do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:4276: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:4304: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done if test "${ac_cv_func_stpcpy+set}" != "set"; then for ac_func in stpcpy do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:4333: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:4361: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done fi if test "${ac_cv_func_stpcpy}" = "yes"; then cat >> confdefs.h <<\EOF #define HAVE_STPCPY 1 EOF fi if test $ac_cv_header_locale_h = yes; then echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 echo "configure:4395: checking for LC_MESSAGES" >&5 if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { return LC_MESSAGES ; return 0; } EOF if { (eval echo configure:4407: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* am_cv_val_LC_MESSAGES=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* am_cv_val_LC_MESSAGES=no fi rm -f conftest* fi echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6 if test $am_cv_val_LC_MESSAGES = yes; then cat >> confdefs.h <<\EOF #define HAVE_LC_MESSAGES 1 EOF fi fi echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 echo "configure:4428: checking whether NLS is requested" >&5 # Check whether --enable-nls or --disable-nls was given. if test "${enable_nls+set}" = set; then enableval="$enable_nls" USE_NLS=$enableval else USE_NLS=yes fi echo "$ac_t""$USE_NLS" 1>&6 USE_INCLUDED_LIBINTL=no if test "$USE_NLS" = "yes"; then cat >> confdefs.h <<\EOF #define ENABLE_NLS 1 EOF echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 echo "configure:4448: checking whether included gettext is requested" >&5 # Check whether --with-included-gettext or --without-included-gettext was given. if test "${with_included_gettext+set}" = set; then withval="$with_included_gettext" nls_cv_force_use_gnu_gettext=$withval else nls_cv_force_use_gnu_gettext=no fi echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6 nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then nls_cv_header_intl= nls_cv_header_libgt= CATOBJEXT=NONE ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 echo "configure:4467: checking for libintl.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:4477: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6 echo "configure:4494: checking for gettext in libc" >&5 if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { return (int) gettext ("") ; return 0; } EOF if { (eval echo configure:4506: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* gt_cv_func_gettext_libc=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* gt_cv_func_gettext_libc=no fi rm -f conftest* fi echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6 if test "$gt_cv_func_gettext_libc" != "yes"; then echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6 echo "configure:4522: checking for bindtextdomain in -lintl" >&5 ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lintl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6 echo "configure:4557: checking for gettext in libintl" >&5 if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6 echo "configure:4562: checking for gettext in -lintl" >&5 ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lintl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 gt_cv_func_gettext_libintl=yes else echo "$ac_t""no" 1>&6 gt_cv_func_gettext_libintl=no fi fi echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6 else echo "$ac_t""no" 1>&6 fi fi if test "$gt_cv_func_gettext_libc" = "yes" \ || test "$gt_cv_func_gettext_libintl" = "yes"; then cat >> confdefs.h <<\EOF #define HAVE_GETTEXT 1 EOF # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:4620: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test -n "$MSGFMT"; then echo "$ac_t""$MSGFMT" 1>&6 else echo "$ac_t""no" 1>&6 fi if test "$MSGFMT" != "no"; then for ac_func in dcgettext do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:4654: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:4682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:4709: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$GMSGFMT" in /*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_GMSGFMT="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT="$ac_cv_path_GMSGFMT" if test -n "$GMSGFMT"; then echo "$ac_t""$GMSGFMT" 1>&6 else echo "$ac_t""no" 1>&6 fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:4745: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test -n "$XGETTEXT"; then echo "$ac_t""$XGETTEXT" 1>&6 else echo "$ac_t""no" 1>&6 fi cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* CATOBJEXT=.gmo DATADIRNAME=share else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CATOBJEXT=.mo DATADIRNAME=lib fi rm -f conftest* INSTOBJEXT=.mo fi fi else echo "$ac_t""no" 1>&6 fi if test "$CATOBJEXT" = "NONE"; then echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6 echo "configure:4808: checking whether catgets can be used" >&5 # Check whether --with-catgets or --without-catgets was given. if test "${with_catgets+set}" = set; then withval="$with_catgets" nls_cv_use_catgets=$withval else nls_cv_use_catgets=no fi echo "$ac_t""$nls_cv_use_catgets" 1>&6 if test "$nls_cv_use_catgets" = "yes"; then echo $ac_n "checking for main in -li""... $ac_c" 1>&6 echo "configure:4821: checking for main in -li" >&5 ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-li $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo i | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi echo $ac_n "checking for catgets""... $ac_c" 1>&6 echo "configure:4864: checking for catgets" >&5 if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char catgets(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_catgets) || defined (__stub___catgets) choke me #else catgets(); #endif ; return 0; } EOF if { (eval echo configure:4892: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_catgets=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_catgets=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'catgets`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_CATGETS 1 EOF INTLOBJS="\$(CATOBJS)" # Extract the first word of "gencat", so it can be a program name with args. set dummy gencat; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:4914: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$GENCAT" in /*) ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_GENCAT="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no" ;; esac fi GENCAT="$ac_cv_path_GENCAT" if test -n "$GENCAT"; then echo "$ac_t""$GENCAT" 1>&6 else echo "$ac_t""no" 1>&6 fi if test "$GENCAT" != "no"; then # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:4950: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$GMSGFMT" in /*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_GMSGFMT="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no" ;; esac fi GMSGFMT="$ac_cv_path_GMSGFMT" if test -n "$GMSGFMT"; then echo "$ac_t""$GMSGFMT" 1>&6 else echo "$ac_t""no" 1>&6 fi if test "$GMSGFMT" = "no"; then # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:4987: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$GMSGFMT" in /*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_GMSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no" ;; esac fi GMSGFMT="$ac_cv_path_GMSGFMT" if test -n "$GMSGFMT"; then echo "$ac_t""$GMSGFMT" 1>&6 else echo "$ac_t""no" 1>&6 fi fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:5022: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test -n "$XGETTEXT"; then echo "$ac_t""$XGETTEXT" 1>&6 else echo "$ac_t""no" 1>&6 fi USE_INCLUDED_LIBINTL=yes CATOBJEXT=.cat INSTOBJEXT=.cat DATADIRNAME=lib INTLDEPS='$(top_builddir)/intl/libintl.a' INTLLIBS=$INTLDEPS LIBS=`echo $LIBS | sed -e 's/-lintl//'` nls_cv_header_intl=intl/libintl.h nls_cv_header_libgt=intl/libgettext.h fi else echo "$ac_t""no" 1>&6 fi fi fi if test "$CATOBJEXT" = "NONE"; then nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then INTLOBJS="\$(GETTOBJS)" # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:5080: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test -n "$MSGFMT"; then echo "$ac_t""$MSGFMT" 1>&6 else echo "$ac_t""no" 1>&6 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:5114: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$GMSGFMT" in /*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; ?:/*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_GMSGFMT="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT="$ac_cv_path_GMSGFMT" if test -n "$GMSGFMT"; then echo "$ac_t""$GMSGFMT" 1>&6 else echo "$ac_t""no" 1>&6 fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:5150: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test -n "$XGETTEXT"; then echo "$ac_t""$XGETTEXT" 1>&6 else echo "$ac_t""no" 1>&6 fi USE_INCLUDED_LIBINTL=yes CATOBJEXT=.gmo INSTOBJEXT=.mo DATADIRNAME=share INTLDEPS='$(top_builddir)/intl/libintl.a' INTLLIBS=$INTLDEPS LIBS=`echo $LIBS | sed -e 's/-lintl//'` nls_cv_header_intl=intl/libintl.h nls_cv_header_libgt=intl/libgettext.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6 XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po else DATADIRNAME=share nls_cv_header_intl=intl/libintl.h nls_cv_header_libgt=intl/libgettext.h fi # If this is used in GNU gettext we have to set USE_NLS to `yes' # because some of the sources are only built for this goal. if test "$PACKAGE" = gettext; then USE_NLS=yes USE_INCLUDED_LIBINTL=yes fi for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "x$CATOBJEXT" != "x"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 echo "configure:5243: checking for catalogs to be installed" >&5 NEW_LINGUAS= for lang in ${LINGUAS=$ALL_LINGUAS}; do case "$ALL_LINGUAS" in *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; esac done LINGUAS=$NEW_LINGUAS echo "$ac_t""$LINGUAS" 1>&6 fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi if test $ac_cv_header_locale_h = yes; then INCLUDE_LOCALE_H="#include " else INCLUDE_LOCALE_H="\ /* The system does not provide the header . Take care yourself. */" fi test -d intl || mkdir intl if test "$CATOBJEXT" = ".cat"; then ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6 echo "configure:5271: checking for linux/version.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:5281: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 msgformat=linux else echo "$ac_t""no" 1>&6 msgformat=xopen fi sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed fi sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed if test "$PACKAGE" = "gettext"; then GT_NO="#NO#" GT_YES= else GT_NO= GT_YES="#YES#" fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi l= test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES if test "x${prefix}" = "xNONE"; then cat >> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <&2; exit 1; } ;; esac else userdrv=false fi if test x$userdrv = xtrue; then cat >> confdefs.h <<\EOF #define USERMODEDRV 1 EOF fi # Check whether --enable-mkiss or --disable-mkiss was given. if test "${enable_mkiss+set}" = set; then enableval="$enable_mkiss" mkissena=false else mkissena=true fi if test x$mkiss = xyes; then cat >> confdefs.h <<\EOF #define HAVE_MKISS 1 EOF fi # Check whether --enable-mmx or --disable-mmx was given. if test "${enable_mmx+set}" = set; then enableval="$enable_mmx" case "${enableval}" in yes) usemmx=true ;; no) usemmx=false ;; *) { echo "configure: error: bad value ${enableval} for --enable-mmx" 1>&2; exit 1; } ;; esac else usemmx=false fi # Check whether --enable-vis or --disable-vis was given. if test "${enable_vis+set}" = set; then enableval="$enable_vis" case "${enableval}" in yes) usevis=true ;; no) usevis=false ;; *) { echo "configure: error: bad value ${enableval} for --enable-vis" 1>&2; exit 1; } ;; esac else usevis=false fi if test x$usemmx = xtrue; then cat >> confdefs.h <<\EOF #define USEMMX 1 EOF fi if test x$usevis = xtrue; then cat >> confdefs.h <<\EOF #define USEVIS 1 EOF CFLAGS="$CFLAGS -Wa,-xarch=v8plusa" fi if test x$usemmx = xtrue; then USEMMX_TRUE= USEMMX_FALSE='#' else USEMMX_TRUE='#' USEMMX_FALSE= fi if test x$usevis = xtrue; then USEVIS_TRUE= USEVIS_FALSE='#' else USEVIS_TRUE='#' USEVIS_FALSE= fi if test x$gtk = xyes; then HAVEGTK_TRUE= HAVEGTK_FALSE='#' else HAVEGTK_TRUE='#' HAVEGTK_FALSE= fi if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then WIN32_TRUE= WIN32_FALSE='#' else WIN32_TRUE='#' WIN32_FALSE= fi if test x$ac_cv_prog_cc_cross = xyes; then CROSSCOMP_TRUE= CROSSCOMP_FALSE='#' else CROSSCOMP_TRUE='#' CROSSCOMP_FALSE= fi if test x$directx = xyes; then DIRECTX_TRUE= DIRECTX_FALSE='#' else DIRECTX_TRUE='#' DIRECTX_FALSE= fi if test "x$ac_cv_prog_AS8051" != "x:"; then HAVEAS51_TRUE= HAVEAS51_FALSE='#' else HAVEAS51_TRUE='#' HAVEAS51_FALSE= fi if test "x$ac_cv_prog_LD8051" != "x:"; then HAVELD51_TRUE= HAVELD51_FALSE='#' else HAVELD51_TRUE='#' HAVELD51_FALSE= fi if test x$userdrv = xtrue; then USERMODEDRV_TRUE= USERMODEDRV_FALSE='#' else USERMODEDRV_TRUE='#' USERMODEDRV_FALSE= fi if test x$orbitipc = xtrue; then ORBITIPC_TRUE= ORBITIPC_FALSE='#' else ORBITIPC_TRUE='#' ORBITIPC_FALSE= fi trap '' 1 2 15 cat > confcache <<\EOF # 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. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # 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 \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 DEFS=-DHAVE_CONFIG_H # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" trap 'rm -fr `echo "Makefile po/Makefile.in intl/Makefile fpga/Makefile firmware/Makefile firmware/fskfirmware/Makefile firmware/afskfirmware/Makefile firmware/audiofirmware/Makefile firmware/audio2firmware/Makefile firmware/dlfirmware/Makefile firmware/dl2firmware/Makefile firmware/resetfirmware/Makefile firmware/reset2firmware/Makefile firmware/bscanfirmware/Makefile directx/Makefile kerneldrv/Makefile wdmdrv/Makefile misc/Makefile usbdrv/Makefile trxapi/Makefile trxctrl/Makefile flexdrv/Makefile trxclient/Makefile winserv/Makefile diag/Makefile trxapp/Makefile trxapp/src/Makefile coinstaller/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@host@%$host%g s%@host_alias@%$host_alias%g s%@host_cpu@%$host_cpu%g s%@host_vendor@%$host_vendor%g s%@host_os@%$host_os%g s%@target@%$target%g s%@target_alias@%$target_alias%g s%@target_cpu@%$target_cpu%g s%@target_vendor@%$target_vendor%g s%@target_os@%$target_os%g s%@build@%$build%g s%@build_alias@%$build_alias%g s%@build_cpu@%$build_cpu%g s%@build_vendor@%$build_vendor%g s%@build_os@%$build_os%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g s%@PACKAGE@%$PACKAGE%g s%@VERSION@%$VERSION%g s%@ACLOCAL@%$ACLOCAL%g s%@AUTOCONF@%$AUTOCONF%g s%@AUTOMAKE@%$AUTOMAKE%g s%@AUTOHEADER@%$AUTOHEADER%g s%@MAKEINFO@%$MAKEINFO%g s%@SET_MAKE@%$SET_MAKE%g s%@CC@%$CC%g s%@CPP@%$CPP%g s%@RANLIB@%$RANLIB%g s%@DLLTOOL@%$DLLTOOL%g s%@AS@%$AS%g s%@AR@%$AR%g s%@WINDRES@%$WINDRES%g s%@EXEEXT@%$EXEEXT%g s%@OBJEXT@%$OBJEXT%g s%@LIBOBJS@%$LIBOBJS%g s%@AS8051@%$AS8051%g s%@LD8051@%$LD8051%g s%@ALLOCA@%$ALLOCA%g s%@GTK_CONFIG@%$GTK_CONFIG%g s%@GTK_CFLAGS@%$GTK_CFLAGS%g s%@GTK_LIBS@%$GTK_LIBS%g s%@ORBIT_CONFIG@%$ORBIT_CONFIG%g s%@XML_CONFIG@%$XML_CONFIG%g s%@USE_NLS@%$USE_NLS%g s%@MSGFMT@%$MSGFMT%g s%@GMSGFMT@%$GMSGFMT%g s%@XGETTEXT@%$XGETTEXT%g s%@GENCAT@%$GENCAT%g s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g s%@CATALOGS@%$CATALOGS%g s%@CATOBJEXT@%$CATOBJEXT%g s%@DATADIRNAME@%$DATADIRNAME%g s%@GMOFILES@%$GMOFILES%g s%@INSTOBJEXT@%$INSTOBJEXT%g s%@INTLDEPS@%$INTLDEPS%g s%@INTLLIBS@%$INTLLIBS%g s%@INTLOBJS@%$INTLOBJS%g s%@POFILES@%$POFILES%g s%@POSUB@%$POSUB%g s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g s%@GT_NO@%$GT_NO%g s%@GT_YES@%$GT_YES%g s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g s%@l@%$l%g s%@USEMMX_TRUE@%$USEMMX_TRUE%g s%@USEMMX_FALSE@%$USEMMX_FALSE%g s%@USEVIS_TRUE@%$USEVIS_TRUE%g s%@USEVIS_FALSE@%$USEVIS_FALSE%g s%@HAVEGTK_TRUE@%$HAVEGTK_TRUE%g s%@HAVEGTK_FALSE@%$HAVEGTK_FALSE%g s%@WIN32_TRUE@%$WIN32_TRUE%g s%@WIN32_FALSE@%$WIN32_FALSE%g s%@CROSSCOMP_TRUE@%$CROSSCOMP_TRUE%g s%@CROSSCOMP_FALSE@%$CROSSCOMP_FALSE%g s%@DIRECTX_TRUE@%$DIRECTX_TRUE%g s%@DIRECTX_FALSE@%$DIRECTX_FALSE%g s%@HAVEAS51_TRUE@%$HAVEAS51_TRUE%g s%@HAVEAS51_FALSE@%$HAVEAS51_FALSE%g s%@HAVELD51_TRUE@%$HAVELD51_TRUE%g s%@HAVELD51_FALSE@%$HAVELD51_FALSE%g s%@USERMODEDRV_TRUE@%$USERMODEDRV_TRUE%g s%@USERMODEDRV_FALSE@%$USERMODEDRV_FALSE%g s%@ORBITIPC_TRUE@%$ORBITIPC_TRUE%g s%@ORBITIPC_FALSE@%$ORBITIPC_FALSE%g s%@USERMODEDRV@%$USERMODEDRV%g s%@HAVE_MKISS@%$HAVE_MKISS%g s%@USEMMX@%$USEMMX%g s%@USEVIS@%$USEVIS%g s%@XMLCFLAGS@%$XMLCFLAGS%g s%@XMLLIBS@%$XMLLIBS%g s%@ORBITIPC@%$ORBITIPC%g s%@ORBIT_EXEC_PREFIX@%$ORBIT_EXEC_PREFIX%g s%@ORBIT_IDL@%$ORBIT_IDL%g s%@ORBIT_CFLAGS@%$ORBIT_CFLAGS%g s%@ORBIT_VERSION@%$ORBIT_VERSION%g s%@ORBIT_LIBS@%$ORBIT_LIBS%g s%@HAVE_BITTYPES@%$HAVE_BITTYPES%g s%@M_PI@%$M_PI%g s%@LIBTHREAD@%$LIBTHREAD%g s%@DRVLIBOBJS@%$DRVLIBOBJS%g s%@HAVE_IFRNEWNAME@%$HAVE_IFRNEWNAME%g s%@HAVE_DIRECTX@%$HAVE_DIRECTX%g s%@WIN32@%$WIN32%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # 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_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # 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" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac case "$ac_given_INSTALL" in [/$]*) INSTALL="$ac_given_INSTALL" ;; *) INSTALL="$ac_dots$ac_given_INSTALL" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g s%@INSTALL@%$INSTALL%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' ac_dC='\3' ac_dD='%g' # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='\([ ]\)%\1#\2define\3' ac_uC=' ' ac_uD='\4%g' # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_eB='$%\1#\2define\3' ac_eC=' ' ac_eD='%g' if test "${CONFIG_HEADERS+set}" != set; then EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF fi for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac echo creating $ac_file rm -f conftest.frag conftest.in conftest.out ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` cat $ac_file_inputs > conftest.in EOF # Transform confdefs.h into a sed script conftest.vals that substitutes # the proper values into config.h.in to produce config.h. And first: # Protect against being on the right side of a sed subst in config.status. # Protect against being in an unquoted here document in config.status. rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF sed -n -f conftest.hdr confdefs.h > conftest.vals rm -f conftest.hdr # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >> conftest.vals <<\EOF s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% EOF # Break up conftest.vals because some shells have a limit on # the size of here documents, and old seds have small limits too. rm -f conftest.tail while : do ac_lines=`grep -c . conftest.vals` # grep -c gives empty output for an empty file on some AIX systems. if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi # Write a limited-size here document to conftest.frag. echo ' cat > conftest.frag <> $CONFIG_STATUS sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS echo 'CEOF sed -f conftest.frag conftest.in > conftest.out rm -f conftest.in mv conftest.out conftest.in ' >> $CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail rm -f conftest.vals mv conftest.tail conftest.vals done rm -f conftest.vals cat >> $CONFIG_STATUS <<\EOF rm -f conftest.frag conftest.h echo "/* $ac_file. Generated automatically by configure. */" > conftest.h cat conftest.in >> conftest.h rm -f conftest.in if cmp -s $ac_file conftest.h 2>/dev/null; then echo "$ac_file is unchanged" rm -f conftest.h else # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" fi rm -f $ac_file mv conftest.h $ac_file fi fi; done EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF srcdir=$ac_given_srcdir while test -n "$ac_sources"; do set $ac_dests; ac_dest=$1; shift; ac_dests=$* set $ac_sources; ac_source=$1; shift; ac_sources=$* echo "linking $srcdir/$ac_source to $ac_dest" if test ! -r $srcdir/$ac_source; then { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; } fi rm -f $ac_dest # Make relative symlinks. # Remove last slash and all that follows it. Not all systems have dirname. ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'` if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then # The dest file is in a subdirectory. test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir" ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dest_dir_suffix. ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dest_dir_suffix= ac_dots= fi case "$srcdir" in [/$]*) ac_rel_source="$srcdir/$ac_source" ;; *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;; esac # Make a symlink if possible; otherwise try a hard link. if ln -s $ac_rel_source $ac_dest 2>/dev/null || ln $srcdir/$ac_source $ac_dest; then : else { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; } fi done EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 baycomusb-0.10.orig/configure.in0100644000175100017510000002377707340250310014733 0ustar abaabadnl Process this file with autoconf to produce a configure script. AC_INIT(baycomusb.spec) AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE(baycomusb, 0.10) AM_CONFIG_HEADER(config.h) dnl AC_CHECK_TOOL() AC_PROG_MAKE_SET AC_ISC_POSIX AC_PROG_CC AM_PROG_CC_STDC dnl AC_PROG_RANLIB AC_C_CONST AC_C_INLINE AC_HEADER_STDC AC_CHECK_PROG(RANLIB, ranlib, ranlib, :) AC_CHECK_PROG(DLLTOOL, dlltool, dlltool, dlltool) AC_CHECK_PROG(AS, as, as, as) AC_CHECK_PROG(AR, ar, ar, ar) AC_CHECK_PROG(WINDRES, windres, windres, i686-pc-cygwin-windres) AC_CYGWIN AC_MINGW32 AC_EXEEXT AC_OBJEXT AC_TYPE_SIGNAL dnl check for cross compiler path if test x$ac_cv_prog_cc_cross = xyes; then AC_MSG_CHECKING(for cross compiler path) if test -d /usr/local/cross/i686-pc-cygwin; then CROSSCOMPPATH=/usr/local/cross/i686-pc-cygwin elif test -d /usr/local/cygwin/i686-pc-cygwin; then CROSSCOMPPATH=/usr/local/cygwin/i686-pc-cygwin else AC_ERROR("cross compiler not found") fi AC_MSG_RESULT($CROSSCOMPPATH) fi if test x$ac_cv_mingw32 != xyes; then AC_CHECK_LIB(m,cos) fi AC_CHECK_LIB(pthread,pthread_create,LIBTHREAD="$LIBTHREAD -lpthread") AC_CHECK_LIB(uuid,GUID_NULL) AC_CHECK_HEADERS(getopt.h sys/ioctl.h windows.h sys/syslog.h sys/uio.h errno.h unistd.h pthread.h) AC_CHECK_HEADERS(net/if.h net/if_arp.h net/route.h sys/socket.h arpa/inet.h netinet/in.h netax25/ax25.h) AC_CHECK_HEADERS(linux/if.h linux/if_ether.h linux/ax25.h linux/sockios.h linux/baycom_usb.h) AC_CHECK_HEADERS(sys/soundcard.h linux/soundcard.h) AC_CHECK_FUNCS(snprintf gettimeofday random syslog vsyslog revoke) AC_REPLACE_FUNCS(vsnprintf) AC_CHECK_FUNCS(getopt_long,,LIBOBJS="$LIBOBJS getopt.o getopt1.o") xlibs=$LIBS LIBS= AC_CHECK_LIB(util,openpty) AC_CHECK_FUNCS(openpty,DRVLIBOBJS="$DRVLIBOBJS $LIBS",DRVLIBOBJS="$DRVLIBOBJS openpty.o") LIBS=$xlibs AC_CHECK_PROG(AS8051, asx8051, asx8051, :, /usr/local/8051/bin:/usr/local/cross/8051/bin) AC_CHECK_PROG(LD8051, aslink, aslink, :, /usr/local/8051/bin:/usr/local/cross/8051/bin) AC_CHECK_HEADERS(linux/usbdevice_fs.h) AC_HEADER_TIME AC_FUNC_ALLOCA AC_MSG_CHECKING(for GetSystemTime) getsystemtime=no AC_TRY_COMPILE([#include ], [ SYSTEMTIME tm; GetSystemTime(&tm); ], AC_DEFINE(HAVE_GETSYSTEMTIME) getsystemtime=yes) AC_MSG_RESULT($getsystemtime) dnl AC_CHECK_TYPE(int8_t,char) dnl AC_CHECK_TYPE(u_int8_t,unsigned char) dnl AC_CHECK_TYPE(int16_t,short) dnl AC_CHECK_TYPE(u_int16_t,unsigned short) dnl AC_CHECK_TYPE(int32_t,long) dnl AC_CHECK_TYPE(u_int32_t,unsigned long) AC_CHECK_TYPE(size_t,unsigned int) AC_MSG_CHECKING(for bittypes) bittypes=no AC_TRY_COMPILE([#include ], [ int8_t a; u_int8_t b; int16_t c; u_int16_t d; int32_t e; u_int32_t f; ], AC_DEFINE(HAVE_BITTYPES) bittypes=yes) AC_MSG_RESULT($bittypes) AC_MSG_CHECKING(for M_PI) mpi=no AC_TRY_COMPILE([#include ], [ double f = M_PI; ], mpi=yes,AC_DEFINE(M_PI,3.14159265358979323846)) AC_MSG_RESULT($mpi) AC_MSG_CHECKING(for M_LN10) mln10=no AC_TRY_COMPILE([#include ], [ double f = M_LN10; ], mln10=yes,AC_DEFINE(M_LN10,2.30258509299404568402)) AC_MSG_RESULT($mln10) AC_MSG_CHECKING(for MKISS (N_AX25 line discipline)) mkiss=no AC_EGREP_CPP(yes, [#include #ifdef N_AX25 yes #endif ], mkiss=yes) AC_MSG_RESULT($mkiss) AC_MSG_CHECKING(for ifr_newname in struct ifreq) ifrnewname=no AC_TRY_COMPILE([#include ], [struct ifreq ifr; ifr.ifr_newname[0]=0; ], AC_DEFINE(HAVE_IFRNEWNAME) ifrnewname=yes) AC_MSG_RESULT($ifrnewname) if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then AC_DEFINE(WIN32) LIBS="$LIBS -lgdi32" fi if test x$ac_cv_prog_cc_cross = xyes; then gtk=no xlibs="$LIBS" LIBS="$LIBS -L$CROSSCOMPPATH/gtk/lib" AC_CHECK_LIB(gtk,gtk_main,gtk=yes) LIBS="$xlibs" if test x$gtk = xyes; then GTK_CFLAGS="-I$CROSSCOMPPATH/gtk/include" GTK_LIBS="-L$CROSSCOMPPATH/gtk/lib -lgtk -lgdk -lglib" PTHREAD_CFLAGS="-L$CROSSCOMPPATH/gtk/include" PTHREAD_LIBS="-L$CROSSCOMPPATH/gtk/lib" fi else AM_PATH_GTK(1.2.0,gtk=yes,AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?)) fi dnl check for ORBit if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then AC_ARG_ENABLE(orbit, [ --enable-orbit Enable ORBit interprocess communication], [case "${enableval}" in yes) orbitipc=true ;; no) orbitipc=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-orbit) ;; esac],[orbitipc=false]) else orbitipc=true fi dnl even if cross compiling, we use the native IDL compiler if test x$orbitipc = xtrue; then AC_DEFINE(ORBITIPC) AC_PATH_PROG(ORBIT_CONFIG, orbit-config, no) if test "$ORBIT_CONFIG" = "no"; then AC_ERROR("orbit not found") fi ORBIT_EXEC_PREFIX=`$ORBIT_CONFIG --exec-prefix` ORBIT_IDL=$ORBIT_EXEC_PREFIX/bin/orbit-idl if test x$ac_cv_prog_cc_cross = xyes; then ORBIT_CFLAGS="-I$CROSSCOMPPATH/orbit/include/ -mno-cygwin" ORBIT_VERSION=5.0.1 ORBIT_LIBS="-L$CROSSCOMPPATH/orbit/lib/ -L$CROSSCOMPPATH/gtk/lib/ -lORBit -lIIOP -lORBitutil -lglib -lwsock32 -mno-cygwin" else ORBIT_CFLAGS=`$ORBIT_CONFIG --cflags server` ORBIT_VERSION=`$ORBIT_CONFIG --version server` ORBIT_LIBS=`$ORBIT_CONFIG --libs server` fi else ORBIT_IDL=true ORBIT_CFLAGS="" ORBIT_VERSION=5.0.1 ORBIT_LIBS="" fi dnl Only use -Wall if we have gcc if test "x$GCC" = "xyes"; then if test -z "`echo "$CFLAGS" | grep "\-Wall" 2> /dev/null`" ; then CFLAGS="$CFLAGS -Wall -O2" fi fi if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then XMLCFLAGS= XMLLIBS= else xlibs=$LIBS LIBS= AC_CHECK_LIB(util,openpty) AC_CHECK_FUNCS(openpty,LIBTHREAD="$LIBTHREAD $LIBS",LIBOBJS="$LIBOBJS openpty.o") LIBS=$xlibs AC_PATH_PROG(XML_CONFIG,xml-config,:) if test "$XML_CONFIG" = ":" ; then AC_MSG_ERROR(Could not find xml-config; libxml installed?) fi XMLCFLAGS=`$XML_CONFIG --cflags` XMLLIBS=`$XML_CONFIG --libs` xcflags=$CFLAGS xlibs=$LIBS LIBS="$LIBS $XMLLIBS" CFLAGS="$CFLAGS $XMLCFLAGS" AC_CHECK_LIB(xml, xmlNewDoc,, AC_MSG_ERROR(Cannot link libxml)) LIBS=$xlibs CFLAGS=$xcflags fi if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then xcflags="$CFLAGS" CFLAGS="$CFLAGS -I$srcdir/directx/include -I$srcdir/directx/include/directx6" AC_MSG_CHECKING(for DirectX includes) directx=no AC_TRY_COMPILE([#include ], [ LPDIRECTSOUND dsplay; LPDIRECTSOUNDCAPTURE dsrec; ], AC_DEFINE(HAVE_DIRECTX) directx=yes) AC_MSG_RESULT($directx) CFLAGS="$xcflags" fi dnl Add the languages which your application supports here. ALL_LINGUAS="" AM_GNU_GETTEXT dnl Set PACKAGE_LOCALE_DIR in config.h. if test "x${prefix}" = "xNONE"; then AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale") else AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale") fi dnl Set PACKAGE_DATA_DIR in config.h. if test "x${datadir}" = 'x${prefix}/share'; then if test "x${prefix}" = "xNONE"; then AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}") else AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}") fi else AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}") fi dnl Set PACKAGE_SOURCE_DIR in config.h. packagesrcdir=`cd $srcdir && pwd` AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}") AC_ARG_ENABLE(userdrv, [ --enable-userdrv Build user mode driver], [case "${enableval}" in yes) userdrv=true ;; no) userdrv=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-userdrv) ;; esac],[userdrv=false]) if test x$userdrv = xtrue; then AC_DEFINE(USERMODEDRV) fi AC_ARG_ENABLE(mkiss, [ --disable-mkiss Don not use the MKISS driver even if available], [mkissena=false],[mkissena=true]) if test x$mkiss = xyes; then AC_DEFINE(HAVE_MKISS) fi AC_ARG_ENABLE(mmx, [ --enable-mmx Utilize MMX(tm) instructions if available (x86 only)], [case "${enableval}" in yes) usemmx=true ;; no) usemmx=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-mmx) ;; esac],[usemmx=false]) AC_ARG_ENABLE(vis, [ --enable-vis Utilize VIS(tm) instructions if available (ultrasparc only)], [case "${enableval}" in yes) usevis=true ;; no) usevis=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-vis) ;; esac],[usevis=false]) if test x$usemmx = xtrue; then AC_DEFINE(USEMMX) fi if test x$usevis = xtrue; then AC_DEFINE(USEVIS) dnl CFLAGS="$CFLAGS -mv8plus -mvis -Wa,-xarch=v8plusa" CFLAGS="$CFLAGS -Wa,-xarch=v8plusa" fi AM_CONDITIONAL(USEMMX, test x$usemmx = xtrue) AM_CONDITIONAL(USEVIS, test x$usevis = xtrue) AM_CONDITIONAL(HAVEGTK, test x$gtk = xyes) AM_CONDITIONAL(WIN32, test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes) AM_CONDITIONAL(CROSSCOMP, test x$ac_cv_prog_cc_cross = xyes) AM_CONDITIONAL(DIRECTX, test x$directx = xyes) AM_CONDITIONAL(HAVEAS51, test "x$ac_cv_prog_AS8051" != "x:") AM_CONDITIONAL(HAVELD51, test "x$ac_cv_prog_LD8051" != "x:") AM_CONDITIONAL(USERMODEDRV, test x$userdrv = xtrue) AM_CONDITIONAL(ORBITIPC, test x$orbitipc = xtrue) AC_SUBST(USERMODEDRV) AC_SUBST(HAVE_MKISS) AC_SUBST(USEMMX) AC_SUBST(USEVIS) AC_SUBST(XMLCFLAGS) AC_SUBST(XMLLIBS) AC_SUBST(GTK_LIBS) AC_SUBST(GTK_CFLAGS) AC_SUBST(ORBITIPC) AC_SUBST(ORBIT_EXEC_PREFIX) AC_SUBST(ORBIT_IDL) AC_SUBST(ORBIT_CFLAGS) AC_SUBST(ORBIT_VERSION) AC_SUBST(ORBIT_LIBS) AC_SUBST(HAVE_BITTYPES) AC_SUBST(M_PI) AC_SUBST(LIBOBJS) AC_SUBST(LIBTHREAD) AC_SUBST(DRVLIBOBJS) AC_SUBST(HAVE_IFRNEWNAME) AC_SUBST(HAVE_DIRECTX) AC_SUBST(WIN32) AC_OUTPUT([Makefile po/Makefile.in intl/Makefile fpga/Makefile firmware/Makefile firmware/fskfirmware/Makefile firmware/afskfirmware/Makefile firmware/audiofirmware/Makefile firmware/audio2firmware/Makefile firmware/dlfirmware/Makefile firmware/dl2firmware/Makefile firmware/resetfirmware/Makefile firmware/reset2firmware/Makefile firmware/bscanfirmware/Makefile directx/Makefile kerneldrv/Makefile wdmdrv/Makefile misc/Makefile usbdrv/Makefile trxapi/Makefile trxctrl/Makefile flexdrv/Makefile trxclient/Makefile winserv/Makefile diag/Makefile trxapp/Makefile trxapp/src/Makefile coinstaller/Makefile]) baycomusb-0.10.orig/install-sh0100755000175100017510000001272007325134422014420 0ustar abaaba#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # 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=: 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 baycomusb-0.10.orig/missing0100755000175100017510000001420207325134422014010 0ustar abaaba#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997 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 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.in'. 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.in'. 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.in'. 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.in` if test -z "$files"; then files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in` test -z "$files" || files="$files.in" else files=`echo "$files" | sed -e 's/:/ /g'` fi test -z "$files" && files="config.h.in" 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.in'. 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$/touch \1.in/' \ | sh ;; 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 baycomusb-0.10.orig/mkinstalldirs0100755000175100017510000000133607325134422015223 0ustar abaaba#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1.1.1 1998/07/03 21:25:39 martijn 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" 1>&2 mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here baycomusb-0.10.orig/baycomusb.spec0100644000175100017510000000351107340477415015263 0ustar abaabaSummary: Driver and diagnostic utilities for the Baycom USB modem family Name: baycomusb Version: 0.10 Release: 1 URL: http://www.baycom.org Source0: baycomusb-%{version}.tar.gz Copyright: GPL Group: Networking/Hamradio BuildRoot: %{_tmppath}/baycomusb-%{version}-buildroot Packager: Thomas Sailer # Requires: /sbin/ifconfig /sbin/route /sbin/arp %description This package contains the server and diagnostic utilities for the Baycom USB modem. %prep %setup %build %configure --enable-userdrv --enable-mmx make %install rm -rf $RPM_BUILD_ROOT %{makeinstall} install -g root -o root -m 0755 -d $RPM_BUILD_ROOT/var/hamradio/transceivers/ install -g root -o root -m 0755 -d $RPM_BUILD_ROOT/etc/ax25/ touch $RPM_BUILD_ROOT/etc/ax25/baycomusb.conf install -g root -o root -m 0755 baycomusb.ifchange $RPM_BUILD_ROOT/etc/ax25 install -g root -o root -m 0755 -d $RPM_BUILD_ROOT/etc/rc.d/init.d install -g root -o root -m 0755 baycomusb.initscript $RPM_BUILD_ROOT/etc/rc.d/init.d/baycomusb install -g root -o root -m 0755 -d $RPM_BUILD_ROOT/dev mknod -m 0700 $RPM_BUILD_ROOT/dev/baycomusb c 180 240 %clean rm -rf $RPM_BUILD_ROOT %changelog * Tue Jun 26 2001 Thomas Sailer - use usermode server for now, so we do not require a patched kernel %files %defattr(-, root, root) %doc AUTHORS COPYING ChangeLog INSTALL NEWS README %attr(0755,root,root) %dir %attr(0644,root,root) %config(noreplace) /etc/ax25/baycomusb.conf %attr(0644,root,root) %config(noreplace) /etc/ax25/baycomusb.ifchange %attr(0755,root,root) %config /etc/rc.d/init.d/baycomusb %attr(-,root,root) /dev/baycomusb #%attr(0755,root,root) %{_sbindir}/baycomusb #%attr(0755,root,root) %{_sbindir}/writeeeprom %attr(0755,root,root) %{_sbindir}/baycomusbserv %attr(0755,root,root) %{_bindir}/baycomusbtrx #%attr(0644,root,root) %{_mandir}/man8/baycomusb.8* baycomusb-0.10.orig/baycomusb.initscript0100755000175100017510000000255107325362772016531 0ustar abaaba#! /bin/sh # # baycomusb Start Baycom USB driver. # # Author: Thomas Sailer, # # chkconfig: 345 50 50 # description: Baycom USB daemon # processname: baycomusbserv # pidfile: /var/run/baycomusb.pid # Source function library. . /etc/rc.d/init.d/functions # Get config. . /etc/sysconfig/network ## Check that networking is up. #if [ ${NETWORKING} = "no" ] #then # exit 0 #fi [ -f /usr/sbin/baycomusbserv ] || exit 0 RETVAL=0 function start() { rm -f /var/hamradio/transceivers/* #/sbin/modprobe baycom_usb echo -n "Starting baycomusbserv:" daemon /usr/sbin/baycomusbserv -d -ORBIIOPIPv4=0 -ORBIIOPIPv6=0 RETVAL=$? echo [ "$RETVAL" = 0 ] && touch /var/lock/subsys/baycomusb } function stop() { echo -n "Stopping baycomusbserv:" killproc /usr/sbin/baycomusbserv RETVAL=$? echo [ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/baycomusb } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; condrestart) if [ -f /var/lock/subsys/baycomusb ] ; then stop start fi ;; status) status /usr/sbin/baycomusbserv ;; *) echo "Usage: baycomusb {start|stop|restart|condrestart|status}" RETVAL=1 esac exit $RETVAL baycomusb-0.10.orig/baycomusb.ifchange0100755000175100017510000000007007325134422016064 0ustar abaaba#!/bin/bash # perform interface up/down specific tasks baycomusb-0.10.orig/sdccasmcs51.diff0100644000175100017510000000212207325134422015352 0ustar abaaba--- sdcc/as/mcs51/i51mch.c.x Sun Jul 9 01:45:26 2000 +++ sdcc/as/mcs51/i51mch.c Sun Jul 9 01:45:32 2000 @@ -424,8 +424,8 @@ v1 = -3; else v1 = e1.e_addr - dot.s_addr - 1; - /* if ((v1 < -128) || (v1 > 127)) - aerr(); */ + if (((v1 < -128) || (v1 > 127)) && pass > 0) + aerr(); outab(v1); } else { outrb(&e1, R_PCR); @@ -443,8 +443,8 @@ v1 = -2; else v1 = e1.e_addr - dot.s_addr - 1; - /* if ((v1 < -128) || (v1 > 127)) - aerr();*/ + if (((v1 < -128) || (v1 > 127)) && pass > 0) + aerr(); outab(v1); } else { outrb(&e1, R_PCR); @@ -498,8 +498,8 @@ v1 = -3; else v1 = e1.e_addr - dot.s_addr - 1; - /* if ((v1 < -128) || (v1 > 127)) - aerr(); */ + if (((v1 < -128) || (v1 > 127)) && pass > 0) + aerr(); outab(v1); } else { outrb(&e1, R_PCR); @@ -535,8 +535,8 @@ v1 = -2; else v1 = e1.e_addr - dot.s_addr - 1; - /* if ((v1 < -128) || (v1 > 127)) - aerr(); */ + if (((v1 < -128) || (v1 > 127)) && pass > 0) + aerr(); outab(v1); } else { outrb(&e1, R_PCR); baycomusb-0.10.orig/cfgwindows0100755000175100017510000000133107327057016014515 0ustar abaaba#!/bin/sh if test -d /usr/local/cross/i686-pc-cygwin; then CROSSPATH=/usr/local/cross/i686-pc-cygwin/ else CROSSPATH=/usr/local/cygwin/i686-pc-cygwin/ fi PATH=${CROSSPATH}/bin:${PATH} CC=i686-pc-cygwin-gcc AR=i686-pc-cygwin-ar AS=i686-pc-cygwin-as LD=i686-pc-cygwin-ld RANLIB=i686-pc-cygwin-ranlib DLLTOOL=i686-pc-cygwin-dlltool WINDRES=i686-pc-cygwin-windres CPPFLAGS="-mno-cygwin" CFLAGS="-O2 -g -I${CROSSPATH}/gtk/include -I${CROSSPATH}/gtk/include/glib -I${CROSSPATH}/gtk/include/gdk -mno-cygwin -mpentium -fnative-struct" LDFLAGS="-L${CROSSPATH}/gtk/lib -mno-cygwin -g" export CC AS AR LD RANLIB DLLTOOL PATH CPPFLAGS CFLAGS LDFLAGS dir=`dirname $0` ${dir}/configure --host=i686-pc-cygwin --disable-nls --enable-mmx $* baycomusb-0.10.orig/cfgwindowsnodebug0100755000175100017510000000132307327057004016057 0ustar abaaba#!/bin/sh if test -d /usr/local/cross/i686-pc-cygwin; then CROSSPATH=/usr/local/cross/i686-pc-cygwin/ else CROSSPATH=/usr/local/cygwin/i686-pc-cygwin/ fi PATH=${CROSSPATH}/bin:${PATH} CC=i686-pc-cygwin-gcc AR=i686-pc-cygwin-ar AS=i686-pc-cygwin-as LD=i686-pc-cygwin-ld RANLIB=i686-pc-cygwin-ranlib DLLTOOL=i686-pc-cygwin-dlltool WINDRES=i686-pc-cygwin-windres CPPFLAGS="-mno-cygwin" CFLAGS="-O2 -I${CROSSPATH}/gtk/include -I${CROSSPATH}/gtk/include/glib -I${CROSSPATH}/gtk/include/gdk -mno-cygwin -mpentium -fnative-struct" LDFLAGS="-L${CROSSPATH}/gtk/lib -mno-cygwin" export CC AS AR LD RANLIB DLLTOOL PATH CFLAGS CPPFLAGS LDFLAGS dir=`dirname $0` ${dir}/configure --host=i686-pc-cygwin --disable-nls --enable-mmx $* baycomusb-0.10.orig/cfgwindowsnative0100755000175100017510000000044107327057012015721 0ustar abaaba#!/bin/sh CPPFLAGS="${CPPFLAGS} -mno-cygwin" CFLAGS="${CFLAGS} -O2 -g -mno-cygwin -mpentium -fnative-struct" LDFLAGS="${LDFLAGS} -L${CROSSPATH}/gtk/lib -mno-cygwin -g" export CC CPPFLAGS CFLAGS LDFLAGS dir=`dirname $0` ${dir}/configure --host=i686-pc-cygwin --disable-nls --enable-mmx $* baycomusb-0.10.orig/intl/0042755000175100017510000000000007340500000013347 5ustar abaababaycomusb-0.10.orig/intl/ChangeLog0100644000175100017510000010461407325134422015140 0ustar abaaba1998-04-29 Ulrich Drepper * intl/localealias.c (read_alias_file): Use unsigned char for local variables. Remove unused variable tp. * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char * for type of codeset. For loosing Solaris systems. * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset. * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable len if not needed. Patches by Jim Meyering. 1998-04-28 Ulrich Drepper * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if mmap is not supported. * hash-string.h: Don't include . 1998-04-27 Ulrich Drepper * textdomain.c: Use strdup is available. * localealias.c: Define HAVE_MEMPCPY so that we can use this function. Define and use semapahores to protect modfication of global objects when compiling for glibc. Add code to allow freeing alias table. * l10nflist.c: Don't assume stpcpy not being a macro. * gettextP.h: Define internal_function macri if not already done. Use glibc byte-swap macros instead of defining SWAP when compiled for glibc. (struct loaded_domain): Add elements to allow unloading. * Makefile.in (distclean): Don't remove libintl.h here. * bindtextdomain.c: Carry over changes from glibc. Use strdup if available. * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal functions. Add memory freeing code for glibc. * dgettext.c: Update copyright. * explodename.c: Include stdlib.h and string.h only if they exist. Use strings.h eventually. * finddomain.c: Mark internal functions. Use strdup if available. Add memory freeing code for glibc. 1997-10-10 20:00 Ulrich Drepper * libgettext.h: Fix dummy textdomain and bindtextdomain macros. They should return reasonable values. Reported by Tom Tromey . 1997-09-16 03:33 Ulrich Drepper * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined. * intlh.inst.in: Likewise. Reported by Jean-Marc Lasgouttes . * libintl.glibc: Update from current glibc version. 1997-09-06 02:10 Ulrich Drepper * intlh.inst.in: Reformat copyright. 1997-08-19 15:22 Ulrich Drepper * dcgettext.c (DCGETTEXT): Remove wrong comment. 1997-08-16 00:13 Ulrich Drepper * Makefile.in (install-data): Don't change directory to install. 1997-08-01 14:30 Ulrich Drepper * cat-compat.c: Fix copyright. * localealias.c: Don't define strchr unless !HAVE_STRCHR. * loadmsgcat.c: Update copyright. Fix typos. * l10nflist.c: Don't define strchr unless !HAVE_STRCHR. (_nl_make_l10nflist): Handle sponsor and revision correctly. * gettext.c: Update copyright. * gettext.h: Likewise. * hash-string.h: Likewise. * finddomain.c: Remoave dead code. Define strchr only if !HAVE_STRCHR. * explodename.c: Include . * explodename.c: Reformat copyright text. (_nl_explode_name): Fix typo. * dcgettext.c: Define and use __set_errno. (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is not defined. * bindtextdom.c: Pretty printing. 1997-05-01 02:25 Ulrich Drepper * dcgettext.c (guess_category_value): Don't depend on HAVE_LC_MESSAGES. We don't need the macro here. Patch by Bruno Haible . * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL macro. Instead use HAVE_LOCALE_NULL and define it when using glibc, as in dcgettext.c. Patch by Bruno Haible . * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois Pinard. Mon Mar 10 06:51:17 1997 Ulrich Drepper * Makefile.in: Implement handling of libtool. * gettextP.h: Change data structures for use of generic lowlevel i18n file handling. Wed Dec 4 20:21:18 1996 Ulrich Drepper * textdomain.c: Put parentheses around arguments of memcpy macro definition. * localealias.c: Likewise. * l10nflist.c: Likewise. * finddomain.c: Likewise. * bindtextdom.c: Likewise. Reported by Thomas Esken. Mon Nov 25 22:57:51 1996 Ulrich Drepper * textdomain.c: Move definition of `memcpy` macro to right position. Fri Nov 22 04:01:58 1996 Ulrich Drepper * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using bcopy if not already defined. Reported by Thomas Esken. * bindtextdom.c: Likewise. * l10nflist.c: Likewise. * localealias.c: Likewise. * textdomain.c: Likewise. Tue Oct 29 11:10:27 1996 Ulrich Drepper * Makefile.in (libdir): Change to use exec_prefix instead of prefix. Reported by Knut-HåvardAksnes . Sat Aug 31 03:07:09 1996 Ulrich Drepper * l10nflist.c (_nl_normalize_codeset): We convert to lower case, so don't prepend uppercase `ISO' for only numeric arg. Fri Jul 19 00:15:46 1996 Ulrich Drepper * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after definition of _GNU_SOURCE. Patch by Roland McGrath. * Makefile.in (uninstall): Fix another bug with `for' loop and empty arguments. Patch by Jim Meyering. Correct name os uninstalled files: no intl- prefix anymore. * Makefile.in (install-data): Again work around shells which cannot handle mpty for list. Reported by Jim Meyering. Sat Jul 13 18:11:35 1996 Ulrich Drepper * Makefile.in (install): Split goal. Now depend on install-exec and install-data. (install-exec, install-data): New goals. Created from former install goal. Reported by Karl Berry. Sat Jun 22 04:58:14 1996 Ulrich Drepper * Makefile.in (MKINSTALLDIRS): New variable. Path to mkinstalldirs script. (install): use MKINSTALLDIRS variable or if the script is not present try to find it in the $top_scrdir). Wed Jun 19 02:56:56 1996 Ulrich Drepper * l10nflist.c: Linux libc *partly* includes the argz_* functions. Grr. Work around by renaming the static version and use macros for renaming. Tue Jun 18 20:11:17 1996 Ulrich Drepper * l10nflist.c: Correct presence test macros of __argz_* functions. * l10nflist.c: Include based on test of it instead when __argz_* functions are available. Reported by Andreas Schwab. Thu Jun 13 15:17:44 1996 Ulrich Drepper * explodename.c, l10nflist.c: Define NULL for dumb systems. Tue Jun 11 17:05:13 1996 Ulrich Drepper * intlh.inst.in, libgettext.h (dcgettext): Rename local variable result to __result to prevent name clash. * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to get prototype for stpcpy and strcasecmp. * intlh.inst.in, libgettext.h: Move declaration of `_nl_msg_cat_cntr' outside __extension__ block to prevent warning from gcc's -Wnested-extern option. Fri Jun 7 01:58:00 1996 Ulrich Drepper * Makefile.in (install): Remove comment. Thu Jun 6 17:28:17 1996 Ulrich Drepper * Makefile.in (install): Work around for another Buglix stupidity. Always use an `else' close for `if's. Reported by Nelson Beebe. * Makefile.in (intlh.inst): Correct typo in phony rule. Reported by Nelson Beebe. Thu Jun 6 01:49:52 1996 Ulrich Drepper * dcgettext.c (read_alias_file): Rename variable alloca_list to block_list as the macro calls assume. Patch by Eric Backus. * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using malloc. (read_alias_file): Rename varriabe alloca_list to block_list as the macro calls assume. Patch by Eric Backus. * l10nflist.c: Correct conditional for inclusion. Reported by Roland McGrath. * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not all-@USE_NLS@. * Makefile.in (install): intlh.inst comes from local dir, not $(srcdir). * Makefile.in (intlh.inst): Special handling of this goal. If used in gettext, this is really a rul to construct this file. If used in any other package it is defined as a .PHONY rule with empty body. * finddomain.c: Extract locale file information handling into l10nfile.c. Rename local stpcpy__ function to stpcpy. * dcgettext.c (stpcpy): Add local definition. * l10nflist.c: Solve some portability problems. Patches partly by Thomas Esken. Add local definition of stpcpy. Tue Jun 4 02:47:49 1996 Ulrich Drepper * intlh.inst.in: Don't depend including on HAVE_LOCALE_H. Instead configure must rewrite this fiile depending on the result of the configure run. * Makefile.in (install): libintl.inst is now called intlh.inst. Add rules for updating intlh.inst from intlh.inst.in. * libintl.inst: Renamed to intlh.inst.in. * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1 because gcc has __buitlin_alloca. Reported by Roland McGrath. Mon Jun 3 00:32:16 1996 Ulrich Drepper * Makefile.in (installcheck): New goal to fulfill needs of automake's distcheck. * Makefile.in (install): Reorder commands so that VERSION is found. * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in @datadir@/gettext. (COMSRCS): Add l10nfile.c. (OBJECTS): Add l10nfile.o. (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common). (DISTFILE.gettext): Remove $(DISTFILES.common). (all-gettext): Remove goal. (install): If $(PACKAGE) = gettext install, otherwose do nothing. No package but gettext itself should install libintl.h + headers. (dist): Extend goal to work for gettext, too. (dist-gettext): Remove goal. * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc. Sun Jun 2 17:33:06 1996 Ulrich Drepper * loadmsgcat.c (_nl_load_domain): Parameter is now comes from find_l10nfile. Sat Jun 1 02:23:03 1996 Ulrich Drepper * l10nflist.c (__argz_next): Add definition. * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca code. Use new l10nfile handling. * localealias.c [!HAVE_ALLOCA]: Add code for handling missing alloca code. * l10nflist.c: Initial revision. Tue Apr 2 18:51:18 1996 Ulrich Drepper * Makefile.in (all-gettext): New goal. Same as all-yes. Thu Mar 28 23:01:22 1996 Karl Eichwalder * Makefile.in (gettextsrcdir): Define using @datadir@. Tue Mar 26 12:39:14 1996 Ulrich Drepper * finddomain.c: Include . Reported by Roland McGrath. Sat Mar 23 02:00:35 1996 Ulrich Drepper * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing with external declaration. Sat Mar 2 00:47:09 1996 Ulrich Drepper * Makefile.in (all-no): Rename from all_no. Sat Feb 17 00:25:59 1996 Ulrich Drepper * gettextP.h [loaded_domain]: Array `successor' must now contain up to 63 elements (because of codeset name normalization). * finddomain.c: Implement codeset name normalization. Thu Feb 15 04:39:09 1996 Ulrich Drepper * Makefile.in (all): Define to `all-@USE_NLS@'. (all-yes, all_no): New goals. `all-no' is noop, `all-yes' is former all. Mon Jan 15 21:46:01 1996 Howard Gayle * localealias.c (alias_compare): Increment string pointers in loop of strcasecmp replacement. Fri Dec 29 21:16:34 1995 Ulrich Drepper * Makefile.in (install-src): Who commented this goal out ? :-) Fri Dec 29 15:08:16 1995 Ulrich Drepper * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls should not effect it because a missing catalog is no error. Reported by Harald Knig . Tue Dec 19 22:09:13 1995 Ulrich Drepper * Makefile.in (Makefile): Explicitly use $(SHELL) for running shell scripts. Fri Dec 15 17:34:59 1995 Andreas Schwab * Makefile.in (install-src): Only install library and header when we use the own implementation. Don't do it when using the system's gettext or catgets functions. * dcgettext.c (find_msg): Must not swap domain->hash_size here. Sat Dec 9 16:24:37 1995 Ulrich Drepper * localealias.c, libintl.inst, libgettext.h, hash-string.h, gettextP.h, finddomain.c, dcgettext.c, cat-compat.c: Use PARAMS instead of __P. Suggested by Roland McGrath. Tue Dec 5 11:39:14 1995 Larry Schwimmer * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty. Mon Dec 4 15:42:07 1995 Ulrich Drepper * Makefile.in (install-src): Install libintl.inst instead of libintl.h.install. Sat Dec 2 22:51:38 1995 Marcus Daniels * cat-compat.c (textdomain): Reverse order in which files are tried you load. First try local file, when this failed absolute path. Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe * cat-compat.c (bindtextdomain): Add missing { }. Sun Nov 26 18:21:41 1995 Ulrich Drepper * libintl.inst: Add missing __P definition. Reported by Nelson Beebe. * Makefile.in: Add dummy `all' and `dvi' goals. Reported by Tom Tromey. Sat Nov 25 16:12:01 1995 Franc,ois Pinard * hash-string.h: Capitalize arguments of macros. Sat Nov 25 12:01:36 1995 Ulrich Drepper * Makefile.in (DISTFILES): Prevent files names longer than 13 characters. libintl.h.glibc->libintl.glibc, libintl.h.install->libintl.inst. Reported by Joshua R. Poulson. Sat Nov 25 11:31:12 1995 Eric Backus * dcgettext.c: Fix bug in preprocessor conditionals. Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe * libgettext.h: Solaris cc does not understand #if !SYMBOL1 && !SYMBOL2. Sad but true. Thu Nov 23 16:22:14 1995 Ulrich Drepper * hash-string.h (hash_string): Fix for machine with >32 bit `unsigned long's. * dcgettext.c (DCGETTEXT): Fix horrible bug in loop for alternative translation. Thu Nov 23 01:45:29 1995 Ulrich Drepper * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed: Some further simplifications in message number generation. Mon Nov 20 21:08:43 1995 Ulrich Drepper * libintl.h.glibc: Use __const instead of const in prototypes. * Makefile.in (install-src): Install libintl.h.install instead of libintl.h. This is a stripped-down version. Suggested by Peter Miller. * libintl.h.install, libintl.h.glibc: Initial revision. * localealias.c (_nl_expand_alias, read_alias_file): Protect prototypes in type casts by __P. Tue Nov 14 16:43:58 1995 Ulrich Drepper * hash-string.h: Correct prototype for hash_string. Sun Nov 12 12:42:30 1995 Ulrich Drepper * hash-string.h (hash_string): Add prototype. * gettextP.h: Fix copyright. (SWAP): Add prototype. Wed Nov 8 22:56:33 1995 Ulrich Drepper * localealias.c (read_alias_file): Forgot sizeof. Avoid calling *printf function. This introduces a big overhead. Patch by Roland McGrath. Tue Nov 7 14:21:08 1995 Ulrich Drepper * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy. * finddomain.c (stpcpy): Define substitution function local. The macro was to flaky. * cat-compat.c: Fix typo. * xopen-msg.sed, linux-msg.sed: While bringing message number to right place only accept digits. * linux-msg.sed, xopen-msg.sed: Now that the counter does not have leading 0s we don't need to remove them. Reported by Marcus Daniels. * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in dependency. Reported by Marcus Daniels. * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement. Generally cleanup using #if instead of #ifndef. * Makefile.in: Correct typos in comment. By Franc,ois Pinard. Mon Nov 6 00:27:02 1995 Ulrich Drepper * Makefile.in (install-src): Don't install libintl.h and libintl.a if we use an available gettext implementation. Sun Nov 5 22:02:08 1995 Ulrich Drepper * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported by Franc,ois Pinard. * libgettext.h: Use #if instead of #ifdef/#ifndef. * finddomain.c: Comments describing what has to be done should start with FIXME. Sun Nov 5 19:38:01 1995 Ulrich Drepper * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning. DISTFILES.common names the files common to both dist goals. DISTFILES.gettext are the files only distributed in GNU gettext. Sun Nov 5 17:32:54 1995 Ulrich Drepper * dcgettext.c (DCGETTEXT): Correct searching in derived locales. This was necessary since a change in _nl_find_msg several weeks ago. I really don't know this is still not fixed. Sun Nov 5 12:43:12 1995 Ulrich Drepper * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This might mark a special condition. * finddomain.c (make_entry_rec): Don't make illegal entry as decided. * Makefile.in (dist): Suppress error message when ln failed. Get files from $(srcdir) explicitly. * libgettext.h (gettext_const): Rename to gettext_noop. Fri Nov 3 07:36:50 1995 Ulrich Drepper * finddomain.c (make_entry_rec): Protect against wrong locale names by testing mask. * libgettext.h (gettext_const): Add macro definition. Capitalize macro arguments. Thu Nov 2 23:15:51 1995 Ulrich Drepper * finddomain.c (_nl_find_domain): Test for pointer != NULL before accessing value. Reported by Tom Tromey. * gettext.c (NULL): Define as (void*)0 instad of 0. Reported by Franc,ois Pinard. Mon Oct 30 21:28:52 1995 Ulrich Drepper * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering. Sat Oct 28 23:20:47 1995 Ulrich Drepper * libgettext.h: Disable dcgettext optimization for Solaris 2.3. * localealias.c (alias_compare): Peter Miller reported that tolower in some systems is even dumber than I thought. Protect call by `isupper'. Fri Oct 27 22:22:51 1995 Ulrich Drepper * Makefile.in (libdir, includedir): New variables. (install-src): Install libintl.a and libintl.h in correct dirs. Fri Oct 27 22:07:29 1995 Ulrich Drepper * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c. * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques. * localealias.c: Fix typo and superflous test. Reported by Christian von Roques. Fri Oct 6 11:52:05 1995 Ulrich Drepper * finddomain.c (_nl_find_domain): Correct some remainder from the pre-CEN syntax. Now we don't have a constant number of successors anymore. Wed Sep 27 21:41:13 1995 Ulrich Drepper * Makefile.in (DISTFILES): Add libintl.h.glibc. * Makefile.in (dist-libc): Add goal for packing sources for glibc. (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc. * loadmsgcat.c: Forget to continue #if line. * localealias.c: [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name space clean. * dcgettext.c, finddomain.c: Better comment to last change. * loadmsgcat.c: [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to __fstat, __open, __close, __read, __mmap, and __munmap resp to keep ANSI C name space clean. * finddomain.c: [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean. * dcgettext.c: [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to keep ANSI C name space clean. * libgettext.h: Include sys/types.h for those old SysV systems out there. Reported by Francesco Potorti`. * loadmsgcat.c (use_mmap): Define if compiled for glibc. * bindtextdom.c: Include all those standard headers unconditionally if _LIBC is defined. * finddomain.c: Fix 2 times defiend -> defined. * textdomain.c: Include libintl.h instead of libgettext.h when compiling for glibc. Include all those standard headers unconditionally if _LIBC is defined. * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc. * gettext.c: Include libintl.h instead of libgettext.h when compiling for glibc. Get NULL from stddef.h if we compile for glibc. * finddomain.c: Include libintl.h instead of libgettext.h when compiling for glibc. Include all those standard headers unconditionally if _LIBC is defined. * dcgettext.c: Include all those standard headers unconditionally if _LIBC is defined. * dgettext.c: If compiled in glibc include libintl.h instead of libgettext.h. (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc. * dcgettext.c: If compiled in glibc include libintl.h instead of libgettext.h. (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc. * bindtextdom.c: If compiled in glibc include libintl.h instead of libgettext.h. Mon Sep 25 22:23:06 1995 Ulrich Drepper * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0. Reported by Marcus Daniels. * cat-compat.c (bindtextdomain): String used in putenv must not be recycled. Reported by Marcus Daniels. * libgettext.h (__USE_GNU_GETTEXT): Additional symbol to signal that we use GNU gettext library. * cat-compat.c (bindtextdomain): Fix bug with the strange stpcpy replacement. Reported by Nelson Beebe. Sat Sep 23 08:23:51 1995 Ulrich Drepper * cat-compat.c: Include for stpcpy prototype. * localealias.c (read_alias_file): While expand strdup code temporary variable `cp' hided higher level variable with same name. Rename to `tp'. * textdomain.c (textdomain): Avoid warning by using temporary variable in strdup code. * finddomain.c (_nl_find_domain): Remove unused variable `application'. Thu Sep 21 15:51:44 1995 Ulrich Drepper * localealias.c (alias_compare): Use strcasecmp() only if available. Else use implementation in place. * intl-compat.c: Wrapper functions now call *__ functions instead of __*. * libgettext.h: Declare prototypes for *__ functions instead for __*. * cat-compat.c, loadmsgcat.c: Don't use xmalloc, xstrdup, and stpcpy. These functions are not part of the standard libc and so prevent libintl.a from being used standalone. * bindtextdom.c: Don't use xmalloc, xstrdup, and stpcpy. These functions are not part of the standard libc and so prevent libintl.a from being used standalone. Rename to bindtextdomain__ if not used in GNU C Library. * dgettext.c: Rename function to dgettext__ if not used in GNU C Library. * gettext.c: Don't use xmalloc, xstrdup, and stpcpy. These functions are not part of the standard libc and so prevent libintl.a from being used standalone. Functions now called gettext__ if not used in GNU C Library. * dcgettext.c, localealias.c, textdomain.c, finddomain.c: Don't use xmalloc, xstrdup, and stpcpy. These functions are not part of the standard libc and so prevent libintl.a from being used standalone. Sun Sep 17 23:14:49 1995 Ulrich Drepper * finddomain.c: Correct some bugs in handling of CEN standard locale definitions. Thu Sep 7 01:49:28 1995 Ulrich Drepper * finddomain.c: Implement CEN syntax. * gettextP.h (loaded_domain): Extend number of successors to 31. Sat Aug 19 19:25:29 1995 Ulrich Drepper * Makefile.in (aliaspath): Remove path to X11 locale dir. * Makefile.in: Make install-src depend on install. This helps gettext to install the sources and other packages can use the install goal. Sat Aug 19 15:19:33 1995 Ulrich Drepper * Makefile.in (uninstall): Remove stuff installed by install-src. Tue Aug 15 13:13:53 1995 Ulrich Drepper * VERSION.in: Initial revision. * Makefile.in (DISTFILES): Add VERSION file. This is not necessary for gettext, but for other packages using this library. Tue Aug 15 06:16:44 1995 Ulrich Drepper * gettextP.h (_nl_find_domain): New prototype after changing search strategy. * finddomain.c (_nl_find_domain): We now try only to find a specified catalog. Fall back to other catalogs listed in the locale list is now done in __dcgettext. * dcgettext.c (__dcgettext): Now we provide message fall back even to different languages. I.e. if a message is not available in one language all the other in the locale list a tried. Formerly fall back was only possible within one language. Implemented by moving one loop from _nl_find_domain to here. Mon Aug 14 23:45:50 1995 Ulrich Drepper * Makefile.in (gettextsrcdir): Directory where source of GNU gettext library are made available. (INSTALL, INSTALL_DATA): Programs used for installing sources. (gettext-src): New. Rule to install GNU gettext sources for use in gettextize shell script. Sun Aug 13 14:40:48 1995 Ulrich Drepper * loadmsgcat.c (_nl_load_domain): Use mmap for loading only when munmap function is also available. * Makefile.in (install): Depend on `all' goal. Wed Aug 9 11:04:33 1995 Ulrich Drepper * localealias.c (read_alias_file): Do not overwrite '\n' when terminating alias value string. * localealias.c (read_alias_file): Handle long lines. Ignore the rest not fitting in the buffer after the initial `fgets' call. Wed Aug 9 00:54:29 1995 Ulrich Drepper * gettextP.h (_nl_load_domain): Add prototype, replacing prototype for _nl_load_msg_cat. * finddomain.c (_nl_find_domain): Remove unneeded variable filename and filename_len. (expand_alias): Remove prototype because functions does not exist anymore. * localealias.c (read_alias_file): Change type of fname_len parameter to int. (xmalloc): Add prototype. * loadmsgcat.c: Better prototypes for xmalloc. Tue Aug 8 22:30:39 1995 Ulrich Drepper * finddomain.c (_nl_find_domain): Allow alias name to be constructed from the four components. * Makefile.in (aliaspath): New variable. Set to preliminary value. (SOURCES): Add localealias.c. (OBJECTS): Add localealias.o. * gettextP.h: Add prototype for _nl_expand_alias. * finddomain.c: Aliasing handled in intl/localealias.c. * localealias.c: Aliasing for locale names. * bindtextdom.c: Better prototypes for xmalloc and xstrdup. Mon Aug 7 23:47:42 1995 Ulrich Drepper * Makefile.in (DISTFILES): gettext.perl is now found in misc/. * cat-compat.c (bindtextdomain): Correct implementation. dirname parameter was not used. Reported by Marcus Daniels. * gettextP.h (loaded_domain): New fields `successor' and `decided' for oo, lazy message handling implementation. * dcgettext.c: Adopt for oo, lazy message handliing. Now we can inherit translations from less specific locales. (find_msg): New function. * loadmsgcat.c, finddomain.c: Complete rewrite. Implement oo, lazy message handling :-). We now have an additional environment variable `LANGUAGE' with a higher priority than LC_ALL for the LC_MESSAGE locale. Here we can set a colon separated list of specifications each of the form `language[_territory[.codeset]][@modifier]'. Sat Aug 5 09:55:42 1995 Ulrich Drepper * finddomain.c (unistd.h): Include to get _PC_PATH_MAX defined on system having it. Fri Aug 4 22:42:00 1995 Ulrich Drepper * finddomain.c (stpcpy): Include prototype. * Makefile.in (dist): Remove `copying instead' message. Wed Aug 2 18:52:03 1995 Ulrich Drepper * Makefile.in (ID, TAGS): Do not use $^. Tue Aug 1 20:07:11 1995 Ulrich Drepper * Makefile.in (TAGS, ID): Use $^ as command argument. (TAGS): Give etags -o option t write to current directory, not $(srcdir). (ID): Use $(srcdir) instead os $(top_srcdir)/src. (distclean): Remove ID. Sun Jul 30 11:51:46 1995 Ulrich Drepper * Makefile.in (gnulocaledir): New variable, always using share/ for data directory. (DEFS): Add GNULOCALEDIR, used in finddomain.c. * finddomain.c (_nl_default_dirname): Set to GNULOCALEDIR, because it always has to point to the directory where GNU gettext Library writes it to. * intl-compat.c (textdomain, bindtextdomain): Undefine macros before function definition. Sat Jul 22 01:10:02 1995 Ulrich Drepper * libgettext.h (_LIBINTL_H): Protect definition in case where this file is included as libgettext.h on Solaris machines. Add comment about this. Wed Jul 19 02:36:42 1995 Ulrich Drepper * intl-compat.c (textdomain): Correct typo. Wed Jul 19 01:51:35 1995 Ulrich Drepper * dcgettext.c (dcgettext): Function now called __dcgettext. * dgettext.c (dgettext): Now called __dgettext and calls __dcgettext. * gettext.c (gettext): Function now called __gettext and calls __dgettext. * textdomain.c (textdomain): Function now called __textdomain. * bindtextdom.c (bindtextdomain): Function now called __bindtextdomain. * intl-compat.c: Initial revision. * Makefile.in (SOURCES): Add intl-compat.c. (OBJECTS): We always compile the GNU gettext library functions. OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o, and intl-compat.o. (GETTOBJS): Contains now only intl-compat.o. * libgettext.h: Re-include protection matches dualistic character of libgettext.h. For all functions in GNU gettext library define __ counter part. * finddomain.c (strchr): Define as index if not found in C library. (_nl_find_domain): For relative paths paste / in between. Tue Jul 18 16:37:45 1995 Ulrich Drepper * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h. * xopen-msg.sed: Fix bug with `msgstr ""' lines. A little bit better comments. Tue Jul 18 01:18:27 1995 Ulrich Drepper * Makefile.in: po-mode.el, makelinks, combine-sh are now found in ../misc. * po-mode.el, makelinks, combine-sh, elisp-comp: Moved to ../misc/. * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__. Sun Jul 16 22:33:02 1995 Ulrich Drepper * Makefile.in (INSTALL, INSTALL_DATA): New variables. (install-data, uninstall): Install/uninstall .elc file. * po-mode.el (Installation comment): Add .pox as possible extension of .po files. Sun Jul 16 13:23:27 1995 Ulrich Drepper * elisp-comp: Complete new version by Franc,ois: This does not fail when not compiling in the source directory. Sun Jul 16 00:12:17 1995 Ulrich Drepper * Makefile.in (../po/cat-id-tbl.o): Use $(MAKE) instead of make for recursive make. * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh. (install-exec): Add missing dummy goal. (install-data, uninstall): @ in multi-line shell command at beginning, not in front of echo. Reported by Eric Backus. Sat Jul 15 00:21:28 1995 Ulrich Drepper * Makefile.in (DISTFILES): Rename libgettext.perl to gettext.perl to fit in 14 chars file systems. * gettext.perl: Rename to gettext.perl to fit in 14 chars file systems. Thu Jul 13 23:17:20 1995 Ulrich Drepper * cat-compat.c: If !STDC_HEADERS try to include malloc.h. Thu Jul 13 20:55:02 1995 Ulrich Drepper * po2tbl.sed.in: Pretty printing. * linux-msg.sed, xopen-msg.sed: Correct bugs with handling substitute flags in branches. * hash-string.h (hash_string): Old K&R compilers don't under stand `unsigned char'. * gettext.h (nls_uint32): Some old K&R compilers (eg HP) don't understand `unsigned int'. * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes. Thu Jul 13 01:34:33 1995 Ulrich Drepper * Makefile.in (ELCFILES): New variable. (DISTFILES): Add elisp-comp. Add implicit rule for .el -> .elc compilation. (install-data): install $ELCFILES (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp. * elisp-comp: Initial revision Wed Jul 12 16:14:52 1995 Ulrich Drepper * Makefile.in: cat-id-tbl.c is now found in po/. This enables us to use an identical intl/ directory in all packages. * dcgettext.c (dcgettext): hashing does not work for table size <= 2. * textdomain.c: fix typo (#if def -> #if defined) Tue Jul 11 18:44:43 1995 Ulrich Drepper * Makefile.in (stamp-cat-id): use top_srcdir to address source files (DISTFILES,distclean): move tupdate.perl to src/ * po-to-tbl.sed.in: add additional jump to clear change flag to recognize multiline strings Tue Jul 11 01:32:50 1995 Ulrich Drepper * textdomain.c: Protect inclusion of stdlib.h and string.h. * loadmsgcat.c: Protect inclusion of stdlib.h. * libgettext.h: Protect inclusion of locale.h. Allow use in C++ programs. Define NULL is not happened already. * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of po-to-tbl.sed. (distclean): remove po-to-tbl.sed and tupdate.perl. * tupdate.perl.in: Substitute Perl path even in exec line. Don't include entries without translation from old .po file. Tue Jul 4 00:41:51 1995 Ulrich Drepper * tupdate.perl.in: use "Updated: " in msgid "". * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR). Define getenv if !__STDC__. * bindtextdom.c: Protect stdlib.h and string.h inclusion. Define free if !__STDC__. * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. Define free if !__STDC__. * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. Mon Jul 3 23:56:30 1995 Ulrich Drepper * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR. Remove unneeded $(srcdir) from Makefile.in dependency. * makelinks: Add copyright and short description. * po-mode.el: Last version for 0.7. * tupdate.perl.in: Fix die message. * dcgettext.c: Protect include of string.h. * gettext.c: Protect include of stdlib.h and further tries to get NULL. * finddomain.c: Some corrections in includes. * Makefile.in (INCLUDES): Prune list correct path to Makefile.in. * po-to-tbl.sed: Adopt for new .po file format. * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format. Sun Jul 2 23:55:03 1995 Ulrich Drepper * tupdate.perl.in: Complete rewrite for new .po file format. Sun Jul 2 02:06:50 1995 Ulrich Drepper * First official release. This directory contains all the code needed to internationalize own packages. It provides functions which allow to use the X/Open catgets function with an interface like the Uniforum gettext function. For system which does not have neither of those a complete implementation is provided. baycomusb-0.10.orig/intl/Makefile.in0100644000175100017510000001446707325134422015441 0ustar abaaba# Makefile for directory with message catalog handling in GNU NLS Utilities. # Copyright (C) 1995, 1996, 1997 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. PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = .. VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ transform = @program_transform_name@ libdir = $(exec_prefix)/lib includedir = $(prefix)/include datadir = $(prefix)/@DATADIRNAME@ localedir = $(datadir)/locale gnulocaledir = $(prefix)/share/locale gettextsrcdir = @datadir@/gettext/intl aliaspath = $(localedir):. subdir = intl INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @MKINSTALLDIRS@ l = @l@ AR = ar CC = @CC@ LIBTOOL = @LIBTOOL@ RANLIB = @RANLIB@ DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \ -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@ CPPFLAGS = @CPPFLAGS@ CFLAGS = @CFLAGS@ LDFLAGS = @LDFLAGS@ COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) HEADERS = $(COMHDRS) libgettext.h loadinfo.h COMHDRS = gettext.h gettextP.h hash-string.h SOURCES = $(COMSRCS) intl-compat.c cat-compat.c COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ explodename.c OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ explodename.$lo CATOBJS = cat-compat.$lo ../po/cat-id-tbl.$lo GETTOBJS = intl-compat.$lo DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \ xopen-msg.sed $(HEADERS) $(SOURCES) DISTFILES.normal = VERSION DISTFILES.gettext = libintl.glibc intlh.inst.in .SUFFIXES: .SUFFIXES: .c .o .lo .c.o: $(COMPILE) $< .c.lo: $(LIBTOOL) --mode=compile $(COMPILE) $< INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib all: all-@USE_INCLUDED_LIBINTL@ all-yes: libintl.$la intlh.inst all-no: libintl.a: $(OBJECTS) rm -f $@ $(AR) cru $@ $(OBJECTS) $(RANLIB) $@ libintl.la: $(OBJECTS) $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $(OBJECTS) \ -version-info 1:0 -rpath $(libdir) ../po/cat-id-tbl.$lo: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot cd ../po && $(MAKE) cat-id-tbl.$lo check: all # This installation goal is only used in GNU gettext. Packages which # only use the library should use install instead. # We must not install the libintl.h/libintl.a files if we are on a # system which has the gettext() function in its C library or in a # separate library or use the catgets interface. A special case is # where configure found a previously installed GNU gettext library. # If you want to use the one which comes with this version of the # package, you have to use `configure --with-included-gettext'. install: install-exec install-data install-exec: all if test "$(PACKAGE)" = "gettext" \ && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ if test -r $(MKINSTALLDIRS); then \ $(MKINSTALLDIRS) $(libdir) $(includedir); \ else \ $(top_srcdir)/mkinstalldirs $(libdir) $(includedir); \ fi; \ $(INSTALL_DATA) intlh.inst $(includedir)/libintl.h; \ $(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \ else \ : ; \ fi install-data: all if test "$(PACKAGE)" = "gettext"; then \ if test -r $(MKINSTALLDIRS); then \ $(MKINSTALLDIRS) $(gettextsrcdir); \ else \ $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ fi; \ $(INSTALL_DATA) VERSION $(gettextsrcdir)/VERSION; \ dists="$(DISTFILES.common)"; \ for file in $$dists; do \ $(INSTALL_DATA) $(srcdir)/$$file $(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: dists="$(DISTFILES.common)"; \ for file in $$dists; do \ rm -f $(gettextsrcdir)/$$file; \ done info dvi: $(OBJECTS): ../config.h libgettext.h bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h tags: TAGS TAGS: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) id: ID ID: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) mostlyclean: rm -f *.a *.o *.lo core core.* clean: mostlyclean distclean: clean rm -f Makefile ID TAGS po2msg.sed po2tbl.sed maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." # GNU gettext needs not contain the file `VERSION' but contains some # other files which should not be distributed in other packages. distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: Makefile $(DISTFILES) if test "$(PACKAGE)" = gettext; then \ additional="$(DISTFILES.gettext)"; \ else \ additional="$(DISTFILES.normal)"; \ fi; \ for file in $(DISTFILES.common) $$additional; do \ ln $(srcdir)/$$file $(distdir) 2> /dev/null \ || cp -p $(srcdir)/$$file $(distdir); \ done dist-libc: tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc Makefile: Makefile.in ../config.status cd .. \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status # The dependency for intlh.inst is different in gettext and all other # packages. Because we cannot you GNU make features we have to solve # the problem while rewriting Makefile.in. @GT_YES@intlh.inst: intlh.inst.in ../config.status @GT_YES@ cd .. \ @GT_YES@ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \ @GT_YES@ $(SHELL) ./config.status @GT_NO@.PHONY: intlh.inst @GT_NO@intlh.inst: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: baycomusb-0.10.orig/intl/linux-msg.sed0100644000175100017510000000520507325134422016002 0ustar abaaba# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file # Copyright (C) 1995 Free Software Foundation, Inc. # Ulrich Drepper , 1995. # # 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. # # # The first directive in the .msg should be the definition of the # message set number. We use always set number 1. # 1 { i\ $set 1 # Automatically created by po2msg.sed h s/.*/0/ x } # # Mitch's old catalog format does not allow comments. # # We copy the original message as a comment into the .msg file. # /^msgid/ { s/msgid[ ]*"// # # This does not work now with the new format. # /"$/! { # s/\\$// # s/$/ ... (more lines following)"/ # } x # The following nice solution is by # Bruno td # Increment a decimal number in pattern space. # First hide trailing `9' digits. :d s/9\(_*\)$/_\1/ td # Assure at least one digit is available. s/^\(_*\)$/0\1/ # Increment the last digit. s/8\(_*\)$/9\1/ s/7\(_*\)$/8\1/ s/6\(_*\)$/7\1/ s/5\(_*\)$/6\1/ s/4\(_*\)$/5\1/ s/3\(_*\)$/4\1/ s/2\(_*\)$/3\1/ s/1\(_*\)$/2\1/ s/0\(_*\)$/1\1/ # Convert the hidden `9' digits to `0's. s/_/0/g x G s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p } # # The .msg file contains, other then the .po file, only the translations # but each given a unique ID. Starting from 1 and incrementing by 1 for # each message we assign them to the messages. # It is important that the .po file used to generate the cat-id-tbl.c file # (with po-to-tbl) is the same as the one used here. (At least the order # of declarations must not be changed.) # /^msgstr/ { s/msgstr[ ]*"\(.*\)"/# \1/ # Clear substitution flag. tb # Append the next line. :b N # Look whether second part is continuation line. s/\(.*\n\)"\(.*\)"/\1\2/ # Yes, then branch. ta P D # Note that D includes a jump to the start!! # We found a continuation line. But before printing insert '\'. :a s/\(.*\)\(\n.*\)/\1\\\2/ P # We cannot use D here. s/.*\n\(.*\)/\1/ tb } d baycomusb-0.10.orig/intl/po2tbl.sed.in0100644000175100017510000000456507325134422015676 0ustar abaaba# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets # Copyright (C) 1995 Free Software Foundation, Inc. # Ulrich Drepper , 1995. # # 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. # 1 { i\ /* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\ \ #if HAVE_CONFIG_H\ # include \ #endif\ \ #include "libgettext.h"\ \ const struct _msg_ent _msg_tbl[] = { h s/.*/0/ x } # # Write msgid entries in C array form. # /^msgid/ { s/msgid[ ]*\(".*"\)/ {\1/ tb # Append the next line :b N # Look whether second part is continuation line. s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/ # Yes, then branch. ta # Because we assume that the input file correctly formed the line # just read cannot be again be a msgid line. So it's safe to ignore # it. s/\(.*\)\n.*/\1/ bc # We found a continuation line. But before printing insert '\'. :a s/\(.*\)\(\n.*\)/\1\\\2/ P # We cannot use D here. s/.*\n\(.*\)/\1/ # Some buggy seds do not clear the `successful substitution since last ``t''' # flag on `N', so we do a `t' here to clear it. tb # Not reached :c x # The following nice solution is by # Bruno td # Increment a decimal number in pattern space. # First hide trailing `9' digits. :d s/9\(_*\)$/_\1/ td # Assure at least one digit is available. s/^\(_*\)$/0\1/ # Increment the last digit. s/8\(_*\)$/9\1/ s/7\(_*\)$/8\1/ s/6\(_*\)$/7\1/ s/5\(_*\)$/6\1/ s/4\(_*\)$/5\1/ s/3\(_*\)$/4\1/ s/2\(_*\)$/3\1/ s/1\(_*\)$/2\1/ s/0\(_*\)$/1\1/ # Convert the hidden `9' digits to `0's. s/_/0/g x G s/\(.*\)\n\([0-9]*\)/\1, \2},/ s/\(.*\)"$/\1/ p } # # Last line. # $ { i\ };\ g s/0*\(.*\)/int _msg_tbl_length = \1;/p } d baycomusb-0.10.orig/intl/xopen-msg.sed0100644000175100017510000000537607325134422016005 0ustar abaaba# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file # Copyright (C) 1995 Free Software Foundation, Inc. # Ulrich Drepper , 1995. # # 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. # # # The first directive in the .msg should be the definition of the # message set number. We use always set number 1. # 1 { i\ $set 1 # Automatically created by po2msg.sed h s/.*/0/ x } # # We copy all comments into the .msg file. Perhaps they can help. # /^#/ s/^#[ ]*/$ /p # # We copy the original message as a comment into the .msg file. # /^msgid/ { # Does not work now # /"$/! { # s/\\$// # s/$/ ... (more lines following)"/ # } s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/ p } # # The .msg file contains, other then the .po file, only the translations # but each given a unique ID. Starting from 1 and incrementing by 1 for # each message we assign them to the messages. # It is important that the .po file used to generate the cat-id-tbl.c file # (with po-to-tbl) is the same as the one used here. (At least the order # of declarations must not be changed.) # /^msgstr/ { s/msgstr[ ]*"\(.*\)"/\1/ x # The following nice solution is by # Bruno td # Increment a decimal number in pattern space. # First hide trailing `9' digits. :d s/9\(_*\)$/_\1/ td # Assure at least one digit is available. s/^\(_*\)$/0\1/ # Increment the last digit. s/8\(_*\)$/9\1/ s/7\(_*\)$/8\1/ s/6\(_*\)$/7\1/ s/5\(_*\)$/6\1/ s/4\(_*\)$/5\1/ s/3\(_*\)$/4\1/ s/2\(_*\)$/3\1/ s/1\(_*\)$/2\1/ s/0\(_*\)$/1\1/ # Convert the hidden `9' digits to `0's. s/_/0/g x # Bring the line in the format ` ' G s/^[^\n]*$/& / s/\(.*\)\n\([0-9]*\)/\2 \1/ # Clear flag from last substitution. tb # Append the next line. :b N # Look whether second part is a continuation line. s/\(.*\n\)"\(.*\)"/\1\2/ # Yes, then branch. ta P D # Note that `D' includes a jump to the start!! # We found a continuation line. But before printing insert '\'. :a s/\(.*\)\(\n.*\)/\1\\\2/ P # We cannot use the sed command `D' here s/.*\n\(.*\)/\1/ tb } d baycomusb-0.10.orig/intl/gettext.h0100644000175100017510000000620507325134422015220 0ustar abaaba/* Internal header for GNU gettext internationalization functions. Copyright (C) 1995, 1997 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 Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETTEXT_H #define _GETTEXT_H 1 #include #if HAVE_LIMITS_H || _LIBC # include #endif /* @@ end of prolog @@ */ /* The magic number of the GNU message catalog format. */ #define _MAGIC 0x950412de #define _MAGIC_SWAPPED 0xde120495 /* Revision number of the currently used .mo (binary) file format. */ #define MO_REVISION_NUMBER 0 /* The following contortions are an attempt to use the C preprocessor to determine an unsigned integral type that is 32 bits wide. An alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but doing that would require that the configure script compile and *run* the resulting executable. Locally running cross-compiled executables is usually not possible. */ #if __STDC__ # define UINT_MAX_32_BITS 4294967295U #else # define UINT_MAX_32_BITS 0xFFFFFFFF #endif /* If UINT_MAX isn't defined, assume it's a 32-bit type. This should be valid for all systems GNU cares about because that doesn't include 16-bit systems, and only modern systems (that certainly have ) have 64+-bit integral types. */ #ifndef UINT_MAX # define UINT_MAX UINT_MAX_32_BITS #endif #if UINT_MAX == UINT_MAX_32_BITS typedef unsigned nls_uint32; #else # if USHRT_MAX == UINT_MAX_32_BITS typedef unsigned short nls_uint32; # else # if ULONG_MAX == UINT_MAX_32_BITS typedef unsigned long nls_uint32; # else /* The following line is intended to throw an error. Using #error is not portable enough. */ "Cannot determine unsigned 32-bit data type." # endif # endif #endif /* Header for binary .mo file format. */ struct mo_file_header { /* The magic number. */ nls_uint32 magic; /* The revision number of the file format. */ nls_uint32 revision; /* The number of strings pairs. */ nls_uint32 nstrings; /* Offset of table with start offsets of original strings. */ nls_uint32 orig_tab_offset; /* Offset of table with start offsets of translation strings. */ nls_uint32 trans_tab_offset; /* Size of hashing table. */ nls_uint32 hash_tab_size; /* Offset of first hashing entry. */ nls_uint32 hash_tab_offset; }; struct string_desc { /* Length of addressed string. */ nls_uint32 length; /* Offset of string in file. */ nls_uint32 offset; }; /* @@ begin of epilog @@ */ #endif /* gettext.h */ baycomusb-0.10.orig/intl/gettextP.h0100644000175100017510000000420607325134422015337 0ustar abaaba/* Header describing internals of gettext library Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. 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. */ #ifndef _GETTEXTP_H #define _GETTEXTP_H #include "loadinfo.h" /* @@ end of prolog @@ */ #ifndef PARAMS # if __STDC__ # define PARAMS(args) args # else # define PARAMS(args) () # endif #endif #ifndef internal_function # define internal_function #endif #ifndef W # define W(flag, data) ((flag) ? SWAP (data) : (data)) #endif #ifdef _LIBC # include # define SWAP(i) bswap_32 (i) #else static nls_uint32 SWAP PARAMS ((nls_uint32 i)); static inline nls_uint32 SWAP (i) nls_uint32 i; { return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); } #endif struct loaded_domain { const char *data; int use_mmap; size_t mmap_size; int must_swap; nls_uint32 nstrings; struct string_desc *orig_tab; struct string_desc *trans_tab; nls_uint32 hash_size; nls_uint32 *hash_tab; }; struct binding { struct binding *next; char *domainname; char *dirname; }; struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, char *__locale, const char *__domainname)) internal_function; void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain)) internal_function; void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) internal_function; /* @@ begin of epilog @@ */ #endif /* gettextP.h */ baycomusb-0.10.orig/intl/hash-string.h0100644000175100017510000000337307325134422015766 0ustar abaaba/* Implements a string hashing function. Copyright (C) 1995, 1997 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 Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* @@ end of prolog @@ */ #ifndef PARAMS # if __STDC__ # define PARAMS(Args) Args # else # define PARAMS(Args) () # endif #endif /* We assume to have `unsigned long int' value with at least 32 bits. */ #define HASHWORDBITS 32 /* Defines the so called `hashpjw' function by P.J. Weinberger [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, 1986, 1987 Bell Telephone Laboratories, Inc.] */ static unsigned long hash_string PARAMS ((const char *__str_param)); static inline unsigned long hash_string (str_param) const char *str_param; { unsigned long int hval, g; const char *str = str_param; /* Compute the hash value for the given string. */ hval = 0; while (*str != '\0') { hval <<= 4; hval += (unsigned long) *str++; g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4)); if (g != 0) { hval ^= g >> (HASHWORDBITS - 8); hval ^= g; } } return hval; } baycomusb-0.10.orig/intl/libgettext.h0100644000175100017510000001314507325134422015710 0ustar abaaba/* Message catalogs for internationalization. Copyright (C) 1995, 1996, 1997, 1998 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. */ /* Because on some systems (e.g. Solaris) we sometimes have to include the systems libintl.h as well as this file we have more complex include protection above. But the systems header might perhaps also define _LIBINTL_H and therefore we have to protect the definition here. */ #if !defined _LIBINTL_H || !defined _LIBGETTEXT_H #ifndef _LIBINTL_H # define _LIBINTL_H 1 #endif #define _LIBGETTEXT_H 1 /* We define an additional symbol to signal that we use the GNU implementation of gettext. */ #define __USE_GNU_GETTEXT 1 #include #if HAVE_LOCALE_H # include #endif #ifdef __cplusplus extern "C" { #endif /* @@ end of prolog @@ */ #ifndef PARAMS # if __STDC__ || defined __cplusplus # define PARAMS(args) args # else # define PARAMS(args) () # endif #endif #ifndef NULL # if !defined __cplusplus || defined __GNUC__ # define NULL ((void *) 0) # else # define NULL (0) # endif #endif #if !HAVE_LC_MESSAGES /* This value determines the behaviour of the gettext() and dgettext() function. But some system does not have this defined. Define it to a default value. */ # define LC_MESSAGES (-1) #endif /* Declarations for gettext-using-catgets interface. Derived from Jim Meyering's libintl.h. */ struct _msg_ent { const char *_msg; int _msg_number; }; #if HAVE_CATGETS /* These two variables are defined in the automatically by po-to-tbl.sed generated file `cat-id-tbl.c'. */ extern const struct _msg_ent _msg_tbl[]; extern int _msg_tbl_length; #endif /* For automatical extraction of messages sometimes no real translation is needed. Instead the string itself is the result. */ #define gettext_noop(Str) (Str) /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ extern char *gettext PARAMS ((const char *__msgid)); extern char *gettext__ PARAMS ((const char *__msgid)); /* Look up MSGID in the DOMAINNAME message catalog for the current LC_MESSAGES locale. */ extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid)); extern char *dgettext__ PARAMS ((const char *__domainname, const char *__msgid)); /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid, int __category)); extern char *dcgettext__ PARAMS ((const char *__domainname, const char *__msgid, int __category)); /* Set the current default message catalog to DOMAINNAME. If DOMAINNAME is null, return the current default. If DOMAINNAME is "", reset to the default of "messages". */ extern char *textdomain PARAMS ((const char *__domainname)); extern char *textdomain__ PARAMS ((const char *__domainname)); /* Specify that the DOMAINNAME message catalog will be found in DIRNAME rather than in the system locale data base. */ extern char *bindtextdomain PARAMS ((const char *__domainname, const char *__dirname)); extern char *bindtextdomain__ PARAMS ((const char *__domainname, const char *__dirname)); #if ENABLE_NLS /* Solaris 2.3 has the gettext function but dcgettext is missing. So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4 has dcgettext. */ # if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT) # define gettext(Msgid) \ dgettext (NULL, Msgid) # define dgettext(Domainname, Msgid) \ dcgettext (Domainname, Msgid, LC_MESSAGES) # if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7 /* This global variable is defined in loadmsgcat.c. We need a sign, whether a new catalog was loaded, which can be associated with all translations. */ extern int _nl_msg_cat_cntr; # define dcgettext(Domainname, Msgid, Category) \ (__extension__ \ ({ \ char *__result; \ if (__builtin_constant_p (Msgid)) \ { \ static char *__translation__; \ static int __catalog_counter__; \ if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \ { \ __translation__ = \ dcgettext__ (Domainname, Msgid, Category); \ __catalog_counter__ = _nl_msg_cat_cntr; \ } \ __result = __translation__; \ } \ else \ __result = dcgettext__ (Domainname, Msgid, Category); \ __result; \ })) # endif # endif #else # define gettext(Msgid) (Msgid) # define dgettext(Domainname, Msgid) (Msgid) # define dcgettext(Domainname, Msgid, Category) (Msgid) # define textdomain(Domainname) ((char *) Domainname) # define bindtextdomain(Domainname, Dirname) ((char *) Dirname) #endif /* @@ begin of epilog @@ */ #ifdef __cplusplus } #endif #endif baycomusb-0.10.orig/intl/loadinfo.h0100644000175100017510000000455507325134422015335 0ustar abaaba/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 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. */ #ifndef PARAMS # if __STDC__ # define PARAMS(args) args # else # define PARAMS(args) () # endif #endif /* Encoding of locale name parts. */ #define CEN_REVISION 1 #define CEN_SPONSOR 2 #define CEN_SPECIAL 4 #define XPG_NORM_CODESET 8 #define XPG_CODESET 16 #define TERRITORY 32 #define CEN_AUDIENCE 64 #define XPG_MODIFIER 128 #define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) #define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) struct loaded_l10nfile { const char *filename; int decided; const void *data; struct loaded_l10nfile *next; struct loaded_l10nfile *successor[1]; }; extern const char *_nl_normalize_codeset PARAMS ((const unsigned char *codeset, size_t name_len)); extern struct loaded_l10nfile * _nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, const char *dirlist, size_t dirlist_len, int mask, const char *language, const char *territory, const char *codeset, const char *normalized_codeset, const char *modifier, const char *special, const char *sponsor, const char *revision, const char *filename, int do_allocate)); extern const char *_nl_expand_alias PARAMS ((const char *name)); extern int _nl_explode_name PARAMS ((char *name, const char **language, const char **modifier, const char **territory, const char **codeset, const char **normalized_codeset, const char **special, const char **sponsor, const char **revision)); baycomusb-0.10.orig/intl/bindtextdom.c0100644000175100017510000001232307325134422016046 0ustar abaaba/* Implementation of the bindtextdomain(3) function Copyright (C) 1995, 1996, 1997, 1998 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. */ #ifdef HAVE_CONFIG_H # include #endif #if defined STDC_HEADERS || defined _LIBC # include #else # ifdef HAVE_MALLOC_H # include # else void free (); # endif #endif #if defined HAVE_STRING_H || defined _LIBC # include #else # include # ifndef memcpy # define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) # endif #endif #ifdef _LIBC # include #else # include "libgettext.h" #endif #include "gettext.h" #include "gettextP.h" /* @@ end of prolog @@ */ /* Contains the default location of the message catalogs. */ extern const char _nl_default_dirname[]; /* List with bindings of specific domains. */ extern struct binding *_nl_domain_bindings; /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define BINDTEXTDOMAIN __bindtextdomain # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define BINDTEXTDOMAIN bindtextdomain__ #endif /* Specify that the DOMAINNAME message catalog will be found in DIRNAME rather than in the system locale data base. */ char * BINDTEXTDOMAIN (domainname, dirname) const char *domainname; const char *dirname; { struct binding *binding; /* Some sanity checks. */ if (domainname == NULL || domainname[0] == '\0') return NULL; for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It is not in the list. */ binding = NULL; break; } } if (dirname == NULL) /* The current binding has be to returned. */ return binding == NULL ? (char *) _nl_default_dirname : binding->dirname; if (binding != NULL) { /* The domain is already bound. If the new value and the old one are equal we simply do nothing. Otherwise replace the old binding. */ if (strcmp (dirname, binding->dirname) != 0) { char *new_dirname; if (strcmp (dirname, _nl_default_dirname) == 0) new_dirname = (char *) _nl_default_dirname; else { #if defined _LIBC || defined HAVE_STRDUP new_dirname = strdup (dirname); if (new_dirname == NULL) return NULL; #else size_t len = strlen (dirname) + 1; new_dirname = (char *) malloc (len); if (new_dirname == NULL) return NULL; memcpy (new_dirname, dirname, len); #endif } if (binding->dirname != _nl_default_dirname) free (binding->dirname); binding->dirname = new_dirname; } } else { /* We have to create a new binding. */ #if !defined _LIBC && !defined HAVE_STRDUP size_t len; #endif struct binding *new_binding = (struct binding *) malloc (sizeof (*new_binding)); if (new_binding == NULL) return NULL; #if defined _LIBC || defined HAVE_STRDUP new_binding->domainname = strdup (domainname); if (new_binding->domainname == NULL) return NULL; #else len = strlen (domainname) + 1; new_binding->domainname = (char *) malloc (len); if (new_binding->domainname == NULL) return NULL; memcpy (new_binding->domainname, domainname, len); #endif if (strcmp (dirname, _nl_default_dirname) == 0) new_binding->dirname = (char *) _nl_default_dirname; else { #if defined _LIBC || defined HAVE_STRDUP new_binding->dirname = strdup (dirname); if (new_binding->dirname == NULL) return NULL; #else len = strlen (dirname) + 1; new_binding->dirname = (char *) malloc (len); if (new_binding->dirname == NULL) return NULL; memcpy (new_binding->dirname, dirname, len); #endif } /* Now enqueue it. */ if (_nl_domain_bindings == NULL || strcmp (domainname, _nl_domain_bindings->domainname) < 0) { new_binding->next = _nl_domain_bindings; _nl_domain_bindings = new_binding; } else { binding = _nl_domain_bindings; while (binding->next != NULL && strcmp (domainname, binding->next->domainname) > 0) binding = binding->next; new_binding->next = binding->next; binding->next = new_binding; } binding = new_binding; } return binding->dirname; } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__bindtextdomain, bindtextdomain); #endif baycomusb-0.10.orig/intl/dcgettext.c0100644000175100017510000004020007325134422015513 0ustar abaaba/* Implementation of the dcgettext(3) function. Copyright (C) 1995, 1996, 1997, 1998 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. */ #ifdef HAVE_CONFIG_H # include #endif #include #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif #endif #include #ifndef errno extern int errno; #endif #ifndef __set_errno # define __set_errno(val) errno = (val) #endif #if defined STDC_HEADERS || defined _LIBC # include #else char *getenv (); # ifdef HAVE_MALLOC_H # include # else void free (); # endif #endif #if defined HAVE_STRING_H || defined _LIBC # ifndef _GNU_SOURCE # define _GNU_SOURCE 1 # endif # include #else # include #endif #if !HAVE_STRCHR && !defined _LIBC # ifndef strchr # define strchr index # endif #endif #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #include "gettext.h" #include "gettextP.h" #ifdef _LIBC # include #else # include "libgettext.h" #endif #include "hash-string.h" /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # define getcwd __getcwd # ifndef stpcpy # define stpcpy __stpcpy # endif #else # if !defined HAVE_GETCWD char *getwd (); # define getcwd(buf, max) getwd (buf) # else char *getcwd (); # endif # ifndef HAVE_STPCPY static char *stpcpy PARAMS ((char *dest, const char *src)); # endif #endif /* Amount to increase buffer size by in each try. */ #define PATH_INCR 32 /* The following is from pathmax.h. */ /* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define PATH_MAX but might cause redefinition warnings when sys/param.h is later included (as on MORE/BSD 4.3). */ #if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__)) # include #endif #ifndef _POSIX_PATH_MAX # define _POSIX_PATH_MAX 255 #endif #if !defined(PATH_MAX) && defined(_PC_PATH_MAX) # define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) #endif /* Don't include sys/param.h if it already has been. */ #if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN) # include #endif #if !defined(PATH_MAX) && defined(MAXPATHLEN) # define PATH_MAX MAXPATHLEN #endif #ifndef PATH_MAX # define PATH_MAX _POSIX_PATH_MAX #endif /* XPG3 defines the result of `setlocale (category, NULL)' as: ``Directs `setlocale()' to query `category' and return the current setting of `local'.'' However it does not specify the exact format. And even worse: POSIX defines this not at all. So we can use this feature only on selected system (e.g. those using GNU C Library). */ #ifdef _LIBC # define HAVE_LOCALE_NULL #endif /* Name of the default domain used for gettext(3) prior any call to textdomain(3). The default value for this is "messages". */ const char _nl_default_default_domain[] = "messages"; /* Value used as the default domain for gettext(3). */ const char *_nl_current_default_domain = _nl_default_default_domain; /* Contains the default location of the message catalogs. */ const char _nl_default_dirname[] = GNULOCALEDIR; /* List with bindings of specific domains created by bindtextdomain() calls. */ struct binding *_nl_domain_bindings; /* Prototypes for local functions. */ static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file, const char *msgid)) internal_function; static const char *category_to_name PARAMS ((int category)) internal_function; static const char *guess_category_value PARAMS ((int category, const char *categoryname)) internal_function; /* For those loosing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA /* Nothing has to be done. */ # define ADD_BLOCK(list, address) /* nothing */ # define FREE_BLOCKS(list) /* nothing */ #else struct block_list { void *address; struct block_list *next; }; # define ADD_BLOCK(list, addr) \ do { \ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ /* If we cannot get a free block we cannot add the new element to \ the list. */ \ if (newp != NULL) { \ newp->address = (addr); \ newp->next = (list); \ (list) = newp; \ } \ } while (0) # define FREE_BLOCKS(list) \ do { \ while (list != NULL) { \ struct block_list *old = list; \ list = list->next; \ free (old); \ } \ } while (0) # undef alloca # define alloca(size) (malloc (size)) #endif /* have alloca */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCGETTEXT __dcgettext #else # define DCGETTEXT dcgettext__ #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ char * DCGETTEXT (domainname, msgid, category) const char *domainname; const char *msgid; int category; { #ifndef HAVE_ALLOCA struct block_list *block_list = NULL; #endif struct loaded_l10nfile *domain; struct binding *binding; const char *categoryname; const char *categoryvalue; char *dirname, *xdomainname; char *single_locale; char *retval; int saved_errno = errno; /* If no real MSGID is given return NULL. */ if (msgid == NULL) return NULL; /* If DOMAINNAME is NULL, we are interested in the default domain. If CATEGORY is not LC_MESSAGES this might not make much sense but the defintion left this undefined. */ if (domainname == NULL) domainname = _nl_current_default_domain; /* First find matching binding. */ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It is not in the list. */ binding = NULL; break; } } if (binding == NULL) dirname = (char *) _nl_default_dirname; else if (binding->dirname[0] == '/') dirname = binding->dirname; else { /* We have a relative path. Make it absolute now. */ size_t dirname_len = strlen (binding->dirname) + 1; size_t path_max; char *ret; path_max = (unsigned) PATH_MAX; path_max += 2; /* The getcwd docs say to do this. */ dirname = (char *) alloca (path_max + dirname_len); ADD_BLOCK (block_list, dirname); __set_errno (0); while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE) { path_max += PATH_INCR; dirname = (char *) alloca (path_max + dirname_len); ADD_BLOCK (block_list, dirname); __set_errno (0); } if (ret == NULL) { /* We cannot get the current working directory. Don't signal an error but simply return the default string. */ FREE_BLOCKS (block_list); __set_errno (saved_errno); return (char *) msgid; } stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); } /* Now determine the symbolic name of CATEGORY and its value. */ categoryname = category_to_name (category); categoryvalue = guess_category_value (category, categoryname); xdomainname = (char *) alloca (strlen (categoryname) + strlen (domainname) + 5); ADD_BLOCK (block_list, xdomainname); stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), domainname), ".mo"); /* Creating working area. */ single_locale = (char *) alloca (strlen (categoryvalue) + 1); ADD_BLOCK (block_list, single_locale); /* Search for the given string. This is a loop because we perhaps got an ordered list of languages to consider for th translation. */ while (1) { /* Make CATEGORYVALUE point to the next element of the list. */ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') ++categoryvalue; if (categoryvalue[0] == '\0') { /* The whole contents of CATEGORYVALUE has been searched but no valid entry has been found. We solve this situation by implicitly appending a "C" entry, i.e. no translation will take place. */ single_locale[0] = 'C'; single_locale[1] = '\0'; } else { char *cp = single_locale; while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') *cp++ = *categoryvalue++; *cp = '\0'; } /* If the current locale value is C (or POSIX) we don't load a domain. Return the MSGID. */ if (strcmp (single_locale, "C") == 0 || strcmp (single_locale, "POSIX") == 0) { FREE_BLOCKS (block_list); __set_errno (saved_errno); return (char *) msgid; } /* Find structure describing the message catalog matching the DOMAINNAME and CATEGORY. */ domain = _nl_find_domain (dirname, single_locale, xdomainname); if (domain != NULL) { retval = find_msg (domain, msgid); if (retval == NULL) { int cnt; for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) { retval = find_msg (domain->successor[cnt], msgid); if (retval != NULL) break; } } if (retval != NULL) { FREE_BLOCKS (block_list); __set_errno (saved_errno); return retval; } } } /* NOTREACHED */ } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dcgettext, dcgettext); #endif static char * internal_function find_msg (domain_file, msgid) struct loaded_l10nfile *domain_file; const char *msgid; { size_t top, act, bottom; struct loaded_domain *domain; if (domain_file->decided == 0) _nl_load_domain (domain_file); if (domain_file->data == NULL) return NULL; domain = (struct loaded_domain *) domain_file->data; /* Locate the MSGID and its translation. */ if (domain->hash_size > 2 && domain->hash_tab != NULL) { /* Use the hashing table. */ nls_uint32 len = strlen (msgid); nls_uint32 hash_val = hash_string (msgid); nls_uint32 idx = hash_val % domain->hash_size; nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); if (nstr == 0) /* Hash table entry is empty. */ return NULL; if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len && strcmp (msgid, domain->data + W (domain->must_swap, domain->orig_tab[nstr - 1].offset)) == 0) return (char *) domain->data + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); while (1) { if (idx >= domain->hash_size - incr) idx -= domain->hash_size - incr; else idx += incr; nstr = W (domain->must_swap, domain->hash_tab[idx]); if (nstr == 0) /* Hash table entry is empty. */ return NULL; if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len && strcmp (msgid, domain->data + W (domain->must_swap, domain->orig_tab[nstr - 1].offset)) == 0) return (char *) domain->data + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); } /* NOTREACHED */ } /* Now we try the default method: binary search in the sorted array of messages. */ bottom = 0; top = domain->nstrings; while (bottom < top) { int cmp_val; act = (bottom + top) / 2; cmp_val = strcmp (msgid, domain->data + W (domain->must_swap, domain->orig_tab[act].offset)); if (cmp_val < 0) top = act; else if (cmp_val > 0) bottom = act + 1; else break; } /* If an translation is found return this. */ return bottom >= top ? NULL : (char *) domain->data + W (domain->must_swap, domain->trans_tab[act].offset); } /* Return string representation of locale CATEGORY. */ static const char * internal_function category_to_name (category) int category; { const char *retval; switch (category) { #ifdef LC_COLLATE case LC_COLLATE: retval = "LC_COLLATE"; break; #endif #ifdef LC_CTYPE case LC_CTYPE: retval = "LC_CTYPE"; break; #endif #ifdef LC_MONETARY case LC_MONETARY: retval = "LC_MONETARY"; break; #endif #ifdef LC_NUMERIC case LC_NUMERIC: retval = "LC_NUMERIC"; break; #endif #ifdef LC_TIME case LC_TIME: retval = "LC_TIME"; break; #endif #ifdef LC_MESSAGES case LC_MESSAGES: retval = "LC_MESSAGES"; break; #endif #ifdef LC_RESPONSE case LC_RESPONSE: retval = "LC_RESPONSE"; break; #endif #ifdef LC_ALL case LC_ALL: /* This might not make sense but is perhaps better than any other value. */ retval = "LC_ALL"; break; #endif default: /* If you have a better idea for a default value let me know. */ retval = "LC_XXX"; } return retval; } /* Guess value of current locale from value of the environment variables. */ static const char * internal_function guess_category_value (category, categoryname) int category; const char *categoryname; { const char *retval; /* The highest priority value is the `LANGUAGE' environment variable. This is a GNU extension. */ retval = getenv ("LANGUAGE"); if (retval != NULL && retval[0] != '\0') return retval; /* `LANGUAGE' is not set. So we have to proceed with the POSIX methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some systems this can be done by the `setlocale' function itself. */ #if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL return setlocale (category, NULL); #else /* Setting of LC_ALL overwrites all other. */ retval = getenv ("LC_ALL"); if (retval != NULL && retval[0] != '\0') return retval; /* Next comes the name of the desired category. */ retval = getenv (categoryname); if (retval != NULL && retval[0] != '\0') return retval; /* Last possibility is the LANG environment variable. */ retval = getenv ("LANG"); if (retval != NULL && retval[0] != '\0') return retval; /* We use C as the default domain. POSIX says this is implementation defined. */ return "C"; #endif } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (dest, src) char *dest; const char *src; { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif #ifdef _LIBC /* If we want to free all resources we have to do some work at program's end. */ static void __attribute__ ((unused)) free_mem (void) { struct binding *runp; for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next) { free (runp->domainname); if (runp->dirname != _nl_default_dirname) /* Yes, this is a pointer comparison. */ free (runp->dirname); } if (_nl_current_default_domain != _nl_default_default_domain) /* Yes, again a pointer comparison. */ free ((char *) _nl_current_default_domain); } text_set_element (__libc_subfreeres, free_mem); #endif baycomusb-0.10.orig/intl/dgettext.c0100644000175100017510000000337207325134422015361 0ustar abaaba/* Implementation of the dgettext(3) function Copyright (C) 1995, 1996, 1997 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. */ #ifdef HAVE_CONFIG_H # include #endif #if defined HAVE_LOCALE_H || defined _LIBC # include #endif #ifdef _LIBC # include #else # include "libgettext.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DGETTEXT __dgettext # define DCGETTEXT __dcgettext #else # define DGETTEXT dgettext__ # define DCGETTEXT dcgettext__ #endif /* Look up MSGID in the DOMAINNAME message catalog of the current LC_MESSAGES locale. */ char * DGETTEXT (domainname, msgid) const char *domainname; const char *msgid; { return DCGETTEXT (domainname, msgid, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dgettext, dgettext); #endif baycomusb-0.10.orig/intl/gettext.c0100644000175100017510000000362307325134422015214 0ustar abaaba/* Implementation of gettext(3) function. Copyright (C) 1995, 1997 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. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # define __need_NULL # include #else # ifdef STDC_HEADERS # include /* Just for NULL. */ # else # ifdef HAVE_STRING_H # include # else # define NULL ((void *) 0) # endif # endif #endif #ifdef _LIBC # include #else # include "libgettext.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define GETTEXT __gettext # define DGETTEXT __dgettext #else # define GETTEXT gettext__ # define DGETTEXT dgettext__ #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ char * GETTEXT (msgid) const char *msgid; { return DGETTEXT (NULL, msgid); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__gettext, gettext); #endif baycomusb-0.10.orig/intl/finddomain.c0100644000175100017510000001333407325134422015640 0ustar abaaba/* Handle list of needed message catalogs Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. 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. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #if defined STDC_HEADERS || defined _LIBC # include #else # ifdef HAVE_MALLOC_H # include # else void free (); # endif #endif #if defined HAVE_STRING_H || defined _LIBC # include #else # include # ifndef memcpy # define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) # endif #endif #if !HAVE_STRCHR && !defined _LIBC # ifndef strchr # define strchr index # endif #endif #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #include "gettext.h" #include "gettextP.h" #ifdef _LIBC # include #else # include "libgettext.h" #endif /* @@ end of prolog @@ */ /* List of already loaded domains. */ static struct loaded_l10nfile *_nl_loaded_domains; /* Return a data structure describing the message catalog described by the DOMAINNAME and CATEGORY parameters with respect to the currently established bindings. */ struct loaded_l10nfile * internal_function _nl_find_domain (dirname, locale, domainname) const char *dirname; char *locale; const char *domainname; { struct loaded_l10nfile *retval; const char *language; const char *modifier; const char *territory; const char *codeset; const char *normalized_codeset; const char *special; const char *sponsor; const char *revision; const char *alias_value; int mask; /* LOCALE can consist of up to four recognized parts for the XPG syntax: language[_territory[.codeset]][@modifier] and six parts for the CEN syntax: language[_territory][+audience][+special][,[sponsor][_revision]] Beside the first part all of them are allowed to be missing. If the full specified locale is not found, the less specific one are looked for. The various parts will be stripped off according to the following order: (1) revision (2) sponsor (3) special (4) codeset (5) normalized codeset (6) territory (7) audience/modifier */ /* If we have already tested for this locale entry there has to be one data set in the list of loaded domains. */ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, strlen (dirname) + 1, 0, locale, NULL, NULL, NULL, NULL, NULL, NULL, NULL, domainname, 0); if (retval != NULL) { /* We know something about this locale. */ int cnt; if (retval->decided == 0) _nl_load_domain (retval); if (retval->data != NULL) return retval; for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) { if (retval->successor[cnt]->decided == 0) _nl_load_domain (retval->successor[cnt]); if (retval->successor[cnt]->data != NULL) break; } return cnt >= 0 ? retval : NULL; /* NOTREACHED */ } /* See whether the locale value is an alias. If yes its value *overwrites* the alias name. No test for the original value is done. */ alias_value = _nl_expand_alias (locale); if (alias_value != NULL) { #if defined _LIBC || defined HAVE_STRDUP locale = strdup (alias_value); if (locale == NULL) return NULL; #else size_t len = strlen (alias_value) + 1; locale = (char *) malloc (len); if (locale == NULL) return NULL; memcpy (locale, alias_value, len); #endif } /* Now we determine the single parts of the locale name. First look for the language. Termination symbols are `_' and `@' if we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ mask = _nl_explode_name (locale, &language, &modifier, &territory, &codeset, &normalized_codeset, &special, &sponsor, &revision); /* Create all possible locale entries which might be interested in generalization. */ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, strlen (dirname) + 1, mask, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, domainname, 1); if (retval == NULL) /* This means we are out of core. */ return NULL; if (retval->decided == 0) _nl_load_domain (retval); if (retval->data == NULL) { int cnt; for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) { if (retval->successor[cnt]->decided == 0) _nl_load_domain (retval->successor[cnt]); if (retval->successor[cnt]->data != NULL) break; } } /* The room for an alias was dynamically allocated. Free it now. */ if (alias_value != NULL) free (locale); return retval; } #ifdef _LIBC static void __attribute__ ((unused)) free_mem (void) { struct loaded_l10nfile *runp = _nl_loaded_domains; while (runp != NULL) { struct loaded_l10nfile *here = runp; if (runp->data != NULL) _nl_unload_domain ((struct loaded_domain *) runp->data); runp = runp->next; free (here); } } text_set_element (__libc_subfreeres, free_mem); #endif baycomusb-0.10.orig/intl/loadmsgcat.c0100644000175100017510000001374507325134422015654 0ustar abaaba/* Load needed message catalogs. Copyright (C) 1995, 1996, 1997, 1998 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. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #if defined STDC_HEADERS || defined _LIBC # include #endif #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC # include #endif #include "gettext.h" #include "gettextP.h" /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ISO C functions. This is required by the standard because some ISO C functions will require linking with this object file and the name space must not be polluted. */ # define open __open # define close __close # define read __read # define mmap __mmap # define munmap __munmap #endif /* We need a sign, whether a new catalog was loaded, which can be associated with all translations. This is important if the translations are cached by one of GCC's features. */ int _nl_msg_cat_cntr = 0; /* Load the message catalogs specified by FILENAME. If it is no valid message catalog do nothing. */ void internal_function _nl_load_domain (domain_file) struct loaded_l10nfile *domain_file; { int fd; size_t size; struct stat st; struct mo_file_header *data = (struct mo_file_header *) -1; #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || defined _LIBC int use_mmap = 0; #endif struct loaded_domain *domain; domain_file->decided = 1; domain_file->data = NULL; /* If the record does not represent a valid locale the FILENAME might be NULL. This can happen when according to the given specification the locale file name is different for XPG and CEN syntax. */ if (domain_file->filename == NULL) return; /* Try to open the addressed file. */ fd = open (domain_file->filename, O_RDONLY); if (fd == -1) return; /* We must know about the size of the file. */ if (fstat (fd, &st) != 0 || (size = (size_t) st.st_size) != st.st_size || size < sizeof (struct mo_file_header)) { /* Something went wrong. */ close (fd); return; } #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || defined _LIBC /* Now we are ready to load the file. If mmap() is available we try this first. If not available or it failed we try to load it. */ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); if (data != (struct mo_file_header *) -1) { /* mmap() call was successful. */ close (fd); use_mmap = 1; } #endif /* If the data is not yet available (i.e. mmap'ed) we try to load it manually. */ if (data == (struct mo_file_header *) -1) { size_t to_read; char *read_ptr; data = (struct mo_file_header *) malloc (size); if (data == NULL) return; to_read = size; read_ptr = (char *) data; do { long int nb = (long int) read (fd, read_ptr, to_read); if (nb == -1) { close (fd); return; } read_ptr += nb; to_read -= nb; } while (to_read > 0); close (fd); } /* Using the magic number we can test whether it really is a message catalog file. */ if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) { /* The magic number is wrong: not a message catalog file. */ #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || defined _LIBC if (use_mmap) munmap ((caddr_t) data, size); else #endif free (data); return; } domain_file->data = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); if (domain_file->data == NULL) return; domain = (struct loaded_domain *) domain_file->data; domain->data = (char *) data; #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || defined _LIBC domain->use_mmap = use_mmap; #endif domain->mmap_size = size; domain->must_swap = data->magic != _MAGIC; /* Fill in the information about the available tables. */ switch (W (domain->must_swap, data->revision)) { case 0: domain->nstrings = W (domain->must_swap, data->nstrings); domain->orig_tab = (struct string_desc *) ((char *) data + W (domain->must_swap, data->orig_tab_offset)); domain->trans_tab = (struct string_desc *) ((char *) data + W (domain->must_swap, data->trans_tab_offset)); domain->hash_size = W (domain->must_swap, data->hash_tab_size); domain->hash_tab = (nls_uint32 *) ((char *) data + W (domain->must_swap, data->hash_tab_offset)); break; default: /* This is an illegal revision. */ #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || defined _LIBC if (use_mmap) munmap ((caddr_t) data, size); else #endif free (data); free (domain); domain_file->data = NULL; return; } /* Show that one domain is changed. This might make some cached translations invalid. */ ++_nl_msg_cat_cntr; } #ifdef _LIBC void internal_function _nl_unload_domain (domain) struct loaded_domain *domain; { if (domain->use_mmap) munmap ((caddr_t) domain->data, domain->mmap_size); else free ((void *) domain->data); free (domain); } #endif baycomusb-0.10.orig/intl/localealias.c0100644000175100017510000002355407325134422016006 0ustar abaaba/* Handle aliases for locale names. Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. 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. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif #endif #if defined STDC_HEADERS || defined _LIBC # include #else char *getenv (); # ifdef HAVE_MALLOC_H # include # else void free (); # endif #endif #if defined HAVE_STRING_H || defined _LIBC # ifndef _GNU_SOURCE # define _GNU_SOURCE 1 # endif # include #else # include # ifndef memcpy # define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) # endif #endif #if !HAVE_STRCHR && !defined _LIBC # ifndef strchr # define strchr index # endif #endif #include "gettext.h" #include "gettextP.h" /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # define strcasecmp __strcasecmp # define mempcpy __mempcpy # define HAVE_MEMPCPY 1 /* We need locking here since we can be called from different places. */ # include __libc_lock_define_initialized (static, lock); #endif /* For those loosing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA /* Nothing has to be done. */ # define ADD_BLOCK(list, address) /* nothing */ # define FREE_BLOCKS(list) /* nothing */ #else struct block_list { void *address; struct block_list *next; }; # define ADD_BLOCK(list, addr) \ do { \ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ /* If we cannot get a free block we cannot add the new element to \ the list. */ \ if (newp != NULL) { \ newp->address = (addr); \ newp->next = (list); \ (list) = newp; \ } \ } while (0) # define FREE_BLOCKS(list) \ do { \ while (list != NULL) { \ struct block_list *old = list; \ list = list->next; \ free (old); \ } \ } while (0) # undef alloca # define alloca(size) (malloc (size)) #endif /* have alloca */ struct alias_map { const char *alias; const char *value; }; static char *string_space = NULL; static size_t string_space_act = 0; static size_t string_space_max = 0; static struct alias_map *map; static size_t nmap = 0; static size_t maxmap = 0; /* Prototypes for local functions. */ static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) internal_function; static void extend_alias_table PARAMS ((void)); static int alias_compare PARAMS ((const struct alias_map *map1, const struct alias_map *map2)); const char * _nl_expand_alias (name) const char *name; { static const char *locale_alias_path = LOCALE_ALIAS_PATH; struct alias_map *retval; const char *result = NULL; size_t added; #ifdef _LIBC __libc_lock_lock (lock); #endif do { struct alias_map item; item.alias = name; if (nmap > 0) retval = (struct alias_map *) bsearch (&item, map, nmap, sizeof (struct alias_map), (int (*) PARAMS ((const void *, const void *)) ) alias_compare); else retval = NULL; /* We really found an alias. Return the value. */ if (retval != NULL) { result = retval->value; break; } /* Perhaps we can find another alias file. */ added = 0; while (added == 0 && locale_alias_path[0] != '\0') { const char *start; while (locale_alias_path[0] == ':') ++locale_alias_path; start = locale_alias_path; while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':') ++locale_alias_path; if (start < locale_alias_path) added = read_alias_file (start, locale_alias_path - start); } } while (added != 0); #ifdef _LIBC __libc_lock_unlock (lock); #endif return result; } static size_t internal_function read_alias_file (fname, fname_len) const char *fname; int fname_len; { #ifndef HAVE_ALLOCA struct block_list *block_list = NULL; #endif FILE *fp; char *full_fname; size_t added; static const char aliasfile[] = "/locale.alias"; full_fname = (char *) alloca (fname_len + sizeof aliasfile); ADD_BLOCK (block_list, full_fname); #ifdef HAVE_MEMPCPY mempcpy (mempcpy (full_fname, fname, fname_len), aliasfile, sizeof aliasfile); #else memcpy (full_fname, fname, fname_len); memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); #endif fp = fopen (full_fname, "r"); if (fp == NULL) { FREE_BLOCKS (block_list); return 0; } added = 0; while (!feof (fp)) { /* It is a reasonable approach to use a fix buffer here because a) we are only interested in the first two fields b) these fields must be usable as file names and so must not be that long */ unsigned char buf[BUFSIZ]; unsigned char *alias; unsigned char *value; unsigned char *cp; if (fgets (buf, sizeof buf, fp) == NULL) /* EOF reached. */ break; /* Possibly not the whole line fits into the buffer. Ignore the rest of the line. */ if (strchr (buf, '\n') == NULL) { char altbuf[BUFSIZ]; do if (fgets (altbuf, sizeof altbuf, fp) == NULL) /* Make sure the inner loop will be left. The outer loop will exit at the `feof' test. */ break; while (strchr (altbuf, '\n') == NULL); } cp = buf; /* Ignore leading white space. */ while (isspace (cp[0])) ++cp; /* A leading '#' signals a comment line. */ if (cp[0] != '\0' && cp[0] != '#') { alias = cp++; while (cp[0] != '\0' && !isspace (cp[0])) ++cp; /* Terminate alias name. */ if (cp[0] != '\0') *cp++ = '\0'; /* Now look for the beginning of the value. */ while (isspace (cp[0])) ++cp; if (cp[0] != '\0') { size_t alias_len; size_t value_len; value = cp++; while (cp[0] != '\0' && !isspace (cp[0])) ++cp; /* Terminate value. */ if (cp[0] == '\n') { /* This has to be done to make the following test for the end of line possible. We are looking for the terminating '\n' which do not overwrite here. */ *cp++ = '\0'; *cp = '\n'; } else if (cp[0] != '\0') *cp++ = '\0'; if (nmap >= maxmap) extend_alias_table (); alias_len = strlen (alias) + 1; value_len = strlen (value) + 1; if (string_space_act + alias_len + value_len > string_space_max) { /* Increase size of memory pool. */ size_t new_size = (string_space_max + (alias_len + value_len > 1024 ? alias_len + value_len : 1024)); char *new_pool = (char *) realloc (string_space, new_size); if (new_pool == NULL) { FREE_BLOCKS (block_list); return added; } string_space = new_pool; string_space_max = new_size; } map[nmap].alias = memcpy (&string_space[string_space_act], alias, alias_len); string_space_act += alias_len; map[nmap].value = memcpy (&string_space[string_space_act], value, value_len); string_space_act += value_len; ++nmap; ++added; } } } /* Should we test for ferror()? I think we have to silently ignore errors. --drepper */ fclose (fp); if (added > 0) qsort (map, nmap, sizeof (struct alias_map), (int (*) PARAMS ((const void *, const void *))) alias_compare); FREE_BLOCKS (block_list); return added; } static void extend_alias_table () { size_t new_size; struct alias_map *new_map; new_size = maxmap == 0 ? 100 : 2 * maxmap; new_map = (struct alias_map *) realloc (map, (new_size * sizeof (struct alias_map))); if (new_map == NULL) /* Simply don't extend: we don't have any more core. */ return; map = new_map; maxmap = new_size; } #ifdef _LIBC static void __attribute__ ((unused)) free_mem (void) { if (string_space != NULL) free (string_space); if (map != NULL) free (map); } text_set_element (__libc_subfreeres, free_mem); #endif static int alias_compare (map1, map2) const struct alias_map *map1; const struct alias_map *map2; { #if defined _LIBC || defined HAVE_STRCASECMP return strcasecmp (map1->alias, map2->alias); #else const unsigned char *p1 = (const unsigned char *) map1->alias; const unsigned char *p2 = (const unsigned char *) map2->alias; unsigned char c1, c2; if (p1 == p2) return 0; do { /* I know this seems to be odd but the tolower() function in some systems libc cannot handle nonalpha characters. */ c1 = isupper (*p1) ? tolower (*p1) : *p1; c2 = isupper (*p2) ? tolower (*p2) : *p2; if (c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); return c1 - c2; #endif } baycomusb-0.10.orig/intl/textdomain.c0100644000175100017510000000630107325134422015700 0ustar abaaba/* Implementation of the textdomain(3) function. Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. 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. */ #ifdef HAVE_CONFIG_H # include #endif #if defined STDC_HEADERS || defined _LIBC # include #endif #if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC # include #else # include # ifndef memcpy # define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) # endif #endif #ifdef _LIBC # include #else # include "libgettext.h" #endif /* @@ end of prolog @@ */ /* Name of the default text domain. */ extern const char _nl_default_default_domain[]; /* Default text domain in which entries for gettext(3) are to be found. */ extern const char *_nl_current_default_domain; /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define TEXTDOMAIN __textdomain # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define TEXTDOMAIN textdomain__ #endif /* Set the current default message catalog to DOMAINNAME. If DOMAINNAME is null, return the current default. If DOMAINNAME is "", reset to the default of "messages". */ char * TEXTDOMAIN (domainname) const char *domainname; { char *old; /* A NULL pointer requests the current setting. */ if (domainname == NULL) return (char *) _nl_current_default_domain; old = (char *) _nl_current_default_domain; /* If domain name is the null string set to default domain "messages". */ if (domainname[0] == '\0' || strcmp (domainname, _nl_default_default_domain) == 0) _nl_current_default_domain = _nl_default_default_domain; else { /* If the following malloc fails `_nl_current_default_domain' will be NULL. This value will be returned and so signals we are out of core. */ #if defined _LIBC || defined HAVE_STRDUP _nl_current_default_domain = strdup (domainname); #else size_t len = strlen (domainname) + 1; char *cp = (char *) malloc (len); if (cp != NULL) memcpy (cp, domainname, len); _nl_current_default_domain = cp; #endif } if (old != _nl_default_default_domain) free (old); return (char *) _nl_current_default_domain; } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__textdomain, textdomain); #endif baycomusb-0.10.orig/intl/l10nflist.c0100644000175100017510000002424407325134422015346 0ustar abaaba/* Handle list of needed message catalogs Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Contributed by Ulrich Drepper , 1995. 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. */ #ifdef HAVE_CONFIG_H # include #endif #if defined HAVE_STRING_H || defined _LIBC # ifndef _GNU_SOURCE # define _GNU_SOURCE 1 # endif # include #else # include # ifndef memcpy # define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) # endif #endif #if !HAVE_STRCHR && !defined _LIBC # ifndef strchr # define strchr index # endif #endif #if defined _LIBC || defined HAVE_ARGZ_H # include #endif #include #include #if defined STDC_HEADERS || defined _LIBC # include #endif #include "loadinfo.h" /* On some strange systems still no definition of NULL is found. Sigh! */ #ifndef NULL # if defined __STDC__ && __STDC__ # define NULL ((void *) 0) # else # define NULL 0 # endif #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # ifndef stpcpy # define stpcpy(dest, src) __stpcpy(dest, src) # endif #else # ifndef HAVE_STPCPY static char *stpcpy PARAMS ((char *dest, const char *src)); # endif #endif /* Define function which are usually not available. */ #if !defined _LIBC && !defined HAVE___ARGZ_COUNT /* Returns the number of strings in ARGZ. */ static size_t argz_count__ PARAMS ((const char *argz, size_t len)); static size_t argz_count__ (argz, len) const char *argz; size_t len; { size_t count = 0; while (len > 0) { size_t part_len = strlen (argz); argz += part_len + 1; len -= part_len + 1; count++; } return count; } # undef __argz_count # define __argz_count(argz, len) argz_count__ (argz, len) #endif /* !_LIBC && !HAVE___ARGZ_COUNT */ #if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY /* Make '\0' separated arg vector ARGZ printable by converting all the '\0's except the last into the character SEP. */ static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); static void argz_stringify__ (argz, len, sep) char *argz; size_t len; int sep; { while (len > 0) { size_t part_len = strlen (argz); argz += part_len; len -= part_len + 1; if (len > 0) *argz++ = sep; } } # undef __argz_stringify # define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) #endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ #if !defined _LIBC && !defined HAVE___ARGZ_NEXT static char *argz_next__ PARAMS ((char *argz, size_t argz_len, const char *entry)); static char * argz_next__ (argz, argz_len, entry) char *argz; size_t argz_len; const char *entry; { if (entry) { if (entry < argz + argz_len) entry = strchr (entry, '\0') + 1; return entry >= argz + argz_len ? NULL : (char *) entry; } else if (argz_len > 0) return argz; else return 0; } # undef __argz_next # define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) #endif /* !_LIBC && !HAVE___ARGZ_NEXT */ /* Return number of bits set in X. */ static int pop PARAMS ((int x)); static inline int pop (x) int x; { /* We assume that no more than 16 bits are used. */ x = ((x & ~0x5555) >> 1) + (x & 0x5555); x = ((x & ~0x3333) >> 2) + (x & 0x3333); x = ((x >> 4) + x) & 0x0f0f; x = ((x >> 8) + x) & 0xff; return x; } struct loaded_l10nfile * _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, filename, do_allocate) struct loaded_l10nfile **l10nfile_list; const char *dirlist; size_t dirlist_len; int mask; const char *language; const char *territory; const char *codeset; const char *normalized_codeset; const char *modifier; const char *special; const char *sponsor; const char *revision; const char *filename; int do_allocate; { char *abs_filename; struct loaded_l10nfile *last = NULL; struct loaded_l10nfile *retval; char *cp; size_t entries; int cnt; /* Allocate room for the full file name. */ abs_filename = (char *) malloc (dirlist_len + strlen (language) + ((mask & TERRITORY) != 0 ? strlen (territory) + 1 : 0) + ((mask & XPG_CODESET) != 0 ? strlen (codeset) + 1 : 0) + ((mask & XPG_NORM_CODESET) != 0 ? strlen (normalized_codeset) + 1 : 0) + (((mask & XPG_MODIFIER) != 0 || (mask & CEN_AUDIENCE) != 0) ? strlen (modifier) + 1 : 0) + ((mask & CEN_SPECIAL) != 0 ? strlen (special) + 1 : 0) + (((mask & CEN_SPONSOR) != 0 || (mask & CEN_REVISION) != 0) ? (1 + ((mask & CEN_SPONSOR) != 0 ? strlen (sponsor) + 1 : 0) + ((mask & CEN_REVISION) != 0 ? strlen (revision) + 1 : 0)) : 0) + 1 + strlen (filename) + 1); if (abs_filename == NULL) return NULL; retval = NULL; last = NULL; /* Construct file name. */ memcpy (abs_filename, dirlist, dirlist_len); __argz_stringify (abs_filename, dirlist_len, ':'); cp = abs_filename + (dirlist_len - 1); *cp++ = '/'; cp = stpcpy (cp, language); if ((mask & TERRITORY) != 0) { *cp++ = '_'; cp = stpcpy (cp, territory); } if ((mask & XPG_CODESET) != 0) { *cp++ = '.'; cp = stpcpy (cp, codeset); } if ((mask & XPG_NORM_CODESET) != 0) { *cp++ = '.'; cp = stpcpy (cp, normalized_codeset); } if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) { /* This component can be part of both syntaces but has different leading characters. For CEN we use `+', else `@'. */ *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; cp = stpcpy (cp, modifier); } if ((mask & CEN_SPECIAL) != 0) { *cp++ = '+'; cp = stpcpy (cp, special); } if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) { *cp++ = ','; if ((mask & CEN_SPONSOR) != 0) cp = stpcpy (cp, sponsor); if ((mask & CEN_REVISION) != 0) { *cp++ = '_'; cp = stpcpy (cp, revision); } } *cp++ = '/'; stpcpy (cp, filename); /* Look in list of already loaded domains whether it is already available. */ last = NULL; for (retval = *l10nfile_list; retval != NULL; retval = retval->next) if (retval->filename != NULL) { int compare = strcmp (retval->filename, abs_filename); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It's not in the list. */ retval = NULL; break; } last = retval; } if (retval != NULL || do_allocate == 0) { free (abs_filename); return retval; } retval = (struct loaded_l10nfile *) malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) * (1 << pop (mask)) * sizeof (struct loaded_l10nfile *))); if (retval == NULL) return NULL; retval->filename = abs_filename; retval->decided = (__argz_count (dirlist, dirlist_len) != 1 || ((mask & XPG_CODESET) != 0 && (mask & XPG_NORM_CODESET) != 0)); retval->data = NULL; if (last == NULL) { retval->next = *l10nfile_list; *l10nfile_list = retval; } else { retval->next = last->next; last->next = retval; } entries = 0; /* If the DIRLIST is a real list the RETVAL entry corresponds not to a real file. So we have to use the DIRLIST separation mechanism of the inner loop. */ cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask; for (; cnt >= 0; --cnt) if ((cnt & ~mask) == 0 && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) { /* Iterate over all elements of the DIRLIST. */ char *dir = NULL; while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) != NULL) retval->successor[entries++] = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, filename, 1); } retval->successor[entries] = NULL; return retval; } /* Normalize codeset name. There is no standard for the codeset names. Normalization allows the user to use any of the common names. */ const char * _nl_normalize_codeset (codeset, name_len) const unsigned char *codeset; size_t name_len; { int len = 0; int only_digit = 1; char *retval; char *wp; size_t cnt; for (cnt = 0; cnt < name_len; ++cnt) if (isalnum (codeset[cnt])) { ++len; if (isalpha (codeset[cnt])) only_digit = 0; } retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); if (retval != NULL) { if (only_digit) wp = stpcpy (retval, "iso"); else wp = retval; for (cnt = 0; cnt < name_len; ++cnt) if (isalpha (codeset[cnt])) *wp++ = tolower (codeset[cnt]); else if (isdigit (codeset[cnt])) *wp++ = codeset[cnt]; *wp = '\0'; } return (const char *) retval; } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (dest, src) char *dest; const char *src; { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif baycomusb-0.10.orig/intl/explodename.c0100644000175100017510000001101007325134422016016 0ustar abaaba/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Contributed by Ulrich Drepper , 1995. 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. */ #ifdef HAVE_CONFIG_H # include #endif #if defined STDC_HEADERS || defined _LIBC # include #endif #if defined HAVE_STRING_H || defined _LIBC # include #else # include #endif #include #include "loadinfo.h" /* On some strange systems still no definition of NULL is found. Sigh! */ #ifndef NULL # if defined __STDC__ && __STDC__ # define NULL ((void *) 0) # else # define NULL 0 # endif #endif /* @@ end of prolog @@ */ int _nl_explode_name (name, language, modifier, territory, codeset, normalized_codeset, special, sponsor, revision) char *name; const char **language; const char **modifier; const char **territory; const char **codeset; const char **normalized_codeset; const char **special; const char **sponsor; const char **revision; { enum { undecided, xpg, cen } syntax; char *cp; int mask; *modifier = NULL; *territory = NULL; *codeset = NULL; *normalized_codeset = NULL; *special = NULL; *sponsor = NULL; *revision = NULL; /* Now we determine the single parts of the locale name. First look for the language. Termination symbols are `_' and `@' if we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ mask = 0; syntax = undecided; *language = cp = name; while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@' && cp[0] != '+' && cp[0] != ',') ++cp; if (*language == cp) /* This does not make sense: language has to be specified. Use this entry as it is without exploding. Perhaps it is an alias. */ cp = strchr (*language, '\0'); else if (cp[0] == '_') { /* Next is the territory. */ cp[0] = '\0'; *territory = ++cp; while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= TERRITORY; if (cp[0] == '.') { /* Next is the codeset. */ syntax = xpg; cp[0] = '\0'; *codeset = ++cp; while (cp[0] != '\0' && cp[0] != '@') ++cp; mask |= XPG_CODESET; if (*codeset != cp && (*codeset)[0] != '\0') { *normalized_codeset = _nl_normalize_codeset (*codeset, cp - *codeset); if (strcmp (*codeset, *normalized_codeset) == 0) free ((char *) *normalized_codeset); else mask |= XPG_NORM_CODESET; } } } if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) { /* Next is the modifier. */ syntax = cp[0] == '@' ? xpg : cen; cp[0] = '\0'; *modifier = ++cp; while (syntax == cen && cp[0] != '\0' && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= XPG_MODIFIER | CEN_AUDIENCE; } if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) { syntax = cen; if (cp[0] == '+') { /* Next is special application (CEN syntax). */ cp[0] = '\0'; *special = ++cp; while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= CEN_SPECIAL; } if (cp[0] == ',') { /* Next is sponsor (CEN syntax). */ cp[0] = '\0'; *sponsor = ++cp; while (cp[0] != '\0' && cp[0] != '_') ++cp; mask |= CEN_SPONSOR; } if (cp[0] == '_') { /* Next is revision (CEN syntax). */ cp[0] = '\0'; *revision = ++cp; mask |= CEN_REVISION; } } /* For CEN syntax values it might be important to have the separator character in the file name, not for XPG syntax. */ if (syntax == xpg) { if (*territory != NULL && (*territory)[0] == '\0') mask &= ~TERRITORY; if (*codeset != NULL && (*codeset)[0] == '\0') mask &= ~XPG_CODESET; if (*modifier != NULL && (*modifier)[0] == '\0') mask &= ~XPG_MODIFIER; } return mask; } baycomusb-0.10.orig/intl/intl-compat.c0100644000175100017510000000315607325134422015760 0ustar abaaba/* intl-compat.c - Stub functions to call gettext functions from GNU gettext Library. Copyright (C) 1995 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. */ #ifdef HAVE_CONFIG_H # include #endif #include "libgettext.h" /* @@ end of prolog @@ */ #undef gettext #undef dgettext #undef dcgettext #undef textdomain #undef bindtextdomain char * bindtextdomain (domainname, dirname) const char *domainname; const char *dirname; { return bindtextdomain__ (domainname, dirname); } char * dcgettext (domainname, msgid, category) const char *domainname; const char *msgid; int category; { return dcgettext__ (domainname, msgid, category); } char * dgettext (domainname, msgid) const char *domainname; const char *msgid; { return dgettext__ (domainname, msgid); } char * gettext (msgid) const char *msgid; { return gettext__ (msgid); } char * textdomain (domainname) const char *domainname; { return textdomain__ (domainname); } baycomusb-0.10.orig/intl/cat-compat.c0100644000175100017510000001474107325134422015563 0ustar abaaba/* Compatibility code for gettext-using-catgets interface. Copyright (C) 1995, 1997 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. */ #ifdef HAVE_CONFIG_H # include #endif #include #ifdef STDC_HEADERS # include # include #else char *getenv (); # ifdef HAVE_MALLOC_H # include # endif #endif #ifdef HAVE_NL_TYPES_H # include #endif #include "libgettext.h" /* @@ end of prolog @@ */ /* XPG3 defines the result of `setlocale (category, NULL)' as: ``Directs `setlocale()' to query `category' and return the current setting of `local'.'' However it does not specify the exact format. And even worse: POSIX defines this not at all. So we can use this feature only on selected system (e.g. those using GNU C Library). */ #ifdef _LIBC # define HAVE_LOCALE_NULL #endif /* The catalog descriptor. */ static nl_catd catalog = (nl_catd) -1; /* Name of the default catalog. */ static const char default_catalog_name[] = "messages"; /* Name of currently used catalog. */ static const char *catalog_name = default_catalog_name; /* Get ID for given string. If not found return -1. */ static int msg_to_cat_id PARAMS ((const char *msg)); /* Substitution for systems lacking this function in their C library. */ #if !_LIBC && !HAVE_STPCPY static char *stpcpy PARAMS ((char *dest, const char *src)); #endif /* Set currently used domain/catalog. */ char * textdomain (domainname) const char *domainname; { nl_catd new_catalog; char *new_name; size_t new_name_len; char *lang; #if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \ && defined HAVE_LOCALE_NULL lang = setlocale (LC_MESSAGES, NULL); #else lang = getenv ("LC_ALL"); if (lang == NULL || lang[0] == '\0') { lang = getenv ("LC_MESSAGES"); if (lang == NULL || lang[0] == '\0') lang = getenv ("LANG"); } #endif if (lang == NULL || lang[0] == '\0') lang = "C"; /* See whether name of currently used domain is asked. */ if (domainname == NULL) return (char *) catalog_name; if (domainname[0] == '\0') domainname = default_catalog_name; /* Compute length of added path element. */ new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang) + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1 + sizeof (".cat"); new_name = (char *) malloc (new_name_len); if (new_name == NULL) return NULL; strcpy (new_name, PACKAGE); new_catalog = catopen (new_name, 0); if (new_catalog == (nl_catd) -1) { /* NLSPATH search didn't work, try absolute path */ sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang, PACKAGE); new_catalog = catopen (new_name, 0); if (new_catalog == (nl_catd) -1) { free (new_name); return (char *) catalog_name; } } /* Close old catalog. */ if (catalog != (nl_catd) -1) catclose (catalog); if (catalog_name != default_catalog_name) free ((char *) catalog_name); catalog = new_catalog; catalog_name = new_name; return (char *) catalog_name; } char * bindtextdomain (domainname, dirname) const char *domainname; const char *dirname; { #if HAVE_SETENV || HAVE_PUTENV char *old_val, *new_val, *cp; size_t new_val_len; /* This does not make much sense here but to be compatible do it. */ if (domainname == NULL) return NULL; /* Compute length of added path element. If we use setenv we don't need the first byts for NLSPATH=, but why complicate the code for this peanuts. */ new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname) + sizeof ("/%L/LC_MESSAGES/%N.cat"); old_val = getenv ("NLSPATH"); if (old_val == NULL || old_val[0] == '\0') { old_val = NULL; new_val_len += 1 + sizeof (LOCALEDIR) - 1 + sizeof ("/%L/LC_MESSAGES/%N.cat"); } else new_val_len += strlen (old_val); new_val = (char *) malloc (new_val_len); if (new_val == NULL) return NULL; # if HAVE_SETENV cp = new_val; # else cp = stpcpy (new_val, "NLSPATH="); # endif cp = stpcpy (cp, dirname); cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:"); if (old_val == NULL) { # if __STDC__ stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat"); # else cp = stpcpy (cp, LOCALEDIR); stpcpy (cp, "/%L/LC_MESSAGES/%N.cat"); # endif } else stpcpy (cp, old_val); # if HAVE_SETENV setenv ("NLSPATH", new_val, 1); free (new_val); # else putenv (new_val); /* Do *not* free the environment entry we just entered. It is used from now on. */ # endif #endif return (char *) domainname; } #undef gettext char * gettext (msg) const char *msg; { int msgid; if (msg == NULL || catalog == (nl_catd) -1) return (char *) msg; /* Get the message from the catalog. We always use set number 1. The message ID is computed by the function `msg_to_cat_id' which works on the table generated by `po-to-tbl'. */ msgid = msg_to_cat_id (msg); if (msgid == -1) return (char *) msg; return catgets (catalog, 1, msgid, (char *) msg); } /* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries for the one equal to msg. If it is found return the ID. In case when the string is not found return -1. */ static int msg_to_cat_id (msg) const char *msg; { int cnt; for (cnt = 0; cnt < _msg_tbl_length; ++cnt) if (strcmp (msg, _msg_tbl[cnt]._msg) == 0) return _msg_tbl[cnt]._msg_number; return -1; } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (dest, src) char *dest; const char *src; { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif baycomusb-0.10.orig/intl/VERSION0100644000175100017510000000005107325134422014424 0ustar abaabaGNU gettext library from gettext-0.10.35 baycomusb-0.10.orig/po/0042755000175100017510000000000007340500000013017 5ustar abaababaycomusb-0.10.orig/po/ChangeLog0100644000175100017510000000000007325134422014570 0ustar abaababaycomusb-0.10.orig/po/Makefile.in.in0100644000175100017510000001530607325134422015507 0ustar abaaba# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # # This file file be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = $(prefix)/@DATADIRNAME@ localedir = $(datadir)/locale gnulocaledir = $(prefix)/share/locale gettextsrcdir = $(prefix)/share/gettext/po subdir = po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ CC = @CC@ GENCAT = @GENCAT@ GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ MSGMERGE = PATH=../src:$$PATH msgmerge DEFS = @DEFS@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ INCLUDES = -I.. -I$(top_srcdir)/intl COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) SOURCES = cat-id-tbl.c POFILES = @POFILES@ GMOFILES = @GMOFILES@ DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) POTFILES = \ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ INSTOBJEXT = @INSTOBJEXT@ .SUFFIXES: .SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat .c.o: $(COMPILE) $< .po.pox: $(MAKE) $(PACKAGE).pot $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && $(GENCAT) $@ $*.msg all: all-@USE_NLS@ all-yes: cat-id-tbl.c $(CATALOGS) all-no: $(srcdir)/$(PACKAGE).pot: $(POTFILES) $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ --add-comments --keyword=_ --keyword=N_ \ --files-from=$(srcdir)/POTFILES.in \ && test ! -f $(PACKAGE).po \ || ( rm -f $(srcdir)/$(PACKAGE).pot \ && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) $(srcdir)/cat-id-tbl.c: stamp-cat-id; @: $(srcdir)/stamp-cat-id: $(PACKAGE).pot rm -f cat-id-tbl.tmp sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ rm cat-id-tbl.tmp; \ else \ echo cat-id-tbl.c changed; \ rm -f $(srcdir)/cat-id-tbl.c; \ mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ fi cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $(datadir); \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \ fi @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ case "$$cat" in \ *.gmo) destdir=$(gnulocaledir);; \ *) destdir=$(localedir);; \ esac; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ dir=$$destdir/$$lang/LC_MESSAGES; \ if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $$dir; \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ fi; \ if test -r $$cat; then \ $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ else \ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ fi; \ if test -r $$cat.m; then \ $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ else \ if test -r $(srcdir)/$$cat.m ; then \ $(INSTALL_DATA) $(srcdir)/$$cat.m \ $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ else \ true; \ fi; \ fi; \ done if test "$(PACKAGE)" = "gettext"; then \ if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $(gettextsrcdir); \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ fi; \ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ $(gettextsrcdir)/Makefile.in.in; \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ done rm -f $(gettextsrcdir)/po-Makefile.in.in check: all cat-id-tbl.o: ../intl/libgettext.h dvi info tags TAGS ID: mostlyclean: rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f $(GMOFILES) distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: update-po $(DISTFILES) dists="$(DISTFILES)"; \ for file in $$dists; do \ ln $(srcdir)/$$file $(distdir) 2> /dev/null \ || cp -p $(srcdir)/$$file $(distdir); \ done update-po: Makefile $(MAKE) $(PACKAGE).pot PATH=`pwd`/../src:$$PATH; \ cd $(srcdir); \ catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ mv $$lang.po $$lang.old.po; \ echo "$$lang:"; \ if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ rm -f $$lang.old.po; \ else \ echo "msgmerge for $$cat failed!"; \ rm -f $$lang.po; \ mv $$lang.old.po $$lang.po; \ fi; \ done POTFILES: POTFILES.in ( if test 'x$(srcdir)' != 'x.'; then \ posrcprefix='$(top_srcdir)/'; \ else \ posrcprefix="../"; \ fi; \ rm -f $@-t $@ \ && (sed -e '/^#/d' -e '/^[ ]*$$/d' \ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ | sed -e '$$s/\\$$//') > $@-t \ && chmod a-w $@-t \ && mv $@-t $@ ) Makefile: Makefile.in.in ../config.status POTFILES cd .. \ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: baycomusb-0.10.orig/po/POTFILES.in0100644000175100017510000000021307326561550014610 0ustar abaaba# List of source files containing translatable strings. trxapp/src/interface.c trxapp/src/main.c trxapp/src/freqdb.c trxapp/src/support.c baycomusb-0.10.orig/po/baycomusb.pot0100644000175100017510000003450307340466437015560 0ustar abaaba# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2001-08-21 16:15+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n" #: trxapp/src/interface.c:94 trxapp/src/interface.c:645 msgid "Baycom USB Transceiver Controller" msgstr "" #: trxapp/src/interface.c:118 msgid "File" msgstr "" #: trxapp/src/interface.c:132 msgid "Frequency List..." msgstr "" #: trxapp/src/interface.c:142 msgid "Modem Configuration..." msgstr "" #: trxapp/src/interface.c:152 msgid "Select Modem..." msgstr "" #: trxapp/src/interface.c:162 msgid "Settings..." msgstr "" #: trxapp/src/interface.c:180 msgid "Quit" msgstr "" #: trxapp/src/interface.c:190 trxapp/src/interface.c:2732 msgid "Audio" msgstr "" #: trxapp/src/interface.c:204 msgid "Speaker Scope" msgstr "" #: trxapp/src/interface.c:211 msgid "Speaker Spectrum" msgstr "" #: trxapp/src/interface.c:218 msgid "Microphone Scope" msgstr "" #: trxapp/src/interface.c:225 msgid "Microphone Spectrum" msgstr "" #: trxapp/src/interface.c:232 msgid "DTMF" msgstr "" #: trxapp/src/interface.c:239 msgid "Signal Levels" msgstr "" #: trxapp/src/interface.c:246 msgid "Expert" msgstr "" #: trxapp/src/interface.c:260 msgid "Terminal" msgstr "" #: trxapp/src/interface.c:266 msgid "Open Terminal Window" msgstr "" #: trxapp/src/interface.c:271 msgid "Channel Window" msgstr "" #: trxapp/src/interface.c:281 msgid "Program Channel Memory" msgstr "" #: trxapp/src/interface.c:291 msgid "Help" msgstr "" #: trxapp/src/interface.c:306 msgid "About" msgstr "" #: trxapp/src/interface.c:330 msgid "QRG" msgstr "" #: trxapp/src/interface.c:355 trxapp/src/interface.c:998 #: trxapp/src/interface.c:1016 trxapp/src/interface.c:1698 #: trxapp/src/interface.c:1840 msgid "TX" msgstr "" #: trxapp/src/interface.c:366 trxapp/src/interface.c:1007 #: trxapp/src/interface.c:1025 trxapp/src/interface.c:1691 #: trxapp/src/interface.c:1829 msgid "RX" msgstr "" #: trxapp/src/interface.c:388 trxapp/src/interface.c:398 #: trxapp/src/interface.c:1570 trxapp/src/interface.c:1581 #: trxapp/src/interface.c:1894 trxapp/src/interface.c:1905 msgid "MHz" msgstr "" #: trxapp/src/interface.c:408 trxapp/src/interface.c:1684 #: trxapp/src/interface.c:1851 msgid "Station Name" msgstr "" #: trxapp/src/interface.c:436 msgid "Status" msgstr "" #: trxapp/src/interface.c:450 trxapp/src/interface.c:466 msgid "PTT" msgstr "" #: trxapp/src/interface.c:458 msgid "1750" msgstr "" #: trxapp/src/interface.c:484 msgid "DCD" msgstr "" #: trxapp/src/interface.c:502 trxapp/src/interface.c:4247 #: trxapp/src/interface.c:4278 msgid "S" msgstr "" #: trxapp/src/interface.c:519 msgid "%v" msgstr "" #: trxapp/src/interface.c:521 msgid "S-Meter History" msgstr "" #: trxapp/src/interface.c:637 msgid "About Baycom USB Transceiver Controller" msgstr "" #: trxapp/src/interface.c:662 msgid "Copyright 2000-2001" msgstr "" #: trxapp/src/interface.c:669 msgid "Thomas Sailer, HB9JNX" msgstr "" #: trxapp/src/interface.c:688 msgid "Ok" msgstr "" #: trxapp/src/interface.c:714 trxapp/src/interface.c:723 msgid "Error" msgstr "" #: trxapp/src/interface.c:744 trxapp/src/interface.c:1608 #: trxapp/src/interface.c:2026 trxapp/src/interface.c:2131 #: trxapp/src/interface.c:3629 trxapp/src/interface.c:4176 msgid "OK" msgstr "" #: trxapp/src/interface.c:769 msgid "T7F Terminal" msgstr "" #: trxapp/src/interface.c:868 msgid "T7F Channel Memory" msgstr "" #: trxapp/src/interface.c:878 trxapp/src/interface.c:1516 msgid "Channel" msgstr "" #: trxapp/src/interface.c:888 trxapp/src/interface.c:2544 #: trxapp/src/interface.c:2556 trxapp/src/interface.c:2565 #: trxapp/src/interface.c:3206 trxapp/src/interface.c:3216 #: trxapp/src/interface.c:3226 trxapp/src/interface.c:3236 #: trxapp/src/interface.c:3246 trxapp/src/interface.c:3256 #: trxapp/src/interface.c:3266 trxapp/src/interface.c:3276 #: trxapp/src/interface.c:3857 msgid "0" msgstr "" #: trxapp/src/interface.c:897 trxapp/src/interface.c:3286 #: trxapp/src/interface.c:3296 trxapp/src/interface.c:3306 #: trxapp/src/interface.c:3316 trxapp/src/interface.c:3326 #: trxapp/src/interface.c:3336 trxapp/src/interface.c:3346 #: trxapp/src/interface.c:3356 trxapp/src/interface.c:3812 msgid "1" msgstr "" #: trxapp/src/interface.c:906 trxapp/src/interface.c:3821 msgid "2" msgstr "" #: trxapp/src/interface.c:915 trxapp/src/interface.c:3830 msgid "3" msgstr "" #: trxapp/src/interface.c:924 trxapp/src/interface.c:3776 msgid "4" msgstr "" #: trxapp/src/interface.c:933 trxapp/src/interface.c:3785 msgid "5" msgstr "" #: trxapp/src/interface.c:942 trxapp/src/interface.c:3794 msgid "6" msgstr "" #: trxapp/src/interface.c:951 trxapp/src/interface.c:3884 msgid "7" msgstr "" #: trxapp/src/interface.c:960 trxapp/src/interface.c:3749 msgid "8" msgstr "" #: trxapp/src/interface.c:969 trxapp/src/interface.c:3758 msgid "9" msgstr "" #: trxapp/src/interface.c:978 msgid "25kHz Raster" msgstr "" #: trxapp/src/interface.c:988 trxapp/src/interface.c:1505 msgid "12.5kHz Raster" msgstr "" #: trxapp/src/interface.c:1034 trxapp/src/interface.c:1044 #: trxapp/src/interface.c:1054 trxapp/src/interface.c:1064 #: trxapp/src/interface.c:1074 trxapp/src/interface.c:1084 #: trxapp/src/interface.c:1094 trxapp/src/interface.c:1104 #: trxapp/src/interface.c:1114 trxapp/src/interface.c:1124 #: trxapp/src/interface.c:1134 trxapp/src/interface.c:1144 #: trxapp/src/interface.c:1154 trxapp/src/interface.c:1164 #: trxapp/src/interface.c:1174 trxapp/src/interface.c:1184 #: trxapp/src/interface.c:1194 trxapp/src/interface.c:1204 #: trxapp/src/interface.c:1214 trxapp/src/interface.c:1224 #: trxapp/src/interface.c:1234 trxapp/src/interface.c:1244 #: trxapp/src/interface.c:1254 trxapp/src/interface.c:1264 #: trxapp/src/interface.c:1274 trxapp/src/interface.c:1284 #: trxapp/src/interface.c:1294 trxapp/src/interface.c:1304 #: trxapp/src/interface.c:1314 trxapp/src/interface.c:1324 #: trxapp/src/interface.c:1334 trxapp/src/interface.c:1344 #: trxapp/src/interface.c:1354 trxapp/src/interface.c:1364 #: trxapp/src/interface.c:1374 trxapp/src/interface.c:1384 #: trxapp/src/interface.c:1394 trxapp/src/interface.c:1404 #: trxapp/src/interface.c:1414 trxapp/src/interface.c:1424 #: trxapp/src/interface.c:1958 trxapp/src/interface.c:1972 msgid "-" msgstr "" #: trxapp/src/interface.c:1466 msgid "Program Channel" msgstr "" #: trxapp/src/interface.c:1527 msgid "RX Frequency" msgstr "" #: trxapp/src/interface.c:1538 msgid "TX Frequency" msgstr "" #: trxapp/src/interface.c:1600 trxapp/src/interface.c:2034 #: trxapp/src/interface.c:2139 trxapp/src/interface.c:3637 #: trxapp/src/interface.c:4184 msgid "Cancel" msgstr "" #: trxapp/src/interface.c:1655 msgid "Frequency List" msgstr "" #: trxapp/src/interface.c:1705 trxapp/src/interface.c:1916 #: trxapp/src/interface.c:2353 msgid "Mode" msgstr "" #: trxapp/src/interface.c:1720 msgid "Set" msgstr "" #: trxapp/src/interface.c:1728 msgid "New" msgstr "" #: trxapp/src/interface.c:1736 msgid "Update" msgstr "" #: trxapp/src/interface.c:1744 msgid "Delete" msgstr "" #: trxapp/src/interface.c:1811 msgid "New Station" msgstr "" #: trxapp/src/interface.c:1927 trxapp/src/interface.c:2375 msgid "Bitrate RX" msgstr "" #: trxapp/src/interface.c:1938 trxapp/src/interface.c:2386 msgid "Bitrate TX" msgstr "" #: trxapp/src/interface.c:1959 trxapp/src/interface.c:2407 #: trxapp/src/interface.c:2419 msgid "fsk" msgstr "" #: trxapp/src/interface.c:1960 trxapp/src/interface.c:2408 msgid "afsk" msgstr "" #: trxapp/src/interface.c:1961 trxapp/src/interface.c:2410 msgid "audio" msgstr "" #: trxapp/src/interface.c:1962 trxapp/src/interface.c:2409 msgid "external" msgstr "" #: trxapp/src/interface.c:1996 trxapp/src/interface.c:2007 msgid "Bit/s" msgstr "" #: trxapp/src/interface.c:2074 msgid "Modem/Transceiver Selection" msgstr "" #: trxapp/src/interface.c:2102 msgid "Manufacturer" msgstr "" #: trxapp/src/interface.c:2109 msgid "Model" msgstr "" #: trxapp/src/interface.c:2116 msgid "Serial Number" msgstr "" #: trxapp/src/interface.c:2329 msgid "Baycom USB Adapter Configuration" msgstr "" #: trxapp/src/interface.c:2364 msgid "FPGA clock" msgstr "" #: trxapp/src/interface.c:2431 msgid "Hz" msgstr "" #: trxapp/src/interface.c:2451 trxapp/src/interface.c:2473 msgid "used only in FSK and EXTERNAL mode" msgstr "" #: trxapp/src/interface.c:2453 trxapp/src/interface.c:2475 msgid "Bits/s" msgstr "" #: trxapp/src/interface.c:2486 msgid "Loopback" msgstr "" #: trxapp/src/interface.c:2497 msgid "PTT Mute" msgstr "" #: trxapp/src/interface.c:2517 msgid "Filter Mode" msgstr "" #: trxapp/src/interface.c:2567 msgid "Adapter" msgstr "" #: trxapp/src/interface.c:2581 msgid "Sample Rate" msgstr "" #: trxapp/src/interface.c:2592 msgid "Gain" msgstr "" #: trxapp/src/interface.c:2603 msgid "Samples/s" msgstr "" #: trxapp/src/interface.c:2623 msgid "used only in AUDIO mode" msgstr "" #: trxapp/src/interface.c:2635 msgid "Speaker Audio Device" msgstr "" #: trxapp/src/interface.c:2646 msgid "Microphone Audio Device" msgstr "" #: trxapp/src/interface.c:2672 trxapp/src/interface.c:2689 msgid "/dev/dsp" msgstr "" #: trxapp/src/interface.c:2710 msgid "RF Squelch Level" msgstr "" #: trxapp/src/interface.c:2721 msgid "Audio Squelch" msgstr "" #: trxapp/src/interface.c:2755 msgid "Full Duplex" msgstr "" #: trxapp/src/interface.c:2766 msgid "P-Persistence" msgstr "" #: trxapp/src/interface.c:2777 msgid "SlotTime" msgstr "" #: trxapp/src/interface.c:2788 msgid "TxTail" msgstr "" #: trxapp/src/interface.c:2799 msgid "TxDelay" msgstr "" #: trxapp/src/interface.c:2810 trxapp/src/interface.c:2820 #: trxapp/src/interface.c:2830 msgid "ms" msgstr "" #: trxapp/src/interface.c:2880 msgid "Channel Access" msgstr "" #: trxapp/src/interface.c:2902 trxapp/src/interface.c:2914 msgid "bcu0" msgstr "" #: trxapp/src/interface.c:2903 msgid "bcu1" msgstr "" #: trxapp/src/interface.c:2904 msgid "bcu2" msgstr "" #: trxapp/src/interface.c:2905 msgid "bcu3" msgstr "" #: trxapp/src/interface.c:2933 msgid "10.0.0.1" msgstr "" #: trxapp/src/interface.c:2943 msgid "255.255.255.0" msgstr "" #: trxapp/src/interface.c:2953 msgid "10.0.0.255" msgstr "" #: trxapp/src/interface.c:2955 msgid "Interface Name" msgstr "" #: trxapp/src/interface.c:2966 msgid "Callsign" msgstr "" #: trxapp/src/interface.c:2977 msgid "IP Address" msgstr "" #: trxapp/src/interface.c:2988 msgid "Netmask" msgstr "" #: trxapp/src/interface.c:2999 msgid "IP Broadcast Address" msgstr "" #: trxapp/src/interface.c:3010 msgid "Gateway AX.25 Path" msgstr "" #: trxapp/src/interface.c:3021 msgid "Gateway IP Address" msgstr "" #: trxapp/src/interface.c:3032 msgid "Gateway Genmask" msgstr "" #: trxapp/src/interface.c:3043 msgid "Gateway IP Mode" msgstr "" #: trxapp/src/interface.c:3090 trxapp/src/interface.c:3102 #: trxapp/src/main.c:1129 msgid "Default" msgstr "" #: trxapp/src/interface.c:3091 trxapp/src/main.c:1127 trxapp/src/main.c:1247 msgid "Virtual Circuit" msgstr "" #: trxapp/src/interface.c:3092 trxapp/src/main.c:1128 trxapp/src/main.c:1249 msgid "Datagram" msgstr "" #: trxapp/src/interface.c:3093 trxapp/src/main.c:1129 trxapp/src/main.c:1251 msgid "Compressed" msgstr "" #: trxapp/src/interface.c:3104 msgid "Interface" msgstr "" #: trxapp/src/interface.c:3118 msgid "Pin 5" msgstr "" #: trxapp/src/interface.c:3129 msgid "Pin 7" msgstr "" #: trxapp/src/interface.c:3140 msgid "Pin 9" msgstr "" #: trxapp/src/interface.c:3151 msgid "Pin 11" msgstr "" #: trxapp/src/interface.c:3162 msgid "Pin 13" msgstr "" #: trxapp/src/interface.c:3173 msgid "Pin 15" msgstr "" #: trxapp/src/interface.c:3184 msgid "Pin 17" msgstr "" #: trxapp/src/interface.c:3195 msgid "Pin 19" msgstr "" #: trxapp/src/interface.c:3366 trxapp/src/interface.c:3377 #: trxapp/src/interface.c:3388 trxapp/src/interface.c:3399 #: trxapp/src/interface.c:3410 trxapp/src/interface.c:3421 #: trxapp/src/interface.c:3432 trxapp/src/interface.c:3443 msgid "Input" msgstr "" #: trxapp/src/interface.c:3454 msgid "RXC" msgstr "" #: trxapp/src/interface.c:3465 msgid "TXC" msgstr "" #: trxapp/src/interface.c:3476 msgid "RXD" msgstr "" #: trxapp/src/interface.c:3487 msgid "TXD" msgstr "" #: trxapp/src/interface.c:3498 msgid "/RTS" msgstr "" #: trxapp/src/interface.c:3509 msgid "/CTS" msgstr "" #: trxapp/src/interface.c:3520 msgid "/DCD" msgstr "" #: trxapp/src/interface.c:3531 msgid "/RES" msgstr "" #: trxapp/src/interface.c:3552 trxapp/src/interface.c:3564 #: trxapp/src/interface.c:3576 trxapp/src/interface.c:3588 #: trxapp/src/interface.c:3600 trxapp/src/interface.c:3612 msgid "Normal" msgstr "" #: trxapp/src/interface.c:3553 trxapp/src/interface.c:3577 #: trxapp/src/interface.c:3601 msgid "TxData" msgstr "" #: trxapp/src/interface.c:3563 trxapp/src/interface.c:3587 #: trxapp/src/interface.c:3611 msgid "selects the output signal if the internal FSK mode is used" msgstr "" #: trxapp/src/interface.c:3614 msgid "Modem Disc" msgstr "" #: trxapp/src/interface.c:3691 msgid "DTMF Keypad" msgstr "" #: trxapp/src/interface.c:3701 msgid "Keys transmitted" msgstr "" #: trxapp/src/interface.c:3725 msgid "Clear" msgstr "" #: trxapp/src/interface.c:3733 msgid "Keypad" msgstr "" #: trxapp/src/interface.c:3767 msgid "A" msgstr "" #: trxapp/src/interface.c:3803 msgid "B" msgstr "" #: trxapp/src/interface.c:3839 msgid "C" msgstr "" #: trxapp/src/interface.c:3848 msgid "*" msgstr "" #: trxapp/src/interface.c:3866 msgid "#" msgstr "" #: trxapp/src/interface.c:3875 msgid "D" msgstr "" #: trxapp/src/interface.c:4013 msgid "Baycom USB Speaker Scope" msgstr "" #: trxapp/src/interface.c:4041 msgid "Baycom USB Speaker Spectrum" msgstr "" #: trxapp/src/interface.c:4069 msgid "Baycom USB Microphone Scope" msgstr "" #: trxapp/src/interface.c:4097 msgid "Baycom USB Microphone Spectrum" msgstr "" #: trxapp/src/interface.c:4131 msgid "Baycom USB Adapter Parameters" msgstr "" #: trxapp/src/interface.c:4157 msgid "Enable PTT for Packet" msgstr "" #: trxapp/src/interface.c:4223 msgid "Baycom USB Audio Power Meters" msgstr "" #: trxapp/src/interface.c:4233 msgid "Mic" msgstr "" #: trxapp/src/interface.c:4264 msgid "Spkr" msgstr "" #: trxapp/src/interface.c:4295 msgid "N" msgstr "" #: trxapp/src/support.c:121 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "" #: trxapp/src/support.c:130 #, c-format msgid "Error loading pixmap file: %s" msgstr "" baycomusb-0.10.orig/po/stamp-cat-id0100644000175100017510000000001207340466437015242 0ustar abaabatimestamp baycomusb-0.10.orig/po/cat-id-tbl.c0100644000175100017510000000753607340454711015132 0ustar abaaba/* Automatically generated by po2tbl.sed from baycomusb.pot. */ #if HAVE_CONFIG_H # include #endif #include "libgettext.h" const struct _msg_ent _msg_tbl[] = { {"", 1}, {"Baycom USB Transceiver Controller", 2}, {"File", 3}, {"Frequency List...", 4}, {"Modem Configuration...", 5}, {"Select Modem...", 6}, {"Settings...", 7}, {"Quit", 8}, {"Audio", 9}, {"Speaker Scope", 10}, {"Speaker Spectrum", 11}, {"Microphone Scope", 12}, {"Microphone Spectrum", 13}, {"DTMF", 14}, {"Signal Levels", 15}, {"Expert", 16}, {"Terminal", 17}, {"Open Terminal Window", 18}, {"Channel Window", 19}, {"Program Channel Memory", 20}, {"Help", 21}, {"About", 22}, {"QRG", 23}, {"TX", 24}, {"RX", 25}, {"MHz", 26}, {"Station Name", 27}, {"Status", 28}, {"PTT", 29}, {"1750", 30}, {"DCD", 31}, {"S", 32}, {"%v", 33}, {"S-Meter History", 34}, {"About Baycom USB Transceiver Controller", 35}, {"Copyright 2000-2001", 36}, {"Thomas Sailer, HB9JNX", 37}, {"Ok", 38}, {"Error", 39}, {"OK", 40}, {"T7F Terminal", 41}, {"T7F Channel Memory", 42}, {"Channel", 43}, {"0", 44}, {"1", 45}, {"2", 46}, {"3", 47}, {"4", 48}, {"5", 49}, {"6", 50}, {"7", 51}, {"8", 52}, {"9", 53}, {"25kHz Raster", 54}, {"12.5kHz Raster", 55}, {"-", 56}, {"Program Channel", 57}, {"RX Frequency", 58}, {"TX Frequency", 59}, {"Cancel", 60}, {"Frequency List", 61}, {"Mode", 62}, {"Set", 63}, {"New", 64}, {"Update", 65}, {"Delete", 66}, {"New Station", 67}, {"Bitrate RX", 68}, {"Bitrate TX", 69}, {"fsk", 70}, {"afsk", 71}, {"audio", 72}, {"external", 73}, {"Bit/s", 74}, {"Modem/Transceiver Selection", 75}, {"Manufacturer", 76}, {"Model", 77}, {"Serial Number", 78}, {"Baycom USB Adapter Configuration", 79}, {"FPGA clock", 80}, {"Hz", 81}, {"used only in FSK and EXTERNAL mode", 82}, {"Bits/s", 83}, {"Loopback", 84}, {"PTT Mute", 85}, {"Filter Mode", 86}, {"Adapter", 87}, {"Sample Rate", 88}, {"Gain", 89}, {"Samples/s", 90}, {"used only in AUDIO mode", 91}, {"Speaker Audio Device", 92}, {"Microphone Audio Device", 93}, {"/dev/dsp", 94}, {"RF Squelch Level", 95}, {"Audio Squelch", 96}, {"Full Duplex", 97}, {"P-Persistence", 98}, {"SlotTime", 99}, {"TxTail", 100}, {"TxDelay", 101}, {"ms", 102}, {"Channel Access", 103}, {"bcu0", 104}, {"bcu1", 105}, {"bcu2", 106}, {"bcu3", 107}, {"10.0.0.1", 108}, {"255.255.255.0", 109}, {"10.0.0.255", 110}, {"Interface Name", 111}, {"Callsign", 112}, {"IP Address", 113}, {"Netmask", 114}, {"IP Broadcast Address", 115}, {"Gateway AX.25 Path", 116}, {"Gateway IP Address", 117}, {"Gateway Genmask", 118}, {"Gateway IP Mode", 119}, {"Default", 120}, {"Virtual Circuit", 121}, {"Datagram", 122}, {"Compressed", 123}, {"Interface", 124}, {"Pin 5", 125}, {"Pin 7", 126}, {"Pin 9", 127}, {"Pin 11", 128}, {"Pin 13", 129}, {"Pin 15", 130}, {"Pin 17", 131}, {"Pin 19", 132}, {"Input", 133}, {"RXC", 134}, {"TXC", 135}, {"RXD", 136}, {"TXD", 137}, {"/RTS", 138}, {"/CTS", 139}, {"/DCD", 140}, {"/RES", 141}, {"Normal", 142}, {"TxData", 143}, {"selects the output signal if the internal FSK mode is used", 144}, {"Modem Disc", 145}, {"DTMF Keypad", 146}, {"Keys transmitted", 147}, {"Clear", 148}, {"Keypad", 149}, {"A", 150}, {"B", 151}, {"C", 152}, {"*", 153}, {"#", 154}, {"D", 155}, {"Baycom USB Speaker Scope", 156}, {"Baycom USB Speaker Spectrum", 157}, {"Baycom USB Microphone Scope", 158}, {"Baycom USB Microphone Spectrum", 159}, {"Baycom USB Adapter Parameters", 160}, {"Enable PTT for Packet", 161}, {"Baycom USB Audio Power Meters", 162}, {"Mic", 163}, {"Spkr", 164}, {"N", 165}, {"Couldn't find pixmap file: %s", 166}, {"Error loading pixmap file: %s", 167}, }; int _msg_tbl_length = 167; baycomusb-0.10.orig/firmware/0042755000175100017510000000000007340500004014221 5ustar abaababaycomusb-0.10.orig/firmware/Makefile.in0100644000175100017510000003160207340500001016260 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ SUBDIRS = afskfirmware audiofirmware audio2firmware bscanfirmware dlfirmware dl2firmware fskfirmware resetfirmware reset2firmware @CROSSCOMP_FALSE@@WIN32_TRUE@CFLAGS := $(CFLAGS) -mcygwin @CROSSCOMP_FALSE@@WIN32_TRUE@LDFLAGS := $(LDFLAGS) -mcygwin @CROSSCOMP_FALSE@noinst_PROGRAMS = ihex2hdr @CROSSCOMP_FALSE@ihex2hdr_SOURCES = ihex2hdr.c noinst_HEADERS = fskfirmware.h afskfirmware.h audiofirmware.h audio2firmware.h bscanfirmware.h dlfirmware.h dl2firmware.h resetfirmware.h reset2firmware.h EXTRA_DIST = ihex2hdr.c mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = @CROSSCOMP_FALSE@noinst_PROGRAMS = ihex2hdr$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LIBS = @LIBS@ @CROSSCOMP_FALSE@ihex2hdr_OBJECTS = ihex2hdr.$(OBJEXT) ihex2hdr_LDADD = $(LDADD) ihex2hdr_DEPENDENCIES = ihex2hdr_LDFLAGS = COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ HEADERS = $(noinst_HEADERS) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(ihex2hdr_SOURCES) OBJECTS = $(ihex2hdr_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps firmware/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstPROGRAMS: clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) distclean-noinstPROGRAMS: maintainer-clean-noinstPROGRAMS: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: ihex2hdr$(EXEEXT): $(ihex2hdr_OBJECTS) $(ihex2hdr_DEPENDENCIES) @rm -f ihex2hdr$(EXEEXT) $(LINK) $(ihex2hdr_LDFLAGS) $(ihex2hdr_OBJECTS) $(ihex2hdr_LDADD) $(LIBS) # 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = firmware 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 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=../$(top_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 $(PROGRAMS) $(HEADERS) 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-noinstPROGRAMS mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-recursive clean-am: clean-noinstPROGRAMS clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-recursive distclean-am: distclean-noinstPROGRAMS distclean-compile distclean-tags \ distclean-generic clean-am distclean: distclean-recursive maintainer-clean-am: maintainer-clean-noinstPROGRAMS \ 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-recursive .PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \ clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile 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 @CROSSCOMP_FALSE@$(top_srcdir)/firmware/afskfirmware.h: $(top_srcdir)/firmware/afskfirmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ afskfirmware @CROSSCOMP_FALSE@$(top_srcdir)/firmware/audiofirmware.h: $(top_srcdir)/firmware/audiofirmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ audiofirmware @CROSSCOMP_FALSE@$(top_srcdir)/firmware/audio2firmware.h: $(top_srcdir)/firmware/audio2firmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ audio2firmware @CROSSCOMP_FALSE@$(top_srcdir)/firmware/bscanfirmware.h: $(top_srcdir)/firmware/bscanfirmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ bscanfirmware @CROSSCOMP_FALSE@$(top_srcdir)/firmware/dlfirmware.h: $(top_srcdir)/firmware/dlfirmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ dlfirmware @CROSSCOMP_FALSE@$(top_srcdir)/firmware/dl2firmware.h: $(top_srcdir)/firmware/dl2firmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ dl2firmware @CROSSCOMP_FALSE@$(top_srcdir)/firmware/fskfirmware.h: $(top_srcdir)/firmware/fskfirmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ fskfirmware @CROSSCOMP_FALSE@$(top_srcdir)/firmware/resetfirmware.h: $(top_srcdir)/firmware/resetfirmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ resetfirmware @CROSSCOMP_FALSE@$(top_srcdir)/firmware/reset2firmware.h: $(top_srcdir)/firmware/reset2firmware/main.ihx ihex2hdr @CROSSCOMP_FALSE@ ./ihex2hdr $< $@ reset2firmware # 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: baycomusb-0.10.orig/firmware/Makefile.am0100644000175100017510000000320007325134422016255 0ustar abaabaSUBDIRS = afskfirmware audiofirmware audio2firmware bscanfirmware dlfirmware dl2firmware fskfirmware resetfirmware reset2firmware if CROSSCOMP else if WIN32 CFLAGS := $(CFLAGS) -mcygwin LDFLAGS := $(LDFLAGS) -mcygwin endif noinst_PROGRAMS = ihex2hdr ihex2hdr_SOURCES = ihex2hdr.c $(top_srcdir)/firmware/afskfirmware.h: $(top_srcdir)/firmware/afskfirmware/main.ihx ihex2hdr ./ihex2hdr $< $@ afskfirmware $(top_srcdir)/firmware/audiofirmware.h: $(top_srcdir)/firmware/audiofirmware/main.ihx ihex2hdr ./ihex2hdr $< $@ audiofirmware $(top_srcdir)/firmware/audio2firmware.h: $(top_srcdir)/firmware/audio2firmware/main.ihx ihex2hdr ./ihex2hdr $< $@ audio2firmware $(top_srcdir)/firmware/bscanfirmware.h: $(top_srcdir)/firmware/bscanfirmware/main.ihx ihex2hdr ./ihex2hdr $< $@ bscanfirmware $(top_srcdir)/firmware/dlfirmware.h: $(top_srcdir)/firmware/dlfirmware/main.ihx ihex2hdr ./ihex2hdr $< $@ dlfirmware $(top_srcdir)/firmware/dl2firmware.h: $(top_srcdir)/firmware/dl2firmware/main.ihx ihex2hdr ./ihex2hdr $< $@ dl2firmware $(top_srcdir)/firmware/fskfirmware.h: $(top_srcdir)/firmware/fskfirmware/main.ihx ihex2hdr ./ihex2hdr $< $@ fskfirmware $(top_srcdir)/firmware/resetfirmware.h: $(top_srcdir)/firmware/resetfirmware/main.ihx ihex2hdr ./ihex2hdr $< $@ resetfirmware $(top_srcdir)/firmware/reset2firmware.h: $(top_srcdir)/firmware/reset2firmware/main.ihx ihex2hdr ./ihex2hdr $< $@ reset2firmware endif noinst_HEADERS = fskfirmware.h afskfirmware.h audiofirmware.h audio2firmware.h bscanfirmware.h \ dlfirmware.h dl2firmware.h resetfirmware.h reset2firmware.h EXTRA_DIST = ihex2hdr.c baycomusb-0.10.orig/firmware/ihex2hdr.c0100644000175100017510000001201207325134422016103 0ustar abaaba/*****************************************************************************/ /* * ihex2hdr.c -- Convert Intel HEX files to C header files. * * Copyright (C) 1999-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * * History: * 0.1 18.06.99 Created * */ /*****************************************************************************/ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include /* --------------------------------------------------------------------- */ static int hexdigit(const char *s) { if (*s >= '0' && *s <= '9') return *s - '0'; if (*s >= 'A' && *s <= 'F') return *s - 'A' + 10; if (*s >= 'a' && *s <= 'f') return *s - 'a' + 10; return -1; } static int hexbyte(const char *s) { int a, b; a = hexdigit(s); b = hexdigit(s+1); if (a == -1 || b == -1) return -1; return (a << 4) | b; } /* --------------------------------------------------------------------- */ int main(int argc, char *argv[]) { FILE *fin, *fout; time_t tm; unsigned char mem[0x2000] = { 0, }; unsigned char buf[640]; unsigned u, s, sz = 0; int i; time(&tm); if (argc < 4) { fprintf(stderr, "usage: ihex2hdr file.ihx file.h fname\n"); exit(1); } if (!(fin = fopen(argv[1], "r"))) { fprintf(stderr, "cannot open file \"%s\" error %s\n", argv[1], strerror(errno)); exit(1); } if (!(fout = fopen(argv[2], "w"))) { fprintf(stderr, "cannot create file \"%s\" error %s\n", argv[2], strerror(errno)); exit(1); } while (fgets(buf, sizeof(buf), fin)) { if (buf[0] != ':') { fprintf(stderr, "invalid intel hex line \"%s\"\n", buf); continue; } for (u = s = 0; u < ((unsigned int)buf[0])+5; u++) { i = hexbyte(buf+1+2*u); if (i == -1) goto nextline; buf[u] = i; s += i; } if ((s & 0xff) != 0) { fprintf(stderr, "checksum error in line length %u address 0x%02X%02X checksum %u\n", buf[0], buf[1], buf[2], s & 0xff); continue; } if (buf[3] != 0) break; if (buf[0] == 0) continue; u = buf[2] | (((unsigned int)buf[1]) << 8); /* address */ if (u + buf[0] > sz) sz = u + buf[0]; if (sz > sizeof(mem)) { fprintf(stderr, "input hex file overflows memory table\n"); exit(1); } memcpy(mem+u, buf+4, buf[0]); nextline: } fclose(fin); strftime(buf, sizeof(buf), "%Y%m%d", localtime(&tm)); fprintf(fout, "/*****************************************************************************/\n" "\n" "/*\n" " * %s -- Anchorchips Firmware.\n" " *\n" " * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch)\n" " *\n" " * This program is free software; you can redistribute it and/or modify\n" " * it under the terms of the GNU General Public License as published by\n" " * the Free Software Foundation; either version 2 of the License, or\n" " * (at your option) any later version.\n" " *\n" " * This program is distributed in the hope that it will be useful,\n" " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" " * GNU General Public License for more details.\n" " *\n" " * You should have received a copy of the GNU General Public License\n" " * along with this program; if not, write to the Free Software\n" " * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n" " *\n" " * Please note that the GPL allows you to use the driver, NOT the radio.\n" " * In order to use the radio, you need a license from the communications\n" " * authority of your country.\n" " *\n" " */\n" "\n" "/*****************************************************************************/\n" "/* automatically generated, do not edit */\n" "\n" "#define %s_DATE \"%s\"\n" "\n" "/* firmware */\n" "static const unsigned char %s[] = {", argv[2], argv[3], buf, argv[3]); for (u = 0; u < sz; u++) { if (!(u & 15)) fprintf(fout, "\n\t"); fprintf(fout, "0x%02x", mem[u]); if (u >= sz-1) break; fprintf(fout, ", "); } fprintf(fout, "\n};\n"); fclose(fout); exit(0); } baycomusb-0.10.orig/firmware/fskfirmware.h0100644000175100017510000006337207340477542016744 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/fskfirmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define fskfirmware_DATE "20010821" /* firmware */ static const unsigned char fskfirmware[] = { 0x02, 0x0e, 0x83, 0x02, 0x03, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0xa1, 0x00, 0x02, 0x09, 0xcf, 0x00, 0x02, 0x09, 0xfa, 0x00, 0x02, 0x0a, 0x25, 0x00, 0x02, 0x0a, 0x50, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x7b, 0x00, 0x02, 0x0a, 0xb6, 0x00, 0x02, 0x0b, 0x77, 0x00, 0x02, 0x0b, 0xa5, 0x00, 0x02, 0x0b, 0xd0, 0x00, 0x02, 0x0b, 0xfb, 0x00, 0x02, 0x0c, 0x26, 0x00, 0x02, 0x0c, 0x51, 0x00, 0x02, 0x0c, 0x7c, 0x00, 0x02, 0x0c, 0xa7, 0x00, 0x02, 0x0c, 0xd2, 0x00, 0x02, 0x0c, 0xfd, 0x00, 0x02, 0x0d, 0x28, 0x00, 0x02, 0x0d, 0x53, 0x00, 0x02, 0x0d, 0x7e, 0x00, 0x02, 0x0d, 0xa9, 0xe5, 0x45, 0x45, 0x50, 0x60, 0x18, 0xa2, 0x08, 0x50, 0x06, 0x90, 0xc0, 0x0d, 0x74, 0xef, 0xf0, 0x92, 0x01, 0xb3, 0x92, 0x00, 0xd2, 0x02, 0xe5, 0x20, 0x90, 0xc0, 0x08, 0xf0, 0x22, 0xc2, 0x00, 0xa2, 0x08, 0x50, 0x06, 0x90, 0xc0, 0x0d, 0x74, 0xff, 0xf0, 0x72, 0x09, 0x92, 0x01, 0xc2, 0x02, 0xe5, 0x20, 0x90, 0xc0, 0x08, 0xf0, 0x22, 0xe5, 0x45, 0x60, 0x06, 0xb4, 0x02, 0x52, 0x02, 0x02, 0x4f, 0xe5, 0x48, 0xb5, 0x49, 0x0c, 0x10, 0x0a, 0x03, 0x02, 0x02, 0xb3, 0x12, 0x01, 0x57, 0x02, 0x02, 0xb3, 0xe5, 0x49, 0x24, 0x80, 0xf8, 0xe6, 0x24, 0xfc, 0x40, 0x03, 0x02, 0x02, 0x98, 0xe5, 0x49, 0x03, 0x03, 0xf5, 0x82, 0x54, 0xc0, 0x24, 0x00, 0xc5, 0x82, 0x54, 0x3f, 0x34, 0x10, 0xf5, 0x83, 0xe0, 0xf5, 0x46, 0xa3, 0xe0, 0xf5, 0x47, 0x05, 0x45, 0x75, 0x4f, 0x02, 0x78, 0xe2, 0xe2, 0x70, 0x0b, 0x78, 0xe1, 0xe2, 0xc3, 0x95, 0x47, 0x50, 0x03, 0xe2, 0xf5, 0x47, 0x12, 0x01, 0x5d, 0x90, 0xc0, 0x00, 0xe0, 0x60, 0xb3, 0xff, 0x90, 0xc0, 0x0e, 0xe0, 0x90, 0xc0, 0x03, 0xa2, 0xe5, 0x82, 0x08, 0x40, 0x28, 0xe5, 0x46, 0xfe, 0x9f, 0xf5, 0x46, 0xe5, 0x47, 0x94, 0x00, 0xf5, 0x47, 0x50, 0x1a, 0xee, 0x60, 0x05, 0x74, 0x7e, 0xf0, 0xde, 0xfd, 0xe5, 0x45, 0x04, 0x54, 0x03, 0xf5, 0x45, 0x70, 0x06, 0x12, 0x01, 0x57, 0x02, 0x02, 0xb3, 0x02, 0x02, 0x2b, 0x74, 0x7e, 0xf0, 0xdf, 0xfd, 0x02, 0x02, 0xb3, 0xe5, 0x49, 0x24, 0x80, 0xf5, 0x4e, 0xf8, 0xe6, 0xf4, 0x04, 0x25, 0x4f, 0x40, 0x5f, 0xf5, 0x4b, 0xe5, 0x49, 0x03, 0x03, 0xf5, 0x4c, 0x54, 0xc0, 0x25, 0x4f, 0x24, 0x00, 0xc5, 0x4c, 0x54, 0x3f, 0x34, 0x10, 0xf5, 0x4d, 0x90, 0xc0, 0x00, 0xe0, 0x60, 0xd3, 0xff, 0xe5, 0x4b, 0x60, 0x25, 0x2f, 0xc5, 0x4b, 0x50, 0x06, 0xf4, 0x04, 0xff, 0x75, 0x4b, 0x00, 0x90, 0xc0, 0x00, 0x85, 0x4c, 0x84, 0x85, 0x4d, 0x85, 0x05, 0x86, 0xe0, 0xa3, 0x15, 0x86, 0xf0, 0xdf, 0xf7, 0x85, 0x84, 0x4c, 0x85, 0x85, 0x4d, 0x80, 0xd0, 0x75, 0x4f, 0x00, 0xa8, 0x4e, 0xe6, 0x20, 0xe6, 0x13, 0xef, 0x24, 0xfd, 0x50, 0x9b, 0x90, 0xc0, 0x01, 0xf0, 0xf0, 0x90, 0xc0, 0x03, 0x74, 0x7e, 0xf0, 0x75, 0x4f, 0x02, 0xe5, 0x49, 0x04, 0x54, 0x0f, 0xf5, 0x49, 0xb5, 0x48, 0x86, 0x05, 0x45, 0x75, 0x46, 0x28, 0x75, 0x47, 0x00, 0x02, 0x01, 0xe7, 0x02, 0x03, 0x55, 0x90, 0xc0, 0x02, 0xe5, 0x51, 0x70, 0x32, 0x80, 0x01, 0xe0, 0xe0, 0x20, 0xe5, 0xef, 0x30, 0xe7, 0xf8, 0x75, 0x56, 0x00, 0x75, 0x51, 0x01, 0xe5, 0x52, 0xf5, 0x54, 0xe5, 0x54, 0x03, 0x03, 0xf5, 0x57, 0x54, 0xc0, 0x24, 0x00, 0xc5, 0x57, 0x54, 0x3f, 0x34, 0x14, 0xf5, 0x58, 0x75, 0x55, 0x40, 0x02, 0x02, 0xb3, 0x75, 0x51, 0x00, 0x02, 0x02, 0xb3, 0xaf, 0x55, 0x85, 0x57, 0x84, 0x85, 0x58, 0x85, 0xe0, 0x20, 0xe6, 0x21, 0xe0, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xdf, 0xf3, 0xe5, 0x54, 0x24, 0x90, 0xf8, 0x76, 0x40, 0xe5, 0x54, 0x04, 0x54, 0x1f, 0xb5, 0x53, 0x03, 0x02, 0x02, 0xe6, 0xf5, 0x54, 0x05, 0x56, 0x80, 0xb5, 0x8f, 0x55, 0x85, 0x84, 0x57, 0x85, 0x85, 0x58, 0x20, 0xe5, 0x8c, 0x20, 0xe4, 0xbf, 0x54, 0x0f, 0xb4, 0x0e, 0x98, 0xe5, 0x54, 0x24, 0x90, 0xf8, 0x74, 0x40, 0xc3, 0x9f, 0xf6, 0xe5, 0x56, 0x70, 0x07, 0x74, 0xfc, 0x26, 0x50, 0x13, 0x80, 0x04, 0x24, 0xf8, 0x40, 0x0d, 0xe5, 0x54, 0x04, 0x54, 0x1f, 0xb5, 0x53, 0x03, 0x02, 0x02, 0xc4, 0xf5, 0x52, 0x02, 0x02, 0xc4, 0xe5, 0x53, 0xb5, 0x52, 0x4f, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x46, 0xe5, 0x4a, 0x24, 0x80, 0xf8, 0xe5, 0x4a, 0x04, 0x54, 0x0f, 0xb5, 0x49, 0x03, 0x02, 0x03, 0xe7, 0xff, 0x90, 0x7f, 0xc9, 0xe0, 0xf6, 0xfd, 0x60, 0x20, 0xfe, 0xe5, 0x4a, 0x03, 0x03, 0xf5, 0x84, 0x54, 0xc0, 0x24, 0x00, 0xc5, 0x84, 0x54, 0x3f, 0x34, 0x10, 0xf5, 0x85, 0x90, 0x7d, 0xc0, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xde, 0xf6, 0x8f, 0x4a, 0xed, 0x24, 0xc0, 0x60, 0x02, 0x8f, 0x48, 0x90, 0x7f, 0xc9, 0xf0, 0x80, 0x3e, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0xaa, 0xe5, 0x53, 0x24, 0x90, 0xf8, 0xe6, 0x60, 0x20, 0xfe, 0xe5, 0x53, 0x03, 0x03, 0xf5, 0x84, 0x54, 0xc0, 0x24, 0x00, 0xc5, 0x84, 0x54, 0x3f, 0x34, 0x14, 0xf5, 0x85, 0x90, 0x7e, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x15, 0x86, 0xf0, 0xa3, 0xde, 0xf6, 0xe6, 0x90, 0x7f, 0xb9, 0xf0, 0xe5, 0x53, 0x04, 0x54, 0x1f, 0xf5, 0x53, 0x02, 0x03, 0x5a, 0x02, 0x01, 0x8e, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x89, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8d, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0x10, 0x98, 0x16, 0x10, 0x99, 0x0f, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xd2, 0x0b, 0x80, 0xea, 0xe5, 0x6a, 0x24, 0x5a, 0xf8, 0xe5, 0x99, 0xf6, 0xe5, 0x6a, 0x04, 0x54, 0x0f, 0xf5, 0x6a, 0x80, 0xdc, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xcf, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdc, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xc0, 0xc2, 0xc1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe5, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe6, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe7, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdb, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x75, 0x40, 0x00, 0x90, 0x7f, 0xe9, 0xe0, 0xb4, 0x06, 0x59, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x4f, 0x90, 0x7f, 0xeb, 0xe0, 0xb4, 0x01, 0x0c, 0x90, 0x7f, 0xd4, 0x74, 0x0d, 0xf0, 0xa3, 0x74, 0xd4, 0xf0, 0x80, 0x39, 0xb4, 0x02, 0x12, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x33, 0x90, 0x7f, 0xd4, 0x74, 0x0d, 0xf0, 0xa3, 0x74, 0xe6, 0xf0, 0x80, 0x24, 0xb4, 0x03, 0x24, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfc, 0x40, 0x1c, 0xe0, 0x25, 0xe0, 0x24, 0x2b, 0xf5, 0x82, 0xe4, 0x34, 0x0e, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x90, 0x7f, 0xd4, 0xf0, 0xa3, 0xe5, 0xf0, 0xf0, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0xb4, 0x09, 0x41, 0x90, 0x7f, 0xe8, 0xe0, 0x70, 0xf4, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfe, 0x40, 0xec, 0xe0, 0xf5, 0x6f, 0x90, 0x7f, 0xd7, 0x78, 0x07, 0xe8, 0x44, 0x10, 0xf0, 0x44, 0x30, 0xf0, 0xe8, 0xf0, 0x44, 0x20, 0xf0, 0xd8, 0xf2, 0xe4, 0xf0, 0x74, 0x02, 0x90, 0x7f, 0xb6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x90, 0x7f, 0xc6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x12, 0x0a, 0xf1, 0x80, 0xb6, 0xb4, 0x0b, 0x1a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x01, 0xaf, 0xe5, 0x6f, 0xb4, 0x01, 0xaa, 0x90, 0x7f, 0xec, 0xe0, 0x70, 0xa4, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x70, 0x80, 0xb3, 0xb4, 0x0a, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x81, 0x92, 0xe5, 0x6f, 0xb4, 0x01, 0x8d, 0x90, 0x7f, 0xec, 0xe0, 0x70, 0x87, 0xe5, 0x70, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x80, 0x4e, 0xb4, 0x08, 0x0b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x47, 0xe5, 0x6f, 0x80, 0xe6, 0x70, 0x44, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x11, 0x74, 0x01, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x80, 0x26, 0xb4, 0x81, 0x03, 0xe4, 0x80, 0xeb, 0xb4, 0x82, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x03, 0x90, 0x7f, 0xb4, 0x54, 0x0f, 0x60, 0x0f, 0x20, 0xe3, 0x0c, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe0, 0x80, 0xcb, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0xb4, 0x03, 0x05, 0x75, 0xf0, 0x01, 0x80, 0x06, 0xb4, 0x01, 0x44, 0x75, 0xf0, 0x00, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x02, 0xe8, 0xa3, 0xa3, 0xe0, 0x70, 0xe3, 0xa3, 0xe0, 0x70, 0xdf, 0xa3, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x05, 0x90, 0x7f, 0xb4, 0x44, 0x10, 0x20, 0xe3, 0xcf, 0x54, 0x1f, 0x05, 0x86, 0x90, 0x7f, 0xd7, 0xf0, 0x44, 0x20, 0xf0, 0x54, 0x0f, 0xf0, 0x15, 0x86, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0xf0, 0x80, 0xb1, 0x02, 0x08, 0x19, 0x02, 0x09, 0xb0, 0xb4, 0xc0, 0xf7, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0xf3, 0xe5, 0x45, 0xf5, 0xf0, 0xd2, 0xf2, 0x45, 0x50, 0xb4, 0x00, 0x02, 0xc2, 0xf2, 0x90, 0xc0, 0x0e, 0xe0, 0xa2, 0xe6, 0xb3, 0x82, 0x08, 0x92, 0xf3, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0xb0, 0x08, 0x72, 0xf3, 0x92, 0xf3, 0xa2, 0x0b, 0x92, 0xf5, 0xe4, 0x90, 0x7f, 0x04, 0xf0, 0x90, 0x7f, 0x00, 0xe5, 0xf0, 0xf0, 0xe5, 0x48, 0xf4, 0x25, 0x49, 0x54, 0x0f, 0x90, 0x7f, 0x01, 0xf0, 0xe5, 0x53, 0xf4, 0x25, 0x52, 0x04, 0x54, 0x1f, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7f, 0x03, 0xf0, 0x05, 0x44, 0xe5, 0x44, 0x90, 0x7f, 0x05, 0xf0, 0xe5, 0x45, 0xa3, 0xf0, 0xe5, 0x49, 0xa3, 0xf0, 0xe5, 0x48, 0xa3, 0xf0, 0xe5, 0x4a, 0xa3, 0xf0, 0xe5, 0x4b, 0xa3, 0xf0, 0xe5, 0x46, 0xa3, 0xf0, 0xe5, 0x47, 0xa3, 0xf0, 0xe5, 0x51, 0xa3, 0xf0, 0xe5, 0x53, 0xa3, 0xf0, 0xe5, 0x52, 0xa3, 0xf0, 0xe5, 0x54, 0xa3, 0xf0, 0xe5, 0x55, 0xa3, 0xf0, 0xe5, 0x59, 0x90, 0x7f, 0x12, 0xf0, 0x90, 0xc0, 0x00, 0xe0, 0x90, 0x7f, 0x13, 0xf0, 0xa3, 0xe5, 0x20, 0xf0, 0x90, 0xc0, 0x09, 0xe0, 0x90, 0x7f, 0x15, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x90, 0x7f, 0x16, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xe9, 0x50, 0x01, 0xe4, 0x24, 0x17, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xb4, 0xb4, 0xc8, 0x1d, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x13, 0x74, 0x01, 0x30, 0x08, 0x01, 0x04, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0xb4, 0xc9, 0x21, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x17, 0x90, 0x7f, 0x00, 0x78, 0xf0, 0xe2, 0x60, 0x05, 0xf0, 0x08, 0xa3, 0x80, 0xf8, 0xe8, 0x24, 0x10, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0xb4, 0xd0, 0x5d, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x53, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x0a, 0x90, 0x7f, 0xea, 0xe0, 0x54, 0x01, 0xf5, 0x50, 0xd2, 0x0a, 0x90, 0x7f, 0x00, 0xe5, 0x45, 0x45, 0x50, 0x60, 0x02, 0x74, 0x01, 0xf0, 0x90, 0xc0, 0x0e, 0xe0, 0xa2, 0xe6, 0xa0, 0x08, 0x92, 0xf0, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0x72, 0x08, 0x82, 0xf0, 0xb3, 0xe4, 0x92, 0xe0, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfd, 0x50, 0x01, 0xe4, 0x24, 0x03, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0xb4, 0xd1, 0x29, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x1f, 0x90, 0x7f, 0x00, 0x78, 0xe0, 0x7f, 0x06, 0xe2, 0xf0, 0xa3, 0x08, 0xdf, 0xfa, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfa, 0x50, 0x01, 0xe4, 0x24, 0x06, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0xb4, 0xd2, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x16, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0xa2, 0xf0, 0x92, 0xe3, 0xa2, 0xf1, 0x92, 0xe5, 0xf0, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0xb4, 0xd3, 0x16, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x07, 0x90, 0x7f, 0xea, 0xe0, 0x10, 0x0b, 0x03, 0x02, 0x09, 0xb0, 0xf5, 0x99, 0x02, 0x09, 0xb4, 0xb4, 0xd4, 0x4c, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x42, 0x20, 0x08, 0x3f, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xea, 0xb4, 0x01, 0x09, 0xe0, 0x90, 0xc0, 0x0d, 0xf0, 0xf5, 0x6e, 0x80, 0x0a, 0xb4, 0x02, 0x07, 0xe0, 0x90, 0xc0, 0x0c, 0xf0, 0xf5, 0x6d, 0x90, 0xc0, 0x0e, 0xe0, 0x90, 0x7f, 0x00, 0xf0, 0xe5, 0x6e, 0xa3, 0xf0, 0xe5, 0x6d, 0xa3, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfd, 0x50, 0x01, 0xe4, 0x24, 0x03, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0xb4, 0xd5, 0x39, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x2f, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x0a, 0x90, 0x7f, 0xea, 0xe0, 0x90, 0xc0, 0x0a, 0xf0, 0xf5, 0x6c, 0x90, 0xc0, 0x0b, 0xe0, 0x90, 0x7f, 0x00, 0xf0, 0xe5, 0x6c, 0xa3, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfe, 0x50, 0x01, 0xe4, 0x24, 0x02, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xb4, 0x02, 0x09, 0xb0, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x01, 0xf0, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xe5, 0x45, 0xf5, 0xf0, 0xd2, 0xf2, 0x45, 0x50, 0xb4, 0x00, 0x02, 0xc2, 0xf2, 0x90, 0xc0, 0x0e, 0xe0, 0xa2, 0xe6, 0xb3, 0x82, 0x08, 0x92, 0xf3, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0xb0, 0x08, 0x72, 0xf3, 0x92, 0xf3, 0xa2, 0x0b, 0x92, 0xf5, 0xd3, 0xe5, 0x53, 0xb5, 0x52, 0x06, 0x90, 0x7f, 0xb8, 0xe0, 0xa2, 0xe1, 0x92, 0xf4, 0x90, 0x7e, 0x80, 0xe5, 0xf0, 0xf0, 0xe5, 0x48, 0xf4, 0x25, 0x49, 0x54, 0x0f, 0x90, 0x7e, 0x81, 0xf0, 0xe5, 0x53, 0xf4, 0x25, 0x52, 0x04, 0x54, 0x1f, 0x90, 0x7e, 0x82, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7e, 0x83, 0xf0, 0x05, 0x44, 0xe5, 0x44, 0x90, 0x7e, 0x84, 0xf0, 0x75, 0xf0, 0x05, 0x90, 0x7e, 0x85, 0xe5, 0x6b, 0xb5, 0x6a, 0x07, 0x90, 0x7f, 0xb7, 0xe5, 0xf0, 0xf0, 0x22, 0x24, 0x5a, 0xf8, 0xe6, 0xf0, 0xa3, 0x05, 0xf0, 0xe5, 0x6b, 0x04, 0x54, 0x0f, 0xf5, 0x6b, 0x80, 0xe3, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0x12, 0x0a, 0xf1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x12, 0x01, 0x00, 0x01, 0xff, 0x00, 0xff, 0x40, 0xc0, 0xba, 0x36, 0x61, 0x02, 0x00, 0x01, 0x02, 0x03, 0x01, 0x09, 0x02, 0x45, 0x00, 0x01, 0x01, 0x00, 0x40, 0x00, 0x09, 0x04, 0x00, 0x00, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x09, 0x04, 0x00, 0x01, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, 0x00, 0x0a, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x33, 0x0e, 0x37, 0x0e, 0x45, 0x0e, 0x61, 0x0e, 0x04, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x42, 0x00, 0x61, 0x00, 0x79, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x1c, 0x03, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x58, 0x00, 0x20, 0x00, 0x28, 0x00, 0x46, 0x00, 0x53, 0x00, 0x4b, 0x00, 0x29, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x81, 0xb0, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0xe4, 0xf5, 0x45, 0xf5, 0x48, 0xf5, 0x49, 0xf5, 0x4a, 0xf5, 0x50, 0xf5, 0x51, 0xf5, 0x52, 0xf5, 0x53, 0xf5, 0x54, 0xf5, 0x44, 0xf5, 0x6b, 0xf5, 0x6a, 0xf5, 0x86, 0xd2, 0x0b, 0x75, 0x8e, 0x30, 0x75, 0x89, 0x21, 0x75, 0x88, 0x55, 0x75, 0x8d, 0x64, 0x75, 0x87, 0x00, 0x90, 0x7f, 0xa1, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0xe4, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0x74, 0x09, 0xf0, 0x90, 0x7f, 0xde, 0x74, 0x07, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x05, 0xf0, 0x90, 0x7f, 0xd7, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x02, 0xf0, 0x74, 0x22, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x82, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc3, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x28, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2a, 0xf0, 0x75, 0xa8, 0x92, 0x75, 0xe8, 0x01, 0x90, 0x7f, 0xae, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x01, 0xf0, 0x75, 0x98, 0x52, 0x78, 0xf0, 0x90, 0x0e, 0x63, 0xe2, 0x60, 0x06, 0xf0, 0xa3, 0xa3, 0x08, 0x80, 0xf7, 0xe8, 0x24, 0x11, 0x25, 0xe0, 0x90, 0x0e, 0x61, 0xf0, 0x75, 0x20, 0x42, 0x78, 0xe6, 0xe2, 0xa2, 0xe0, 0x92, 0x08, 0x92, 0x07, 0x92, 0x03, 0x78, 0xe7, 0xe2, 0xa2, 0xe0, 0x92, 0x09, 0x92, 0x01, 0xe5, 0x20, 0x90, 0xc0, 0x08, 0xf0, 0x90, 0xc0, 0x0c, 0x74, 0xff, 0xf0, 0xf5, 0x6d, 0x30, 0x08, 0x09, 0x74, 0x67, 0xf0, 0x90, 0xc0, 0x0d, 0x74, 0x7f, 0xf0, 0x90, 0xc0, 0x0a, 0x74, 0x1f, 0xf0, 0xf5, 0x6c, 0xe4, 0xf5, 0x6f, 0xf5, 0x70, 0x90, 0xd1, 0x20, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x90, 0x7f, 0xd6, 0x74, 0x0a, 0xf0, 0x7a, 0x1e, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0xda, 0xf4, 0x90, 0x7f, 0xd6, 0x74, 0x06, 0xf0, 0x30, 0x08, 0x08, 0x90, 0xc0, 0x0d, 0x74, 0xff, 0xf0, 0xf5, 0x6e, 0x12, 0x0a, 0xf1, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc9, 0xe0, 0xb4, 0x01, 0x0d, 0x90, 0x7d, 0xc0, 0xe0, 0xb4, 0x55, 0x06, 0x90, 0x7f, 0xc9, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0xc9, 0xf0, 0x80, 0xdf, 0x90, 0xc0, 0x03, 0x7f, 0x40, 0xe0, 0xdf, 0xfd, 0x02, 0x01, 0x8e }; baycomusb-0.10.orig/firmware/afskfirmware.h0100644000175100017510000006336707340477542017111 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/afskfirmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define afskfirmware_DATE "20010821" /* firmware */ static const unsigned char afskfirmware[] = { 0x02, 0x0e, 0xab, 0x02, 0x04, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x04, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0xf2, 0x00, 0x02, 0x0a, 0x04, 0x00, 0x02, 0x0a, 0x2f, 0x00, 0x02, 0x0a, 0x5a, 0x00, 0x02, 0x0a, 0x85, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb0, 0x00, 0x02, 0x0a, 0xeb, 0x00, 0x02, 0x0b, 0x9d, 0x00, 0x02, 0x0b, 0xcb, 0x00, 0x02, 0x0b, 0xf6, 0x00, 0x02, 0x0c, 0x21, 0x00, 0x02, 0x0c, 0x4c, 0x00, 0x02, 0x0c, 0x77, 0x00, 0x02, 0x0c, 0xa2, 0x00, 0x02, 0x0c, 0xcd, 0x00, 0x02, 0x0c, 0xf8, 0x00, 0x02, 0x0d, 0x23, 0x00, 0x02, 0x0d, 0x4e, 0x00, 0x02, 0x0d, 0x79, 0x00, 0x02, 0x0d, 0xa4, 0x00, 0x02, 0x0d, 0xcf, 0xe5, 0x45, 0x45, 0x51, 0x60, 0x0d, 0xc2, 0x01, 0xd2, 0x00, 0xd2, 0x02, 0xe5, 0x20, 0x90, 0xc0, 0x08, 0xf0, 0x22, 0xc2, 0x00, 0xa2, 0x08, 0x92, 0x01, 0xc2, 0x02, 0xe5, 0x20, 0x90, 0xc0, 0x08, 0xf0, 0x22, 0xe5, 0x49, 0xb5, 0x48, 0x14, 0x12, 0x02, 0xc8, 0xe4, 0xf5, 0x45, 0x90, 0xc0, 0x00, 0xf0, 0x10, 0x09, 0x02, 0x80, 0xec, 0x12, 0x01, 0x57, 0x80, 0xe7, 0x75, 0x45, 0x01, 0x75, 0x4e, 0x08, 0x75, 0x4b, 0xff, 0x75, 0x4c, 0xff, 0xe5, 0x49, 0x03, 0x03, 0xf5, 0x82, 0x54, 0xc0, 0x24, 0x00, 0xc5, 0x82, 0x54, 0x3f, 0x34, 0x10, 0xf5, 0x83, 0xe0, 0xf5, 0x46, 0xa3, 0xe0, 0xf5, 0x47, 0x75, 0x50, 0x02, 0x78, 0xe1, 0xe2, 0xc3, 0x95, 0x47, 0x50, 0x03, 0xe2, 0xf5, 0x47, 0xe5, 0x49, 0x24, 0x80, 0xf8, 0xe6, 0x24, 0xfe, 0x40, 0x09, 0x75, 0x46, 0x01, 0x75, 0x47, 0x00, 0x75, 0x50, 0x00, 0x12, 0x01, 0x5d, 0xe5, 0x46, 0x24, 0xff, 0xf5, 0x46, 0xe5, 0x47, 0x34, 0xff, 0xf5, 0x47, 0x50, 0x0b, 0x12, 0x02, 0xc8, 0x74, 0x7e, 0x90, 0xc0, 0x00, 0xf0, 0x80, 0xe7, 0x85, 0x50, 0x4f, 0x75, 0x45, 0x02, 0xe5, 0x49, 0x24, 0x80, 0xf8, 0xe6, 0xb5, 0x4f, 0x2b, 0x75, 0x50, 0x00, 0x20, 0xe6, 0x18, 0xe5, 0x4b, 0xf4, 0x12, 0x02, 0x83, 0xe5, 0x4c, 0xf4, 0x12, 0x02, 0x83, 0x12, 0x02, 0x61, 0x75, 0x4b, 0xff, 0x75, 0x4c, 0xff, 0x75, 0x50, 0x02, 0xe5, 0x49, 0x04, 0x54, 0x0f, 0xf5, 0x49, 0xb5, 0x48, 0xc9, 0x02, 0x02, 0x4a, 0xe5, 0x49, 0x03, 0x03, 0xf5, 0x82, 0x54, 0xc0, 0x25, 0x4f, 0x24, 0x00, 0xc5, 0x82, 0x54, 0x3f, 0x34, 0x10, 0xf5, 0x83, 0xe0, 0x12, 0x02, 0x9a, 0x05, 0x4f, 0x80, 0xb0, 0x12, 0x02, 0x61, 0x75, 0x45, 0x03, 0x7a, 0x14, 0xd3, 0x12, 0x02, 0x6e, 0xda, 0xfa, 0x75, 0x45, 0x00, 0x12, 0x01, 0x57, 0x02, 0x01, 0x79, 0x7b, 0x7e, 0x7a, 0x08, 0xeb, 0x13, 0xfb, 0x12, 0x02, 0x6e, 0xda, 0xf8, 0x22, 0xe5, 0x4d, 0x13, 0xf5, 0x4d, 0xd5, 0x4e, 0x0c, 0x75, 0x4e, 0x08, 0x12, 0x02, 0xc8, 0xe5, 0x4d, 0x90, 0xc0, 0x00, 0xf0, 0x22, 0xfb, 0x7a, 0x08, 0xeb, 0x13, 0xfb, 0x12, 0x02, 0x6e, 0xe5, 0x4d, 0xf4, 0x54, 0xf8, 0x70, 0x04, 0xc3, 0x12, 0x02, 0x6e, 0xda, 0xed, 0x22, 0xfb, 0x7a, 0x08, 0xc3, 0xe5, 0x4c, 0x13, 0xf5, 0x4c, 0xe5, 0x4b, 0x13, 0xf5, 0x4b, 0xeb, 0x30, 0xe0, 0x01, 0xb3, 0x50, 0x06, 0x63, 0x4c, 0x84, 0x63, 0x4b, 0x08, 0x13, 0xfb, 0x12, 0x02, 0x6e, 0xe5, 0x4d, 0xf4, 0x54, 0xf8, 0x70, 0x04, 0xc3, 0x12, 0x02, 0x6e, 0xda, 0xd6, 0x22, 0x90, 0xc0, 0x01, 0xe0, 0x30, 0xe1, 0x01, 0x22, 0x30, 0xe0, 0x03, 0x12, 0x03, 0x63, 0xe5, 0x54, 0xb5, 0x53, 0x47, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0x3e, 0xe5, 0x48, 0x24, 0x80, 0xf8, 0xe5, 0x48, 0x04, 0x54, 0x0f, 0xb5, 0x49, 0x03, 0x02, 0x03, 0x60, 0xff, 0x90, 0x7f, 0xc9, 0xe0, 0xf6, 0x60, 0x20, 0xfe, 0xe5, 0x48, 0x03, 0x03, 0xf5, 0x84, 0x54, 0xc0, 0x24, 0x00, 0xc5, 0x84, 0x54, 0x3f, 0x34, 0x10, 0xf5, 0x85, 0x90, 0x7d, 0xc0, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xde, 0xf6, 0x8f, 0x48, 0x90, 0x7f, 0xc9, 0xf0, 0x80, 0x3e, 0x90, 0x7f, 0xb8, 0xe0, 0x20, 0xe1, 0xb2, 0xe5, 0x54, 0x24, 0x90, 0xf8, 0xe6, 0x60, 0x20, 0xfe, 0xe5, 0x54, 0x03, 0x03, 0xf5, 0x84, 0x54, 0xc0, 0x24, 0x00, 0xc5, 0x84, 0x54, 0x3f, 0x34, 0x14, 0xf5, 0x85, 0x90, 0x7e, 0x00, 0x05, 0x86, 0xe0, 0xa3, 0x15, 0x86, 0xf0, 0xa3, 0xde, 0xf6, 0xe6, 0x90, 0x7f, 0xb9, 0xf0, 0xe5, 0x54, 0x04, 0x54, 0x1f, 0xf5, 0x54, 0x02, 0x02, 0xdb, 0x02, 0x02, 0xc8, 0x90, 0xc0, 0x00, 0xe0, 0xfe, 0x7f, 0x08, 0xee, 0x13, 0xfe, 0xe5, 0x59, 0x33, 0xf5, 0x59, 0xb4, 0x7e, 0x03, 0x02, 0x03, 0xf2, 0xf4, 0x54, 0x7f, 0x60, 0x0e, 0xe5, 0x52, 0x60, 0x07, 0xe5, 0x59, 0x54, 0x3f, 0xb4, 0x3e, 0x08, 0xdf, 0xe0, 0x22, 0x75, 0x52, 0x00, 0x80, 0xf8, 0xc3, 0xe5, 0x57, 0x33, 0xf5, 0x57, 0xe5, 0x58, 0x33, 0xf5, 0x58, 0xe5, 0x59, 0x30, 0xe0, 0x01, 0xb3, 0x50, 0x06, 0x63, 0x57, 0x21, 0x63, 0x58, 0x10, 0x13, 0xe5, 0x5a, 0x13, 0xf5, 0x5a, 0xd5, 0x5b, 0xd6, 0x75, 0x5b, 0x08, 0xe5, 0x55, 0x03, 0x03, 0xf5, 0x82, 0x54, 0xc0, 0x25, 0x5c, 0x24, 0x00, 0xc5, 0x82, 0x54, 0x3f, 0x34, 0x14, 0xf5, 0x83, 0xe5, 0x5a, 0xf0, 0x05, 0x5c, 0xe5, 0x5c, 0x30, 0xe6, 0xb5, 0xe5, 0x55, 0x24, 0x90, 0xf8, 0x76, 0x40, 0xe5, 0x55, 0x04, 0x54, 0x1f, 0xb5, 0x54, 0x06, 0x75, 0x52, 0x00, 0x02, 0x03, 0x88, 0xf5, 0x55, 0x75, 0x5c, 0x00, 0x05, 0x56, 0x02, 0x03, 0x88, 0xe5, 0x52, 0x60, 0x2f, 0xe5, 0x57, 0x64, 0xf2, 0xf8, 0xe5, 0x58, 0x64, 0xa1, 0x48, 0x70, 0x23, 0xe5, 0x55, 0x24, 0x90, 0xf8, 0xe5, 0x5c, 0xf6, 0xe5, 0x56, 0x70, 0x07, 0x74, 0xfc, 0x26, 0x50, 0x12, 0x80, 0x04, 0x24, 0xf8, 0x40, 0x0c, 0xe5, 0x55, 0x04, 0x54, 0x1f, 0xb5, 0x54, 0x02, 0x80, 0x02, 0xf5, 0x53, 0xe4, 0xf5, 0x56, 0xf5, 0x5c, 0x75, 0x52, 0x01, 0xf4, 0xf5, 0x57, 0xf5, 0x58, 0x75, 0x5b, 0x08, 0x85, 0x53, 0x55, 0x02, 0x03, 0x88, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x89, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8d, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0x10, 0x98, 0x16, 0x10, 0x99, 0x0f, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xd2, 0x0a, 0x80, 0xea, 0xe5, 0x6e, 0x24, 0x5e, 0xf8, 0xe5, 0x99, 0xf6, 0xe5, 0x6e, 0x04, 0x54, 0x0f, 0xf5, 0x6e, 0x80, 0xdc, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xcf, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdc, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xc0, 0xc2, 0xc1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe5, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe6, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe7, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdb, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x75, 0x40, 0x00, 0x90, 0x7f, 0xe9, 0xe0, 0xb4, 0x06, 0x59, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x4f, 0x90, 0x7f, 0xeb, 0xe0, 0xb4, 0x01, 0x0c, 0x90, 0x7f, 0xd4, 0x74, 0x0d, 0xf0, 0xa3, 0x74, 0xfa, 0xf0, 0x80, 0x39, 0xb4, 0x02, 0x12, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x33, 0x90, 0x7f, 0xd4, 0x74, 0x0e, 0xf0, 0xa3, 0x74, 0x0c, 0xf0, 0x80, 0x24, 0xb4, 0x03, 0x24, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfc, 0x40, 0x1c, 0xe0, 0x25, 0xe0, 0x24, 0x51, 0xf5, 0x82, 0xe4, 0x34, 0x0e, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x90, 0x7f, 0xd4, 0xf0, 0xa3, 0xe5, 0xf0, 0xf0, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0xb4, 0x09, 0x41, 0x90, 0x7f, 0xe8, 0xe0, 0x70, 0xf4, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfe, 0x40, 0xec, 0xe0, 0xf5, 0x70, 0x90, 0x7f, 0xd7, 0x78, 0x07, 0xe8, 0x44, 0x10, 0xf0, 0x44, 0x30, 0xf0, 0xe8, 0xf0, 0x44, 0x20, 0xf0, 0xd8, 0xf2, 0xe4, 0xf0, 0x74, 0x02, 0x90, 0x7f, 0xb6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x90, 0x7f, 0xc6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x12, 0x0b, 0x26, 0x80, 0xb6, 0xb4, 0x0b, 0x1a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x01, 0xaf, 0xe5, 0x70, 0xb4, 0x01, 0xaa, 0x90, 0x7f, 0xec, 0xe0, 0x70, 0xa4, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x71, 0x80, 0xb3, 0xb4, 0x0a, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x81, 0x92, 0xe5, 0x70, 0xb4, 0x01, 0x8d, 0x90, 0x7f, 0xec, 0xe0, 0x70, 0x87, 0xe5, 0x71, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x80, 0x4e, 0xb4, 0x08, 0x0b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x47, 0xe5, 0x70, 0x80, 0xe6, 0x70, 0x44, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x11, 0x74, 0x01, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x80, 0x26, 0xb4, 0x81, 0x03, 0xe4, 0x80, 0xeb, 0xb4, 0x82, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x03, 0x90, 0x7f, 0xb4, 0x54, 0x0f, 0x60, 0x0f, 0x20, 0xe3, 0x0c, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe0, 0x80, 0xcb, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0xb4, 0x03, 0x05, 0x75, 0xf0, 0x01, 0x80, 0x06, 0xb4, 0x01, 0x44, 0x75, 0xf0, 0x00, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x02, 0xe8, 0xa3, 0xa3, 0xe0, 0x70, 0xe3, 0xa3, 0xe0, 0x70, 0xdf, 0xa3, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x05, 0x90, 0x7f, 0xb4, 0x44, 0x10, 0x20, 0xe3, 0xcf, 0x54, 0x1f, 0x05, 0x86, 0x90, 0x7f, 0xd7, 0xf0, 0x44, 0x20, 0xf0, 0x54, 0x0f, 0xf0, 0x15, 0x86, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0xf0, 0x80, 0xb1, 0x02, 0x08, 0x5f, 0x02, 0x09, 0xe5, 0xb4, 0xc0, 0xf7, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0xf3, 0xe5, 0x45, 0xf5, 0xf0, 0xd2, 0xf2, 0x45, 0x51, 0xb4, 0x00, 0x02, 0xc2, 0xf2, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0x92, 0xf3, 0xa2, 0x0a, 0x92, 0xf5, 0xe4, 0x90, 0x7f, 0x04, 0xf0, 0x90, 0x7f, 0x00, 0xe5, 0xf0, 0xf0, 0xe5, 0x48, 0xf4, 0x25, 0x49, 0x54, 0x0f, 0x90, 0x7f, 0x01, 0xf0, 0xe5, 0x54, 0xf4, 0x25, 0x53, 0x04, 0x54, 0x1f, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7f, 0x03, 0xf0, 0x05, 0x44, 0xe5, 0x44, 0x90, 0x7f, 0x05, 0xf0, 0xe5, 0x45, 0xa3, 0xf0, 0xe5, 0x49, 0xa3, 0xf0, 0xe5, 0x48, 0xa3, 0xf0, 0xe5, 0x4a, 0xa3, 0xf0, 0x74, 0x00, 0xa3, 0xf0, 0xe5, 0x46, 0xa3, 0xf0, 0xe5, 0x47, 0xa3, 0xf0, 0xe5, 0x52, 0xa3, 0xf0, 0xe5, 0x54, 0xa3, 0xf0, 0xe5, 0x53, 0xa3, 0xf0, 0xe5, 0x55, 0xa3, 0xf0, 0xe5, 0x56, 0xa3, 0xf0, 0xe5, 0x5d, 0x90, 0x7f, 0x12, 0xf0, 0x90, 0xc0, 0x01, 0xe0, 0x90, 0x7f, 0x13, 0xf0, 0x90, 0xc0, 0x08, 0xe0, 0x90, 0x7f, 0x14, 0xf0, 0x90, 0xc0, 0x09, 0xe0, 0x90, 0x7f, 0x15, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x90, 0x7f, 0x16, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xe9, 0x50, 0x01, 0xe4, 0x24, 0x17, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xe9, 0xb4, 0xc8, 0x19, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x0f, 0x74, 0x03, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0xb4, 0xc9, 0x21, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x17, 0x90, 0x7f, 0x00, 0x78, 0xf0, 0xe2, 0x60, 0x05, 0xf0, 0x08, 0xa3, 0x80, 0xf8, 0xe8, 0x24, 0x10, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0xb4, 0xd0, 0x4d, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x43, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x0a, 0x90, 0x7f, 0xea, 0xe0, 0x54, 0x01, 0xf5, 0x51, 0xd2, 0x09, 0x90, 0x7f, 0x00, 0xe5, 0x45, 0x45, 0x51, 0x60, 0x02, 0x74, 0x01, 0xf0, 0x90, 0xc0, 0x09, 0xe0, 0x54, 0x01, 0x64, 0x01, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfd, 0x50, 0x01, 0xe4, 0x24, 0x03, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0xb4, 0xd1, 0x29, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x1f, 0x90, 0x7f, 0x00, 0x78, 0xe0, 0x7f, 0x06, 0xe2, 0xf0, 0xa3, 0x08, 0xdf, 0xfa, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfa, 0x50, 0x01, 0xe4, 0x24, 0x06, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0xb4, 0xd2, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x16, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0xa2, 0xf0, 0x92, 0xe3, 0xa2, 0xf1, 0x92, 0xe5, 0xf0, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0xb4, 0xd3, 0x16, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x07, 0x90, 0x7f, 0xea, 0xe0, 0x10, 0x0a, 0x03, 0x02, 0x09, 0xe5, 0xf5, 0x99, 0x02, 0x09, 0xe9, 0xb4, 0xd4, 0x4d, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x43, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xea, 0xb4, 0x01, 0x07, 0xe0, 0x90, 0xc0, 0x0d, 0xf0, 0x80, 0x08, 0xb4, 0x02, 0x05, 0xe0, 0x90, 0xc0, 0x0c, 0xf0, 0x90, 0xc0, 0x0e, 0xe0, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0xc0, 0x0d, 0xe0, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0xc0, 0x0c, 0xe0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfd, 0x50, 0x01, 0xe4, 0x24, 0x03, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0xb4, 0xd5, 0x3b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x31, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x08, 0x90, 0x7f, 0xea, 0xe0, 0x90, 0xc0, 0x0a, 0xf0, 0x90, 0xc0, 0x0b, 0xe0, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0xc0, 0x0a, 0xe0, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfe, 0x50, 0x01, 0xe4, 0x24, 0x02, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x09, 0xe9, 0x02, 0x09, 0xe5, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x01, 0xf0, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xe5, 0x45, 0xf5, 0xf0, 0xd2, 0xf2, 0x45, 0x51, 0xb4, 0x00, 0x02, 0xc2, 0xf2, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0x92, 0xf3, 0xa2, 0x0a, 0x92, 0xf5, 0xd3, 0xe5, 0x54, 0xb5, 0x53, 0x06, 0x90, 0x7f, 0xb8, 0xe0, 0xa2, 0xe1, 0x92, 0xf4, 0x90, 0x7e, 0x80, 0xe5, 0xf0, 0xf0, 0xe5, 0x48, 0xf4, 0x25, 0x49, 0x54, 0x0f, 0x90, 0x7e, 0x81, 0xf0, 0xe5, 0x54, 0xf4, 0x25, 0x53, 0x04, 0x54, 0x1f, 0x90, 0x7e, 0x82, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7e, 0x83, 0xf0, 0x05, 0x44, 0xe5, 0x44, 0x90, 0x7e, 0x84, 0xf0, 0x75, 0xf0, 0x05, 0x90, 0x7e, 0x85, 0xe5, 0x6f, 0xb5, 0x6e, 0x07, 0x90, 0x7f, 0xb7, 0xe5, 0xf0, 0xf0, 0x22, 0x24, 0x5e, 0xf8, 0xe6, 0xf0, 0xa3, 0x05, 0xf0, 0xe5, 0x6f, 0x04, 0x54, 0x0f, 0xf5, 0x6f, 0x80, 0xe3, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0x12, 0x0b, 0x26, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x12, 0x01, 0x00, 0x01, 0xff, 0x00, 0xff, 0x40, 0xc0, 0xba, 0x36, 0x61, 0x01, 0x00, 0x01, 0x02, 0x03, 0x01, 0x09, 0x02, 0x45, 0x00, 0x01, 0x01, 0x00, 0x40, 0x00, 0x09, 0x04, 0x00, 0x00, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x09, 0x04, 0x00, 0x01, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, 0x00, 0x0a, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x59, 0x0e, 0x5d, 0x0e, 0x6b, 0x0e, 0x89, 0x0e, 0x04, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x42, 0x00, 0x61, 0x00, 0x79, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x1e, 0x03, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x58, 0x00, 0x20, 0x00, 0x28, 0x00, 0x41, 0x00, 0x46, 0x00, 0x53, 0x00, 0x4b, 0x00, 0x29, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x81, 0xb0, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0xe4, 0xf5, 0x45, 0xf5, 0x48, 0xf5, 0x49, 0xf5, 0x4a, 0xf5, 0x51, 0xf5, 0x52, 0xf5, 0x53, 0xf5, 0x54, 0xf5, 0x55, 0xf5, 0x44, 0xf5, 0x6f, 0xf5, 0x6e, 0xf5, 0x86, 0xd2, 0x0a, 0x75, 0x8e, 0x30, 0x75, 0x89, 0x21, 0x75, 0x88, 0x55, 0x75, 0x8d, 0x64, 0x75, 0x87, 0x00, 0x90, 0x7f, 0xa1, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0xe4, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0x74, 0x09, 0xf0, 0x90, 0x7f, 0xde, 0x74, 0x07, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x05, 0xf0, 0x90, 0x7f, 0xd7, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x02, 0xf0, 0x74, 0x22, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x82, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc3, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x28, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2a, 0xf0, 0x75, 0xa8, 0x92, 0x75, 0xe8, 0x01, 0x90, 0x7f, 0xae, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x01, 0xf0, 0x75, 0x98, 0x52, 0x75, 0x20, 0x42, 0x78, 0xe7, 0xe2, 0xa2, 0xe0, 0x92, 0x08, 0x92, 0x01, 0xe5, 0x20, 0x90, 0xc0, 0x08, 0xf0, 0x90, 0xc0, 0x0c, 0x74, 0xff, 0xf0, 0x90, 0xc0, 0x0d, 0xe4, 0xf0, 0x90, 0xc0, 0x0a, 0x74, 0x1f, 0xf0, 0x78, 0xf0, 0x90, 0x0e, 0x8b, 0xe2, 0x60, 0x06, 0xf0, 0xa3, 0xa3, 0x08, 0x80, 0xf7, 0xe8, 0x24, 0x11, 0x25, 0xe0, 0x90, 0x0e, 0x89, 0xf0, 0xe4, 0xf5, 0x70, 0xf5, 0x71, 0x90, 0xd1, 0x20, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x90, 0x7f, 0xd6, 0x74, 0x0a, 0xf0, 0x7a, 0x1e, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0xda, 0xf4, 0x90, 0x7f, 0xd6, 0x74, 0x06, 0xf0, 0x12, 0x0b, 0x26, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc9, 0xe0, 0xb4, 0x01, 0x0d, 0x90, 0x7d, 0xc0, 0xe0, 0xb4, 0x55, 0x06, 0x90, 0x7f, 0xc9, 0xf0, 0x80, 0x06, 0x90, 0x7f, 0xc9, 0xf0, 0x80, 0xdf, 0x02, 0x01, 0x79 }; baycomusb-0.10.orig/firmware/audiofirmware.h0100644000175100017510000006351207340477542017256 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/audiofirmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define audiofirmware_DATE "20010821" /* firmware */ static const unsigned char audiofirmware[] = { 0x02, 0x0e, 0x07, 0x02, 0x01, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x24, 0x00, 0x02, 0x07, 0xd2, 0x00, 0x02, 0x09, 0x1c, 0x00, 0x02, 0x09, 0x47, 0x00, 0x02, 0x09, 0x72, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x09, 0x9d, 0x00, 0x02, 0x09, 0xd8, 0x00, 0x02, 0x0a, 0x6e, 0x00, 0x02, 0x0a, 0x9c, 0x00, 0x02, 0x0a, 0xc7, 0x00, 0x02, 0x0a, 0xf2, 0x00, 0x02, 0x0b, 0x1d, 0x00, 0x02, 0x0b, 0x48, 0x00, 0x02, 0x0b, 0x73, 0x00, 0x02, 0x0b, 0x9e, 0x00, 0x02, 0x0b, 0xc9, 0x00, 0x02, 0x0b, 0xf4, 0x00, 0x02, 0x0c, 0x1f, 0x00, 0x02, 0x0c, 0x4a, 0x00, 0x02, 0x0c, 0x75, 0x00, 0x02, 0x0c, 0xa0, 0xe5, 0x4c, 0xa2, 0xe0, 0x92, 0x00, 0x92, 0x02, 0xb3, 0x82, 0x08, 0x92, 0x01, 0x90, 0xc0, 0x08, 0xe5, 0x20, 0xf0, 0x02, 0x01, 0x57, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x89, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8d, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0x10, 0x98, 0x16, 0x10, 0x99, 0x0f, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xd2, 0x09, 0x80, 0xea, 0xe5, 0x5d, 0x24, 0x4d, 0xf8, 0xe5, 0x99, 0xf6, 0xe5, 0x5d, 0x04, 0x54, 0x0f, 0xf5, 0x5d, 0x80, 0xdc, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xcf, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdc, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xc0, 0xc2, 0xc1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe5, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe6, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe7, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdb, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x75, 0x40, 0x00, 0x90, 0x7f, 0xe9, 0xe0, 0xb4, 0x06, 0x59, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x4f, 0x90, 0x7f, 0xeb, 0xe0, 0xb4, 0x01, 0x0c, 0x90, 0x7f, 0xd4, 0x74, 0x0c, 0xf0, 0xa3, 0x74, 0xcb, 0xf0, 0x80, 0x39, 0xb4, 0x02, 0x12, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x33, 0x90, 0x7f, 0xd4, 0x74, 0x0c, 0xf0, 0xa3, 0x74, 0xdd, 0xf0, 0x80, 0x24, 0xb4, 0x03, 0x24, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfc, 0x40, 0x1c, 0xe0, 0x25, 0xe0, 0x24, 0xab, 0xf5, 0x82, 0xe4, 0x34, 0x0d, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x90, 0x7f, 0xd4, 0xf0, 0xa3, 0xe5, 0xf0, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0x09, 0x41, 0x90, 0x7f, 0xe8, 0xe0, 0x70, 0xf4, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfe, 0x40, 0xec, 0xe0, 0xf5, 0x62, 0x90, 0x7f, 0xd7, 0x78, 0x07, 0xe8, 0x44, 0x10, 0xf0, 0x44, 0x30, 0xf0, 0xe8, 0xf0, 0x44, 0x20, 0xf0, 0xd8, 0xf2, 0xe4, 0xf0, 0x74, 0x02, 0x90, 0x7f, 0xb6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x90, 0x7f, 0xc6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x12, 0x0a, 0x13, 0x80, 0xb6, 0xb4, 0x0b, 0x1e, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x01, 0xaf, 0xe5, 0x62, 0xb4, 0x01, 0xaa, 0x90, 0x7f, 0xec, 0xe0, 0x24, 0xfc, 0x40, 0xa2, 0x24, 0x67, 0xf8, 0x90, 0x7f, 0xea, 0xe0, 0xf6, 0x80, 0xaf, 0xb4, 0x0a, 0x24, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x81, 0x8e, 0xe5, 0x62, 0xb4, 0x01, 0x89, 0x90, 0x7f, 0xec, 0xe0, 0x24, 0xfc, 0x40, 0x81, 0x24, 0x67, 0xf8, 0xe6, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x80, 0x4e, 0xb4, 0x08, 0x0b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x47, 0xe5, 0x62, 0x80, 0xe6, 0x70, 0x44, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x11, 0x74, 0x01, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x80, 0x26, 0xb4, 0x81, 0x03, 0xe4, 0x80, 0xeb, 0xb4, 0x82, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x03, 0x90, 0x7f, 0xb4, 0x54, 0x0f, 0x60, 0x0f, 0x20, 0xe3, 0x0c, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe0, 0x80, 0xcb, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0x03, 0x05, 0x75, 0xf0, 0x01, 0x80, 0x06, 0xb4, 0x01, 0x44, 0x75, 0xf0, 0x00, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x02, 0xe8, 0xa3, 0xa3, 0xe0, 0x70, 0xe3, 0xa3, 0xe0, 0x70, 0xdf, 0xa3, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x05, 0x90, 0x7f, 0xb4, 0x44, 0x10, 0x20, 0xe3, 0xcf, 0x54, 0x1f, 0x05, 0x86, 0x90, 0x7f, 0xd7, 0xf0, 0x44, 0x20, 0xf0, 0x54, 0x0f, 0xf0, 0x15, 0x86, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0xf0, 0x80, 0xb1, 0x02, 0x05, 0x6e, 0x02, 0x07, 0xb3, 0xb4, 0xc0, 0xf7, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0xf3, 0xe5, 0x4c, 0xf5, 0xf0, 0xa2, 0xe0, 0x92, 0xf2, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0xb3, 0x92, 0xf3, 0xa2, 0x09, 0x92, 0xf5, 0xe4, 0x90, 0x7f, 0x04, 0xf0, 0x90, 0x7f, 0x00, 0xe5, 0xf0, 0xf0, 0xe4, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7f, 0x03, 0xf0, 0x05, 0x44, 0xe5, 0x44, 0x90, 0x7f, 0x05, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0x90, 0xc0, 0x01, 0xe0, 0x90, 0x7f, 0x12, 0xf0, 0x90, 0xc0, 0x02, 0xe0, 0x90, 0x7f, 0x13, 0xf0, 0xe5, 0x20, 0xa3, 0xf0, 0x90, 0xc0, 0x09, 0xe0, 0x90, 0x7f, 0x15, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x90, 0x7f, 0x16, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xe9, 0x50, 0x01, 0xe4, 0x24, 0x17, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0xb4, 0xc8, 0x19, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x0f, 0x74, 0x04, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xc9, 0x21, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x17, 0x90, 0x7f, 0x00, 0x78, 0xf0, 0xe2, 0x60, 0x05, 0xf0, 0x08, 0xa3, 0x80, 0xf8, 0xe8, 0x24, 0x10, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xd0, 0x45, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x3b, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x08, 0x90, 0x7f, 0xea, 0xe0, 0x54, 0x01, 0xf5, 0x4c, 0x90, 0x7f, 0x00, 0xe5, 0x4c, 0xf0, 0x90, 0xc0, 0x09, 0xe0, 0x54, 0x01, 0x64, 0x01, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfd, 0x50, 0x01, 0xe4, 0x24, 0x03, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xd2, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x16, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0xa2, 0xf0, 0x92, 0xe3, 0xa2, 0xf1, 0x92, 0xe5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xd3, 0x16, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x07, 0x90, 0x7f, 0xea, 0xe0, 0x10, 0x09, 0x03, 0x02, 0x07, 0xb3, 0xf5, 0x99, 0x02, 0x07, 0xb7, 0xb4, 0xd4, 0x49, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x3f, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xea, 0xb4, 0x01, 0x09, 0xe0, 0x90, 0xc0, 0x0d, 0xf0, 0xf5, 0x61, 0x80, 0x0a, 0xb4, 0x02, 0x07, 0xe0, 0x90, 0xc0, 0x0c, 0xf0, 0xf5, 0x60, 0x90, 0xc0, 0x0e, 0xe0, 0x90, 0x7f, 0x00, 0xf0, 0xe5, 0x61, 0xa3, 0xf0, 0xe5, 0x60, 0xa3, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfd, 0x50, 0x01, 0xe4, 0x24, 0x03, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xd5, 0x3f, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x32, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x0a, 0x90, 0x7f, 0xea, 0xe0, 0x90, 0xc0, 0x0a, 0xf0, 0xf5, 0x5f, 0x90, 0xc0, 0x0b, 0xe0, 0x90, 0x7f, 0x00, 0xf0, 0xe5, 0x5f, 0xa3, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfe, 0x50, 0x01, 0xe4, 0x24, 0x02, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0x02, 0x07, 0x53, 0xb4, 0xe0, 0xfa, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x12, 0x90, 0x7f, 0xea, 0xe0, 0x54, 0x78, 0xc5, 0x20, 0x54, 0x07, 0x45, 0x20, 0xf5, 0x20, 0x90, 0xc0, 0x08, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x60, 0x0d, 0xb4, 0x01, 0x11, 0xe5, 0x20, 0x90, 0x7f, 0x00, 0x54, 0x7f, 0xf0, 0x74, 0x01, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x90, 0xc0, 0x08, 0xd2, 0x07, 0xe5, 0x20, 0xf0, 0x90, 0xc0, 0x05, 0xe0, 0x90, 0x7f, 0x04, 0xf0, 0x90, 0xc0, 0x06, 0xe0, 0x90, 0x7f, 0x05, 0xf0, 0x90, 0xc0, 0x07, 0xe0, 0x90, 0x7f, 0x06, 0xf0, 0x90, 0xc0, 0x08, 0xc2, 0x07, 0xe5, 0x20, 0xf0, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0xc0, 0x05, 0xe0, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0xc0, 0x06, 0xe0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0xc0, 0x07, 0xe0, 0x90, 0x7f, 0x03, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xf9, 0x50, 0x01, 0xe4, 0x24, 0x07, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0xb4, 0xe1, 0x3a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x30, 0x90, 0x7f, 0x00, 0xe5, 0x45, 0xf0, 0xa3, 0xe5, 0x49, 0xf0, 0xa3, 0xe5, 0x46, 0xf0, 0xa3, 0xe5, 0x47, 0xf0, 0xa3, 0xe5, 0x48, 0xf0, 0xa3, 0xe5, 0x4a, 0xf0, 0xa3, 0xe5, 0x4b, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xf9, 0x50, 0x01, 0xe4, 0x24, 0x07, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xe2, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x16, 0x90, 0x7f, 0x00, 0x78, 0x80, 0xaf, 0x49, 0xe6, 0xf0, 0x08, 0xa3, 0xdf, 0xfa, 0x90, 0x7f, 0xb5, 0xe5, 0x49, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0x05, 0x45, 0xe5, 0x49, 0xb4, 0x02, 0x14, 0x90, 0x7f, 0xd8, 0xe0, 0xa3, 0x05, 0x86, 0x90, 0x7f, 0x68, 0xf0, 0x15, 0x86, 0xe0, 0x05, 0x86, 0xf0, 0x02, 0x09, 0x05, 0xb4, 0x03, 0x36, 0x90, 0x7f, 0xa0, 0xe0, 0x20, 0xe0, 0x23, 0x90, 0x7f, 0x70, 0xe0, 0x70, 0x1d, 0x90, 0x7f, 0x71, 0xe0, 0xb4, 0x03, 0x16, 0xfa, 0x90, 0x7f, 0x60, 0x05, 0x86, 0x90, 0x7f, 0x68, 0x15, 0x86, 0xe0, 0x05, 0x86, 0xf0, 0x15, 0x86, 0xda, 0xf8, 0x02, 0x09, 0x05, 0x7a, 0x03, 0x90, 0x7f, 0x68, 0xe4, 0xf0, 0xda, 0xfd, 0x02, 0x09, 0x05, 0x90, 0xc0, 0x01, 0xe0, 0xc3, 0x95, 0x49, 0xe0, 0x40, 0x02, 0xe5, 0x49, 0xfa, 0xfb, 0x60, 0x12, 0x90, 0xc0, 0x00, 0x05, 0x86, 0x90, 0x7f, 0x68, 0x15, 0x86, 0xe0, 0x05, 0x86, 0xf0, 0x15, 0x86, 0xda, 0xf8, 0xe5, 0x49, 0xc3, 0x9b, 0x60, 0x08, 0xfa, 0x90, 0x7f, 0x68, 0xe4, 0xf0, 0xda, 0xfd, 0x90, 0xc0, 0x01, 0xe0, 0xf5, 0x4a, 0x24, 0xfc, 0x60, 0x05, 0x33, 0x95, 0xe0, 0xd2, 0xe0, 0xfb, 0x25, 0x48, 0x60, 0x02, 0xf5, 0x48, 0xe5, 0x48, 0x03, 0x03, 0x03, 0x03, 0x54, 0x0f, 0x2b, 0x25, 0x46, 0xfa, 0xe5, 0x47, 0x34, 0x00, 0x90, 0xc0, 0x02, 0xf0, 0xea, 0x90, 0xc0, 0x01, 0xf0, 0x90, 0x7f, 0xa0, 0xe0, 0x20, 0xe0, 0x39, 0x90, 0x7f, 0x70, 0xe0, 0x70, 0x33, 0x90, 0x7f, 0x71, 0xe0, 0xc3, 0x95, 0x49, 0x70, 0x2a, 0x90, 0xc0, 0x02, 0xe0, 0xf5, 0x4b, 0xc3, 0x95, 0x49, 0xe5, 0x4b, 0x40, 0x02, 0xe5, 0x49, 0x60, 0x17, 0xfa, 0x90, 0x7f, 0x60, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x15, 0x86, 0x78, 0x80, 0xe0, 0x05, 0x86, 0xf0, 0x15, 0x86, 0xf6, 0x08, 0xda, 0xf6, 0x80, 0x18, 0x90, 0xc0, 0x02, 0xe0, 0xf5, 0x4b, 0x24, 0xfc, 0x54, 0x3f, 0x60, 0x0c, 0xfa, 0x90, 0xc0, 0x00, 0xe4, 0x78, 0x80, 0xf0, 0xf6, 0x08, 0xda, 0xfb, 0xd0, 0x00, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x01, 0xf0, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xe5, 0x4c, 0xf5, 0xf0, 0xa2, 0xe0, 0x92, 0xf2, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0x92, 0xf3, 0xa2, 0x09, 0x92, 0xf5, 0x90, 0x7e, 0x80, 0xe5, 0xf0, 0xf0, 0xe5, 0x45, 0x90, 0x7e, 0x81, 0xf0, 0x90, 0x7f, 0xe0, 0xe0, 0x90, 0x7e, 0x82, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7e, 0x83, 0xf0, 0x05, 0x44, 0xe5, 0x44, 0x90, 0x7e, 0x84, 0xf0, 0x75, 0xf0, 0x05, 0x90, 0x7e, 0x85, 0xe5, 0x5e, 0xb5, 0x5d, 0x07, 0x90, 0x7f, 0xb7, 0xe5, 0xf0, 0xf0, 0x22, 0x24, 0x4d, 0xf8, 0xe6, 0xf0, 0xa3, 0x05, 0xf0, 0xe5, 0x5e, 0x04, 0x54, 0x0f, 0xf5, 0x5e, 0x80, 0xe3, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0x12, 0x0a, 0x13, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x12, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0xc0, 0xba, 0x37, 0x61, 0x01, 0x00, 0x01, 0x02, 0x03, 0x01, 0x09, 0x02, 0xce, 0x00, 0x04, 0x01, 0x00, 0x40, 0x00, 0x09, 0x04, 0x00, 0x00, 0x01, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x09, 0x04, 0x00, 0x01, 0x01, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, 0x00, 0x08, 0x09, 0x04, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0a, 0x24, 0x01, 0x00, 0x01, 0x34, 0x00, 0x02, 0x02, 0x03, 0x0c, 0x24, 0x02, 0x01, 0x10, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x09, 0x24, 0x03, 0x02, 0x11, 0x07, 0x00, 0x03, 0x00, 0x0c, 0x24, 0x02, 0x03, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x09, 0x24, 0x03, 0x04, 0x01, 0x01, 0x00, 0x01, 0x00, 0x09, 0x04, 0x02, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x09, 0x04, 0x02, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00, 0x07, 0x24, 0x01, 0x04, 0x01, 0x01, 0x00, 0x0b, 0x24, 0x02, 0x01, 0x01, 0x01, 0x08, 0x01, 0x00, 0x00, 0x00, 0x09, 0x05, 0x88, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x07, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x03, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x09, 0x04, 0x03, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00, 0x07, 0x24, 0x01, 0x03, 0x01, 0x01, 0x00, 0x0b, 0x24, 0x02, 0x01, 0x01, 0x01, 0x08, 0x01, 0x00, 0x00, 0x00, 0x09, 0x05, 0x08, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x07, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x0d, 0xb7, 0x0d, 0xc5, 0x0d, 0xe5, 0x0d, 0x04, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x42, 0x00, 0x61, 0x00, 0x79, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x03, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x58, 0x00, 0x20, 0x00, 0x28, 0x00, 0x41, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x29, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x81, 0xc0, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0xe4, 0xf5, 0x44, 0xf5, 0x45, 0xf5, 0x4c, 0xf5, 0x5e, 0xf5, 0x5d, 0xf5, 0x86, 0xd2, 0x09, 0x75, 0x8e, 0x30, 0x75, 0x89, 0x21, 0x75, 0x88, 0x55, 0x75, 0x8d, 0x64, 0x75, 0x87, 0x00, 0x74, 0x00, 0x90, 0x7f, 0xf8, 0xf0, 0x74, 0x04, 0x90, 0x7f, 0xf0, 0xf0, 0x90, 0x7f, 0xa1, 0xe4, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0x74, 0x01, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0x74, 0x89, 0xf0, 0x90, 0x7f, 0xde, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xd7, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x02, 0xf0, 0x74, 0x22, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x82, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc3, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x28, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2a, 0xf0, 0x75, 0xa8, 0x92, 0x75, 0xe8, 0x01, 0x90, 0x7f, 0xae, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x01, 0xf0, 0x75, 0x98, 0x52, 0x75, 0x20, 0x00, 0x78, 0xe1, 0xe2, 0xa2, 0xe0, 0x92, 0x08, 0x92, 0x01, 0x90, 0xc0, 0x08, 0xe5, 0x20, 0xf0, 0x90, 0xc0, 0x0c, 0x74, 0xff, 0xf0, 0xf5, 0x60, 0x90, 0xc0, 0x0d, 0xe4, 0xf0, 0xf5, 0x61, 0x90, 0xc0, 0x0a, 0x74, 0x1f, 0xf0, 0xf5, 0x5f, 0x78, 0xf0, 0x90, 0x0d, 0xe7, 0xe2, 0x60, 0x06, 0xf0, 0xa3, 0xa3, 0x08, 0x80, 0xf7, 0xe8, 0x24, 0x11, 0x25, 0xe0, 0x90, 0x0d, 0xe5, 0xf0, 0x75, 0x48, 0x80, 0x78, 0xe0, 0xe2, 0xb4, 0x02, 0x02, 0x80, 0x4e, 0xb4, 0x03, 0x02, 0x80, 0x49, 0x24, 0xf8, 0x50, 0x0b, 0x24, 0xf0, 0x40, 0x03, 0xe2, 0x80, 0x06, 0x74, 0x18, 0x80, 0x02, 0x74, 0x08, 0xfa, 0x7b, 0x11, 0x7c, 0xc0, 0x7d, 0x5d, 0x7e, 0x00, 0xc3, 0xee, 0x9a, 0x40, 0x01, 0xfe, 0xb3, 0xec, 0x33, 0xfc, 0xed, 0x33, 0xfd, 0xee, 0x33, 0xfe, 0xdb, 0xee, 0xec, 0xc3, 0x94, 0x02, 0xfc, 0xed, 0x94, 0x00, 0xfd, 0x90, 0xc0, 0x02, 0xf0, 0xec, 0x90, 0xc0, 0x01, 0xf0, 0xc3, 0x94, 0x08, 0xf5, 0x46, 0xed, 0x94, 0x00, 0xf5, 0x47, 0xea, 0xf5, 0x49, 0x90, 0x0d, 0x6b, 0xf0, 0x90, 0x0d, 0x9f, 0xf0, 0x75, 0xf0, 0xe8, 0xa4, 0x90, 0x0d, 0x64, 0xf0, 0x90, 0x0d, 0x98, 0xf0, 0xab, 0xf0, 0xe5, 0x49, 0x75, 0xf0, 0x03, 0xa4, 0x2b, 0x90, 0x0d, 0x65, 0xf0, 0x90, 0x0d, 0x99, 0xf0, 0xe4, 0x35, 0xf0, 0x90, 0x0d, 0x66, 0xf0, 0x90, 0x0d, 0x9a, 0xf0, 0xe4, 0xf5, 0x62, 0x78, 0x63, 0x7a, 0x04, 0xf6, 0x08, 0xda, 0xfc, 0x90, 0xd1, 0x20, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x90, 0x7f, 0xd6, 0x74, 0x0a, 0xf0, 0x7a, 0x1e, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0xda, 0xf4, 0x90, 0x7f, 0xd6, 0x74, 0x06, 0xf0, 0x12, 0x0a, 0x13, 0x90, 0x7f, 0xd8, 0xe0, 0xfa, 0xe0, 0xb5, 0x02, 0x02, 0x80, 0xfa, 0x90, 0xc0, 0x01, 0xe0, 0x24, 0xfc, 0x54, 0x3f, 0x60, 0x07, 0xfa, 0x90, 0xc0, 0x00, 0xe0, 0xda, 0xfd, 0x90, 0xc0, 0x02, 0xe0, 0x24, 0xfc, 0x54, 0x3f, 0x60, 0xf6, 0xfa, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0xda, 0xfd, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0x90, 0x7f, 0xae, 0x74, 0x03, 0xf0, 0x12, 0x0a, 0x13, 0x02, 0x01, 0x57 }; baycomusb-0.10.orig/firmware/audio2firmware.h0100644000175100017510000006132307340477542017336 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/audio2firmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define audio2firmware_DATE "20010821" /* firmware */ static const unsigned char audio2firmware[] = { 0x02, 0x0d, 0x74, 0x02, 0x01, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x24, 0x00, 0x02, 0x07, 0xd2, 0x00, 0x02, 0x09, 0x1c, 0x00, 0x02, 0x09, 0x47, 0x00, 0x02, 0x09, 0x72, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x09, 0x9d, 0x00, 0x02, 0x09, 0xd8, 0x00, 0x02, 0x0a, 0x6e, 0x00, 0x02, 0x0a, 0x9c, 0x00, 0x02, 0x0a, 0xc7, 0x00, 0x02, 0x0a, 0xf2, 0x00, 0x02, 0x0b, 0x1d, 0x00, 0x02, 0x0b, 0x48, 0x00, 0x02, 0x0b, 0x73, 0x00, 0x02, 0x0b, 0x9e, 0x00, 0x02, 0x0b, 0xc9, 0x00, 0x02, 0x0b, 0xf4, 0x00, 0x02, 0x0c, 0x1f, 0x00, 0x02, 0x0c, 0x4a, 0x00, 0x02, 0x0c, 0x75, 0x00, 0x02, 0x0c, 0xa0, 0xe5, 0x4c, 0xa2, 0xe0, 0x92, 0x00, 0x92, 0x02, 0xb3, 0x82, 0x08, 0x92, 0x01, 0x90, 0xc0, 0x08, 0xe5, 0x20, 0xf0, 0x02, 0x01, 0x57, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x89, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8d, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0x10, 0x98, 0x16, 0x10, 0x99, 0x0f, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xd2, 0x09, 0x80, 0xea, 0xe5, 0x5d, 0x24, 0x4d, 0xf8, 0xe5, 0x99, 0xf6, 0xe5, 0x5d, 0x04, 0x54, 0x0f, 0xf5, 0x5d, 0x80, 0xdc, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xcf, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdc, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xc0, 0xc2, 0xc1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe5, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe6, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe7, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdb, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x75, 0x40, 0x00, 0x90, 0x7f, 0xe9, 0xe0, 0xb4, 0x06, 0x59, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x4f, 0x90, 0x7f, 0xeb, 0xe0, 0xb4, 0x01, 0x0c, 0x90, 0x7f, 0xd4, 0x74, 0x0c, 0xf0, 0xa3, 0x74, 0xcb, 0xf0, 0x80, 0x39, 0xb4, 0x02, 0x12, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x33, 0x90, 0x7f, 0xd4, 0x74, 0x0c, 0xf0, 0xa3, 0x74, 0xdd, 0xf0, 0x80, 0x24, 0xb4, 0x03, 0x24, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfc, 0x40, 0x1c, 0xe0, 0x25, 0xe0, 0x24, 0x18, 0xf5, 0x82, 0xe4, 0x34, 0x0d, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x90, 0x7f, 0xd4, 0xf0, 0xa3, 0xe5, 0xf0, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0x09, 0x41, 0x90, 0x7f, 0xe8, 0xe0, 0x70, 0xf4, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfe, 0x40, 0xec, 0xe0, 0xf5, 0x62, 0x90, 0x7f, 0xd7, 0x78, 0x07, 0xe8, 0x44, 0x10, 0xf0, 0x44, 0x30, 0xf0, 0xe8, 0xf0, 0x44, 0x20, 0xf0, 0xd8, 0xf2, 0xe4, 0xf0, 0x74, 0x02, 0x90, 0x7f, 0xb6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x90, 0x7f, 0xc6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x12, 0x0a, 0x13, 0x80, 0xb6, 0xb4, 0x0b, 0x1e, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x01, 0xaf, 0xe5, 0x62, 0xb4, 0x01, 0xaa, 0x90, 0x7f, 0xec, 0xe0, 0x24, 0xfc, 0x40, 0xa2, 0x24, 0x67, 0xf8, 0x90, 0x7f, 0xea, 0xe0, 0xf6, 0x80, 0xaf, 0xb4, 0x0a, 0x24, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x81, 0x8e, 0xe5, 0x62, 0xb4, 0x01, 0x89, 0x90, 0x7f, 0xec, 0xe0, 0x24, 0xfc, 0x40, 0x81, 0x24, 0x67, 0xf8, 0xe6, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x80, 0x4e, 0xb4, 0x08, 0x0b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x47, 0xe5, 0x62, 0x80, 0xe6, 0x70, 0x44, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x11, 0x74, 0x01, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x80, 0x26, 0xb4, 0x81, 0x03, 0xe4, 0x80, 0xeb, 0xb4, 0x82, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x03, 0x90, 0x7f, 0xb4, 0x54, 0x0f, 0x60, 0x0f, 0x20, 0xe3, 0x0c, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe0, 0x80, 0xcb, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0x03, 0x05, 0x75, 0xf0, 0x01, 0x80, 0x06, 0xb4, 0x01, 0x44, 0x75, 0xf0, 0x00, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x02, 0xe8, 0xa3, 0xa3, 0xe0, 0x70, 0xe3, 0xa3, 0xe0, 0x70, 0xdf, 0xa3, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x05, 0x90, 0x7f, 0xb4, 0x44, 0x10, 0x20, 0xe3, 0xcf, 0x54, 0x1f, 0x05, 0x86, 0x90, 0x7f, 0xd7, 0xf0, 0x44, 0x20, 0xf0, 0x54, 0x0f, 0xf0, 0x15, 0x86, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0xf0, 0x80, 0xb1, 0x02, 0x05, 0x6e, 0x02, 0x07, 0xb3, 0xb4, 0xc0, 0xf7, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0xf3, 0xe5, 0x4c, 0xf5, 0xf0, 0xa2, 0xe0, 0x92, 0xf2, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0xb3, 0x92, 0xf3, 0xa2, 0x09, 0x92, 0xf5, 0xe4, 0x90, 0x7f, 0x04, 0xf0, 0x90, 0x7f, 0x00, 0xe5, 0xf0, 0xf0, 0xe4, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7f, 0x03, 0xf0, 0x05, 0x44, 0xe5, 0x44, 0x90, 0x7f, 0x05, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xf0, 0x90, 0xc0, 0x01, 0xe0, 0x90, 0x7f, 0x12, 0xf0, 0x90, 0xc0, 0x02, 0xe0, 0x90, 0x7f, 0x13, 0xf0, 0xe5, 0x20, 0xa3, 0xf0, 0x90, 0xc0, 0x09, 0xe0, 0x90, 0x7f, 0x15, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x90, 0x7f, 0x16, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xe9, 0x50, 0x01, 0xe4, 0x24, 0x17, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0xb4, 0xc8, 0x19, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x0f, 0x74, 0x04, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xc9, 0x21, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x17, 0x90, 0x7f, 0x00, 0x78, 0xf0, 0xe2, 0x60, 0x05, 0xf0, 0x08, 0xa3, 0x80, 0xf8, 0xe8, 0x24, 0x10, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xd0, 0x45, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x3b, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x08, 0x90, 0x7f, 0xea, 0xe0, 0x54, 0x01, 0xf5, 0x4c, 0x90, 0x7f, 0x00, 0xe5, 0x4c, 0xf0, 0x90, 0xc0, 0x09, 0xe0, 0x54, 0x01, 0x64, 0x01, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfd, 0x50, 0x01, 0xe4, 0x24, 0x03, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xd2, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x16, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0xf0, 0x90, 0x7f, 0x98, 0xe0, 0xa2, 0xf0, 0x92, 0xe3, 0xa2, 0xf1, 0x92, 0xe5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xd3, 0x16, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x07, 0x90, 0x7f, 0xea, 0xe0, 0x10, 0x09, 0x03, 0x02, 0x07, 0xb3, 0xf5, 0x99, 0x02, 0x07, 0xb7, 0xb4, 0xd4, 0x49, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x3f, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xea, 0xb4, 0x01, 0x09, 0xe0, 0x90, 0xc0, 0x0d, 0xf0, 0xf5, 0x61, 0x80, 0x0a, 0xb4, 0x02, 0x07, 0xe0, 0x90, 0xc0, 0x0c, 0xf0, 0xf5, 0x60, 0x90, 0xc0, 0x0e, 0xe0, 0x90, 0x7f, 0x00, 0xf0, 0xe5, 0x61, 0xa3, 0xf0, 0xe5, 0x60, 0xa3, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfd, 0x50, 0x01, 0xe4, 0x24, 0x03, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xd5, 0x3f, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x32, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x0a, 0x90, 0x7f, 0xea, 0xe0, 0x90, 0xc0, 0x0a, 0xf0, 0xf5, 0x5f, 0x90, 0xc0, 0x0b, 0xe0, 0x90, 0x7f, 0x00, 0xf0, 0xe5, 0x5f, 0xa3, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xfe, 0x50, 0x01, 0xe4, 0x24, 0x02, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0x02, 0x07, 0x53, 0xb4, 0xe0, 0xfa, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0xf0, 0x90, 0x7f, 0xec, 0xe0, 0xb4, 0x01, 0x12, 0x90, 0x7f, 0xea, 0xe0, 0x54, 0x78, 0xc5, 0x20, 0x54, 0x07, 0x45, 0x20, 0xf5, 0x20, 0x90, 0xc0, 0x08, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x60, 0x0d, 0xb4, 0x01, 0x11, 0xe5, 0x20, 0x90, 0x7f, 0x00, 0x54, 0x7f, 0xf0, 0x74, 0x01, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x90, 0xc0, 0x08, 0xd2, 0x07, 0xe5, 0x20, 0xf0, 0x90, 0xc0, 0x05, 0xe0, 0x90, 0x7f, 0x04, 0xf0, 0x90, 0xc0, 0x06, 0xe0, 0x90, 0x7f, 0x05, 0xf0, 0x90, 0xc0, 0x07, 0xe0, 0x90, 0x7f, 0x06, 0xf0, 0x90, 0xc0, 0x08, 0xc2, 0x07, 0xe5, 0x20, 0xf0, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0xc0, 0x05, 0xe0, 0x90, 0x7f, 0x01, 0xf0, 0x90, 0xc0, 0x06, 0xe0, 0x90, 0x7f, 0x02, 0xf0, 0x90, 0xc0, 0x07, 0xe0, 0x90, 0x7f, 0x03, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xf9, 0x50, 0x01, 0xe4, 0x24, 0x07, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0xb4, 0xe1, 0x3a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x30, 0x90, 0x7f, 0x00, 0xe5, 0x45, 0xf0, 0xa3, 0xe5, 0x49, 0xf0, 0xa3, 0xe5, 0x46, 0xf0, 0xa3, 0xe5, 0x47, 0xf0, 0xa3, 0xe5, 0x48, 0xf0, 0xa3, 0xe5, 0x4a, 0xf0, 0xa3, 0xe5, 0x4b, 0xf0, 0x90, 0x7f, 0xee, 0xe0, 0x24, 0xf9, 0x50, 0x01, 0xe4, 0x24, 0x07, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0xb4, 0xe2, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x16, 0x90, 0x7f, 0x00, 0x78, 0x80, 0xaf, 0x49, 0xe6, 0xf0, 0x08, 0xa3, 0xdf, 0xfa, 0x90, 0x7f, 0xb5, 0xe5, 0x49, 0xf0, 0x02, 0x07, 0xb7, 0x02, 0x07, 0xb3, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0x05, 0x45, 0xe5, 0x49, 0xb4, 0x02, 0x14, 0x90, 0x7f, 0xd8, 0xe0, 0xa3, 0x05, 0x86, 0x90, 0x7f, 0x68, 0xf0, 0x15, 0x86, 0xe0, 0x05, 0x86, 0xf0, 0x02, 0x09, 0x05, 0xb4, 0x03, 0x36, 0x90, 0x7f, 0xa0, 0xe0, 0x20, 0xe0, 0x23, 0x90, 0x7f, 0x70, 0xe0, 0x70, 0x1d, 0x90, 0x7f, 0x71, 0xe0, 0xb4, 0x03, 0x16, 0xfa, 0x90, 0x7f, 0x60, 0x05, 0x86, 0x90, 0x7f, 0x68, 0x15, 0x86, 0xe0, 0x05, 0x86, 0xf0, 0x15, 0x86, 0xda, 0xf8, 0x02, 0x09, 0x05, 0x7a, 0x03, 0x90, 0x7f, 0x68, 0xe4, 0xf0, 0xda, 0xfd, 0x02, 0x09, 0x05, 0x90, 0xc0, 0x01, 0xe0, 0xc3, 0x95, 0x49, 0xe0, 0x40, 0x02, 0xe5, 0x49, 0xfa, 0xfb, 0x60, 0x12, 0x90, 0xc0, 0x00, 0x05, 0x86, 0x90, 0x7f, 0x68, 0x15, 0x86, 0xe0, 0x05, 0x86, 0xf0, 0x15, 0x86, 0xda, 0xf8, 0xe5, 0x49, 0xc3, 0x9b, 0x60, 0x08, 0xfa, 0x90, 0x7f, 0x68, 0xe4, 0xf0, 0xda, 0xfd, 0x90, 0xc0, 0x01, 0xe0, 0xf5, 0x4a, 0x24, 0xfc, 0x60, 0x05, 0x33, 0x95, 0xe0, 0xd2, 0xe0, 0xfb, 0x25, 0x48, 0x60, 0x02, 0xf5, 0x48, 0xe5, 0x48, 0x03, 0x03, 0x03, 0x03, 0x54, 0x0f, 0x2b, 0x25, 0x46, 0xfa, 0xe5, 0x47, 0x34, 0x00, 0x90, 0xc0, 0x02, 0xf0, 0xea, 0x90, 0xc0, 0x01, 0xf0, 0x90, 0x7f, 0xa0, 0xe0, 0x20, 0xe0, 0x39, 0x90, 0x7f, 0x70, 0xe0, 0x70, 0x33, 0x90, 0x7f, 0x71, 0xe0, 0xc3, 0x95, 0x49, 0x70, 0x2a, 0x90, 0xc0, 0x02, 0xe0, 0xf5, 0x4b, 0xc3, 0x95, 0x49, 0xe5, 0x4b, 0x40, 0x02, 0xe5, 0x49, 0x60, 0x17, 0xfa, 0x90, 0x7f, 0x60, 0x05, 0x86, 0x90, 0xc0, 0x00, 0x15, 0x86, 0x78, 0x80, 0xe0, 0x05, 0x86, 0xf0, 0x15, 0x86, 0xf6, 0x08, 0xda, 0xf6, 0x80, 0x18, 0x90, 0xc0, 0x02, 0xe0, 0xf5, 0x4b, 0x24, 0xfc, 0x54, 0x3f, 0x60, 0x0c, 0xfa, 0x90, 0xc0, 0x00, 0xe4, 0x78, 0x80, 0xf0, 0xf6, 0x08, 0xda, 0xfb, 0xd0, 0x00, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x01, 0xf0, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xe5, 0x4c, 0xf5, 0xf0, 0xa2, 0xe0, 0x92, 0xf2, 0x90, 0xc0, 0x09, 0xe0, 0xa2, 0xe0, 0x92, 0xf3, 0xa2, 0x09, 0x92, 0xf5, 0x90, 0x7e, 0x80, 0xe5, 0xf0, 0xf0, 0xe5, 0x45, 0x90, 0x7e, 0x81, 0xf0, 0x90, 0x7f, 0xe0, 0xe0, 0x90, 0x7e, 0x82, 0xf0, 0x90, 0xc0, 0x04, 0xe0, 0x90, 0x7e, 0x83, 0xf0, 0x05, 0x44, 0xe5, 0x44, 0x90, 0x7e, 0x84, 0xf0, 0x75, 0xf0, 0x05, 0x90, 0x7e, 0x85, 0xe5, 0x5e, 0xb5, 0x5d, 0x07, 0x90, 0x7f, 0xb7, 0xe5, 0xf0, 0xf0, 0x22, 0x24, 0x4d, 0xf8, 0xe6, 0xf0, 0xa3, 0x05, 0xf0, 0xe5, 0x5e, 0x04, 0x54, 0x0f, 0xf5, 0x5e, 0x80, 0xe3, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0x12, 0x0a, 0x13, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x12, 0x01, 0x00, 0x01, 0xff, 0x00, 0xff, 0x40, 0xc0, 0xba, 0x37, 0x61, 0x01, 0x00, 0x01, 0x02, 0x03, 0x01, 0x09, 0x02, 0x3b, 0x00, 0x01, 0x01, 0x00, 0x40, 0x00, 0x09, 0x04, 0x00, 0x00, 0x01, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x09, 0x04, 0x00, 0x01, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, 0x00, 0x08, 0x09, 0x05, 0x88, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x09, 0x05, 0x08, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x20, 0x0d, 0x24, 0x0d, 0x32, 0x0d, 0x52, 0x0d, 0x04, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x42, 0x00, 0x61, 0x00, 0x79, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x03, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x58, 0x00, 0x20, 0x00, 0x28, 0x00, 0x41, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x29, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x81, 0xc0, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0xe4, 0xf5, 0x44, 0xf5, 0x45, 0xf5, 0x4c, 0xf5, 0x5e, 0xf5, 0x5d, 0xf5, 0x86, 0xd2, 0x09, 0x75, 0x8e, 0x30, 0x75, 0x89, 0x21, 0x75, 0x88, 0x55, 0x75, 0x8d, 0x64, 0x75, 0x87, 0x00, 0x74, 0x00, 0x90, 0x7f, 0xf8, 0xf0, 0x74, 0x04, 0x90, 0x7f, 0xf0, 0xf0, 0x90, 0x7f, 0xa1, 0xe4, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0x74, 0x01, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0x74, 0x89, 0xf0, 0x90, 0x7f, 0xde, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xd7, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x02, 0xf0, 0x74, 0x22, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x82, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0xc3, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x28, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2a, 0xf0, 0x75, 0xa8, 0x92, 0x75, 0xe8, 0x01, 0x90, 0x7f, 0xae, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x01, 0xf0, 0x75, 0x98, 0x52, 0x75, 0x20, 0x00, 0x78, 0xe1, 0xe2, 0xa2, 0xe0, 0x92, 0x08, 0x92, 0x01, 0x90, 0xc0, 0x08, 0xe5, 0x20, 0xf0, 0x90, 0xc0, 0x0c, 0x74, 0xff, 0xf0, 0xf5, 0x60, 0x90, 0xc0, 0x0d, 0xe4, 0xf0, 0xf5, 0x61, 0x90, 0xc0, 0x0a, 0x74, 0x1f, 0xf0, 0xf5, 0x5f, 0x78, 0xf0, 0x90, 0x0d, 0x54, 0xe2, 0x60, 0x06, 0xf0, 0xa3, 0xa3, 0x08, 0x80, 0xf7, 0xe8, 0x24, 0x11, 0x25, 0xe0, 0x90, 0x0d, 0x52, 0xf0, 0x75, 0x48, 0x80, 0x78, 0xe0, 0xe2, 0xb4, 0x02, 0x02, 0x80, 0x4e, 0xb4, 0x03, 0x02, 0x80, 0x49, 0x24, 0xf8, 0x50, 0x0b, 0x24, 0xf0, 0x40, 0x03, 0xe2, 0x80, 0x06, 0x74, 0x18, 0x80, 0x02, 0x74, 0x08, 0xfa, 0x7b, 0x11, 0x7c, 0xc0, 0x7d, 0x5d, 0x7e, 0x00, 0xc3, 0xee, 0x9a, 0x40, 0x01, 0xfe, 0xb3, 0xec, 0x33, 0xfc, 0xed, 0x33, 0xfd, 0xee, 0x33, 0xfe, 0xdb, 0xee, 0xec, 0xc3, 0x94, 0x02, 0xfc, 0xed, 0x94, 0x00, 0xfd, 0x90, 0xc0, 0x02, 0xf0, 0xec, 0x90, 0xc0, 0x01, 0xf0, 0xc3, 0x94, 0x08, 0xf5, 0x46, 0xed, 0x94, 0x00, 0xf5, 0x47, 0xea, 0xf5, 0x49, 0x90, 0x0d, 0x0a, 0xf0, 0x90, 0x0d, 0x13, 0xf0, 0xe4, 0xf5, 0x62, 0x78, 0x63, 0x7a, 0x04, 0xf6, 0x08, 0xda, 0xfc, 0x90, 0xd1, 0x20, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x90, 0x7f, 0xd6, 0x74, 0x0a, 0xf0, 0x7a, 0x1e, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0xda, 0xf4, 0x90, 0x7f, 0xd6, 0x74, 0x06, 0xf0, 0x12, 0x0a, 0x13, 0x90, 0x7f, 0xd8, 0xe0, 0xfa, 0xe0, 0xb5, 0x02, 0x02, 0x80, 0xfa, 0x90, 0xc0, 0x01, 0xe0, 0x24, 0xfc, 0x54, 0x3f, 0x60, 0x07, 0xfa, 0x90, 0xc0, 0x00, 0xe0, 0xda, 0xfd, 0x90, 0xc0, 0x02, 0xe0, 0x24, 0xfc, 0x54, 0x3f, 0x60, 0xf6, 0xfa, 0x90, 0xc0, 0x00, 0xe4, 0xf0, 0xda, 0xfd, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0x90, 0x7f, 0xae, 0x74, 0x03, 0xf0, 0x12, 0x0a, 0x13, 0x02, 0x01, 0x57 }; baycomusb-0.10.orig/firmware/bscanfirmware.h0100644000175100017510000006421607340477542017245 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/bscanfirmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define bscanfirmware_DATE "20010821" /* firmware */ static const unsigned char bscanfirmware[] = { 0x02, 0x09, 0x17, 0x02, 0x01, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x03, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x00, 0x00, 0x02, 0x03, 0xb9, 0x00, 0x02, 0x05, 0x17, 0x00, 0x02, 0x05, 0x42, 0x00, 0x02, 0x05, 0x6d, 0x00, 0x02, 0x05, 0x98, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x05, 0xc3, 0x00, 0x02, 0x06, 0x19, 0x00, 0x02, 0x06, 0xba, 0x00, 0x02, 0x06, 0xe8, 0x00, 0x02, 0x07, 0x13, 0x00, 0x02, 0x07, 0x3e, 0x00, 0x02, 0x07, 0x69, 0x00, 0x02, 0x07, 0x94, 0x00, 0x02, 0x07, 0xbf, 0x00, 0x02, 0x07, 0xea, 0x00, 0x02, 0x08, 0x15, 0x00, 0x02, 0x08, 0x40, 0x00, 0x02, 0x08, 0x6b, 0x00, 0x02, 0x08, 0x96, 0x00, 0x02, 0x08, 0xc1, 0x00, 0x02, 0x08, 0xec, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0xff, 0x7e, 0x01, 0x7f, 0x00, 0x74, 0x02, 0xcb, 0x13, 0xcb, 0x92, 0xe6, 0xcc, 0x13, 0xcc, 0x92, 0xe7, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe0, 0x03, 0xee, 0x42, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xee, 0x23, 0xfe, 0xda, 0xd7, 0x22, 0x75, 0x86, 0x00, 0x90, 0x10, 0x00, 0x78, 0x2a, 0x7a, 0x08, 0xe0, 0xfb, 0x7c, 0x00, 0xc0, 0x82, 0xc0, 0x83, 0x12, 0x01, 0x5d, 0xd0, 0x83, 0xd0, 0x82, 0xef, 0xf0, 0xa3, 0xd8, 0xea, 0x7a, 0x08, 0xe0, 0xfb, 0x7c, 0x80, 0xc0, 0x82, 0xc0, 0x83, 0x12, 0x01, 0x5d, 0xd0, 0x83, 0xd0, 0x82, 0xef, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x89, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8d, 0x05, 0x44, 0xe5, 0x44, 0x54, 0x07, 0x70, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0x64, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x98, 0xc2, 0x99, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xcf, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdc, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xc0, 0xc2, 0xc1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe5, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe6, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe7, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdb, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xe5, 0x49, 0x45, 0x4a, 0x70, 0x0a, 0xe4, 0xf5, 0x46, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0x22, 0xe5, 0x49, 0xff, 0x24, 0xc0, 0xf5, 0x49, 0xe5, 0x4a, 0x34, 0xff, 0x40, 0x0a, 0xe4, 0xf5, 0x49, 0xf5, 0x4a, 0xef, 0x60, 0xe1, 0x80, 0x04, 0xf5, 0x4a, 0x74, 0x40, 0xff, 0xf8, 0x85, 0x47, 0x82, 0x85, 0x48, 0x83, 0x75, 0x86, 0x01, 0x90, 0x7f, 0x00, 0x15, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xd8, 0xf6, 0x85, 0x82, 0x47, 0x85, 0x83, 0x48, 0xef, 0x90, 0x7f, 0xb5, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x75, 0x46, 0x00, 0x90, 0x7f, 0xe9, 0xe0, 0xb4, 0xb1, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x34, 0x90, 0x7f, 0x00, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x81, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0x7f, 0xdf, 0xe0, 0xd0, 0x83, 0xd0, 0x82, 0xf0, 0xa3, 0x74, 0x00, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0x7f, 0xc8, 0xe0, 0xd0, 0x83, 0xd0, 0x82, 0xf0, 0xa3, 0x90, 0x7f, 0xb5, 0x74, 0x04, 0xf0, 0x02, 0x04, 0xfc, 0x02, 0x04, 0xf8, 0xb4, 0xb2, 0x2b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x21, 0x90, 0x7f, 0x00, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x45, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x05, 0xf0, 0x05, 0x45, 0x02, 0x04, 0xfc, 0x02, 0x04, 0xf8, 0xb4, 0xb8, 0x3d, 0xe5, 0x40, 0xb4, 0x20, 0xf5, 0x90, 0x7f, 0xee, 0xe0, 0xb4, 0x2b, 0xee, 0xa3, 0xe0, 0xb4, 0x00, 0xe9, 0x75, 0x47, 0x00, 0x75, 0x48, 0x10, 0x75, 0x49, 0x2b, 0x75, 0x4a, 0x00, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x0a, 0x75, 0x46, 0x01, 0x90, 0x7f, 0xc5, 0xf0, 0x02, 0x05, 0x02, 0xb4, 0xc0, 0x09, 0x75, 0x46, 0x02, 0x12, 0x03, 0x68, 0x02, 0x05, 0x02, 0x02, 0x04, 0xf8, 0xb4, 0xb9, 0x17, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0xf3, 0xe5, 0x40, 0xb4, 0x20, 0xee, 0x75, 0x40, 0x21, 0x90, 0x7f, 0xb5, 0xe4, 0xf0, 0x02, 0x04, 0xfc, 0xb4, 0xc8, 0x19, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x0f, 0x74, 0x05, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x02, 0x04, 0xfc, 0x02, 0x04, 0xf8, 0xb4, 0xc9, 0x2a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x20, 0x90, 0x7f, 0x00, 0x05, 0x86, 0x90, 0x00, 0xf2, 0x7f, 0x06, 0xe0, 0xa3, 0xa3, 0x15, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0xdf, 0xf5, 0x15, 0x86, 0x74, 0x06, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x04, 0xfc, 0x02, 0x04, 0xf8, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0xe5, 0x46, 0xb4, 0x02, 0x05, 0x12, 0x03, 0x68, 0x80, 0x11, 0x90, 0x7f, 0xb5, 0xe4, 0xf0, 0x80, 0x04, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x01, 0xf0, 0xe5, 0x46, 0xb4, 0x01, 0x36, 0x90, 0x7f, 0xc5, 0xe0, 0x60, 0x28, 0xff, 0xc3, 0xe5, 0x49, 0x9f, 0xf5, 0x49, 0xe5, 0x4a, 0x94, 0x00, 0xf5, 0x4a, 0x40, 0x21, 0x90, 0x7e, 0xc0, 0x85, 0x47, 0x84, 0x85, 0x48, 0x85, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xdf, 0xf6, 0x85, 0x84, 0x47, 0x85, 0x85, 0x48, 0xe5, 0x49, 0x45, 0x4a, 0x60, 0x09, 0x80, 0x10, 0x75, 0x46, 0x00, 0x74, 0x03, 0x80, 0x05, 0x75, 0x46, 0x00, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x90, 0x7e, 0x80, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x45, 0xf0, 0x90, 0x7f, 0xb7, 0x74, 0x05, 0xf0, 0x05, 0x45, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0x12, 0x06, 0x9b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x75, 0x81, 0x80, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0xe4, 0xf5, 0x40, 0xf5, 0x41, 0xf5, 0x42, 0xf5, 0x43, 0xf5, 0x45, 0xf5, 0x46, 0x75, 0x8e, 0x31, 0x75, 0x89, 0x21, 0x75, 0x88, 0x55, 0x75, 0x8d, 0x64, 0x75, 0x87, 0x00, 0x90, 0x7f, 0xa1, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0xe4, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0x74, 0x09, 0xf0, 0x90, 0x7f, 0xde, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x05, 0xf0, 0x90, 0x7f, 0xd7, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x02, 0xf0, 0x74, 0x22, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2e, 0xf0, 0x75, 0xa8, 0x82, 0x75, 0xe8, 0x01, 0x90, 0x7f, 0xae, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x03, 0xf0, 0x75, 0x98, 0x20, 0x75, 0x99, 0xff, 0x12, 0x06, 0x9b, 0x90, 0x7f, 0x96, 0x74, 0x82, 0xf0, 0x90, 0x7f, 0x99, 0xe0, 0x30, 0xe2, 0x06, 0x75, 0x40, 0x80, 0x02, 0x0a, 0x3d, 0x12, 0x01, 0x57, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0x06, 0x12, 0x01, 0x5d, 0x7a, 0x08, 0x7b, 0x00, 0x7c, 0x00, 0x12, 0x01, 0x5d, 0x7a, 0x08, 0x7b, 0x01, 0x7c, 0x00, 0x12, 0x01, 0x5d, 0x74, 0xf8, 0x2f, 0x60, 0x08, 0x75, 0x40, 0x81, 0x8f, 0x41, 0x02, 0x0a, 0x3d, 0x7a, 0x07, 0x7b, 0x01, 0x7c, 0x1c, 0x12, 0x01, 0x5d, 0x12, 0x01, 0x8b, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0x07, 0x12, 0x01, 0x5d, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0x0c, 0x12, 0x01, 0x5d, 0x75, 0x40, 0x20, 0xe5, 0x40, 0xb4, 0x21, 0xfb, 0x7a, 0x03, 0x7b, 0x00, 0x7c, 0x01, 0x12, 0x01, 0x5d, 0x12, 0x01, 0x8b, 0x7a, 0x02, 0x7b, 0x00, 0x7c, 0x01, 0x12, 0x01, 0x5d, 0x80, 0xe1, 0x80, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; baycomusb-0.10.orig/firmware/dlfirmware.h0100644000175100017510000004623707340477542016561 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/dlfirmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define dlfirmware_DATE "20010821" /* firmware */ static const unsigned char dlfirmware[] = { 0x02, 0x09, 0xab, 0x02, 0x02, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x29, 0x00, 0x02, 0x05, 0x94, 0x00, 0x02, 0x05, 0xbf, 0x00, 0x02, 0x05, 0xea, 0x00, 0x02, 0x06, 0x15, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x06, 0x40, 0x00, 0x02, 0x06, 0x96, 0x00, 0x02, 0x07, 0x4e, 0x00, 0x02, 0x07, 0x7c, 0x00, 0x02, 0x07, 0xa7, 0x00, 0x02, 0x07, 0xd2, 0x00, 0x02, 0x07, 0xfd, 0x00, 0x02, 0x08, 0x28, 0x00, 0x02, 0x08, 0x53, 0x00, 0x02, 0x08, 0x7e, 0x00, 0x02, 0x08, 0xa9, 0x00, 0x02, 0x08, 0xd4, 0x00, 0x02, 0x08, 0xff, 0x00, 0x02, 0x09, 0x2a, 0x00, 0x02, 0x09, 0x55, 0x00, 0x02, 0x09, 0x80, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0xff, 0x7e, 0x01, 0x7f, 0x00, 0x74, 0x02, 0xcb, 0x13, 0xcb, 0x92, 0xe6, 0xcc, 0x13, 0xcc, 0x92, 0xe7, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe0, 0x03, 0xee, 0x42, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xee, 0x23, 0xfe, 0xda, 0xd7, 0x22, 0x10, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xc2, 0xf0, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0xa6, 0xe5, 0xf0, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x20, 0x30, 0xe0, 0xf9, 0x30, 0xe1, 0x0f, 0x90, 0x7f, 0xa6, 0x15, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x90, 0x7f, 0xa5, 0xdf, 0xe7, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xef, 0x22, 0x7f, 0xff, 0x80, 0xf1, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xd2, 0xf0, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0xa6, 0xe5, 0xf0, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x4c, 0x30, 0xe0, 0xf9, 0x30, 0xe1, 0x03, 0xef, 0x70, 0x0b, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xe4, 0x22, 0xb4, 0x01, 0x03, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x27, 0x30, 0xe0, 0xf9, 0xef, 0xb4, 0x02, 0x03, 0x74, 0x20, 0xf0, 0xb4, 0x01, 0x03, 0x74, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0x15, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xdf, 0xdd, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xe4, 0x22, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x74, 0xff, 0x15, 0x86, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x89, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8d, 0x05, 0x44, 0xe5, 0x44, 0x54, 0x07, 0x70, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0x64, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x98, 0xc2, 0x99, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xcf, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdc, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xc0, 0xc2, 0xc1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe5, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe6, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe7, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdb, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xe5, 0x49, 0xff, 0x24, 0xc0, 0xf5, 0x49, 0xe5, 0x4a, 0x34, 0x00, 0x50, 0x12, 0xe4, 0xf5, 0x49, 0xf5, 0x4a, 0xf5, 0x46, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xef, 0x60, 0x25, 0x80, 0x04, 0xf5, 0x4a, 0x7f, 0x40, 0x8f, 0x00, 0x85, 0x47, 0x82, 0x85, 0x48, 0x83, 0x05, 0x86, 0x90, 0x7f, 0x00, 0x15, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xd8, 0xf6, 0x85, 0x82, 0x47, 0x85, 0x83, 0x48, 0xef, 0x90, 0x7f, 0xb5, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x75, 0x46, 0x00, 0x90, 0x7f, 0xe9, 0xe0, 0xb4, 0xa3, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x47, 0xa3, 0xe0, 0xf5, 0x48, 0x24, 0x50, 0x50, 0x2d, 0x90, 0x7f, 0xee, 0xe0, 0xf5, 0x49, 0x25, 0x47, 0xa3, 0xe0, 0xf5, 0x4a, 0x35, 0x48, 0x40, 0x1d, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x0a, 0x75, 0x46, 0x01, 0x90, 0x7f, 0xc5, 0xf0, 0x02, 0x05, 0x7f, 0xb4, 0xc0, 0x09, 0x75, 0x46, 0x02, 0x12, 0x03, 0xe1, 0x02, 0x05, 0x7f, 0x02, 0x05, 0x75, 0xb4, 0xb1, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x34, 0x90, 0x7f, 0x00, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x81, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0x7f, 0xdf, 0xe0, 0xd0, 0x83, 0xd0, 0x82, 0xf0, 0xa3, 0x74, 0x00, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0x7f, 0xc8, 0xe0, 0xd0, 0x83, 0xd0, 0x82, 0xf0, 0xa3, 0x90, 0x7f, 0xb5, 0x74, 0x04, 0xf0, 0x02, 0x05, 0x79, 0x02, 0x05, 0x75, 0xb4, 0xb2, 0x2b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x21, 0x90, 0x7f, 0x00, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x45, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x05, 0xf0, 0x05, 0x45, 0x02, 0x05, 0x79, 0x02, 0x05, 0x75, 0xb4, 0xb3, 0x2a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x20, 0x75, 0xf0, 0xa0, 0x90, 0x01, 0x8b, 0x7f, 0x01, 0x12, 0x01, 0x8c, 0x70, 0x13, 0x90, 0x7f, 0x00, 0x7f, 0x06, 0x12, 0x01, 0xc7, 0x70, 0x09, 0x74, 0x06, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x05, 0x79, 0x02, 0x05, 0x75, 0xb4, 0xb4, 0x3f, 0x90, 0x7f, 0xef, 0xe0, 0x70, 0x36, 0x90, 0x7f, 0xee, 0xe0, 0xf8, 0xff, 0x24, 0xc0, 0x40, 0x2c, 0x90, 0x7f, 0xec, 0xe0, 0xf5, 0xf0, 0xf5, 0x47, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x0a, 0x75, 0x46, 0x02, 0x90, 0x7f, 0xc5, 0xf0, 0x02, 0x05, 0x7f, 0xb4, 0xc0, 0x10, 0x90, 0x7f, 0x00, 0x12, 0x01, 0xc7, 0x70, 0x08, 0xe8, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x05, 0x79, 0x02, 0x05, 0x75, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0xe5, 0x46, 0xb4, 0x02, 0x05, 0x12, 0x03, 0xe1, 0x80, 0x11, 0x90, 0x7f, 0xb5, 0xe4, 0xf0, 0x80, 0x04, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x01, 0xf0, 0xe5, 0x46, 0xb4, 0x01, 0x36, 0x90, 0x7f, 0xc5, 0xe0, 0x60, 0x28, 0xff, 0xc3, 0xe5, 0x49, 0x9f, 0xf5, 0x49, 0xe5, 0x4a, 0x94, 0x00, 0xf5, 0x4a, 0x40, 0x38, 0x90, 0x7e, 0xc0, 0x85, 0x47, 0x84, 0x85, 0x48, 0x85, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xdf, 0xf6, 0x85, 0x84, 0x47, 0x85, 0x85, 0x48, 0xe5, 0x49, 0x45, 0x4a, 0x60, 0x20, 0x80, 0x27, 0xb4, 0x02, 0x14, 0x90, 0x7f, 0xc5, 0xe0, 0x60, 0x15, 0xff, 0x85, 0x47, 0xf0, 0x90, 0x7e, 0xc0, 0x12, 0x01, 0x8c, 0x70, 0x02, 0x80, 0x07, 0x75, 0x46, 0x00, 0x74, 0x03, 0x80, 0x05, 0x75, 0x46, 0x00, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x90, 0x7e, 0x80, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x45, 0xf0, 0x90, 0x7f, 0xb7, 0x74, 0x05, 0xf0, 0x05, 0x45, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0x12, 0x07, 0x2f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x75, 0x81, 0xb0, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0xe4, 0xf5, 0x40, 0xf5, 0x41, 0xf5, 0x42, 0xf5, 0x43, 0xf5, 0x45, 0xf5, 0x46, 0x75, 0x8e, 0x31, 0x75, 0x89, 0x21, 0x75, 0x88, 0x55, 0x75, 0x8d, 0x64, 0x75, 0x87, 0x00, 0x90, 0xf4, 0x48, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x90, 0x7f, 0xa1, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0xe4, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0x74, 0x09, 0xf0, 0x90, 0x7f, 0xde, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x05, 0xf0, 0x90, 0x7f, 0xd7, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x02, 0xf0, 0x74, 0x22, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2e, 0xf0, 0x75, 0xa8, 0x82, 0x75, 0xe8, 0x01, 0x90, 0x7f, 0xae, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x01, 0xf0, 0x75, 0x98, 0x20, 0x75, 0x99, 0xff, 0x12, 0x07, 0x2f, 0x90, 0x7f, 0x96, 0x74, 0x82, 0xf0, 0x90, 0x7f, 0x99, 0xe0, 0x30, 0xe2, 0x06, 0x75, 0x40, 0x80, 0x02, 0x0b, 0x9c, 0x12, 0x01, 0x57, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0x06, 0x12, 0x01, 0x5d, 0x7a, 0x08, 0x7b, 0x00, 0x7c, 0x00, 0x12, 0x01, 0x5d, 0x7a, 0x08, 0x7b, 0x01, 0x7c, 0x00, 0x12, 0x01, 0x5d, 0x74, 0xf8, 0x2f, 0x60, 0x08, 0x75, 0x40, 0x81, 0x8f, 0x41, 0x02, 0x0b, 0x9c, 0x7a, 0x05, 0x7b, 0x05, 0x7c, 0x0c, 0x12, 0x01, 0x5d, 0x90, 0x7f, 0x9e, 0x74, 0x2a, 0xf0, 0x75, 0x40, 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe2, 0xfc, 0x7a, 0x03, 0x7b, 0xff, 0x7c, 0x01, 0x12, 0x01, 0x5d, 0x90, 0x7f, 0x96, 0x74, 0x42, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x40, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x02, 0xf0, 0x75, 0x40, 0x10, 0x90, 0x7f, 0xc8, 0xe4, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc9, 0xe0, 0x24, 0xfe, 0x50, 0xed, 0x90, 0x7d, 0xc0, 0xe0, 0xb4, 0xff, 0xe6, 0xa3, 0xe0, 0xb4, 0x04, 0xe1, 0x75, 0x40, 0x11, 0x80, 0x0b, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc9, 0xe0, 0x60, 0xef, 0xff, 0x25, 0x42, 0xf5, 0x42, 0xe4, 0x35, 0x43, 0xf5, 0x43, 0x90, 0x7d, 0xc0, 0xe0, 0x80, 0x04, 0xe0, 0x30, 0x99, 0xfd, 0xc2, 0x99, 0xf5, 0x99, 0xa3, 0xdf, 0xf5, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe2, 0x0c, 0x90, 0x7f, 0xc8, 0x74, 0x01, 0xf0, 0x75, 0x40, 0x90, 0x02, 0x0b, 0x9c, 0x74, 0x9c, 0x25, 0x42, 0x74, 0xd1, 0x35, 0x43, 0x50, 0xb7, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x00, 0xf0, 0x7f, 0xfa, 0x90, 0x7f, 0x99, 0xe0, 0x20, 0xe2, 0x1f, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe2, 0x06, 0x75, 0x40, 0x90, 0x02, 0x0b, 0x9c, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xdf, 0xe0, 0x75, 0x40, 0x91, 0x02, 0x0b, 0x9c, 0x7f, 0x10, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xdf, 0xf8, 0x90, 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x75, 0x40, 0x20, 0x90, 0xc0, 0x08, 0x74, 0xc7, 0xf0, 0x80, 0xfe }; baycomusb-0.10.orig/firmware/dl2firmware.h0100644000175100017510000005517607340477542016645 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/dl2firmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define dl2firmware_DATE "20010821" /* firmware */ static const unsigned char dl2firmware[] = { 0x02, 0x0b, 0xdf, 0x02, 0x02, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x29, 0x00, 0x02, 0x07, 0x11, 0x00, 0x02, 0x07, 0x3c, 0x00, 0x02, 0x07, 0x67, 0x00, 0x02, 0x07, 0x92, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbd, 0x00, 0x02, 0x08, 0x13, 0x00, 0x02, 0x08, 0xcf, 0x00, 0x02, 0x08, 0xfd, 0x00, 0x02, 0x09, 0x28, 0x00, 0x02, 0x09, 0x53, 0x00, 0x02, 0x09, 0x7e, 0x00, 0x02, 0x09, 0xa9, 0x00, 0x02, 0x09, 0xd4, 0x00, 0x02, 0x09, 0xff, 0x00, 0x02, 0x0a, 0x2a, 0x00, 0x02, 0x0a, 0x55, 0x00, 0x02, 0x0a, 0x80, 0x00, 0x02, 0x0a, 0xab, 0x00, 0x02, 0x0a, 0xd6, 0x00, 0x02, 0x0b, 0x01, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0xff, 0x7e, 0x01, 0x7f, 0x00, 0x74, 0x02, 0xcb, 0x13, 0xcb, 0x92, 0xe6, 0xcc, 0x13, 0xcc, 0x92, 0xe7, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe0, 0x03, 0xee, 0x42, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xee, 0x23, 0xfe, 0xda, 0xd7, 0x22, 0x10, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xc2, 0xf0, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0xa6, 0xe5, 0xf0, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x20, 0x30, 0xe0, 0xf9, 0x30, 0xe1, 0x0f, 0x90, 0x7f, 0xa6, 0x15, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x90, 0x7f, 0xa5, 0xdf, 0xe7, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xef, 0x22, 0x7f, 0xff, 0x80, 0xf1, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xd2, 0xf0, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0xa6, 0xe5, 0xf0, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x4c, 0x30, 0xe0, 0xf9, 0x30, 0xe1, 0x03, 0xef, 0x70, 0x0b, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xe4, 0x22, 0xb4, 0x01, 0x03, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x27, 0x30, 0xe0, 0xf9, 0xef, 0xb4, 0x02, 0x03, 0x74, 0x20, 0xf0, 0xb4, 0x01, 0x03, 0x74, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0x15, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xdf, 0xdd, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xe4, 0x22, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x74, 0xff, 0x15, 0x86, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x89, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8d, 0x05, 0x44, 0xe5, 0x44, 0x54, 0x07, 0x70, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0x64, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x98, 0xc2, 0x99, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xcf, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdc, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xc0, 0xc2, 0xc1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe5, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe6, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe7, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdb, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xe5, 0x49, 0xff, 0x24, 0xc0, 0xf5, 0x49, 0xe5, 0x4a, 0x34, 0x00, 0x50, 0x12, 0xe4, 0xf5, 0x49, 0xf5, 0x4a, 0xf5, 0x46, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xef, 0x60, 0x25, 0x80, 0x04, 0xf5, 0x4a, 0x7f, 0x40, 0x8f, 0x00, 0x85, 0x47, 0x82, 0x85, 0x48, 0x83, 0x05, 0x86, 0x90, 0x7f, 0x00, 0x15, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xd8, 0xf6, 0x85, 0x82, 0x47, 0x85, 0x83, 0x48, 0xef, 0x90, 0x7f, 0xb5, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x75, 0x46, 0x00, 0x90, 0x7f, 0xe9, 0xe0, 0xb4, 0x06, 0x59, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x4f, 0x90, 0x7f, 0xeb, 0xe0, 0xb4, 0x01, 0x0c, 0x90, 0x7f, 0xd4, 0x74, 0x0b, 0xf0, 0xa3, 0x74, 0x2c, 0xf0, 0x80, 0x39, 0xb4, 0x02, 0x12, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x33, 0x90, 0x7f, 0xd4, 0x74, 0x0b, 0xf0, 0xa3, 0x74, 0x3e, 0xf0, 0x80, 0x24, 0xb4, 0x03, 0x24, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfc, 0x40, 0x1c, 0xe0, 0x25, 0xe0, 0x24, 0x83, 0xf5, 0x82, 0xe4, 0x34, 0x0b, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x90, 0x7f, 0xd4, 0xf0, 0xa3, 0xe5, 0xf0, 0xf0, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0x09, 0x41, 0x90, 0x7f, 0xe8, 0xe0, 0x70, 0xf4, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfe, 0x40, 0xec, 0xe0, 0xf5, 0x4b, 0x90, 0x7f, 0xd7, 0x78, 0x07, 0xe8, 0x44, 0x10, 0xf0, 0x44, 0x30, 0xf0, 0xe8, 0xf0, 0x44, 0x20, 0xf0, 0xd8, 0xf2, 0xe4, 0xf0, 0x74, 0x02, 0x90, 0x7f, 0xb6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x90, 0x7f, 0xc6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x12, 0x08, 0xb0, 0x80, 0xb6, 0xb4, 0x0b, 0x1a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x01, 0xaf, 0xe5, 0x4b, 0xb4, 0x01, 0xaa, 0x90, 0x7f, 0xec, 0xe0, 0x70, 0xa4, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x4c, 0x80, 0xb3, 0xb4, 0x0a, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x81, 0x92, 0xe5, 0x4b, 0xb4, 0x01, 0x8d, 0x90, 0x7f, 0xec, 0xe0, 0x70, 0x87, 0xe5, 0x4c, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x80, 0x4e, 0xb4, 0x08, 0x0b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x47, 0xe5, 0x4b, 0x80, 0xe6, 0x70, 0x44, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x11, 0x74, 0x01, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x80, 0x26, 0xb4, 0x81, 0x03, 0xe4, 0x80, 0xeb, 0xb4, 0x82, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x03, 0x90, 0x7f, 0xb4, 0x54, 0x0f, 0x60, 0x0f, 0x20, 0xe3, 0x0c, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe0, 0x80, 0xcb, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0x03, 0x05, 0x75, 0xf0, 0x01, 0x80, 0x06, 0xb4, 0x01, 0x3e, 0x75, 0xf0, 0x00, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x02, 0xe8, 0xa3, 0xa3, 0xe0, 0x70, 0xe3, 0xa3, 0xe0, 0x70, 0xdf, 0xa3, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x05, 0x90, 0x7f, 0xb4, 0x44, 0x10, 0x20, 0xe3, 0xcf, 0x54, 0x1f, 0x05, 0x86, 0x90, 0x7f, 0xd7, 0xf0, 0x44, 0x20, 0xf0, 0x54, 0x0f, 0xf0, 0x15, 0x86, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0xf0, 0x80, 0xb1, 0xb4, 0xa3, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x47, 0xa3, 0xe0, 0xf5, 0x48, 0x24, 0x50, 0x50, 0x2d, 0x90, 0x7f, 0xee, 0xe0, 0xf5, 0x49, 0x25, 0x47, 0xa3, 0xe0, 0xf5, 0x4a, 0x35, 0x48, 0x40, 0x1d, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x0a, 0x75, 0x46, 0x01, 0x90, 0x7f, 0xc5, 0xf0, 0x02, 0x06, 0xfc, 0xb4, 0xc0, 0x09, 0x75, 0x46, 0x02, 0x12, 0x03, 0xe1, 0x02, 0x06, 0xfc, 0x02, 0x06, 0xf2, 0xb4, 0xb1, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x34, 0x90, 0x7f, 0x00, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x81, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0x7f, 0xdf, 0xe0, 0xd0, 0x83, 0xd0, 0x82, 0xf0, 0xa3, 0x74, 0x00, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0x7f, 0xc8, 0xe0, 0xd0, 0x83, 0xd0, 0x82, 0xf0, 0xa3, 0x90, 0x7f, 0xb5, 0x74, 0x04, 0xf0, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0xb2, 0x2b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x21, 0x90, 0x7f, 0x00, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x45, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x05, 0xf0, 0x05, 0x45, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0xb3, 0x2a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x20, 0x75, 0xf0, 0xa0, 0x90, 0x01, 0x8b, 0x7f, 0x01, 0x12, 0x01, 0x8c, 0x70, 0x13, 0x90, 0x7f, 0x00, 0x7f, 0x06, 0x12, 0x01, 0xc7, 0x70, 0x09, 0x74, 0x06, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0xb4, 0x3f, 0x90, 0x7f, 0xef, 0xe0, 0x70, 0x36, 0x90, 0x7f, 0xee, 0xe0, 0xf8, 0xff, 0x24, 0xc0, 0x40, 0x2c, 0x90, 0x7f, 0xec, 0xe0, 0xf5, 0xf0, 0xf5, 0x47, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x0a, 0x75, 0x46, 0x02, 0x90, 0x7f, 0xc5, 0xf0, 0x02, 0x06, 0xfc, 0xb4, 0xc0, 0x10, 0x90, 0x7f, 0x00, 0x12, 0x01, 0xc7, 0x70, 0x08, 0xe8, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0xe5, 0x46, 0xb4, 0x02, 0x05, 0x12, 0x03, 0xe1, 0x80, 0x11, 0x90, 0x7f, 0xb5, 0xe4, 0xf0, 0x80, 0x04, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x01, 0xf0, 0xe5, 0x46, 0xb4, 0x01, 0x36, 0x90, 0x7f, 0xc5, 0xe0, 0x60, 0x28, 0xff, 0xc3, 0xe5, 0x49, 0x9f, 0xf5, 0x49, 0xe5, 0x4a, 0x94, 0x00, 0xf5, 0x4a, 0x40, 0x38, 0x90, 0x7e, 0xc0, 0x85, 0x47, 0x84, 0x85, 0x48, 0x85, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xdf, 0xf6, 0x85, 0x84, 0x47, 0x85, 0x85, 0x48, 0xe5, 0x49, 0x45, 0x4a, 0x60, 0x20, 0x80, 0x27, 0xb4, 0x02, 0x14, 0x90, 0x7f, 0xc5, 0xe0, 0x60, 0x15, 0xff, 0x85, 0x47, 0xf0, 0x90, 0x7e, 0xc0, 0x12, 0x01, 0x8c, 0x70, 0x02, 0x80, 0x07, 0x75, 0x46, 0x00, 0x74, 0x03, 0x80, 0x05, 0x75, 0x46, 0x00, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x90, 0x7e, 0x80, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x45, 0xf0, 0x90, 0x7f, 0xb7, 0x74, 0x05, 0xf0, 0x05, 0x45, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0x12, 0x08, 0xb0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x12, 0x01, 0x00, 0x01, 0xff, 0x00, 0xff, 0x40, 0xc0, 0xba, 0x35, 0x61, 0x02, 0x00, 0x01, 0x02, 0x03, 0x01, 0x09, 0x02, 0x45, 0x00, 0x01, 0x01, 0x00, 0x40, 0x00, 0x09, 0x04, 0x00, 0x00, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x09, 0x04, 0x00, 0x01, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, 0x00, 0x0a, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x8b, 0x0b, 0x8f, 0x0b, 0x9d, 0x0b, 0xbd, 0x0b, 0x04, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x42, 0x00, 0x61, 0x00, 0x79, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x03, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x58, 0x00, 0x20, 0x00, 0x28, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x6b, 0x00, 0x29, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x81, 0x80, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0xe4, 0xf5, 0x40, 0xf5, 0x41, 0xf5, 0x42, 0xf5, 0x43, 0xf5, 0x45, 0xf5, 0x46, 0xf5, 0x86, 0xf5, 0xa8, 0x75, 0x8e, 0x31, 0x75, 0x89, 0x21, 0x75, 0x88, 0x55, 0x75, 0x8d, 0x64, 0x75, 0x87, 0x00, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x90, 0x7f, 0xa1, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0xe4, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0x74, 0x09, 0xf0, 0x90, 0x7f, 0xde, 0x74, 0x07, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x05, 0xf0, 0x90, 0x7f, 0xd7, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x02, 0xf0, 0x74, 0x22, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2e, 0xf0, 0x75, 0xa8, 0x82, 0x75, 0xe8, 0x01, 0x90, 0x7f, 0xae, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x01, 0xf0, 0x75, 0x98, 0x20, 0x75, 0x99, 0xff, 0xe4, 0xf5, 0x4b, 0xf5, 0x4c, 0x90, 0x7f, 0xd6, 0x74, 0x06, 0xf0, 0x12, 0x08, 0xb0, 0x90, 0x7f, 0x96, 0x74, 0x82, 0xf0, 0x90, 0x7f, 0x99, 0xe0, 0x30, 0xe2, 0x06, 0x75, 0x40, 0x80, 0x02, 0x0d, 0xdf, 0x12, 0x01, 0x57, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0x06, 0x12, 0x01, 0x5d, 0x7a, 0x08, 0x7b, 0x00, 0x7c, 0x00, 0x12, 0x01, 0x5d, 0x7a, 0x08, 0x7b, 0x01, 0x7c, 0x00, 0x12, 0x01, 0x5d, 0x74, 0xf8, 0x2f, 0x60, 0x08, 0x75, 0x40, 0x81, 0x8f, 0x41, 0x02, 0x0d, 0xdf, 0x7a, 0x05, 0x7b, 0x05, 0x7c, 0x0c, 0x12, 0x01, 0x5d, 0x90, 0x7f, 0x9e, 0x74, 0x2a, 0xf0, 0x75, 0x40, 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe2, 0xfc, 0x7a, 0x03, 0x7b, 0xff, 0x7c, 0x01, 0x12, 0x01, 0x5d, 0x90, 0x7f, 0x96, 0x74, 0x42, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x40, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x02, 0xf0, 0x75, 0x40, 0x10, 0x90, 0x7f, 0xc8, 0xe4, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc9, 0xe0, 0x24, 0xfe, 0x50, 0xed, 0x90, 0x7d, 0xc0, 0xe0, 0xb4, 0xff, 0xe6, 0xa3, 0xe0, 0xb4, 0x04, 0xe1, 0x75, 0x40, 0x11, 0x80, 0x0b, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc9, 0xe0, 0x60, 0xef, 0xff, 0x25, 0x42, 0xf5, 0x42, 0xe4, 0x35, 0x43, 0xf5, 0x43, 0x90, 0x7d, 0xc0, 0xe0, 0x80, 0x04, 0xe0, 0x30, 0x99, 0xfd, 0xc2, 0x99, 0xf5, 0x99, 0xa3, 0xdf, 0xf5, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe2, 0x0c, 0x90, 0x7f, 0xc8, 0x74, 0x01, 0xf0, 0x75, 0x40, 0x90, 0x02, 0x0d, 0xdf, 0x74, 0x9c, 0x25, 0x42, 0x74, 0xd1, 0x35, 0x43, 0x50, 0xb7, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x00, 0xf0, 0x7f, 0xfa, 0x90, 0x7f, 0x99, 0xe0, 0x20, 0xe2, 0x1f, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe2, 0x06, 0x75, 0x40, 0x90, 0x02, 0x0d, 0xdf, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xdf, 0xe0, 0x75, 0x40, 0x91, 0x02, 0x0d, 0xdf, 0x7f, 0x10, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xdf, 0xf8, 0x90, 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x75, 0x40, 0x20, 0x90, 0xc0, 0x08, 0x74, 0xc7, 0xf0, 0x80, 0xfe }; baycomusb-0.10.orig/firmware/resetfirmware.h0100644000175100017510000000521007340477542017266 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/resetfirmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define resetfirmware_DATE "20010821" /* firmware */ static const unsigned char resetfirmware[] = { 0x75, 0x81, 0x7f, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0x75, 0x8e, 0x31, 0xf5, 0xa8, 0xf5, 0xe8, 0x90, 0x7f, 0xae, 0xf0, 0x90, 0x7f, 0xac, 0xf0, 0x90, 0x7f, 0xad, 0xf0, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x90, 0x7f, 0xd6, 0xe4, 0xf0, 0x90, 0x7f, 0xa1, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0xe4, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0xf0, 0x90, 0x7f, 0xde, 0xf0, 0x90, 0x7f, 0xdf, 0xf0, 0x90, 0x7f, 0xd7, 0x7f, 0x07, 0xef, 0x44, 0x10, 0xf0, 0x44, 0x30, 0xf0, 0xef, 0xf0, 0x44, 0x20, 0xf0, 0xdf, 0xf2, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x08, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2e, 0xf0, 0x7a, 0x64, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0xda, 0xf4, 0x90, 0x7f, 0xd6, 0x74, 0x04, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x20, 0xf0, 0x7a, 0x28, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0xda, 0xf4, 0x90, 0x7f, 0x98, 0x74, 0x28, 0xf0, 0x7a, 0x0a, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0xda, 0xf4, 0x80, 0xd6 }; baycomusb-0.10.orig/firmware/reset2firmware.h0100644000175100017510000005542307340477542017363 0ustar abaaba/*****************************************************************************/ /* * /home/sailer/src/bayusb/firmware/reset2firmware.h -- Anchorchips Firmware. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define reset2firmware_DATE "20010821" /* firmware */ static const unsigned char reset2firmware[] = { 0x02, 0x0b, 0xdf, 0x02, 0x02, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x29, 0x00, 0x02, 0x07, 0x11, 0x00, 0x02, 0x07, 0x3c, 0x00, 0x02, 0x07, 0x67, 0x00, 0x02, 0x07, 0x92, 0x00, 0x32, 0x00, 0x00, 0x00, 0x02, 0x07, 0xbd, 0x00, 0x02, 0x08, 0x13, 0x00, 0x02, 0x08, 0xcf, 0x00, 0x02, 0x08, 0xfd, 0x00, 0x02, 0x09, 0x28, 0x00, 0x02, 0x09, 0x53, 0x00, 0x02, 0x09, 0x7e, 0x00, 0x02, 0x09, 0xa9, 0x00, 0x02, 0x09, 0xd4, 0x00, 0x02, 0x09, 0xff, 0x00, 0x02, 0x0a, 0x2a, 0x00, 0x02, 0x0a, 0x55, 0x00, 0x02, 0x0a, 0x80, 0x00, 0x02, 0x0a, 0xab, 0x00, 0x02, 0x0a, 0xd6, 0x00, 0x02, 0x0b, 0x01, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0xff, 0x7e, 0x01, 0x7f, 0x00, 0x74, 0x02, 0xcb, 0x13, 0xcb, 0x92, 0xe6, 0xcc, 0x13, 0xcc, 0x92, 0xe7, 0x90, 0x7f, 0x96, 0xf0, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe0, 0x03, 0xee, 0x42, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xee, 0x23, 0xfe, 0xda, 0xd7, 0x22, 0x10, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xc2, 0xf0, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0xa6, 0xe5, 0xf0, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x20, 0x30, 0xe0, 0xf9, 0x30, 0xe1, 0x0f, 0x90, 0x7f, 0xa6, 0x15, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0x90, 0x7f, 0xa5, 0xdf, 0xe7, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xef, 0x22, 0x7f, 0xff, 0x80, 0xf1, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xd2, 0xf0, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0xa6, 0xe5, 0xf0, 0xf0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x4c, 0x30, 0xe0, 0xf9, 0x30, 0xe1, 0x03, 0xef, 0x70, 0x0b, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xe4, 0x22, 0xb4, 0x01, 0x03, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0x90, 0x7f, 0xa5, 0xe0, 0x20, 0xe2, 0x27, 0x30, 0xe0, 0xf9, 0xef, 0xb4, 0x02, 0x03, 0x74, 0x20, 0xf0, 0xb4, 0x01, 0x03, 0x74, 0x40, 0xf0, 0x90, 0x7f, 0xa6, 0xe0, 0x15, 0x86, 0xf0, 0xa3, 0x05, 0x86, 0x90, 0x7f, 0xa5, 0xdf, 0xdd, 0xe0, 0x20, 0xe6, 0xfc, 0x15, 0x86, 0xe4, 0x22, 0x74, 0x40, 0xf0, 0xe0, 0x20, 0xe6, 0xfc, 0x74, 0xff, 0x15, 0x86, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x89, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8d, 0x05, 0x44, 0xe5, 0x44, 0x54, 0x07, 0x70, 0x07, 0x90, 0x7f, 0x98, 0xe0, 0x64, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8b, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x8f, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0x98, 0xc2, 0x99, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xcf, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdc, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xc0, 0xc2, 0xc1, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe5, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe6, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe7, 0xf5, 0x91, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc2, 0xdb, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xe5, 0x49, 0xff, 0x24, 0xc0, 0xf5, 0x49, 0xe5, 0x4a, 0x34, 0x00, 0x50, 0x12, 0xe4, 0xf5, 0x49, 0xf5, 0x4a, 0xf5, 0x46, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xef, 0x60, 0x25, 0x80, 0x04, 0xf5, 0x4a, 0x7f, 0x40, 0x8f, 0x00, 0x85, 0x47, 0x82, 0x85, 0x48, 0x83, 0x05, 0x86, 0x90, 0x7f, 0x00, 0x15, 0x86, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xd8, 0xf6, 0x85, 0x82, 0x47, 0x85, 0x83, 0x48, 0xef, 0x90, 0x7f, 0xb5, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x01, 0xf0, 0x75, 0x46, 0x00, 0x90, 0x7f, 0xe9, 0xe0, 0xb4, 0x06, 0x59, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x4f, 0x90, 0x7f, 0xeb, 0xe0, 0xb4, 0x01, 0x0c, 0x90, 0x7f, 0xd4, 0x74, 0x0b, 0xf0, 0xa3, 0x74, 0x2c, 0xf0, 0x80, 0x39, 0xb4, 0x02, 0x12, 0x90, 0x7f, 0xea, 0xe0, 0x70, 0x33, 0x90, 0x7f, 0xd4, 0x74, 0x0b, 0xf0, 0xa3, 0x74, 0x3e, 0xf0, 0x80, 0x24, 0xb4, 0x03, 0x24, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfc, 0x40, 0x1c, 0xe0, 0x25, 0xe0, 0x24, 0x83, 0xf5, 0x82, 0xe4, 0x34, 0x0b, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x90, 0x7f, 0xd4, 0xf0, 0xa3, 0xe5, 0xf0, 0xf0, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0x09, 0x41, 0x90, 0x7f, 0xe8, 0xe0, 0x70, 0xf4, 0x90, 0x7f, 0xea, 0xe0, 0x24, 0xfe, 0x40, 0xec, 0xe0, 0xf5, 0x4b, 0x90, 0x7f, 0xd7, 0x78, 0x07, 0xe8, 0x44, 0x10, 0xf0, 0x44, 0x30, 0xf0, 0xe8, 0xf0, 0x44, 0x20, 0xf0, 0xd8, 0xf2, 0xe4, 0xf0, 0x74, 0x02, 0x90, 0x7f, 0xb6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x90, 0x7f, 0xc6, 0x78, 0x07, 0xf0, 0xa3, 0xa3, 0xd8, 0xfb, 0x12, 0x08, 0xb0, 0x80, 0xb6, 0xb4, 0x0b, 0x1a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x01, 0xaf, 0xe5, 0x4b, 0xb4, 0x01, 0xaa, 0x90, 0x7f, 0xec, 0xe0, 0x70, 0xa4, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x4c, 0x80, 0xb3, 0xb4, 0x0a, 0x20, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x81, 0x92, 0xe5, 0x4b, 0xb4, 0x01, 0x8d, 0x90, 0x7f, 0xec, 0xe0, 0x70, 0x87, 0xe5, 0x4c, 0x90, 0x7f, 0x00, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x01, 0xf0, 0x80, 0x4e, 0xb4, 0x08, 0x0b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x47, 0xe5, 0x4b, 0x80, 0xe6, 0x70, 0x44, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x80, 0x11, 0x74, 0x01, 0x90, 0x7f, 0x00, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x02, 0xf0, 0x80, 0x26, 0xb4, 0x81, 0x03, 0xe4, 0x80, 0xeb, 0xb4, 0x82, 0x20, 0x90, 0x7f, 0xec, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x03, 0x90, 0x7f, 0xb4, 0x54, 0x0f, 0x60, 0x0f, 0x20, 0xe3, 0x0c, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe0, 0x80, 0xcb, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0x03, 0x05, 0x75, 0xf0, 0x01, 0x80, 0x06, 0xb4, 0x01, 0x3e, 0x75, 0xf0, 0x00, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x02, 0xe8, 0xa3, 0xa3, 0xe0, 0x70, 0xe3, 0xa3, 0xe0, 0x70, 0xdf, 0xa3, 0xe0, 0x90, 0x7f, 0xc4, 0x30, 0xe7, 0x05, 0x90, 0x7f, 0xb4, 0x44, 0x10, 0x20, 0xe3, 0xcf, 0x54, 0x1f, 0x05, 0x86, 0x90, 0x7f, 0xd7, 0xf0, 0x44, 0x20, 0xf0, 0x54, 0x0f, 0xf0, 0x15, 0x86, 0x25, 0xe0, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0xf0, 0x80, 0xb1, 0xb4, 0xa3, 0x3e, 0x90, 0x7f, 0xea, 0xe0, 0xf5, 0x47, 0xa3, 0xe0, 0xf5, 0x48, 0x24, 0x50, 0x50, 0x2d, 0x90, 0x7f, 0xee, 0xe0, 0xf5, 0x49, 0x25, 0x47, 0xa3, 0xe0, 0xf5, 0x4a, 0x35, 0x48, 0x40, 0x1d, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x0a, 0x75, 0x46, 0x01, 0x90, 0x7f, 0xc5, 0xf0, 0x02, 0x06, 0xfc, 0xb4, 0xc0, 0x09, 0x75, 0x46, 0x02, 0x12, 0x03, 0xe1, 0x02, 0x06, 0xfc, 0x02, 0x06, 0xf2, 0xb4, 0xb1, 0x3e, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x34, 0x90, 0x7f, 0x00, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x81, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0x7f, 0xdf, 0xe0, 0xd0, 0x83, 0xd0, 0x82, 0xf0, 0xa3, 0x74, 0x00, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0x7f, 0xc8, 0xe0, 0xd0, 0x83, 0xd0, 0x82, 0xf0, 0xa3, 0x90, 0x7f, 0xb5, 0x74, 0x04, 0xf0, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0xb2, 0x2b, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x21, 0x90, 0x7f, 0x00, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x45, 0xf0, 0x90, 0x7f, 0xb5, 0x74, 0x05, 0xf0, 0x05, 0x45, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0xb3, 0x2a, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0xc0, 0x20, 0x75, 0xf0, 0xa0, 0x90, 0x01, 0x8b, 0x7f, 0x01, 0x12, 0x01, 0x8c, 0x70, 0x13, 0x90, 0x7f, 0x00, 0x7f, 0x06, 0x12, 0x01, 0xc7, 0x70, 0x09, 0x74, 0x06, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0xb4, 0xb4, 0x3f, 0x90, 0x7f, 0xef, 0xe0, 0x70, 0x36, 0x90, 0x7f, 0xee, 0xe0, 0xf8, 0xff, 0x24, 0xc0, 0x40, 0x2c, 0x90, 0x7f, 0xec, 0xe0, 0xf5, 0xf0, 0xf5, 0x47, 0x90, 0x7f, 0xe8, 0xe0, 0xb4, 0x40, 0x0a, 0x75, 0x46, 0x02, 0x90, 0x7f, 0xc5, 0xf0, 0x02, 0x06, 0xfc, 0xb4, 0xc0, 0x10, 0x90, 0x7f, 0x00, 0x12, 0x01, 0xc7, 0x70, 0x08, 0xe8, 0x90, 0x7f, 0xb5, 0xf0, 0x02, 0x06, 0xf6, 0x02, 0x06, 0xf2, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xab, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x07, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x01, 0xf0, 0xe5, 0x46, 0xb4, 0x02, 0x05, 0x12, 0x03, 0xe1, 0x80, 0x11, 0x90, 0x7f, 0xb5, 0xe4, 0xf0, 0x80, 0x04, 0x74, 0x03, 0x80, 0x02, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x07, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x84, 0xc0, 0x85, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xc0, 0x00, 0xc0, 0x06, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x01, 0xf0, 0xe5, 0x46, 0xb4, 0x01, 0x36, 0x90, 0x7f, 0xc5, 0xe0, 0x60, 0x28, 0xff, 0xc3, 0xe5, 0x49, 0x9f, 0xf5, 0x49, 0xe5, 0x4a, 0x94, 0x00, 0xf5, 0x4a, 0x40, 0x38, 0x90, 0x7e, 0xc0, 0x85, 0x47, 0x84, 0x85, 0x48, 0x85, 0xe0, 0xa3, 0x05, 0x86, 0xf0, 0xa3, 0x15, 0x86, 0xdf, 0xf6, 0x85, 0x84, 0x47, 0x85, 0x85, 0x48, 0xe5, 0x49, 0x45, 0x4a, 0x60, 0x20, 0x80, 0x27, 0xb4, 0x02, 0x14, 0x90, 0x7f, 0xc5, 0xe0, 0x60, 0x15, 0xff, 0x85, 0x47, 0xf0, 0x90, 0x7e, 0xc0, 0x12, 0x01, 0x8c, 0x70, 0x02, 0x80, 0x07, 0x75, 0x46, 0x00, 0x74, 0x03, 0x80, 0x05, 0x75, 0x46, 0x00, 0x74, 0x02, 0x90, 0x7f, 0xb4, 0xf0, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x85, 0xd0, 0x84, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x90, 0x7e, 0x80, 0xe5, 0x40, 0xf0, 0xa3, 0xe5, 0x41, 0xf0, 0xa3, 0xe5, 0x42, 0xf0, 0xa3, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 0x45, 0xf0, 0x90, 0x7f, 0xb7, 0x74, 0x05, 0xf0, 0x05, 0x45, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x02, 0xf0, 0x12, 0x08, 0xb0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x02, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x04, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x08, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x10, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x20, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x40, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xa9, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x86, 0x75, 0x86, 0x00, 0xe5, 0x91, 0xc2, 0xe4, 0xf5, 0x91, 0x90, 0x7f, 0xaa, 0x74, 0x80, 0xf0, 0xd0, 0x86, 0xd0, 0xd0, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x12, 0x01, 0x00, 0x01, 0xff, 0x00, 0xff, 0x40, 0xc0, 0xba, 0x35, 0x61, 0x02, 0x00, 0x01, 0x02, 0x03, 0x01, 0x09, 0x02, 0x45, 0x00, 0x01, 0x01, 0x00, 0x40, 0x00, 0x09, 0x04, 0x00, 0x00, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x09, 0x04, 0x00, 0x01, 0x03, 0xff, 0x00, 0xff, 0x00, 0x07, 0x05, 0x81, 0x03, 0x40, 0x00, 0x0a, 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x8b, 0x0b, 0x8f, 0x0b, 0x9d, 0x0b, 0xbd, 0x0b, 0x04, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x42, 0x00, 0x61, 0x00, 0x79, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x03, 0x55, 0x00, 0x53, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x58, 0x00, 0x20, 0x00, 0x28, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x6b, 0x00, 0x29, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x81, 0x80, 0xe4, 0xf5, 0xd0, 0xf5, 0x86, 0xe4, 0xf5, 0x40, 0xf5, 0x41, 0xf5, 0x42, 0xf5, 0x43, 0xf5, 0x45, 0xf5, 0x46, 0xf5, 0x86, 0xf5, 0xa8, 0x75, 0x8e, 0x31, 0x75, 0x89, 0x21, 0x75, 0x88, 0x55, 0x75, 0x8d, 0x64, 0x75, 0x87, 0x00, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0x90, 0x7f, 0xa1, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xaf, 0x74, 0x01, 0xf0, 0xe4, 0x90, 0x7f, 0xe0, 0xf0, 0x90, 0x7f, 0xe1, 0xf0, 0x90, 0x7f, 0xdd, 0x74, 0x09, 0xf0, 0x90, 0x7f, 0xde, 0x74, 0x07, 0xf0, 0x90, 0x7f, 0xdf, 0x74, 0x05, 0xf0, 0x90, 0x7f, 0xd7, 0x74, 0x12, 0xf0, 0x74, 0x32, 0xf0, 0x74, 0x02, 0xf0, 0x74, 0x22, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x96, 0x74, 0x80, 0xf0, 0x90, 0x7f, 0x9c, 0x74, 0xc2, 0xf0, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x9d, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x98, 0x74, 0x20, 0xf0, 0x90, 0x7f, 0x9e, 0x74, 0x2e, 0xf0, 0x75, 0xa8, 0x82, 0x75, 0xe8, 0x01, 0x90, 0x7f, 0xae, 0x74, 0x01, 0xf0, 0x90, 0x7f, 0xac, 0x74, 0x03, 0xf0, 0x90, 0x7f, 0xad, 0x74, 0x01, 0xf0, 0x75, 0x98, 0x20, 0x75, 0x99, 0xff, 0xe4, 0xf5, 0x4b, 0xf5, 0x4c, 0x90, 0x7f, 0xd6, 0x74, 0x0a, 0xf0, 0x7a, 0x1e, 0x90, 0xe8, 0x90, 0xa3, 0xe5, 0x82, 0x45, 0x83, 0x70, 0xf9, 0xda, 0xf4, 0x90, 0x7f, 0xd6, 0x74, 0x02, 0xf0, 0x74, 0x06, 0xf0, 0x12, 0x08, 0xb0, 0x90, 0x7f, 0x96, 0x74, 0x82, 0xf0, 0x90, 0x7f, 0x99, 0xe0, 0x30, 0xe2, 0x06, 0x75, 0x40, 0x80, 0x02, 0x0d, 0xf6, 0x12, 0x01, 0x57, 0x7a, 0x05, 0x7b, 0x00, 0x7c, 0x06, 0x12, 0x01, 0x5d, 0x7a, 0x08, 0x7b, 0x00, 0x7c, 0x00, 0x12, 0x01, 0x5d, 0x7a, 0x08, 0x7b, 0x01, 0x7c, 0x00, 0x12, 0x01, 0x5d, 0x74, 0xf8, 0x2f, 0x60, 0x08, 0x75, 0x40, 0x81, 0x8f, 0x41, 0x02, 0x0d, 0xf6, 0x7a, 0x05, 0x7b, 0x05, 0x7c, 0x0c, 0x12, 0x01, 0x5d, 0x90, 0x7f, 0x9e, 0x74, 0x2a, 0xf0, 0x75, 0x40, 0x01, 0x90, 0x7f, 0x9b, 0xe0, 0x30, 0xe2, 0xfc, 0x7a, 0x03, 0x7b, 0xff, 0x7c, 0x01, 0x12, 0x01, 0x5d, 0x90, 0x7f, 0x96, 0x74, 0x42, 0xf0, 0x90, 0x7f, 0x93, 0x74, 0x40, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x02, 0xf0, 0x75, 0x40, 0x10, 0x90, 0x7f, 0xc8, 0xe4, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc9, 0xe0, 0x24, 0xfe, 0x50, 0xed, 0x90, 0x7d, 0xc0, 0xe0, 0xb4, 0xff, 0xe6, 0xa3, 0xe0, 0xb4, 0x04, 0xe1, 0x75, 0x40, 0x11, 0x80, 0x0b, 0x90, 0x7f, 0xc9, 0xf0, 0x90, 0x7f, 0xc8, 0xe0, 0x20, 0xe1, 0xf9, 0x90, 0x7f, 0xc9, 0xe0, 0x60, 0xef, 0xff, 0x25, 0x42, 0xf5, 0x42, 0xe4, 0x35, 0x43, 0xf5, 0x43, 0x90, 0x7d, 0xc0, 0xe0, 0x80, 0x04, 0xe0, 0x30, 0x99, 0xfd, 0xc2, 0x99, 0xf5, 0x99, 0xa3, 0xdf, 0xf5, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe2, 0x0c, 0x90, 0x7f, 0xc8, 0x74, 0x01, 0xf0, 0x75, 0x40, 0x90, 0x02, 0x0d, 0xf6, 0x74, 0x9c, 0x25, 0x42, 0x74, 0xd1, 0x35, 0x43, 0x50, 0xb7, 0x90, 0x7f, 0x94, 0x74, 0x00, 0xf0, 0x90, 0x7f, 0x95, 0x74, 0x00, 0xf0, 0x7f, 0xfa, 0x90, 0x7f, 0x99, 0xe0, 0x20, 0xe2, 0x1f, 0x90, 0x7f, 0x9b, 0xe0, 0x20, 0xe2, 0x06, 0x75, 0x40, 0x90, 0x02, 0x0d, 0xf6, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xdf, 0xe0, 0x75, 0x40, 0x91, 0x02, 0x0d, 0xf6, 0x7f, 0x10, 0x90, 0x7f, 0x98, 0xe0, 0xd2, 0xe1, 0xf0, 0xc2, 0xe1, 0xf0, 0xdf, 0xf8, 0x90, 0x7f, 0x95, 0x74, 0xc0, 0xf0, 0x75, 0x40, 0x20, 0x90, 0xc0, 0x08, 0x74, 0x42, 0xf0, 0x80, 0xfe }; baycomusb-0.10.orig/firmware/afskfirmware/0042755000175100017510000000000007340500001016677 5ustar abaababaycomusb-0.10.orig/firmware/afskfirmware/Makefile.in0100644000175100017510000001400707340500001020741 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/afskfirmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/afskfirmware/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 = firmware/afskfirmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/afskfirmware/main.rel: $(top_srcdir)/firmware/afskfirmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/afskfirmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/afskfirmware/main.ihx: $(top_srcdir)/firmware/afskfirmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/afskfirmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/afskfirmware/Makefile.am0100644000175100017510000000077207325134422020751 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/afskfirmware/main.rel: $(top_srcdir)/firmware/afskfirmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/afskfirmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/afskfirmware/main.ihx $(top_srcdir)/firmware/afskfirmware/main.ihx: $(top_srcdir)/firmware/afskfirmware/main.rel cd $(top_srcdir)/firmware/afskfirmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk baycomusb-0.10.orig/firmware/afskfirmware/main.ihx0100644000175100017510000003076007337536151020363 0ustar abaaba:06000000020EAB02043BFE :03000B0002045C90 :0300130002047D67 :03001B0002049E3E :030023000204BF15 :03002B000204FDCF :0300330002051EA5 :03003B0002053F7C :03004300020100B7 :03004B0002056249 :030053000205871C :03005B000205ACEF :030063000205D1C2 :0800E000B00400B004000001AF :0900F00030303030303030300087 :030100000205F203 :03010400020A04E8 :03010800020A2FB9 :03010C00020A5A8A :03011000020A855B :0101140032B8 :03011800020AB028 :03011C00020AEBE9 :03012000020B9D32 :03012400020BCB00 :03012800020BF6D1 :03012C00020C21A1 :03013000020C4C72 :03013400020C7743 :03013800020CA214 :03013C00020CCDE5 :03014000020CF8B6 :03014400020D2386 :03014800020D4E57 :03014C00020D7928 :03015000020DA4F9 :03015400020DCFCA :080EAB007581B0E4F5D0F58675 :060EB300E4F545F548F5E9 :040EB90049F54AF5B8 :040EBD0051F552F5A4 :040EC10053F554F59C :040EC50055F544F5A6 :060EC9006FF56EF586D204 :0D0ECF000A758E30758921758855758D6402 :0E0EDC00758700907FA17401F0907FAF7401C4 :0E0EEA00F0E4907FE0F0907FE1F0907FDD7407 :0E0EF80009F0907FDE7407F0907FDF7405F044 :0E0F0600907FD77412F07432F07402F07422EF :0E0F1400F0907F937400F0907F967482F090BE :0E0F22007F9C74C2F0907F947400F0907F9DCD :0E0F30007400F0907F9574C3F0907F98742841 :0E0F3E00F0907F9E742AF075A89275E80190DD :0E0F4C007FAE7401F0907FAC7403F0907FAD27 :0D0F5A007401F075985275204278E7E2A20C :0C0F6700E092089201E52090C008F09094 :0E0F7300C00C74FFF090C00DE4F090C00A7442 :0D0F81001FF078F0900E8BE26006F0A3A345 :0C0F8E000880F7E8241125E0900E89F09F :0C0F9A00E4F570F57190D120A3E58245CC :0E0FA6008370F9907FD6740AF07A1E90E8905E :0E0FB400A3E582458370F9DAF4907FD67406C7 :040FC200F0120B26F8 :0E0FC600907FC8E020E1F9907FC9E0B4010DF2 :0E0FD400907DC0E0B45506907FC9F080069075 :050FE2007FC9F080DF73 :030FE7000201798B :06015700E5454551600D75 :05015D00C201D200D236 :0801620002E52090C008F02224 :05016A00C200A2089292 :0A016F0001C202E52090C008F02252 :06017900E549B54814122F :0A017F0002C8E4F54590C000F0103E :09018900090280EC12015780E725 :07019200754501754E08756B :060199004BFF754CFFE571 :0C019F00490303F58254C02400C58254BB :0B01AB003F3410F583E0F546A3E0F5BB :0501B6004775500278BE :0901BB00E1E2C395475003E2F5AF :0101C40047F3 :0B01C500E5492480F8E624FE4009759F :0601D000460175470075B1 :0201D6005000D7 :0301D80012015DB4 :0701DB00E54624FFF546E5AF :0801E2004734FFF547500B12F2 :0A01EA0002C8747E90C000F080E7A8 :0401F40085504F756E :0201F8004502BE :0701FA00E5492480F8E6B599 :090201004F2B75500020E618E5B2 :06020A004BF4120283E533 :060210004CF412028312FF :060216000261754BFF754B :05021C004CFF755002CB :08022100E54904540FF549B54D :0502290048C902024A71 :0B022E00E5490303F58254C0254F246E :0B02390000C582543F3410F583E01232 :06024400029A054F80B094 :0A024A001202617545037A14D31205 :08025400026EDAFA7545001292 :05025C000157020179C9 :0D0261007B7E7A08EB13FB12026EDAF822A6 :06026E00E54D13F54DD52E :060274004E0C754E08124D :09027A0002C8E54D90C000F0221D :0D028300FB7A08EB13FB12026EE54DF454FC :0A029000F87004C312026EDAED22CA :0A029A00FB7A08C3E54C13F54CE5B0 :0C02A4004B13F54BEB30E001B350066348 :0802B0004C84634B0813FB12A0 :0B02B800026EE54DF454F87004C31210 :0502C300026EDAD622F4 :0E02C80090C001E030E1012230E00312036338 :0502D600E554B553479B :0C02DB00907FC8E020E13EE5482480F858 :0902E700E54804540FB549030277 :0202F0000360A9 :0D02F200FF907FC9E0F66020FEE5480303A1 :0C02FF00F58454C02400C584543F341022 :05030B00F585907DC0A6 :0A031000E0A30586F0A31586DEF6D3 :06031A008F48907FC9F03E :02032000803E1D :0C032200907FB8E020E1B2E5542490F890 :0D032E00E66020FEE5540303F58454C0246E :0C033B0000C584543F3414F585907E000A :0A0347000586E0A31586F0A3DEF69C :0C035100E6907FB9F0E55404541FF55409 :03035D000202DBBE :030360000202C8CE :0703630090C000E0FE7F08DE :0C036A00EE13FEE55933F559B47E030292 :0C03760003F2F4547F600EE5526007E5CE :0603820059543FB43E088F :03038800DFE02291 :05038B0075520080F82E :07039000C3E55733F557E503 :050397005833F558E5A4 :0B039C005930E001B3500663572163A5 :0703A700581013E55A13F58D :0503AE005AD55BD67575 :0B03B3005B08E5550303F58254C025EC :0803BE005C2400C582543F34A9 :0703C60014F583E55AF00570 :0703CD005CE55C30E6B5E5DC :0703D400552490F87640E586 :0803DB005504541FB5540675CA :0603E3005200020388F540 :0503E90055755C0005E4 :0403EE005602038828 :0A03F200E552602FE55764F2F8E5CC :0903FC005864A1487023E5552462 :0604050090F8E55CF6E54D :0D040B0056700774FC265012800424F8403F :0C0418000CE55504541FB554028002F599 :010424005384 :06042500E4F556F55C75DC :06042B005201F4F557F543 :0504310058755B088511 :0304360053550219 :02043900038836 :0E043B00C0E0C0F0C082C083C0D075D000C049 :0E04490086758600C289D086D0D0D083D0823E :05045700D0F0D0E032FE :0E045C00C0E0C0F0C082C083C0D075D000C028 :0E046A0086758600C28DD086D0D0D083D08219 :05047800D0F0D0E032DD :0E047D00C0E0C0F0C082C083C0D075D000C007 :0E048B0086758600C28BD086D0D0D083D082FA :05049900D0F0D0E032BC :0E049E00C0E0C0F0C082C083C0D075D000C0E6 :0E04AC0086758600C28FD086D0D0D083D082D5 :0504BA00D0F0D0E0329B :0E04BF00C0E0C0F0C082C083C0D075D000C0C5 :0E04CD0086758600C00010981610990FD0009A :0E04DB00D086D0D0D083D082D0F0D0E032D204 :0604E9000A80EAE56E2422 :0B04EF005EF8E599F6E56E04540FF589 :0304FA006E80DC35 :0E04FD00C0E0C0F0C082C083C0D075D000C087 :0E050B0086758600C2CFD086D0D0D083D08235 :05051900D0F0D0E0323B :0E051E00C0E0C0F0C082C083C0D075D000C065 :0E052C0086758600C2DCD086D0D0D083D08207 :05053A00D0F0D0E0321A :0E053F00C0E0C0F0C082C083C0D075D000C044 :0E054D0086758600C2C0C2C1D086D0D0D083D1 :07055B00D082D0F0D0E032A5 :0E056200C0E0C0F0C082C083C0D075D000C021 :0E05700086758600E591C2E5F591D086D0D063 :09057E00D083D082D0F0D0E0322D :0E058700C0E0C0F0C082C083C0D075D000C0FC :0E05950086758600E591C2E6F591D086D0D03D :0905A300D083D082D0F0D0E03208 :0E05AC00C0E0C0F0C082C083C0D075D000C0D7 :0E05BA0086758600E591C2E7F591D086D0D017 :0905C800D083D082D0F0D0E032E3 :0E05D100C0E0C0F0C082C083C0D075D000C0B2 :0E05DF0086758600C2DBD086D0D0D083D08255 :0505ED00D0F0D0E03267 :0E05F200C0E0C0F0C082C083C084C085C0D00D :0E06000075D000C086758600C000C007E59169 :0D060E00C2E4F591907FAB7401F0754000DF :0E061B00907FE9E0B40659907FE8E0B4804F8C :0D062900907FEBE0B4010C907FD4740DF0D5 :06063600A374FAF0803904 :0D063C00B40212907FEAE07033907FD47416 :080649000EF0A3740CF08024F4 :0E065100B40324907FEAE024FC401CE025E086 :0C065F002451F582E4340EF583E0F5F040 :0A066B00A3E0907FD4F0A3E5F0F0C7 :030675000209E98E :030678000209E58F :0E067B00B40941907FE8E070F4907FEAE0243B :06068900FE40ECE0F570FC :0E068F00907FD77807E84410F04430F0E8F090 :0E069D004420F0D8F2E4F07402907FB67807A3 :0E06AB00F0A3A3D8FB907FC67807F0A3A3D8D6 :0606B900FB120B2680B6C7 :0D06BF00B40B1A907FE8E0B401AFE570B411 :0D06CC0001AA907FECE070A4907FEAE0F5B9 :0306D9007180B37A :0D06DC00B40A20907FE8E0B48192E570B48C :0A06E900018D907FECE07087E57151 :0C06F300907F00F0907FB57401F0804E05 :0D06FF00B4080B907FE8E0B48047E5708000 :01070C00E606 :0B070D007044907FE8E0B4801174019C :0E071800907F00F0A3E4F0907FB57402F080B3 :0107260026AC :06072700B48103E480EB45 :0E072D00B48220907FECE0907FC430E7039010 :0E073B007FB4540F600F20E30C25E02582F5FB :0407490082E080CBFF :03074D000209E9B5 :030750000209E5B6 :08075300B4030575F0018006F6 :06075B00B4014475F0003A :0E076100907FE8E0B402E8A3A3E070E3A3E019 :0E076F0070DFA3E0907FC430E705907FB444B4 :0E077D001020E3CF541F0586907FD7F0442054 :0E078B00F0540FF0158625E02582F582E5F08A :03079900F080B13C :03079C0002085FF1 :03079F000209E567 :0D07A200B4C0F7907FE8E0B4C0F3E545F582 :0D07AF00F0D2F24551B40002C2F290C00930 :0D07BC00E0A2E092F3A20A92F5E4907F041F :0C07C900F0907F00E5F0F0E548F42549D1 :0C07D500540F907F01F0E554F42553040C :0E07E100541F907F02F090C004E0907F03F060 :0907EF000544E544907F05F0E5A6 :0807F80045A3F0E549A3F0E57B :0C08000048A3F0E54AA3F07400A3F0E563 :08080C0046A3F0E547A3F0E567 :0808140052A3F0E554A3F0E546 :08081C0053A3F0E555A3F0E53C :0C08240056A3F0E55D907F12F090C0013B :0E083000E0907F13F090C008E0907F14F090ED :0E083E00C009E0907F15F0907FC8E0907F1613 :0D084C00F0907FEEE024E95001E4241790C5 :060859007FB5F00209E981 :0D085F00B4C819907FE8E0B4C00F74039096 :0C086C007F00F0907FB57401F00209E9F4 :030878000209E58D :0E087B00B4C921907FE8E0B4C017907F0078E8 :0D088900F0E26005F008A380F8E82410906C :060896007FB5F00209E944 :03089C000209E569 :0E089F00B4D04D907FE8E0B4C043907FECE011 :0C08AD00B4010A907FEAE05401F551D23A :0108B9000935 :0C08BA00907F00E545455160027401F09C :0D08C60090C009E054016401907F01F090A2 :0E08D300C004E0907F02F0907FEEE024FD5024 :0B08E10001E42403907FB5F00209E958 :0308EC000209E519 :0E08EF00B4D129907FE8E0B4C01F907F00785C :0D08FD00E07F06E2F0A308DFFA907FEEE056 :0E090A0024FA5001E42406907FB5F00209E9BA :030918000209E5EC :0E091B00B4D220907FE8E0B44016907FEAE06E :0E092900F5F0907F98E0A2F092E3A2F192E543 :04093700F00209E9D8 :03093B000209E5C9 :0E093E00B4D316907FE8E0B44007907FEAE063 :03094C00100A038B :03094F000209E5B5 :05095200F5990209E91E :0E095700B4D44D907FE8E0B4C043907FECE054 :0E096500907FEAB40107E090C00DF08008B466 :0E0973000205E090C00CF090C00EE0907F00F6 :0E098100F090C00DE0907F01F090C00CE0906F :0E098F007F02F0907FEEE024FD5001E424038F :07099D00907FB5F00209E9AB :0309A4000209E560 :0E09A700B4D53B907FE8E0B4C031907FECE027 :0E09B500B40108907FEAE090C00AF090C00BF9 :0E09C300E0907F00F090C00AE0907F01F0907D :0E09D1007FEEE024FE5001E42402907FB5F09A :0309DF000209E921 :0309E2000209E522 :0409E5007403800215 :0209E900740296 :0409EB00907FB4F055 :0E09EF00D007D000D086D0D0D085D084D08361 :0709FD00D082D0F0D0E032FF :0E0A0400C0E0C0F0C082C083C0D075D000C07A :0E0A120086758600E591C2E4F591907FAB7485 :0E0A200002F0D086D0D0D083D082D0F0D0E0CB :010A2E003295 :0E0A2F00C0E0C0F0C082C083C0D075D000C04F :0E0A3D0086758600E591C2E4F591907FAB745A :0E0A4B0004F0D086D0D0D083D082D0F0D0E09E :010A5900326A :0E0A5A00C0E0C0F0C082C083C0D075D000C024 :0E0A680086758600E591C2E4F591907FAB742F :0E0A760008F0D086D0D0D083D082D0F0D0E06F :010A8400323F :0E0A8500C0E0C0F0C082C083C0D075D000C0F9 :0E0A930086758600E591C2E4F591907FAB7404 :0E0AA10010F0D086D0D0D083D082D0F0D0E03C :010AAF003214 :0E0AB000C0E0C0F0C082C083C084C085C0D04A :0E0ABE0075D000C086758600C000C007E591A7 :0E0ACC00C2E4F591907FA97401F0D007D0002C :0E0ADA00D086D0D0D085D084D083D082D0F00A :030AE800D0E03229 :0E0AEB00C0E0C0F0C082C083C084C085C0D00F :0E0AF90075D000C086758600C000C006E5916D :0E0B0700C2E4F591907FAA7401F0D006D000F0 :0E0B1500D086D0D0D085D084D083D082D0F0CE :030B2300D0E032ED :0C0B2600E545F5F0D2F24551B40002C2E2 :0D0B3200F290C009E0A2E092F3A20A92F551 :0C0B3F00D3E554B55306907FB8E0A2E166 :0C0B4B0092F4907E80E5F0F0E548F4257F :0B0B570049540F907E81F0E554F42516 :0D0B62005304541F907E82F090C004E09078 :0C0B6F007E83F00544E544907E84F07520 :0B0B7B00F005907E85E56FB56E0790D9 :0D0B86007FB7E5F0F022245EF8E6F0A3054D :0A0B9300F0E56F04540FF56F80E3E6 :0E0B9D00C0E0C0F0C082C083C0D075D000C0E0 :0E0BAB0086758600E591C2E4F591907FA974ED :0E0BB90002F0120B26D086D0D0D083D082D08E :040BC700F0D0E03258 :0E0BCB00C0E0C0F0C082C083C0D075D000C0B2 :0E0BD90086758600E591C2E4F591907FAA74BE :0E0BE70002F0D086D0D0D083D082D0F0D0E003 :010BF50032CD :0E0BF600C0E0C0F0C082C083C0D075D000C087 :0E0C040086758600E591C2E4F591907FA97493 :0E0C120004F0D086D0D0D083D082D0F0D0E0D5 :010C200032A1 :0E0C2100C0E0C0F0C082C083C0D075D000C05B :0E0C2F0086758600E591C2E4F591907FAA7467 :0E0C3D0004F0D086D0D0D083D082D0F0D0E0AA :010C4B003276 :0E0C4C00C0E0C0F0C082C083C0D075D000C030 :0E0C5A0086758600E591C2E4F591907FA9743D :0E0C680008F0D086D0D0D083D082D0F0D0E07B :010C7600324B :0E0C7700C0E0C0F0C082C083C0D075D000C005 :0E0C850086758600E591C2E4F591907FAA7411 :0E0C930008F0D086D0D0D083D082D0F0D0E050 :010CA1003220 :0E0CA200C0E0C0F0C082C083C0D075D000C0DA :0E0CB00086758600E591C2E4F591907FA974E7 :0E0CBE0010F0D086D0D0D083D082D0F0D0E01D :010CCC0032F5 :0E0CCD00C0E0C0F0C082C083C0D075D000C0AF :0E0CDB0086758600E591C2E4F591907FAA74BB :0E0CE90010F0D086D0D0D083D082D0F0D0E0F2 :010CF70032CA :0E0CF800C0E0C0F0C082C083C0D075D000C084 :0E0D060086758600E591C2E4F591907FA97490 :0E0D140020F0D086D0D0D083D082D0F0D0E0B6 :010D2200329E :0E0D2300C0E0C0F0C082C083C0D075D000C058 :0E0D310086758600E591C2E4F591907FAA7464 :0E0D3F0020F0D086D0D0D083D082D0F0D0E08B :010D4D003273 :0E0D4E00C0E0C0F0C082C083C0D075D000C02D :0E0D5C0086758600E591C2E4F591907FA9743A :0E0D6A0040F0D086D0D0D083D082D0F0D0E040 :010D78003248 :0E0D7900C0E0C0F0C082C083C0D075D000C002 :0E0D870086758600E591C2E4F591907FAA740E :0E0D950040F0D086D0D0D083D082D0F0D0E015 :010DA300321D :0E0DA400C0E0C0F0C082C083C0D075D000C0D7 :0E0DB20086758600E591C2E4F591907FA974E4 :0E0DC00080F0D086D0D0D083D082D0F0D0E0AA :010DCE0032F2 :0E0DCF00C0E0C0F0C082C083C0D075D000C0AC :0E0DDD0086758600E591C2E4F591907FAA74B8 :0E0DEB0080F0D086D0D0D083D082D0F0D0E07F :010DF90032C7 :0E0DFA0012010001FF00FF40C0BA3661010087 :040E080001020301DF :0E0E0C00090245000101004000090400000336 :0E0E1A00FF00FF00070581024000000705826F :0E0E280002400000070502024000000904001D :0E0E36000103FF00FF000705810340000A07CB :0D0E44000582024000000705020240000088 :020E5100590E38 :020E53005D0E32 :020E55006B0E22 :020E5700890E02 :040E5900040300008E :0E0E5D000E0342006100790063006F006D001B :0E0E6B001E0355005300420046004C00450097 :0E0E79005800200028004100460053004B00A6 :020E8700290040 :0E0E8900020300000000000000000000000056 :0E0E970000000000000000000000000000004D :060EA50000000000000047 :00000001FF baycomusb-0.10.orig/firmware/afskfirmware/main.rel0100644000175100017510000007320007337536151020351 0ustar abaabaXH H A areas 1 global symbols M main A _CODE size 0 flags 0 A CODE size 157 flags 20 A CSEG size D54 flags 20 S fillusbintr Def09CF A GSINIT size 8 flags 20 A GSINIT2 size 137 flags 20 A OSEG size 0 flags 4 A BSEG size B flags 80 A ISEG size 80 flags 0 A DSEG size 32 flags 0 A XSEG size C00 flags 0 T 00 00 02 00 00 02 02 E4 R 00 00 00 01 00 03 00 03 00 06 00 02 T 00 06 R 00 00 00 01 T 00 0B 02 03 05 R 00 00 00 01 00 03 00 02 T 00 0E R 00 00 00 01 T 00 13 02 03 26 R 00 00 00 01 00 03 00 02 T 00 16 R 00 00 00 01 T 00 1B 02 03 47 R 00 00 00 01 00 03 00 02 T 00 1E R 00 00 00 01 T 00 23 02 03 68 R 00 00 00 01 00 03 00 02 T 00 26 R 00 00 00 01 T 00 2B 02 03 A6 R 00 00 00 01 00 03 00 02 T 00 2E R 00 00 00 01 T 00 33 02 03 C7 R 00 00 00 01 00 03 00 02 T 00 36 R 00 00 00 01 T 00 3B 02 03 E8 R 00 00 00 01 00 03 00 02 T 00 3E R 00 00 00 01 T 00 43 02 01 00 R 00 00 00 01 00 03 00 01 T 00 46 R 00 00 00 01 T 00 4B 02 04 0B R 00 00 00 01 00 03 00 02 T 00 4E R 00 00 00 01 T 00 53 02 04 30 R 00 00 00 01 00 03 00 02 T 00 56 R 00 00 00 01 T 00 5B 02 04 55 R 00 00 00 01 00 03 00 02 T 00 5E R 00 00 00 01 T 00 63 02 04 7A R 00 00 00 01 00 03 00 02 T 00 66 R 00 00 00 01 T 00 E0 B0 04 00 B0 04 00 00 01 R 00 00 00 01 T 00 E8 R 00 00 00 01 T 00 F0 R 00 00 00 01 T 00 F0 30 30 30 30 30 30 30 30 00 R 00 00 00 01 T 00 F9 R 00 00 00 01 T 01 00 R 00 00 00 01 T 01 00 02 04 9B R 00 00 00 01 00 03 00 02 T 01 03 R 00 00 00 01 T 01 04 02 08 AD R 00 00 00 01 00 03 00 02 T 01 07 R 00 00 00 01 T 01 08 02 08 D8 R 00 00 00 01 00 03 00 02 T 01 0B R 00 00 00 01 T 01 0C 02 09 03 R 00 00 00 01 00 03 00 02 T 01 0F R 00 00 00 01 T 01 10 02 09 2E R 00 00 00 01 00 03 00 02 T 01 13 R 00 00 00 01 T 01 14 32 R 00 00 00 01 T 01 15 R 00 00 00 01 T 01 18 02 09 59 R 00 00 00 01 00 03 00 02 T 01 1B R 00 00 00 01 T 01 1C 02 09 94 R 00 00 00 01 00 03 00 02 T 01 1F R 00 00 00 01 T 01 20 02 0A 46 R 00 00 00 01 00 03 00 02 T 01 23 R 00 00 00 01 T 01 24 02 0A 74 R 00 00 00 01 00 03 00 02 T 01 27 R 00 00 00 01 T 01 28 02 0A 9F R 00 00 00 01 00 03 00 02 T 01 2B R 00 00 00 01 T 01 2C 02 0A CA R 00 00 00 01 00 03 00 02 T 01 2F R 00 00 00 01 T 01 30 02 0A F5 R 00 00 00 01 00 03 00 02 T 01 33 R 00 00 00 01 T 01 34 02 0B 20 R 00 00 00 01 00 03 00 02 T 01 37 R 00 00 00 01 T 01 38 02 0B 4B R 00 00 00 01 00 03 00 02 T 01 3B R 00 00 00 01 T 01 3C 02 0B 76 R 00 00 00 01 00 03 00 02 T 01 3F R 00 00 00 01 T 01 40 02 0B A1 R 00 00 00 01 00 03 00 02 T 01 43 R 00 00 00 01 T 01 44 02 0B CC R 00 00 00 01 00 03 00 02 T 01 47 R 00 00 00 01 T 01 48 02 0B F7 R 00 00 00 01 00 03 00 02 T 01 4B R 00 00 00 01 T 01 4C 02 0C 22 R 00 00 00 01 00 03 00 02 T 01 4F R 00 00 00 01 T 01 50 02 0C 4D R 00 00 00 01 00 03 00 02 T 01 53 R 00 00 00 01 T 01 54 02 0C 78 R 00 00 00 01 00 03 00 02 T 00 00 R 00 00 00 06 T 00 01 R 00 00 00 06 T 00 02 R 00 00 00 06 T 00 03 R 00 00 00 06 T 00 04 R 00 00 00 06 T 00 05 R 00 00 00 06 T 00 06 R 00 00 00 06 T 00 07 R 00 00 00 06 T 00 08 R 00 00 00 06 T 00 09 R 00 00 00 06 T 00 0A R 00 00 00 06 T 00 00 R 00 00 00 07 T 00 10 R 00 00 00 07 T 00 30 R 00 00 00 07 T 00 00 R 00 00 00 08 T 00 01 R 00 00 00 08 T 00 03 R 00 00 00 08 T 00 04 R 00 00 00 08 T 00 05 R 00 00 00 08 T 00 06 R 00 00 00 08 T 00 08 R 00 00 00 08 T 00 09 R 00 00 00 08 T 00 0A R 00 00 00 08 T 00 0B R 00 00 00 08 T 00 0D R 00 00 00 08 T 00 0E R 00 00 00 08 T 00 0F R 00 00 00 08 T 00 10 R 00 00 00 08 T 00 11 R 00 00 00 08 T 00 12 R 00 00 00 08 T 00 13 R 00 00 00 08 T 00 14 R 00 00 00 08 T 00 15 R 00 00 00 08 T 00 16 R 00 00 00 08 T 00 17 R 00 00 00 08 T 00 19 R 00 00 00 08 T 00 1A R 00 00 00 08 T 00 1B R 00 00 00 08 T 00 1C R 00 00 00 08 T 00 1D R 00 00 00 08 T 00 1E R 00 00 00 08 T 00 2E R 00 00 00 08 T 00 2F R 00 00 00 08 T 00 30 R 00 00 00 08 T 00 31 R 00 00 00 08 T 00 00 R 00 00 00 09 T 04 00 R 00 00 00 09 T 00 00 R 00 00 00 03 T 00 00 75 81 00 30 E4 F5 D0 F5 86 R 00 00 00 03 09 04 00 07 T 00 08 R 00 00 00 03 T 00 00 R 00 00 00 04 T 00 00 E4 F5 00 05 F5 00 08 F5 R 00 00 00 04 29 04 00 08 29 07 00 08 T 00 06 00 09 F5 00 0A F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 0A 00 11 F5 00 12 F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 0E 00 13 F5 00 14 F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 12 00 15 F5 00 04 F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 16 00 2F F5 00 2E F5 86 D2 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 1C 00 0A 75 8E 30 75 89 21 75 88 55 75 8D 64 R 00 00 00 04 29 02 00 06 T 00 29 75 87 00 90 7F A1 74 01 F0 90 7F AF 74 01 R 00 00 00 04 T 00 37 F0 E4 90 7F E0 F0 90 7F E1 F0 90 7F DD 74 R 00 00 00 04 T 00 45 09 F0 90 7F DE 74 07 F0 90 7F DF 74 05 F0 R 00 00 00 04 T 00 53 90 7F D7 74 12 F0 74 32 F0 74 02 F0 74 22 R 00 00 00 04 T 00 61 F0 90 7F 93 74 00 F0 90 7F 96 74 82 F0 90 R 00 00 00 04 T 00 6F 7F 9C 74 C2 F0 90 7F 94 74 00 F0 90 7F 9D R 00 00 00 04 T 00 7D 74 00 F0 90 7F 95 74 C3 F0 90 7F 98 74 28 R 00 00 00 04 T 00 8B F0 90 7F 9E 74 2A F0 75 A8 92 75 E8 01 90 R 00 00 00 04 T 00 99 7F AE 74 01 F0 90 7F AC 74 03 F0 90 7F AD R 00 00 00 04 T 00 A7 74 01 F0 75 98 52 75 20 42 78 00 E7 E2 A2 R 00 00 00 04 09 0C 00 01 T 00 B4 E0 92 00 08 92 00 01 E5 20 90 C0 08 F0 90 R 00 00 00 04 29 04 00 06 29 07 00 06 T 00 C0 C0 0C 74 FF F0 90 C0 0D E4 F0 90 C0 0A 74 R 00 00 00 04 T 00 CE 1F F0 78 00 F0 90 0D 34 E2 60 06 F0 A3 A3 R 00 00 00 04 09 05 00 01 00 08 00 02 T 00 DB 08 80 F7 E8 24 11 25 E0 90 0D 32 F0 R 00 00 00 04 00 0B 00 02 T 00 E7 R 00 00 00 04 T 00 E7 E4 F5 00 30 F5 00 31 90 D1 20 A3 E5 82 45 R 00 00 00 04 29 04 00 08 29 07 00 08 T 00 F3 83 70 F9 90 7F D6 74 0A F0 7A 1E 90 E8 90 R 00 00 00 04 T 01 01 A3 E5 82 45 83 70 F9 DA F4 90 7F D6 74 06 R 00 00 00 04 T 01 0F F0 12 09 CF R 00 00 00 04 00 04 00 02 T 01 13 R 00 00 00 04 T 01 13 90 7F C8 E0 20 E1 F9 90 7F C9 E0 B4 01 0D R 00 00 00 04 T 01 21 90 7D C0 E0 B4 55 06 90 7F C9 F0 80 06 90 R 00 00 00 04 T 01 2F 7F C9 F0 80 DF R 00 00 00 04 T 01 34 R 00 00 00 04 T 01 34 02 00 22 R 00 00 00 04 00 03 00 02 T 00 00 R 00 00 00 02 T 00 00 E5 00 05 45 00 11 60 0D R 00 00 00 02 29 03 00 08 29 06 00 08 T 00 06 R 00 00 00 02 T 00 06 C2 00 01 D2 00 00 D2 R 00 00 00 02 29 03 00 06 29 06 00 06 T 00 0B 00 02 E5 20 90 C0 08 F0 22 R 00 00 00 02 29 02 00 06 T 00 13 R 00 00 00 02 T 00 13 C2 00 00 A2 00 08 92 R 00 00 00 02 29 03 00 06 29 06 00 06 T 00 18 00 01 C2 00 02 E5 20 90 C0 08 F0 22 R 00 00 00 02 29 02 00 06 29 05 00 06 T 00 22 R 00 00 00 02 T 00 22 R 00 00 00 02 T 00 22 E5 00 09 B5 00 08 14 12 R 00 00 00 02 29 03 00 08 29 06 00 08 T 00 28 01 71 E4 F5 00 05 90 C0 00 F0 10 R 00 00 00 02 00 02 00 02 29 06 00 08 T 00 32 00 09 02 80 EC 12 00 00 80 E7 R 00 00 00 02 29 02 00 06 00 08 00 02 T 00 3B R 00 00 00 02 T 00 3B 75 00 05 01 75 00 0E 08 75 R 00 00 00 02 29 03 00 08 29 07 00 08 T 00 42 00 0B FF 75 00 0C FF E5 R 00 00 00 02 29 02 00 08 29 06 00 08 T 00 48 00 09 03 03 F5 82 54 C0 24 00 00 C5 82 54 R 00 00 00 02 29 02 00 08 09 0B 00 09 T 00 54 3F 34 00 00 F5 83 E0 F5 00 06 A3 E0 F5 R 00 00 00 02 89 04 00 09 29 0A 00 08 T 00 5F 00 07 75 00 10 02 78 R 00 00 00 02 29 02 00 08 29 05 00 08 T 00 64 00 E1 E2 C3 95 00 07 50 03 E2 F5 R 00 00 00 02 09 02 00 01 29 07 00 08 T 00 6D 00 07 R 00 00 00 02 29 02 00 08 T 00 6E R 00 00 00 02 T 00 6E E5 00 09 24 00 00 F8 E6 24 FE 40 09 75 R 00 00 00 02 29 03 00 08 09 06 00 07 T 00 79 00 06 01 75 00 07 00 75 R 00 00 00 02 29 02 00 08 29 06 00 08 T 00 7F 00 10 00 R 00 00 00 02 29 02 00 08 T 00 81 R 00 00 00 02 T 00 81 12 00 06 R 00 00 00 02 00 03 00 02 T 00 84 R 00 00 00 02 T 00 84 E5 00 06 24 FF F5 00 06 E5 R 00 00 00 02 29 03 00 08 29 08 00 08 T 00 8B 00 07 34 FF F5 00 07 50 0B 12 R 00 00 00 02 29 02 00 08 29 07 00 08 T 00 93 01 71 74 7E 90 C0 00 F0 80 E7 R 00 00 00 02 00 02 00 02 T 00 9D R 00 00 00 02 T 00 9D 85 00 10 00 0F 75 R 00 00 00 02 29 03 00 08 29 05 00 08 T 00 A1 00 05 02 R 00 00 00 02 29 02 00 08 T 00 A3 R 00 00 00 02 T 00 A3 E5 00 09 24 00 00 F8 E6 B5 R 00 00 00 02 29 03 00 08 09 06 00 07 T 00 AA 00 0F 2B 75 00 10 00 20 E6 18 E5 R 00 00 00 02 29 02 00 08 29 06 00 08 T 00 B3 00 0B F4 12 01 2C E5 R 00 00 00 02 29 02 00 08 00 06 00 02 T 00 B9 00 0C F4 12 01 2C 12 R 00 00 00 02 29 02 00 08 00 06 00 02 T 00 BF 01 0A 75 00 0B FF 75 R 00 00 00 02 00 02 00 02 29 05 00 08 T 00 C5 00 0C FF 75 00 10 02 R 00 00 00 02 29 02 00 08 29 06 00 08 T 00 CA R 00 00 00 02 T 00 CA E5 00 09 04 54 0F F5 00 09 B5 R 00 00 00 02 29 03 00 08 29 09 00 08 T 00 D2 00 08 C9 02 00 F3 R 00 00 00 02 29 02 00 08 00 06 00 02 T 00 D7 R 00 00 00 02 T 00 D7 E5 00 09 03 03 F5 82 54 C0 25 00 0F 24 R 00 00 00 02 29 03 00 08 29 0C 00 08 T 00 E2 00 00 C5 82 54 3F 34 00 00 F5 83 E0 12 R 00 00 00 02 09 02 00 09 89 09 00 09 T 00 ED 01 43 05 00 0F 80 B0 R 00 00 00 02 00 02 00 02 29 05 00 08 T 00 F3 R 00 00 00 02 T 00 F3 12 01 0A 75 00 05 03 7A 14 D3 12 R 00 00 00 02 00 03 00 02 29 06 00 08 T 00 FD 01 17 DA FA 75 00 05 00 12 R 00 00 00 02 00 02 00 02 29 07 00 08 T 01 05 00 00 02 00 22 R 00 00 00 02 00 02 00 02 00 05 00 02 T 01 0A R 00 00 00 02 T 01 0A 7B 7E 7A 08 EB 13 FB 12 01 17 DA F8 22 R 00 00 00 02 00 0A 00 02 T 01 17 R 00 00 00 02 T 01 17 E5 00 0D 13 F5 00 0D D5 R 00 00 00 02 29 03 00 08 29 07 00 08 T 01 1D 00 0E 0C 75 00 0E 08 12 R 00 00 00 02 29 02 00 08 29 06 00 08 T 01 23 01 71 E5 00 0D 90 C0 00 F0 22 R 00 00 00 02 00 02 00 02 29 05 00 08 T 01 2C R 00 00 00 02 T 01 2C FB 7A 08 EB 13 FB 12 01 17 E5 00 0D F4 54 R 00 00 00 02 00 09 00 02 29 0C 00 08 T 01 39 F8 70 04 C3 12 01 17 DA ED 22 R 00 00 00 02 00 07 00 02 T 01 43 R 00 00 00 02 T 01 43 FB 7A 08 C3 E5 00 0C 13 F5 00 0C E5 R 00 00 00 02 29 07 00 08 29 0B 00 08 T 01 4D 00 0B 13 F5 00 0B EB 30 E0 01 B3 50 06 63 R 00 00 00 02 29 02 00 08 29 06 00 08 T 01 59 00 0C 84 63 00 0B 08 13 FB 12 R 00 00 00 02 09 02 00 08 09 06 00 08 T 01 61 01 17 E5 00 0D F4 54 F8 70 04 C3 12 R 00 00 00 02 00 02 00 02 29 05 00 08 T 01 6C 01 17 DA D6 22 R 00 00 00 02 00 02 00 02 T 01 71 R 00 00 00 02 T 01 71 90 C0 01 E0 30 E1 01 22 30 E0 03 12 02 0C R 00 00 00 02 00 0E 00 02 T 01 7F R 00 00 00 02 T 01 7F R 00 00 00 02 T 01 7F E5 00 14 B5 00 13 47 R 00 00 00 02 29 03 00 08 29 06 00 08 T 01 84 R 00 00 00 02 T 01 84 90 7F C8 E0 20 E1 3E E5 00 08 24 00 00 F8 R 00 00 00 02 29 0A 00 08 09 0D 00 07 T 01 90 E5 00 08 04 54 0F B5 00 09 03 02 R 00 00 00 02 29 03 00 08 29 09 00 08 T 01 99 02 09 R 00 00 00 02 00 02 00 02 T 01 9B R 00 00 00 02 T 01 9B FF 90 7F C9 E0 F6 60 20 FE E5 00 08 03 03 R 00 00 00 02 29 0C 00 08 T 01 A8 F5 84 54 C0 24 00 00 C5 84 54 3F 34 00 00 R 00 00 00 02 09 07 00 09 89 0E 00 09 T 01 B4 F5 85 90 7D C0 R 00 00 00 02 T 01 B9 R 00 00 00 02 T 01 B9 E0 A3 05 86 F0 A3 15 86 DE F6 R 00 00 00 02 T 01 C3 R 00 00 00 02 T 01 C3 8F 00 08 90 7F C9 F0 R 00 00 00 02 29 03 00 08 T 01 C9 R 00 00 00 02 T 01 C9 80 3E R 00 00 00 02 T 01 CB R 00 00 00 02 T 01 CB 90 7F B8 E0 20 E1 B2 E5 00 14 24 00 10 F8 R 00 00 00 02 29 0A 00 08 09 0D 00 07 T 01 D7 E6 60 20 FE E5 00 14 03 03 F5 84 54 C0 24 R 00 00 00 02 29 07 00 08 T 01 E4 04 00 C5 84 54 3F 34 04 00 F5 85 90 7E 00 R 00 00 00 02 09 02 00 09 89 09 00 09 T 01 F0 R 00 00 00 02 T 01 F0 05 86 E0 A3 15 86 F0 A3 DE F6 R 00 00 00 02 T 01 FA R 00 00 00 02 T 01 FA E6 90 7F B9 F0 E5 00 14 04 54 1F F5 00 14 R 00 00 00 02 29 08 00 08 29 0E 00 08 T 02 06 02 01 84 R 00 00 00 02 00 03 00 02 T 02 09 R 00 00 00 02 T 02 09 02 01 71 R 00 00 00 02 00 03 00 02 T 02 0C R 00 00 00 02 T 02 0C 90 C0 00 E0 FE 7F 08 R 00 00 00 02 T 02 13 R 00 00 00 02 T 02 13 EE 13 FE E5 00 19 33 F5 00 19 B4 7E 03 02 R 00 00 00 02 29 06 00 08 29 0A 00 08 T 02 1F 02 9B F4 54 7F 60 0E E5 00 12 60 07 E5 R 00 00 00 02 00 02 00 02 29 0A 00 08 T 02 2B 00 19 54 3F B4 3E 08 R 00 00 00 02 29 02 00 08 T 02 31 R 00 00 00 02 T 02 31 DF E0 22 R 00 00 00 02 T 02 34 R 00 00 00 02 T 02 34 75 00 12 00 80 F8 R 00 00 00 02 29 03 00 08 T 02 39 R 00 00 00 02 T 02 39 C3 E5 00 17 33 F5 00 17 E5 R 00 00 00 02 29 04 00 08 29 08 00 08 T 02 40 00 18 33 F5 00 18 E5 R 00 00 00 02 29 02 00 08 29 06 00 08 T 02 45 00 19 30 E0 01 B3 50 06 63 00 17 21 63 R 00 00 00 02 29 02 00 08 09 0B 00 08 T 02 50 00 18 10 13 E5 00 1A 13 F5 R 00 00 00 02 09 02 00 08 29 07 00 08 T 02 57 00 1A D5 00 1B D6 75 R 00 00 00 02 29 02 00 08 29 05 00 08 T 02 5C 00 1B 08 E5 00 15 03 03 F5 82 54 C0 25 R 00 00 00 02 29 02 00 08 29 06 00 08 T 02 67 00 1C 24 04 00 C5 82 54 3F 34 R 00 00 00 02 29 02 00 08 09 05 00 09 T 02 6F 04 00 F5 83 E5 00 1A F0 05 R 00 00 00 02 89 02 00 09 29 07 00 08 T 02 76 00 1C E5 00 1C 30 E6 B5 E5 R 00 00 00 02 29 02 00 08 29 05 00 08 T 02 7D 00 15 24 00 10 F8 76 40 E5 R 00 00 00 02 29 02 00 08 09 05 00 07 T 02 84 00 15 04 54 1F B5 00 14 06 75 R 00 00 00 02 29 02 00 08 29 08 00 08 T 02 8C 00 12 00 02 02 31 F5 R 00 00 00 02 29 02 00 08 00 06 00 02 T 02 92 00 15 75 00 1C 00 05 R 00 00 00 02 29 02 00 08 29 05 00 08 T 02 97 00 16 02 02 31 R 00 00 00 02 29 02 00 08 00 05 00 02 T 02 9B R 00 00 00 02 T 02 9B E5 00 12 60 2F E5 00 17 64 F2 F8 E5 R 00 00 00 02 29 03 00 08 29 08 00 08 T 02 A5 00 18 64 A1 48 70 23 E5 00 15 24 R 00 00 00 02 29 02 00 08 29 0A 00 08 T 02 AE 00 10 F8 E5 00 1C F6 E5 R 00 00 00 02 09 02 00 07 29 06 00 08 T 02 B4 00 16 70 07 74 FC 26 50 12 80 04 24 F8 40 R 00 00 00 02 29 02 00 08 T 02 C1 0C E5 00 15 04 54 1F B5 00 14 02 80 02 F5 R 00 00 00 02 29 04 00 08 29 0A 00 08 T 02 CD 00 13 R 00 00 00 02 29 02 00 08 T 02 CE R 00 00 00 02 T 02 CE E4 F5 00 16 F5 00 1C 75 R 00 00 00 02 29 04 00 08 29 07 00 08 T 02 D4 00 12 01 F4 F5 00 17 F5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 02 DA 00 18 75 00 1B 08 85 R 00 00 00 02 29 02 00 08 29 05 00 08 T 02 DF 00 13 00 15 02 R 00 00 00 02 29 02 00 08 29 04 00 08 T 02 E2 02 31 R 00 00 00 02 00 02 00 02 T 02 E4 R 00 00 00 02 T 02 E4 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 F2 86 75 86 00 C2 89 D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 00 D0 F0 D0 E0 32 R 00 00 00 02 T 03 05 R 00 00 00 02 T 03 05 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 13 86 75 86 00 C2 8D D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 21 D0 F0 D0 E0 32 R 00 00 00 02 T 03 26 R 00 00 00 02 T 03 26 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 34 86 75 86 00 C2 8B D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 42 D0 F0 D0 E0 32 R 00 00 00 02 T 03 47 R 00 00 00 02 T 03 47 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 55 86 75 86 00 C2 8F D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 63 D0 F0 D0 E0 32 R 00 00 00 02 T 03 68 R 00 00 00 02 T 03 68 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 76 86 75 86 00 C0 00 10 98 16 10 99 0F D0 00 R 00 00 00 02 T 03 84 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 32 D2 R 00 00 00 02 T 03 92 00 0A 80 EA E5 00 2E 24 R 00 00 00 02 29 02 00 06 29 07 00 08 T 03 98 00 1E F8 E5 99 F6 E5 00 2E 04 54 0F F5 R 00 00 00 02 09 02 00 08 29 09 00 08 T 03 A3 00 2E 80 DC R 00 00 00 02 29 02 00 08 T 03 A6 R 00 00 00 02 T 03 A6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 B4 86 75 86 00 C2 CF D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 C2 D0 F0 D0 E0 32 R 00 00 00 02 T 03 C7 R 00 00 00 02 T 03 C7 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 D5 86 75 86 00 C2 DC D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 E3 D0 F0 D0 E0 32 R 00 00 00 02 T 03 E8 R 00 00 00 02 T 03 E8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 F6 86 75 86 00 C2 C0 C2 C1 D0 86 D0 D0 D0 83 R 00 00 00 02 T 04 04 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 04 0B R 00 00 00 02 T 04 0B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 19 86 75 86 00 E5 91 C2 E5 F5 91 D0 86 D0 D0 R 00 00 00 02 T 04 27 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 04 30 R 00 00 00 02 T 04 30 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 3E 86 75 86 00 E5 91 C2 E6 F5 91 D0 86 D0 D0 R 00 00 00 02 T 04 4C D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 04 55 R 00 00 00 02 T 04 55 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 63 86 75 86 00 E5 91 C2 E7 F5 91 D0 86 D0 D0 R 00 00 00 02 T 04 71 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 04 7A R 00 00 00 02 T 04 7A C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 88 86 75 86 00 C2 DB D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 04 96 D0 F0 D0 E0 32 R 00 00 00 02 T 04 9B R 00 00 00 02 T 04 9B C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 04 A9 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 04 B7 C2 E4 F5 91 90 7F AB 74 01 F0 75 00 00 00 R 00 00 00 02 29 0D 00 08 T 04 C4 90 7F E9 E0 B4 06 59 90 7F E8 E0 B4 80 4F R 00 00 00 02 T 04 D2 90 7F EB E0 B4 01 0C 90 7F D4 74 0C A3 F0 R 00 00 00 02 89 0D 00 02 T 04 DF A3 74 0C A3 F0 80 39 R 00 00 00 02 09 04 00 02 T 04 E5 R 00 00 00 02 T 04 E5 B4 02 12 90 7F EA E0 70 33 90 7F D4 74 R 00 00 00 02 T 04 F2 0C B5 F0 A3 74 0C B5 F0 80 24 R 00 00 00 02 89 02 00 02 09 07 00 02 T 04 FA R 00 00 00 02 T 04 FA B4 03 24 90 7F EA E0 24 FC 40 1C E0 25 E0 R 00 00 00 02 T 05 08 24 0C FA F5 82 E4 34 0C FA F5 83 E0 F5 F0 R 00 00 00 02 09 03 00 02 89 09 00 02 T 05 14 A3 E0 90 7F D4 F0 A3 E5 F0 F0 R 00 00 00 02 T 05 1E R 00 00 00 02 T 05 1E 02 08 92 R 00 00 00 02 00 03 00 02 T 05 21 R 00 00 00 02 T 05 21 02 08 8E R 00 00 00 02 00 03 00 02 T 05 24 R 00 00 00 02 T 05 24 B4 09 41 90 7F E8 E0 70 F4 90 7F EA E0 24 R 00 00 00 02 T 05 32 FE 40 EC E0 F5 00 30 R 00 00 00 02 29 07 00 08 T 05 38 R 00 00 00 02 T 05 38 90 7F D7 78 07 E8 44 10 F0 44 30 F0 E8 F0 R 00 00 00 02 T 05 46 44 20 F0 D8 F2 E4 F0 74 02 90 7F B6 78 07 R 00 00 00 02 T 05 54 F0 A3 A3 D8 FB 90 7F C6 78 07 F0 A3 A3 D8 R 00 00 00 02 T 05 62 FB 12 09 CF 80 B6 R 00 00 00 02 00 04 00 02 T 05 68 R 00 00 00 02 T 05 68 B4 0B 1A 90 7F E8 E0 B4 01 AF E5 00 30 B4 R 00 00 00 02 29 0D 00 08 T 05 75 01 AA 90 7F EC E0 70 A4 90 7F EA E0 F5 R 00 00 00 02 T 05 82 00 31 80 B3 R 00 00 00 02 29 02 00 08 T 05 85 R 00 00 00 02 T 05 85 B4 0A 20 90 7F E8 E0 B4 81 92 E5 00 30 B4 R 00 00 00 02 29 0D 00 08 T 05 92 01 8D 90 7F EC E0 70 87 E5 00 31 R 00 00 00 02 29 0B 00 08 T 05 9C R 00 00 00 02 T 05 9C 90 7F 00 F0 90 7F B5 74 01 F0 80 4E R 00 00 00 02 T 05 A8 R 00 00 00 02 T 05 A8 B4 08 0B 90 7F E8 E0 B4 80 47 E5 00 30 80 R 00 00 00 02 29 0D 00 08 T 05 B5 E6 R 00 00 00 02 T 05 B6 R 00 00 00 02 T 05 B6 70 44 90 7F E8 E0 B4 80 11 74 01 R 00 00 00 02 T 05 C1 R 00 00 00 02 T 05 C1 90 7F 00 F0 A3 E4 F0 90 7F B5 74 02 F0 80 R 00 00 00 02 T 05 CF 26 R 00 00 00 02 T 05 D0 R 00 00 00 02 T 05 D0 B4 81 03 E4 80 EB R 00 00 00 02 T 05 D6 R 00 00 00 02 T 05 D6 B4 82 20 90 7F EC E0 90 7F C4 30 E7 03 90 R 00 00 00 02 T 05 E4 7F B4 54 0F 60 0F 20 E3 0C 25 E0 25 82 F5 R 00 00 00 02 T 05 F2 82 E0 80 CB R 00 00 00 02 T 05 F6 R 00 00 00 02 T 05 F6 02 08 92 R 00 00 00 02 00 03 00 02 T 05 F9 R 00 00 00 02 T 05 F9 02 08 8E R 00 00 00 02 00 03 00 02 T 05 FC R 00 00 00 02 T 05 FC B4 03 05 75 F0 01 80 06 R 00 00 00 02 T 06 04 R 00 00 00 02 T 06 04 B4 01 44 75 F0 00 R 00 00 00 02 T 06 0A R 00 00 00 02 T 06 0A 90 7F E8 E0 B4 02 E8 A3 A3 E0 70 E3 A3 E0 R 00 00 00 02 T 06 18 70 DF A3 E0 90 7F C4 30 E7 05 90 7F B4 44 R 00 00 00 02 T 06 26 10 20 E3 CF 54 1F 05 86 90 7F D7 F0 44 20 R 00 00 00 02 T 06 34 F0 54 0F F0 15 86 25 E0 25 82 F5 82 E5 F0 R 00 00 00 02 T 06 42 F0 80 B1 R 00 00 00 02 T 06 45 R 00 00 00 02 T 06 45 02 07 08 R 00 00 00 02 00 03 00 02 T 06 48 R 00 00 00 02 T 06 48 02 08 8E R 00 00 00 02 00 03 00 02 T 06 4B R 00 00 00 02 T 06 4B B4 C0 F7 90 7F E8 E0 B4 C0 F3 E5 00 05 F5 R 00 00 00 02 29 0D 00 08 T 06 58 F0 D2 F2 45 00 11 B4 00 02 C2 F2 90 C0 09 R 00 00 00 02 29 06 00 08 T 06 65 E0 A2 E0 92 F3 A2 00 0A 92 F5 E4 90 7F 04 R 00 00 00 02 29 08 00 06 T 06 72 F0 90 7F 00 E5 F0 F0 E5 00 08 F4 25 00 09 R 00 00 00 02 29 0A 00 08 29 0E 00 08 T 06 7E 54 0F 90 7F 01 F0 E5 00 14 F4 25 00 13 04 R 00 00 00 02 29 09 00 08 29 0D 00 08 T 06 8A 54 1F 90 7F 02 F0 90 C0 04 E0 90 7F 03 F0 R 00 00 00 02 T 06 98 05 00 04 E5 00 04 90 7F 05 F0 E5 R 00 00 00 02 29 03 00 08 29 06 00 08 T 06 A1 00 05 A3 F0 E5 00 09 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 A9 00 08 A3 F0 E5 00 0A A3 F0 74 00 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 B5 00 06 A3 F0 E5 00 07 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 BD 00 12 A3 F0 E5 00 14 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 C5 00 13 A3 F0 E5 00 15 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 CD 00 16 A3 F0 E5 00 1D 90 7F 12 F0 90 C0 01 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 D9 E0 90 7F 13 F0 90 C0 08 E0 90 7F 14 F0 90 R 00 00 00 02 T 06 E7 C0 09 E0 90 7F 15 F0 90 7F C8 E0 90 7F 16 R 00 00 00 02 T 06 F5 F0 90 7F EE E0 24 E9 50 01 E4 24 17 90 R 00 00 00 02 T 07 02 7F B5 F0 02 08 92 R 00 00 00 02 00 06 00 02 T 07 08 R 00 00 00 02 T 07 08 B4 C8 19 90 7F E8 E0 B4 C0 0F 74 03 90 R 00 00 00 02 T 07 15 7F 00 F0 90 7F B5 74 01 F0 02 08 92 R 00 00 00 02 00 0C 00 02 T 07 21 R 00 00 00 02 T 07 21 02 08 8E R 00 00 00 02 00 03 00 02 T 07 24 R 00 00 00 02 T 07 24 B4 C9 21 90 7F E8 E0 B4 C0 17 90 7F 00 78 R 00 00 00 02 T 07 32 00 F0 E2 60 05 F0 08 A3 80 F8 E8 24 10 90 R 00 00 00 02 09 02 00 01 T 07 3F 7F B5 F0 02 08 92 R 00 00 00 02 00 06 00 02 T 07 45 R 00 00 00 02 T 07 45 02 08 8E R 00 00 00 02 00 03 00 02 T 07 48 R 00 00 00 02 T 07 48 B4 D0 4D 90 7F E8 E0 B4 C0 43 90 7F EC E0 R 00 00 00 02 T 07 56 B4 01 0A 90 7F EA E0 54 01 F5 00 11 D2 R 00 00 00 02 29 0C 00 08 T 07 62 00 09 R 00 00 00 02 29 02 00 06 T 07 63 R 00 00 00 02 T 07 63 90 7F 00 E5 00 05 45 00 11 60 02 74 01 F0 R 00 00 00 02 29 06 00 08 29 09 00 08 T 07 6F 90 C0 09 E0 54 01 64 01 90 7F 01 F0 90 R 00 00 00 02 T 07 7C C0 04 E0 90 7F 02 F0 90 7F EE E0 24 FD 50 R 00 00 00 02 T 07 8A 01 E4 24 03 90 7F B5 F0 02 08 92 R 00 00 00 02 00 0B 00 02 T 07 95 R 00 00 00 02 T 07 95 02 08 8E R 00 00 00 02 00 03 00 02 T 07 98 R 00 00 00 02 T 07 98 B4 D1 29 90 7F E8 E0 B4 C0 1F 90 7F 00 78 R 00 00 00 02 T 07 A6 00 E0 7F 06 E2 F0 A3 08 DF FA 90 7F EE E0 R 00 00 00 02 09 02 00 01 T 07 B3 24 FA 50 01 E4 24 06 90 7F B5 F0 02 08 92 R 00 00 00 02 00 0E 00 02 T 07 C1 R 00 00 00 02 T 07 C1 02 08 8E R 00 00 00 02 00 03 00 02 T 07 C4 R 00 00 00 02 T 07 C4 B4 D2 20 90 7F E8 E0 B4 40 16 90 7F EA E0 R 00 00 00 02 T 07 D2 F5 F0 90 7F 98 E0 A2 F0 92 E3 A2 F1 92 E5 R 00 00 00 02 T 07 E0 F0 02 08 92 R 00 00 00 02 00 04 00 02 T 07 E4 R 00 00 00 02 T 07 E4 02 08 8E R 00 00 00 02 00 03 00 02 T 07 E7 R 00 00 00 02 T 07 E7 B4 D3 16 90 7F E8 E0 B4 40 07 90 7F EA E0 R 00 00 00 02 T 07 F5 10 00 0A 03 R 00 00 00 02 29 03 00 06 T 07 F8 R 00 00 00 02 T 07 F8 02 08 8E R 00 00 00 02 00 03 00 02 T 07 FB R 00 00 00 02 T 07 FB F5 99 02 08 92 R 00 00 00 02 00 05 00 02 T 08 00 R 00 00 00 02 T 08 00 B4 D4 4D 90 7F E8 E0 B4 C0 43 90 7F EC E0 R 00 00 00 02 T 08 0E 90 7F EA B4 01 07 E0 90 C0 0D F0 80 08 B4 R 00 00 00 02 T 08 1C 02 05 E0 90 C0 0C F0 90 C0 0E E0 90 7F 00 R 00 00 00 02 T 08 2A F0 90 C0 0D E0 90 7F 01 F0 90 C0 0C E0 90 R 00 00 00 02 T 08 38 7F 02 F0 90 7F EE E0 24 FD 50 01 E4 24 03 R 00 00 00 02 T 08 46 90 7F B5 F0 02 08 92 R 00 00 00 02 00 07 00 02 T 08 4D R 00 00 00 02 T 08 4D 02 08 8E R 00 00 00 02 00 03 00 02 T 08 50 R 00 00 00 02 T 08 50 B4 D5 3B 90 7F E8 E0 B4 C0 31 90 7F EC E0 R 00 00 00 02 T 08 5E B4 01 08 90 7F EA E0 90 C0 0A F0 90 C0 0B R 00 00 00 02 T 08 6C E0 90 7F 00 F0 90 C0 0A E0 90 7F 01 F0 90 R 00 00 00 02 T 08 7A 7F EE E0 24 FE 50 01 E4 24 02 90 7F B5 F0 R 00 00 00 02 T 08 88 02 08 92 R 00 00 00 02 00 03 00 02 T 08 8B R 00 00 00 02 T 08 8B 02 08 8E R 00 00 00 02 00 03 00 02 T 08 8E R 00 00 00 02 T 08 8E R 00 00 00 02 T 08 8E 74 03 80 02 R 00 00 00 02 T 08 92 R 00 00 00 02 T 08 92 74 02 R 00 00 00 02 T 08 94 R 00 00 00 02 T 08 94 90 7F B4 F0 R 00 00 00 02 T 08 98 R 00 00 00 02 T 08 98 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 08 A6 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 08 AD R 00 00 00 02 T 08 AD C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 BB 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 C9 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 D7 32 R 00 00 00 02 T 08 D8 R 00 00 00 02 T 08 D8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 E6 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 F4 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 02 32 R 00 00 00 02 T 09 03 R 00 00 00 02 T 09 03 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 11 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 09 1F 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 2D 32 R 00 00 00 02 T 09 2E R 00 00 00 02 T 09 2E C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 3C 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 09 4A 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 58 32 R 00 00 00 02 T 09 59 R 00 00 00 02 T 09 59 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 09 67 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 09 75 C2 E4 F5 91 90 7F A9 74 01 F0 D0 07 D0 00 R 00 00 00 02 T 09 83 D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 D0 F0 R 00 00 00 02 T 09 91 D0 E0 32 R 00 00 00 02 T 09 94 R 00 00 00 02 T 09 94 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 09 A2 75 D0 00 C0 86 75 86 00 C0 00 C0 06 E5 91 R 00 00 00 02 T 09 B0 C2 E4 F5 91 90 7F AA 74 01 F0 D0 06 D0 00 R 00 00 00 02 T 09 BE D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 D0 F0 R 00 00 00 02 T 09 CC D0 E0 32 R 00 00 00 02 T 09 CF R 00 00 00 02 T 09 CF E5 00 05 F5 F0 D2 F2 45 00 11 B4 00 02 C2 R 00 00 00 02 29 03 00 08 29 0A 00 08 T 09 DB F2 90 C0 09 E0 A2 E0 92 F3 A2 00 0A 92 F5 R 00 00 00 02 29 0C 00 06 T 09 E8 D3 E5 00 14 B5 00 13 06 90 7F B8 E0 A2 E1 R 00 00 00 02 29 04 00 08 29 07 00 08 T 09 F4 92 F4 90 7E 80 E5 F0 F0 E5 00 08 F4 25 R 00 00 00 02 29 0B 00 08 T 0A 00 00 09 54 0F 90 7E 81 F0 E5 00 14 F4 25 R 00 00 00 02 29 02 00 08 29 0B 00 08 T 0A 0B 00 13 04 54 1F 90 7E 82 F0 90 C0 04 E0 90 R 00 00 00 02 29 02 00 08 T 0A 18 7E 83 F0 05 00 04 E5 00 04 90 7E 84 F0 75 R 00 00 00 02 29 06 00 08 29 09 00 08 T 0A 24 F0 05 90 7E 85 E5 00 2F B5 00 2E 07 90 R 00 00 00 02 29 08 00 08 29 0B 00 08 T 0A 2F 7F B7 E5 F0 F0 22 24 00 1E F8 E6 F0 A3 05 R 00 00 00 02 09 09 00 08 T 0A 3C F0 E5 00 2F 04 54 0F F5 00 2F 80 E3 R 00 00 00 02 29 04 00 08 29 0A 00 08 T 0A 46 R 00 00 00 02 T 0A 46 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 54 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A 62 02 F0 12 09 CF D0 86 D0 D0 D0 83 D0 82 D0 R 00 00 00 02 00 05 00 02 T 0A 70 F0 D0 E0 32 R 00 00 00 02 T 0A 74 R 00 00 00 02 T 0A 74 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 82 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A 90 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 9E 32 R 00 00 00 02 T 0A 9F R 00 00 00 02 T 0A 9F C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A AD 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A BB 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A C9 32 R 00 00 00 02 T 0A CA R 00 00 00 02 T 0A CA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A D8 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A E6 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A F4 32 R 00 00 00 02 T 0A F5 R 00 00 00 02 T 0A F5 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 03 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0B 11 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 1F 32 R 00 00 00 02 T 0B 20 R 00 00 00 02 T 0B 20 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 2E 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B 3C 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 4A 32 R 00 00 00 02 T 0B 4B R 00 00 00 02 T 0B 4B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 59 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0B 67 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 75 32 R 00 00 00 02 T 0B 76 R 00 00 00 02 T 0B 76 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 84 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B 92 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B A0 32 R 00 00 00 02 T 0B A1 R 00 00 00 02 T 0B A1 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B AF 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0B BD 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B CB 32 R 00 00 00 02 T 0B CC R 00 00 00 02 T 0B CC C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B DA 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B E8 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B F6 32 R 00 00 00 02 T 0B F7 R 00 00 00 02 T 0B F7 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0C 05 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0C 13 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0C 21 32 R 00 00 00 02 T 0C 22 R 00 00 00 02 T 0C 22 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0C 30 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0C 3E 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0C 4C 32 R 00 00 00 02 T 0C 4D R 00 00 00 02 T 0C 4D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0C 5B 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0C 69 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0C 77 32 R 00 00 00 02 T 0C 78 R 00 00 00 02 T 0C 78 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0C 86 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0C 94 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0C A2 32 R 00 00 00 02 T 0C A3 R 00 00 00 02 T 0C A3 12 01 00 01 FF 00 FF 40 C0 BA 36 61 01 00 R 00 00 00 02 T 0C B1 01 02 03 01 R 00 00 00 02 T 0C B5 R 00 00 00 02 T 0C B5 09 02 45 00 01 01 00 40 00 09 04 00 00 03 R 00 00 00 02 T 0C C3 FF 00 FF 00 07 05 81 02 40 00 00 07 05 82 R 00 00 00 02 T 0C D1 02 40 00 00 07 05 02 02 40 00 00 09 04 00 R 00 00 00 02 T 0C DF 01 03 FF 00 FF 00 07 05 81 03 40 00 0A 07 R 00 00 00 02 T 0C ED 05 82 02 40 00 00 07 05 02 02 40 00 00 R 00 00 00 02 T 0C FA R 00 00 00 02 T 0C FA 0D 02 0D 02 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C FC 0D 06 0D 06 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C FE 0D 14 0D 14 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0D 00 0D 32 0D 32 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0D 02 R 00 00 00 02 T 0D 02 04 03 00 00 R 00 00 00 02 T 0D 06 R 00 00 00 02 T 0D 06 0E 03 42 00 61 00 79 00 63 00 6F 00 6D 00 R 00 00 00 02 T 0D 14 R 00 00 00 02 T 0D 14 1E 03 55 00 53 00 42 00 46 00 4C 00 45 00 R 00 00 00 02 T 0D 22 58 00 20 00 28 00 41 00 46 00 53 00 4B 00 R 00 00 00 02 T 0D 30 29 00 R 00 00 00 02 T 0D 32 R 00 00 00 02 T 0D 32 02 03 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0D 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0D 4E 00 00 00 00 00 00 R 00 00 00 02 baycomusb-0.10.orig/firmware/afskfirmware/main.lst0100644000175100017510000042316507337536151020402 0ustar abaaba 1 .module main 2 3 ;; ENDPOINTS 4 ;; EP0 in/out Control 5 ;; EP1 in Interrupt: Status 6 ;; Byte 0: Modem Status 7 ;; Bit 0-1: Transmitter status 8 ;; 0: idle (off) 9 ;; 1: keyup 10 ;; 2: transmitting packets 11 ;; 3: tail 12 ;; Bit 2: PTT status (1=on) 13 ;; Bit 3: DCD 14 ;; Bit 4: RXB (Rx Packet Ready) 15 ;; Bit 5: UART transmitter empty 16 ;; Bit 6-7: unused 17 ;; Byte 1: Number of empty 64 byte chunks in TX fifo 18 ;; Byte 2: Number of full 64 byte chunks in RX fifo 19 ;; Byte 3: RSSI value 20 ;; Byte 4: IRQ count 21 ;; Byte 5-20: (as needed) UART receiver chars 22 ;; EP2 out Packets to be transmitted 23 ;; EP2 in Received packets; note they have the CRC appended 24 25 ;; COMMAND LIST 26 ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) 27 ;; C0 C8 read mode 28 ;; Return: 29 ;; Byte 0: 3 (MODE_AFSK) 30 ;; C0 C9 return serial number string 31 ;; C0 D0 get/set PTT/DCD/RSSI 32 ;; wIndex = 1: set forced ptt to wValue 33 ;; Return: 34 ;; Byte 0: PTT status 35 ;; Byte 1: DCD status 36 ;; Byte 2: RSSI status 37 ;; C0 D1 get Bitrate 38 ;; Return: 39 ;; Byte 0-2: TX Bitrate 40 ;; Byte 3-5: RX Bitrate 41 ;; 40 D2 set CON/STA led 42 ;; Bits 0-1 of wValue 43 ;; 40 D3 send byte to UART 44 ;; Byte in wValue 45 ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) 46 ;; wIndex = 1: write wValue to output register 47 ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) 48 ;; Return: 49 ;; Byte 0: Modem Disconnect Input 50 ;; Byte 1: Modem Disconnect Output register 51 ;; Byte 2: Modem Disconnect Tristate register 52 ;; C0 D5 get/set T7F port 53 ;; wIndex = 1: write wValue to T7F output register 54 ;; Return: 55 ;; Byte 0: T7F Input 56 ;; Byte 1: T7F Output register 57 58 ;; define code segments link order 59 .area CODE (CODE) 60 .area CSEG (CODE) 61 .area GSINIT (CODE) 62 .area GSINIT2 (CODE) 63 64 ;; ----------------------------------------------------- 65 66 ;; special function registers (which are not predefined) 0082 67 dpl0 = 0x82 0083 68 dph0 = 0x83 0084 69 dpl1 = 0x84 0085 70 dph1 = 0x85 0086 71 dps = 0x86 008E 72 ckcon = 0x8E 008F 73 spc_fnc = 0x8F 0091 74 exif = 0x91 0092 75 mpage = 0x92 0098 76 scon0 = 0x98 0099 77 sbuf0 = 0x99 00C0 78 scon1 = 0xC0 00C1 79 sbuf1 = 0xC1 00D8 80 eicon = 0xD8 00E8 81 eie = 0xE8 00F8 82 eip = 0xF8 83 84 ;; anchor xdata registers 7F00 85 IN0BUF = 0x7F00 7EC0 86 OUT0BUF = 0x7EC0 7E80 87 IN1BUF = 0x7E80 7E40 88 OUT1BUF = 0x7E40 7E00 89 IN2BUF = 0x7E00 7DC0 90 OUT2BUF = 0x7DC0 7D80 91 IN3BUF = 0x7D80 7D40 92 OUT3BUF = 0x7D40 7D00 93 IN4BUF = 0x7D00 7CC0 94 OUT4BUF = 0x7CC0 7C80 95 IN5BUF = 0x7C80 7C40 96 OUT5BUF = 0x7C40 7C00 97 IN6BUF = 0x7C00 7BC0 98 OUT6BUF = 0x7BC0 7B80 99 IN7BUF = 0x7B80 7B40 100 OUT7BUF = 0x7B40 7FE8 101 SETUPBUF = 0x7FE8 7FE8 102 SETUPDAT = 0x7FE8 103 7FB4 104 EP0CS = 0x7FB4 7FB5 105 IN0BC = 0x7FB5 7FB6 106 IN1CS = 0x7FB6 7FB7 107 IN1BC = 0x7FB7 7FB8 108 IN2CS = 0x7FB8 7FB9 109 IN2BC = 0x7FB9 7FBA 110 IN3CS = 0x7FBA 7FBB 111 IN3BC = 0x7FBB 7FBC 112 IN4CS = 0x7FBC 7FBD 113 IN4BC = 0x7FBD 7FBE 114 IN5CS = 0x7FBE 7FBF 115 IN5BC = 0x7FBF 7FC0 116 IN6CS = 0x7FC0 7FC1 117 IN6BC = 0x7FC1 7FC2 118 IN7CS = 0x7FC2 7FC3 119 IN7BC = 0x7FC3 7FC5 120 OUT0BC = 0x7FC5 7FC6 121 OUT1CS = 0x7FC6 7FC7 122 OUT1BC = 0x7FC7 7FC8 123 OUT2CS = 0x7FC8 7FC9 124 OUT2BC = 0x7FC9 7FCA 125 OUT3CS = 0x7FCA 7FCB 126 OUT3BC = 0x7FCB 7FCC 127 OUT4CS = 0x7FCC 7FCD 128 OUT4BC = 0x7FCD 7FCE 129 OUT5CS = 0x7FCE 7FCF 130 OUT5BC = 0x7FCF 7FD0 131 OUT6CS = 0x7FD0 7FD1 132 OUT6BC = 0x7FD1 7FD2 133 OUT7CS = 0x7FD2 7FD3 134 OUT7BC = 0x7FD3 135 7FA8 136 IVEC = 0x7FA8 7FA9 137 IN07IRQ = 0x7FA9 7FAA 138 OUT07IRQ = 0x7FAA 7FAB 139 USBIRQ = 0x7FAB 7FAC 140 IN07IEN = 0x7FAC 7FAD 141 OUT07IEN = 0x7FAD 7FAE 142 USBIEN = 0x7FAE 7FAF 143 USBBAV = 0x7FAF 7FB2 144 BPADDRH = 0x7FB2 7FB3 145 BPADDRL = 0x7FB3 146 7FD4 147 SUDPTRH = 0x7FD4 7FD5 148 SUDPTRL = 0x7FD5 7FD6 149 USBCS = 0x7FD6 7FD7 150 TOGCTL = 0x7FD7 7FD8 151 USBFRAMEL = 0x7FD8 7FD9 152 USBFRAMEH = 0x7FD9 7FDB 153 FNADDR = 0x7FDB 7FDD 154 USBPAIR = 0x7FDD 7FDE 155 IN07VAL = 0x7FDE 7FDF 156 OUT07VAL = 0x7FDF 7FE3 157 AUTOPTRH = 0x7FE3 7FE4 158 AUTOPTRL = 0x7FE4 7FE5 159 AUTODATA = 0x7FE5 160 161 ;; isochronous endpoints. only available if ISODISAB=0 162 7F60 163 OUT8DATA = 0x7F60 7F61 164 OUT9DATA = 0x7F61 7F62 165 OUT10DATA = 0x7F62 7F63 166 OUT11DATA = 0x7F63 7F64 167 OUT12DATA = 0x7F64 7F65 168 OUT13DATA = 0x7F65 7F66 169 OUT14DATA = 0x7F66 7F67 170 OUT15DATA = 0x7F67 171 7F68 172 IN8DATA = 0x7F68 7F69 173 IN9DATA = 0x7F69 7F6A 174 IN10DATA = 0x7F6A 7F6B 175 IN11DATA = 0x7F6B 7F6C 176 IN12DATA = 0x7F6C 7F6D 177 IN13DATA = 0x7F6D 7F6E 178 IN14DATA = 0x7F6E 7F6F 179 IN15DATA = 0x7F6F 180 7F70 181 OUT8BCH = 0x7F70 7F71 182 OUT8BCL = 0x7F71 7F72 183 OUT9BCH = 0x7F72 7F73 184 OUT9BCL = 0x7F73 7F74 185 OUT10BCH = 0x7F74 7F75 186 OUT10BCL = 0x7F75 7F76 187 OUT11BCH = 0x7F76 7F77 188 OUT11BCL = 0x7F77 7F78 189 OUT12BCH = 0x7F78 7F79 190 OUT12BCL = 0x7F79 7F7A 191 OUT13BCH = 0x7F7A 7F7B 192 OUT13BCL = 0x7F7B 7F7C 193 OUT14BCH = 0x7F7C 7F7D 194 OUT14BCL = 0x7F7D 7F7E 195 OUT15BCH = 0x7F7E 7F7F 196 OUT15BCL = 0x7F7F 197 7FF0 198 OUT8ADDR = 0x7FF0 7FF1 199 OUT9ADDR = 0x7FF1 7FF2 200 OUT10ADDR = 0x7FF2 7FF3 201 OUT11ADDR = 0x7FF3 7FF4 202 OUT12ADDR = 0x7FF4 7FF5 203 OUT13ADDR = 0x7FF5 7FF6 204 OUT14ADDR = 0x7FF6 7FF7 205 OUT15ADDR = 0x7FF7 7FF8 206 IN8ADDR = 0x7FF8 7FF9 207 IN9ADDR = 0x7FF9 7FFA 208 IN10ADDR = 0x7FFA 7FFB 209 IN11ADDR = 0x7FFB 7FFC 210 IN12ADDR = 0x7FFC 7FFD 211 IN13ADDR = 0x7FFD 7FFE 212 IN14ADDR = 0x7FFE 7FFF 213 IN15ADDR = 0x7FFF 214 7FA0 215 ISOERR = 0x7FA0 7FA1 216 ISOCTL = 0x7FA1 7FA2 217 ZBCOUNT = 0x7FA2 7FE0 218 INISOVAL = 0x7FE0 7FE1 219 OUTISOVAL = 0x7FE1 7FE2 220 FASTXFR = 0x7FE2 221 222 ;; CPU control registers 223 7F92 224 CPUCS = 0x7F92 225 226 ;; IO port control registers 227 7F93 228 PORTACFG = 0x7F93 7F94 229 PORTBCFG = 0x7F94 7F95 230 PORTCCFG = 0x7F95 7F96 231 OUTA = 0x7F96 7F97 232 OUTB = 0x7F97 7F98 233 OUTC = 0x7F98 7F99 234 PINSA = 0x7F99 7F9A 235 PINSB = 0x7F9A 7F9B 236 PINSC = 0x7F9B 7F9C 237 OEA = 0x7F9C 7F9D 238 OEB = 0x7F9D 7F9E 239 OEC = 0x7F9E 240 241 ;; I2C controller registers 242 7FA5 243 I2CS = 0x7FA5 7FA6 244 I2DAT = 0x7FA6 245 246 ;; Xilinx FPGA registers C000 247 FSKSHREG = 0xc000 C001 248 FSKSHSTATUS = 0xc001 C004 249 FSKRSSI = 0xc004 C008 250 FSKCTRL = 0xc008 C009 251 FSKSTAT = 0xc009 C00A 252 FSKT7FOUT = 0xc00a C00B 253 FSKT7FIN = 0xc00b C00C 254 FSKMDISCTRIS = 0xc00c C00D 255 FSKMDISCOUT = 0xc00d C00E 256 FSKMDISCIN = 0xc00e 257 258 ;; ----------------------------------------------------- 259 260 .area CODE (CODE) 0000 02s00r00 261 ljmp startup 0003 02s02rE4 262 ljmp int0_isr 0006 263 .ds 5 000B 02s03r05 264 ljmp timer0_isr 000E 265 .ds 5 0013 02s03r26 266 ljmp int1_isr 0016 267 .ds 5 001B 02s03r47 268 ljmp timer1_isr 001E 269 .ds 5 0023 02s03r68 270 ljmp ser0_isr 0026 271 .ds 5 002B 02s03rA6 272 ljmp timer2_isr 002E 273 .ds 5 0033 02s03rC7 274 ljmp resume_isr 0036 275 .ds 5 003B 02s03rE8 276 ljmp ser1_isr 003E 277 .ds 5 0043 02s01r00 278 ljmp usb_isr 0046 279 .ds 5 004B 02s04r0B 280 ljmp i2c_isr 004E 281 .ds 5 0053 02s04r30 282 ljmp int4_isr 0056 283 .ds 5 005B 02s04r55 284 ljmp int5_isr 005E 285 .ds 5 0063 02s04r7A 286 ljmp int6_isr 287 288 ;; Parameter block at 0xe0 0066 289 .ds 0x7a 00E0 B0 04 00 290 parbitratetx: .db <1200,>1200,0 00E3 B0 04 00 291 parbitraterx: .db <1200,>1200,0 00E6 00 292 parextmodem: .db 0 00E7 01 293 parpttmute: .db 1 294 295 ;; Serial# string at 0xf0 00E8 296 .ds 8 00F0 297 parserial: 00F0 30 30 30 30 30 30 298 .db '0,'0,'0,'0,'0,'0,'0,'0,0 30 30 00 00F9 299 .ds 7 300 301 ;; USB interrupt dispatch table 0100 302 usb_isr: 0100 02s04r9B 303 ljmp usb_sudav_isr 0103 304 .ds 1 0104 02s08rAD 305 ljmp usb_sof_isr 0107 306 .ds 1 0108 02s08rD8 307 ljmp usb_sutok_isr 010B 308 .ds 1 010C 02s09r03 309 ljmp usb_suspend_isr 010F 310 .ds 1 0110 02s09r2E 311 ljmp usb_usbreset_isr 0113 312 .ds 1 0114 32 313 reti 0115 314 .ds 3 0118 02s09r59 315 ljmp usb_ep0in_isr 011B 316 .ds 1 011C 02s09r94 317 ljmp usb_ep0out_isr 011F 318 .ds 1 0120 02s0Ar46 319 ljmp usb_ep1in_isr 0123 320 .ds 1 0124 02s0Ar74 321 ljmp usb_ep1out_isr 0127 322 .ds 1 0128 02s0Ar9F 323 ljmp usb_ep2in_isr 012B 324 .ds 1 012C 02s0ArCA 325 ljmp usb_ep2out_isr 012F 326 .ds 1 0130 02s0ArF5 327 ljmp usb_ep3in_isr 0133 328 .ds 1 0134 02s0Br20 329 ljmp usb_ep3out_isr 0137 330 .ds 1 0138 02s0Br4B 331 ljmp usb_ep4in_isr 013B 332 .ds 1 013C 02s0Br76 333 ljmp usb_ep4out_isr 013F 334 .ds 1 0140 02s0BrA1 335 ljmp usb_ep5in_isr 0143 336 .ds 1 0144 02s0BrCC 337 ljmp usb_ep5out_isr 0147 338 .ds 1 0148 02s0BrF7 339 ljmp usb_ep6in_isr 014B 340 .ds 1 014C 02s0Cr22 341 ljmp usb_ep6out_isr 014F 342 .ds 1 0150 02s0Cr4D 343 ljmp usb_ep7in_isr 0153 344 .ds 1 0154 02s0Cr78 345 ljmp usb_ep7out_isr 346 347 ;; ----------------------------------------------------- 348 0020 349 RXCHUNKS = 32 0010 350 TXCHUNKS = 16 351 352 .area OSEG (OVR,DATA) 353 .area BSEG (BIT) 0000 354 ctrl_ptt: .ds 1 0001 355 ctrl_pttmute: .ds 1 0002 356 ctrl_ledptt: .ds 1 0003 357 ctrl_leddcdsrc: .ds 1 ; not implemented 0004 358 ctrl_clksel: .ds 1 ; not implemented 0005 359 ctrl_indacd: .ds 1 ; not implemented 0006 360 ctrl_indacz: .ds 1 ; not implemented 0007 361 ctrl_txdsrc: .ds 1 ; not implemented 0020 362 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) 363 0008 364 pttmute: .ds 1 0009 365 pttforcechg: .ds 1 000A 366 uartempty: .ds 1 367 368 .area ISEG (DATA) 0000 369 txbcnt: .ds TXCHUNKS 0010 370 rxbcnt: .ds RXCHUNKS 0030 371 stack: .ds 0x80-RXCHUNKS-TXCHUNKS 372 373 .area DSEG (DATA) 0000 374 ctrlcode: .ds 1 0001 375 ctrlcount: .ds 2 0003 376 leddiv: .ds 1 0004 377 irqcount: .ds 1 378 ;; transmitter variables 0005 379 txstate: .ds 1 0006 380 flagcnt: .ds 2 0008 381 txwr: .ds 1 0009 382 txrd: .ds 1 000A 383 txtwr: .ds 1 000B 384 txcrc: .ds 2 000D 385 txshreg: .ds 1 000E 386 txbnum: .ds 1 000F 387 txptr: .ds 1 0010 388 txskip: .ds 1 0011 389 pttforce: .ds 1 390 ;; receiver variables 0012 391 rxstate: .ds 1 0013 392 rxwr: .ds 1 0014 393 rxrd: .ds 1 0015 394 rxtwr: .ds 1 0016 395 rxcntc: .ds 1 0017 396 rxcrc: .ds 2 0019 397 rxshreg: .ds 1 001A 398 rxbreg: .ds 1 001B 399 rxbnum: .ds 1 001C 400 rxptr: .ds 1 401 001D 402 tmprxcnt: .ds 1 403 404 ;; UART receiver 001E 405 uartbuf: .ds 16 002E 406 uartwr: .ds 1 002F 407 uartrd: .ds 1 408 409 ;; USB state 0030 410 numconfig: .ds 1 0031 411 altsetting: .ds 1 412 413 .area XSEG (DATA) 0000 414 txbuf: .ds TXCHUNKS*64 0400 415 rxbuf: .ds RXCHUNKS*64 416 417 418 .area GSINIT (CODE) 0000 419 startup: 0000 75 81r30 420 mov sp,#stack ; -1 0003 E4 421 clr a 0004 F5 D0 422 mov psw,a 0006 F5 86 423 mov dps,a 424 ;lcall __sdcc_external_startup 425 ;mov a,dpl0 426 ;jz __sdcc_init_data 427 ;ljmp __sdcc_program_startup 0008 428 __sdcc_init_data: 429 430 .area GSINIT2 (CODE) 0000 431 __sdcc_program_startup: 432 ;; assembler code startup 0000 E4 433 clr a 0001 F5*05 434 mov txstate,a 0003 F5*08 435 mov txwr,a 0005 F5*09 436 mov txrd,a 0007 F5*0A 437 mov txtwr,a 0009 F5*11 438 mov pttforce,a 000B F5*12 439 mov rxstate,a 000D F5*13 440 mov rxwr,a 000F F5*14 441 mov rxrd,a 0011 F5*15 442 mov rxtwr,a 0013 F5*04 443 mov irqcount,a 0015 F5*2F 444 mov uartrd,a 0017 F5*2E 445 mov uartwr,a 0019 F5 86 446 mov dps,a 001B D2*0A 447 setb uartempty 448 ;; some indirect register setup 001D 75 8E 30 449 mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs 450 ;; Timer setup: 451 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 452 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0020 75 89 21 453 mov tmod,#0x21 0023 75 88 55 454 mov tcon,#0x55 ; INT0/INT1 edge 0026 75 8D 64 455 mov th1,#256-156 ; 1200 bauds 0029 75 87 00 456 mov pcon,#0 ; SMOD0=0 457 ;; init USB subsystem 002C 90 7F A1 458 mov dptr,#ISOCTL 002F 74 01 459 mov a,#1 ; disable ISO endpoints 0031 F0 460 movx @dptr,a 0032 90 7F AF 461 mov dptr,#USBBAV 0035 74 01 462 mov a,#1 ; enable autovector, disable breakpoint logic 0037 F0 463 movx @dptr,a 0038 E4 464 clr a 0039 90 7F E0 465 mov dptr,#INISOVAL 003C F0 466 movx @dptr,a 003D 90 7F E1 467 mov dptr,#OUTISOVAL 0040 F0 468 movx @dptr,a 0041 90 7F DD 469 mov dptr,#USBPAIR 0044 74 09 470 mov a,#0x9 ; pair EP 2&3 for input & output 0046 F0 471 movx @dptr,a 0047 90 7F DE 472 mov dptr,#IN07VAL 004A 74 07 473 mov a,#0x7 ; enable EP0+EP1+EP2 004C F0 474 movx @dptr,a 004D 90 7F DF 475 mov dptr,#OUT07VAL 0050 74 05 476 mov a,#0x5 ; enable EP0+EP2 0052 F0 477 movx @dptr,a 478 ;; USB: init endpoint toggles 0053 90 7F D7 479 mov dptr,#TOGCTL 0056 74 12 480 mov a,#0x12 0058 F0 481 movx @dptr,a 0059 74 32 482 mov a,#0x32 ; clear EP 2 in toggle 005B F0 483 movx @dptr,a 005C 74 02 484 mov a,#0x02 005E F0 485 movx @dptr,a 005F 74 22 486 mov a,#0x22 ; clear EP 2 out toggle 0061 F0 487 movx @dptr,a 488 ;; configure IO ports 0062 90 7F 93 489 mov dptr,#PORTACFG 0065 74 00 490 mov a,#0 0067 F0 491 movx @dptr,a 0068 90 7F 96 492 mov dptr,#OUTA 006B 74 82 493 mov a,#0x82 ; set PROG hi 006D F0 494 movx @dptr,a 006E 90 7F 9C 495 mov dptr,#OEA 0071 74 C2 496 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0073 F0 497 movx @dptr,a 0074 90 7F 94 498 mov dptr,#PORTBCFG 0077 74 00 499 mov a,#0 0079 F0 500 movx @dptr,a 007A 90 7F 9D 501 mov dptr,#OEB 007D 74 00 502 mov a,#0 007F F0 503 movx @dptr,a 0080 90 7F 95 504 mov dptr,#PORTCCFG 0083 74 C3 505 mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins 0085 F0 506 movx @dptr,a 0086 90 7F 98 507 mov dptr,#OUTC 0089 74 28 508 mov a,#0x28 008B F0 509 movx @dptr,a 008C 90 7F 9E 510 mov dptr,#OEC 008F 74 2A 511 mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT 0091 F0 512 movx @dptr,a 513 ;; enable interrupts 0092 75 A8 92 514 mov ie,#0x92 ; enable timer 0 and ser 0 int 0095 75 E8 01 515 mov eie,#0x01 ; enable USB interrupts 0098 90 7F AE 516 mov dptr,#USBIEN 009B 74 01 517 mov a,#1 ; enable SUDAV interrupt 009D F0 518 movx @dptr,a 009E 90 7F AC 519 mov dptr,#IN07IEN 00A1 74 03 520 mov a,#3 ; enable EP0+EP1 interrupt 00A3 F0 521 movx @dptr,a 00A4 90 7F AD 522 mov dptr,#OUT07IEN 00A7 74 01 523 mov a,#1 ; enable EP0 interrupt 00A9 F0 524 movx @dptr,a 525 ;; initialize UART 0 for T7F communication 00AA 75 98 52 526 mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable 527 ;; copy configuration to bit addressable variables 00AD 75 20 42 528 mov ctrlreg,#0x42 00B0 78rE7 529 mov r0,#parpttmute 00B2 E2 530 movx a,@r0 00B3 A2 E0 531 mov c,acc.0 00B5 92*08 532 mov pttmute,c 00B7 92*01 533 mov ctrl_pttmute,c 534 ;; turn off transmitter 00B9 E5 20 535 mov a,ctrlreg 00BB 90 C0 08 536 mov dptr,#FSKCTRL 00BE F0 537 movx @dptr,a 538 ;; Initialize modem disc port / t7f port 00BF 90 C0 0C 539 mov dptr,#FSKMDISCTRIS 00C2 74 FF 540 mov a,#0xff 00C4 F0 541 movx @dptr,a 00C5 90 C0 0D 542 mov dptr,#FSKMDISCOUT 00C8 E4 543 clr a 00C9 F0 544 movx @dptr,a 00CA 90 C0 0A 545 mov dptr,#FSKT7FOUT 00CD 74 1F 546 mov a,#0x1f 00CF F0 547 movx @dptr,a 548 ;; Copy serial number 00D0 78rF0 549 mov r0,#parserial 00D2 90s0Dr34 550 mov dptr,#stringserial+2 00D5 E2 551 1$: movx a,@r0 00D6 60 06 552 jz 2$ 00D8 F0 553 movx @dptr,a 00D9 A3 554 inc dptr 00DA A3 555 inc dptr 00DB 08 556 inc r0 00DC 80 F7 557 sjmp 1$ 00DE E8 558 2$: mov a,r0 00DF 24 11 559 add a,#1-0xf0 ; 1-parserial 00E1 25 E0 560 add a,acc 00E3 90s0Dr32 561 mov dptr,#stringserial 00E6 F0 562 movx @dptr,a 563 ;; initialize USB state 00E7 564 usbinit: 00E7 E4 565 clr a 00E8 F5*30 566 mov numconfig,a 00EA F5*31 567 mov altsetting,a 568 ;; give Windows a chance to finish the writecpucs control transfer 569 ;; 20ms delay loop 00EC 90 D1 20 570 mov dptr,#(-12000)&0xffff 00EF A3 571 2$: inc dptr ; 3 cycles 00F0 E5 82 572 mov a,dpl0 ; 2 cycles 00F2 45 83 573 orl a,dph0 ; 2 cycles 00F4 70 F9 574 jnz 2$ ; 3 cycles 0001 575 .if 1 576 ;; disconnect from USB bus 00F6 90 7F D6 577 mov dptr,#USBCS 00F9 74 0A 578 mov a,#10 00FB F0 579 movx @dptr,a 580 ;; wait 0.3 sec 00FC 7A 1E 581 mov r2,#30 582 ;; 10ms delay loop 00FE 90 E8 90 583 0$: mov dptr,#(-6000)&0xffff 0101 A3 584 1$: inc dptr ; 3 cycles 0102 E5 82 585 mov a,dpl0 ; 2 cycles 0104 45 83 586 orl a,dph0 ; 2 cycles 0106 70 F9 587 jnz 1$ ; 3 cycles 0108 DA F4 588 djnz r2,0$ 589 ;; reconnect to USB bus 010A 90 7F D6 590 mov dptr,#USBCS 591 ;mov a,#2 ; 8051 handles control 592 ;movx @dptr,a 010D 74 06 593 mov a,#6 ; reconnect, 8051 handles control 010F F0 594 movx @dptr,a 595 .endif 596 597 ;; final 0110 12s09rCF 598 lcall fillusbintr 599 ;; kludge; first OUT2 packet seems to be bogus 600 ;; wait for packet with length 1 and contents 0x55 0113 601 waitpkt1: 0113 90 7F C8 602 mov dptr,#OUT2CS 0116 E0 603 movx a,@dptr 0117 20 E1 F9 604 jb acc.1,waitpkt1 011A 90 7F C9 605 mov dptr,#OUT2BC 011D E0 606 movx a,@dptr 011E B4 01 0D 607 cjne a,#1,0$ 0121 90 7D C0 608 mov dptr,#OUT2BUF 0124 E0 609 movx a,@dptr 0125 B4 55 06 610 cjne a,#0x55,0$ 0128 90 7F C9 611 mov dptr,#OUT2BC 012B F0 612 movx @dptr,a 012C 80 06 613 sjmp pkt1received 012E 90 7F C9 614 0$: mov dptr,#OUT2BC 0131 F0 615 movx @dptr,a 0132 80 DF 616 sjmp waitpkt1 0134 617 pkt1received: 618 ;; start normal operation 0134 02s00r22 619 ljmp mainloop 620 621 622 .area CSEG (CODE) 0002 623 ar2 = 0x02 0003 624 ar3 = 0x03 0004 625 ar4 = 0x04 0005 626 ar5 = 0x05 0006 627 ar6 = 0x06 0007 628 ar7 = 0x07 0000 629 ar0 = 0x00 0001 630 ar1 = 0x01 631 0000 632 setptt: 0000 E5*05 633 mov a,txstate 0002 45*11 634 orl a,pttforce 0004 60 0D 635 jz pttoff 636 0006 637 ptton: 0006 C2*01 638 clr ctrl_pttmute 0008 D2*00 639 setb ctrl_ptt 000A D2*02 640 setb ctrl_ledptt 000C E5 20 641 mov a,ctrlreg 000E 90 C0 08 642 mov dptr,#FSKCTRL 0011 F0 643 movx @dptr,a 0012 22 644 ret 645 0013 646 pttoff: 0013 C2*00 647 clr ctrl_ptt 0015 A2*08 648 mov c,pttmute 0017 92*01 649 mov ctrl_pttmute,c 0019 C2*02 650 clr ctrl_ledptt 001B E5 20 651 mov a,ctrlreg 001D 90 C0 08 652 mov dptr,#FSKCTRL 0020 F0 653 movx @dptr,a 0021 22 654 ret 655 0022 656 mainloop: 657 658 ;; HDLC encoder 0022 659 txnopkt: 0022 E5*09 660 mov a,txrd 0024 B5*08 14 661 cjne a,txwr,txstartsend 0027 12s01r71 662 lcall periodic 002A E4 663 clr a 002B F5*05 664 mov txstate,a 002D 90 C0 00 665 mov dptr,#FSKSHREG 0030 F0 666 movx @dptr,a 0031 10*09 02 667 jbc pttforcechg,0$ 0034 80 EC 668 sjmp txnopkt 0036 12s00r00 669 0$: lcall setptt 0039 80 E7 670 sjmp txnopkt 003B 671 txstartsend: 003B 75*05 01 672 mov txstate,#1 003E 75*0E 08 673 mov txbnum,#8 0041 75*0B FF 674 mov txcrc,#0xff 0044 75*0C FF 675 mov txcrc+1,#0xff 676 ;; start txdelay 677 ;; read the number of flags to send from the first two bytes of the first packet 0001 678 .if 1 0047 E5*09 679 mov a,txrd 0049 03 680 rr a 004A 03 681 rr a 004B F5 82 682 mov dpl0,a 004D 54 C0 683 anl a,#0xc0 004F 24r00 684 add a,#txbuf 0057 F5 83 688 mov dph0,a 689 .else 690 mov a,txrd 691 rr a 692 rr a 693 mov dpl0,a 694 anl a,#0xc0 695 xch a,dpl0 696 anl a,#0x3f 697 add a,#>txbuf 698 mov dph0,a 699 .endif 0059 E0 700 movx a,@dptr 005A F5*06 701 mov flagcnt,a 005C A3 702 inc dptr 005D E0 703 movx a,@dptr 005E F5*07 704 mov flagcnt+1,a 0060 75*10 02 705 mov txskip,#2 706 ;; sanity check (limit txdelay to about 8s) 0063 78rE1 707 mov r0,#parbitratetx+1 0065 E2 708 movx a,@r0 0066 C3 709 clr c 0067 95*07 710 subb a,flagcnt+1 0069 50 03 711 jnc 2$ 006B E2 712 movx a,@r0 006C F5*07 713 mov flagcnt+1,a 006E 714 2$: 715 ;; check if count is at least two 006E E5*09 716 mov a,txrd 0070 24r00 717 add a,#txbcnt 0072 F8 718 mov r0,a 0073 E6 719 mov a,@r0 0074 24 FE 720 add a,#-2 0076 40 09 721 jc 1$ 0078 75*06 01 722 mov flagcnt,#1 007B 75*07 00 723 mov flagcnt+1,#0 007E 75*10 00 724 mov txskip,#0 0081 725 1$: 726 ;; turn on PTT 0081 12s00r06 727 lcall ptton 0084 728 txkeyup: 0084 E5*06 729 mov a,flagcnt 0086 24 FF 730 add a,#-1 0088 F5*06 731 mov flagcnt,a 008A E5*07 732 mov a,flagcnt+1 008C 34 FF 733 addc a,#-1 008E F5*07 734 mov flagcnt+1,a 0090 50 0B 735 jnc txpreparepkt 0092 12s01r71 736 lcall periodic 0095 74 7E 737 mov a,#0x7e 0097 90 C0 00 738 mov dptr,#FSKSHREG 009A F0 739 movx @dptr,a 009B 80 E7 740 sjmp txkeyup 009D 741 txpreparepkt: 009D 85*10*0F 742 mov txptr,txskip 00A0 75*05 02 743 mov txstate,#2 00A3 744 txpktbyteloop: 00A3 E5*09 745 mov a,txrd 00A5 24r00 746 add a,#txbcnt 00A7 F8 747 mov r0,a 00A8 E6 748 mov a,@r0 00A9 B5*0F 2B 749 cjne a,txptr,txchunkcont 750 ;; tx chunk ended 00AC 75*10 00 751 mov txskip,#0 00AF 20 E6 18 752 jb acc.6,txchunknoend 00B2 E5*0B 753 mov a,txcrc 00B4 F4 754 cpl a 00B5 12s01r2C 755 lcall txbytenocrc 00B8 E5*0C 756 mov a,txcrc+1 00BA F4 757 cpl a 00BB 12s01r2C 758 lcall txbytenocrc 00BE 12s01r0A 759 lcall txflag 00C1 75*0B FF 760 mov txcrc,#0xff 00C4 75*0C FF 761 mov txcrc+1,#0xff 00C7 75*10 02 762 mov txskip,#2 00CA 763 txchunknoend: 00CA E5*09 764 mov a,txrd 00CC 04 765 inc a 00CD 54 0F 766 anl a,#(TXCHUNKS-1) 00CF F5*09 767 mov txrd,a 00D1 B5*08 C9 768 cjne a,txwr,txpreparepkt 00D4 02s00rF3 769 ljmp txtail 00D7 770 txchunkcont: 0001 771 .if 1 00D7 E5*09 772 mov a,txrd 00D9 03 773 rr a 00DA 03 774 rr a 00DB F5 82 775 mov dpl0,a 00DD 54 C0 776 anl a,#0xc0 00DF 25*0F 777 add a,txptr 00E1 24r00 778 add a,#txbuf 00E9 F5 83 782 mov dph0,a 783 .else 784 mov a,txrd 785 rr a 786 rr a 787 mov dpl0,a 788 anl a,#0xc0 789 add a,txptr 790 xch a,dpl0 791 anl a,#0x3f 792 addc a,#>txbuf 793 mov dph0,a 794 .endif 00EB E0 795 movx a,@dptr 00EC 12s01r43 796 lcall txbyte 00EF 05*0F 797 inc txptr 00F1 80 B0 798 sjmp txpktbyteloop 799 00F3 800 txtail: 00F3 12s01r0A 801 lcall txflag 00F6 75*05 03 802 mov txstate,#3 00F9 7A 14 803 mov r2,#20 00FB D3 804 0$: setb c 00FC 12s01r17 805 lcall txbit 00FF DA FA 806 djnz r2,0$ 807 ;; turn off PTT 0101 75*05 00 808 mov txstate,#0 0104 12s00r00 809 lcall setptt 0107 02s00r22 810 ljmp txnopkt 811 010A 812 txflag: 010A 7B 7E 813 mov r3,#0x7e 010C 7A 08 814 mov r2,#8 010E EB 815 0$: mov a,r3 010F 13 816 rrc a 0110 FB 817 mov r3,a 0111 12s01r17 818 lcall txbit 0114 DA F8 819 djnz r2,0$ 0116 22 820 ret 821 0117 822 txbit: 0117 E5*0D 823 mov a,txshreg 0119 13 824 rrc a 011A F5*0D 825 mov txshreg,a 011C D5*0E 0C 826 djnz txbnum,0$ 011F 75*0E 08 827 mov txbnum,#8 0122 12s01r71 828 lcall periodic 0125 E5*0D 829 mov a,txshreg 0127 90 C0 00 830 mov dptr,#FSKSHREG 012A F0 831 movx @dptr,a 012B 22 832 0$: ret 833 834 012C 835 txbytenocrc: 012C FB 836 mov r3,a 012D 7A 08 837 mov r2,#8 012F EB 838 0$: mov a,r3 0130 13 839 rrc a 0131 FB 840 mov r3,a 0132 12s01r17 841 lcall txbit 0135 E5*0D 842 mov a,txshreg 0137 F4 843 cpl a 0138 54 F8 844 anl a,#0xf8 013A 70 04 845 jnz 1$ 013C C3 846 clr c 013D 12s01r17 847 lcall txbit ; add stuff bit 0140 DA ED 848 1$: djnz r2,0$ 0142 22 849 ret 850 0143 851 txbyte: 0143 FB 852 mov r3,a 0144 7A 08 853 mov r2,#8 0146 C3 854 0$: clr c 0147 E5*0C 855 mov a,txcrc+1 0149 13 856 rrc a 014A F5*0C 857 mov txcrc+1,a 014C E5*0B 858 mov a,txcrc 014E 13 859 rrc a 014F F5*0B 860 mov txcrc,a 0151 EB 861 mov a,r3 0152 30 E0 01 862 jnb acc.0,2$ 0155 B3 863 cpl c 0156 50 06 864 2$: jnc 3$ 0158 63r0C 84 865 xrl txcrc+1,#0x84 015B 63r0B 08 866 xrl txcrc,#0x08 015E 13 867 3$: rrc a 015F FB 868 mov r3,a 0160 12s01r17 869 lcall txbit 0163 E5*0D 870 mov a,txshreg 0165 F4 871 cpl a 0166 54 F8 872 anl a,#0xf8 0168 70 04 873 jnz 1$ 016A C3 874 clr c 016B 12s01r17 875 lcall txbit ; add stuff bit 016E DA D6 876 1$: djnz r2,0$ 0170 22 877 ret 878 879 0171 880 periodic: 0171 90 C0 01 881 mov dptr,#FSKSHSTATUS 0174 E0 882 movx a,@dptr 0175 30 E1 01 883 jnb acc.1,0$ 0178 22 884 ret 0179 30 E0 03 885 0$: jnb acc.0,1$ 017C 12s02r0C 886 lcall hdlcdec 017F 887 1$: 888 017F 889 usbiostart: 890 ;; check for USB modem->host 017F E5*14 891 mov a,rxrd 0181 B5*13 47 892 cjne a,rxwr,usbcheckin 893 ;; check for USB host->modem 0184 894 usbcheckout: 0184 90 7F C8 895 mov dptr,#OUT2CS 0187 E0 896 movx a,@dptr 0188 20 E1 3E 897 jb acc.1,endusb2 018B E5*08 898 mov a,txwr 018D 24r00 899 add a,#txbcnt 018F F8 900 mov r0,a 0190 E5*08 901 mov a,txwr 0192 04 902 inc a 0193 54 0F 903 anl a,#(TXCHUNKS-1) 0195 B5*09 03 904 cjne a,txrd,usbout2 0198 02s02r09 905 ljmp endusb 019B 906 usbout2: 019B FF 907 mov r7,a 019C 90 7F C9 908 mov dptr,#OUT2BC 019F E0 909 movx a,@dptr 01A0 F6 910 mov @r0,a 01A1 60 20 911 jz usbout3 01A3 FE 912 mov r6,a 0001 913 .if 1 01A4 E5*08 914 mov a,txwr 01A6 03 915 rr a 01A7 03 916 rr a 01A8 F5 84 917 mov dpl1,a 01AA 54 C0 918 anl a,#0xc0 01AC 24r00 919 add a,#txbuf 01B4 F5 85 923 mov dph1,a 924 .else 925 mov a,txwr 926 rr a 927 rr a 928 mov dpl1,a 929 anl a,#0xc0 930 xch a,dpl1 931 anl a,#0x3f 932 add a,#>txbuf 933 mov dph1,a 934 .endif 01B6 90 7D C0 935 mov dptr,#OUT2BUF 01B9 936 usboutloop: 01B9 E0 937 movx a,@dptr 01BA A3 938 inc dptr 01BB 05 86 939 inc dps 01BD F0 940 movx @dptr,a 01BE A3 941 inc dptr 01BF 15 86 942 dec dps 01C1 DE F6 943 djnz r6,usboutloop 01C3 944 usbout3: 01C3 8F*08 945 mov txwr,r7 01C5 90 7F C9 946 mov dptr,#OUT2BC 01C8 F0 947 movx @dptr,a ; rearm OUT2 01C9 948 endusb2: 01C9 80 3E 949 sjmp endusb 950 01CB 951 usbcheckin: 01CB 90 7F B8 952 mov dptr,#IN2CS 01CE E0 953 movx a,@dptr 01CF 20 E1 B2 954 jb acc.1,usbcheckout 01D2 E5*14 955 mov a,rxrd 01D4 24r10 956 add a,#rxbcnt 01D6 F8 957 mov r0,a 01D7 E6 958 mov a,@r0 01D8 60 20 959 jz usbin1 01DA FE 960 mov r6,a 0001 961 .if 1 01DB E5*14 962 mov a,rxrd 01DD 03 963 rr a 01DE 03 964 rr a 01DF F5 84 965 mov dpl1,a 01E1 54 C0 966 anl a,#0xc0 01E3 24r00 967 add a,#rxbuf 01EB F5 85 971 mov dph1,a 972 .else 973 mov a,rxrd 974 rr a 975 rr a 976 mov dpl1,a 977 anl a,#0xc0 978 xch a,dpl1 979 anl a,#0x3f 980 addc a,#>rxbuf 981 mov dph1,a 982 .endif 01ED 90 7E 00 983 mov dptr,#IN2BUF 01F0 984 usbinloop: 01F0 05 86 985 inc dps 01F2 E0 986 movx a,@dptr 01F3 A3 987 inc dptr 01F4 15 86 988 dec dps 01F6 F0 989 movx @dptr,a 01F7 A3 990 inc dptr 01F8 DE F6 991 djnz r6,usbinloop 01FA 992 usbin1: 01FA E6 993 mov a,@r0 01FB 90 7F B9 994 mov dptr,#IN2BC 01FE F0 995 movx @dptr,a 01FF E5*14 996 mov a,rxrd 0201 04 997 inc a 0202 54 1F 998 anl a,#(RXCHUNKS-1) 0204 F5*14 999 mov rxrd,a 0206 02s01r84 1000 ljmp usbcheckout 1001 0209 1002 endusb: 0209 02s01r71 1003 ljmp periodic 1004 1005 1006 1007 ;; Software HDLC decoder 020C 1008 hdlcdec: 020C 90 C0 00 1009 mov dptr,#FSKSHREG 020F E0 1010 movx a,@dptr 0210 FE 1011 mov r6,a 0211 7F 08 1012 mov r7,#8 0213 1013 hdlcdecloop: 0213 EE 1014 mov a,r6 0214 13 1015 rrc a 0215 FE 1016 mov r6,a 0216 E5*19 1017 mov a,rxshreg 0218 33 1018 rlc a 0219 F5*19 1019 mov rxshreg,a 021B B4 7E 03 1020 cjne a,#0x7e,$0 021E 02s02r9B 1021 ljmp hdlcdecflag 0221 F4 1022 $0: cpl a 0222 54 7F 1023 anl a,#0x7f 0224 60 0E 1024 jz hdlcdecabort 0226 E5*12 1025 $1: mov a,rxstate 0228 60 07 1026 jz hdlcdecendloop 022A E5*19 1027 mov a,rxshreg 022C 54 3F 1028 anl a,#0x3f 022E B4 3E 08 1029 cjne a,#0x3e,hdlcdecrxbit 0231 1030 hdlcdecendloop: 0231 DF E0 1031 djnz r7,hdlcdecloop 0233 22 1032 ret 1033 0234 1034 hdlcdecabort: 0234 75*12 00 1035 mov rxstate,#0 ; abort received 0237 80 F8 1036 sjmp hdlcdecendloop 1037 0239 1038 hdlcdecrxbit: 0239 C3 1039 clr c 023A E5*17 1040 mov a,rxcrc 023C 33 1041 rlc a 023D F5*17 1042 mov rxcrc,a 023F E5*18 1043 mov a,rxcrc+1 0241 33 1044 rlc a 0242 F5*18 1045 mov rxcrc+1,a 0244 E5*19 1046 mov a,rxshreg 0246 30 E0 01 1047 jnb acc.0,0$ 0249 B3 1048 cpl c 024A 50 06 1049 0$: jnc 1$ 024C 63r17 21 1050 xrl rxcrc,#0x21 024F 63r18 10 1051 xrl rxcrc+1,#0x10 0252 13 1052 1$: rrc a 0253 E5*1A 1053 mov a,rxbreg 0255 13 1054 rrc a 0256 F5*1A 1055 mov rxbreg,a 0258 D5*1B D6 1056 djnz rxbnum,hdlcdecendloop 025B 75*1B 08 1057 mov rxbnum,#8 0001 1058 .if 1 025E E5*15 1059 mov a,rxtwr 0260 03 1060 rr a 0261 03 1061 rr a 0262 F5 82 1062 mov dpl0,a 0264 54 C0 1063 anl a,#0xc0 0266 25*1C 1064 add a,rxptr 0268 24r00 1065 add a,#rxbuf 0270 F5 83 1069 mov dph0,a 1070 .else 1071 mov a,rxtwr 1072 rr a 1073 rr a 1074 mov dpl0,a 1075 anl a,#0xc0 1076 add a,rxptr 1077 xch a,dpl0 1078 anl a,#0x3f 1079 addc a,#>rxbuf 1080 mov dph0,a 1081 .endif 0272 E5*1A 1082 mov a,rxbreg 0274 F0 1083 movx @dptr,a 0275 05*1C 1084 inc rxptr 0277 E5*1C 1085 mov a,rxptr 0279 30 E6 B5 1086 jnb acc.6,hdlcdecendloop 027C E5*15 1087 mov a,rxtwr 027E 24r10 1088 add a,#rxbcnt 0280 F8 1089 mov r0,a 0281 76 40 1090 mov @r0,#64 0283 E5*15 1091 mov a,rxtwr 0285 04 1092 inc a 0286 54 1F 1093 anl a,#RXCHUNKS-1 0288 B5*14 06 1094 cjne a,rxrd,2$ 028B 75*12 00 1095 mov rxstate,#0 028E 02s02r31 1096 ljmp hdlcdecendloop 0291 F5*15 1097 2$: mov rxtwr,a 0293 75*1C 00 1098 mov rxptr,#0 0296 05*16 1099 inc rxcntc 0298 02s02r31 1100 ljmp hdlcdecendloop 1101 029B 1102 hdlcdecflag: 029B E5*12 1103 mov a,rxstate 029D 60 2F 1104 jz hdlcdecpreparenewpkt 1105 ;; check for correct CRC: 1106 ;; 1D0F -0-> 3A1E -1-> 641D -1-> D81B -1-> B036 -1-> 606C -1-> D0F9 -1-> A1F2 029F E5*17 1107 mov a,rxcrc 02A1 64 F2 1108 xrl a,#0xf2 02A3 F8 1109 mov r0,a 02A4 E5*18 1110 mov a,rxcrc+1 02A6 64 A1 1111 xrl a,#0xa1 02A8 48 1112 orl a,r0 02A9 70 23 1113 jnz hdlcdecpreparenewpkt 02AB E5*15 1114 mov a,rxtwr 02AD 24r10 1115 add a,#rxbcnt 02AF F8 1116 mov r0,a 02B0 E5*1C 1117 mov a,rxptr 02B2 F6 1118 mov @r0,a 02B3 E5*16 1119 mov a,rxcntc 02B5 70 07 1120 jnz 3$ 02B7 74 FC 1121 mov a,#-4 02B9 26 1122 add a,@r0 02BA 50 12 1123 jnc hdlcdecpreparenewpkt ; frame too short 02BC 80 04 1124 sjmp 4$ 02BE 24 F8 1125 3$: add a,#-8 02C0 40 0C 1126 jc hdlcdecpreparenewpkt ; frame too long 02C2 E5*15 1127 4$: mov a,rxtwr 02C4 04 1128 inc a 02C5 54 1F 1129 anl a,#RXCHUNKS-1 02C7 B5*14 02 1130 cjne a,rxrd,5$ 02CA 80 02 1131 sjmp hdlcdecpreparenewpkt 02CC F5*13 1132 5$: mov rxwr,a 02CE 1133 hdlcdecpreparenewpkt: 02CE E4 1134 clr a 02CF F5*16 1135 mov rxcntc,a 02D1 F5*1C 1136 mov rxptr,a 02D3 75*12 01 1137 mov rxstate,#1 02D6 F4 1138 cpl a 02D7 F5*17 1139 mov rxcrc,a 02D9 F5*18 1140 mov rxcrc+1,a 02DB 75*1B 08 1141 mov rxbnum,#8 02DE 85*13*15 1142 mov rxtwr,rxwr 02E1 02s02r31 1143 ljmp hdlcdecendloop 1144 1145 0000 1146 .if 0 1147 ;; IO copy routine 1148 ioc1: 1149 ;; txpointers 1150 add a,#txbcnt 1151 mov r0,a 0001 1152 .if 1 1153 mov a,txrd 1154 rr a 1155 rr a 1156 mov dpl1,a 1157 anl a,#0xc0 1158 add a,#txbuf 1162 mov dph1,a 1163 .else 1164 mov a,txrd 1165 rr a 1166 rr a 1167 mov dpl1,a 1168 anl a,#0xc0 1169 xch a,dpl1 1170 anl a,#0x3f 1171 add a,#>txbuf 1172 mov dph1,a 1173 .endif 1174 ;; rxpointers 1175 mov a,rxtwr 1176 add a,#rxbcnt 1177 mov r1,a 0001 1178 .if 1 1179 mov a,rxtwr 1180 rr a 1181 rr a 1182 mov dpl0,a 1183 anl a,#0xc0 1184 add a,#rxbuf 1188 mov dph0,a 1189 .else 1190 mov a,rxtwr 1191 rr a 1192 rr a 1193 mov dpl0,a 1194 anl a,#0xc0 1195 xch a,dpl0 1196 anl a,#0x3f 1197 add a,#>rxbuf 1198 mov dph0,a 1199 .endif 1200 ;; update rxpointer 1201 mov a,rxtwr 1202 inc a 1203 anl a,#(RXCHUNKS-1) 1204 mov rxtwr,a 1205 cjne a,rxrd,ioc2 1206 iocret: 1207 ret 1208 1209 ;; entry point 1210 iocopy: 1211 mov a,txrd 1212 cjne a,txwr,ioc1 1213 ret 1214 1215 ioc2: 1216 mov a,@r0 1217 mov @r1,a 1218 jz ioc3 1219 mov r7,a 1220 ioc4: 1221 inc dps 1222 movx a,@dptr 1223 inc dptr 1224 dec dps 1225 movx @dptr,a 1226 inc dptr 1227 djnz r7,ioc4 1228 ioc3: 1229 mov a,txrd 1230 inc a 1231 anl a,#(TXCHUNKS-1) 1232 mov txrd,a 1233 mov a,@r0 1234 add a,#-0x40 1235 jc iocret 1236 mov rxwr,rxtwr 1237 ret 1238 .endif 1239 1240 ;; ------------------ interrupt handlers ------------------------ 1241 02E4 1242 int0_isr: 02E4 C0 E0 1243 push acc 02E6 C0 F0 1244 push b 02E8 C0 82 1245 push dpl0 02EA C0 83 1246 push dph0 02EC C0 D0 1247 push psw 02EE 75 D0 00 1248 mov psw,#0x00 02F1 C0 86 1249 push dps 02F3 75 86 00 1250 mov dps,#0 1251 ;; clear interrupt 02F6 C2 89 1252 clr tcon+1 1253 ;; handle interrupt 1254 ;; epilogue 02F8 D0 86 1255 pop dps 02FA D0 D0 1256 pop psw 02FC D0 83 1257 pop dph0 02FE D0 82 1258 pop dpl0 0300 D0 F0 1259 pop b 0302 D0 E0 1260 pop acc 0304 32 1261 reti 1262 0305 1263 timer0_isr: 0305 C0 E0 1264 push acc 0307 C0 F0 1265 push b 0309 C0 82 1266 push dpl0 030B C0 83 1267 push dph0 030D C0 D0 1268 push psw 030F 75 D0 00 1269 mov psw,#0x00 0312 C0 86 1270 push dps 0314 75 86 00 1271 mov dps,#0 1272 ;; clear interrupt 0317 C2 8D 1273 clr tcon+5 1274 ;; handle interrupt 0000 1275 .if 0 1276 inc leddiv 1277 mov a,leddiv 1278 anl a,#7 1279 jnz 0$ 1280 mov dptr,#OUTC 1281 movx a,@dptr 1282 xrl a,#0x08 1283 movx @dptr,a 1284 0$: 1285 .endif 1286 ;; epilogue 0319 D0 86 1287 pop dps 031B D0 D0 1288 pop psw 031D D0 83 1289 pop dph0 031F D0 82 1290 pop dpl0 0321 D0 F0 1291 pop b 0323 D0 E0 1292 pop acc 0325 32 1293 reti 1294 0326 1295 int1_isr: 0326 C0 E0 1296 push acc 0328 C0 F0 1297 push b 032A C0 82 1298 push dpl0 032C C0 83 1299 push dph0 032E C0 D0 1300 push psw 0330 75 D0 00 1301 mov psw,#0x00 0333 C0 86 1302 push dps 0335 75 86 00 1303 mov dps,#0 1304 ;; clear interrupt 0338 C2 8B 1305 clr tcon+3 1306 ;; handle interrupt 1307 ;; epilogue 033A D0 86 1308 pop dps 033C D0 D0 1309 pop psw 033E D0 83 1310 pop dph0 0340 D0 82 1311 pop dpl0 0342 D0 F0 1312 pop b 0344 D0 E0 1313 pop acc 0346 32 1314 reti 1315 0347 1316 timer1_isr: 0347 C0 E0 1317 push acc 0349 C0 F0 1318 push b 034B C0 82 1319 push dpl0 034D C0 83 1320 push dph0 034F C0 D0 1321 push psw 0351 75 D0 00 1322 mov psw,#0x00 0354 C0 86 1323 push dps 0356 75 86 00 1324 mov dps,#0 1325 ;; clear interrupt 0359 C2 8F 1326 clr tcon+7 1327 ;; handle interrupt 1328 ;; epilogue 035B D0 86 1329 pop dps 035D D0 D0 1330 pop psw 035F D0 83 1331 pop dph0 0361 D0 82 1332 pop dpl0 0363 D0 F0 1333 pop b 0365 D0 E0 1334 pop acc 0367 32 1335 reti 1336 0368 1337 ser0_isr: 0368 C0 E0 1338 push acc 036A C0 F0 1339 push b 036C C0 82 1340 push dpl0 036E C0 83 1341 push dph0 0370 C0 D0 1342 push psw 0372 75 D0 00 1343 mov psw,#0x00 0375 C0 86 1344 push dps 0377 75 86 00 1345 mov dps,#0 037A C0 00 1346 push ar0 1347 ;; clear interrupt 037C 10 98 16 1348 jbc scon0+0,1$ ; RI 037F 10 99 0F 1349 0$: jbc scon0+1,2$ ; TI 1350 ;; handle interrupt 1351 ;; epilogue 0382 D0 00 1352 3$: pop ar0 0384 D0 86 1353 pop dps 0386 D0 D0 1354 pop psw 0388 D0 83 1355 pop dph0 038A D0 82 1356 pop dpl0 038C D0 F0 1357 pop b 038E D0 E0 1358 pop acc 0390 32 1359 reti 1360 0391 D2*0A 1361 2$: setb uartempty 0393 80 EA 1362 sjmp 0$ 1363 0395 E5*2E 1364 1$: mov a,uartwr 0397 24r1E 1365 add a,#uartbuf 0399 F8 1366 mov r0,a 039A E5 99 1367 mov a,sbuf0 039C F6 1368 mov @r0,a 039D E5*2E 1369 mov a,uartwr 039F 04 1370 inc a 03A0 54 0F 1371 anl a,#0xf 03A2 F5*2E 1372 mov uartwr,a 03A4 80 DC 1373 sjmp 3$ 1374 03A6 1375 timer2_isr: 03A6 C0 E0 1376 push acc 03A8 C0 F0 1377 push b 03AA C0 82 1378 push dpl0 03AC C0 83 1379 push dph0 03AE C0 D0 1380 push psw 03B0 75 D0 00 1381 mov psw,#0x00 03B3 C0 86 1382 push dps 03B5 75 86 00 1383 mov dps,#0 1384 ;; clear interrupt 03B8 C2 CF 1385 clr t2con+7 1386 ;; handle interrupt 1387 ;; epilogue 03BA D0 86 1388 pop dps 03BC D0 D0 1389 pop psw 03BE D0 83 1390 pop dph0 03C0 D0 82 1391 pop dpl0 03C2 D0 F0 1392 pop b 03C4 D0 E0 1393 pop acc 03C6 32 1394 reti 1395 03C7 1396 resume_isr: 03C7 C0 E0 1397 push acc 03C9 C0 F0 1398 push b 03CB C0 82 1399 push dpl0 03CD C0 83 1400 push dph0 03CF C0 D0 1401 push psw 03D1 75 D0 00 1402 mov psw,#0x00 03D4 C0 86 1403 push dps 03D6 75 86 00 1404 mov dps,#0 1405 ;; clear interrupt 03D9 C2 DC 1406 clr eicon+4 1407 ;; handle interrupt 1408 ;; epilogue 03DB D0 86 1409 pop dps 03DD D0 D0 1410 pop psw 03DF D0 83 1411 pop dph0 03E1 D0 82 1412 pop dpl0 03E3 D0 F0 1413 pop b 03E5 D0 E0 1414 pop acc 03E7 32 1415 reti 1416 03E8 1417 ser1_isr: 03E8 C0 E0 1418 push acc 03EA C0 F0 1419 push b 03EC C0 82 1420 push dpl0 03EE C0 83 1421 push dph0 03F0 C0 D0 1422 push psw 03F2 75 D0 00 1423 mov psw,#0x00 03F5 C0 86 1424 push dps 03F7 75 86 00 1425 mov dps,#0 1426 ;; clear interrupt 03FA C2 C0 1427 clr scon1+0 03FC C2 C1 1428 clr scon1+1 1429 ;; handle interrupt 1430 ;; epilogue 03FE D0 86 1431 pop dps 0400 D0 D0 1432 pop psw 0402 D0 83 1433 pop dph0 0404 D0 82 1434 pop dpl0 0406 D0 F0 1435 pop b 0408 D0 E0 1436 pop acc 040A 32 1437 reti 1438 040B 1439 i2c_isr: 040B C0 E0 1440 push acc 040D C0 F0 1441 push b 040F C0 82 1442 push dpl0 0411 C0 83 1443 push dph0 0413 C0 D0 1444 push psw 0415 75 D0 00 1445 mov psw,#0x00 0418 C0 86 1446 push dps 041A 75 86 00 1447 mov dps,#0 1448 ;; clear interrupt 041D E5 91 1449 mov a,exif 041F C2 E5 1450 clr acc.5 0421 F5 91 1451 mov exif,a 1452 ;; handle interrupt 1453 ;; epilogue 0423 D0 86 1454 pop dps 0425 D0 D0 1455 pop psw 0427 D0 83 1456 pop dph0 0429 D0 82 1457 pop dpl0 042B D0 F0 1458 pop b 042D D0 E0 1459 pop acc 042F 32 1460 reti 1461 0430 1462 int4_isr: 0430 C0 E0 1463 push acc 0432 C0 F0 1464 push b 0434 C0 82 1465 push dpl0 0436 C0 83 1466 push dph0 0438 C0 D0 1467 push psw 043A 75 D0 00 1468 mov psw,#0x00 043D C0 86 1469 push dps 043F 75 86 00 1470 mov dps,#0 1471 ;; clear interrupt 0442 E5 91 1472 mov a,exif 0444 C2 E6 1473 clr acc.6 0446 F5 91 1474 mov exif,a 1475 ;; handle interrupt 1476 ;; epilogue 0448 D0 86 1477 pop dps 044A D0 D0 1478 pop psw 044C D0 83 1479 pop dph0 044E D0 82 1480 pop dpl0 0450 D0 F0 1481 pop b 0452 D0 E0 1482 pop acc 0454 32 1483 reti 1484 0455 1485 int5_isr: 0455 C0 E0 1486 push acc 0457 C0 F0 1487 push b 0459 C0 82 1488 push dpl0 045B C0 83 1489 push dph0 045D C0 D0 1490 push psw 045F 75 D0 00 1491 mov psw,#0x00 0462 C0 86 1492 push dps 0464 75 86 00 1493 mov dps,#0 1494 ;; clear interrupt 0467 E5 91 1495 mov a,exif 0469 C2 E7 1496 clr acc.7 046B F5 91 1497 mov exif,a 1498 ;; handle interrupt 1499 ;; epilogue 046D D0 86 1500 pop dps 046F D0 D0 1501 pop psw 0471 D0 83 1502 pop dph0 0473 D0 82 1503 pop dpl0 0475 D0 F0 1504 pop b 0477 D0 E0 1505 pop acc 0479 32 1506 reti 1507 047A 1508 int6_isr: 047A C0 E0 1509 push acc 047C C0 F0 1510 push b 047E C0 82 1511 push dpl0 0480 C0 83 1512 push dph0 0482 C0 D0 1513 push psw 0484 75 D0 00 1514 mov psw,#0x00 0487 C0 86 1515 push dps 0489 75 86 00 1516 mov dps,#0 1517 ;; clear interrupt 048C C2 DB 1518 clr eicon+3 1519 ;; handle interrupt 1520 ;; epilogue 048E D0 86 1521 pop dps 0490 D0 D0 1522 pop psw 0492 D0 83 1523 pop dph0 0494 D0 82 1524 pop dpl0 0496 D0 F0 1525 pop b 0498 D0 E0 1526 pop acc 049A 32 1527 reti 1528 049B 1529 usb_sudav_isr: 049B C0 E0 1530 push acc 049D C0 F0 1531 push b 049F C0 82 1532 push dpl0 04A1 C0 83 1533 push dph0 04A3 C0 84 1534 push dpl1 04A5 C0 85 1535 push dph1 04A7 C0 D0 1536 push psw 04A9 75 D0 00 1537 mov psw,#0x00 04AC C0 86 1538 push dps 04AE 75 86 00 1539 mov dps,#0 04B1 C0 00 1540 push ar0 04B3 C0 07 1541 push ar7 1542 ;; clear interrupt 04B5 E5 91 1543 mov a,exif 04B7 C2 E4 1544 clr acc.4 04B9 F5 91 1545 mov exif,a 04BB 90 7F AB 1546 mov dptr,#USBIRQ 04BE 74 01 1547 mov a,#0x01 04C0 F0 1548 movx @dptr,a 1549 ;; handle interrupt 04C1 75*00 00 1550 mov ctrlcode,#0 ; reset control out code 04C4 90 7F E9 1551 mov dptr,#(SETUPDAT+1) 04C7 E0 1552 movx a,@dptr ; bRequest field 1553 ;; standard commands 1554 ;; USB_REQ_GET_DESCRIPTOR 04C8 B4 06 59 1555 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 04CB 90 7F E8 1556 mov dptr,#SETUPDAT ; bRequestType == 0x80 04CE E0 1557 movx a,@dptr 04CF B4 80 4F 1558 cjne a,#USB_DIR_IN,setupstallstd 04D2 90 7F EB 1559 mov dptr,#SETUPDAT+3 04D5 E0 1560 movx a,@dptr 04D6 B4 01 0C 1561 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 04D9 90 7F D4 1562 mov dptr,#SUDPTRH 04DC 74s0C 1563 mov a,#>devicedescr 04DE F0 1564 movx @dptr,a 04DF A3 1565 inc dptr 04E0 74rA3 1566 mov a,#config0descr 04F3 F0 1576 movx @dptr,a 04F4 A3 1577 inc dptr 04F5 74rB5 1578 mov a,#stringdescr 050F F5 83 1593 mov dph0,a 0511 E0 1594 movx a,@dptr 0512 F5 F0 1595 mov b,a 0514 A3 1596 inc dptr 0515 E0 1597 movx a,@dptr 0516 90 7F D4 1598 mov dptr,#SUDPTRH 0519 F0 1599 movx @dptr,a 051A A3 1600 inc dptr 051B E5 F0 1601 mov a,b 051D F0 1602 movx @dptr,a 1603 ; sjmp setupackstd 051E 1604 setupackstd: 051E 02s08r92 1605 ljmp setupack 0521 1606 setupstallstd: 0521 02s08r8E 1607 ljmp setupstall 0524 1608 cmdnotgetdesc: 1609 ;; USB_REQ_SET_CONFIGURATION 0524 B4 09 41 1610 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 0527 90 7F E8 1611 mov dptr,#SETUPDAT 052A E0 1612 movx a,@dptr 052B 70 F4 1613 jnz setupstallstd 052D 90 7F EA 1614 mov dptr,#SETUPDAT+2 0530 E0 1615 movx a,@dptr 0531 24 FE 1616 add a,#-2 0533 40 EC 1617 jc setupstallstd 0535 E0 1618 movx a,@dptr 0536 F5*30 1619 mov numconfig,a 0538 1620 cmdresettoggleshalt: 0538 90 7F D7 1621 mov dptr,#TOGCTL 053B 78 07 1622 mov r0,#7 053D E8 1623 0$: mov a,r0 053E 44 10 1624 orl a,#0x10 0540 F0 1625 movx @dptr,a 0541 44 30 1626 orl a,#0x30 0543 F0 1627 movx @dptr,a 0544 E8 1628 mov a,r0 0545 F0 1629 movx @dptr,a 0546 44 20 1630 orl a,#0x20 0548 F0 1631 movx @dptr,a 0549 D8 F2 1632 djnz r0,0$ 054B E4 1633 clr a 054C F0 1634 movx @dptr,a 054D 74 02 1635 mov a,#2 054F 90 7F B6 1636 mov dptr,#IN1CS 0552 78 07 1637 mov r0,#7 0554 F0 1638 1$: movx @dptr,a 0555 A3 1639 inc dptr 0556 A3 1640 inc dptr 0557 D8 FB 1641 djnz r0,1$ 0559 90 7F C6 1642 mov dptr,#OUT1CS 055C 78 07 1643 mov r0,#7 055E F0 1644 2$: movx @dptr,a 055F A3 1645 inc dptr 0560 A3 1646 inc dptr 0561 D8 FB 1647 djnz r0,2$ 0563 12s09rCF 1648 lcall fillusbintr 0566 80 B6 1649 sjmp setupackstd 0568 1650 cmdnotsetconf: 1651 ;; USB_REQ_SET_INTERFACE 0568 B4 0B 1A 1652 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 056B 90 7F E8 1653 mov dptr,#SETUPDAT 056E E0 1654 movx a,@dptr 056F B4 01 AF 1655 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 0572 E5*30 1656 mov a,numconfig 0574 B4 01 AA 1657 cjne a,#1,setupstallstd 0577 90 7F EC 1658 mov dptr,#SETUPDAT+4 057A E0 1659 movx a,@dptr 057B 70 A4 1660 jnz setupstallstd 057D 90 7F EA 1661 mov dptr,#SETUPDAT+2 0580 E0 1662 movx a,@dptr 0581 F5*31 1663 mov altsetting,a 0583 80 B3 1664 sjmp cmdresettoggleshalt 0585 1665 cmdnotsetint: 1666 ;; USB_REQ_GET_INTERFACE 0585 B4 0A 20 1667 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 0588 90 7F E8 1668 mov dptr,#SETUPDAT 058B E0 1669 movx a,@dptr 058C B4 81 92 1670 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 058F E5*30 1671 mov a,numconfig 0591 B4 01 8D 1672 cjne a,#1,setupstallstd 0594 90 7F EC 1673 mov dptr,#SETUPDAT+4 0597 E0 1674 movx a,@dptr 0598 70 87 1675 jnz setupstallstd 059A E5*31 1676 mov a,altsetting 059C 1677 cmdrespondonebyte: 059C 90 7F 00 1678 mov dptr,#IN0BUF 059F F0 1679 movx @dptr,a 05A0 90 7F B5 1680 mov dptr,#IN0BC 05A3 74 01 1681 mov a,#1 05A5 F0 1682 movx @dptr,a 05A6 80 4E 1683 sjmp setupackstd2 05A8 1684 cmdnotgetint: 1685 ;; USB_REQ_GET_CONFIGURATION 05A8 B4 08 0B 1686 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 05AB 90 7F E8 1687 mov dptr,#SETUPDAT 05AE E0 1688 movx a,@dptr 05AF B4 80 47 1689 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 05B2 E5*30 1690 mov a,numconfig 05B4 80 E6 1691 sjmp cmdrespondonebyte 05B6 1692 cmdnotgetconf: 1693 ;; USB_REQ_GET_STATUS (0) 05B6 70 44 1694 jnz cmdnotgetstat 05B8 90 7F E8 1695 mov dptr,#SETUPDAT 05BB E0 1696 movx a,@dptr 05BC B4 80 11 1697 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 05BF 74 01 1698 mov a,#1 05C1 1699 cmdrespondstat: 05C1 90 7F 00 1700 mov dptr,#IN0BUF 05C4 F0 1701 movx @dptr,a 05C5 A3 1702 inc dptr 05C6 E4 1703 clr a 05C7 F0 1704 movx @dptr,a 05C8 90 7F B5 1705 mov dptr,#IN0BC 05CB 74 02 1706 mov a,#2 05CD F0 1707 movx @dptr,a 05CE 80 26 1708 sjmp setupackstd2 05D0 1709 cmdnotgetstatdev: 05D0 B4 81 03 1710 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 05D3 E4 1711 clr a 05D4 80 EB 1712 sjmp cmdrespondstat 05D6 1713 cmdnotgetstatintf: 05D6 B4 82 20 1714 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 05D9 90 7F EC 1715 mov dptr,#SETUPDAT+4 05DC E0 1716 movx a,@dptr 05DD 90 7F C4 1717 mov dptr,#OUT1CS-2 05E0 30 E7 03 1718 jnb acc.7,0$ 05E3 90 7F B4 1719 mov dptr,#IN1CS-2 05E6 54 0F 1720 0$: anl a,#15 05E8 60 0F 1721 jz setupstallstd2 05EA 20 E3 0C 1722 jb acc.3,setupstallstd2 05ED 25 E0 1723 add a,acc 05EF 25 82 1724 add a,dpl0 05F1 F5 82 1725 mov dpl0,a 05F3 E0 1726 movx a,@dptr 05F4 80 CB 1727 sjmp cmdrespondstat 05F6 1728 setupackstd2: 05F6 02s08r92 1729 ljmp setupack 05F9 1730 setupstallstd2: 05F9 02s08r8E 1731 ljmp setupstall 05FC 1732 cmdnotgetstat: 1733 ;; USB_REQ_SET_FEATURE 05FC B4 03 05 1734 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 05FF 75 F0 01 1735 mov b,#1 0602 80 06 1736 sjmp handleftr 0604 1737 cmdnotsetftr: 1738 ;; USB_REQ_CLEAR_FEATURE 0604 B4 01 44 1739 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 0607 75 F0 00 1740 mov b,#0 060A 1741 handleftr: 060A 90 7F E8 1742 mov dptr,#SETUPDAT 060D E0 1743 movx a,@dptr 060E B4 02 E8 1744 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 0611 A3 1745 inc dptr 0612 A3 1746 inc dptr 0613 E0 1747 movx a,@dptr 0614 70 E3 1748 jnz setupstallstd2 ; not ENDPOINT_HALT feature 0616 A3 1749 inc dptr 0617 E0 1750 movx a,@dptr 0618 70 DF 1751 jnz setupstallstd2 061A A3 1752 inc dptr 061B E0 1753 movx a,@dptr 061C 90 7F C4 1754 mov dptr,#OUT1CS-2 061F 30 E7 05 1755 jnb acc.7,0$ 0622 90 7F B4 1756 mov dptr,#IN1CS-2 0625 44 10 1757 orl a,#0x10 0627 20 E3 CF 1758 0$: jb acc.3,setupstallstd2 1759 ;; clear data toggle 062A 54 1F 1760 anl a,#0x1f 062C 05 86 1761 inc dps 062E 90 7F D7 1762 mov dptr,#TOGCTL 0631 F0 1763 movx @dptr,a 0632 44 20 1764 orl a,#0x20 0634 F0 1765 movx @dptr,a 0635 54 0F 1766 anl a,#15 0637 F0 1767 movx @dptr,a 0638 15 86 1768 dec dps 1769 ;; clear/set ep halt feature 063A 25 E0 1770 add a,acc 063C 25 82 1771 add a,dpl0 063E F5 82 1772 mov dpl0,a 0640 E5 F0 1773 mov a,b 0642 F0 1774 movx @dptr,a 0643 80 B1 1775 sjmp setupackstd2 1776 0645 1777 cmdnotc0_1: 0645 02s07r08 1778 ljmp cmdnotc0 0648 1779 setupstallc0_1: 0648 02s08r8E 1780 ljmp setupstall 1781 064B 1782 cmdnotclrftr: 1783 ;; vendor specific commands 1784 ;; 0xc0 064B B4 C0 F7 1785 cjne a,#0xc0,cmdnotc0_1 064E 90 7F E8 1786 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0651 E0 1787 movx a,@dptr 0652 B4 C0 F3 1788 cjne a,#0xc0,setupstallc0_1 1789 ;; fill status buffer 0655 E5*05 1790 mov a,txstate 0657 F5 F0 1791 mov b,a 0659 D2 F2 1792 setb b.2 065B 45*11 1793 orl a,pttforce 065D B4 00 02 1794 cjne a,#0,0$ 0660 C2 F2 1795 clr b.2 0662 90 C0 09 1796 0$: mov dptr,#FSKSTAT 0665 E0 1797 movx a,@dptr 0666 A2 E0 1798 mov c,acc.0 0668 92 F3 1799 mov b.3,c 066A A2*0A 1800 mov c,uartempty 066C 92 F5 1801 mov b.5,c 066E E4 1802 clr a 066F 90 7F 04 1803 mov dptr,#(IN0BUF+4) 0672 F0 1804 movx @dptr,a 1805 ;; bytewide elements 0673 90 7F 00 1806 mov dptr,#(IN0BUF) 0676 E5 F0 1807 mov a,b 0678 F0 1808 movx @dptr,a 0679 E5*08 1809 mov a,txwr 067B F4 1810 cpl a 067C 25*09 1811 add a,txrd 067E 54 0F 1812 anl a,#(TXCHUNKS-1) 0680 90 7F 01 1813 mov dptr,#(IN0BUF+1) 0683 F0 1814 movx @dptr,a 0684 E5*14 1815 mov a,rxrd 0686 F4 1816 cpl a 0687 25*13 1817 add a,rxwr 0689 04 1818 inc a 068A 54 1F 1819 anl a,#(RXCHUNKS-1) 068C 90 7F 02 1820 mov dptr,#(IN0BUF+2) 068F F0 1821 movx @dptr,a 0690 90 C0 04 1822 mov dptr,#FSKRSSI 0693 E0 1823 movx a,@dptr 0694 90 7F 03 1824 mov dptr,#(IN0BUF+3) 0697 F0 1825 movx @dptr,a 1826 ;; counter 0698 05*04 1827 inc irqcount 069A E5*04 1828 mov a,irqcount 069C 90 7F 05 1829 mov dptr,#(IN0BUF+5) 069F F0 1830 movx @dptr,a 1831 ;; additional fields (HDLC state mach) 06A0 E5*05 1832 mov a,txstate 06A2 A3 1833 inc dptr 06A3 F0 1834 movx @dptr,a 06A4 E5*09 1835 mov a,txrd 06A6 A3 1836 inc dptr 06A7 F0 1837 movx @dptr,a 06A8 E5*08 1838 mov a,txwr 06AA A3 1839 inc dptr 06AB F0 1840 movx @dptr,a 06AC E5*0A 1841 mov a,txtwr 06AE A3 1842 inc dptr 06AF F0 1843 movx @dptr,a 06B0 74 00 1844 mov a,#0 06B2 A3 1845 inc dptr 06B3 F0 1846 movx @dptr,a 06B4 E5*06 1847 mov a,flagcnt 06B6 A3 1848 inc dptr 06B7 F0 1849 movx @dptr,a 06B8 E5*07 1850 mov a,flagcnt+1 06BA A3 1851 inc dptr 06BB F0 1852 movx @dptr,a 06BC E5*12 1853 mov a,rxstate 06BE A3 1854 inc dptr 06BF F0 1855 movx @dptr,a 06C0 E5*14 1856 mov a,rxrd 06C2 A3 1857 inc dptr 06C3 F0 1858 movx @dptr,a 06C4 E5*13 1859 mov a,rxwr 06C6 A3 1860 inc dptr 06C7 F0 1861 movx @dptr,a 06C8 E5*15 1862 mov a,rxtwr 06CA A3 1863 inc dptr 06CB F0 1864 movx @dptr,a 06CC E5*16 1865 mov a,rxcntc 06CE A3 1866 inc dptr 06CF F0 1867 movx @dptr,a 1868 ;; FPGA registers 06D0 E5*1D 1869 mov a,tmprxcnt 06D2 90 7F 12 1870 mov dptr,#(IN0BUF+18) 06D5 F0 1871 movx @dptr,a 06D6 90 C0 01 1872 mov dptr,#FSKSHSTATUS 06D9 E0 1873 movx a,@dptr 06DA 90 7F 13 1874 mov dptr,#(IN0BUF+19) 06DD F0 1875 movx @dptr,a 06DE 90 C0 08 1876 mov dptr,#FSKCTRL 06E1 E0 1877 movx a,@dptr 06E2 90 7F 14 1878 mov dptr,#(IN0BUF+20) 06E5 F0 1879 movx @dptr,a 06E6 90 C0 09 1880 mov dptr,#FSKSTAT 06E9 E0 1881 movx a,@dptr 06EA 90 7F 15 1882 mov dptr,#(IN0BUF+21) 06ED F0 1883 movx @dptr,a 1884 ;; Anchor Registers 06EE 90 7F C8 1885 mov dptr,#OUT2CS 06F1 E0 1886 movx a,@dptr 06F2 90 7F 16 1887 mov dptr,#(IN0BUF+22) 06F5 F0 1888 movx @dptr,a 1889 ;; set length 06F6 90 7F EE 1890 mov dptr,#SETUPDAT+6 ; wLength 06F9 E0 1891 movx a,@dptr 06FA 24 E9 1892 add a,#-(6+12+4+1) 06FC 50 01 1893 jnc 4$ 06FE E4 1894 clr a 06FF 24 17 1895 4$: add a,#(6+12+4+1) 0701 90 7F B5 1896 mov dptr,#IN0BC 0704 F0 1897 movx @dptr,a 0705 02s08r92 1898 ljmp setupack 0708 1899 cmdnotc0: 1900 ;; 0xc8 0708 B4 C8 19 1901 cjne a,#0xc8,cmdnotc8 070B 90 7F E8 1902 mov dptr,#SETUPDAT ; bRequestType == 0xc0 070E E0 1903 movx a,@dptr 070F B4 C0 0F 1904 cjne a,#0xc0,setupstallc8 0712 74 03 1905 mov a,#3 0714 90 7F 00 1906 mov dptr,#IN0BUF 0717 F0 1907 movx @dptr,a 0718 90 7F B5 1908 mov dptr,#IN0BC 071B 74 01 1909 mov a,#1 071D F0 1910 movx @dptr,a 071E 02s08r92 1911 ljmp setupack 0721 1912 setupstallc8: 0721 02s08r8E 1913 ljmp setupstall 0724 1914 cmdnotc8: 1915 ;; 0xc9 0724 B4 C9 21 1916 cjne a,#0xc9,cmdnotc9 0727 90 7F E8 1917 mov dptr,#SETUPDAT ; bRequestType == 0xc0 072A E0 1918 movx a,@dptr 072B B4 C0 17 1919 cjne a,#0xc0,setupstallc9 072E 90 7F 00 1920 mov dptr,#IN0BUF 0731 78rF0 1921 mov r0,#parserial 0733 E2 1922 0$: movx a,@r0 0734 60 05 1923 jz 1$ 0736 F0 1924 movx @dptr,a 0737 08 1925 inc r0 0738 A3 1926 inc dptr 0739 80 F8 1927 sjmp 0$ 073B E8 1928 1$: mov a,r0 073C 24 10 1929 add a,#-0xf0 ; -parserial 073E 90 7F B5 1930 mov dptr,#IN0BC 0741 F0 1931 movx @dptr,a 0742 02s08r92 1932 ljmp setupack 0745 1933 setupstallc9: 0745 02s08r8E 1934 ljmp setupstall 0748 1935 cmdnotc9: 1936 ;; 0xd0 0748 B4 D0 4D 1937 cjne a,#0xd0,cmdnotd0 074B 90 7F E8 1938 mov dptr,#SETUPDAT ; bRequestType == 0xc0 074E E0 1939 movx a,@dptr 074F B4 C0 43 1940 cjne a,#0xc0,setupstalld0 0752 90 7F EC 1941 mov dptr,#SETUPDAT+4 ; wIndex 0755 E0 1942 movx a,@dptr 0756 B4 01 0A 1943 cjne a,#1,0$ 0759 90 7F EA 1944 mov dptr,#SETUPDAT+2 ; wValue 075C E0 1945 movx a,@dptr 075D 54 01 1946 anl a,#1 075F F5*11 1947 mov pttforce,a 0761 D2*09 1948 setb pttforcechg 0763 1949 0$: ;; PTT status 0763 90 7F 00 1950 mov dptr,#IN0BUF 0766 E5*05 1951 mov a,txstate 0768 45*11 1952 orl a,pttforce 076A 60 02 1953 jz 1$ 076C 74 01 1954 mov a,#1 076E F0 1955 1$: movx @dptr,a 1956 ;; DCD status 076F 90 C0 09 1957 mov dptr,#FSKSTAT 0772 E0 1958 movx a,@dptr 0773 54 01 1959 anl a,#1 0775 64 01 1960 xrl a,#1 0777 90 7F 01 1961 mov dptr,#IN0BUF+1 077A F0 1962 movx @dptr,a 1963 ;; RSSI 077B 90 C0 04 1964 mov dptr,#FSKRSSI 077E E0 1965 movx a,@dptr 077F 90 7F 02 1966 mov dptr,#IN0BUF+2 0782 F0 1967 movx @dptr,a 1968 ;; length 0783 90 7F EE 1969 mov dptr,#SETUPDAT+6 ; wLength 0786 E0 1970 movx a,@dptr 0787 24 FD 1971 add a,#-3 0789 50 01 1972 jnc 2$ 078B E4 1973 clr a 078C 24 03 1974 2$: add a,#3 078E 90 7F B5 1975 mov dptr,#IN0BC 0791 F0 1976 movx @dptr,a 0792 02s08r92 1977 ljmp setupack 0795 1978 setupstalld0: 0795 02s08r8E 1979 ljmp setupstall 0798 1980 cmdnotd0: 1981 ;; 0xd1 0798 B4 D1 29 1982 cjne a,#0xd1,cmdnotd1 079B 90 7F E8 1983 mov dptr,#SETUPDAT ; bRequestType == 0xc0 079E E0 1984 movx a,@dptr 079F B4 C0 1F 1985 cjne a,#0xc0,setupstalld1 07A2 90 7F 00 1986 mov dptr,#IN0BUF 07A5 78rE0 1987 mov r0,#parbitratetx 07A7 7F 06 1988 mov r7,#6 07A9 E2 1989 1$: movx a,@r0 07AA F0 1990 movx @dptr,a 07AB A3 1991 inc dptr 07AC 08 1992 inc r0 07AD DF FA 1993 djnz r7,1$ 1994 ;; length 07AF 90 7F EE 1995 mov dptr,#SETUPDAT+6 ; wLength 07B2 E0 1996 movx a,@dptr 07B3 24 FA 1997 add a,#-6 07B5 50 01 1998 jnc 2$ 07B7 E4 1999 clr a 07B8 24 06 2000 2$: add a,#6 07BA 90 7F B5 2001 mov dptr,#IN0BC 07BD F0 2002 movx @dptr,a 07BE 02s08r92 2003 ljmp setupack 07C1 2004 setupstalld1: 07C1 02s08r8E 2005 ljmp setupstall 07C4 2006 cmdnotd1: 2007 ;; 0xd2 07C4 B4 D2 20 2008 cjne a,#0xd2,cmdnotd2 07C7 90 7F E8 2009 mov dptr,#SETUPDAT ; bRequestType == 0x40 07CA E0 2010 movx a,@dptr 07CB B4 40 16 2011 cjne a,#0x40,setupstalld2 07CE 90 7F EA 2012 mov dptr,#SETUPDAT+2 ; wValue 07D1 E0 2013 movx a,@dptr 07D2 F5 F0 2014 mov b,a 07D4 90 7F 98 2015 mov dptr,#OUTC 07D7 E0 2016 movx a,@dptr 07D8 A2 F0 2017 mov c,b.0 07DA 92 E3 2018 mov acc.3,c 07DC A2 F1 2019 mov c,b.1 07DE 92 E5 2020 mov acc.5,c 07E0 F0 2021 movx @dptr,a 07E1 02s08r92 2022 ljmp setupack 07E4 2023 setupstalld2: 07E4 02s08r8E 2024 ljmp setupstall 07E7 2025 cmdnotd2: 2026 ;; 0xd3 07E7 B4 D3 16 2027 cjne a,#0xd3,cmdnotd3 07EA 90 7F E8 2028 mov dptr,#SETUPDAT ; bRequestType == 0x40 07ED E0 2029 movx a,@dptr 07EE B4 40 07 2030 cjne a,#0x40,setupstalld3 07F1 90 7F EA 2031 mov dptr,#SETUPDAT+2 ; wValue 07F4 E0 2032 movx a,@dptr 07F5 10*0A 03 2033 jbc uartempty,cmdd2cont 07F8 2034 setupstalld3: 07F8 02s08r8E 2035 ljmp setupstall 07FB 2036 cmdd2cont: 07FB F5 99 2037 mov sbuf0,a 07FD 02s08r92 2038 ljmp setupack 0800 2039 cmdnotd3: 2040 ;; 0xd4 0800 B4 D4 4D 2041 cjne a,#0xd4,cmdnotd4 0803 90 7F E8 2042 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0806 E0 2043 movx a,@dptr 0807 B4 C0 43 2044 cjne a,#0xc0,setupstalld4 080A 90 7F EC 2045 mov dptr,#SETUPDAT+4 ; wIndex 080D E0 2046 movx a,@dptr 080E 90 7F EA 2047 mov dptr,#SETUPDAT+2 ; wValue 0811 B4 01 07 2048 cjne a,#1,0$ 0814 E0 2049 movx a,@dptr 0815 90 C0 0D 2050 mov dptr,#FSKMDISCOUT 0818 F0 2051 movx @dptr,a 0819 80 08 2052 sjmp 1$ 081B B4 02 05 2053 0$: cjne a,#2,1$ 081E E0 2054 movx a,@dptr 081F 90 C0 0C 2055 mov dptr,#FSKMDISCTRIS 0822 F0 2056 movx @dptr,a 0823 90 C0 0E 2057 1$: mov dptr,#FSKMDISCIN 0826 E0 2058 movx a,@dptr 0827 90 7F 00 2059 mov dptr,#IN0BUF+0 082A F0 2060 movx @dptr,a 082B 90 C0 0D 2061 mov dptr,#FSKMDISCOUT 082E E0 2062 movx a,@dptr 082F 90 7F 01 2063 mov dptr,#IN0BUF+1 0832 F0 2064 movx @dptr,a 0833 90 C0 0C 2065 mov dptr,#FSKMDISCTRIS 0836 E0 2066 movx a,@dptr 0837 90 7F 02 2067 mov dptr,#IN0BUF+2 083A F0 2068 movx @dptr,a 2069 ;; length 083B 90 7F EE 2070 mov dptr,#SETUPDAT+6 ; wLength 083E E0 2071 movx a,@dptr 083F 24 FD 2072 add a,#-3 0841 50 01 2073 jnc 2$ 0843 E4 2074 clr a 0844 24 03 2075 2$: add a,#3 0846 90 7F B5 2076 mov dptr,#IN0BC 0849 F0 2077 movx @dptr,a 084A 02s08r92 2078 ljmp setupack 084D 2079 setupstalld4: 084D 02s08r8E 2080 ljmp setupstall 0850 2081 cmdnotd4: 2082 ;; 0xd5 0850 B4 D5 3B 2083 cjne a,#0xd5,cmdnotd5 0853 90 7F E8 2084 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0856 E0 2085 movx a,@dptr 0857 B4 C0 31 2086 cjne a,#0xc0,setupstalld5 085A 90 7F EC 2087 mov dptr,#SETUPDAT+4 ; wIndex 085D E0 2088 movx a,@dptr 085E B4 01 08 2089 cjne a,#1,0$ 0861 90 7F EA 2090 mov dptr,#SETUPDAT+2 ; wValue 0864 E0 2091 movx a,@dptr 0865 90 C0 0A 2092 mov dptr,#FSKT7FOUT 0868 F0 2093 movx @dptr,a 0869 90 C0 0B 2094 0$: mov dptr,#FSKT7FIN 086C E0 2095 movx a,@dptr 086D 90 7F 00 2096 mov dptr,#IN0BUF+0 0870 F0 2097 movx @dptr,a 0871 90 C0 0A 2098 mov dptr,#FSKT7FOUT 0874 E0 2099 movx a,@dptr 0875 90 7F 01 2100 mov dptr,#IN0BUF+1 0878 F0 2101 movx @dptr,a 2102 ;; length 0879 90 7F EE 2103 mov dptr,#SETUPDAT+6 ; wLength 087C E0 2104 movx a,@dptr 087D 24 FE 2105 add a,#-2 087F 50 01 2106 jnc 2$ 0881 E4 2107 clr a 0882 24 02 2108 2$: add a,#2 0884 90 7F B5 2109 mov dptr,#IN0BC 0887 F0 2110 movx @dptr,a 0888 02s08r92 2111 ljmp setupack 088B 2112 setupstalld5: 088B 02s08r8E 2113 ljmp setupstall 088E 2114 cmdnotd5: 2115 ;; unknown commands fall through to setupstall 2116 088E 2117 setupstall: 088E 74 03 2118 mov a,#3 0890 80 02 2119 sjmp endsetup 0892 2120 setupack: 0892 74 02 2121 mov a,#2 0894 2122 endsetup: 0894 90 7F B4 2123 mov dptr,#EP0CS 0897 F0 2124 movx @dptr,a 0898 2125 endusbisr: 2126 ;; epilogue 0898 D0 07 2127 pop ar7 089A D0 00 2128 pop ar0 089C D0 86 2129 pop dps 089E D0 D0 2130 pop psw 08A0 D0 85 2131 pop dph1 08A2 D0 84 2132 pop dpl1 08A4 D0 83 2133 pop dph0 08A6 D0 82 2134 pop dpl0 08A8 D0 F0 2135 pop b 08AA D0 E0 2136 pop acc 08AC 32 2137 reti 2138 08AD 2139 usb_sof_isr: 08AD C0 E0 2140 push acc 08AF C0 F0 2141 push b 08B1 C0 82 2142 push dpl0 08B3 C0 83 2143 push dph0 08B5 C0 D0 2144 push psw 08B7 75 D0 00 2145 mov psw,#0x00 08BA C0 86 2146 push dps 08BC 75 86 00 2147 mov dps,#0 2148 ;; clear interrupt 08BF E5 91 2149 mov a,exif 08C1 C2 E4 2150 clr acc.4 08C3 F5 91 2151 mov exif,a 08C5 90 7F AB 2152 mov dptr,#USBIRQ 08C8 74 02 2153 mov a,#0x02 08CA F0 2154 movx @dptr,a 2155 ;; handle interrupt 2156 ;; epilogue 08CB D0 86 2157 pop dps 08CD D0 D0 2158 pop psw 08CF D0 83 2159 pop dph0 08D1 D0 82 2160 pop dpl0 08D3 D0 F0 2161 pop b 08D5 D0 E0 2162 pop acc 08D7 32 2163 reti 2164 2165 08D8 2166 usb_sutok_isr: 08D8 C0 E0 2167 push acc 08DA C0 F0 2168 push b 08DC C0 82 2169 push dpl0 08DE C0 83 2170 push dph0 08E0 C0 D0 2171 push psw 08E2 75 D0 00 2172 mov psw,#0x00 08E5 C0 86 2173 push dps 08E7 75 86 00 2174 mov dps,#0 2175 ;; clear interrupt 08EA E5 91 2176 mov a,exif 08EC C2 E4 2177 clr acc.4 08EE F5 91 2178 mov exif,a 08F0 90 7F AB 2179 mov dptr,#USBIRQ 08F3 74 04 2180 mov a,#0x04 08F5 F0 2181 movx @dptr,a 2182 ;; handle interrupt 2183 ;; epilogue 08F6 D0 86 2184 pop dps 08F8 D0 D0 2185 pop psw 08FA D0 83 2186 pop dph0 08FC D0 82 2187 pop dpl0 08FE D0 F0 2188 pop b 0900 D0 E0 2189 pop acc 0902 32 2190 reti 2191 0903 2192 usb_suspend_isr: 0903 C0 E0 2193 push acc 0905 C0 F0 2194 push b 0907 C0 82 2195 push dpl0 0909 C0 83 2196 push dph0 090B C0 D0 2197 push psw 090D 75 D0 00 2198 mov psw,#0x00 0910 C0 86 2199 push dps 0912 75 86 00 2200 mov dps,#0 2201 ;; clear interrupt 0915 E5 91 2202 mov a,exif 0917 C2 E4 2203 clr acc.4 0919 F5 91 2204 mov exif,a 091B 90 7F AB 2205 mov dptr,#USBIRQ 091E 74 08 2206 mov a,#0x08 0920 F0 2207 movx @dptr,a 2208 ;; handle interrupt 2209 ;; epilogue 0921 D0 86 2210 pop dps 0923 D0 D0 2211 pop psw 0925 D0 83 2212 pop dph0 0927 D0 82 2213 pop dpl0 0929 D0 F0 2214 pop b 092B D0 E0 2215 pop acc 092D 32 2216 reti 2217 092E 2218 usb_usbreset_isr: 092E C0 E0 2219 push acc 0930 C0 F0 2220 push b 0932 C0 82 2221 push dpl0 0934 C0 83 2222 push dph0 0936 C0 D0 2223 push psw 0938 75 D0 00 2224 mov psw,#0x00 093B C0 86 2225 push dps 093D 75 86 00 2226 mov dps,#0 2227 ;; clear interrupt 0940 E5 91 2228 mov a,exif 0942 C2 E4 2229 clr acc.4 0944 F5 91 2230 mov exif,a 0946 90 7F AB 2231 mov dptr,#USBIRQ 0949 74 10 2232 mov a,#0x10 094B F0 2233 movx @dptr,a 2234 ;; handle interrupt 2235 ;; epilogue 094C D0 86 2236 pop dps 094E D0 D0 2237 pop psw 0950 D0 83 2238 pop dph0 0952 D0 82 2239 pop dpl0 0954 D0 F0 2240 pop b 0956 D0 E0 2241 pop acc 0958 32 2242 reti 2243 0959 2244 usb_ep0in_isr: 0959 C0 E0 2245 push acc 095B C0 F0 2246 push b 095D C0 82 2247 push dpl0 095F C0 83 2248 push dph0 0961 C0 84 2249 push dpl1 0963 C0 85 2250 push dph1 0965 C0 D0 2251 push psw 0967 75 D0 00 2252 mov psw,#0x00 096A C0 86 2253 push dps 096C 75 86 00 2254 mov dps,#0 096F C0 00 2255 push ar0 0971 C0 07 2256 push ar7 2257 ;; clear interrupt 0973 E5 91 2258 mov a,exif 0975 C2 E4 2259 clr acc.4 0977 F5 91 2260 mov exif,a 0979 90 7F A9 2261 mov dptr,#IN07IRQ 097C 74 01 2262 mov a,#0x01 097E F0 2263 movx @dptr,a 2264 ;; handle interrupt 2265 2266 ;ep0install: 2267 ; mov a,#3 2268 ; sjmp ep0incs 2269 ;ep0inack: 2270 ; mov a,#2 2271 ;ep0incs: 2272 ; mov dptr,#EP0CS 2273 ; movx @dptr,a 2274 ;ep0inendisr: 2275 ;; epilogue 097F D0 07 2276 pop ar7 0981 D0 00 2277 pop ar0 0983 D0 86 2278 pop dps 0985 D0 D0 2279 pop psw 0987 D0 85 2280 pop dph1 0989 D0 84 2281 pop dpl1 098B D0 83 2282 pop dph0 098D D0 82 2283 pop dpl0 098F D0 F0 2284 pop b 0991 D0 E0 2285 pop acc 0993 32 2286 reti 2287 0994 2288 usb_ep0out_isr: 0994 C0 E0 2289 push acc 0996 C0 F0 2290 push b 0998 C0 82 2291 push dpl0 099A C0 83 2292 push dph0 099C C0 84 2293 push dpl1 099E C0 85 2294 push dph1 09A0 C0 D0 2295 push psw 09A2 75 D0 00 2296 mov psw,#0x00 09A5 C0 86 2297 push dps 09A7 75 86 00 2298 mov dps,#0 09AA C0 00 2299 push ar0 09AC C0 06 2300 push ar6 2301 ;; clear interrupt 09AE E5 91 2302 mov a,exif 09B0 C2 E4 2303 clr acc.4 09B2 F5 91 2304 mov exif,a 09B4 90 7F AA 2305 mov dptr,#OUT07IRQ 09B7 74 01 2306 mov a,#0x01 09B9 F0 2307 movx @dptr,a 2308 ;; handle interrupt 2309 2310 ;ep0outstall: 2311 ; mov ctrlcode,#0 2312 ; mov a,#3 2313 ; sjmp ep0outcs 2314 ;ep0outack: 2315 ; mov txwr,txtwr 2316 ; mov ctrlcode,#0 2317 ; mov a,#2 2318 ;ep0outcs: 2319 ; mov dptr,#EP0CS 2320 ; movx @dptr,a 2321 ;ep0outendisr: 2322 ;; epilogue 09BA D0 06 2323 pop ar6 09BC D0 00 2324 pop ar0 09BE D0 86 2325 pop dps 09C0 D0 D0 2326 pop psw 09C2 D0 85 2327 pop dph1 09C4 D0 84 2328 pop dpl1 09C6 D0 83 2329 pop dph0 09C8 D0 82 2330 pop dpl0 09CA D0 F0 2331 pop b 09CC D0 E0 2332 pop acc 09CE 32 2333 reti 2334 09CF 2335 fillusbintr:: 09CF E5*05 2336 mov a,txstate 09D1 F5 F0 2337 mov b,a 09D3 D2 F2 2338 setb b.2 09D5 45*11 2339 orl a,pttforce 09D7 B4 00 02 2340 cjne a,#0,0$ 09DA C2 F2 2341 clr b.2 09DC 90 C0 09 2342 0$: mov dptr,#FSKSTAT 09DF E0 2343 movx a,@dptr 09E0 A2 E0 2344 mov c,acc.0 09E2 92 F3 2345 mov b.3,c 09E4 A2*0A 2346 mov c,uartempty 09E6 92 F5 2347 mov b.5,c 09E8 D3 2348 setb c 09E9 E5*14 2349 mov a,rxrd 09EB B5*13 06 2350 cjne a,rxwr,1$ 09EE 90 7F B8 2351 mov dptr,#(IN2CS) 09F1 E0 2352 movx a,@dptr 09F2 A2 E1 2353 mov c,acc.1 09F4 92 F4 2354 1$: mov b.4,c 2355 ;; bytewide elements 09F6 90 7E 80 2356 mov dptr,#(IN1BUF) 09F9 E5 F0 2357 mov a,b 09FB F0 2358 movx @dptr,a 09FC E5*08 2359 mov a,txwr 09FE F4 2360 cpl a 09FF 25*09 2361 add a,txrd 0A01 54 0F 2362 anl a,#(TXCHUNKS-1) 0A03 90 7E 81 2363 mov dptr,#(IN1BUF+1) 0A06 F0 2364 movx @dptr,a 0A07 E5*14 2365 mov a,rxrd 0A09 F4 2366 cpl a 0A0A 25*13 2367 add a,rxwr 0A0C 04 2368 inc a 0A0D 54 1F 2369 anl a,#(RXCHUNKS-1) 0A0F 90 7E 82 2370 mov dptr,#(IN1BUF+2) 0A12 F0 2371 movx @dptr,a 0A13 90 C0 04 2372 mov dptr,#FSKRSSI 0A16 E0 2373 movx a,@dptr 0A17 90 7E 83 2374 mov dptr,#(IN1BUF+3) 0A1A F0 2375 movx @dptr,a 2376 ; counter 0A1B 05*04 2377 inc irqcount 0A1D E5*04 2378 mov a,irqcount 0A1F 90 7E 84 2379 mov dptr,#(IN1BUF+4) 0A22 F0 2380 movx @dptr,a 2381 ; UART buffer 0A23 75 F0 05 2382 mov b,#5 0A26 90 7E 85 2383 mov dptr,#(IN1BUF+5) 0A29 E5*2F 2384 2$: mov a,uartrd 0A2B B5*2E 07 2385 cjne a,uartwr,3$ 2386 ; set length 0A2E 90 7F B7 2387 mov dptr,#IN1BC 0A31 E5 F0 2388 mov a,b 0A33 F0 2389 movx @dptr,a 0A34 22 2390 ret 2391 0A35 24r1E 2392 3$: add a,#uartbuf 0A37 F8 2393 mov r0,a 0A38 E6 2394 mov a,@r0 0A39 F0 2395 movx @dptr,a 0A3A A3 2396 inc dptr 0A3B 05 F0 2397 inc b 0A3D E5*2F 2398 mov a,uartrd 0A3F 04 2399 inc a 0A40 54 0F 2400 anl a,#0xf 0A42 F5*2F 2401 mov uartrd,a 0A44 80 E3 2402 sjmp 2$ 2403 2404 0A46 2405 usb_ep1in_isr: 0A46 C0 E0 2406 push acc 0A48 C0 F0 2407 push b 0A4A C0 82 2408 push dpl0 0A4C C0 83 2409 push dph0 0A4E C0 D0 2410 push psw 0A50 75 D0 00 2411 mov psw,#0x00 0A53 C0 86 2412 push dps 0A55 75 86 00 2413 mov dps,#0 2414 ;; clear interrupt 0A58 E5 91 2415 mov a,exif 0A5A C2 E4 2416 clr acc.4 0A5C F5 91 2417 mov exif,a 0A5E 90 7F A9 2418 mov dptr,#IN07IRQ 0A61 74 02 2419 mov a,#0x02 0A63 F0 2420 movx @dptr,a 2421 ;; handle interrupt 0A64 12s09rCF 2422 lcall fillusbintr 2423 ;; epilogue 0A67 D0 86 2424 pop dps 0A69 D0 D0 2425 pop psw 0A6B D0 83 2426 pop dph0 0A6D D0 82 2427 pop dpl0 0A6F D0 F0 2428 pop b 0A71 D0 E0 2429 pop acc 0A73 32 2430 reti 2431 0A74 2432 usb_ep1out_isr: 0A74 C0 E0 2433 push acc 0A76 C0 F0 2434 push b 0A78 C0 82 2435 push dpl0 0A7A C0 83 2436 push dph0 0A7C C0 D0 2437 push psw 0A7E 75 D0 00 2438 mov psw,#0x00 0A81 C0 86 2439 push dps 0A83 75 86 00 2440 mov dps,#0 2441 ;; clear interrupt 0A86 E5 91 2442 mov a,exif 0A88 C2 E4 2443 clr acc.4 0A8A F5 91 2444 mov exif,a 0A8C 90 7F AA 2445 mov dptr,#OUT07IRQ 0A8F 74 02 2446 mov a,#0x02 0A91 F0 2447 movx @dptr,a 2448 ;; handle interrupt 2449 ;; epilogue 0A92 D0 86 2450 pop dps 0A94 D0 D0 2451 pop psw 0A96 D0 83 2452 pop dph0 0A98 D0 82 2453 pop dpl0 0A9A D0 F0 2454 pop b 0A9C D0 E0 2455 pop acc 0A9E 32 2456 reti 2457 0A9F 2458 usb_ep2in_isr: 0A9F C0 E0 2459 push acc 0AA1 C0 F0 2460 push b 0AA3 C0 82 2461 push dpl0 0AA5 C0 83 2462 push dph0 0AA7 C0 D0 2463 push psw 0AA9 75 D0 00 2464 mov psw,#0x00 0AAC C0 86 2465 push dps 0AAE 75 86 00 2466 mov dps,#0 2467 ;; clear interrupt 0AB1 E5 91 2468 mov a,exif 0AB3 C2 E4 2469 clr acc.4 0AB5 F5 91 2470 mov exif,a 0AB7 90 7F A9 2471 mov dptr,#IN07IRQ 0ABA 74 04 2472 mov a,#0x04 0ABC F0 2473 movx @dptr,a 2474 ;; handle interrupt 2475 ;; epilogue 0ABD D0 86 2476 pop dps 0ABF D0 D0 2477 pop psw 0AC1 D0 83 2478 pop dph0 0AC3 D0 82 2479 pop dpl0 0AC5 D0 F0 2480 pop b 0AC7 D0 E0 2481 pop acc 0AC9 32 2482 reti 2483 0ACA 2484 usb_ep2out_isr: 0ACA C0 E0 2485 push acc 0ACC C0 F0 2486 push b 0ACE C0 82 2487 push dpl0 0AD0 C0 83 2488 push dph0 0AD2 C0 D0 2489 push psw 0AD4 75 D0 00 2490 mov psw,#0x00 0AD7 C0 86 2491 push dps 0AD9 75 86 00 2492 mov dps,#0 2493 ;; clear interrupt 0ADC E5 91 2494 mov a,exif 0ADE C2 E4 2495 clr acc.4 0AE0 F5 91 2496 mov exif,a 0AE2 90 7F AA 2497 mov dptr,#OUT07IRQ 0AE5 74 04 2498 mov a,#0x04 0AE7 F0 2499 movx @dptr,a 2500 ;; handle interrupt 2501 ;; epilogue 0AE8 D0 86 2502 pop dps 0AEA D0 D0 2503 pop psw 0AEC D0 83 2504 pop dph0 0AEE D0 82 2505 pop dpl0 0AF0 D0 F0 2506 pop b 0AF2 D0 E0 2507 pop acc 0AF4 32 2508 reti 2509 0AF5 2510 usb_ep3in_isr: 0AF5 C0 E0 2511 push acc 0AF7 C0 F0 2512 push b 0AF9 C0 82 2513 push dpl0 0AFB C0 83 2514 push dph0 0AFD C0 D0 2515 push psw 0AFF 75 D0 00 2516 mov psw,#0x00 0B02 C0 86 2517 push dps 0B04 75 86 00 2518 mov dps,#0 2519 ;; clear interrupt 0B07 E5 91 2520 mov a,exif 0B09 C2 E4 2521 clr acc.4 0B0B F5 91 2522 mov exif,a 0B0D 90 7F A9 2523 mov dptr,#IN07IRQ 0B10 74 08 2524 mov a,#0x08 0B12 F0 2525 movx @dptr,a 2526 ;; handle interrupt 2527 ;; epilogue 0B13 D0 86 2528 pop dps 0B15 D0 D0 2529 pop psw 0B17 D0 83 2530 pop dph0 0B19 D0 82 2531 pop dpl0 0B1B D0 F0 2532 pop b 0B1D D0 E0 2533 pop acc 0B1F 32 2534 reti 2535 0B20 2536 usb_ep3out_isr: 0B20 C0 E0 2537 push acc 0B22 C0 F0 2538 push b 0B24 C0 82 2539 push dpl0 0B26 C0 83 2540 push dph0 0B28 C0 D0 2541 push psw 0B2A 75 D0 00 2542 mov psw,#0x00 0B2D C0 86 2543 push dps 0B2F 75 86 00 2544 mov dps,#0 2545 ;; clear interrupt 0B32 E5 91 2546 mov a,exif 0B34 C2 E4 2547 clr acc.4 0B36 F5 91 2548 mov exif,a 0B38 90 7F AA 2549 mov dptr,#OUT07IRQ 0B3B 74 08 2550 mov a,#0x08 0B3D F0 2551 movx @dptr,a 2552 ;; handle interrupt 2553 ;; epilogue 0B3E D0 86 2554 pop dps 0B40 D0 D0 2555 pop psw 0B42 D0 83 2556 pop dph0 0B44 D0 82 2557 pop dpl0 0B46 D0 F0 2558 pop b 0B48 D0 E0 2559 pop acc 0B4A 32 2560 reti 2561 0B4B 2562 usb_ep4in_isr: 0B4B C0 E0 2563 push acc 0B4D C0 F0 2564 push b 0B4F C0 82 2565 push dpl0 0B51 C0 83 2566 push dph0 0B53 C0 D0 2567 push psw 0B55 75 D0 00 2568 mov psw,#0x00 0B58 C0 86 2569 push dps 0B5A 75 86 00 2570 mov dps,#0 2571 ;; clear interrupt 0B5D E5 91 2572 mov a,exif 0B5F C2 E4 2573 clr acc.4 0B61 F5 91 2574 mov exif,a 0B63 90 7F A9 2575 mov dptr,#IN07IRQ 0B66 74 10 2576 mov a,#0x10 0B68 F0 2577 movx @dptr,a 2578 ;; handle interrupt 2579 ;; epilogue 0B69 D0 86 2580 pop dps 0B6B D0 D0 2581 pop psw 0B6D D0 83 2582 pop dph0 0B6F D0 82 2583 pop dpl0 0B71 D0 F0 2584 pop b 0B73 D0 E0 2585 pop acc 0B75 32 2586 reti 2587 0B76 2588 usb_ep4out_isr: 0B76 C0 E0 2589 push acc 0B78 C0 F0 2590 push b 0B7A C0 82 2591 push dpl0 0B7C C0 83 2592 push dph0 0B7E C0 D0 2593 push psw 0B80 75 D0 00 2594 mov psw,#0x00 0B83 C0 86 2595 push dps 0B85 75 86 00 2596 mov dps,#0 2597 ;; clear interrupt 0B88 E5 91 2598 mov a,exif 0B8A C2 E4 2599 clr acc.4 0B8C F5 91 2600 mov exif,a 0B8E 90 7F AA 2601 mov dptr,#OUT07IRQ 0B91 74 10 2602 mov a,#0x10 0B93 F0 2603 movx @dptr,a 2604 ;; handle interrupt 2605 ;; epilogue 0B94 D0 86 2606 pop dps 0B96 D0 D0 2607 pop psw 0B98 D0 83 2608 pop dph0 0B9A D0 82 2609 pop dpl0 0B9C D0 F0 2610 pop b 0B9E D0 E0 2611 pop acc 0BA0 32 2612 reti 2613 0BA1 2614 usb_ep5in_isr: 0BA1 C0 E0 2615 push acc 0BA3 C0 F0 2616 push b 0BA5 C0 82 2617 push dpl0 0BA7 C0 83 2618 push dph0 0BA9 C0 D0 2619 push psw 0BAB 75 D0 00 2620 mov psw,#0x00 0BAE C0 86 2621 push dps 0BB0 75 86 00 2622 mov dps,#0 2623 ;; clear interrupt 0BB3 E5 91 2624 mov a,exif 0BB5 C2 E4 2625 clr acc.4 0BB7 F5 91 2626 mov exif,a 0BB9 90 7F A9 2627 mov dptr,#IN07IRQ 0BBC 74 20 2628 mov a,#0x20 0BBE F0 2629 movx @dptr,a 2630 ;; handle interrupt 2631 ;; epilogue 0BBF D0 86 2632 pop dps 0BC1 D0 D0 2633 pop psw 0BC3 D0 83 2634 pop dph0 0BC5 D0 82 2635 pop dpl0 0BC7 D0 F0 2636 pop b 0BC9 D0 E0 2637 pop acc 0BCB 32 2638 reti 2639 0BCC 2640 usb_ep5out_isr: 0BCC C0 E0 2641 push acc 0BCE C0 F0 2642 push b 0BD0 C0 82 2643 push dpl0 0BD2 C0 83 2644 push dph0 0BD4 C0 D0 2645 push psw 0BD6 75 D0 00 2646 mov psw,#0x00 0BD9 C0 86 2647 push dps 0BDB 75 86 00 2648 mov dps,#0 2649 ;; clear interrupt 0BDE E5 91 2650 mov a,exif 0BE0 C2 E4 2651 clr acc.4 0BE2 F5 91 2652 mov exif,a 0BE4 90 7F AA 2653 mov dptr,#OUT07IRQ 0BE7 74 20 2654 mov a,#0x20 0BE9 F0 2655 movx @dptr,a 2656 ;; handle interrupt 2657 ;; epilogue 0BEA D0 86 2658 pop dps 0BEC D0 D0 2659 pop psw 0BEE D0 83 2660 pop dph0 0BF0 D0 82 2661 pop dpl0 0BF2 D0 F0 2662 pop b 0BF4 D0 E0 2663 pop acc 0BF6 32 2664 reti 2665 0BF7 2666 usb_ep6in_isr: 0BF7 C0 E0 2667 push acc 0BF9 C0 F0 2668 push b 0BFB C0 82 2669 push dpl0 0BFD C0 83 2670 push dph0 0BFF C0 D0 2671 push psw 0C01 75 D0 00 2672 mov psw,#0x00 0C04 C0 86 2673 push dps 0C06 75 86 00 2674 mov dps,#0 2675 ;; clear interrupt 0C09 E5 91 2676 mov a,exif 0C0B C2 E4 2677 clr acc.4 0C0D F5 91 2678 mov exif,a 0C0F 90 7F A9 2679 mov dptr,#IN07IRQ 0C12 74 40 2680 mov a,#0x40 0C14 F0 2681 movx @dptr,a 2682 ;; handle interrupt 2683 ;; epilogue 0C15 D0 86 2684 pop dps 0C17 D0 D0 2685 pop psw 0C19 D0 83 2686 pop dph0 0C1B D0 82 2687 pop dpl0 0C1D D0 F0 2688 pop b 0C1F D0 E0 2689 pop acc 0C21 32 2690 reti 2691 0C22 2692 usb_ep6out_isr: 0C22 C0 E0 2693 push acc 0C24 C0 F0 2694 push b 0C26 C0 82 2695 push dpl0 0C28 C0 83 2696 push dph0 0C2A C0 D0 2697 push psw 0C2C 75 D0 00 2698 mov psw,#0x00 0C2F C0 86 2699 push dps 0C31 75 86 00 2700 mov dps,#0 2701 ;; clear interrupt 0C34 E5 91 2702 mov a,exif 0C36 C2 E4 2703 clr acc.4 0C38 F5 91 2704 mov exif,a 0C3A 90 7F AA 2705 mov dptr,#OUT07IRQ 0C3D 74 40 2706 mov a,#0x40 0C3F F0 2707 movx @dptr,a 2708 ;; handle interrupt 2709 ;; epilogue 0C40 D0 86 2710 pop dps 0C42 D0 D0 2711 pop psw 0C44 D0 83 2712 pop dph0 0C46 D0 82 2713 pop dpl0 0C48 D0 F0 2714 pop b 0C4A D0 E0 2715 pop acc 0C4C 32 2716 reti 2717 0C4D 2718 usb_ep7in_isr: 0C4D C0 E0 2719 push acc 0C4F C0 F0 2720 push b 0C51 C0 82 2721 push dpl0 0C53 C0 83 2722 push dph0 0C55 C0 D0 2723 push psw 0C57 75 D0 00 2724 mov psw,#0x00 0C5A C0 86 2725 push dps 0C5C 75 86 00 2726 mov dps,#0 2727 ;; clear interrupt 0C5F E5 91 2728 mov a,exif 0C61 C2 E4 2729 clr acc.4 0C63 F5 91 2730 mov exif,a 0C65 90 7F A9 2731 mov dptr,#IN07IRQ 0C68 74 80 2732 mov a,#0x80 0C6A F0 2733 movx @dptr,a 2734 ;; handle interrupt 2735 ;; epilogue 0C6B D0 86 2736 pop dps 0C6D D0 D0 2737 pop psw 0C6F D0 83 2738 pop dph0 0C71 D0 82 2739 pop dpl0 0C73 D0 F0 2740 pop b 0C75 D0 E0 2741 pop acc 0C77 32 2742 reti 2743 0C78 2744 usb_ep7out_isr: 0C78 C0 E0 2745 push acc 0C7A C0 F0 2746 push b 0C7C C0 82 2747 push dpl0 0C7E C0 83 2748 push dph0 0C80 C0 D0 2749 push psw 0C82 75 D0 00 2750 mov psw,#0x00 0C85 C0 86 2751 push dps 0C87 75 86 00 2752 mov dps,#0 2753 ;; clear interrupt 0C8A E5 91 2754 mov a,exif 0C8C C2 E4 2755 clr acc.4 0C8E F5 91 2756 mov exif,a 0C90 90 7F AA 2757 mov dptr,#OUT07IRQ 0C93 74 80 2758 mov a,#0x80 0C95 F0 2759 movx @dptr,a 2760 ;; handle interrupt 2761 ;; epilogue 0C96 D0 86 2762 pop dps 0C98 D0 D0 2763 pop psw 0C9A D0 83 2764 pop dph0 0C9C D0 82 2765 pop dpl0 0C9E D0 F0 2766 pop b 0CA0 D0 E0 2767 pop acc 0CA2 32 2768 reti 2769 2770 ;; ----------------------------------------------------- 2771 ;; USB descriptors 2772 ;; ----------------------------------------------------- 2773 2774 ;; Device and/or Interface Class codes 0000 2775 USB_CLASS_PER_INTERFACE = 0 0001 2776 USB_CLASS_AUDIO = 1 0002 2777 USB_CLASS_COMM = 2 0003 2778 USB_CLASS_HID = 3 0007 2779 USB_CLASS_PRINTER = 7 0008 2780 USB_CLASS_MASS_STORAGE = 8 0009 2781 USB_CLASS_HUB = 9 00FF 2782 USB_CLASS_VENDOR_SPEC = 0xff 2783 2784 ;; Descriptor types 0001 2785 USB_DT_DEVICE = 0x01 0002 2786 USB_DT_CONFIG = 0x02 0003 2787 USB_DT_STRING = 0x03 0004 2788 USB_DT_INTERFACE = 0x04 0005 2789 USB_DT_ENDPOINT = 0x05 2790 2791 ;; Standard requests 0000 2792 USB_REQ_GET_STATUS = 0x00 0001 2793 USB_REQ_CLEAR_FEATURE = 0x01 0003 2794 USB_REQ_SET_FEATURE = 0x03 0005 2795 USB_REQ_SET_ADDRESS = 0x05 0006 2796 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2797 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2798 USB_REQ_GET_CONFIGURATION = 0x08 0009 2799 USB_REQ_SET_CONFIGURATION = 0x09 000A 2800 USB_REQ_GET_INTERFACE = 0x0A 000B 2801 USB_REQ_SET_INTERFACE = 0x0B 000C 2802 USB_REQ_SYNCH_FRAME = 0x0C 2803 2804 ;; USB Request Type and Endpoint Directions 0000 2805 USB_DIR_OUT = 0 0080 2806 USB_DIR_IN = 0x80 2807 0000 2808 USB_TYPE_STANDARD = (0x00 << 5) 0020 2809 USB_TYPE_CLASS = (0x01 << 5) 0040 2810 USB_TYPE_VENDOR = (0x02 << 5) 0060 2811 USB_TYPE_RESERVED = (0x03 << 5) 2812 0000 2813 USB_RECIP_DEVICE = 0x00 0001 2814 USB_RECIP_INTERFACE = 0x01 0002 2815 USB_RECIP_ENDPOINT = 0x02 0003 2816 USB_RECIP_OTHER = 0x03 2817 2818 ;; Request target types. 0000 2819 USB_RT_DEVICE = 0x00 0001 2820 USB_RT_INTERFACE = 0x01 0002 2821 USB_RT_ENDPOINT = 0x02 2822 BAC0 2823 VENDID = 0xbac0 6136 2824 PRODID = 0x6136 2825 0CA3 2826 devicedescr: 0CA3 12 2827 .db 18 ; bLength 0CA4 01 2828 .db USB_DT_DEVICE ; bDescriptorType 0CA5 00 01 2829 .db 0x00, 0x01 ; bcdUSB 0CA7 FF 2830 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 0CA8 00 2831 .db 0 ; bDeviceSubClass 0CA9 FF 2832 .db 0xff ; bDeviceProtocol 0CAA 40 2833 .db 0x40 ; bMaxPacketSize0 0CAB C0 BA 2834 .db VENDID ; idVendor 0CAD 36 61 2835 .db PRODID ; idProduct 0CAF 01 00 2836 .db 0x01,0x00 ; bcdDevice 0CB1 01 2837 .db 1 ; iManufacturer 0CB2 02 2838 .db 2 ; iProduct 0CB3 03 2839 .db 3 ; iSerialNumber 0CB4 01 2840 .db 1 ; bNumConfigurations 2841 0CB5 2842 config0descr: 0CB5 09 2843 .db 9 ; bLength 0CB6 02 2844 .db USB_DT_CONFIG ; bDescriptorType 0CB7 45 00 2845 .db config0sz ; wTotalLength 0CB9 01 2846 .db 1 ; bNumInterfaces 0CBA 01 2847 .db 1 ; bConfigurationValue 0CBB 00 2848 .db 0 ; iConfiguration 0CBC 40 2849 .db 0b01000000 ; bmAttributs (self powered) 0CBD 00 2850 .db 0 ; MaxPower (mA/2) (self powered so 0) 2851 ;; interface descriptor I0:A0 0CBE 09 2852 .db 9 ; bLength 0CBF 04 2853 .db USB_DT_INTERFACE ; bDescriptorType 0CC0 00 2854 .db 0 ; bInterfaceNumber 0CC1 00 2855 .db 0 ; bAlternateSetting 0CC2 03 2856 .db 3 ; bNumEndpoints 0CC3 FF 2857 .db 0xff ; bInterfaceClass (vendor specific) 0CC4 00 2858 .db 0x00 ; bInterfaceSubClass 0CC5 FF 2859 .db 0xff ; bInterfaceProtocol (vendor specific) 0CC6 00 2860 .db 0 ; iInterface 2861 ;; endpoint descriptor I0:A0:E0 0CC7 07 2862 .db 7 ; bLength 0CC8 05 2863 .db USB_DT_ENDPOINT ; bDescriptorType 0CC9 81 2864 .db (USB_DIR_IN | 1) ; bEndpointAddress 0CCA 02 2865 .db 0x02 ; bmAttributes (bulk) 0CCB 40 00 2866 .db 0x40,0x00 ; wMaxPacketSize 0CCD 00 2867 .db 0 ; bInterval 2868 ;; endpoint descriptor I0:A0:E1 0CCE 07 2869 .db 7 ; bLength 0CCF 05 2870 .db USB_DT_ENDPOINT ; bDescriptorType 0CD0 82 2871 .db (USB_DIR_IN | 2) ; bEndpointAddress 0CD1 02 2872 .db 0x02 ; bmAttributes (bulk) 0CD2 40 00 2873 .db 0x40,0x00 ; wMaxPacketSize 0CD4 00 2874 .db 0 ; bInterval 2875 ;; endpoint descriptor I0:A0:E2 0CD5 07 2876 .db 7 ; bLength 0CD6 05 2877 .db USB_DT_ENDPOINT ; bDescriptorType 0CD7 02 2878 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0CD8 02 2879 .db 0x02 ; bmAttributes (bulk) 0CD9 40 00 2880 .db 0x40,0x00 ; wMaxPacketSize 0CDB 00 2881 .db 0 ; bInterval 2882 ;; interface descriptor I0:A1 0CDC 09 2883 .db 9 ; bLength 0CDD 04 2884 .db USB_DT_INTERFACE ; bDescriptorType 0CDE 00 2885 .db 0 ; bInterfaceNumber 0CDF 01 2886 .db 1 ; bAlternateSetting 0CE0 03 2887 .db 3 ; bNumEndpoints 0CE1 FF 2888 .db 0xff ; bInterfaceClass (vendor specific) 0CE2 00 2889 .db 0x00 ; bInterfaceSubClass 0CE3 FF 2890 .db 0xff ; bInterfaceProtocol (vendor specific) 0CE4 00 2891 .db 0 ; iInterface 2892 ;; endpoint descriptor I0:A1:E0 0CE5 07 2893 .db 7 ; bLength 0CE6 05 2894 .db USB_DT_ENDPOINT ; bDescriptorType 0CE7 81 2895 .db (USB_DIR_IN | 1) ; bEndpointAddress 0CE8 03 2896 .db 0x03 ; bmAttributes (interrupt) 0CE9 40 00 2897 .db 0x40,0x00 ; wMaxPacketSize 0CEB 0A 2898 .db 10 ; bInterval 2899 ;; endpoint descriptor I0:A1:E1 0CEC 07 2900 .db 7 ; bLength 0CED 05 2901 .db USB_DT_ENDPOINT ; bDescriptorType 0CEE 82 2902 .db (USB_DIR_IN | 2) ; bEndpointAddress 0CEF 02 2903 .db 0x02 ; bmAttributes (bulk) 0CF0 40 00 2904 .db 0x40,0x00 ; wMaxPacketSize 0CF2 00 2905 .db 0 ; bInterval 2906 ;; endpoint descriptor I0:A1:E2 0CF3 07 2907 .db 7 ; bLength 0CF4 05 2908 .db USB_DT_ENDPOINT ; bDescriptorType 0CF5 02 2909 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0CF6 02 2910 .db 0x02 ; bmAttributes (bulk) 0CF7 40 00 2911 .db 0x40,0x00 ; wMaxPacketSize 0CF9 00 2912 .db 0 ; bInterval 2913 0045 2914 config0sz = . - config0descr 2915 0CFA 2916 stringdescr: 0CFAr02s0D 2917 .db string0 0CFCr06s0D 2918 .db string1 0CFEr14s0D 2919 .db string2 0D00r32s0D 2920 .db stringserial 2921 0004 2922 numstrings = (. - stringdescr)/2 2923 0D02 2924 string0: 0D02 04 2925 .db string0sz ; bLength 0D03 03 2926 .db USB_DT_STRING ; bDescriptorType 0D04 00 00 2927 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2928 string0sz = . - string0 2929 0D06 2930 string1: 0D06 0E 2931 .db string1sz ; bLength 0D07 03 2932 .db USB_DT_STRING ; bDescriptorType 0D08 42 00 61 00 79 00 2933 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2934 string1sz = . - string1 2935 0D14 2936 string2: 0D14 1E 2937 .db string2sz ; bLength 0D15 03 2938 .db USB_DT_STRING ; bDescriptorType 0D16 55 00 53 00 42 00 2939 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0D26 28 00 41 00 46 00 2940 .db '(,0,'A,0,'F,0,'S,0,'K,0,'),0 53 00 4B 00 29 00 001E 2941 string2sz = . - string2 2942 0D32 2943 stringserial: 0D32 02 2944 .db 2 ; bLength 0D33 03 2945 .db USB_DT_STRING ; bDescriptorType 0D34 00 00 00 00 00 00 2946 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0D44 00 00 00 00 00 00 2947 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2948 baycomusb-0.10.orig/firmware/afskfirmware/main.rst0100644000175100017510000042316507337536151020410 0ustar abaaba 1 .module main 2 3 ;; ENDPOINTS 4 ;; EP0 in/out Control 5 ;; EP1 in Interrupt: Status 6 ;; Byte 0: Modem Status 7 ;; Bit 0-1: Transmitter status 8 ;; 0: idle (off) 9 ;; 1: keyup 10 ;; 2: transmitting packets 11 ;; 3: tail 12 ;; Bit 2: PTT status (1=on) 13 ;; Bit 3: DCD 14 ;; Bit 4: RXB (Rx Packet Ready) 15 ;; Bit 5: UART transmitter empty 16 ;; Bit 6-7: unused 17 ;; Byte 1: Number of empty 64 byte chunks in TX fifo 18 ;; Byte 2: Number of full 64 byte chunks in RX fifo 19 ;; Byte 3: RSSI value 20 ;; Byte 4: IRQ count 21 ;; Byte 5-20: (as needed) UART receiver chars 22 ;; EP2 out Packets to be transmitted 23 ;; EP2 in Received packets; note they have the CRC appended 24 25 ;; COMMAND LIST 26 ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) 27 ;; C0 C8 read mode 28 ;; Return: 29 ;; Byte 0: 3 (MODE_AFSK) 30 ;; C0 C9 return serial number string 31 ;; C0 D0 get/set PTT/DCD/RSSI 32 ;; wIndex = 1: set forced ptt to wValue 33 ;; Return: 34 ;; Byte 0: PTT status 35 ;; Byte 1: DCD status 36 ;; Byte 2: RSSI status 37 ;; C0 D1 get Bitrate 38 ;; Return: 39 ;; Byte 0-2: TX Bitrate 40 ;; Byte 3-5: RX Bitrate 41 ;; 40 D2 set CON/STA led 42 ;; Bits 0-1 of wValue 43 ;; 40 D3 send byte to UART 44 ;; Byte in wValue 45 ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) 46 ;; wIndex = 1: write wValue to output register 47 ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) 48 ;; Return: 49 ;; Byte 0: Modem Disconnect Input 50 ;; Byte 1: Modem Disconnect Output register 51 ;; Byte 2: Modem Disconnect Tristate register 52 ;; C0 D5 get/set T7F port 53 ;; wIndex = 1: write wValue to T7F output register 54 ;; Return: 55 ;; Byte 0: T7F Input 56 ;; Byte 1: T7F Output register 57 58 ;; define code segments link order 59 .area CODE (CODE) 60 .area CSEG (CODE) 61 .area GSINIT (CODE) 62 .area GSINIT2 (CODE) 63 64 ;; ----------------------------------------------------- 65 66 ;; special function registers (which are not predefined) 0082 67 dpl0 = 0x82 0083 68 dph0 = 0x83 0084 69 dpl1 = 0x84 0085 70 dph1 = 0x85 0086 71 dps = 0x86 008E 72 ckcon = 0x8E 008F 73 spc_fnc = 0x8F 0091 74 exif = 0x91 0092 75 mpage = 0x92 0098 76 scon0 = 0x98 0099 77 sbuf0 = 0x99 00C0 78 scon1 = 0xC0 00C1 79 sbuf1 = 0xC1 00D8 80 eicon = 0xD8 00E8 81 eie = 0xE8 00F8 82 eip = 0xF8 83 84 ;; anchor xdata registers 7F00 85 IN0BUF = 0x7F00 7EC0 86 OUT0BUF = 0x7EC0 7E80 87 IN1BUF = 0x7E80 7E40 88 OUT1BUF = 0x7E40 7E00 89 IN2BUF = 0x7E00 7DC0 90 OUT2BUF = 0x7DC0 7D80 91 IN3BUF = 0x7D80 7D40 92 OUT3BUF = 0x7D40 7D00 93 IN4BUF = 0x7D00 7CC0 94 OUT4BUF = 0x7CC0 7C80 95 IN5BUF = 0x7C80 7C40 96 OUT5BUF = 0x7C40 7C00 97 IN6BUF = 0x7C00 7BC0 98 OUT6BUF = 0x7BC0 7B80 99 IN7BUF = 0x7B80 7B40 100 OUT7BUF = 0x7B40 7FE8 101 SETUPBUF = 0x7FE8 7FE8 102 SETUPDAT = 0x7FE8 103 7FB4 104 EP0CS = 0x7FB4 7FB5 105 IN0BC = 0x7FB5 7FB6 106 IN1CS = 0x7FB6 7FB7 107 IN1BC = 0x7FB7 7FB8 108 IN2CS = 0x7FB8 7FB9 109 IN2BC = 0x7FB9 7FBA 110 IN3CS = 0x7FBA 7FBB 111 IN3BC = 0x7FBB 7FBC 112 IN4CS = 0x7FBC 7FBD 113 IN4BC = 0x7FBD 7FBE 114 IN5CS = 0x7FBE 7FBF 115 IN5BC = 0x7FBF 7FC0 116 IN6CS = 0x7FC0 7FC1 117 IN6BC = 0x7FC1 7FC2 118 IN7CS = 0x7FC2 7FC3 119 IN7BC = 0x7FC3 7FC5 120 OUT0BC = 0x7FC5 7FC6 121 OUT1CS = 0x7FC6 7FC7 122 OUT1BC = 0x7FC7 7FC8 123 OUT2CS = 0x7FC8 7FC9 124 OUT2BC = 0x7FC9 7FCA 125 OUT3CS = 0x7FCA 7FCB 126 OUT3BC = 0x7FCB 7FCC 127 OUT4CS = 0x7FCC 7FCD 128 OUT4BC = 0x7FCD 7FCE 129 OUT5CS = 0x7FCE 7FCF 130 OUT5BC = 0x7FCF 7FD0 131 OUT6CS = 0x7FD0 7FD1 132 OUT6BC = 0x7FD1 7FD2 133 OUT7CS = 0x7FD2 7FD3 134 OUT7BC = 0x7FD3 135 7FA8 136 IVEC = 0x7FA8 7FA9 137 IN07IRQ = 0x7FA9 7FAA 138 OUT07IRQ = 0x7FAA 7FAB 139 USBIRQ = 0x7FAB 7FAC 140 IN07IEN = 0x7FAC 7FAD 141 OUT07IEN = 0x7FAD 7FAE 142 USBIEN = 0x7FAE 7FAF 143 USBBAV = 0x7FAF 7FB2 144 BPADDRH = 0x7FB2 7FB3 145 BPADDRL = 0x7FB3 146 7FD4 147 SUDPTRH = 0x7FD4 7FD5 148 SUDPTRL = 0x7FD5 7FD6 149 USBCS = 0x7FD6 7FD7 150 TOGCTL = 0x7FD7 7FD8 151 USBFRAMEL = 0x7FD8 7FD9 152 USBFRAMEH = 0x7FD9 7FDB 153 FNADDR = 0x7FDB 7FDD 154 USBPAIR = 0x7FDD 7FDE 155 IN07VAL = 0x7FDE 7FDF 156 OUT07VAL = 0x7FDF 7FE3 157 AUTOPTRH = 0x7FE3 7FE4 158 AUTOPTRL = 0x7FE4 7FE5 159 AUTODATA = 0x7FE5 160 161 ;; isochronous endpoints. only available if ISODISAB=0 162 7F60 163 OUT8DATA = 0x7F60 7F61 164 OUT9DATA = 0x7F61 7F62 165 OUT10DATA = 0x7F62 7F63 166 OUT11DATA = 0x7F63 7F64 167 OUT12DATA = 0x7F64 7F65 168 OUT13DATA = 0x7F65 7F66 169 OUT14DATA = 0x7F66 7F67 170 OUT15DATA = 0x7F67 171 7F68 172 IN8DATA = 0x7F68 7F69 173 IN9DATA = 0x7F69 7F6A 174 IN10DATA = 0x7F6A 7F6B 175 IN11DATA = 0x7F6B 7F6C 176 IN12DATA = 0x7F6C 7F6D 177 IN13DATA = 0x7F6D 7F6E 178 IN14DATA = 0x7F6E 7F6F 179 IN15DATA = 0x7F6F 180 7F70 181 OUT8BCH = 0x7F70 7F71 182 OUT8BCL = 0x7F71 7F72 183 OUT9BCH = 0x7F72 7F73 184 OUT9BCL = 0x7F73 7F74 185 OUT10BCH = 0x7F74 7F75 186 OUT10BCL = 0x7F75 7F76 187 OUT11BCH = 0x7F76 7F77 188 OUT11BCL = 0x7F77 7F78 189 OUT12BCH = 0x7F78 7F79 190 OUT12BCL = 0x7F79 7F7A 191 OUT13BCH = 0x7F7A 7F7B 192 OUT13BCL = 0x7F7B 7F7C 193 OUT14BCH = 0x7F7C 7F7D 194 OUT14BCL = 0x7F7D 7F7E 195 OUT15BCH = 0x7F7E 7F7F 196 OUT15BCL = 0x7F7F 197 7FF0 198 OUT8ADDR = 0x7FF0 7FF1 199 OUT9ADDR = 0x7FF1 7FF2 200 OUT10ADDR = 0x7FF2 7FF3 201 OUT11ADDR = 0x7FF3 7FF4 202 OUT12ADDR = 0x7FF4 7FF5 203 OUT13ADDR = 0x7FF5 7FF6 204 OUT14ADDR = 0x7FF6 7FF7 205 OUT15ADDR = 0x7FF7 7FF8 206 IN8ADDR = 0x7FF8 7FF9 207 IN9ADDR = 0x7FF9 7FFA 208 IN10ADDR = 0x7FFA 7FFB 209 IN11ADDR = 0x7FFB 7FFC 210 IN12ADDR = 0x7FFC 7FFD 211 IN13ADDR = 0x7FFD 7FFE 212 IN14ADDR = 0x7FFE 7FFF 213 IN15ADDR = 0x7FFF 214 7FA0 215 ISOERR = 0x7FA0 7FA1 216 ISOCTL = 0x7FA1 7FA2 217 ZBCOUNT = 0x7FA2 7FE0 218 INISOVAL = 0x7FE0 7FE1 219 OUTISOVAL = 0x7FE1 7FE2 220 FASTXFR = 0x7FE2 221 222 ;; CPU control registers 223 7F92 224 CPUCS = 0x7F92 225 226 ;; IO port control registers 227 7F93 228 PORTACFG = 0x7F93 7F94 229 PORTBCFG = 0x7F94 7F95 230 PORTCCFG = 0x7F95 7F96 231 OUTA = 0x7F96 7F97 232 OUTB = 0x7F97 7F98 233 OUTC = 0x7F98 7F99 234 PINSA = 0x7F99 7F9A 235 PINSB = 0x7F9A 7F9B 236 PINSC = 0x7F9B 7F9C 237 OEA = 0x7F9C 7F9D 238 OEB = 0x7F9D 7F9E 239 OEC = 0x7F9E 240 241 ;; I2C controller registers 242 7FA5 243 I2CS = 0x7FA5 7FA6 244 I2DAT = 0x7FA6 245 246 ;; Xilinx FPGA registers C000 247 FSKSHREG = 0xc000 C001 248 FSKSHSTATUS = 0xc001 C004 249 FSKRSSI = 0xc004 C008 250 FSKCTRL = 0xc008 C009 251 FSKSTAT = 0xc009 C00A 252 FSKT7FOUT = 0xc00a C00B 253 FSKT7FIN = 0xc00b C00C 254 FSKMDISCTRIS = 0xc00c C00D 255 FSKMDISCOUT = 0xc00d C00E 256 FSKMDISCIN = 0xc00e 257 258 ;; ----------------------------------------------------- 259 260 .area CODE (CODE) 0000 02 0E AB 261 ljmp startup 0003 02 04 3B 262 ljmp int0_isr 0006 263 .ds 5 000B 02 04 5C 264 ljmp timer0_isr 000E 265 .ds 5 0013 02 04 7D 266 ljmp int1_isr 0016 267 .ds 5 001B 02 04 9E 268 ljmp timer1_isr 001E 269 .ds 5 0023 02 04 BF 270 ljmp ser0_isr 0026 271 .ds 5 002B 02 04 FD 272 ljmp timer2_isr 002E 273 .ds 5 0033 02 05 1E 274 ljmp resume_isr 0036 275 .ds 5 003B 02 05 3F 276 ljmp ser1_isr 003E 277 .ds 5 0043 02 01 00 278 ljmp usb_isr 0046 279 .ds 5 004B 02 05 62 280 ljmp i2c_isr 004E 281 .ds 5 0053 02 05 87 282 ljmp int4_isr 0056 283 .ds 5 005B 02 05 AC 284 ljmp int5_isr 005E 285 .ds 5 0063 02 05 D1 286 ljmp int6_isr 287 288 ;; Parameter block at 0xe0 0066 289 .ds 0x7a 00E0 B0 04 00 290 parbitratetx: .db <1200,>1200,0 00E3 B0 04 00 291 parbitraterx: .db <1200,>1200,0 00E6 00 292 parextmodem: .db 0 00E7 01 293 parpttmute: .db 1 294 295 ;; Serial# string at 0xf0 00E8 296 .ds 8 00F0 297 parserial: 00F0 30 30 30 30 30 30 298 .db '0,'0,'0,'0,'0,'0,'0,'0,0 30 30 00 00F9 299 .ds 7 300 301 ;; USB interrupt dispatch table 0100 302 usb_isr: 0100 02 05 F2 303 ljmp usb_sudav_isr 0103 304 .ds 1 0104 02 0A 04 305 ljmp usb_sof_isr 0107 306 .ds 1 0108 02 0A 2F 307 ljmp usb_sutok_isr 010B 308 .ds 1 010C 02 0A 5A 309 ljmp usb_suspend_isr 010F 310 .ds 1 0110 02 0A 85 311 ljmp usb_usbreset_isr 0113 312 .ds 1 0114 32 313 reti 0115 314 .ds 3 0118 02 0A B0 315 ljmp usb_ep0in_isr 011B 316 .ds 1 011C 02 0A EB 317 ljmp usb_ep0out_isr 011F 318 .ds 1 0120 02 0B 9D 319 ljmp usb_ep1in_isr 0123 320 .ds 1 0124 02 0B CB 321 ljmp usb_ep1out_isr 0127 322 .ds 1 0128 02 0B F6 323 ljmp usb_ep2in_isr 012B 324 .ds 1 012C 02 0C 21 325 ljmp usb_ep2out_isr 012F 326 .ds 1 0130 02 0C 4C 327 ljmp usb_ep3in_isr 0133 328 .ds 1 0134 02 0C 77 329 ljmp usb_ep3out_isr 0137 330 .ds 1 0138 02 0C A2 331 ljmp usb_ep4in_isr 013B 332 .ds 1 013C 02 0C CD 333 ljmp usb_ep4out_isr 013F 334 .ds 1 0140 02 0C F8 335 ljmp usb_ep5in_isr 0143 336 .ds 1 0144 02 0D 23 337 ljmp usb_ep5out_isr 0147 338 .ds 1 0148 02 0D 4E 339 ljmp usb_ep6in_isr 014B 340 .ds 1 014C 02 0D 79 341 ljmp usb_ep6out_isr 014F 342 .ds 1 0150 02 0D A4 343 ljmp usb_ep7in_isr 0153 344 .ds 1 0154 02 0D CF 345 ljmp usb_ep7out_isr 346 347 ;; ----------------------------------------------------- 348 0020 349 RXCHUNKS = 32 0010 350 TXCHUNKS = 16 351 352 .area OSEG (OVR,DATA) 353 .area BSEG (BIT) 0000 354 ctrl_ptt: .ds 1 0001 355 ctrl_pttmute: .ds 1 0002 356 ctrl_ledptt: .ds 1 0003 357 ctrl_leddcdsrc: .ds 1 ; not implemented 0004 358 ctrl_clksel: .ds 1 ; not implemented 0005 359 ctrl_indacd: .ds 1 ; not implemented 0006 360 ctrl_indacz: .ds 1 ; not implemented 0007 361 ctrl_txdsrc: .ds 1 ; not implemented 0020 362 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) 363 0008 364 pttmute: .ds 1 0009 365 pttforcechg: .ds 1 000A 366 uartempty: .ds 1 367 368 .area ISEG (DATA) 0080 369 txbcnt: .ds TXCHUNKS 0090 370 rxbcnt: .ds RXCHUNKS 00B0 371 stack: .ds 0x80-RXCHUNKS-TXCHUNKS 372 373 .area DSEG (DATA) 0040 374 ctrlcode: .ds 1 0041 375 ctrlcount: .ds 2 0043 376 leddiv: .ds 1 0044 377 irqcount: .ds 1 378 ;; transmitter variables 0045 379 txstate: .ds 1 0046 380 flagcnt: .ds 2 0048 381 txwr: .ds 1 0049 382 txrd: .ds 1 004A 383 txtwr: .ds 1 004B 384 txcrc: .ds 2 004D 385 txshreg: .ds 1 004E 386 txbnum: .ds 1 004F 387 txptr: .ds 1 0050 388 txskip: .ds 1 0051 389 pttforce: .ds 1 390 ;; receiver variables 0052 391 rxstate: .ds 1 0053 392 rxwr: .ds 1 0054 393 rxrd: .ds 1 0055 394 rxtwr: .ds 1 0056 395 rxcntc: .ds 1 0057 396 rxcrc: .ds 2 0059 397 rxshreg: .ds 1 005A 398 rxbreg: .ds 1 005B 399 rxbnum: .ds 1 005C 400 rxptr: .ds 1 401 005D 402 tmprxcnt: .ds 1 403 404 ;; UART receiver 005E 405 uartbuf: .ds 16 006E 406 uartwr: .ds 1 006F 407 uartrd: .ds 1 408 409 ;; USB state 0070 410 numconfig: .ds 1 0071 411 altsetting: .ds 1 412 413 .area XSEG (DATA) 1000 414 txbuf: .ds TXCHUNKS*64 1400 415 rxbuf: .ds RXCHUNKS*64 416 417 418 .area GSINIT (CODE) 0EAB 419 startup: 0EAB 75 81 B0 420 mov sp,#stack ; -1 0EAE E4 421 clr a 0EAF F5 D0 422 mov psw,a 0EB1 F5 86 423 mov dps,a 424 ;lcall __sdcc_external_startup 425 ;mov a,dpl0 426 ;jz __sdcc_init_data 427 ;ljmp __sdcc_program_startup 0EB3 428 __sdcc_init_data: 429 430 .area GSINIT2 (CODE) 0EB3 431 __sdcc_program_startup: 432 ;; assembler code startup 0EB3 E4 433 clr a 0EB4 F5 45 434 mov txstate,a 0EB6 F5 48 435 mov txwr,a 0EB8 F5 49 436 mov txrd,a 0EBA F5 4A 437 mov txtwr,a 0EBC F5 51 438 mov pttforce,a 0EBE F5 52 439 mov rxstate,a 0EC0 F5 53 440 mov rxwr,a 0EC2 F5 54 441 mov rxrd,a 0EC4 F5 55 442 mov rxtwr,a 0EC6 F5 44 443 mov irqcount,a 0EC8 F5 6F 444 mov uartrd,a 0ECA F5 6E 445 mov uartwr,a 0ECC F5 86 446 mov dps,a 0ECE D2 0A 447 setb uartempty 448 ;; some indirect register setup 0ED0 75 8E 30 449 mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs 450 ;; Timer setup: 451 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 452 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0ED3 75 89 21 453 mov tmod,#0x21 0ED6 75 88 55 454 mov tcon,#0x55 ; INT0/INT1 edge 0ED9 75 8D 64 455 mov th1,#256-156 ; 1200 bauds 0EDC 75 87 00 456 mov pcon,#0 ; SMOD0=0 457 ;; init USB subsystem 0EDF 90 7F A1 458 mov dptr,#ISOCTL 0EE2 74 01 459 mov a,#1 ; disable ISO endpoints 0EE4 F0 460 movx @dptr,a 0EE5 90 7F AF 461 mov dptr,#USBBAV 0EE8 74 01 462 mov a,#1 ; enable autovector, disable breakpoint logic 0EEA F0 463 movx @dptr,a 0EEB E4 464 clr a 0EEC 90 7F E0 465 mov dptr,#INISOVAL 0EEF F0 466 movx @dptr,a 0EF0 90 7F E1 467 mov dptr,#OUTISOVAL 0EF3 F0 468 movx @dptr,a 0EF4 90 7F DD 469 mov dptr,#USBPAIR 0EF7 74 09 470 mov a,#0x9 ; pair EP 2&3 for input & output 0EF9 F0 471 movx @dptr,a 0EFA 90 7F DE 472 mov dptr,#IN07VAL 0EFD 74 07 473 mov a,#0x7 ; enable EP0+EP1+EP2 0EFF F0 474 movx @dptr,a 0F00 90 7F DF 475 mov dptr,#OUT07VAL 0F03 74 05 476 mov a,#0x5 ; enable EP0+EP2 0F05 F0 477 movx @dptr,a 478 ;; USB: init endpoint toggles 0F06 90 7F D7 479 mov dptr,#TOGCTL 0F09 74 12 480 mov a,#0x12 0F0B F0 481 movx @dptr,a 0F0C 74 32 482 mov a,#0x32 ; clear EP 2 in toggle 0F0E F0 483 movx @dptr,a 0F0F 74 02 484 mov a,#0x02 0F11 F0 485 movx @dptr,a 0F12 74 22 486 mov a,#0x22 ; clear EP 2 out toggle 0F14 F0 487 movx @dptr,a 488 ;; configure IO ports 0F15 90 7F 93 489 mov dptr,#PORTACFG 0F18 74 00 490 mov a,#0 0F1A F0 491 movx @dptr,a 0F1B 90 7F 96 492 mov dptr,#OUTA 0F1E 74 82 493 mov a,#0x82 ; set PROG hi 0F20 F0 494 movx @dptr,a 0F21 90 7F 9C 495 mov dptr,#OEA 0F24 74 C2 496 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0F26 F0 497 movx @dptr,a 0F27 90 7F 94 498 mov dptr,#PORTBCFG 0F2A 74 00 499 mov a,#0 0F2C F0 500 movx @dptr,a 0F2D 90 7F 9D 501 mov dptr,#OEB 0F30 74 00 502 mov a,#0 0F32 F0 503 movx @dptr,a 0F33 90 7F 95 504 mov dptr,#PORTCCFG 0F36 74 C3 505 mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins 0F38 F0 506 movx @dptr,a 0F39 90 7F 98 507 mov dptr,#OUTC 0F3C 74 28 508 mov a,#0x28 0F3E F0 509 movx @dptr,a 0F3F 90 7F 9E 510 mov dptr,#OEC 0F42 74 2A 511 mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT 0F44 F0 512 movx @dptr,a 513 ;; enable interrupts 0F45 75 A8 92 514 mov ie,#0x92 ; enable timer 0 and ser 0 int 0F48 75 E8 01 515 mov eie,#0x01 ; enable USB interrupts 0F4B 90 7F AE 516 mov dptr,#USBIEN 0F4E 74 01 517 mov a,#1 ; enable SUDAV interrupt 0F50 F0 518 movx @dptr,a 0F51 90 7F AC 519 mov dptr,#IN07IEN 0F54 74 03 520 mov a,#3 ; enable EP0+EP1 interrupt 0F56 F0 521 movx @dptr,a 0F57 90 7F AD 522 mov dptr,#OUT07IEN 0F5A 74 01 523 mov a,#1 ; enable EP0 interrupt 0F5C F0 524 movx @dptr,a 525 ;; initialize UART 0 for T7F communication 0F5D 75 98 52 526 mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable 527 ;; copy configuration to bit addressable variables 0F60 75 20 42 528 mov ctrlreg,#0x42 0F63 78 E7 529 mov r0,#parpttmute 0F65 E2 530 movx a,@r0 0F66 A2 E0 531 mov c,acc.0 0F68 92 08 532 mov pttmute,c 0F6A 92 01 533 mov ctrl_pttmute,c 534 ;; turn off transmitter 0F6C E5 20 535 mov a,ctrlreg 0F6E 90 C0 08 536 mov dptr,#FSKCTRL 0F71 F0 537 movx @dptr,a 538 ;; Initialize modem disc port / t7f port 0F72 90 C0 0C 539 mov dptr,#FSKMDISCTRIS 0F75 74 FF 540 mov a,#0xff 0F77 F0 541 movx @dptr,a 0F78 90 C0 0D 542 mov dptr,#FSKMDISCOUT 0F7B E4 543 clr a 0F7C F0 544 movx @dptr,a 0F7D 90 C0 0A 545 mov dptr,#FSKT7FOUT 0F80 74 1F 546 mov a,#0x1f 0F82 F0 547 movx @dptr,a 548 ;; Copy serial number 0F83 78 F0 549 mov r0,#parserial 0F85 90 0E 8B 550 mov dptr,#stringserial+2 0F88 E2 551 1$: movx a,@r0 0F89 60 06 552 jz 2$ 0F8B F0 553 movx @dptr,a 0F8C A3 554 inc dptr 0F8D A3 555 inc dptr 0F8E 08 556 inc r0 0F8F 80 F7 557 sjmp 1$ 0F91 E8 558 2$: mov a,r0 0F92 24 11 559 add a,#1-0xf0 ; 1-parserial 0F94 25 E0 560 add a,acc 0F96 90 0E 89 561 mov dptr,#stringserial 0F99 F0 562 movx @dptr,a 563 ;; initialize USB state 0F9A 564 usbinit: 0F9A E4 565 clr a 0F9B F5 70 566 mov numconfig,a 0F9D F5 71 567 mov altsetting,a 568 ;; give Windows a chance to finish the writecpucs control transfer 569 ;; 20ms delay loop 0F9F 90 D1 20 570 mov dptr,#(-12000)&0xffff 0FA2 A3 571 2$: inc dptr ; 3 cycles 0FA3 E5 82 572 mov a,dpl0 ; 2 cycles 0FA5 45 83 573 orl a,dph0 ; 2 cycles 0FA7 70 F9 574 jnz 2$ ; 3 cycles 0001 575 .if 1 576 ;; disconnect from USB bus 0FA9 90 7F D6 577 mov dptr,#USBCS 0FAC 74 0A 578 mov a,#10 0FAE F0 579 movx @dptr,a 580 ;; wait 0.3 sec 0FAF 7A 1E 581 mov r2,#30 582 ;; 10ms delay loop 0FB1 90 E8 90 583 0$: mov dptr,#(-6000)&0xffff 0FB4 A3 584 1$: inc dptr ; 3 cycles 0FB5 E5 82 585 mov a,dpl0 ; 2 cycles 0FB7 45 83 586 orl a,dph0 ; 2 cycles 0FB9 70 F9 587 jnz 1$ ; 3 cycles 0FBB DA F4 588 djnz r2,0$ 589 ;; reconnect to USB bus 0FBD 90 7F D6 590 mov dptr,#USBCS 591 ;mov a,#2 ; 8051 handles control 592 ;movx @dptr,a 0FC0 74 06 593 mov a,#6 ; reconnect, 8051 handles control 0FC2 F0 594 movx @dptr,a 595 .endif 596 597 ;; final 0FC3 12 0B 26 598 lcall fillusbintr 599 ;; kludge; first OUT2 packet seems to be bogus 600 ;; wait for packet with length 1 and contents 0x55 0FC6 601 waitpkt1: 0FC6 90 7F C8 602 mov dptr,#OUT2CS 0FC9 E0 603 movx a,@dptr 0FCA 20 E1 F9 604 jb acc.1,waitpkt1 0FCD 90 7F C9 605 mov dptr,#OUT2BC 0FD0 E0 606 movx a,@dptr 0FD1 B4 01 0D 607 cjne a,#1,0$ 0FD4 90 7D C0 608 mov dptr,#OUT2BUF 0FD7 E0 609 movx a,@dptr 0FD8 B4 55 06 610 cjne a,#0x55,0$ 0FDB 90 7F C9 611 mov dptr,#OUT2BC 0FDE F0 612 movx @dptr,a 0FDF 80 06 613 sjmp pkt1received 0FE1 90 7F C9 614 0$: mov dptr,#OUT2BC 0FE4 F0 615 movx @dptr,a 0FE5 80 DF 616 sjmp waitpkt1 0FE7 617 pkt1received: 618 ;; start normal operation 0FE7 02 01 79 619 ljmp mainloop 620 621 622 .area CSEG (CODE) 0002 623 ar2 = 0x02 0003 624 ar3 = 0x03 0004 625 ar4 = 0x04 0005 626 ar5 = 0x05 0006 627 ar6 = 0x06 0007 628 ar7 = 0x07 0000 629 ar0 = 0x00 0001 630 ar1 = 0x01 631 0157 632 setptt: 0157 E5 45 633 mov a,txstate 0159 45 51 634 orl a,pttforce 015B 60 0D 635 jz pttoff 636 015D 637 ptton: 015D C2 01 638 clr ctrl_pttmute 015F D2 00 639 setb ctrl_ptt 0161 D2 02 640 setb ctrl_ledptt 0163 E5 20 641 mov a,ctrlreg 0165 90 C0 08 642 mov dptr,#FSKCTRL 0168 F0 643 movx @dptr,a 0169 22 644 ret 645 016A 646 pttoff: 016A C2 00 647 clr ctrl_ptt 016C A2 08 648 mov c,pttmute 016E 92 01 649 mov ctrl_pttmute,c 0170 C2 02 650 clr ctrl_ledptt 0172 E5 20 651 mov a,ctrlreg 0174 90 C0 08 652 mov dptr,#FSKCTRL 0177 F0 653 movx @dptr,a 0178 22 654 ret 655 0179 656 mainloop: 657 658 ;; HDLC encoder 0179 659 txnopkt: 0179 E5 49 660 mov a,txrd 017B B5 48 14 661 cjne a,txwr,txstartsend 017E 12 02 C8 662 lcall periodic 0181 E4 663 clr a 0182 F5 45 664 mov txstate,a 0184 90 C0 00 665 mov dptr,#FSKSHREG 0187 F0 666 movx @dptr,a 0188 10 09 02 667 jbc pttforcechg,0$ 018B 80 EC 668 sjmp txnopkt 018D 12 01 57 669 0$: lcall setptt 0190 80 E7 670 sjmp txnopkt 0192 671 txstartsend: 0192 75 45 01 672 mov txstate,#1 0195 75 4E 08 673 mov txbnum,#8 0198 75 4B FF 674 mov txcrc,#0xff 019B 75 4C FF 675 mov txcrc+1,#0xff 676 ;; start txdelay 677 ;; read the number of flags to send from the first two bytes of the first packet 0001 678 .if 1 019E E5 49 679 mov a,txrd 01A0 03 680 rr a 01A1 03 681 rr a 01A2 F5 82 682 mov dpl0,a 01A4 54 C0 683 anl a,#0xc0 01A6 24 00 684 add a,#txbuf 01AE F5 83 688 mov dph0,a 689 .else 690 mov a,txrd 691 rr a 692 rr a 693 mov dpl0,a 694 anl a,#0xc0 695 xch a,dpl0 696 anl a,#0x3f 697 add a,#>txbuf 698 mov dph0,a 699 .endif 01B0 E0 700 movx a,@dptr 01B1 F5 46 701 mov flagcnt,a 01B3 A3 702 inc dptr 01B4 E0 703 movx a,@dptr 01B5 F5 47 704 mov flagcnt+1,a 01B7 75 50 02 705 mov txskip,#2 706 ;; sanity check (limit txdelay to about 8s) 01BA 78 E1 707 mov r0,#parbitratetx+1 01BC E2 708 movx a,@r0 01BD C3 709 clr c 01BE 95 47 710 subb a,flagcnt+1 01C0 50 03 711 jnc 2$ 01C2 E2 712 movx a,@r0 01C3 F5 47 713 mov flagcnt+1,a 01C5 714 2$: 715 ;; check if count is at least two 01C5 E5 49 716 mov a,txrd 01C7 24 80 717 add a,#txbcnt 01C9 F8 718 mov r0,a 01CA E6 719 mov a,@r0 01CB 24 FE 720 add a,#-2 01CD 40 09 721 jc 1$ 01CF 75 46 01 722 mov flagcnt,#1 01D2 75 47 00 723 mov flagcnt+1,#0 01D5 75 50 00 724 mov txskip,#0 01D8 725 1$: 726 ;; turn on PTT 01D8 12 01 5D 727 lcall ptton 01DB 728 txkeyup: 01DB E5 46 729 mov a,flagcnt 01DD 24 FF 730 add a,#-1 01DF F5 46 731 mov flagcnt,a 01E1 E5 47 732 mov a,flagcnt+1 01E3 34 FF 733 addc a,#-1 01E5 F5 47 734 mov flagcnt+1,a 01E7 50 0B 735 jnc txpreparepkt 01E9 12 02 C8 736 lcall periodic 01EC 74 7E 737 mov a,#0x7e 01EE 90 C0 00 738 mov dptr,#FSKSHREG 01F1 F0 739 movx @dptr,a 01F2 80 E7 740 sjmp txkeyup 01F4 741 txpreparepkt: 01F4 85 50 4F 742 mov txptr,txskip 01F7 75 45 02 743 mov txstate,#2 01FA 744 txpktbyteloop: 01FA E5 49 745 mov a,txrd 01FC 24 80 746 add a,#txbcnt 01FE F8 747 mov r0,a 01FF E6 748 mov a,@r0 0200 B5 4F 2B 749 cjne a,txptr,txchunkcont 750 ;; tx chunk ended 0203 75 50 00 751 mov txskip,#0 0206 20 E6 18 752 jb acc.6,txchunknoend 0209 E5 4B 753 mov a,txcrc 020B F4 754 cpl a 020C 12 02 83 755 lcall txbytenocrc 020F E5 4C 756 mov a,txcrc+1 0211 F4 757 cpl a 0212 12 02 83 758 lcall txbytenocrc 0215 12 02 61 759 lcall txflag 0218 75 4B FF 760 mov txcrc,#0xff 021B 75 4C FF 761 mov txcrc+1,#0xff 021E 75 50 02 762 mov txskip,#2 0221 763 txchunknoend: 0221 E5 49 764 mov a,txrd 0223 04 765 inc a 0224 54 0F 766 anl a,#(TXCHUNKS-1) 0226 F5 49 767 mov txrd,a 0228 B5 48 C9 768 cjne a,txwr,txpreparepkt 022B 02 02 4A 769 ljmp txtail 022E 770 txchunkcont: 0001 771 .if 1 022E E5 49 772 mov a,txrd 0230 03 773 rr a 0231 03 774 rr a 0232 F5 82 775 mov dpl0,a 0234 54 C0 776 anl a,#0xc0 0236 25 4F 777 add a,txptr 0238 24 00 778 add a,#txbuf 0240 F5 83 782 mov dph0,a 783 .else 784 mov a,txrd 785 rr a 786 rr a 787 mov dpl0,a 788 anl a,#0xc0 789 add a,txptr 790 xch a,dpl0 791 anl a,#0x3f 792 addc a,#>txbuf 793 mov dph0,a 794 .endif 0242 E0 795 movx a,@dptr 0243 12 02 9A 796 lcall txbyte 0246 05 4F 797 inc txptr 0248 80 B0 798 sjmp txpktbyteloop 799 024A 800 txtail: 024A 12 02 61 801 lcall txflag 024D 75 45 03 802 mov txstate,#3 0250 7A 14 803 mov r2,#20 0252 D3 804 0$: setb c 0253 12 02 6E 805 lcall txbit 0256 DA FA 806 djnz r2,0$ 807 ;; turn off PTT 0258 75 45 00 808 mov txstate,#0 025B 12 01 57 809 lcall setptt 025E 02 01 79 810 ljmp txnopkt 811 0261 812 txflag: 0261 7B 7E 813 mov r3,#0x7e 0263 7A 08 814 mov r2,#8 0265 EB 815 0$: mov a,r3 0266 13 816 rrc a 0267 FB 817 mov r3,a 0268 12 02 6E 818 lcall txbit 026B DA F8 819 djnz r2,0$ 026D 22 820 ret 821 026E 822 txbit: 026E E5 4D 823 mov a,txshreg 0270 13 824 rrc a 0271 F5 4D 825 mov txshreg,a 0273 D5 4E 0C 826 djnz txbnum,0$ 0276 75 4E 08 827 mov txbnum,#8 0279 12 02 C8 828 lcall periodic 027C E5 4D 829 mov a,txshreg 027E 90 C0 00 830 mov dptr,#FSKSHREG 0281 F0 831 movx @dptr,a 0282 22 832 0$: ret 833 834 0283 835 txbytenocrc: 0283 FB 836 mov r3,a 0284 7A 08 837 mov r2,#8 0286 EB 838 0$: mov a,r3 0287 13 839 rrc a 0288 FB 840 mov r3,a 0289 12 02 6E 841 lcall txbit 028C E5 4D 842 mov a,txshreg 028E F4 843 cpl a 028F 54 F8 844 anl a,#0xf8 0291 70 04 845 jnz 1$ 0293 C3 846 clr c 0294 12 02 6E 847 lcall txbit ; add stuff bit 0297 DA ED 848 1$: djnz r2,0$ 0299 22 849 ret 850 029A 851 txbyte: 029A FB 852 mov r3,a 029B 7A 08 853 mov r2,#8 029D C3 854 0$: clr c 029E E5 4C 855 mov a,txcrc+1 02A0 13 856 rrc a 02A1 F5 4C 857 mov txcrc+1,a 02A3 E5 4B 858 mov a,txcrc 02A5 13 859 rrc a 02A6 F5 4B 860 mov txcrc,a 02A8 EB 861 mov a,r3 02A9 30 E0 01 862 jnb acc.0,2$ 02AC B3 863 cpl c 02AD 50 06 864 2$: jnc 3$ 02AF 63 4C 84 865 xrl txcrc+1,#0x84 02B2 63 4B 08 866 xrl txcrc,#0x08 02B5 13 867 3$: rrc a 02B6 FB 868 mov r3,a 02B7 12 02 6E 869 lcall txbit 02BA E5 4D 870 mov a,txshreg 02BC F4 871 cpl a 02BD 54 F8 872 anl a,#0xf8 02BF 70 04 873 jnz 1$ 02C1 C3 874 clr c 02C2 12 02 6E 875 lcall txbit ; add stuff bit 02C5 DA D6 876 1$: djnz r2,0$ 02C7 22 877 ret 878 879 02C8 880 periodic: 02C8 90 C0 01 881 mov dptr,#FSKSHSTATUS 02CB E0 882 movx a,@dptr 02CC 30 E1 01 883 jnb acc.1,0$ 02CF 22 884 ret 02D0 30 E0 03 885 0$: jnb acc.0,1$ 02D3 12 03 63 886 lcall hdlcdec 02D6 887 1$: 888 02D6 889 usbiostart: 890 ;; check for USB modem->host 02D6 E5 54 891 mov a,rxrd 02D8 B5 53 47 892 cjne a,rxwr,usbcheckin 893 ;; check for USB host->modem 02DB 894 usbcheckout: 02DB 90 7F C8 895 mov dptr,#OUT2CS 02DE E0 896 movx a,@dptr 02DF 20 E1 3E 897 jb acc.1,endusb2 02E2 E5 48 898 mov a,txwr 02E4 24 80 899 add a,#txbcnt 02E6 F8 900 mov r0,a 02E7 E5 48 901 mov a,txwr 02E9 04 902 inc a 02EA 54 0F 903 anl a,#(TXCHUNKS-1) 02EC B5 49 03 904 cjne a,txrd,usbout2 02EF 02 03 60 905 ljmp endusb 02F2 906 usbout2: 02F2 FF 907 mov r7,a 02F3 90 7F C9 908 mov dptr,#OUT2BC 02F6 E0 909 movx a,@dptr 02F7 F6 910 mov @r0,a 02F8 60 20 911 jz usbout3 02FA FE 912 mov r6,a 0001 913 .if 1 02FB E5 48 914 mov a,txwr 02FD 03 915 rr a 02FE 03 916 rr a 02FF F5 84 917 mov dpl1,a 0301 54 C0 918 anl a,#0xc0 0303 24 00 919 add a,#txbuf 030B F5 85 923 mov dph1,a 924 .else 925 mov a,txwr 926 rr a 927 rr a 928 mov dpl1,a 929 anl a,#0xc0 930 xch a,dpl1 931 anl a,#0x3f 932 add a,#>txbuf 933 mov dph1,a 934 .endif 030D 90 7D C0 935 mov dptr,#OUT2BUF 0310 936 usboutloop: 0310 E0 937 movx a,@dptr 0311 A3 938 inc dptr 0312 05 86 939 inc dps 0314 F0 940 movx @dptr,a 0315 A3 941 inc dptr 0316 15 86 942 dec dps 0318 DE F6 943 djnz r6,usboutloop 031A 944 usbout3: 031A 8F 48 945 mov txwr,r7 031C 90 7F C9 946 mov dptr,#OUT2BC 031F F0 947 movx @dptr,a ; rearm OUT2 0320 948 endusb2: 0320 80 3E 949 sjmp endusb 950 0322 951 usbcheckin: 0322 90 7F B8 952 mov dptr,#IN2CS 0325 E0 953 movx a,@dptr 0326 20 E1 B2 954 jb acc.1,usbcheckout 0329 E5 54 955 mov a,rxrd 032B 24 90 956 add a,#rxbcnt 032D F8 957 mov r0,a 032E E6 958 mov a,@r0 032F 60 20 959 jz usbin1 0331 FE 960 mov r6,a 0001 961 .if 1 0332 E5 54 962 mov a,rxrd 0334 03 963 rr a 0335 03 964 rr a 0336 F5 84 965 mov dpl1,a 0338 54 C0 966 anl a,#0xc0 033A 24 00 967 add a,#rxbuf 0342 F5 85 971 mov dph1,a 972 .else 973 mov a,rxrd 974 rr a 975 rr a 976 mov dpl1,a 977 anl a,#0xc0 978 xch a,dpl1 979 anl a,#0x3f 980 addc a,#>rxbuf 981 mov dph1,a 982 .endif 0344 90 7E 00 983 mov dptr,#IN2BUF 0347 984 usbinloop: 0347 05 86 985 inc dps 0349 E0 986 movx a,@dptr 034A A3 987 inc dptr 034B 15 86 988 dec dps 034D F0 989 movx @dptr,a 034E A3 990 inc dptr 034F DE F6 991 djnz r6,usbinloop 0351 992 usbin1: 0351 E6 993 mov a,@r0 0352 90 7F B9 994 mov dptr,#IN2BC 0355 F0 995 movx @dptr,a 0356 E5 54 996 mov a,rxrd 0358 04 997 inc a 0359 54 1F 998 anl a,#(RXCHUNKS-1) 035B F5 54 999 mov rxrd,a 035D 02 02 DB 1000 ljmp usbcheckout 1001 0360 1002 endusb: 0360 02 02 C8 1003 ljmp periodic 1004 1005 1006 1007 ;; Software HDLC decoder 0363 1008 hdlcdec: 0363 90 C0 00 1009 mov dptr,#FSKSHREG 0366 E0 1010 movx a,@dptr 0367 FE 1011 mov r6,a 0368 7F 08 1012 mov r7,#8 036A 1013 hdlcdecloop: 036A EE 1014 mov a,r6 036B 13 1015 rrc a 036C FE 1016 mov r6,a 036D E5 59 1017 mov a,rxshreg 036F 33 1018 rlc a 0370 F5 59 1019 mov rxshreg,a 0372 B4 7E 03 1020 cjne a,#0x7e,$0 0375 02 03 F2 1021 ljmp hdlcdecflag 0378 F4 1022 $0: cpl a 0379 54 7F 1023 anl a,#0x7f 037B 60 0E 1024 jz hdlcdecabort 037D E5 52 1025 $1: mov a,rxstate 037F 60 07 1026 jz hdlcdecendloop 0381 E5 59 1027 mov a,rxshreg 0383 54 3F 1028 anl a,#0x3f 0385 B4 3E 08 1029 cjne a,#0x3e,hdlcdecrxbit 0388 1030 hdlcdecendloop: 0388 DF E0 1031 djnz r7,hdlcdecloop 038A 22 1032 ret 1033 038B 1034 hdlcdecabort: 038B 75 52 00 1035 mov rxstate,#0 ; abort received 038E 80 F8 1036 sjmp hdlcdecendloop 1037 0390 1038 hdlcdecrxbit: 0390 C3 1039 clr c 0391 E5 57 1040 mov a,rxcrc 0393 33 1041 rlc a 0394 F5 57 1042 mov rxcrc,a 0396 E5 58 1043 mov a,rxcrc+1 0398 33 1044 rlc a 0399 F5 58 1045 mov rxcrc+1,a 039B E5 59 1046 mov a,rxshreg 039D 30 E0 01 1047 jnb acc.0,0$ 03A0 B3 1048 cpl c 03A1 50 06 1049 0$: jnc 1$ 03A3 63 57 21 1050 xrl rxcrc,#0x21 03A6 63 58 10 1051 xrl rxcrc+1,#0x10 03A9 13 1052 1$: rrc a 03AA E5 5A 1053 mov a,rxbreg 03AC 13 1054 rrc a 03AD F5 5A 1055 mov rxbreg,a 03AF D5 5B D6 1056 djnz rxbnum,hdlcdecendloop 03B2 75 5B 08 1057 mov rxbnum,#8 0001 1058 .if 1 03B5 E5 55 1059 mov a,rxtwr 03B7 03 1060 rr a 03B8 03 1061 rr a 03B9 F5 82 1062 mov dpl0,a 03BB 54 C0 1063 anl a,#0xc0 03BD 25 5C 1064 add a,rxptr 03BF 24 00 1065 add a,#rxbuf 03C7 F5 83 1069 mov dph0,a 1070 .else 1071 mov a,rxtwr 1072 rr a 1073 rr a 1074 mov dpl0,a 1075 anl a,#0xc0 1076 add a,rxptr 1077 xch a,dpl0 1078 anl a,#0x3f 1079 addc a,#>rxbuf 1080 mov dph0,a 1081 .endif 03C9 E5 5A 1082 mov a,rxbreg 03CB F0 1083 movx @dptr,a 03CC 05 5C 1084 inc rxptr 03CE E5 5C 1085 mov a,rxptr 03D0 30 E6 B5 1086 jnb acc.6,hdlcdecendloop 03D3 E5 55 1087 mov a,rxtwr 03D5 24 90 1088 add a,#rxbcnt 03D7 F8 1089 mov r0,a 03D8 76 40 1090 mov @r0,#64 03DA E5 55 1091 mov a,rxtwr 03DC 04 1092 inc a 03DD 54 1F 1093 anl a,#RXCHUNKS-1 03DF B5 54 06 1094 cjne a,rxrd,2$ 03E2 75 52 00 1095 mov rxstate,#0 03E5 02 03 88 1096 ljmp hdlcdecendloop 03E8 F5 55 1097 2$: mov rxtwr,a 03EA 75 5C 00 1098 mov rxptr,#0 03ED 05 56 1099 inc rxcntc 03EF 02 03 88 1100 ljmp hdlcdecendloop 1101 03F2 1102 hdlcdecflag: 03F2 E5 52 1103 mov a,rxstate 03F4 60 2F 1104 jz hdlcdecpreparenewpkt 1105 ;; check for correct CRC: 1106 ;; 1D0F -0-> 3A1E -1-> 641D -1-> D81B -1-> B036 -1-> 606C -1-> D0F9 -1-> A1F2 03F6 E5 57 1107 mov a,rxcrc 03F8 64 F2 1108 xrl a,#0xf2 03FA F8 1109 mov r0,a 03FB E5 58 1110 mov a,rxcrc+1 03FD 64 A1 1111 xrl a,#0xa1 03FF 48 1112 orl a,r0 0400 70 23 1113 jnz hdlcdecpreparenewpkt 0402 E5 55 1114 mov a,rxtwr 0404 24 90 1115 add a,#rxbcnt 0406 F8 1116 mov r0,a 0407 E5 5C 1117 mov a,rxptr 0409 F6 1118 mov @r0,a 040A E5 56 1119 mov a,rxcntc 040C 70 07 1120 jnz 3$ 040E 74 FC 1121 mov a,#-4 0410 26 1122 add a,@r0 0411 50 12 1123 jnc hdlcdecpreparenewpkt ; frame too short 0413 80 04 1124 sjmp 4$ 0415 24 F8 1125 3$: add a,#-8 0417 40 0C 1126 jc hdlcdecpreparenewpkt ; frame too long 0419 E5 55 1127 4$: mov a,rxtwr 041B 04 1128 inc a 041C 54 1F 1129 anl a,#RXCHUNKS-1 041E B5 54 02 1130 cjne a,rxrd,5$ 0421 80 02 1131 sjmp hdlcdecpreparenewpkt 0423 F5 53 1132 5$: mov rxwr,a 0425 1133 hdlcdecpreparenewpkt: 0425 E4 1134 clr a 0426 F5 56 1135 mov rxcntc,a 0428 F5 5C 1136 mov rxptr,a 042A 75 52 01 1137 mov rxstate,#1 042D F4 1138 cpl a 042E F5 57 1139 mov rxcrc,a 0430 F5 58 1140 mov rxcrc+1,a 0432 75 5B 08 1141 mov rxbnum,#8 0435 85 53 55 1142 mov rxtwr,rxwr 0438 02 03 88 1143 ljmp hdlcdecendloop 1144 1145 0000 1146 .if 0 1147 ;; IO copy routine 1148 ioc1: 1149 ;; txpointers 1150 add a,#txbcnt 1151 mov r0,a 0001 1152 .if 1 1153 mov a,txrd 1154 rr a 1155 rr a 1156 mov dpl1,a 1157 anl a,#0xc0 1158 add a,#txbuf 1162 mov dph1,a 1163 .else 1164 mov a,txrd 1165 rr a 1166 rr a 1167 mov dpl1,a 1168 anl a,#0xc0 1169 xch a,dpl1 1170 anl a,#0x3f 1171 add a,#>txbuf 1172 mov dph1,a 1173 .endif 1174 ;; rxpointers 1175 mov a,rxtwr 1176 add a,#rxbcnt 1177 mov r1,a 0001 1178 .if 1 1179 mov a,rxtwr 1180 rr a 1181 rr a 1182 mov dpl0,a 1183 anl a,#0xc0 1184 add a,#rxbuf 1188 mov dph0,a 1189 .else 1190 mov a,rxtwr 1191 rr a 1192 rr a 1193 mov dpl0,a 1194 anl a,#0xc0 1195 xch a,dpl0 1196 anl a,#0x3f 1197 add a,#>rxbuf 1198 mov dph0,a 1199 .endif 1200 ;; update rxpointer 1201 mov a,rxtwr 1202 inc a 1203 anl a,#(RXCHUNKS-1) 1204 mov rxtwr,a 1205 cjne a,rxrd,ioc2 1206 iocret: 1207 ret 1208 1209 ;; entry point 1210 iocopy: 1211 mov a,txrd 1212 cjne a,txwr,ioc1 1213 ret 1214 1215 ioc2: 1216 mov a,@r0 1217 mov @r1,a 1218 jz ioc3 1219 mov r7,a 1220 ioc4: 1221 inc dps 1222 movx a,@dptr 1223 inc dptr 1224 dec dps 1225 movx @dptr,a 1226 inc dptr 1227 djnz r7,ioc4 1228 ioc3: 1229 mov a,txrd 1230 inc a 1231 anl a,#(TXCHUNKS-1) 1232 mov txrd,a 1233 mov a,@r0 1234 add a,#-0x40 1235 jc iocret 1236 mov rxwr,rxtwr 1237 ret 1238 .endif 1239 1240 ;; ------------------ interrupt handlers ------------------------ 1241 043B 1242 int0_isr: 043B C0 E0 1243 push acc 043D C0 F0 1244 push b 043F C0 82 1245 push dpl0 0441 C0 83 1246 push dph0 0443 C0 D0 1247 push psw 0445 75 D0 00 1248 mov psw,#0x00 0448 C0 86 1249 push dps 044A 75 86 00 1250 mov dps,#0 1251 ;; clear interrupt 044D C2 89 1252 clr tcon+1 1253 ;; handle interrupt 1254 ;; epilogue 044F D0 86 1255 pop dps 0451 D0 D0 1256 pop psw 0453 D0 83 1257 pop dph0 0455 D0 82 1258 pop dpl0 0457 D0 F0 1259 pop b 0459 D0 E0 1260 pop acc 045B 32 1261 reti 1262 045C 1263 timer0_isr: 045C C0 E0 1264 push acc 045E C0 F0 1265 push b 0460 C0 82 1266 push dpl0 0462 C0 83 1267 push dph0 0464 C0 D0 1268 push psw 0466 75 D0 00 1269 mov psw,#0x00 0469 C0 86 1270 push dps 046B 75 86 00 1271 mov dps,#0 1272 ;; clear interrupt 046E C2 8D 1273 clr tcon+5 1274 ;; handle interrupt 0000 1275 .if 0 1276 inc leddiv 1277 mov a,leddiv 1278 anl a,#7 1279 jnz 0$ 1280 mov dptr,#OUTC 1281 movx a,@dptr 1282 xrl a,#0x08 1283 movx @dptr,a 1284 0$: 1285 .endif 1286 ;; epilogue 0470 D0 86 1287 pop dps 0472 D0 D0 1288 pop psw 0474 D0 83 1289 pop dph0 0476 D0 82 1290 pop dpl0 0478 D0 F0 1291 pop b 047A D0 E0 1292 pop acc 047C 32 1293 reti 1294 047D 1295 int1_isr: 047D C0 E0 1296 push acc 047F C0 F0 1297 push b 0481 C0 82 1298 push dpl0 0483 C0 83 1299 push dph0 0485 C0 D0 1300 push psw 0487 75 D0 00 1301 mov psw,#0x00 048A C0 86 1302 push dps 048C 75 86 00 1303 mov dps,#0 1304 ;; clear interrupt 048F C2 8B 1305 clr tcon+3 1306 ;; handle interrupt 1307 ;; epilogue 0491 D0 86 1308 pop dps 0493 D0 D0 1309 pop psw 0495 D0 83 1310 pop dph0 0497 D0 82 1311 pop dpl0 0499 D0 F0 1312 pop b 049B D0 E0 1313 pop acc 049D 32 1314 reti 1315 049E 1316 timer1_isr: 049E C0 E0 1317 push acc 04A0 C0 F0 1318 push b 04A2 C0 82 1319 push dpl0 04A4 C0 83 1320 push dph0 04A6 C0 D0 1321 push psw 04A8 75 D0 00 1322 mov psw,#0x00 04AB C0 86 1323 push dps 04AD 75 86 00 1324 mov dps,#0 1325 ;; clear interrupt 04B0 C2 8F 1326 clr tcon+7 1327 ;; handle interrupt 1328 ;; epilogue 04B2 D0 86 1329 pop dps 04B4 D0 D0 1330 pop psw 04B6 D0 83 1331 pop dph0 04B8 D0 82 1332 pop dpl0 04BA D0 F0 1333 pop b 04BC D0 E0 1334 pop acc 04BE 32 1335 reti 1336 04BF 1337 ser0_isr: 04BF C0 E0 1338 push acc 04C1 C0 F0 1339 push b 04C3 C0 82 1340 push dpl0 04C5 C0 83 1341 push dph0 04C7 C0 D0 1342 push psw 04C9 75 D0 00 1343 mov psw,#0x00 04CC C0 86 1344 push dps 04CE 75 86 00 1345 mov dps,#0 04D1 C0 00 1346 push ar0 1347 ;; clear interrupt 04D3 10 98 16 1348 jbc scon0+0,1$ ; RI 04D6 10 99 0F 1349 0$: jbc scon0+1,2$ ; TI 1350 ;; handle interrupt 1351 ;; epilogue 04D9 D0 00 1352 3$: pop ar0 04DB D0 86 1353 pop dps 04DD D0 D0 1354 pop psw 04DF D0 83 1355 pop dph0 04E1 D0 82 1356 pop dpl0 04E3 D0 F0 1357 pop b 04E5 D0 E0 1358 pop acc 04E7 32 1359 reti 1360 04E8 D2 0A 1361 2$: setb uartempty 04EA 80 EA 1362 sjmp 0$ 1363 04EC E5 6E 1364 1$: mov a,uartwr 04EE 24 5E 1365 add a,#uartbuf 04F0 F8 1366 mov r0,a 04F1 E5 99 1367 mov a,sbuf0 04F3 F6 1368 mov @r0,a 04F4 E5 6E 1369 mov a,uartwr 04F6 04 1370 inc a 04F7 54 0F 1371 anl a,#0xf 04F9 F5 6E 1372 mov uartwr,a 04FB 80 DC 1373 sjmp 3$ 1374 04FD 1375 timer2_isr: 04FD C0 E0 1376 push acc 04FF C0 F0 1377 push b 0501 C0 82 1378 push dpl0 0503 C0 83 1379 push dph0 0505 C0 D0 1380 push psw 0507 75 D0 00 1381 mov psw,#0x00 050A C0 86 1382 push dps 050C 75 86 00 1383 mov dps,#0 1384 ;; clear interrupt 050F C2 CF 1385 clr t2con+7 1386 ;; handle interrupt 1387 ;; epilogue 0511 D0 86 1388 pop dps 0513 D0 D0 1389 pop psw 0515 D0 83 1390 pop dph0 0517 D0 82 1391 pop dpl0 0519 D0 F0 1392 pop b 051B D0 E0 1393 pop acc 051D 32 1394 reti 1395 051E 1396 resume_isr: 051E C0 E0 1397 push acc 0520 C0 F0 1398 push b 0522 C0 82 1399 push dpl0 0524 C0 83 1400 push dph0 0526 C0 D0 1401 push psw 0528 75 D0 00 1402 mov psw,#0x00 052B C0 86 1403 push dps 052D 75 86 00 1404 mov dps,#0 1405 ;; clear interrupt 0530 C2 DC 1406 clr eicon+4 1407 ;; handle interrupt 1408 ;; epilogue 0532 D0 86 1409 pop dps 0534 D0 D0 1410 pop psw 0536 D0 83 1411 pop dph0 0538 D0 82 1412 pop dpl0 053A D0 F0 1413 pop b 053C D0 E0 1414 pop acc 053E 32 1415 reti 1416 053F 1417 ser1_isr: 053F C0 E0 1418 push acc 0541 C0 F0 1419 push b 0543 C0 82 1420 push dpl0 0545 C0 83 1421 push dph0 0547 C0 D0 1422 push psw 0549 75 D0 00 1423 mov psw,#0x00 054C C0 86 1424 push dps 054E 75 86 00 1425 mov dps,#0 1426 ;; clear interrupt 0551 C2 C0 1427 clr scon1+0 0553 C2 C1 1428 clr scon1+1 1429 ;; handle interrupt 1430 ;; epilogue 0555 D0 86 1431 pop dps 0557 D0 D0 1432 pop psw 0559 D0 83 1433 pop dph0 055B D0 82 1434 pop dpl0 055D D0 F0 1435 pop b 055F D0 E0 1436 pop acc 0561 32 1437 reti 1438 0562 1439 i2c_isr: 0562 C0 E0 1440 push acc 0564 C0 F0 1441 push b 0566 C0 82 1442 push dpl0 0568 C0 83 1443 push dph0 056A C0 D0 1444 push psw 056C 75 D0 00 1445 mov psw,#0x00 056F C0 86 1446 push dps 0571 75 86 00 1447 mov dps,#0 1448 ;; clear interrupt 0574 E5 91 1449 mov a,exif 0576 C2 E5 1450 clr acc.5 0578 F5 91 1451 mov exif,a 1452 ;; handle interrupt 1453 ;; epilogue 057A D0 86 1454 pop dps 057C D0 D0 1455 pop psw 057E D0 83 1456 pop dph0 0580 D0 82 1457 pop dpl0 0582 D0 F0 1458 pop b 0584 D0 E0 1459 pop acc 0586 32 1460 reti 1461 0587 1462 int4_isr: 0587 C0 E0 1463 push acc 0589 C0 F0 1464 push b 058B C0 82 1465 push dpl0 058D C0 83 1466 push dph0 058F C0 D0 1467 push psw 0591 75 D0 00 1468 mov psw,#0x00 0594 C0 86 1469 push dps 0596 75 86 00 1470 mov dps,#0 1471 ;; clear interrupt 0599 E5 91 1472 mov a,exif 059B C2 E6 1473 clr acc.6 059D F5 91 1474 mov exif,a 1475 ;; handle interrupt 1476 ;; epilogue 059F D0 86 1477 pop dps 05A1 D0 D0 1478 pop psw 05A3 D0 83 1479 pop dph0 05A5 D0 82 1480 pop dpl0 05A7 D0 F0 1481 pop b 05A9 D0 E0 1482 pop acc 05AB 32 1483 reti 1484 05AC 1485 int5_isr: 05AC C0 E0 1486 push acc 05AE C0 F0 1487 push b 05B0 C0 82 1488 push dpl0 05B2 C0 83 1489 push dph0 05B4 C0 D0 1490 push psw 05B6 75 D0 00 1491 mov psw,#0x00 05B9 C0 86 1492 push dps 05BB 75 86 00 1493 mov dps,#0 1494 ;; clear interrupt 05BE E5 91 1495 mov a,exif 05C0 C2 E7 1496 clr acc.7 05C2 F5 91 1497 mov exif,a 1498 ;; handle interrupt 1499 ;; epilogue 05C4 D0 86 1500 pop dps 05C6 D0 D0 1501 pop psw 05C8 D0 83 1502 pop dph0 05CA D0 82 1503 pop dpl0 05CC D0 F0 1504 pop b 05CE D0 E0 1505 pop acc 05D0 32 1506 reti 1507 05D1 1508 int6_isr: 05D1 C0 E0 1509 push acc 05D3 C0 F0 1510 push b 05D5 C0 82 1511 push dpl0 05D7 C0 83 1512 push dph0 05D9 C0 D0 1513 push psw 05DB 75 D0 00 1514 mov psw,#0x00 05DE C0 86 1515 push dps 05E0 75 86 00 1516 mov dps,#0 1517 ;; clear interrupt 05E3 C2 DB 1518 clr eicon+3 1519 ;; handle interrupt 1520 ;; epilogue 05E5 D0 86 1521 pop dps 05E7 D0 D0 1522 pop psw 05E9 D0 83 1523 pop dph0 05EB D0 82 1524 pop dpl0 05ED D0 F0 1525 pop b 05EF D0 E0 1526 pop acc 05F1 32 1527 reti 1528 05F2 1529 usb_sudav_isr: 05F2 C0 E0 1530 push acc 05F4 C0 F0 1531 push b 05F6 C0 82 1532 push dpl0 05F8 C0 83 1533 push dph0 05FA C0 84 1534 push dpl1 05FC C0 85 1535 push dph1 05FE C0 D0 1536 push psw 0600 75 D0 00 1537 mov psw,#0x00 0603 C0 86 1538 push dps 0605 75 86 00 1539 mov dps,#0 0608 C0 00 1540 push ar0 060A C0 07 1541 push ar7 1542 ;; clear interrupt 060C E5 91 1543 mov a,exif 060E C2 E4 1544 clr acc.4 0610 F5 91 1545 mov exif,a 0612 90 7F AB 1546 mov dptr,#USBIRQ 0615 74 01 1547 mov a,#0x01 0617 F0 1548 movx @dptr,a 1549 ;; handle interrupt 0618 75 40 00 1550 mov ctrlcode,#0 ; reset control out code 061B 90 7F E9 1551 mov dptr,#(SETUPDAT+1) 061E E0 1552 movx a,@dptr ; bRequest field 1553 ;; standard commands 1554 ;; USB_REQ_GET_DESCRIPTOR 061F B4 06 59 1555 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 0622 90 7F E8 1556 mov dptr,#SETUPDAT ; bRequestType == 0x80 0625 E0 1557 movx a,@dptr 0626 B4 80 4F 1558 cjne a,#USB_DIR_IN,setupstallstd 0629 90 7F EB 1559 mov dptr,#SETUPDAT+3 062C E0 1560 movx a,@dptr 062D B4 01 0C 1561 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 0630 90 7F D4 1562 mov dptr,#SUDPTRH 0633 74 0D 1563 mov a,#>devicedescr 0635 F0 1564 movx @dptr,a 0636 A3 1565 inc dptr 0637 74 FA 1566 mov a,#config0descr 064A F0 1576 movx @dptr,a 064B A3 1577 inc dptr 064C 74 0C 1578 mov a,#stringdescr 0666 F5 83 1593 mov dph0,a 0668 E0 1594 movx a,@dptr 0669 F5 F0 1595 mov b,a 066B A3 1596 inc dptr 066C E0 1597 movx a,@dptr 066D 90 7F D4 1598 mov dptr,#SUDPTRH 0670 F0 1599 movx @dptr,a 0671 A3 1600 inc dptr 0672 E5 F0 1601 mov a,b 0674 F0 1602 movx @dptr,a 1603 ; sjmp setupackstd 0675 1604 setupackstd: 0675 02 09 E9 1605 ljmp setupack 0678 1606 setupstallstd: 0678 02 09 E5 1607 ljmp setupstall 067B 1608 cmdnotgetdesc: 1609 ;; USB_REQ_SET_CONFIGURATION 067B B4 09 41 1610 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 067E 90 7F E8 1611 mov dptr,#SETUPDAT 0681 E0 1612 movx a,@dptr 0682 70 F4 1613 jnz setupstallstd 0684 90 7F EA 1614 mov dptr,#SETUPDAT+2 0687 E0 1615 movx a,@dptr 0688 24 FE 1616 add a,#-2 068A 40 EC 1617 jc setupstallstd 068C E0 1618 movx a,@dptr 068D F5 70 1619 mov numconfig,a 068F 1620 cmdresettoggleshalt: 068F 90 7F D7 1621 mov dptr,#TOGCTL 0692 78 07 1622 mov r0,#7 0694 E8 1623 0$: mov a,r0 0695 44 10 1624 orl a,#0x10 0697 F0 1625 movx @dptr,a 0698 44 30 1626 orl a,#0x30 069A F0 1627 movx @dptr,a 069B E8 1628 mov a,r0 069C F0 1629 movx @dptr,a 069D 44 20 1630 orl a,#0x20 069F F0 1631 movx @dptr,a 06A0 D8 F2 1632 djnz r0,0$ 06A2 E4 1633 clr a 06A3 F0 1634 movx @dptr,a 06A4 74 02 1635 mov a,#2 06A6 90 7F B6 1636 mov dptr,#IN1CS 06A9 78 07 1637 mov r0,#7 06AB F0 1638 1$: movx @dptr,a 06AC A3 1639 inc dptr 06AD A3 1640 inc dptr 06AE D8 FB 1641 djnz r0,1$ 06B0 90 7F C6 1642 mov dptr,#OUT1CS 06B3 78 07 1643 mov r0,#7 06B5 F0 1644 2$: movx @dptr,a 06B6 A3 1645 inc dptr 06B7 A3 1646 inc dptr 06B8 D8 FB 1647 djnz r0,2$ 06BA 12 0B 26 1648 lcall fillusbintr 06BD 80 B6 1649 sjmp setupackstd 06BF 1650 cmdnotsetconf: 1651 ;; USB_REQ_SET_INTERFACE 06BF B4 0B 1A 1652 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 06C2 90 7F E8 1653 mov dptr,#SETUPDAT 06C5 E0 1654 movx a,@dptr 06C6 B4 01 AF 1655 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 06C9 E5 70 1656 mov a,numconfig 06CB B4 01 AA 1657 cjne a,#1,setupstallstd 06CE 90 7F EC 1658 mov dptr,#SETUPDAT+4 06D1 E0 1659 movx a,@dptr 06D2 70 A4 1660 jnz setupstallstd 06D4 90 7F EA 1661 mov dptr,#SETUPDAT+2 06D7 E0 1662 movx a,@dptr 06D8 F5 71 1663 mov altsetting,a 06DA 80 B3 1664 sjmp cmdresettoggleshalt 06DC 1665 cmdnotsetint: 1666 ;; USB_REQ_GET_INTERFACE 06DC B4 0A 20 1667 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 06DF 90 7F E8 1668 mov dptr,#SETUPDAT 06E2 E0 1669 movx a,@dptr 06E3 B4 81 92 1670 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 06E6 E5 70 1671 mov a,numconfig 06E8 B4 01 8D 1672 cjne a,#1,setupstallstd 06EB 90 7F EC 1673 mov dptr,#SETUPDAT+4 06EE E0 1674 movx a,@dptr 06EF 70 87 1675 jnz setupstallstd 06F1 E5 71 1676 mov a,altsetting 06F3 1677 cmdrespondonebyte: 06F3 90 7F 00 1678 mov dptr,#IN0BUF 06F6 F0 1679 movx @dptr,a 06F7 90 7F B5 1680 mov dptr,#IN0BC 06FA 74 01 1681 mov a,#1 06FC F0 1682 movx @dptr,a 06FD 80 4E 1683 sjmp setupackstd2 06FF 1684 cmdnotgetint: 1685 ;; USB_REQ_GET_CONFIGURATION 06FF B4 08 0B 1686 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 0702 90 7F E8 1687 mov dptr,#SETUPDAT 0705 E0 1688 movx a,@dptr 0706 B4 80 47 1689 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 0709 E5 70 1690 mov a,numconfig 070B 80 E6 1691 sjmp cmdrespondonebyte 070D 1692 cmdnotgetconf: 1693 ;; USB_REQ_GET_STATUS (0) 070D 70 44 1694 jnz cmdnotgetstat 070F 90 7F E8 1695 mov dptr,#SETUPDAT 0712 E0 1696 movx a,@dptr 0713 B4 80 11 1697 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 0716 74 01 1698 mov a,#1 0718 1699 cmdrespondstat: 0718 90 7F 00 1700 mov dptr,#IN0BUF 071B F0 1701 movx @dptr,a 071C A3 1702 inc dptr 071D E4 1703 clr a 071E F0 1704 movx @dptr,a 071F 90 7F B5 1705 mov dptr,#IN0BC 0722 74 02 1706 mov a,#2 0724 F0 1707 movx @dptr,a 0725 80 26 1708 sjmp setupackstd2 0727 1709 cmdnotgetstatdev: 0727 B4 81 03 1710 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 072A E4 1711 clr a 072B 80 EB 1712 sjmp cmdrespondstat 072D 1713 cmdnotgetstatintf: 072D B4 82 20 1714 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 0730 90 7F EC 1715 mov dptr,#SETUPDAT+4 0733 E0 1716 movx a,@dptr 0734 90 7F C4 1717 mov dptr,#OUT1CS-2 0737 30 E7 03 1718 jnb acc.7,0$ 073A 90 7F B4 1719 mov dptr,#IN1CS-2 073D 54 0F 1720 0$: anl a,#15 073F 60 0F 1721 jz setupstallstd2 0741 20 E3 0C 1722 jb acc.3,setupstallstd2 0744 25 E0 1723 add a,acc 0746 25 82 1724 add a,dpl0 0748 F5 82 1725 mov dpl0,a 074A E0 1726 movx a,@dptr 074B 80 CB 1727 sjmp cmdrespondstat 074D 1728 setupackstd2: 074D 02 09 E9 1729 ljmp setupack 0750 1730 setupstallstd2: 0750 02 09 E5 1731 ljmp setupstall 0753 1732 cmdnotgetstat: 1733 ;; USB_REQ_SET_FEATURE 0753 B4 03 05 1734 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 0756 75 F0 01 1735 mov b,#1 0759 80 06 1736 sjmp handleftr 075B 1737 cmdnotsetftr: 1738 ;; USB_REQ_CLEAR_FEATURE 075B B4 01 44 1739 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 075E 75 F0 00 1740 mov b,#0 0761 1741 handleftr: 0761 90 7F E8 1742 mov dptr,#SETUPDAT 0764 E0 1743 movx a,@dptr 0765 B4 02 E8 1744 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 0768 A3 1745 inc dptr 0769 A3 1746 inc dptr 076A E0 1747 movx a,@dptr 076B 70 E3 1748 jnz setupstallstd2 ; not ENDPOINT_HALT feature 076D A3 1749 inc dptr 076E E0 1750 movx a,@dptr 076F 70 DF 1751 jnz setupstallstd2 0771 A3 1752 inc dptr 0772 E0 1753 movx a,@dptr 0773 90 7F C4 1754 mov dptr,#OUT1CS-2 0776 30 E7 05 1755 jnb acc.7,0$ 0779 90 7F B4 1756 mov dptr,#IN1CS-2 077C 44 10 1757 orl a,#0x10 077E 20 E3 CF 1758 0$: jb acc.3,setupstallstd2 1759 ;; clear data toggle 0781 54 1F 1760 anl a,#0x1f 0783 05 86 1761 inc dps 0785 90 7F D7 1762 mov dptr,#TOGCTL 0788 F0 1763 movx @dptr,a 0789 44 20 1764 orl a,#0x20 078B F0 1765 movx @dptr,a 078C 54 0F 1766 anl a,#15 078E F0 1767 movx @dptr,a 078F 15 86 1768 dec dps 1769 ;; clear/set ep halt feature 0791 25 E0 1770 add a,acc 0793 25 82 1771 add a,dpl0 0795 F5 82 1772 mov dpl0,a 0797 E5 F0 1773 mov a,b 0799 F0 1774 movx @dptr,a 079A 80 B1 1775 sjmp setupackstd2 1776 079C 1777 cmdnotc0_1: 079C 02 08 5F 1778 ljmp cmdnotc0 079F 1779 setupstallc0_1: 079F 02 09 E5 1780 ljmp setupstall 1781 07A2 1782 cmdnotclrftr: 1783 ;; vendor specific commands 1784 ;; 0xc0 07A2 B4 C0 F7 1785 cjne a,#0xc0,cmdnotc0_1 07A5 90 7F E8 1786 mov dptr,#SETUPDAT ; bRequestType == 0xc0 07A8 E0 1787 movx a,@dptr 07A9 B4 C0 F3 1788 cjne a,#0xc0,setupstallc0_1 1789 ;; fill status buffer 07AC E5 45 1790 mov a,txstate 07AE F5 F0 1791 mov b,a 07B0 D2 F2 1792 setb b.2 07B2 45 51 1793 orl a,pttforce 07B4 B4 00 02 1794 cjne a,#0,0$ 07B7 C2 F2 1795 clr b.2 07B9 90 C0 09 1796 0$: mov dptr,#FSKSTAT 07BC E0 1797 movx a,@dptr 07BD A2 E0 1798 mov c,acc.0 07BF 92 F3 1799 mov b.3,c 07C1 A2 0A 1800 mov c,uartempty 07C3 92 F5 1801 mov b.5,c 07C5 E4 1802 clr a 07C6 90 7F 04 1803 mov dptr,#(IN0BUF+4) 07C9 F0 1804 movx @dptr,a 1805 ;; bytewide elements 07CA 90 7F 00 1806 mov dptr,#(IN0BUF) 07CD E5 F0 1807 mov a,b 07CF F0 1808 movx @dptr,a 07D0 E5 48 1809 mov a,txwr 07D2 F4 1810 cpl a 07D3 25 49 1811 add a,txrd 07D5 54 0F 1812 anl a,#(TXCHUNKS-1) 07D7 90 7F 01 1813 mov dptr,#(IN0BUF+1) 07DA F0 1814 movx @dptr,a 07DB E5 54 1815 mov a,rxrd 07DD F4 1816 cpl a 07DE 25 53 1817 add a,rxwr 07E0 04 1818 inc a 07E1 54 1F 1819 anl a,#(RXCHUNKS-1) 07E3 90 7F 02 1820 mov dptr,#(IN0BUF+2) 07E6 F0 1821 movx @dptr,a 07E7 90 C0 04 1822 mov dptr,#FSKRSSI 07EA E0 1823 movx a,@dptr 07EB 90 7F 03 1824 mov dptr,#(IN0BUF+3) 07EE F0 1825 movx @dptr,a 1826 ;; counter 07EF 05 44 1827 inc irqcount 07F1 E5 44 1828 mov a,irqcount 07F3 90 7F 05 1829 mov dptr,#(IN0BUF+5) 07F6 F0 1830 movx @dptr,a 1831 ;; additional fields (HDLC state mach) 07F7 E5 45 1832 mov a,txstate 07F9 A3 1833 inc dptr 07FA F0 1834 movx @dptr,a 07FB E5 49 1835 mov a,txrd 07FD A3 1836 inc dptr 07FE F0 1837 movx @dptr,a 07FF E5 48 1838 mov a,txwr 0801 A3 1839 inc dptr 0802 F0 1840 movx @dptr,a 0803 E5 4A 1841 mov a,txtwr 0805 A3 1842 inc dptr 0806 F0 1843 movx @dptr,a 0807 74 00 1844 mov a,#0 0809 A3 1845 inc dptr 080A F0 1846 movx @dptr,a 080B E5 46 1847 mov a,flagcnt 080D A3 1848 inc dptr 080E F0 1849 movx @dptr,a 080F E5 47 1850 mov a,flagcnt+1 0811 A3 1851 inc dptr 0812 F0 1852 movx @dptr,a 0813 E5 52 1853 mov a,rxstate 0815 A3 1854 inc dptr 0816 F0 1855 movx @dptr,a 0817 E5 54 1856 mov a,rxrd 0819 A3 1857 inc dptr 081A F0 1858 movx @dptr,a 081B E5 53 1859 mov a,rxwr 081D A3 1860 inc dptr 081E F0 1861 movx @dptr,a 081F E5 55 1862 mov a,rxtwr 0821 A3 1863 inc dptr 0822 F0 1864 movx @dptr,a 0823 E5 56 1865 mov a,rxcntc 0825 A3 1866 inc dptr 0826 F0 1867 movx @dptr,a 1868 ;; FPGA registers 0827 E5 5D 1869 mov a,tmprxcnt 0829 90 7F 12 1870 mov dptr,#(IN0BUF+18) 082C F0 1871 movx @dptr,a 082D 90 C0 01 1872 mov dptr,#FSKSHSTATUS 0830 E0 1873 movx a,@dptr 0831 90 7F 13 1874 mov dptr,#(IN0BUF+19) 0834 F0 1875 movx @dptr,a 0835 90 C0 08 1876 mov dptr,#FSKCTRL 0838 E0 1877 movx a,@dptr 0839 90 7F 14 1878 mov dptr,#(IN0BUF+20) 083C F0 1879 movx @dptr,a 083D 90 C0 09 1880 mov dptr,#FSKSTAT 0840 E0 1881 movx a,@dptr 0841 90 7F 15 1882 mov dptr,#(IN0BUF+21) 0844 F0 1883 movx @dptr,a 1884 ;; Anchor Registers 0845 90 7F C8 1885 mov dptr,#OUT2CS 0848 E0 1886 movx a,@dptr 0849 90 7F 16 1887 mov dptr,#(IN0BUF+22) 084C F0 1888 movx @dptr,a 1889 ;; set length 084D 90 7F EE 1890 mov dptr,#SETUPDAT+6 ; wLength 0850 E0 1891 movx a,@dptr 0851 24 E9 1892 add a,#-(6+12+4+1) 0853 50 01 1893 jnc 4$ 0855 E4 1894 clr a 0856 24 17 1895 4$: add a,#(6+12+4+1) 0858 90 7F B5 1896 mov dptr,#IN0BC 085B F0 1897 movx @dptr,a 085C 02 09 E9 1898 ljmp setupack 085F 1899 cmdnotc0: 1900 ;; 0xc8 085F B4 C8 19 1901 cjne a,#0xc8,cmdnotc8 0862 90 7F E8 1902 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0865 E0 1903 movx a,@dptr 0866 B4 C0 0F 1904 cjne a,#0xc0,setupstallc8 0869 74 03 1905 mov a,#3 086B 90 7F 00 1906 mov dptr,#IN0BUF 086E F0 1907 movx @dptr,a 086F 90 7F B5 1908 mov dptr,#IN0BC 0872 74 01 1909 mov a,#1 0874 F0 1910 movx @dptr,a 0875 02 09 E9 1911 ljmp setupack 0878 1912 setupstallc8: 0878 02 09 E5 1913 ljmp setupstall 087B 1914 cmdnotc8: 1915 ;; 0xc9 087B B4 C9 21 1916 cjne a,#0xc9,cmdnotc9 087E 90 7F E8 1917 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0881 E0 1918 movx a,@dptr 0882 B4 C0 17 1919 cjne a,#0xc0,setupstallc9 0885 90 7F 00 1920 mov dptr,#IN0BUF 0888 78 F0 1921 mov r0,#parserial 088A E2 1922 0$: movx a,@r0 088B 60 05 1923 jz 1$ 088D F0 1924 movx @dptr,a 088E 08 1925 inc r0 088F A3 1926 inc dptr 0890 80 F8 1927 sjmp 0$ 0892 E8 1928 1$: mov a,r0 0893 24 10 1929 add a,#-0xf0 ; -parserial 0895 90 7F B5 1930 mov dptr,#IN0BC 0898 F0 1931 movx @dptr,a 0899 02 09 E9 1932 ljmp setupack 089C 1933 setupstallc9: 089C 02 09 E5 1934 ljmp setupstall 089F 1935 cmdnotc9: 1936 ;; 0xd0 089F B4 D0 4D 1937 cjne a,#0xd0,cmdnotd0 08A2 90 7F E8 1938 mov dptr,#SETUPDAT ; bRequestType == 0xc0 08A5 E0 1939 movx a,@dptr 08A6 B4 C0 43 1940 cjne a,#0xc0,setupstalld0 08A9 90 7F EC 1941 mov dptr,#SETUPDAT+4 ; wIndex 08AC E0 1942 movx a,@dptr 08AD B4 01 0A 1943 cjne a,#1,0$ 08B0 90 7F EA 1944 mov dptr,#SETUPDAT+2 ; wValue 08B3 E0 1945 movx a,@dptr 08B4 54 01 1946 anl a,#1 08B6 F5 51 1947 mov pttforce,a 08B8 D2 09 1948 setb pttforcechg 08BA 1949 0$: ;; PTT status 08BA 90 7F 00 1950 mov dptr,#IN0BUF 08BD E5 45 1951 mov a,txstate 08BF 45 51 1952 orl a,pttforce 08C1 60 02 1953 jz 1$ 08C3 74 01 1954 mov a,#1 08C5 F0 1955 1$: movx @dptr,a 1956 ;; DCD status 08C6 90 C0 09 1957 mov dptr,#FSKSTAT 08C9 E0 1958 movx a,@dptr 08CA 54 01 1959 anl a,#1 08CC 64 01 1960 xrl a,#1 08CE 90 7F 01 1961 mov dptr,#IN0BUF+1 08D1 F0 1962 movx @dptr,a 1963 ;; RSSI 08D2 90 C0 04 1964 mov dptr,#FSKRSSI 08D5 E0 1965 movx a,@dptr 08D6 90 7F 02 1966 mov dptr,#IN0BUF+2 08D9 F0 1967 movx @dptr,a 1968 ;; length 08DA 90 7F EE 1969 mov dptr,#SETUPDAT+6 ; wLength 08DD E0 1970 movx a,@dptr 08DE 24 FD 1971 add a,#-3 08E0 50 01 1972 jnc 2$ 08E2 E4 1973 clr a 08E3 24 03 1974 2$: add a,#3 08E5 90 7F B5 1975 mov dptr,#IN0BC 08E8 F0 1976 movx @dptr,a 08E9 02 09 E9 1977 ljmp setupack 08EC 1978 setupstalld0: 08EC 02 09 E5 1979 ljmp setupstall 08EF 1980 cmdnotd0: 1981 ;; 0xd1 08EF B4 D1 29 1982 cjne a,#0xd1,cmdnotd1 08F2 90 7F E8 1983 mov dptr,#SETUPDAT ; bRequestType == 0xc0 08F5 E0 1984 movx a,@dptr 08F6 B4 C0 1F 1985 cjne a,#0xc0,setupstalld1 08F9 90 7F 00 1986 mov dptr,#IN0BUF 08FC 78 E0 1987 mov r0,#parbitratetx 08FE 7F 06 1988 mov r7,#6 0900 E2 1989 1$: movx a,@r0 0901 F0 1990 movx @dptr,a 0902 A3 1991 inc dptr 0903 08 1992 inc r0 0904 DF FA 1993 djnz r7,1$ 1994 ;; length 0906 90 7F EE 1995 mov dptr,#SETUPDAT+6 ; wLength 0909 E0 1996 movx a,@dptr 090A 24 FA 1997 add a,#-6 090C 50 01 1998 jnc 2$ 090E E4 1999 clr a 090F 24 06 2000 2$: add a,#6 0911 90 7F B5 2001 mov dptr,#IN0BC 0914 F0 2002 movx @dptr,a 0915 02 09 E9 2003 ljmp setupack 0918 2004 setupstalld1: 0918 02 09 E5 2005 ljmp setupstall 091B 2006 cmdnotd1: 2007 ;; 0xd2 091B B4 D2 20 2008 cjne a,#0xd2,cmdnotd2 091E 90 7F E8 2009 mov dptr,#SETUPDAT ; bRequestType == 0x40 0921 E0 2010 movx a,@dptr 0922 B4 40 16 2011 cjne a,#0x40,setupstalld2 0925 90 7F EA 2012 mov dptr,#SETUPDAT+2 ; wValue 0928 E0 2013 movx a,@dptr 0929 F5 F0 2014 mov b,a 092B 90 7F 98 2015 mov dptr,#OUTC 092E E0 2016 movx a,@dptr 092F A2 F0 2017 mov c,b.0 0931 92 E3 2018 mov acc.3,c 0933 A2 F1 2019 mov c,b.1 0935 92 E5 2020 mov acc.5,c 0937 F0 2021 movx @dptr,a 0938 02 09 E9 2022 ljmp setupack 093B 2023 setupstalld2: 093B 02 09 E5 2024 ljmp setupstall 093E 2025 cmdnotd2: 2026 ;; 0xd3 093E B4 D3 16 2027 cjne a,#0xd3,cmdnotd3 0941 90 7F E8 2028 mov dptr,#SETUPDAT ; bRequestType == 0x40 0944 E0 2029 movx a,@dptr 0945 B4 40 07 2030 cjne a,#0x40,setupstalld3 0948 90 7F EA 2031 mov dptr,#SETUPDAT+2 ; wValue 094B E0 2032 movx a,@dptr 094C 10 0A 03 2033 jbc uartempty,cmdd2cont 094F 2034 setupstalld3: 094F 02 09 E5 2035 ljmp setupstall 0952 2036 cmdd2cont: 0952 F5 99 2037 mov sbuf0,a 0954 02 09 E9 2038 ljmp setupack 0957 2039 cmdnotd3: 2040 ;; 0xd4 0957 B4 D4 4D 2041 cjne a,#0xd4,cmdnotd4 095A 90 7F E8 2042 mov dptr,#SETUPDAT ; bRequestType == 0xc0 095D E0 2043 movx a,@dptr 095E B4 C0 43 2044 cjne a,#0xc0,setupstalld4 0961 90 7F EC 2045 mov dptr,#SETUPDAT+4 ; wIndex 0964 E0 2046 movx a,@dptr 0965 90 7F EA 2047 mov dptr,#SETUPDAT+2 ; wValue 0968 B4 01 07 2048 cjne a,#1,0$ 096B E0 2049 movx a,@dptr 096C 90 C0 0D 2050 mov dptr,#FSKMDISCOUT 096F F0 2051 movx @dptr,a 0970 80 08 2052 sjmp 1$ 0972 B4 02 05 2053 0$: cjne a,#2,1$ 0975 E0 2054 movx a,@dptr 0976 90 C0 0C 2055 mov dptr,#FSKMDISCTRIS 0979 F0 2056 movx @dptr,a 097A 90 C0 0E 2057 1$: mov dptr,#FSKMDISCIN 097D E0 2058 movx a,@dptr 097E 90 7F 00 2059 mov dptr,#IN0BUF+0 0981 F0 2060 movx @dptr,a 0982 90 C0 0D 2061 mov dptr,#FSKMDISCOUT 0985 E0 2062 movx a,@dptr 0986 90 7F 01 2063 mov dptr,#IN0BUF+1 0989 F0 2064 movx @dptr,a 098A 90 C0 0C 2065 mov dptr,#FSKMDISCTRIS 098D E0 2066 movx a,@dptr 098E 90 7F 02 2067 mov dptr,#IN0BUF+2 0991 F0 2068 movx @dptr,a 2069 ;; length 0992 90 7F EE 2070 mov dptr,#SETUPDAT+6 ; wLength 0995 E0 2071 movx a,@dptr 0996 24 FD 2072 add a,#-3 0998 50 01 2073 jnc 2$ 099A E4 2074 clr a 099B 24 03 2075 2$: add a,#3 099D 90 7F B5 2076 mov dptr,#IN0BC 09A0 F0 2077 movx @dptr,a 09A1 02 09 E9 2078 ljmp setupack 09A4 2079 setupstalld4: 09A4 02 09 E5 2080 ljmp setupstall 09A7 2081 cmdnotd4: 2082 ;; 0xd5 09A7 B4 D5 3B 2083 cjne a,#0xd5,cmdnotd5 09AA 90 7F E8 2084 mov dptr,#SETUPDAT ; bRequestType == 0xc0 09AD E0 2085 movx a,@dptr 09AE B4 C0 31 2086 cjne a,#0xc0,setupstalld5 09B1 90 7F EC 2087 mov dptr,#SETUPDAT+4 ; wIndex 09B4 E0 2088 movx a,@dptr 09B5 B4 01 08 2089 cjne a,#1,0$ 09B8 90 7F EA 2090 mov dptr,#SETUPDAT+2 ; wValue 09BB E0 2091 movx a,@dptr 09BC 90 C0 0A 2092 mov dptr,#FSKT7FOUT 09BF F0 2093 movx @dptr,a 09C0 90 C0 0B 2094 0$: mov dptr,#FSKT7FIN 09C3 E0 2095 movx a,@dptr 09C4 90 7F 00 2096 mov dptr,#IN0BUF+0 09C7 F0 2097 movx @dptr,a 09C8 90 C0 0A 2098 mov dptr,#FSKT7FOUT 09CB E0 2099 movx a,@dptr 09CC 90 7F 01 2100 mov dptr,#IN0BUF+1 09CF F0 2101 movx @dptr,a 2102 ;; length 09D0 90 7F EE 2103 mov dptr,#SETUPDAT+6 ; wLength 09D3 E0 2104 movx a,@dptr 09D4 24 FE 2105 add a,#-2 09D6 50 01 2106 jnc 2$ 09D8 E4 2107 clr a 09D9 24 02 2108 2$: add a,#2 09DB 90 7F B5 2109 mov dptr,#IN0BC 09DE F0 2110 movx @dptr,a 09DF 02 09 E9 2111 ljmp setupack 09E2 2112 setupstalld5: 09E2 02 09 E5 2113 ljmp setupstall 09E5 2114 cmdnotd5: 2115 ;; unknown commands fall through to setupstall 2116 09E5 2117 setupstall: 09E5 74 03 2118 mov a,#3 09E7 80 02 2119 sjmp endsetup 09E9 2120 setupack: 09E9 74 02 2121 mov a,#2 09EB 2122 endsetup: 09EB 90 7F B4 2123 mov dptr,#EP0CS 09EE F0 2124 movx @dptr,a 09EF 2125 endusbisr: 2126 ;; epilogue 09EF D0 07 2127 pop ar7 09F1 D0 00 2128 pop ar0 09F3 D0 86 2129 pop dps 09F5 D0 D0 2130 pop psw 09F7 D0 85 2131 pop dph1 09F9 D0 84 2132 pop dpl1 09FB D0 83 2133 pop dph0 09FD D0 82 2134 pop dpl0 09FF D0 F0 2135 pop b 0A01 D0 E0 2136 pop acc 0A03 32 2137 reti 2138 0A04 2139 usb_sof_isr: 0A04 C0 E0 2140 push acc 0A06 C0 F0 2141 push b 0A08 C0 82 2142 push dpl0 0A0A C0 83 2143 push dph0 0A0C C0 D0 2144 push psw 0A0E 75 D0 00 2145 mov psw,#0x00 0A11 C0 86 2146 push dps 0A13 75 86 00 2147 mov dps,#0 2148 ;; clear interrupt 0A16 E5 91 2149 mov a,exif 0A18 C2 E4 2150 clr acc.4 0A1A F5 91 2151 mov exif,a 0A1C 90 7F AB 2152 mov dptr,#USBIRQ 0A1F 74 02 2153 mov a,#0x02 0A21 F0 2154 movx @dptr,a 2155 ;; handle interrupt 2156 ;; epilogue 0A22 D0 86 2157 pop dps 0A24 D0 D0 2158 pop psw 0A26 D0 83 2159 pop dph0 0A28 D0 82 2160 pop dpl0 0A2A D0 F0 2161 pop b 0A2C D0 E0 2162 pop acc 0A2E 32 2163 reti 2164 2165 0A2F 2166 usb_sutok_isr: 0A2F C0 E0 2167 push acc 0A31 C0 F0 2168 push b 0A33 C0 82 2169 push dpl0 0A35 C0 83 2170 push dph0 0A37 C0 D0 2171 push psw 0A39 75 D0 00 2172 mov psw,#0x00 0A3C C0 86 2173 push dps 0A3E 75 86 00 2174 mov dps,#0 2175 ;; clear interrupt 0A41 E5 91 2176 mov a,exif 0A43 C2 E4 2177 clr acc.4 0A45 F5 91 2178 mov exif,a 0A47 90 7F AB 2179 mov dptr,#USBIRQ 0A4A 74 04 2180 mov a,#0x04 0A4C F0 2181 movx @dptr,a 2182 ;; handle interrupt 2183 ;; epilogue 0A4D D0 86 2184 pop dps 0A4F D0 D0 2185 pop psw 0A51 D0 83 2186 pop dph0 0A53 D0 82 2187 pop dpl0 0A55 D0 F0 2188 pop b 0A57 D0 E0 2189 pop acc 0A59 32 2190 reti 2191 0A5A 2192 usb_suspend_isr: 0A5A C0 E0 2193 push acc 0A5C C0 F0 2194 push b 0A5E C0 82 2195 push dpl0 0A60 C0 83 2196 push dph0 0A62 C0 D0 2197 push psw 0A64 75 D0 00 2198 mov psw,#0x00 0A67 C0 86 2199 push dps 0A69 75 86 00 2200 mov dps,#0 2201 ;; clear interrupt 0A6C E5 91 2202 mov a,exif 0A6E C2 E4 2203 clr acc.4 0A70 F5 91 2204 mov exif,a 0A72 90 7F AB 2205 mov dptr,#USBIRQ 0A75 74 08 2206 mov a,#0x08 0A77 F0 2207 movx @dptr,a 2208 ;; handle interrupt 2209 ;; epilogue 0A78 D0 86 2210 pop dps 0A7A D0 D0 2211 pop psw 0A7C D0 83 2212 pop dph0 0A7E D0 82 2213 pop dpl0 0A80 D0 F0 2214 pop b 0A82 D0 E0 2215 pop acc 0A84 32 2216 reti 2217 0A85 2218 usb_usbreset_isr: 0A85 C0 E0 2219 push acc 0A87 C0 F0 2220 push b 0A89 C0 82 2221 push dpl0 0A8B C0 83 2222 push dph0 0A8D C0 D0 2223 push psw 0A8F 75 D0 00 2224 mov psw,#0x00 0A92 C0 86 2225 push dps 0A94 75 86 00 2226 mov dps,#0 2227 ;; clear interrupt 0A97 E5 91 2228 mov a,exif 0A99 C2 E4 2229 clr acc.4 0A9B F5 91 2230 mov exif,a 0A9D 90 7F AB 2231 mov dptr,#USBIRQ 0AA0 74 10 2232 mov a,#0x10 0AA2 F0 2233 movx @dptr,a 2234 ;; handle interrupt 2235 ;; epilogue 0AA3 D0 86 2236 pop dps 0AA5 D0 D0 2237 pop psw 0AA7 D0 83 2238 pop dph0 0AA9 D0 82 2239 pop dpl0 0AAB D0 F0 2240 pop b 0AAD D0 E0 2241 pop acc 0AAF 32 2242 reti 2243 0AB0 2244 usb_ep0in_isr: 0AB0 C0 E0 2245 push acc 0AB2 C0 F0 2246 push b 0AB4 C0 82 2247 push dpl0 0AB6 C0 83 2248 push dph0 0AB8 C0 84 2249 push dpl1 0ABA C0 85 2250 push dph1 0ABC C0 D0 2251 push psw 0ABE 75 D0 00 2252 mov psw,#0x00 0AC1 C0 86 2253 push dps 0AC3 75 86 00 2254 mov dps,#0 0AC6 C0 00 2255 push ar0 0AC8 C0 07 2256 push ar7 2257 ;; clear interrupt 0ACA E5 91 2258 mov a,exif 0ACC C2 E4 2259 clr acc.4 0ACE F5 91 2260 mov exif,a 0AD0 90 7F A9 2261 mov dptr,#IN07IRQ 0AD3 74 01 2262 mov a,#0x01 0AD5 F0 2263 movx @dptr,a 2264 ;; handle interrupt 2265 2266 ;ep0install: 2267 ; mov a,#3 2268 ; sjmp ep0incs 2269 ;ep0inack: 2270 ; mov a,#2 2271 ;ep0incs: 2272 ; mov dptr,#EP0CS 2273 ; movx @dptr,a 2274 ;ep0inendisr: 2275 ;; epilogue 0AD6 D0 07 2276 pop ar7 0AD8 D0 00 2277 pop ar0 0ADA D0 86 2278 pop dps 0ADC D0 D0 2279 pop psw 0ADE D0 85 2280 pop dph1 0AE0 D0 84 2281 pop dpl1 0AE2 D0 83 2282 pop dph0 0AE4 D0 82 2283 pop dpl0 0AE6 D0 F0 2284 pop b 0AE8 D0 E0 2285 pop acc 0AEA 32 2286 reti 2287 0AEB 2288 usb_ep0out_isr: 0AEB C0 E0 2289 push acc 0AED C0 F0 2290 push b 0AEF C0 82 2291 push dpl0 0AF1 C0 83 2292 push dph0 0AF3 C0 84 2293 push dpl1 0AF5 C0 85 2294 push dph1 0AF7 C0 D0 2295 push psw 0AF9 75 D0 00 2296 mov psw,#0x00 0AFC C0 86 2297 push dps 0AFE 75 86 00 2298 mov dps,#0 0B01 C0 00 2299 push ar0 0B03 C0 06 2300 push ar6 2301 ;; clear interrupt 0B05 E5 91 2302 mov a,exif 0B07 C2 E4 2303 clr acc.4 0B09 F5 91 2304 mov exif,a 0B0B 90 7F AA 2305 mov dptr,#OUT07IRQ 0B0E 74 01 2306 mov a,#0x01 0B10 F0 2307 movx @dptr,a 2308 ;; handle interrupt 2309 2310 ;ep0outstall: 2311 ; mov ctrlcode,#0 2312 ; mov a,#3 2313 ; sjmp ep0outcs 2314 ;ep0outack: 2315 ; mov txwr,txtwr 2316 ; mov ctrlcode,#0 2317 ; mov a,#2 2318 ;ep0outcs: 2319 ; mov dptr,#EP0CS 2320 ; movx @dptr,a 2321 ;ep0outendisr: 2322 ;; epilogue 0B11 D0 06 2323 pop ar6 0B13 D0 00 2324 pop ar0 0B15 D0 86 2325 pop dps 0B17 D0 D0 2326 pop psw 0B19 D0 85 2327 pop dph1 0B1B D0 84 2328 pop dpl1 0B1D D0 83 2329 pop dph0 0B1F D0 82 2330 pop dpl0 0B21 D0 F0 2331 pop b 0B23 D0 E0 2332 pop acc 0B25 32 2333 reti 2334 0B26 2335 fillusbintr:: 0B26 E5 45 2336 mov a,txstate 0B28 F5 F0 2337 mov b,a 0B2A D2 F2 2338 setb b.2 0B2C 45 51 2339 orl a,pttforce 0B2E B4 00 02 2340 cjne a,#0,0$ 0B31 C2 F2 2341 clr b.2 0B33 90 C0 09 2342 0$: mov dptr,#FSKSTAT 0B36 E0 2343 movx a,@dptr 0B37 A2 E0 2344 mov c,acc.0 0B39 92 F3 2345 mov b.3,c 0B3B A2 0A 2346 mov c,uartempty 0B3D 92 F5 2347 mov b.5,c 0B3F D3 2348 setb c 0B40 E5 54 2349 mov a,rxrd 0B42 B5 53 06 2350 cjne a,rxwr,1$ 0B45 90 7F B8 2351 mov dptr,#(IN2CS) 0B48 E0 2352 movx a,@dptr 0B49 A2 E1 2353 mov c,acc.1 0B4B 92 F4 2354 1$: mov b.4,c 2355 ;; bytewide elements 0B4D 90 7E 80 2356 mov dptr,#(IN1BUF) 0B50 E5 F0 2357 mov a,b 0B52 F0 2358 movx @dptr,a 0B53 E5 48 2359 mov a,txwr 0B55 F4 2360 cpl a 0B56 25 49 2361 add a,txrd 0B58 54 0F 2362 anl a,#(TXCHUNKS-1) 0B5A 90 7E 81 2363 mov dptr,#(IN1BUF+1) 0B5D F0 2364 movx @dptr,a 0B5E E5 54 2365 mov a,rxrd 0B60 F4 2366 cpl a 0B61 25 53 2367 add a,rxwr 0B63 04 2368 inc a 0B64 54 1F 2369 anl a,#(RXCHUNKS-1) 0B66 90 7E 82 2370 mov dptr,#(IN1BUF+2) 0B69 F0 2371 movx @dptr,a 0B6A 90 C0 04 2372 mov dptr,#FSKRSSI 0B6D E0 2373 movx a,@dptr 0B6E 90 7E 83 2374 mov dptr,#(IN1BUF+3) 0B71 F0 2375 movx @dptr,a 2376 ; counter 0B72 05 44 2377 inc irqcount 0B74 E5 44 2378 mov a,irqcount 0B76 90 7E 84 2379 mov dptr,#(IN1BUF+4) 0B79 F0 2380 movx @dptr,a 2381 ; UART buffer 0B7A 75 F0 05 2382 mov b,#5 0B7D 90 7E 85 2383 mov dptr,#(IN1BUF+5) 0B80 E5 6F 2384 2$: mov a,uartrd 0B82 B5 6E 07 2385 cjne a,uartwr,3$ 2386 ; set length 0B85 90 7F B7 2387 mov dptr,#IN1BC 0B88 E5 F0 2388 mov a,b 0B8A F0 2389 movx @dptr,a 0B8B 22 2390 ret 2391 0B8C 24 5E 2392 3$: add a,#uartbuf 0B8E F8 2393 mov r0,a 0B8F E6 2394 mov a,@r0 0B90 F0 2395 movx @dptr,a 0B91 A3 2396 inc dptr 0B92 05 F0 2397 inc b 0B94 E5 6F 2398 mov a,uartrd 0B96 04 2399 inc a 0B97 54 0F 2400 anl a,#0xf 0B99 F5 6F 2401 mov uartrd,a 0B9B 80 E3 2402 sjmp 2$ 2403 2404 0B9D 2405 usb_ep1in_isr: 0B9D C0 E0 2406 push acc 0B9F C0 F0 2407 push b 0BA1 C0 82 2408 push dpl0 0BA3 C0 83 2409 push dph0 0BA5 C0 D0 2410 push psw 0BA7 75 D0 00 2411 mov psw,#0x00 0BAA C0 86 2412 push dps 0BAC 75 86 00 2413 mov dps,#0 2414 ;; clear interrupt 0BAF E5 91 2415 mov a,exif 0BB1 C2 E4 2416 clr acc.4 0BB3 F5 91 2417 mov exif,a 0BB5 90 7F A9 2418 mov dptr,#IN07IRQ 0BB8 74 02 2419 mov a,#0x02 0BBA F0 2420 movx @dptr,a 2421 ;; handle interrupt 0BBB 12 0B 26 2422 lcall fillusbintr 2423 ;; epilogue 0BBE D0 86 2424 pop dps 0BC0 D0 D0 2425 pop psw 0BC2 D0 83 2426 pop dph0 0BC4 D0 82 2427 pop dpl0 0BC6 D0 F0 2428 pop b 0BC8 D0 E0 2429 pop acc 0BCA 32 2430 reti 2431 0BCB 2432 usb_ep1out_isr: 0BCB C0 E0 2433 push acc 0BCD C0 F0 2434 push b 0BCF C0 82 2435 push dpl0 0BD1 C0 83 2436 push dph0 0BD3 C0 D0 2437 push psw 0BD5 75 D0 00 2438 mov psw,#0x00 0BD8 C0 86 2439 push dps 0BDA 75 86 00 2440 mov dps,#0 2441 ;; clear interrupt 0BDD E5 91 2442 mov a,exif 0BDF C2 E4 2443 clr acc.4 0BE1 F5 91 2444 mov exif,a 0BE3 90 7F AA 2445 mov dptr,#OUT07IRQ 0BE6 74 02 2446 mov a,#0x02 0BE8 F0 2447 movx @dptr,a 2448 ;; handle interrupt 2449 ;; epilogue 0BE9 D0 86 2450 pop dps 0BEB D0 D0 2451 pop psw 0BED D0 83 2452 pop dph0 0BEF D0 82 2453 pop dpl0 0BF1 D0 F0 2454 pop b 0BF3 D0 E0 2455 pop acc 0BF5 32 2456 reti 2457 0BF6 2458 usb_ep2in_isr: 0BF6 C0 E0 2459 push acc 0BF8 C0 F0 2460 push b 0BFA C0 82 2461 push dpl0 0BFC C0 83 2462 push dph0 0BFE C0 D0 2463 push psw 0C00 75 D0 00 2464 mov psw,#0x00 0C03 C0 86 2465 push dps 0C05 75 86 00 2466 mov dps,#0 2467 ;; clear interrupt 0C08 E5 91 2468 mov a,exif 0C0A C2 E4 2469 clr acc.4 0C0C F5 91 2470 mov exif,a 0C0E 90 7F A9 2471 mov dptr,#IN07IRQ 0C11 74 04 2472 mov a,#0x04 0C13 F0 2473 movx @dptr,a 2474 ;; handle interrupt 2475 ;; epilogue 0C14 D0 86 2476 pop dps 0C16 D0 D0 2477 pop psw 0C18 D0 83 2478 pop dph0 0C1A D0 82 2479 pop dpl0 0C1C D0 F0 2480 pop b 0C1E D0 E0 2481 pop acc 0C20 32 2482 reti 2483 0C21 2484 usb_ep2out_isr: 0C21 C0 E0 2485 push acc 0C23 C0 F0 2486 push b 0C25 C0 82 2487 push dpl0 0C27 C0 83 2488 push dph0 0C29 C0 D0 2489 push psw 0C2B 75 D0 00 2490 mov psw,#0x00 0C2E C0 86 2491 push dps 0C30 75 86 00 2492 mov dps,#0 2493 ;; clear interrupt 0C33 E5 91 2494 mov a,exif 0C35 C2 E4 2495 clr acc.4 0C37 F5 91 2496 mov exif,a 0C39 90 7F AA 2497 mov dptr,#OUT07IRQ 0C3C 74 04 2498 mov a,#0x04 0C3E F0 2499 movx @dptr,a 2500 ;; handle interrupt 2501 ;; epilogue 0C3F D0 86 2502 pop dps 0C41 D0 D0 2503 pop psw 0C43 D0 83 2504 pop dph0 0C45 D0 82 2505 pop dpl0 0C47 D0 F0 2506 pop b 0C49 D0 E0 2507 pop acc 0C4B 32 2508 reti 2509 0C4C 2510 usb_ep3in_isr: 0C4C C0 E0 2511 push acc 0C4E C0 F0 2512 push b 0C50 C0 82 2513 push dpl0 0C52 C0 83 2514 push dph0 0C54 C0 D0 2515 push psw 0C56 75 D0 00 2516 mov psw,#0x00 0C59 C0 86 2517 push dps 0C5B 75 86 00 2518 mov dps,#0 2519 ;; clear interrupt 0C5E E5 91 2520 mov a,exif 0C60 C2 E4 2521 clr acc.4 0C62 F5 91 2522 mov exif,a 0C64 90 7F A9 2523 mov dptr,#IN07IRQ 0C67 74 08 2524 mov a,#0x08 0C69 F0 2525 movx @dptr,a 2526 ;; handle interrupt 2527 ;; epilogue 0C6A D0 86 2528 pop dps 0C6C D0 D0 2529 pop psw 0C6E D0 83 2530 pop dph0 0C70 D0 82 2531 pop dpl0 0C72 D0 F0 2532 pop b 0C74 D0 E0 2533 pop acc 0C76 32 2534 reti 2535 0C77 2536 usb_ep3out_isr: 0C77 C0 E0 2537 push acc 0C79 C0 F0 2538 push b 0C7B C0 82 2539 push dpl0 0C7D C0 83 2540 push dph0 0C7F C0 D0 2541 push psw 0C81 75 D0 00 2542 mov psw,#0x00 0C84 C0 86 2543 push dps 0C86 75 86 00 2544 mov dps,#0 2545 ;; clear interrupt 0C89 E5 91 2546 mov a,exif 0C8B C2 E4 2547 clr acc.4 0C8D F5 91 2548 mov exif,a 0C8F 90 7F AA 2549 mov dptr,#OUT07IRQ 0C92 74 08 2550 mov a,#0x08 0C94 F0 2551 movx @dptr,a 2552 ;; handle interrupt 2553 ;; epilogue 0C95 D0 86 2554 pop dps 0C97 D0 D0 2555 pop psw 0C99 D0 83 2556 pop dph0 0C9B D0 82 2557 pop dpl0 0C9D D0 F0 2558 pop b 0C9F D0 E0 2559 pop acc 0CA1 32 2560 reti 2561 0CA2 2562 usb_ep4in_isr: 0CA2 C0 E0 2563 push acc 0CA4 C0 F0 2564 push b 0CA6 C0 82 2565 push dpl0 0CA8 C0 83 2566 push dph0 0CAA C0 D0 2567 push psw 0CAC 75 D0 00 2568 mov psw,#0x00 0CAF C0 86 2569 push dps 0CB1 75 86 00 2570 mov dps,#0 2571 ;; clear interrupt 0CB4 E5 91 2572 mov a,exif 0CB6 C2 E4 2573 clr acc.4 0CB8 F5 91 2574 mov exif,a 0CBA 90 7F A9 2575 mov dptr,#IN07IRQ 0CBD 74 10 2576 mov a,#0x10 0CBF F0 2577 movx @dptr,a 2578 ;; handle interrupt 2579 ;; epilogue 0CC0 D0 86 2580 pop dps 0CC2 D0 D0 2581 pop psw 0CC4 D0 83 2582 pop dph0 0CC6 D0 82 2583 pop dpl0 0CC8 D0 F0 2584 pop b 0CCA D0 E0 2585 pop acc 0CCC 32 2586 reti 2587 0CCD 2588 usb_ep4out_isr: 0CCD C0 E0 2589 push acc 0CCF C0 F0 2590 push b 0CD1 C0 82 2591 push dpl0 0CD3 C0 83 2592 push dph0 0CD5 C0 D0 2593 push psw 0CD7 75 D0 00 2594 mov psw,#0x00 0CDA C0 86 2595 push dps 0CDC 75 86 00 2596 mov dps,#0 2597 ;; clear interrupt 0CDF E5 91 2598 mov a,exif 0CE1 C2 E4 2599 clr acc.4 0CE3 F5 91 2600 mov exif,a 0CE5 90 7F AA 2601 mov dptr,#OUT07IRQ 0CE8 74 10 2602 mov a,#0x10 0CEA F0 2603 movx @dptr,a 2604 ;; handle interrupt 2605 ;; epilogue 0CEB D0 86 2606 pop dps 0CED D0 D0 2607 pop psw 0CEF D0 83 2608 pop dph0 0CF1 D0 82 2609 pop dpl0 0CF3 D0 F0 2610 pop b 0CF5 D0 E0 2611 pop acc 0CF7 32 2612 reti 2613 0CF8 2614 usb_ep5in_isr: 0CF8 C0 E0 2615 push acc 0CFA C0 F0 2616 push b 0CFC C0 82 2617 push dpl0 0CFE C0 83 2618 push dph0 0D00 C0 D0 2619 push psw 0D02 75 D0 00 2620 mov psw,#0x00 0D05 C0 86 2621 push dps 0D07 75 86 00 2622 mov dps,#0 2623 ;; clear interrupt 0D0A E5 91 2624 mov a,exif 0D0C C2 E4 2625 clr acc.4 0D0E F5 91 2626 mov exif,a 0D10 90 7F A9 2627 mov dptr,#IN07IRQ 0D13 74 20 2628 mov a,#0x20 0D15 F0 2629 movx @dptr,a 2630 ;; handle interrupt 2631 ;; epilogue 0D16 D0 86 2632 pop dps 0D18 D0 D0 2633 pop psw 0D1A D0 83 2634 pop dph0 0D1C D0 82 2635 pop dpl0 0D1E D0 F0 2636 pop b 0D20 D0 E0 2637 pop acc 0D22 32 2638 reti 2639 0D23 2640 usb_ep5out_isr: 0D23 C0 E0 2641 push acc 0D25 C0 F0 2642 push b 0D27 C0 82 2643 push dpl0 0D29 C0 83 2644 push dph0 0D2B C0 D0 2645 push psw 0D2D 75 D0 00 2646 mov psw,#0x00 0D30 C0 86 2647 push dps 0D32 75 86 00 2648 mov dps,#0 2649 ;; clear interrupt 0D35 E5 91 2650 mov a,exif 0D37 C2 E4 2651 clr acc.4 0D39 F5 91 2652 mov exif,a 0D3B 90 7F AA 2653 mov dptr,#OUT07IRQ 0D3E 74 20 2654 mov a,#0x20 0D40 F0 2655 movx @dptr,a 2656 ;; handle interrupt 2657 ;; epilogue 0D41 D0 86 2658 pop dps 0D43 D0 D0 2659 pop psw 0D45 D0 83 2660 pop dph0 0D47 D0 82 2661 pop dpl0 0D49 D0 F0 2662 pop b 0D4B D0 E0 2663 pop acc 0D4D 32 2664 reti 2665 0D4E 2666 usb_ep6in_isr: 0D4E C0 E0 2667 push acc 0D50 C0 F0 2668 push b 0D52 C0 82 2669 push dpl0 0D54 C0 83 2670 push dph0 0D56 C0 D0 2671 push psw 0D58 75 D0 00 2672 mov psw,#0x00 0D5B C0 86 2673 push dps 0D5D 75 86 00 2674 mov dps,#0 2675 ;; clear interrupt 0D60 E5 91 2676 mov a,exif 0D62 C2 E4 2677 clr acc.4 0D64 F5 91 2678 mov exif,a 0D66 90 7F A9 2679 mov dptr,#IN07IRQ 0D69 74 40 2680 mov a,#0x40 0D6B F0 2681 movx @dptr,a 2682 ;; handle interrupt 2683 ;; epilogue 0D6C D0 86 2684 pop dps 0D6E D0 D0 2685 pop psw 0D70 D0 83 2686 pop dph0 0D72 D0 82 2687 pop dpl0 0D74 D0 F0 2688 pop b 0D76 D0 E0 2689 pop acc 0D78 32 2690 reti 2691 0D79 2692 usb_ep6out_isr: 0D79 C0 E0 2693 push acc 0D7B C0 F0 2694 push b 0D7D C0 82 2695 push dpl0 0D7F C0 83 2696 push dph0 0D81 C0 D0 2697 push psw 0D83 75 D0 00 2698 mov psw,#0x00 0D86 C0 86 2699 push dps 0D88 75 86 00 2700 mov dps,#0 2701 ;; clear interrupt 0D8B E5 91 2702 mov a,exif 0D8D C2 E4 2703 clr acc.4 0D8F F5 91 2704 mov exif,a 0D91 90 7F AA 2705 mov dptr,#OUT07IRQ 0D94 74 40 2706 mov a,#0x40 0D96 F0 2707 movx @dptr,a 2708 ;; handle interrupt 2709 ;; epilogue 0D97 D0 86 2710 pop dps 0D99 D0 D0 2711 pop psw 0D9B D0 83 2712 pop dph0 0D9D D0 82 2713 pop dpl0 0D9F D0 F0 2714 pop b 0DA1 D0 E0 2715 pop acc 0DA3 32 2716 reti 2717 0DA4 2718 usb_ep7in_isr: 0DA4 C0 E0 2719 push acc 0DA6 C0 F0 2720 push b 0DA8 C0 82 2721 push dpl0 0DAA C0 83 2722 push dph0 0DAC C0 D0 2723 push psw 0DAE 75 D0 00 2724 mov psw,#0x00 0DB1 C0 86 2725 push dps 0DB3 75 86 00 2726 mov dps,#0 2727 ;; clear interrupt 0DB6 E5 91 2728 mov a,exif 0DB8 C2 E4 2729 clr acc.4 0DBA F5 91 2730 mov exif,a 0DBC 90 7F A9 2731 mov dptr,#IN07IRQ 0DBF 74 80 2732 mov a,#0x80 0DC1 F0 2733 movx @dptr,a 2734 ;; handle interrupt 2735 ;; epilogue 0DC2 D0 86 2736 pop dps 0DC4 D0 D0 2737 pop psw 0DC6 D0 83 2738 pop dph0 0DC8 D0 82 2739 pop dpl0 0DCA D0 F0 2740 pop b 0DCC D0 E0 2741 pop acc 0DCE 32 2742 reti 2743 0DCF 2744 usb_ep7out_isr: 0DCF C0 E0 2745 push acc 0DD1 C0 F0 2746 push b 0DD3 C0 82 2747 push dpl0 0DD5 C0 83 2748 push dph0 0DD7 C0 D0 2749 push psw 0DD9 75 D0 00 2750 mov psw,#0x00 0DDC C0 86 2751 push dps 0DDE 75 86 00 2752 mov dps,#0 2753 ;; clear interrupt 0DE1 E5 91 2754 mov a,exif 0DE3 C2 E4 2755 clr acc.4 0DE5 F5 91 2756 mov exif,a 0DE7 90 7F AA 2757 mov dptr,#OUT07IRQ 0DEA 74 80 2758 mov a,#0x80 0DEC F0 2759 movx @dptr,a 2760 ;; handle interrupt 2761 ;; epilogue 0DED D0 86 2762 pop dps 0DEF D0 D0 2763 pop psw 0DF1 D0 83 2764 pop dph0 0DF3 D0 82 2765 pop dpl0 0DF5 D0 F0 2766 pop b 0DF7 D0 E0 2767 pop acc 0DF9 32 2768 reti 2769 2770 ;; ----------------------------------------------------- 2771 ;; USB descriptors 2772 ;; ----------------------------------------------------- 2773 2774 ;; Device and/or Interface Class codes 0000 2775 USB_CLASS_PER_INTERFACE = 0 0001 2776 USB_CLASS_AUDIO = 1 0002 2777 USB_CLASS_COMM = 2 0003 2778 USB_CLASS_HID = 3 0007 2779 USB_CLASS_PRINTER = 7 0008 2780 USB_CLASS_MASS_STORAGE = 8 0009 2781 USB_CLASS_HUB = 9 00FF 2782 USB_CLASS_VENDOR_SPEC = 0xff 2783 2784 ;; Descriptor types 0001 2785 USB_DT_DEVICE = 0x01 0002 2786 USB_DT_CONFIG = 0x02 0003 2787 USB_DT_STRING = 0x03 0004 2788 USB_DT_INTERFACE = 0x04 0005 2789 USB_DT_ENDPOINT = 0x05 2790 2791 ;; Standard requests 0000 2792 USB_REQ_GET_STATUS = 0x00 0001 2793 USB_REQ_CLEAR_FEATURE = 0x01 0003 2794 USB_REQ_SET_FEATURE = 0x03 0005 2795 USB_REQ_SET_ADDRESS = 0x05 0006 2796 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2797 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2798 USB_REQ_GET_CONFIGURATION = 0x08 0009 2799 USB_REQ_SET_CONFIGURATION = 0x09 000A 2800 USB_REQ_GET_INTERFACE = 0x0A 000B 2801 USB_REQ_SET_INTERFACE = 0x0B 000C 2802 USB_REQ_SYNCH_FRAME = 0x0C 2803 2804 ;; USB Request Type and Endpoint Directions 0000 2805 USB_DIR_OUT = 0 0080 2806 USB_DIR_IN = 0x80 2807 0000 2808 USB_TYPE_STANDARD = (0x00 << 5) 0020 2809 USB_TYPE_CLASS = (0x01 << 5) 0040 2810 USB_TYPE_VENDOR = (0x02 << 5) 0060 2811 USB_TYPE_RESERVED = (0x03 << 5) 2812 0000 2813 USB_RECIP_DEVICE = 0x00 0001 2814 USB_RECIP_INTERFACE = 0x01 0002 2815 USB_RECIP_ENDPOINT = 0x02 0003 2816 USB_RECIP_OTHER = 0x03 2817 2818 ;; Request target types. 0000 2819 USB_RT_DEVICE = 0x00 0001 2820 USB_RT_INTERFACE = 0x01 0002 2821 USB_RT_ENDPOINT = 0x02 2822 BAC0 2823 VENDID = 0xbac0 6136 2824 PRODID = 0x6136 2825 0DFA 2826 devicedescr: 0DFA 12 2827 .db 18 ; bLength 0DFB 01 2828 .db USB_DT_DEVICE ; bDescriptorType 0DFC 00 01 2829 .db 0x00, 0x01 ; bcdUSB 0DFE FF 2830 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 0DFF 00 2831 .db 0 ; bDeviceSubClass 0E00 FF 2832 .db 0xff ; bDeviceProtocol 0E01 40 2833 .db 0x40 ; bMaxPacketSize0 0E02 C0 BA 2834 .db VENDID ; idVendor 0E04 36 61 2835 .db PRODID ; idProduct 0E06 01 00 2836 .db 0x01,0x00 ; bcdDevice 0E08 01 2837 .db 1 ; iManufacturer 0E09 02 2838 .db 2 ; iProduct 0E0A 03 2839 .db 3 ; iSerialNumber 0E0B 01 2840 .db 1 ; bNumConfigurations 2841 0E0C 2842 config0descr: 0E0C 09 2843 .db 9 ; bLength 0E0D 02 2844 .db USB_DT_CONFIG ; bDescriptorType 0E0E 45 00 2845 .db config0sz ; wTotalLength 0E10 01 2846 .db 1 ; bNumInterfaces 0E11 01 2847 .db 1 ; bConfigurationValue 0E12 00 2848 .db 0 ; iConfiguration 0E13 40 2849 .db 0b01000000 ; bmAttributs (self powered) 0E14 00 2850 .db 0 ; MaxPower (mA/2) (self powered so 0) 2851 ;; interface descriptor I0:A0 0E15 09 2852 .db 9 ; bLength 0E16 04 2853 .db USB_DT_INTERFACE ; bDescriptorType 0E17 00 2854 .db 0 ; bInterfaceNumber 0E18 00 2855 .db 0 ; bAlternateSetting 0E19 03 2856 .db 3 ; bNumEndpoints 0E1A FF 2857 .db 0xff ; bInterfaceClass (vendor specific) 0E1B 00 2858 .db 0x00 ; bInterfaceSubClass 0E1C FF 2859 .db 0xff ; bInterfaceProtocol (vendor specific) 0E1D 00 2860 .db 0 ; iInterface 2861 ;; endpoint descriptor I0:A0:E0 0E1E 07 2862 .db 7 ; bLength 0E1F 05 2863 .db USB_DT_ENDPOINT ; bDescriptorType 0E20 81 2864 .db (USB_DIR_IN | 1) ; bEndpointAddress 0E21 02 2865 .db 0x02 ; bmAttributes (bulk) 0E22 40 00 2866 .db 0x40,0x00 ; wMaxPacketSize 0E24 00 2867 .db 0 ; bInterval 2868 ;; endpoint descriptor I0:A0:E1 0E25 07 2869 .db 7 ; bLength 0E26 05 2870 .db USB_DT_ENDPOINT ; bDescriptorType 0E27 82 2871 .db (USB_DIR_IN | 2) ; bEndpointAddress 0E28 02 2872 .db 0x02 ; bmAttributes (bulk) 0E29 40 00 2873 .db 0x40,0x00 ; wMaxPacketSize 0E2B 00 2874 .db 0 ; bInterval 2875 ;; endpoint descriptor I0:A0:E2 0E2C 07 2876 .db 7 ; bLength 0E2D 05 2877 .db USB_DT_ENDPOINT ; bDescriptorType 0E2E 02 2878 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0E2F 02 2879 .db 0x02 ; bmAttributes (bulk) 0E30 40 00 2880 .db 0x40,0x00 ; wMaxPacketSize 0E32 00 2881 .db 0 ; bInterval 2882 ;; interface descriptor I0:A1 0E33 09 2883 .db 9 ; bLength 0E34 04 2884 .db USB_DT_INTERFACE ; bDescriptorType 0E35 00 2885 .db 0 ; bInterfaceNumber 0E36 01 2886 .db 1 ; bAlternateSetting 0E37 03 2887 .db 3 ; bNumEndpoints 0E38 FF 2888 .db 0xff ; bInterfaceClass (vendor specific) 0E39 00 2889 .db 0x00 ; bInterfaceSubClass 0E3A FF 2890 .db 0xff ; bInterfaceProtocol (vendor specific) 0E3B 00 2891 .db 0 ; iInterface 2892 ;; endpoint descriptor I0:A1:E0 0E3C 07 2893 .db 7 ; bLength 0E3D 05 2894 .db USB_DT_ENDPOINT ; bDescriptorType 0E3E 81 2895 .db (USB_DIR_IN | 1) ; bEndpointAddress 0E3F 03 2896 .db 0x03 ; bmAttributes (interrupt) 0E40 40 00 2897 .db 0x40,0x00 ; wMaxPacketSize 0E42 0A 2898 .db 10 ; bInterval 2899 ;; endpoint descriptor I0:A1:E1 0E43 07 2900 .db 7 ; bLength 0E44 05 2901 .db USB_DT_ENDPOINT ; bDescriptorType 0E45 82 2902 .db (USB_DIR_IN | 2) ; bEndpointAddress 0E46 02 2903 .db 0x02 ; bmAttributes (bulk) 0E47 40 00 2904 .db 0x40,0x00 ; wMaxPacketSize 0E49 00 2905 .db 0 ; bInterval 2906 ;; endpoint descriptor I0:A1:E2 0E4A 07 2907 .db 7 ; bLength 0E4B 05 2908 .db USB_DT_ENDPOINT ; bDescriptorType 0E4C 02 2909 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0E4D 02 2910 .db 0x02 ; bmAttributes (bulk) 0E4E 40 00 2911 .db 0x40,0x00 ; wMaxPacketSize 0E50 00 2912 .db 0 ; bInterval 2913 0045 2914 config0sz = . - config0descr 2915 0E51 2916 stringdescr: 0E51 59 0E 2917 .db string0 0E53 5D 0E 2918 .db string1 0E55 6B 0E 2919 .db string2 0E57 89 0E 2920 .db stringserial 2921 0004 2922 numstrings = (. - stringdescr)/2 2923 0E59 2924 string0: 0E59 04 2925 .db string0sz ; bLength 0E5A 03 2926 .db USB_DT_STRING ; bDescriptorType 0E5B 00 00 2927 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2928 string0sz = . - string0 2929 0E5D 2930 string1: 0E5D 0E 2931 .db string1sz ; bLength 0E5E 03 2932 .db USB_DT_STRING ; bDescriptorType 0E5F 42 00 61 00 79 00 2933 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2934 string1sz = . - string1 2935 0E6B 2936 string2: 0E6B 1E 2937 .db string2sz ; bLength 0E6C 03 2938 .db USB_DT_STRING ; bDescriptorType 0E6D 55 00 53 00 42 00 2939 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0E7D 28 00 41 00 46 00 2940 .db '(,0,'A,0,'F,0,'S,0,'K,0,'),0 53 00 4B 00 29 00 001E 2941 string2sz = . - string2 2942 0E89 2943 stringserial: 0E89 02 2944 .db 2 ; bLength 0E8A 03 2945 .db USB_DT_STRING ; bDescriptorType 0E8B 00 00 00 00 00 00 2946 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0E9B 00 00 00 00 00 00 2947 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2948 baycomusb-0.10.orig/firmware/afskfirmware/main.map0100644000175100017510000000665507337536151020356 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 s_OSEG 0000 l__CODE 0000 s__CODE 0000 s_CODE 0000 s_BSEG 0000 l_OSEG 0008 l_GSINIT 000B l_BSEG 0032 l_DSEG 0040 s_DSEG 0080 l_ISEG 0080 s_ISEG 0137 l_GSINIT2 0157 l_CODE 0157 s_CSEG 0C00 l_XSEG 0D54 l_CSEG 0EAB s_GSINIT 0EB3 s_GSINIT2 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 0157 = 343. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 0157 0D54 = 3412. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:0B26 fillusbintr Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT 0EAB 0008 = 8. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT2 0EB3 0137 = 311. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ OSEG 0000 0000 = 0. bytes (REL,OVR) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 000B = 11. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0080 = 128. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 0032 = 50. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 0C00 = 3072. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/afskfirmware/main.asm0100644000175100017510000013244607337522043020352 0ustar abaaba .module main ;; ENDPOINTS ;; EP0 in/out Control ;; EP1 in Interrupt: Status ;; Byte 0: Modem Status ;; Bit 0-1: Transmitter status ;; 0: idle (off) ;; 1: keyup ;; 2: transmitting packets ;; 3: tail ;; Bit 2: PTT status (1=on) ;; Bit 3: DCD ;; Bit 4: RXB (Rx Packet Ready) ;; Bit 5: UART transmitter empty ;; Bit 6-7: unused ;; Byte 1: Number of empty 64 byte chunks in TX fifo ;; Byte 2: Number of full 64 byte chunks in RX fifo ;; Byte 3: RSSI value ;; Byte 4: IRQ count ;; Byte 5-20: (as needed) UART receiver chars ;; EP2 out Packets to be transmitted ;; EP2 in Received packets; note they have the CRC appended ;; COMMAND LIST ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) ;; C0 C8 read mode ;; Return: ;; Byte 0: 3 (MODE_AFSK) ;; C0 C9 return serial number string ;; C0 D0 get/set PTT/DCD/RSSI ;; wIndex = 1: set forced ptt to wValue ;; Return: ;; Byte 0: PTT status ;; Byte 1: DCD status ;; Byte 2: RSSI status ;; C0 D1 get Bitrate ;; Return: ;; Byte 0-2: TX Bitrate ;; Byte 3-5: RX Bitrate ;; 40 D2 set CON/STA led ;; Bits 0-1 of wValue ;; 40 D3 send byte to UART ;; Byte in wValue ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) ;; wIndex = 1: write wValue to output register ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) ;; Return: ;; Byte 0: Modem Disconnect Input ;; Byte 1: Modem Disconnect Output register ;; Byte 2: Modem Disconnect Tristate register ;; C0 D5 get/set T7F port ;; wIndex = 1: write wValue to T7F output register ;; Return: ;; Byte 0: T7F Input ;; Byte 1: T7F Output register ;; define code segments link order .area CODE (CODE) .area CSEG (CODE) .area GSINIT (CODE) .area GSINIT2 (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; Xilinx FPGA registers FSKSHREG = 0xc000 FSKSHSTATUS = 0xc001 FSKRSSI = 0xc004 FSKCTRL = 0xc008 FSKSTAT = 0xc009 FSKT7FOUT = 0xc00a FSKT7FIN = 0xc00b FSKMDISCTRIS = 0xc00c FSKMDISCOUT = 0xc00d FSKMDISCIN = 0xc00e ;; ----------------------------------------------------- .area CODE (CODE) ljmp startup ljmp int0_isr .ds 5 ljmp timer0_isr .ds 5 ljmp int1_isr .ds 5 ljmp timer1_isr .ds 5 ljmp ser0_isr .ds 5 ljmp timer2_isr .ds 5 ljmp resume_isr .ds 5 ljmp ser1_isr .ds 5 ljmp usb_isr .ds 5 ljmp i2c_isr .ds 5 ljmp int4_isr .ds 5 ljmp int5_isr .ds 5 ljmp int6_isr ;; Parameter block at 0xe0 .ds 0x7a parbitratetx: .db <1200,>1200,0 parbitraterx: .db <1200,>1200,0 parextmodem: .db 0 parpttmute: .db 1 ;; Serial# string at 0xf0 .ds 8 parserial: .db '0,'0,'0,'0,'0,'0,'0,'0,0 .ds 7 ;; USB interrupt dispatch table usb_isr: ljmp usb_sudav_isr .ds 1 ljmp usb_sof_isr .ds 1 ljmp usb_sutok_isr .ds 1 ljmp usb_suspend_isr .ds 1 ljmp usb_usbreset_isr .ds 1 reti .ds 3 ljmp usb_ep0in_isr .ds 1 ljmp usb_ep0out_isr .ds 1 ljmp usb_ep1in_isr .ds 1 ljmp usb_ep1out_isr .ds 1 ljmp usb_ep2in_isr .ds 1 ljmp usb_ep2out_isr .ds 1 ljmp usb_ep3in_isr .ds 1 ljmp usb_ep3out_isr .ds 1 ljmp usb_ep4in_isr .ds 1 ljmp usb_ep4out_isr .ds 1 ljmp usb_ep5in_isr .ds 1 ljmp usb_ep5out_isr .ds 1 ljmp usb_ep6in_isr .ds 1 ljmp usb_ep6out_isr .ds 1 ljmp usb_ep7in_isr .ds 1 ljmp usb_ep7out_isr ;; ----------------------------------------------------- RXCHUNKS = 32 TXCHUNKS = 16 .area OSEG (OVR,DATA) .area BSEG (BIT) ctrl_ptt: .ds 1 ctrl_pttmute: .ds 1 ctrl_ledptt: .ds 1 ctrl_leddcdsrc: .ds 1 ; not implemented ctrl_clksel: .ds 1 ; not implemented ctrl_indacd: .ds 1 ; not implemented ctrl_indacz: .ds 1 ; not implemented ctrl_txdsrc: .ds 1 ; not implemented ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) pttmute: .ds 1 pttforcechg: .ds 1 uartempty: .ds 1 .area ISEG (DATA) txbcnt: .ds TXCHUNKS rxbcnt: .ds RXCHUNKS stack: .ds 0x80-RXCHUNKS-TXCHUNKS .area DSEG (DATA) ctrlcode: .ds 1 ctrlcount: .ds 2 leddiv: .ds 1 irqcount: .ds 1 ;; transmitter variables txstate: .ds 1 flagcnt: .ds 2 txwr: .ds 1 txrd: .ds 1 txtwr: .ds 1 txcrc: .ds 2 txshreg: .ds 1 txbnum: .ds 1 txptr: .ds 1 txskip: .ds 1 pttforce: .ds 1 ;; receiver variables rxstate: .ds 1 rxwr: .ds 1 rxrd: .ds 1 rxtwr: .ds 1 rxcntc: .ds 1 rxcrc: .ds 2 rxshreg: .ds 1 rxbreg: .ds 1 rxbnum: .ds 1 rxptr: .ds 1 tmprxcnt: .ds 1 ;; UART receiver uartbuf: .ds 16 uartwr: .ds 1 uartrd: .ds 1 ;; USB state numconfig: .ds 1 altsetting: .ds 1 .area XSEG (DATA) txbuf: .ds TXCHUNKS*64 rxbuf: .ds RXCHUNKS*64 .area GSINIT (CODE) startup: mov sp,#stack ; -1 clr a mov psw,a mov dps,a ;lcall __sdcc_external_startup ;mov a,dpl0 ;jz __sdcc_init_data ;ljmp __sdcc_program_startup __sdcc_init_data: .area GSINIT2 (CODE) __sdcc_program_startup: ;; assembler code startup clr a mov txstate,a mov txwr,a mov txrd,a mov txtwr,a mov pttforce,a mov rxstate,a mov rxwr,a mov rxrd,a mov rxtwr,a mov irqcount,a mov uartrd,a mov uartwr,a mov dps,a setb uartempty ;; some indirect register setup mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs ;; Timer setup: ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 mov tmod,#0x21 mov tcon,#0x55 ; INT0/INT1 edge mov th1,#256-156 ; 1200 bauds mov pcon,#0 ; SMOD0=0 ;; init USB subsystem mov dptr,#ISOCTL mov a,#1 ; disable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a clr a mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR mov a,#0x9 ; pair EP 2&3 for input & output movx @dptr,a mov dptr,#IN07VAL mov a,#0x7 ; enable EP0+EP1+EP2 movx @dptr,a mov dptr,#OUT07VAL mov a,#0x5 ; enable EP0+EP2 movx @dptr,a ;; USB: init endpoint toggles mov dptr,#TOGCTL mov a,#0x12 movx @dptr,a mov a,#0x32 ; clear EP 2 in toggle movx @dptr,a mov a,#0x02 movx @dptr,a mov a,#0x22 ; clear EP 2 out toggle movx @dptr,a ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x82 ; set PROG hi movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins movx @dptr,a mov dptr,#OUTC mov a,#0x28 movx @dptr,a mov dptr,#OEC mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT movx @dptr,a ;; enable interrupts mov ie,#0x92 ; enable timer 0 and ser 0 int mov eie,#0x01 ; enable USB interrupts mov dptr,#USBIEN mov a,#1 ; enable SUDAV interrupt movx @dptr,a mov dptr,#IN07IEN mov a,#3 ; enable EP0+EP1 interrupt movx @dptr,a mov dptr,#OUT07IEN mov a,#1 ; enable EP0 interrupt movx @dptr,a ;; initialize UART 0 for T7F communication mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable ;; copy configuration to bit addressable variables mov ctrlreg,#0x42 mov r0,#parpttmute movx a,@r0 mov c,acc.0 mov pttmute,c mov ctrl_pttmute,c ;; turn off transmitter mov a,ctrlreg mov dptr,#FSKCTRL movx @dptr,a ;; Initialize modem disc port / t7f port mov dptr,#FSKMDISCTRIS mov a,#0xff movx @dptr,a mov dptr,#FSKMDISCOUT clr a movx @dptr,a mov dptr,#FSKT7FOUT mov a,#0x1f movx @dptr,a ;; Copy serial number mov r0,#parserial mov dptr,#stringserial+2 1$: movx a,@r0 jz 2$ movx @dptr,a inc dptr inc dptr inc r0 sjmp 1$ 2$: mov a,r0 add a,#1-0xf0 ; 1-parserial add a,acc mov dptr,#stringserial movx @dptr,a ;; initialize USB state usbinit: clr a mov numconfig,a mov altsetting,a ;; give Windows a chance to finish the writecpucs control transfer ;; 20ms delay loop mov dptr,#(-12000)&0xffff 2$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 2$ ; 3 cycles .if 1 ;; disconnect from USB bus mov dptr,#USBCS mov a,#10 movx @dptr,a ;; wait 0.3 sec mov r2,#30 ;; 10ms delay loop 0$: mov dptr,#(-6000)&0xffff 1$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 1$ ; 3 cycles djnz r2,0$ ;; reconnect to USB bus mov dptr,#USBCS ;mov a,#2 ; 8051 handles control ;movx @dptr,a mov a,#6 ; reconnect, 8051 handles control movx @dptr,a .endif ;; final lcall fillusbintr ;; kludge; first OUT2 packet seems to be bogus ;; wait for packet with length 1 and contents 0x55 waitpkt1: mov dptr,#OUT2CS movx a,@dptr jb acc.1,waitpkt1 mov dptr,#OUT2BC movx a,@dptr cjne a,#1,0$ mov dptr,#OUT2BUF movx a,@dptr cjne a,#0x55,0$ mov dptr,#OUT2BC movx @dptr,a sjmp pkt1received 0$: mov dptr,#OUT2BC movx @dptr,a sjmp waitpkt1 pkt1received: ;; start normal operation ljmp mainloop .area CSEG (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 setptt: mov a,txstate orl a,pttforce jz pttoff ptton: clr ctrl_pttmute setb ctrl_ptt setb ctrl_ledptt mov a,ctrlreg mov dptr,#FSKCTRL movx @dptr,a ret pttoff: clr ctrl_ptt mov c,pttmute mov ctrl_pttmute,c clr ctrl_ledptt mov a,ctrlreg mov dptr,#FSKCTRL movx @dptr,a ret mainloop: ;; HDLC encoder txnopkt: mov a,txrd cjne a,txwr,txstartsend lcall periodic clr a mov txstate,a mov dptr,#FSKSHREG movx @dptr,a jbc pttforcechg,0$ sjmp txnopkt 0$: lcall setptt sjmp txnopkt txstartsend: mov txstate,#1 mov txbnum,#8 mov txcrc,#0xff mov txcrc+1,#0xff ;; start txdelay ;; read the number of flags to send from the first two bytes of the first packet .if 1 mov a,txrd rr a rr a mov dpl0,a anl a,#0xc0 add a,#txbuf mov dph0,a .else mov a,txrd rr a rr a mov dpl0,a anl a,#0xc0 xch a,dpl0 anl a,#0x3f add a,#>txbuf mov dph0,a .endif movx a,@dptr mov flagcnt,a inc dptr movx a,@dptr mov flagcnt+1,a mov txskip,#2 ;; sanity check (limit txdelay to about 8s) mov r0,#parbitratetx+1 movx a,@r0 clr c subb a,flagcnt+1 jnc 2$ movx a,@r0 mov flagcnt+1,a 2$: ;; check if count is at least two mov a,txrd add a,#txbcnt mov r0,a mov a,@r0 add a,#-2 jc 1$ mov flagcnt,#1 mov flagcnt+1,#0 mov txskip,#0 1$: ;; turn on PTT lcall ptton txkeyup: mov a,flagcnt add a,#-1 mov flagcnt,a mov a,flagcnt+1 addc a,#-1 mov flagcnt+1,a jnc txpreparepkt lcall periodic mov a,#0x7e mov dptr,#FSKSHREG movx @dptr,a sjmp txkeyup txpreparepkt: mov txptr,txskip mov txstate,#2 txpktbyteloop: mov a,txrd add a,#txbcnt mov r0,a mov a,@r0 cjne a,txptr,txchunkcont ;; tx chunk ended mov txskip,#0 jb acc.6,txchunknoend mov a,txcrc cpl a lcall txbytenocrc mov a,txcrc+1 cpl a lcall txbytenocrc lcall txflag mov txcrc,#0xff mov txcrc+1,#0xff mov txskip,#2 txchunknoend: mov a,txrd inc a anl a,#(TXCHUNKS-1) mov txrd,a cjne a,txwr,txpreparepkt ljmp txtail txchunkcont: .if 1 mov a,txrd rr a rr a mov dpl0,a anl a,#0xc0 add a,txptr add a,#txbuf mov dph0,a .else mov a,txrd rr a rr a mov dpl0,a anl a,#0xc0 add a,txptr xch a,dpl0 anl a,#0x3f addc a,#>txbuf mov dph0,a .endif movx a,@dptr lcall txbyte inc txptr sjmp txpktbyteloop txtail: lcall txflag mov txstate,#3 mov r2,#20 0$: setb c lcall txbit djnz r2,0$ ;; turn off PTT mov txstate,#0 lcall setptt ljmp txnopkt txflag: mov r3,#0x7e mov r2,#8 0$: mov a,r3 rrc a mov r3,a lcall txbit djnz r2,0$ ret txbit: mov a,txshreg rrc a mov txshreg,a djnz txbnum,0$ mov txbnum,#8 lcall periodic mov a,txshreg mov dptr,#FSKSHREG movx @dptr,a 0$: ret txbytenocrc: mov r3,a mov r2,#8 0$: mov a,r3 rrc a mov r3,a lcall txbit mov a,txshreg cpl a anl a,#0xf8 jnz 1$ clr c lcall txbit ; add stuff bit 1$: djnz r2,0$ ret txbyte: mov r3,a mov r2,#8 0$: clr c mov a,txcrc+1 rrc a mov txcrc+1,a mov a,txcrc rrc a mov txcrc,a mov a,r3 jnb acc.0,2$ cpl c 2$: jnc 3$ xrl txcrc+1,#0x84 xrl txcrc,#0x08 3$: rrc a mov r3,a lcall txbit mov a,txshreg cpl a anl a,#0xf8 jnz 1$ clr c lcall txbit ; add stuff bit 1$: djnz r2,0$ ret periodic: mov dptr,#FSKSHSTATUS movx a,@dptr jnb acc.1,0$ ret 0$: jnb acc.0,1$ lcall hdlcdec 1$: usbiostart: ;; check for USB modem->host mov a,rxrd cjne a,rxwr,usbcheckin ;; check for USB host->modem usbcheckout: mov dptr,#OUT2CS movx a,@dptr jb acc.1,endusb2 mov a,txwr add a,#txbcnt mov r0,a mov a,txwr inc a anl a,#(TXCHUNKS-1) cjne a,txrd,usbout2 ljmp endusb usbout2: mov r7,a mov dptr,#OUT2BC movx a,@dptr mov @r0,a jz usbout3 mov r6,a .if 1 mov a,txwr rr a rr a mov dpl1,a anl a,#0xc0 add a,#txbuf mov dph1,a .else mov a,txwr rr a rr a mov dpl1,a anl a,#0xc0 xch a,dpl1 anl a,#0x3f add a,#>txbuf mov dph1,a .endif mov dptr,#OUT2BUF usboutloop: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r6,usboutloop usbout3: mov txwr,r7 mov dptr,#OUT2BC movx @dptr,a ; rearm OUT2 endusb2: sjmp endusb usbcheckin: mov dptr,#IN2CS movx a,@dptr jb acc.1,usbcheckout mov a,rxrd add a,#rxbcnt mov r0,a mov a,@r0 jz usbin1 mov r6,a .if 1 mov a,rxrd rr a rr a mov dpl1,a anl a,#0xc0 add a,#rxbuf mov dph1,a .else mov a,rxrd rr a rr a mov dpl1,a anl a,#0xc0 xch a,dpl1 anl a,#0x3f addc a,#>rxbuf mov dph1,a .endif mov dptr,#IN2BUF usbinloop: inc dps movx a,@dptr inc dptr dec dps movx @dptr,a inc dptr djnz r6,usbinloop usbin1: mov a,@r0 mov dptr,#IN2BC movx @dptr,a mov a,rxrd inc a anl a,#(RXCHUNKS-1) mov rxrd,a ljmp usbcheckout endusb: ljmp periodic ;; Software HDLC decoder hdlcdec: mov dptr,#FSKSHREG movx a,@dptr mov r6,a mov r7,#8 hdlcdecloop: mov a,r6 rrc a mov r6,a mov a,rxshreg rlc a mov rxshreg,a cjne a,#0x7e,$0 ljmp hdlcdecflag $0: cpl a anl a,#0x7f jz hdlcdecabort $1: mov a,rxstate jz hdlcdecendloop mov a,rxshreg anl a,#0x3f cjne a,#0x3e,hdlcdecrxbit hdlcdecendloop: djnz r7,hdlcdecloop ret hdlcdecabort: mov rxstate,#0 ; abort received sjmp hdlcdecendloop hdlcdecrxbit: clr c mov a,rxcrc rlc a mov rxcrc,a mov a,rxcrc+1 rlc a mov rxcrc+1,a mov a,rxshreg jnb acc.0,0$ cpl c 0$: jnc 1$ xrl rxcrc,#0x21 xrl rxcrc+1,#0x10 1$: rrc a mov a,rxbreg rrc a mov rxbreg,a djnz rxbnum,hdlcdecendloop mov rxbnum,#8 .if 1 mov a,rxtwr rr a rr a mov dpl0,a anl a,#0xc0 add a,rxptr add a,#rxbuf mov dph0,a .else mov a,rxtwr rr a rr a mov dpl0,a anl a,#0xc0 add a,rxptr xch a,dpl0 anl a,#0x3f addc a,#>rxbuf mov dph0,a .endif mov a,rxbreg movx @dptr,a inc rxptr mov a,rxptr jnb acc.6,hdlcdecendloop mov a,rxtwr add a,#rxbcnt mov r0,a mov @r0,#64 mov a,rxtwr inc a anl a,#RXCHUNKS-1 cjne a,rxrd,2$ mov rxstate,#0 ljmp hdlcdecendloop 2$: mov rxtwr,a mov rxptr,#0 inc rxcntc ljmp hdlcdecendloop hdlcdecflag: mov a,rxstate jz hdlcdecpreparenewpkt ;; check for correct CRC: ;; 1D0F -0-> 3A1E -1-> 641D -1-> D81B -1-> B036 -1-> 606C -1-> D0F9 -1-> A1F2 mov a,rxcrc xrl a,#0xf2 mov r0,a mov a,rxcrc+1 xrl a,#0xa1 orl a,r0 jnz hdlcdecpreparenewpkt mov a,rxtwr add a,#rxbcnt mov r0,a mov a,rxptr mov @r0,a mov a,rxcntc jnz 3$ mov a,#-4 add a,@r0 jnc hdlcdecpreparenewpkt ; frame too short sjmp 4$ 3$: add a,#-8 jc hdlcdecpreparenewpkt ; frame too long 4$: mov a,rxtwr inc a anl a,#RXCHUNKS-1 cjne a,rxrd,5$ sjmp hdlcdecpreparenewpkt 5$: mov rxwr,a hdlcdecpreparenewpkt: clr a mov rxcntc,a mov rxptr,a mov rxstate,#1 cpl a mov rxcrc,a mov rxcrc+1,a mov rxbnum,#8 mov rxtwr,rxwr ljmp hdlcdecendloop .if 0 ;; IO copy routine ioc1: ;; txpointers add a,#txbcnt mov r0,a .if 1 mov a,txrd rr a rr a mov dpl1,a anl a,#0xc0 add a,#txbuf mov dph1,a .else mov a,txrd rr a rr a mov dpl1,a anl a,#0xc0 xch a,dpl1 anl a,#0x3f add a,#>txbuf mov dph1,a .endif ;; rxpointers mov a,rxtwr add a,#rxbcnt mov r1,a .if 1 mov a,rxtwr rr a rr a mov dpl0,a anl a,#0xc0 add a,#rxbuf mov dph0,a .else mov a,rxtwr rr a rr a mov dpl0,a anl a,#0xc0 xch a,dpl0 anl a,#0x3f add a,#>rxbuf mov dph0,a .endif ;; update rxpointer mov a,rxtwr inc a anl a,#(RXCHUNKS-1) mov rxtwr,a cjne a,rxrd,ioc2 iocret: ret ;; entry point iocopy: mov a,txrd cjne a,txwr,ioc1 ret ioc2: mov a,@r0 mov @r1,a jz ioc3 mov r7,a ioc4: inc dps movx a,@dptr inc dptr dec dps movx @dptr,a inc dptr djnz r7,ioc4 ioc3: mov a,txrd inc a anl a,#(TXCHUNKS-1) mov txrd,a mov a,@r0 add a,#-0x40 jc iocret mov rxwr,rxtwr ret .endif ;; ------------------ interrupt handlers ------------------------ int0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+5 ;; handle interrupt .if 0 inc leddiv mov a,leddiv anl a,#7 jnz 0$ mov dptr,#OUTC movx a,@dptr xrl a,#0x08 movx @dptr,a 0$: .endif ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 ;; clear interrupt jbc scon0+0,1$ ; RI 0$: jbc scon0+1,2$ ; TI ;; handle interrupt ;; epilogue 3$: pop ar0 pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti 2$: setb uartempty sjmp 0$ 1$: mov a,uartwr add a,#uartbuf mov r0,a mov a,sbuf0 mov @r0,a mov a,uartwr inc a anl a,#0xf mov uartwr,a sjmp 3$ timer2_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr t2con+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti resume_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+4 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon1+0 clr scon1+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti i2c_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.5 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int4_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.6 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int5_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.7 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int6_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sudav_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov ctrlcode,#0 ; reset control out code mov dptr,#(SETUPDAT+1) movx a,@dptr ; bRequest field ;; standard commands ;; USB_REQ_GET_DESCRIPTOR cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc mov dptr,#SETUPDAT ; bRequestType == 0x80 movx a,@dptr cjne a,#USB_DIR_IN,setupstallstd mov dptr,#SETUPDAT+3 movx a,@dptr cjne a,#USB_DT_DEVICE,cmdnotgetdescdev mov dptr,#SUDPTRH mov a,#>devicedescr movx @dptr,a inc dptr mov a,#config0descr movx @dptr,a inc dptr mov a,#stringdescr mov dph0,a movx a,@dptr mov b,a inc dptr movx a,@dptr mov dptr,#SUDPTRH movx @dptr,a inc dptr mov a,b movx @dptr,a ; sjmp setupackstd setupackstd: ljmp setupack setupstallstd: ljmp setupstall cmdnotgetdesc: ;; USB_REQ_SET_CONFIGURATION cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf mov dptr,#SETUPDAT movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr add a,#-2 jc setupstallstd movx a,@dptr mov numconfig,a cmdresettoggleshalt: mov dptr,#TOGCTL mov r0,#7 0$: mov a,r0 orl a,#0x10 movx @dptr,a orl a,#0x30 movx @dptr,a mov a,r0 movx @dptr,a orl a,#0x20 movx @dptr,a djnz r0,0$ clr a movx @dptr,a mov a,#2 mov dptr,#IN1CS mov r0,#7 1$: movx @dptr,a inc dptr inc dptr djnz r0,1$ mov dptr,#OUT1CS mov r0,#7 2$: movx @dptr,a inc dptr inc dptr djnz r0,2$ lcall fillusbintr sjmp setupackstd cmdnotsetconf: ;; USB_REQ_SET_INTERFACE cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr mov altsetting,a sjmp cmdresettoggleshalt cmdnotsetint: ;; USB_REQ_GET_INTERFACE cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr jnz setupstallstd mov a,altsetting cmdrespondonebyte: mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a sjmp setupackstd2 cmdnotgetint: ;; USB_REQ_GET_CONFIGURATION cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 mov a,numconfig sjmp cmdrespondonebyte cmdnotgetconf: ;; USB_REQ_GET_STATUS (0) jnz cmdnotgetstat mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev mov a,#1 cmdrespondstat: mov dptr,#IN0BUF movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#IN0BC mov a,#2 movx @dptr,a sjmp setupackstd2 cmdnotgetstatdev: cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf clr a sjmp cmdrespondstat cmdnotgetstatintf: cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 mov dptr,#SETUPDAT+4 movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 0$: anl a,#15 jz setupstallstd2 jb acc.3,setupstallstd2 add a,acc add a,dpl0 mov dpl0,a movx a,@dptr sjmp cmdrespondstat setupackstd2: ljmp setupack setupstallstd2: ljmp setupstall cmdnotgetstat: ;; USB_REQ_SET_FEATURE cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr mov b,#1 sjmp handleftr cmdnotsetftr: ;; USB_REQ_CLEAR_FEATURE cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr mov b,#0 handleftr: mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 inc dptr inc dptr movx a,@dptr jnz setupstallstd2 ; not ENDPOINT_HALT feature inc dptr movx a,@dptr jnz setupstallstd2 inc dptr movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 orl a,#0x10 0$: jb acc.3,setupstallstd2 ;; clear data toggle anl a,#0x1f inc dps mov dptr,#TOGCTL movx @dptr,a orl a,#0x20 movx @dptr,a anl a,#15 movx @dptr,a dec dps ;; clear/set ep halt feature add a,acc add a,dpl0 mov dpl0,a mov a,b movx @dptr,a sjmp setupackstd2 cmdnotc0_1: ljmp cmdnotc0 setupstallc0_1: ljmp setupstall cmdnotclrftr: ;; vendor specific commands ;; 0xc0 cjne a,#0xc0,cmdnotc0_1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc0_1 ;; fill status buffer mov a,txstate mov b,a setb b.2 orl a,pttforce cjne a,#0,0$ clr b.2 0$: mov dptr,#FSKSTAT movx a,@dptr mov c,acc.0 mov b.3,c mov c,uartempty mov b.5,c clr a mov dptr,#(IN0BUF+4) movx @dptr,a ;; bytewide elements mov dptr,#(IN0BUF) mov a,b movx @dptr,a mov a,txwr cpl a add a,txrd anl a,#(TXCHUNKS-1) mov dptr,#(IN0BUF+1) movx @dptr,a mov a,rxrd cpl a add a,rxwr inc a anl a,#(RXCHUNKS-1) mov dptr,#(IN0BUF+2) movx @dptr,a mov dptr,#FSKRSSI movx a,@dptr mov dptr,#(IN0BUF+3) movx @dptr,a ;; counter inc irqcount mov a,irqcount mov dptr,#(IN0BUF+5) movx @dptr,a ;; additional fields (HDLC state mach) mov a,txstate inc dptr movx @dptr,a mov a,txrd inc dptr movx @dptr,a mov a,txwr inc dptr movx @dptr,a mov a,txtwr inc dptr movx @dptr,a mov a,#0 inc dptr movx @dptr,a mov a,flagcnt inc dptr movx @dptr,a mov a,flagcnt+1 inc dptr movx @dptr,a mov a,rxstate inc dptr movx @dptr,a mov a,rxrd inc dptr movx @dptr,a mov a,rxwr inc dptr movx @dptr,a mov a,rxtwr inc dptr movx @dptr,a mov a,rxcntc inc dptr movx @dptr,a ;; FPGA registers mov a,tmprxcnt mov dptr,#(IN0BUF+18) movx @dptr,a mov dptr,#FSKSHSTATUS movx a,@dptr mov dptr,#(IN0BUF+19) movx @dptr,a mov dptr,#FSKCTRL movx a,@dptr mov dptr,#(IN0BUF+20) movx @dptr,a mov dptr,#FSKSTAT movx a,@dptr mov dptr,#(IN0BUF+21) movx @dptr,a ;; Anchor Registers mov dptr,#OUT2CS movx a,@dptr mov dptr,#(IN0BUF+22) movx @dptr,a ;; set length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-(6+12+4+1) jnc 4$ clr a 4$: add a,#(6+12+4+1) mov dptr,#IN0BC movx @dptr,a ljmp setupack cmdnotc0: ;; 0xc8 cjne a,#0xc8,cmdnotc8 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc8 mov a,#3 mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a ljmp setupack setupstallc8: ljmp setupstall cmdnotc8: ;; 0xc9 cjne a,#0xc9,cmdnotc9 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc9 mov dptr,#IN0BUF mov r0,#parserial 0$: movx a,@r0 jz 1$ movx @dptr,a inc r0 inc dptr sjmp 0$ 1$: mov a,r0 add a,#-0xf0 ; -parserial mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallc9: ljmp setupstall cmdnotc9: ;; 0xd0 cjne a,#0xd0,cmdnotd0 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld0 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,0$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr anl a,#1 mov pttforce,a setb pttforcechg 0$: ;; PTT status mov dptr,#IN0BUF mov a,txstate orl a,pttforce jz 1$ mov a,#1 1$: movx @dptr,a ;; DCD status mov dptr,#FSKSTAT movx a,@dptr anl a,#1 xrl a,#1 mov dptr,#IN0BUF+1 movx @dptr,a ;; RSSI mov dptr,#FSKRSSI movx a,@dptr mov dptr,#IN0BUF+2 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-3 jnc 2$ clr a 2$: add a,#3 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld0: ljmp setupstall cmdnotd0: ;; 0xd1 cjne a,#0xd1,cmdnotd1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld1 mov dptr,#IN0BUF mov r0,#parbitratetx mov r7,#6 1$: movx a,@r0 movx @dptr,a inc dptr inc r0 djnz r7,1$ ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-6 jnc 2$ clr a 2$: add a,#6 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld1: ljmp setupstall cmdnotd1: ;; 0xd2 cjne a,#0xd2,cmdnotd2 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,setupstalld2 mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr mov b,a mov dptr,#OUTC movx a,@dptr mov c,b.0 mov acc.3,c mov c,b.1 mov acc.5,c movx @dptr,a ljmp setupack setupstalld2: ljmp setupstall cmdnotd2: ;; 0xd3 cjne a,#0xd3,cmdnotd3 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,setupstalld3 mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr jbc uartempty,cmdd2cont setupstalld3: ljmp setupstall cmdd2cont: mov sbuf0,a ljmp setupack cmdnotd3: ;; 0xd4 cjne a,#0xd4,cmdnotd4 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld4 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr mov dptr,#SETUPDAT+2 ; wValue cjne a,#1,0$ movx a,@dptr mov dptr,#FSKMDISCOUT movx @dptr,a sjmp 1$ 0$: cjne a,#2,1$ movx a,@dptr mov dptr,#FSKMDISCTRIS movx @dptr,a 1$: mov dptr,#FSKMDISCIN movx a,@dptr mov dptr,#IN0BUF+0 movx @dptr,a mov dptr,#FSKMDISCOUT movx a,@dptr mov dptr,#IN0BUF+1 movx @dptr,a mov dptr,#FSKMDISCTRIS movx a,@dptr mov dptr,#IN0BUF+2 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-3 jnc 2$ clr a 2$: add a,#3 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld4: ljmp setupstall cmdnotd4: ;; 0xd5 cjne a,#0xd5,cmdnotd5 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld5 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,0$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr mov dptr,#FSKT7FOUT movx @dptr,a 0$: mov dptr,#FSKT7FIN movx a,@dptr mov dptr,#IN0BUF+0 movx @dptr,a mov dptr,#FSKT7FOUT movx a,@dptr mov dptr,#IN0BUF+1 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-2 jnc 2$ clr a 2$: add a,#2 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld5: ljmp setupstall cmdnotd5: ;; unknown commands fall through to setupstall setupstall: mov a,#3 sjmp endsetup setupack: mov a,#2 endsetup: mov dptr,#EP0CS movx @dptr,a endusbisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sof_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sutok_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_suspend_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_usbreset_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep0in_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt ;ep0install: ; mov a,#3 ; sjmp ep0incs ;ep0inack: ; mov a,#2 ;ep0incs: ; mov dptr,#EP0CS ; movx @dptr,a ;ep0inendisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_ep0out_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar6 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt ;ep0outstall: ; mov ctrlcode,#0 ; mov a,#3 ; sjmp ep0outcs ;ep0outack: ; mov txwr,txtwr ; mov ctrlcode,#0 ; mov a,#2 ;ep0outcs: ; mov dptr,#EP0CS ; movx @dptr,a ;ep0outendisr: ;; epilogue pop ar6 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti fillusbintr:: mov a,txstate mov b,a setb b.2 orl a,pttforce cjne a,#0,0$ clr b.2 0$: mov dptr,#FSKSTAT movx a,@dptr mov c,acc.0 mov b.3,c mov c,uartempty mov b.5,c setb c mov a,rxrd cjne a,rxwr,1$ mov dptr,#(IN2CS) movx a,@dptr mov c,acc.1 1$: mov b.4,c ;; bytewide elements mov dptr,#(IN1BUF) mov a,b movx @dptr,a mov a,txwr cpl a add a,txrd anl a,#(TXCHUNKS-1) mov dptr,#(IN1BUF+1) movx @dptr,a mov a,rxrd cpl a add a,rxwr inc a anl a,#(RXCHUNKS-1) mov dptr,#(IN1BUF+2) movx @dptr,a mov dptr,#FSKRSSI movx a,@dptr mov dptr,#(IN1BUF+3) movx @dptr,a ; counter inc irqcount mov a,irqcount mov dptr,#(IN1BUF+4) movx @dptr,a ; UART buffer mov b,#5 mov dptr,#(IN1BUF+5) 2$: mov a,uartrd cjne a,uartwr,3$ ; set length mov dptr,#IN1BC mov a,b movx @dptr,a ret 3$: add a,#uartbuf mov r0,a mov a,@r0 movx @dptr,a inc dptr inc b mov a,uartrd inc a anl a,#0xf mov uartrd,a sjmp 2$ usb_ep1in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt lcall fillusbintr ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep1out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ;; ----------------------------------------------------- ;; USB descriptors ;; ----------------------------------------------------- ;; Device and/or Interface Class codes USB_CLASS_PER_INTERFACE = 0 USB_CLASS_AUDIO = 1 USB_CLASS_COMM = 2 USB_CLASS_HID = 3 USB_CLASS_PRINTER = 7 USB_CLASS_MASS_STORAGE = 8 USB_CLASS_HUB = 9 USB_CLASS_VENDOR_SPEC = 0xff ;; Descriptor types USB_DT_DEVICE = 0x01 USB_DT_CONFIG = 0x02 USB_DT_STRING = 0x03 USB_DT_INTERFACE = 0x04 USB_DT_ENDPOINT = 0x05 ;; Standard requests USB_REQ_GET_STATUS = 0x00 USB_REQ_CLEAR_FEATURE = 0x01 USB_REQ_SET_FEATURE = 0x03 USB_REQ_SET_ADDRESS = 0x05 USB_REQ_GET_DESCRIPTOR = 0x06 USB_REQ_SET_DESCRIPTOR = 0x07 USB_REQ_GET_CONFIGURATION = 0x08 USB_REQ_SET_CONFIGURATION = 0x09 USB_REQ_GET_INTERFACE = 0x0A USB_REQ_SET_INTERFACE = 0x0B USB_REQ_SYNCH_FRAME = 0x0C ;; USB Request Type and Endpoint Directions USB_DIR_OUT = 0 USB_DIR_IN = 0x80 USB_TYPE_STANDARD = (0x00 << 5) USB_TYPE_CLASS = (0x01 << 5) USB_TYPE_VENDOR = (0x02 << 5) USB_TYPE_RESERVED = (0x03 << 5) USB_RECIP_DEVICE = 0x00 USB_RECIP_INTERFACE = 0x01 USB_RECIP_ENDPOINT = 0x02 USB_RECIP_OTHER = 0x03 ;; Request target types. USB_RT_DEVICE = 0x00 USB_RT_INTERFACE = 0x01 USB_RT_ENDPOINT = 0x02 VENDID = 0xbac0 PRODID = 0x6136 devicedescr: .db 18 ; bLength .db USB_DT_DEVICE ; bDescriptorType .db 0x00, 0x01 ; bcdUSB .db USB_CLASS_VENDOR_SPEC ; bDeviceClass .db 0 ; bDeviceSubClass .db 0xff ; bDeviceProtocol .db 0x40 ; bMaxPacketSize0 .db VENDID ; idVendor .db PRODID ; idProduct .db 0x01,0x00 ; bcdDevice .db 1 ; iManufacturer .db 2 ; iProduct .db 3 ; iSerialNumber .db 1 ; bNumConfigurations config0descr: .db 9 ; bLength .db USB_DT_CONFIG ; bDescriptorType .db config0sz ; wTotalLength .db 1 ; bNumInterfaces .db 1 ; bConfigurationValue .db 0 ; iConfiguration .db 0b01000000 ; bmAttributs (self powered) .db 0 ; MaxPower (mA/2) (self powered so 0) ;; interface descriptor I0:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A0:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A0:E1 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A0:E2 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; interface descriptor I0:A1 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 1 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A1:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x03 ; bmAttributes (interrupt) .db 0x40,0x00 ; wMaxPacketSize .db 10 ; bInterval ;; endpoint descriptor I0:A1:E1 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A1:E2 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval config0sz = . - config0descr stringdescr: .db string0 .db string1 .db string2 .db stringserial numstrings = (. - stringdescr)/2 string0: .db string0sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 0,0 ; LANGID[0]: Lang Neutral string0sz = . - string0 string1: .db string1sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 string1sz = . - string1 string2: .db string2sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 .db '(,0,'A,0,'F,0,'S,0,'K,0,'),0 string2sz = . - string2 stringserial: .db 2 ; bLength .db USB_DT_STRING ; bDescriptorType .dw 0,0,0,0,0,0,0,0 .dw 0,0,0,0,0,0,0,0 baycomusb-0.10.orig/firmware/afskfirmware/main.lnk0100644000175100017510000000014707325134422020343 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/firmware/audiofirmware/0042755000175100017510000000000007340500002017055 5ustar abaababaycomusb-0.10.orig/firmware/audiofirmware/Makefile.in0100644000175100017510000001402007340500002021112 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/audiofirmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/audiofirmware/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 = firmware/audiofirmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/audiofirmware/main.rel: $(top_srcdir)/firmware/audiofirmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/audiofirmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/audiofirmware/main.ihx: $(top_srcdir)/firmware/audiofirmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/audiofirmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/audiofirmware/Makefile.am0100644000175100017510000000100107325134422021110 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/audiofirmware/main.rel: $(top_srcdir)/firmware/audiofirmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/audiofirmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/audiofirmware/main.ihx $(top_srcdir)/firmware/audiofirmware/main.ihx: $(top_srcdir)/firmware/audiofirmware/main.rel cd $(top_srcdir)/firmware/audiofirmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk baycomusb-0.10.orig/firmware/audiofirmware/main.ihx0100644000175100017510000003014607337536151020536 0ustar abaaba:06000000020E0702016D73 :03000B0002018E61 :030013000201AF38 :03001B000201D00F :030023000201F1E6 :03002B0002022F9F :0300330002025076 :03003B000202714D :03004300020100B7 :03004B000202941A :030053000202B9ED :03005B000202DEC0 :0300630002030392 :0200E000080115 :0900F00030303030303030300087 :03010000020324D3 :030104000207D21D :0301080002091CCD :03010C000209479E :030110000209726F :0101140032B8 :0301180002099D3C :03011C000209D8FD :03012000020A6E62 :03012400020A9C30 :03012800020AC701 :03012C00020AF2D2 :03013000020B1DA2 :03013400020B4873 :03013800020B7344 :03013C00020B9E15 :03014000020BC9E6 :03014400020BF4B7 :03014800020C1F87 :03014C00020C4A58 :03015000020C7529 :03015400020CA0FA :080E07007581C0E4F5D0F58609 :060E0F00E4F544F545F591 :040E15004CF55EF545 :0C0E19005DF586D209758E307589217553 :0E0E25008855758D647587007400907FF8F015 :0E0E33007404907FF0F0907FA1E4F0907FAF08 :0E0E41007401F07401907FE0F0907FE1F0907A :0E0E4F007FDD7489F0907FDE7403F0907FDF0A :0E0E5D007401F0907FD77412F07432F07402BA :0E0E6B00F07422F0907F937400F0907F9674E4 :0E0E790082F0907F9C74C2F0907F947400F021 :0D0E8700907F9D7400F0907F9574C3F090F3 :0E0E94007F987428F0907F9E742AF075A892C3 :0E0EA20075E801907FAE7401F0907FAC740390 :0E0EB000F0907FAD7401F075985275200078B7 :070EBE00E1E2A2E0920892BC :0D0EC5000190C008E520F090C00C74FFF013 :0C0ED200F56090C00DE4F0F56190C00ADE :080EDE00741FF0F55F78F0903D :0E0EE6000DE7E26006F0A3A30880F7E82411F0 :060EF40025E0900DE5F081 :0C0EFA0075488078E0E2B40202804EB43B :0E0F06000302804924F8500B24F04003E280DF :0E0F140006741880027408FA7B117CC07D5DA3 :0E0F22007E00C3EE9A4001FEB3EC33FCED33CB :0E0F3000FDEE33FEDBEEECC39402FCED94000C :0E0F3E00FD90C002F0EC90C001F0C39408F5E5 :080F4C0046ED9400F547EAF5BB :060F540049900D6BF090C6 :0C0F5A000D9FF075F0E8A4900D64F0907D :0D0F66000D98F0ABF0E54975F003A42B9059 :0B0F73000D65F0900D99F0E435F09052 :070F7E000D66F0900D9AF0E2 :0C0F8500E4F56278637A04F608DAFC9068 :0E0F9100D120A3E582458370F9907FD6740AC3 :0E0F9F00F07A1E90E890A3E582458370F9DA9F :0A0FAD00F4907FD67406F0120A13C8 :0E0FB700907FD8E0FAE0B5020280FA90C00107 :0E0FC500E024FC543F6007FA90C000E0DAFD23 :0E0FD30090C002E024FC543F60F6FA90C0008B :040FE100E4F0DAFD61 :0D0FE500907FAB7402F0907FAE7403F012A9 :050FF2000A1302015783 :07015700E54CA2E0920092CA :05015E0002B3820892CB :0A0163000190C008E520F0020157EA :0E016D00C0E0C0F0C082C083C0D075D000C01A :0E017B0086758600C289D086D0D0D083D0820F :05018900D0F0D0E032CF :0E018E00C0E0C0F0C082C083C0D075D000C0F9 :0E019C0086758600C28DD086D0D0D083D082EA :0501AA00D0F0D0E032AE :0E01AF00C0E0C0F0C082C083C0D075D000C0D8 :0E01BD0086758600C28BD086D0D0D083D082CB :0501CB00D0F0D0E0328D :0E01D000C0E0C0F0C082C083C0D075D000C0B7 :0E01DE0086758600C28FD086D0D0D083D082A6 :0501EC00D0F0D0E0326C :0E01F100C0E0C0F0C082C083C0D075D000C096 :0E01FF0086758600C00010981610990FD0006B :0E020D00D086D0D0D083D082D0F0D0E032D2D4 :06021B000980EAE55D2404 :0B0221004DF8E599F6E55D04540FF57B :03022C005D80DC16 :0E022F00C0E0C0F0C082C083C0D075D000C057 :0E023D0086758600C2CFD086D0D0D083D08206 :05024B00D0F0D0E0320C :0E025000C0E0C0F0C082C083C0D075D000C036 :0E025E0086758600C2DCD086D0D0D083D082D8 :05026C00D0F0D0E032EB :0E027100C0E0C0F0C082C083C0D075D000C015 :0E027F0086758600C2C0C2C1D086D0D0D083A2 :07028D00D082D0F0D0E03276 :0E029400C0E0C0F0C082C083C0D075D000C0F2 :0E02A20086758600E591C2E5F591D086D0D034 :0902B000D083D082D0F0D0E032FE :0E02B900C0E0C0F0C082C083C0D075D000C0CD :0E02C70086758600E591C2E6F591D086D0D00E :0902D500D083D082D0F0D0E032D9 :0E02DE00C0E0C0F0C082C083C0D075D000C0A8 :0E02EC0086758600E591C2E7F591D086D0D0E8 :0902FA00D083D082D0F0D0E032B4 :0E030300C0E0C0F0C082C083C0D075D000C082 :0E03110086758600C2DBD086D0D0D083D08225 :05031F00D0F0D0E03237 :0E032400C0E0C0F0C082C083C084C085C0D0DD :0E03320075D000C086758600C000C007E5913A :0D034000C2E4F591907FAB7401F0754000B0 :0E034D00907FE9E0B40659907FE8E0B4804F5D :0D035B00907FEBE0B4010C907FD4740CF0A7 :06036800A374CBF0803904 :0D036E00B40212907FEAE07033907FD474E7 :08037B000CF0A374DDF08024F6 :0E038300B40324907FEAE024FC401CE025E057 :0C03910024ABF582E4340DF583E0F5F0B8 :0A039D00A3E0907FD4F0A3E5F0F098 :0303A7000207B793 :0303AA000207B394 :0E03AD00B40941907FE8E070F4907FEAE0240C :0603BB00FE40ECE0F562DB :0E03C100907FD77807E84410F04430F0E8F061 :0E03CF004420F0D8F2E4F07402907FB6780774 :0E03DD00F0A3A3D8FB907FC67807F0A3A3D8A7 :0603EB00FB120A1380B6AC :0D03F100B40B1E907FE8E0B401AFE562B4EC :0D03FE0001AA907FECE024FC40A22467F8E7 :07040B00907FEAE0F680AFEC :0D041200B40A24907FE8E0B4818EE562B466 :0D041F000189907FECE024FC40812467F807 :01042C00E6E9 :0C042D00907F00F0907FB57401F0804ECD :0D043900B4080B907FE8E0B48047E56280D6 :01044600E6CF :0B0447007044907FE8E0B48011740165 :0E045200907F00F0A3E4F0907FB57402F0807C :010460002675 :06046100B48103E480EB0E :0E046700B48220907FECE0907FC430E70390D9 :0E0475007FB4540F600F20E30C25E02582F5C4 :0404830082E080CBC8 :030487000207B7B2 :03048A000207B3B3 :08048D00B4030575F0018006BF :06049500B4014475F00003 :0E049B00907FE8E0B402E8A3A3E070E3A3E0E2 :0E04A90070DFA3E0907FC430E705907FB4447D :0E04B7001020E3CF541F0586907FD7F044201D :0E04C500F0540FF0158625E02582F582E5F053 :0304D300F080B105 :0304D60002056EAE :0304D9000207B364 :0D04DC00B4C0F7907FE8E0B4C0F3E54CF544 :0E04E900F0A2E092F290C009E0A2E0B392F31C :0D04F700A20992F5E4907F04F0907F00E5EB :0E050400F0F0E4907F01F0907F02F090C004D0 :0C051200E0907F03F00544E544907F0575 :0E051E00F0E4A3F0A3F0A3F0A3F0A3F0A3F089 :0D052C00A3F0A3F0A3F0A3F0A3F0A3F090C0 :0E053900C001E0907F12F090C002E0907F13AE :0E054700F0E520A3F090C009E0907F15F09041 :0E0555007FC8E0907F16F0907FEEE024E95022 :0B05630001E42417907FB5F00207B7F9 :0D056E00B4C819907FE8E0B4C00F74049089 :0C057B007F00F0907FB57401F00207B71C :030587000207B3B5 :0E058A00B4C921907FE8E0B4C017907F0078DC :0D059800F0E26005F008A380F8E824109060 :0605A5007FB5F00207B76C :0305AB000207B391 :0E05AE00B4D045907FE8E0B4C03B907FECE015 :0B05BC00B40108907FEAE05401F54C08 :0D05C700907F00E54CF090C009E054016405 :0E05D40001907F01F090C004E0907F02F09053 :0E05E2007FEEE024FD5001E42403907FB5F08D :0305F0000207B748 :0305F3000207B349 :0E05F600B4D220907FE8E0B44016907FEAE097 :0E060400F5F0907F98E0A2F092E3A2F192E56B :04061200F00207B734 :030616000207B325 :0E061900B4D316907FE8E0B44007907FEAE08B :03062700100903B4 :03062A000207B311 :05062D00F5990207B77A :0E063200B4D449907FE8E0B4C03F907FECE084 :0D064000907FEAB40109E090C00DF0F56173 :0D064D00800AB40207E090C00CF0F5609048 :0C065A00C00EE0907F00F0E561A3F0E529 :0D06660060A3F0907FEEE024FD5001E4243D :0806730003907FB5F00207B708 :03067B000207B3C0 :0E067E00B4D53F907FE8E0B4C032907FECE04E :0D068C00B4010A907FEAE090C00AF0F55F2B :0C06990090C00BE0907F00F0E55FA390A4 :0E06A5007F01F0907FEEE024FE5001E424027D :0706B300907FB5F00207B7CC :0306BA000207B381 :0306BD00020753DE :0E06C000B4E0FA907FE8E0B4C0F0907FECE088 :0E06CE00B40112907FEAE05478C5205407452D :0E06DC0020F52090C008F0907FEEE0600DB495 :0D06EA000111E520907F00547FF074019015 :0D06F7007FB5F00207B790C008D207E520DC :0E070400F090C005E0907F04F090C006E090F9 :0E0712007F05F090C007E0907F06F090C008D1 :0D072000C207E520F0907F00F090C005E0DA :0D072D00907F01F090C006E0907F02F090F8 :0E073A00C007E0907F03F0907FEEE024F950BE :0B07480001E42407907FB5F00207B722 :0E075300B4E13A907FE8E0B4C030907F00E55A :0807610045F0A3E549F0A3E512 :0807690046F0A3E547F0A3E50B :0807710048F0A3E54AF0A3E5FE :0D0779004BF0907FEEE024F95001E42407DE :07078600907FB5F00207B7F8 :03078D000207B3AD :0E079000B4E220907FE8E0B4C016907F0078BD :0C079E0080AF49E6F008A3DFFA907FB5B9 :0607AA00E549F00207B76B :0307B0000207B38A :0407B3007403800249 :0207B7007402CA :0407B900907FB4F089 :0E07BD00D007D000D086D0D0D085D084D08395 :0707CB00D082D0F0D0E03233 :0E07D200C0E0C0F0C082C083C084C085C0D02B :0E07E00075D000C086758600C002C003C00040 :0D07EE00E591C2E4F591907FAB7402F00537 :0C07FB0045E549B40214907FD8E0A30546 :0E08070086907F68F01586E00586F0020905F0 :0E081500B40336907FA0E020E023907F70E0D7 :0E082300701D907F71E0B40316FA907F60059F :0E08310086907F681586E00586F01586DAF859 :0D083F000209057A03907F68E4F0DAFD02FB :02084C0009059C :0C084E0090C001E0C39549E04002E5497C :0E085A00FAFB601290C0000586907F6815863C :0D086800E00586F01586DAF8E549C39B60CF :0E08750008FA907F68E4F0DAFD90C001E0F52B :0C0883004A24FC60053395E0D2E0FB2520 :06088F00486002F548E597 :0C0895004803030303540F2B2546FAE52B :0D08A10047340090C002F0EA90C001F090D2 :0D08AE007FA0E020E039907F70E070339073 :0D08BB007F71E0C39549702A90C002E0F5FE :0508C8004BC39549E55A :0C08CD004B4002E5496017FA907F60057F :0D08D9008690C00015867880E00586F01539 :0D08E60086F608DAF6801890C002E0F54BA7 :0D08F30024FC543F600CFA90C000E47880B3 :05090000F0F608DAFB2F :0E090500D000D003D002D086D0D0D085D084D0 :09091300D083D082D0F0D0E03294 :0E091C00C0E0C0F0C082C083C0D075D000C063 :0E092A0086758600E591C2E4F591907FAB746E :0E09380004F0D086D0D0D083D082D0F0D0E0B2 :01094600327E :0E094700C0E0C0F0C082C083C0D075D000C038 :0E09550086758600E591C2E4F591907FAB7443 :0E09630008F0D086D0D0D083D082D0F0D0E083 :010971003253 :0E097200C0E0C0F0C082C083C0D075D000C00D :0E09800086758600E591C2E4F591907FAB7418 :0E098E0010F0D086D0D0D083D082D0F0D0E050 :01099C003228 :0E099D00C0E0C0F0C082C083C084C085C0D05E :0E09AB0075D000C086758600C000C007E591BB :0E09B900C2E4F591907FA97401F0D007D00040 :0E09C700D086D0D0D085D084D083D082D0F01E :0309D500D0E0323D :0E09D800C0E0C0F0C082C083C084C085C0D023 :0E09E60075D000C086758600C000C006E59181 :0E09F400C2E4F591907FAA7401F0D006D00005 :0E0A0200D086D0D0D085D084D083D082D0F0E2 :030A1000D0E03201 :0D0A1300E54CF5F0A2E092F290C009E0A2DF :0D0A2000E092F3A20992F5907E80E5F0F0DF :0D0A2D00E545907E81F0907FE0E0907E82B4 :0C0A3A00F090C004E0907E83F00544E5DD :0C0A460044907E84F075F005907E85E5FC :0C0A52005EB55D07907FB7E5F0F0222450 :0C0A5E004DF8E6F0A305F0E55E04540F2F :040A6A00F55E80E3D2 :0E0A6E00C0E0C0F0C082C083C0D075D000C010 :0E0A7C0086758600E591C2E4F591907FA9741D :0E0A8A0002F0120A13D086D0D0D083D082D0D2 :040A9800F0D0E03288 :0E0A9C00C0E0C0F0C082C083C0D075D000C0E2 :0E0AAA0086758600E591C2E4F591907FAA74EE :0E0AB80002F0D086D0D0D083D082D0F0D0E033 :010AC60032FD :0E0AC700C0E0C0F0C082C083C0D075D000C0B7 :0E0AD50086758600E591C2E4F591907FA974C4 :0E0AE30004F0D086D0D0D083D082D0F0D0E006 :010AF10032D2 :0E0AF200C0E0C0F0C082C083C0D075D000C08C :0E0B000086758600E591C2E4F591907FAA7497 :0E0B0E0004F0D086D0D0D083D082D0F0D0E0DA :010B1C0032A6 :0E0B1D00C0E0C0F0C082C083C0D075D000C060 :0E0B2B0086758600E591C2E4F591907FA9746D :0E0B390008F0D086D0D0D083D082D0F0D0E0AB :010B4700327B :0E0B4800C0E0C0F0C082C083C0D075D000C035 :0E0B560086758600E591C2E4F591907FAA7441 :0E0B640008F0D086D0D0D083D082D0F0D0E080 :010B72003250 :0E0B7300C0E0C0F0C082C083C0D075D000C00A :0E0B810086758600E591C2E4F591907FA97417 :0E0B8F0010F0D086D0D0D083D082D0F0D0E04D :010B9D003225 :0E0B9E00C0E0C0F0C082C083C0D075D000C0DF :0E0BAC0086758600E591C2E4F591907FAA74EB :0E0BBA0010F0D086D0D0D083D082D0F0D0E022 :010BC80032FA :0E0BC900C0E0C0F0C082C083C0D075D000C0B4 :0E0BD70086758600E591C2E4F591907FA974C1 :0E0BE50020F0D086D0D0D083D082D0F0D0E0E7 :010BF30032CF :0E0BF400C0E0C0F0C082C083C0D075D000C089 :0E0C020086758600E591C2E4F591907FAA7494 :0E0C100020F0D086D0D0D083D082D0F0D0E0BB :010C1E0032A3 :0E0C1F00C0E0C0F0C082C083C0D075D000C05D :0E0C2D0086758600E591C2E4F591907FA9746A :0E0C3B0040F0D086D0D0D083D082D0F0D0E070 :010C49003278 :0E0C4A00C0E0C0F0C082C083C0D075D000C032 :0E0C580086758600E591C2E4F591907FAA743E :0E0C660040F0D086D0D0D083D082D0F0D0E045 :010C7400324D :0E0C7500C0E0C0F0C082C083C0D075D000C007 :0E0C830086758600E591C2E4F591907FA97414 :0E0C910080F0D086D0D0D083D082D0F0D0E0DA :010C9F003222 :0E0CA000C0E0C0F0C082C083C0D075D000C0DC :0E0CAE0086758600E591C2E4F591907FAA74E8 :0E0CBC0080F0D086D0D0D083D082D0F0D0E0AF :010CCA0032F7 :0E0CCB001201000100000040C0BA37610100B4 :040CD9000102030110 :0E0CDD000902CE0004010040000904000001DD :0E0CEB00FF00FF000705810240000009040021 :0E0CF9000101FF00FF0007058103400008090C :080D07000401000001010000DD :0E0D0F000A2401000134000202030C24020138 :0E0D1D00100700010000000009240302110766 :0E0D2B000003000C240203010100010000007F :0E0D3900000924030401010001000904020066 :0E0D4700000102000009040201010102000087 :0E0D5500072401040101000B24020101010822 :010D6300018E :070D640000000009058801F1 :0E0D6B0002000100000725010000000009043D :0E0D7900030000010200000904030101010251 :0E0D87000000072401030101000B24020101FA :030D950001080151 :070D9800000000090508013D :0C0D9F0002000100000725010000000018 :020DAB00B30D86 :020DAD00B70D80 :020DAF00C50D70 :020DB100E50D4E :040DB3000403000035 :0E0DB7000E0342006100790063006F006D00C2 :0E0DC500200355005300420046004C0045003C :0E0DD3005800200028004100750064006900EF :040DE1006F00290076 :0E0DE5000203000000000000000000000000FB :0E0DF3000000000000000000000000000000F2 :060E0100000000000000EB :00000001FF baycomusb-0.10.orig/firmware/audiofirmware/main.rel0100644000175100017510000006441507337536151020536 0ustar abaabaXH H A areas 1 global symbols M main A _CODE size 0 flags 0 A CODE size 157 flags 20 A CSEG size CB0 flags 20 S fillusbintr Def08BC A GSINIT size 8 flags 20 A GSINIT2 size 1E8 flags 20 A OSEG size 0 flags 4 A BSEG size A flags 80 A ISEG size 80 flags 0 A DSEG size 27 flags 0 A XSEG size 1 flags 0 T 00 00 02 00 00 02 00 16 R 00 00 00 01 00 03 00 03 00 06 00 02 T 00 06 R 00 00 00 01 T 00 0B 02 00 37 R 00 00 00 01 00 03 00 02 T 00 0E R 00 00 00 01 T 00 13 02 00 58 R 00 00 00 01 00 03 00 02 T 00 16 R 00 00 00 01 T 00 1B 02 00 79 R 00 00 00 01 00 03 00 02 T 00 1E R 00 00 00 01 T 00 23 02 00 9A R 00 00 00 01 00 03 00 02 T 00 26 R 00 00 00 01 T 00 2B 02 00 D8 R 00 00 00 01 00 03 00 02 T 00 2E R 00 00 00 01 T 00 33 02 00 F9 R 00 00 00 01 00 03 00 02 T 00 36 R 00 00 00 01 T 00 3B 02 01 1A R 00 00 00 01 00 03 00 02 T 00 3E R 00 00 00 01 T 00 43 02 01 00 R 00 00 00 01 00 03 00 01 T 00 46 R 00 00 00 01 T 00 4B 02 01 3D R 00 00 00 01 00 03 00 02 T 00 4E R 00 00 00 01 T 00 53 02 01 62 R 00 00 00 01 00 03 00 02 T 00 56 R 00 00 00 01 T 00 5B 02 01 87 R 00 00 00 01 00 03 00 02 T 00 5E R 00 00 00 01 T 00 63 02 01 AC R 00 00 00 01 00 03 00 02 T 00 66 R 00 00 00 01 T 00 E0 08 01 R 00 00 00 01 T 00 E2 R 00 00 00 01 T 00 F0 R 00 00 00 01 T 00 F0 30 30 30 30 30 30 30 30 00 R 00 00 00 01 T 00 F9 R 00 00 00 01 T 01 00 R 00 00 00 01 T 01 00 02 01 CD R 00 00 00 01 00 03 00 02 T 01 03 R 00 00 00 01 T 01 04 02 06 7B R 00 00 00 01 00 03 00 02 T 01 07 R 00 00 00 01 T 01 08 02 07 C5 R 00 00 00 01 00 03 00 02 T 01 0B R 00 00 00 01 T 01 0C 02 07 F0 R 00 00 00 01 00 03 00 02 T 01 0F R 00 00 00 01 T 01 10 02 08 1B R 00 00 00 01 00 03 00 02 T 01 13 R 00 00 00 01 T 01 14 32 R 00 00 00 01 T 01 15 R 00 00 00 01 T 01 18 02 08 46 R 00 00 00 01 00 03 00 02 T 01 1B R 00 00 00 01 T 01 1C 02 08 81 R 00 00 00 01 00 03 00 02 T 01 1F R 00 00 00 01 T 01 20 02 09 17 R 00 00 00 01 00 03 00 02 T 01 23 R 00 00 00 01 T 01 24 02 09 45 R 00 00 00 01 00 03 00 02 T 01 27 R 00 00 00 01 T 01 28 02 09 70 R 00 00 00 01 00 03 00 02 T 01 2B R 00 00 00 01 T 01 2C 02 09 9B R 00 00 00 01 00 03 00 02 T 01 2F R 00 00 00 01 T 01 30 02 09 C6 R 00 00 00 01 00 03 00 02 T 01 33 R 00 00 00 01 T 01 34 02 09 F1 R 00 00 00 01 00 03 00 02 T 01 37 R 00 00 00 01 T 01 38 02 0A 1C R 00 00 00 01 00 03 00 02 T 01 3B R 00 00 00 01 T 01 3C 02 0A 47 R 00 00 00 01 00 03 00 02 T 01 3F R 00 00 00 01 T 01 40 02 0A 72 R 00 00 00 01 00 03 00 02 T 01 43 R 00 00 00 01 T 01 44 02 0A 9D R 00 00 00 01 00 03 00 02 T 01 47 R 00 00 00 01 T 01 48 02 0A C8 R 00 00 00 01 00 03 00 02 T 01 4B R 00 00 00 01 T 01 4C 02 0A F3 R 00 00 00 01 00 03 00 02 T 01 4F R 00 00 00 01 T 01 50 02 0B 1E R 00 00 00 01 00 03 00 02 T 01 53 R 00 00 00 01 T 01 54 02 0B 49 R 00 00 00 01 00 03 00 02 T 00 00 R 00 00 00 06 T 00 01 R 00 00 00 06 T 00 02 R 00 00 00 06 T 00 03 R 00 00 00 06 T 00 04 R 00 00 00 06 T 00 05 R 00 00 00 06 T 00 06 R 00 00 00 06 T 00 07 R 00 00 00 06 T 00 08 R 00 00 00 06 T 00 09 R 00 00 00 06 T 00 00 R 00 00 00 07 T 00 40 R 00 00 00 07 T 00 00 R 00 00 00 08 T 00 01 R 00 00 00 08 T 00 03 R 00 00 00 08 T 00 04 R 00 00 00 08 T 00 05 R 00 00 00 08 T 00 06 R 00 00 00 08 T 00 08 R 00 00 00 08 T 00 09 R 00 00 00 08 T 00 0A R 00 00 00 08 T 00 0B R 00 00 00 08 T 00 0C R 00 00 00 08 T 00 0D R 00 00 00 08 T 00 1D R 00 00 00 08 T 00 1E R 00 00 00 08 T 00 1F R 00 00 00 08 T 00 20 R 00 00 00 08 T 00 21 R 00 00 00 08 T 00 22 R 00 00 00 08 T 00 23 R 00 00 00 08 T 00 00 R 00 00 00 09 T 00 00 R 00 00 00 03 T 00 00 75 81 00 40 E4 F5 D0 F5 86 R 00 00 00 03 09 04 00 07 T 00 08 R 00 00 00 03 T 00 00 R 00 00 00 04 T 00 00 E4 F5 00 04 F5 00 05 F5 R 00 00 00 04 29 04 00 08 29 07 00 08 T 00 06 00 0C F5 00 1E F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 0A 00 1D F5 86 D2 00 09 75 8E 30 75 89 21 75 R 00 00 00 04 29 02 00 08 29 07 00 06 T 00 16 88 55 75 8D 64 75 87 00 74 00 90 7F F8 F0 R 00 00 00 04 T 00 24 74 04 90 7F F0 F0 90 7F A1 E4 F0 90 7F AF R 00 00 00 04 T 00 32 74 01 F0 74 01 90 7F E0 F0 90 7F E1 F0 90 R 00 00 00 04 T 00 40 7F DD 74 89 F0 90 7F DE 74 03 F0 90 7F DF R 00 00 00 04 T 00 4E 74 01 F0 90 7F D7 74 12 F0 74 32 F0 74 02 R 00 00 00 04 T 00 5C F0 74 22 F0 90 7F 93 74 00 F0 90 7F 96 74 R 00 00 00 04 T 00 6A 82 F0 90 7F 9C 74 C2 F0 90 7F 94 74 00 F0 R 00 00 00 04 T 00 78 90 7F 9D 74 00 F0 90 7F 95 74 C3 F0 90 R 00 00 00 04 T 00 85 7F 98 74 28 F0 90 7F 9E 74 2A F0 75 A8 92 R 00 00 00 04 T 00 93 75 E8 01 90 7F AE 74 01 F0 90 7F AC 74 03 R 00 00 00 04 T 00 A1 F0 90 7F AD 74 01 F0 75 98 52 75 20 00 78 R 00 00 00 04 T 00 AF 00 E1 E2 A2 E0 92 00 08 92 R 00 00 00 04 09 02 00 01 29 08 00 06 T 00 B6 00 01 90 C0 08 E5 20 F0 90 C0 0C 74 FF F0 R 00 00 00 04 29 02 00 06 T 00 C3 F5 00 20 90 C0 0D E4 F0 F5 00 21 90 C0 0A R 00 00 00 04 29 03 00 08 29 0B 00 08 T 00 CF 74 1F F0 F5 00 1F 78 00 F0 90 R 00 00 00 04 29 06 00 08 09 09 00 01 T 00 D7 0C 90 E2 60 06 F0 A3 A3 08 80 F7 E8 24 11 R 00 00 00 04 00 02 00 02 T 00 E5 25 E0 90 0C 8E F0 R 00 00 00 04 00 05 00 02 T 00 EB R 00 00 00 04 T 00 EB 75 00 08 80 78 00 E0 E2 B4 02 02 80 4E B4 R 00 00 00 04 29 03 00 08 09 07 00 01 T 00 F7 03 02 80 49 24 F8 50 0B 24 F0 40 03 E2 80 R 00 00 00 04 T 01 05 06 74 18 80 02 74 08 FA 7B 11 7C C0 7D 5D R 00 00 00 04 T 01 13 7E 00 C3 EE 9A 40 01 FE B3 EC 33 FC ED 33 R 00 00 00 04 T 01 21 FD EE 33 FE DB EE EC C3 94 02 FC ED 94 00 R 00 00 00 04 T 01 2F FD 90 C0 02 F0 EC 90 C0 01 F0 C3 94 08 F5 R 00 00 00 04 T 01 3D 00 06 ED 94 00 F5 00 07 EA F5 R 00 00 00 04 29 02 00 08 29 08 00 08 T 01 45 00 09 90 0C 14 F0 90 R 00 00 00 04 29 02 00 08 00 05 00 02 T 01 4B 0C 48 F0 75 F0 E8 A4 90 0C 0D F0 90 R 00 00 00 04 00 02 00 02 00 0A 00 02 T 01 57 0C 41 F0 AB F0 E5 00 09 75 F0 03 A4 2B 90 R 00 00 00 04 00 02 00 02 29 08 00 08 T 01 64 0C 0E F0 90 0C 42 F0 E4 35 F0 90 R 00 00 00 04 00 02 00 02 00 06 00 02 T 01 6F 0C 0F F0 90 0C 43 F0 R 00 00 00 04 00 02 00 02 00 06 00 02 T 01 76 R 00 00 00 04 T 01 76 E4 F5 00 22 78 00 23 7A 04 F6 08 DA FC 90 R 00 00 00 04 29 04 00 08 09 07 00 08 T 01 82 D1 20 A3 E5 82 45 83 70 F9 90 7F D6 74 0A R 00 00 00 04 T 01 90 F0 7A 1E 90 E8 90 A3 E5 82 45 83 70 F9 DA R 00 00 00 04 T 01 9E F4 90 7F D6 74 06 F0 12 08 BC R 00 00 00 04 00 0A 00 02 T 01 A8 R 00 00 00 04 T 01 A8 90 7F D8 E0 FA E0 B5 02 02 80 FA 90 C0 01 R 00 00 00 04 T 01 B6 E0 24 FC 54 3F 60 07 FA 90 C0 00 E0 DA FD R 00 00 00 04 T 01 C4 90 C0 02 E0 24 FC 54 3F 60 F6 FA 90 C0 00 R 00 00 00 04 T 01 D2 E4 F0 DA FD R 00 00 00 04 T 01 D6 R 00 00 00 04 T 01 D6 90 7F AB 74 02 F0 90 7F AE 74 03 F0 12 R 00 00 00 04 T 01 E3 08 BC 02 00 00 R 00 00 00 04 00 02 00 02 00 05 00 02 T 00 00 R 00 00 00 02 T 00 00 E5 00 0C A2 E0 92 00 00 92 R 00 00 00 02 29 03 00 08 29 08 00 06 T 00 07 00 02 B3 82 00 08 92 R 00 00 00 02 29 02 00 06 29 06 00 06 T 00 0C 00 01 90 C0 08 E5 20 F0 02 00 00 R 00 00 00 02 29 02 00 06 00 0B 00 02 T 00 16 R 00 00 00 02 T 00 16 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 24 86 75 86 00 C2 89 D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 32 D0 F0 D0 E0 32 R 00 00 00 02 T 00 37 R 00 00 00 02 T 00 37 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 45 86 75 86 00 C2 8D D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 53 D0 F0 D0 E0 32 R 00 00 00 02 T 00 58 R 00 00 00 02 T 00 58 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 66 86 75 86 00 C2 8B D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 74 D0 F0 D0 E0 32 R 00 00 00 02 T 00 79 R 00 00 00 02 T 00 79 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 87 86 75 86 00 C2 8F D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 95 D0 F0 D0 E0 32 R 00 00 00 02 T 00 9A R 00 00 00 02 T 00 9A C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 A8 86 75 86 00 C0 00 10 98 16 10 99 0F D0 00 R 00 00 00 02 T 00 B6 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 32 D2 R 00 00 00 02 T 00 C4 00 09 80 EA E5 00 1D 24 R 00 00 00 02 29 02 00 06 29 07 00 08 T 00 CA 00 0D F8 E5 99 F6 E5 00 1D 04 54 0F F5 R 00 00 00 02 09 02 00 08 29 09 00 08 T 00 D5 00 1D 80 DC R 00 00 00 02 29 02 00 08 T 00 D8 R 00 00 00 02 T 00 D8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 E6 86 75 86 00 C2 CF D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 F4 D0 F0 D0 E0 32 R 00 00 00 02 T 00 F9 R 00 00 00 02 T 00 F9 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 07 86 75 86 00 C2 DC D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 15 D0 F0 D0 E0 32 R 00 00 00 02 T 01 1A R 00 00 00 02 T 01 1A C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 28 86 75 86 00 C2 C0 C2 C1 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 36 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 3D R 00 00 00 02 T 01 3D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 4B 86 75 86 00 E5 91 C2 E5 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 59 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 62 R 00 00 00 02 T 01 62 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 70 86 75 86 00 E5 91 C2 E6 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 7E D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 87 R 00 00 00 02 T 01 87 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 95 86 75 86 00 E5 91 C2 E7 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 A3 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 AC R 00 00 00 02 T 01 AC C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 BA 86 75 86 00 C2 DB D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 C8 D0 F0 D0 E0 32 R 00 00 00 02 T 01 CD R 00 00 00 02 T 01 CD C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 01 DB 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 01 E9 C2 E4 F5 91 90 7F AB 74 01 F0 75 00 00 00 R 00 00 00 02 29 0D 00 08 T 01 F6 90 7F E9 E0 B4 06 59 90 7F E8 E0 B4 80 4F R 00 00 00 02 T 02 04 90 7F EB E0 B4 01 0C 90 7F D4 74 0B 74 F0 R 00 00 00 02 89 0D 00 02 T 02 11 A3 74 0B 74 F0 80 39 R 00 00 00 02 09 04 00 02 T 02 17 R 00 00 00 02 T 02 17 B4 02 12 90 7F EA E0 70 33 90 7F D4 74 R 00 00 00 02 T 02 24 0B 86 F0 A3 74 0B 86 F0 80 24 R 00 00 00 02 89 02 00 02 09 07 00 02 T 02 2C R 00 00 00 02 T 02 2C B4 03 24 90 7F EA E0 24 FC 40 1C E0 25 E0 R 00 00 00 02 T 02 3A 24 0C 54 F5 82 E4 34 0C 54 F5 83 E0 F5 F0 R 00 00 00 02 09 03 00 02 89 09 00 02 T 02 46 A3 E0 90 7F D4 F0 A3 E5 F0 F0 R 00 00 00 02 T 02 50 R 00 00 00 02 T 02 50 02 06 60 R 00 00 00 02 00 03 00 02 T 02 53 R 00 00 00 02 T 02 53 02 06 5C R 00 00 00 02 00 03 00 02 T 02 56 R 00 00 00 02 T 02 56 B4 09 41 90 7F E8 E0 70 F4 90 7F EA E0 24 R 00 00 00 02 T 02 64 FE 40 EC E0 F5 00 22 R 00 00 00 02 29 07 00 08 T 02 6A R 00 00 00 02 T 02 6A 90 7F D7 78 07 E8 44 10 F0 44 30 F0 E8 F0 R 00 00 00 02 T 02 78 44 20 F0 D8 F2 E4 F0 74 02 90 7F B6 78 07 R 00 00 00 02 T 02 86 F0 A3 A3 D8 FB 90 7F C6 78 07 F0 A3 A3 D8 R 00 00 00 02 T 02 94 FB 12 08 BC 80 B6 R 00 00 00 02 00 04 00 02 T 02 9A R 00 00 00 02 T 02 9A B4 0B 1E 90 7F E8 E0 B4 01 AF E5 00 22 B4 R 00 00 00 02 29 0D 00 08 T 02 A7 01 AA 90 7F EC E0 24 FC 40 A2 24 00 27 F8 R 00 00 00 02 09 0D 00 08 T 02 B4 90 7F EA E0 F6 80 AF R 00 00 00 02 T 02 BB R 00 00 00 02 T 02 BB B4 0A 24 90 7F E8 E0 B4 81 8E E5 00 22 B4 R 00 00 00 02 29 0D 00 08 T 02 C8 01 89 90 7F EC E0 24 FC 40 81 24 00 27 F8 R 00 00 00 02 09 0D 00 08 T 02 D5 E6 R 00 00 00 02 T 02 D6 R 00 00 00 02 T 02 D6 90 7F 00 F0 90 7F B5 74 01 F0 80 4E R 00 00 00 02 T 02 E2 R 00 00 00 02 T 02 E2 B4 08 0B 90 7F E8 E0 B4 80 47 E5 00 22 80 R 00 00 00 02 29 0D 00 08 T 02 EF E6 R 00 00 00 02 T 02 F0 R 00 00 00 02 T 02 F0 70 44 90 7F E8 E0 B4 80 11 74 01 R 00 00 00 02 T 02 FB R 00 00 00 02 T 02 FB 90 7F 00 F0 A3 E4 F0 90 7F B5 74 02 F0 80 R 00 00 00 02 T 03 09 26 R 00 00 00 02 T 03 0A R 00 00 00 02 T 03 0A B4 81 03 E4 80 EB R 00 00 00 02 T 03 10 R 00 00 00 02 T 03 10 B4 82 20 90 7F EC E0 90 7F C4 30 E7 03 90 R 00 00 00 02 T 03 1E 7F B4 54 0F 60 0F 20 E3 0C 25 E0 25 82 F5 R 00 00 00 02 T 03 2C 82 E0 80 CB R 00 00 00 02 T 03 30 R 00 00 00 02 T 03 30 02 06 60 R 00 00 00 02 00 03 00 02 T 03 33 R 00 00 00 02 T 03 33 02 06 5C R 00 00 00 02 00 03 00 02 T 03 36 R 00 00 00 02 T 03 36 B4 03 05 75 F0 01 80 06 R 00 00 00 02 T 03 3E R 00 00 00 02 T 03 3E B4 01 44 75 F0 00 R 00 00 00 02 T 03 44 R 00 00 00 02 T 03 44 90 7F E8 E0 B4 02 E8 A3 A3 E0 70 E3 A3 E0 R 00 00 00 02 T 03 52 70 DF A3 E0 90 7F C4 30 E7 05 90 7F B4 44 R 00 00 00 02 T 03 60 10 20 E3 CF 54 1F 05 86 90 7F D7 F0 44 20 R 00 00 00 02 T 03 6E F0 54 0F F0 15 86 25 E0 25 82 F5 82 E5 F0 R 00 00 00 02 T 03 7C F0 80 B1 R 00 00 00 02 T 03 7F R 00 00 00 02 T 03 7F 02 04 17 R 00 00 00 02 00 03 00 02 T 03 82 R 00 00 00 02 T 03 82 02 06 5C R 00 00 00 02 00 03 00 02 T 03 85 R 00 00 00 02 T 03 85 B4 C0 F7 90 7F E8 E0 B4 C0 F3 E5 00 0C F5 R 00 00 00 02 29 0D 00 08 T 03 92 F0 A2 E0 92 F2 90 C0 09 E0 A2 E0 B3 92 F3 R 00 00 00 02 T 03 A0 A2 00 09 92 F5 E4 90 7F 04 F0 90 7F 00 E5 R 00 00 00 02 29 03 00 06 T 03 AD F0 F0 E4 90 7F 01 F0 90 7F 02 F0 90 C0 04 R 00 00 00 02 T 03 BB E0 90 7F 03 F0 05 00 04 E5 00 04 90 7F 05 R 00 00 00 02 29 08 00 08 29 0B 00 08 T 03 C7 F0 E4 A3 F0 A3 F0 A3 F0 A3 F0 A3 F0 A3 F0 R 00 00 00 02 T 03 D5 A3 F0 A3 F0 A3 F0 A3 F0 A3 F0 A3 F0 90 R 00 00 00 02 T 03 E2 C0 01 E0 90 7F 12 F0 90 C0 02 E0 90 7F 13 R 00 00 00 02 T 03 F0 F0 E5 20 A3 F0 90 C0 09 E0 90 7F 15 F0 90 R 00 00 00 02 T 03 FE 7F C8 E0 90 7F 16 F0 90 7F EE E0 24 E9 50 R 00 00 00 02 T 04 0C 01 E4 24 17 90 7F B5 F0 02 06 60 R 00 00 00 02 00 0B 00 02 T 04 17 R 00 00 00 02 T 04 17 B4 C8 19 90 7F E8 E0 B4 C0 0F 74 04 90 R 00 00 00 02 T 04 24 7F 00 F0 90 7F B5 74 01 F0 02 06 60 R 00 00 00 02 00 0C 00 02 T 04 30 R 00 00 00 02 T 04 30 02 06 5C R 00 00 00 02 00 03 00 02 T 04 33 R 00 00 00 02 T 04 33 B4 C9 21 90 7F E8 E0 B4 C0 17 90 7F 00 78 R 00 00 00 02 T 04 41 00 F0 E2 60 05 F0 08 A3 80 F8 E8 24 10 90 R 00 00 00 02 09 02 00 01 T 04 4E 7F B5 F0 02 06 60 R 00 00 00 02 00 06 00 02 T 04 54 R 00 00 00 02 T 04 54 02 06 5C R 00 00 00 02 00 03 00 02 T 04 57 R 00 00 00 02 T 04 57 B4 D0 45 90 7F E8 E0 B4 C0 3B 90 7F EC E0 R 00 00 00 02 T 04 65 B4 01 08 90 7F EA E0 54 01 F5 00 0C R 00 00 00 02 29 0C 00 08 T 04 70 R 00 00 00 02 T 04 70 90 7F 00 E5 00 0C F0 90 C0 09 E0 54 01 64 R 00 00 00 02 29 06 00 08 T 04 7D 01 90 7F 01 F0 90 C0 04 E0 90 7F 02 F0 90 R 00 00 00 02 T 04 8B 7F EE E0 24 FD 50 01 E4 24 03 90 7F B5 F0 R 00 00 00 02 T 04 99 02 06 60 R 00 00 00 02 00 03 00 02 T 04 9C R 00 00 00 02 T 04 9C 02 06 5C R 00 00 00 02 00 03 00 02 T 04 9F R 00 00 00 02 T 04 9F B4 D2 20 90 7F E8 E0 B4 40 16 90 7F EA E0 R 00 00 00 02 T 04 AD F5 F0 90 7F 98 E0 A2 F0 92 E3 A2 F1 92 E5 R 00 00 00 02 T 04 BB F0 02 06 60 R 00 00 00 02 00 04 00 02 T 04 BF R 00 00 00 02 T 04 BF 02 06 5C R 00 00 00 02 00 03 00 02 T 04 C2 R 00 00 00 02 T 04 C2 B4 D3 16 90 7F E8 E0 B4 40 07 90 7F EA E0 R 00 00 00 02 T 04 D0 10 00 09 03 R 00 00 00 02 29 03 00 06 T 04 D3 R 00 00 00 02 T 04 D3 02 06 5C R 00 00 00 02 00 03 00 02 T 04 D6 R 00 00 00 02 T 04 D6 F5 99 02 06 60 R 00 00 00 02 00 05 00 02 T 04 DB R 00 00 00 02 T 04 DB B4 D4 49 90 7F E8 E0 B4 C0 3F 90 7F EC E0 R 00 00 00 02 T 04 E9 90 7F EA B4 01 09 E0 90 C0 0D F0 F5 00 21 R 00 00 00 02 29 0E 00 08 T 04 F6 80 0A B4 02 07 E0 90 C0 0C F0 F5 00 20 90 R 00 00 00 02 29 0D 00 08 T 05 03 C0 0E E0 90 7F 00 F0 E5 00 21 A3 F0 E5 R 00 00 00 02 29 0A 00 08 T 05 0F 00 20 A3 F0 90 7F EE E0 24 FD 50 01 E4 24 R 00 00 00 02 29 02 00 08 T 05 1C 03 90 7F B5 F0 02 06 60 R 00 00 00 02 00 08 00 02 T 05 24 R 00 00 00 02 T 05 24 02 06 5C R 00 00 00 02 00 03 00 02 T 05 27 R 00 00 00 02 T 05 27 B4 D5 3F 90 7F E8 E0 B4 C0 32 90 7F EC E0 R 00 00 00 02 T 05 35 B4 01 0A 90 7F EA E0 90 C0 0A F0 F5 00 1F R 00 00 00 02 29 0E 00 08 T 05 42 90 C0 0B E0 90 7F 00 F0 E5 00 1F A3 90 R 00 00 00 02 29 0B 00 08 T 05 4E 7F 01 F0 90 7F EE E0 24 FE 50 01 E4 24 02 R 00 00 00 02 T 05 5C 90 7F B5 F0 02 06 60 R 00 00 00 02 00 07 00 02 T 05 63 R 00 00 00 02 T 05 63 R 00 00 00 02 T 05 63 02 06 5C R 00 00 00 02 00 03 00 02 T 05 66 R 00 00 00 02 T 05 66 02 05 FC R 00 00 00 02 00 03 00 02 T 05 69 R 00 00 00 02 T 05 69 B4 E0 FA 90 7F E8 E0 B4 C0 F0 90 7F EC E0 R 00 00 00 02 T 05 77 B4 01 12 90 7F EA E0 54 78 C5 20 54 07 45 R 00 00 00 02 T 05 85 20 F5 20 90 C0 08 F0 90 7F EE E0 60 0D B4 R 00 00 00 02 T 05 93 01 11 E5 20 90 7F 00 54 7F F0 74 01 90 R 00 00 00 02 T 05 A0 7F B5 F0 02 06 60 90 C0 08 D2 00 07 E5 20 R 00 00 00 02 00 06 00 02 29 0C 00 06 T 05 AD F0 90 C0 05 E0 90 7F 04 F0 90 C0 06 E0 90 R 00 00 00 02 T 05 BB 7F 05 F0 90 C0 07 E0 90 7F 06 F0 90 C0 08 R 00 00 00 02 T 05 C9 C2 00 07 E5 20 F0 90 7F 00 F0 90 C0 05 E0 R 00 00 00 02 29 03 00 06 T 05 D6 90 7F 01 F0 90 C0 06 E0 90 7F 02 F0 90 R 00 00 00 02 T 05 E3 C0 07 E0 90 7F 03 F0 90 7F EE E0 24 F9 50 R 00 00 00 02 T 05 F1 01 E4 24 07 90 7F B5 F0 02 06 60 R 00 00 00 02 00 0B 00 02 T 05 FC R 00 00 00 02 T 05 FC B4 E1 3A 90 7F E8 E0 B4 C0 30 90 7F 00 E5 R 00 00 00 02 T 06 0A 00 05 F0 A3 E5 00 09 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 12 00 06 F0 A3 E5 00 07 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 1A 00 08 F0 A3 E5 00 0A F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 22 00 0B F0 90 7F EE E0 24 F9 50 01 E4 24 07 R 00 00 00 02 29 02 00 08 T 06 2F 90 7F B5 F0 02 06 60 R 00 00 00 02 00 07 00 02 T 06 36 R 00 00 00 02 T 06 36 02 06 5C R 00 00 00 02 00 03 00 02 T 06 39 R 00 00 00 02 T 06 39 B4 E2 20 90 7F E8 E0 B4 C0 16 90 7F 00 78 R 00 00 00 02 T 06 47 00 00 AF 00 09 E6 F0 08 A3 DF FA 90 7F B5 R 00 00 00 02 09 02 00 07 29 05 00 08 T 06 53 E5 00 09 F0 02 06 60 R 00 00 00 02 29 03 00 08 00 07 00 02 T 06 59 R 00 00 00 02 T 06 59 02 06 5C R 00 00 00 02 00 03 00 02 T 06 5C R 00 00 00 02 T 06 5C R 00 00 00 02 T 06 5C 74 03 80 02 R 00 00 00 02 T 06 60 R 00 00 00 02 T 06 60 74 02 R 00 00 00 02 T 06 62 R 00 00 00 02 T 06 62 90 7F B4 F0 R 00 00 00 02 T 06 66 R 00 00 00 02 T 06 66 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 06 74 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 06 7B R 00 00 00 02 T 06 7B C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 06 89 75 D0 00 C0 86 75 86 00 C0 02 C0 03 C0 00 R 00 00 00 02 T 06 97 E5 91 C2 E4 F5 91 90 7F AB 74 02 F0 05 R 00 00 00 02 T 06 A4 00 05 E5 00 09 B4 02 14 90 7F D8 E0 A3 05 R 00 00 00 02 29 02 00 08 29 05 00 08 T 06 B0 86 90 7F 68 F0 15 86 E0 05 86 F0 02 07 AE R 00 00 00 02 00 0E 00 02 T 06 BE B4 03 36 90 7F A0 E0 20 E0 23 90 7F 70 E0 R 00 00 00 02 T 06 CC 70 1D 90 7F 71 E0 B4 03 16 FA 90 7F 60 05 R 00 00 00 02 T 06 DA 86 90 7F 68 15 86 E0 05 86 F0 15 86 DA F8 R 00 00 00 02 T 06 E8 02 07 AE 7A 03 90 7F 68 E4 F0 DA FD 02 R 00 00 00 02 00 03 00 02 T 06 F5 07 AE R 00 00 00 02 00 02 00 02 T 06 F7 R 00 00 00 02 T 06 F7 90 C0 01 E0 C3 95 00 09 E0 40 02 E5 00 09 R 00 00 00 02 29 08 00 08 29 0E 00 08 T 07 03 FA FB 60 12 90 C0 00 05 86 90 7F 68 15 86 R 00 00 00 02 T 07 11 E0 05 86 F0 15 86 DA F8 E5 00 09 C3 9B 60 R 00 00 00 02 29 0B 00 08 T 07 1E 08 FA 90 7F 68 E4 F0 DA FD 90 C0 01 E0 F5 R 00 00 00 02 T 07 2C 00 0A 24 FC 60 05 33 95 E0 D2 E0 FB 25 R 00 00 00 02 29 02 00 08 T 07 38 00 08 60 02 F5 00 08 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 07 3E 00 08 03 03 03 03 54 0F 2B 25 00 06 FA E5 R 00 00 00 02 29 02 00 08 29 0C 00 08 T 07 4A 00 07 34 00 90 C0 02 F0 EA 90 C0 01 F0 90 R 00 00 00 02 29 02 00 08 T 07 57 7F A0 E0 20 E0 39 90 7F 70 E0 70 33 90 R 00 00 00 02 T 07 64 7F 71 E0 C3 95 00 09 70 2A 90 C0 02 E0 F5 R 00 00 00 02 29 07 00 08 T 07 71 00 0B C3 95 00 09 E5 R 00 00 00 02 29 02 00 08 29 06 00 08 T 07 76 00 0B 40 02 E5 00 09 60 17 FA 90 7F 60 05 R 00 00 00 02 29 02 00 08 29 07 00 08 T 07 82 86 90 C0 00 15 86 78 00 00 E0 05 86 F0 15 R 00 00 00 02 09 09 00 07 T 07 8F 86 F6 08 DA F6 80 18 90 C0 02 E0 F5 00 0B R 00 00 00 02 29 0E 00 08 T 07 9C 24 FC 54 3F 60 0C FA 90 C0 00 E4 78 00 00 R 00 00 00 02 09 0E 00 07 T 07 A9 F0 F6 08 DA FB R 00 00 00 02 T 07 AE R 00 00 00 02 T 07 AE D0 00 D0 03 D0 02 D0 86 D0 D0 D0 85 D0 84 R 00 00 00 02 T 07 BC D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 07 C5 R 00 00 00 02 T 07 C5 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 D3 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 07 E1 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 EF 32 R 00 00 00 02 T 07 F0 R 00 00 00 02 T 07 F0 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 FE 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 0C 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 1A 32 R 00 00 00 02 T 08 1B R 00 00 00 02 T 08 1B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 29 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 37 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 45 32 R 00 00 00 02 T 08 46 R 00 00 00 02 T 08 46 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 08 54 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 08 62 C2 E4 F5 91 90 7F A9 74 01 F0 D0 07 D0 00 R 00 00 00 02 T 08 70 D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 D0 F0 R 00 00 00 02 T 08 7E D0 E0 32 R 00 00 00 02 T 08 81 R 00 00 00 02 T 08 81 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 08 8F 75 D0 00 C0 86 75 86 00 C0 00 C0 06 E5 91 R 00 00 00 02 T 08 9D C2 E4 F5 91 90 7F AA 74 01 F0 D0 06 D0 00 R 00 00 00 02 T 08 AB D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 D0 F0 R 00 00 00 02 T 08 B9 D0 E0 32 R 00 00 00 02 T 08 BC R 00 00 00 02 T 08 BC E5 00 0C F5 F0 A2 E0 92 F2 90 C0 09 E0 A2 R 00 00 00 02 29 03 00 08 T 08 C9 E0 92 F3 A2 00 09 92 F5 90 7E 80 E5 F0 F0 R 00 00 00 02 29 06 00 06 T 08 D6 E5 00 05 90 7E 81 F0 90 7F E0 E0 90 7E 82 R 00 00 00 02 29 03 00 08 T 08 E3 F0 90 C0 04 E0 90 7E 83 F0 05 00 04 E5 R 00 00 00 02 29 0C 00 08 T 08 EF 00 04 90 7E 84 F0 75 F0 05 90 7E 85 E5 R 00 00 00 02 29 02 00 08 T 08 FB 00 1E B5 00 1D 07 90 7F B7 E5 F0 F0 22 24 R 00 00 00 02 29 02 00 08 29 05 00 08 T 09 07 00 0D F8 E6 F0 A3 05 F0 E5 00 1E 04 54 0F R 00 00 00 02 09 02 00 08 29 0B 00 08 T 09 13 F5 00 1E 80 E3 R 00 00 00 02 29 03 00 08 T 09 17 R 00 00 00 02 T 09 17 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 25 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 33 02 F0 12 08 BC D0 86 D0 D0 D0 83 D0 82 D0 R 00 00 00 02 00 05 00 02 T 09 41 F0 D0 E0 32 R 00 00 00 02 T 09 45 R 00 00 00 02 T 09 45 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 53 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 61 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 6F 32 R 00 00 00 02 T 09 70 R 00 00 00 02 T 09 70 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 7E 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 8C 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 9A 32 R 00 00 00 02 T 09 9B R 00 00 00 02 T 09 9B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 A9 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 B7 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 C5 32 R 00 00 00 02 T 09 C6 R 00 00 00 02 T 09 C6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 D4 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 E2 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 F0 32 R 00 00 00 02 T 09 F1 R 00 00 00 02 T 09 F1 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 FF 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A 0D 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 1B 32 R 00 00 00 02 T 0A 1C R 00 00 00 02 T 0A 1C C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 2A 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A 38 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 46 32 R 00 00 00 02 T 0A 47 R 00 00 00 02 T 0A 47 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 55 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A 63 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 71 32 R 00 00 00 02 T 0A 72 R 00 00 00 02 T 0A 72 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 80 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A 8E 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 9C 32 R 00 00 00 02 T 0A 9D R 00 00 00 02 T 0A 9D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A AB 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A B9 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A C7 32 R 00 00 00 02 T 0A C8 R 00 00 00 02 T 0A C8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A D6 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A E4 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A F2 32 R 00 00 00 02 T 0A F3 R 00 00 00 02 T 0A F3 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 01 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B 0F 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 1D 32 R 00 00 00 02 T 0B 1E R 00 00 00 02 T 0B 1E C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 2C 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0B 3A 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 48 32 R 00 00 00 02 T 0B 49 R 00 00 00 02 T 0B 49 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 57 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B 65 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 73 32 R 00 00 00 02 T 0B 74 R 00 00 00 02 T 0B 74 12 01 00 01 00 00 00 40 C0 BA 37 61 01 00 R 00 00 00 02 T 0B 82 01 02 03 01 R 00 00 00 02 T 0B 86 R 00 00 00 02 T 0B 86 09 02 CE 00 04 01 00 40 00 09 04 00 00 01 R 00 00 00 02 T 0B 94 FF 00 FF 00 07 05 81 02 40 00 00 09 04 00 R 00 00 00 02 T 0B A2 01 01 FF 00 FF 00 07 05 81 03 40 00 08 09 R 00 00 00 02 T 0B B0 04 01 00 00 01 01 00 00 R 00 00 00 02 T 0B B8 R 00 00 00 02 T 0B B8 0A 24 01 00 01 34 00 02 02 03 0C 24 02 01 R 00 00 00 02 T 0B C6 10 07 00 01 00 00 00 00 09 24 03 02 11 07 R 00 00 00 02 T 0B D4 00 03 00 0C 24 02 03 01 01 00 01 00 00 00 R 00 00 00 02 T 0B E2 00 09 24 03 04 01 01 00 01 00 09 04 02 00 R 00 00 00 02 T 0B F0 00 01 02 00 00 09 04 02 01 01 01 02 00 00 R 00 00 00 02 T 0B FE 07 24 01 04 01 01 00 0B 24 02 01 01 01 08 R 00 00 00 02 T 0C 0C 01 R 00 00 00 02 T 0C 0D R 00 00 00 02 T 0C 0D 00 00 00 09 05 88 01 R 00 00 00 02 T 0C 14 R 00 00 00 02 T 0C 14 02 00 01 00 00 07 25 01 00 00 00 00 09 04 R 00 00 00 02 T 0C 22 03 00 00 01 02 00 00 09 04 03 01 01 01 02 R 00 00 00 02 T 0C 30 00 00 07 24 01 03 01 01 00 0B 24 02 01 01 R 00 00 00 02 T 0C 3E 01 08 01 R 00 00 00 02 T 0C 41 R 00 00 00 02 T 0C 41 00 00 00 09 05 08 01 R 00 00 00 02 T 0C 48 R 00 00 00 02 T 0C 48 02 00 01 00 00 07 25 01 00 00 00 00 R 00 00 00 02 T 0C 54 R 00 00 00 02 T 0C 54 0C 5C 0C 5C R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C 56 0C 60 0C 60 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C 58 0C 6E 0C 6E R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C 5A 0C 8E 0C 8E R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C 5C R 00 00 00 02 T 0C 5C 04 03 00 00 R 00 00 00 02 T 0C 60 R 00 00 00 02 T 0C 60 0E 03 42 00 61 00 79 00 63 00 6F 00 6D 00 R 00 00 00 02 T 0C 6E R 00 00 00 02 T 0C 6E 20 03 55 00 53 00 42 00 46 00 4C 00 45 00 R 00 00 00 02 T 0C 7C 58 00 20 00 28 00 41 00 75 00 64 00 69 00 R 00 00 00 02 T 0C 8A 6F 00 29 00 R 00 00 00 02 T 0C 8E R 00 00 00 02 T 0C 8E 02 03 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0C 9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0C AA 00 00 00 00 00 00 R 00 00 00 02 baycomusb-0.10.orig/firmware/audiofirmware/main.lst0100644000175100017510000043434507337536151020561 0ustar abaaba 1 .module main 2 3 ;; ENDPOINTS 4 ;; EP0 in/out Control 5 ;; EP1 in Interrupt: Status 6 ;; Byte 0: Modem Status 7 ;; Bit 0-1: Transmitter status 8 ;; 0: idle (off) 9 ;; 1: keyup 10 ;; 2: transmitting packets 11 ;; 3: tail 12 ;; Bit 2: PTT status (1=on) 13 ;; Bit 3: DCD 14 ;; Bit 5: UART transmitter empty 15 ;; Bit 6-7: unused 16 ;; Byte 1: Number of empty 64 byte chunks in TX fifo (sofcount) 17 ;; Byte 2: Number of full 64 byte chunks in RX fifo (INISOVAL) 18 ;; Byte 3: RSSI value 19 ;; Byte 4: IRQ count 20 ;; Byte 5-20: (as needed) UART receiver chars 21 ;; EP8 out audio output 22 ;; EP8 in audio input 23 24 ;; COMMAND LIST 25 ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) 26 ;; C0 C8 read mode 27 ;; Return: 28 ;; Byte 0: 4 (MODE_AUDIO) 29 ;; C0 C9 return serial number string 30 ;; C0 D0 get/set PTT/DCD/RSSI 31 ;; wIndex = 1: set forced ptt to wValue 32 ;; Return: 33 ;; Byte 0: PTT status 34 ;; Byte 1: DCD status 35 ;; Byte 2: RSSI status 36 ;; 40 D2 set CON/STA led 37 ;; Bits 0-1 of wValue 38 ;; 40 D3 send byte to UART 39 ;; Byte in wValue 40 ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) 41 ;; wIndex = 1: write wValue to output register 42 ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) 43 ;; Return: 44 ;; Byte 0: Modem Disconnect Input 45 ;; Byte 1: Modem Disconnect Output register 46 ;; Byte 2: Modem Disconnect Tristate register 47 ;; C0 D5 get/set T7F port 48 ;; wIndex = 1: write wValue to T7F output register 49 ;; Return: 50 ;; Byte 0: T7F Input 51 ;; Byte 1: T7F Output register 52 ;; C0 E0 get/set control register/counter values 53 ;; wIndex = 1: write wValue to control register 54 ;; Return: 55 ;; Byte 0: control register value 56 ;; Byte 1-3: counter0 register 57 ;; Byte 4-6: counter1 register 58 ;; C0 E1 get debug status 59 ;; Return: 60 ;; Byte 0: SOF count 61 ;; Byte 1: framesize 62 ;; Byte 2-3: divider 63 ;; Byte 4: divrel 64 ;; Byte 5: pllcorrvar 65 ;; Byte 6: txfifocount 66 ;; C0 E2 xxdebug stuff 67 68 ;; define code segments link order 69 .area CODE (CODE) 70 .area CSEG (CODE) 71 .area GSINIT (CODE) 72 .area GSINIT2 (CODE) 73 74 ;; ----------------------------------------------------- 75 76 ;; special function registers (which are not predefined) 0082 77 dpl0 = 0x82 0083 78 dph0 = 0x83 0084 79 dpl1 = 0x84 0085 80 dph1 = 0x85 0086 81 dps = 0x86 008E 82 ckcon = 0x8E 008F 83 spc_fnc = 0x8F 0091 84 exif = 0x91 0092 85 mpage = 0x92 0098 86 scon0 = 0x98 0099 87 sbuf0 = 0x99 00C0 88 scon1 = 0xC0 00C1 89 sbuf1 = 0xC1 00D8 90 eicon = 0xD8 00E8 91 eie = 0xE8 00F8 92 eip = 0xF8 93 94 ;; anchor xdata registers 7F00 95 IN0BUF = 0x7F00 7EC0 96 OUT0BUF = 0x7EC0 7E80 97 IN1BUF = 0x7E80 7E40 98 OUT1BUF = 0x7E40 7E00 99 IN2BUF = 0x7E00 7DC0 100 OUT2BUF = 0x7DC0 7D80 101 IN3BUF = 0x7D80 7D40 102 OUT3BUF = 0x7D40 7D00 103 IN4BUF = 0x7D00 7CC0 104 OUT4BUF = 0x7CC0 7C80 105 IN5BUF = 0x7C80 7C40 106 OUT5BUF = 0x7C40 7C00 107 IN6BUF = 0x7C00 7BC0 108 OUT6BUF = 0x7BC0 7B80 109 IN7BUF = 0x7B80 7B40 110 OUT7BUF = 0x7B40 7FE8 111 SETUPBUF = 0x7FE8 7FE8 112 SETUPDAT = 0x7FE8 113 7FB4 114 EP0CS = 0x7FB4 7FB5 115 IN0BC = 0x7FB5 7FB6 116 IN1CS = 0x7FB6 7FB7 117 IN1BC = 0x7FB7 7FB8 118 IN2CS = 0x7FB8 7FB9 119 IN2BC = 0x7FB9 7FBA 120 IN3CS = 0x7FBA 7FBB 121 IN3BC = 0x7FBB 7FBC 122 IN4CS = 0x7FBC 7FBD 123 IN4BC = 0x7FBD 7FBE 124 IN5CS = 0x7FBE 7FBF 125 IN5BC = 0x7FBF 7FC0 126 IN6CS = 0x7FC0 7FC1 127 IN6BC = 0x7FC1 7FC2 128 IN7CS = 0x7FC2 7FC3 129 IN7BC = 0x7FC3 7FC5 130 OUT0BC = 0x7FC5 7FC6 131 OUT1CS = 0x7FC6 7FC7 132 OUT1BC = 0x7FC7 7FC8 133 OUT2CS = 0x7FC8 7FC9 134 OUT2BC = 0x7FC9 7FCA 135 OUT3CS = 0x7FCA 7FCB 136 OUT3BC = 0x7FCB 7FCC 137 OUT4CS = 0x7FCC 7FCD 138 OUT4BC = 0x7FCD 7FCE 139 OUT5CS = 0x7FCE 7FCF 140 OUT5BC = 0x7FCF 7FD0 141 OUT6CS = 0x7FD0 7FD1 142 OUT6BC = 0x7FD1 7FD2 143 OUT7CS = 0x7FD2 7FD3 144 OUT7BC = 0x7FD3 145 7FA8 146 IVEC = 0x7FA8 7FA9 147 IN07IRQ = 0x7FA9 7FAA 148 OUT07IRQ = 0x7FAA 7FAB 149 USBIRQ = 0x7FAB 7FAC 150 IN07IEN = 0x7FAC 7FAD 151 OUT07IEN = 0x7FAD 7FAE 152 USBIEN = 0x7FAE 7FAF 153 USBBAV = 0x7FAF 7FB2 154 BPADDRH = 0x7FB2 7FB3 155 BPADDRL = 0x7FB3 156 7FD4 157 SUDPTRH = 0x7FD4 7FD5 158 SUDPTRL = 0x7FD5 7FD6 159 USBCS = 0x7FD6 7FD7 160 TOGCTL = 0x7FD7 7FD8 161 USBFRAMEL = 0x7FD8 7FD9 162 USBFRAMEH = 0x7FD9 7FDB 163 FNADDR = 0x7FDB 7FDD 164 USBPAIR = 0x7FDD 7FDE 165 IN07VAL = 0x7FDE 7FDF 166 OUT07VAL = 0x7FDF 7FE3 167 AUTOPTRH = 0x7FE3 7FE4 168 AUTOPTRL = 0x7FE4 7FE5 169 AUTODATA = 0x7FE5 170 171 ;; isochronous endpoints. only available if ISODISAB=0 172 7F60 173 OUT8DATA = 0x7F60 7F61 174 OUT9DATA = 0x7F61 7F62 175 OUT10DATA = 0x7F62 7F63 176 OUT11DATA = 0x7F63 7F64 177 OUT12DATA = 0x7F64 7F65 178 OUT13DATA = 0x7F65 7F66 179 OUT14DATA = 0x7F66 7F67 180 OUT15DATA = 0x7F67 181 7F68 182 IN8DATA = 0x7F68 7F69 183 IN9DATA = 0x7F69 7F6A 184 IN10DATA = 0x7F6A 7F6B 185 IN11DATA = 0x7F6B 7F6C 186 IN12DATA = 0x7F6C 7F6D 187 IN13DATA = 0x7F6D 7F6E 188 IN14DATA = 0x7F6E 7F6F 189 IN15DATA = 0x7F6F 190 7F70 191 OUT8BCH = 0x7F70 7F71 192 OUT8BCL = 0x7F71 7F72 193 OUT9BCH = 0x7F72 7F73 194 OUT9BCL = 0x7F73 7F74 195 OUT10BCH = 0x7F74 7F75 196 OUT10BCL = 0x7F75 7F76 197 OUT11BCH = 0x7F76 7F77 198 OUT11BCL = 0x7F77 7F78 199 OUT12BCH = 0x7F78 7F79 200 OUT12BCL = 0x7F79 7F7A 201 OUT13BCH = 0x7F7A 7F7B 202 OUT13BCL = 0x7F7B 7F7C 203 OUT14BCH = 0x7F7C 7F7D 204 OUT14BCL = 0x7F7D 7F7E 205 OUT15BCH = 0x7F7E 7F7F 206 OUT15BCL = 0x7F7F 207 7FF0 208 OUT8ADDR = 0x7FF0 7FF1 209 OUT9ADDR = 0x7FF1 7FF2 210 OUT10ADDR = 0x7FF2 7FF3 211 OUT11ADDR = 0x7FF3 7FF4 212 OUT12ADDR = 0x7FF4 7FF5 213 OUT13ADDR = 0x7FF5 7FF6 214 OUT14ADDR = 0x7FF6 7FF7 215 OUT15ADDR = 0x7FF7 7FF8 216 IN8ADDR = 0x7FF8 7FF9 217 IN9ADDR = 0x7FF9 7FFA 218 IN10ADDR = 0x7FFA 7FFB 219 IN11ADDR = 0x7FFB 7FFC 220 IN12ADDR = 0x7FFC 7FFD 221 IN13ADDR = 0x7FFD 7FFE 222 IN14ADDR = 0x7FFE 7FFF 223 IN15ADDR = 0x7FFF 224 7FA0 225 ISOERR = 0x7FA0 7FA1 226 ISOCTL = 0x7FA1 7FA2 227 ZBCOUNT = 0x7FA2 7FE0 228 INISOVAL = 0x7FE0 7FE1 229 OUTISOVAL = 0x7FE1 7FE2 230 FASTXFR = 0x7FE2 231 232 ;; CPU control registers 233 7F92 234 CPUCS = 0x7F92 235 236 ;; IO port control registers 237 7F93 238 PORTACFG = 0x7F93 7F94 239 PORTBCFG = 0x7F94 7F95 240 PORTCCFG = 0x7F95 7F96 241 OUTA = 0x7F96 7F97 242 OUTB = 0x7F97 7F98 243 OUTC = 0x7F98 7F99 244 PINSA = 0x7F99 7F9A 245 PINSB = 0x7F9A 7F9B 246 PINSC = 0x7F9B 7F9C 247 OEA = 0x7F9C 7F9D 248 OEB = 0x7F9D 7F9E 249 OEC = 0x7F9E 250 251 ;; I2C controller registers 252 7FA5 253 I2CS = 0x7FA5 7FA6 254 I2DAT = 0x7FA6 255 256 ;; Xilinx FPGA registers C000 257 AUDIORXFIFO = 0xc000 C000 258 AUDIOTXFIFO = 0xc000 C001 259 AUDIORXFIFOCNT = 0xc001 C002 260 AUDIOTXFIFOCNT = 0xc002 C001 261 AUDIODIVIDERLO = 0xc001 C002 262 AUDIODIVIDERHI = 0xc002 C004 263 AUDIORSSI = 0xc004 C005 264 AUDIOCNTLOW = 0xc005 C006 265 AUDIOCNTMID = 0xc006 C007 266 AUDIOCNTHIGH = 0xc007 C008 267 AUDIOCTRL = 0xc008 C009 268 AUDIOSTAT = 0xc009 C00A 269 AUDIOT7FOUT = 0xc00a C00B 270 AUDIOT7FIN = 0xc00b C00C 271 AUDIOMDISCTRIS = 0xc00c C00D 272 AUDIOMDISCOUT = 0xc00d C00E 273 AUDIOMDISCIN = 0xc00e 274 0001 275 AUDIOCTRLPTT = 0x01 0002 276 AUDIOCTRLMUTE = 0x02 0004 277 AUDIOCTRLLEDPTT = 0x04 0008 278 AUDIOCTRLLEDDCD = 0x08 0000 279 AUDIOCTRLCNTRES = 0x00 0010 280 AUDIOCTRLCNTDIS = 0x10 0040 281 AUDIOCTRLCNTCK0 = 0x40 0050 282 AUDIOCTRLCNTCK1 = 0x50 0060 283 AUDIOCTRLCNTCK2 = 0x60 0070 284 AUDIOCTRLCNTCK3 = 0x70 0080 285 AUDIOCTRLCNTRD1 = 0x80 286 287 ;; ----------------------------------------------------- 288 289 .area CODE (CODE) 0000 02s00r00 290 ljmp startup 0003 02s00r16 291 ljmp int0_isr 0006 292 .ds 5 000B 02s00r37 293 ljmp timer0_isr 000E 294 .ds 5 0013 02s00r58 295 ljmp int1_isr 0016 296 .ds 5 001B 02s00r79 297 ljmp timer1_isr 001E 298 .ds 5 0023 02s00r9A 299 ljmp ser0_isr 0026 300 .ds 5 002B 02s00rD8 301 ljmp timer2_isr 002E 302 .ds 5 0033 02s00rF9 303 ljmp resume_isr 0036 304 .ds 5 003B 02s01r1A 305 ljmp ser1_isr 003E 306 .ds 5 0043 02s01r00 307 ljmp usb_isr 0046 308 .ds 5 004B 02s01r3D 309 ljmp i2c_isr 004E 310 .ds 5 0053 02s01r62 311 ljmp int4_isr 0056 312 .ds 5 005B 02s01r87 313 ljmp int5_isr 005E 314 .ds 5 0063 02s01rAC 315 ljmp int6_isr 316 317 ;; Parameter block at 0xe0 0066 318 .ds 0x7a 00E0 08 319 parframesize: .db 8 00E1 01 320 parpttmute: .db 1 321 322 ;; Serial# string at 0xf0 00E2 323 .ds 14 00F0 324 parserial: 00F0 30 30 30 30 30 30 325 .db '0,'0,'0,'0,'0,'0,'0,'0,0 30 30 00 00F9 326 .ds 7 327 0100 328 usb_isr: 0100 02s01rCD 329 ljmp usb_sudav_isr 0103 330 .ds 1 0104 02s06r7B 331 ljmp usb_sof_isr 0107 332 .ds 1 0108 02s07rC5 333 ljmp usb_sutok_isr 010B 334 .ds 1 010C 02s07rF0 335 ljmp usb_suspend_isr 010F 336 .ds 1 0110 02s08r1B 337 ljmp usb_usbreset_isr 0113 338 .ds 1 0114 32 339 reti 0115 340 .ds 3 0118 02s08r46 341 ljmp usb_ep0in_isr 011B 342 .ds 1 011C 02s08r81 343 ljmp usb_ep0out_isr 011F 344 .ds 1 0120 02s09r17 345 ljmp usb_ep1in_isr 0123 346 .ds 1 0124 02s09r45 347 ljmp usb_ep1out_isr 0127 348 .ds 1 0128 02s09r70 349 ljmp usb_ep2in_isr 012B 350 .ds 1 012C 02s09r9B 351 ljmp usb_ep2out_isr 012F 352 .ds 1 0130 02s09rC6 353 ljmp usb_ep3in_isr 0133 354 .ds 1 0134 02s09rF1 355 ljmp usb_ep3out_isr 0137 356 .ds 1 0138 02s0Ar1C 357 ljmp usb_ep4in_isr 013B 358 .ds 1 013C 02s0Ar47 359 ljmp usb_ep4out_isr 013F 360 .ds 1 0140 02s0Ar72 361 ljmp usb_ep5in_isr 0143 362 .ds 1 0144 02s0Ar9D 363 ljmp usb_ep5out_isr 0147 364 .ds 1 0148 02s0ArC8 365 ljmp usb_ep6in_isr 014B 366 .ds 1 014C 02s0ArF3 367 ljmp usb_ep6out_isr 014F 368 .ds 1 0150 02s0Br1E 369 ljmp usb_ep7in_isr 0153 370 .ds 1 0154 02s0Br49 371 ljmp usb_ep7out_isr 372 373 ;; ----------------------------------------------------- 374 0004 375 NUMINTERFACES = 4 376 377 .area OSEG (OVR,DATA) 378 .area BSEG (BIT) 0000 379 ctrl_ptt: .ds 1 0001 380 ctrl_pttmute: .ds 1 0002 381 ctrl_ledptt: .ds 1 0003 382 ctrl_leddcd: .ds 1 0004 383 ctrl_cntmode0: .ds 1 0005 384 ctrl_cntmode1: .ds 1 0006 385 ctrl_cntmode2: .ds 1 0007 386 ctrl_cntsel: .ds 1 0020 387 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) 388 0008 389 pttmute: .ds 1 0009 390 uartempty: .ds 1 391 392 393 .area ISEG (DATA) 0000 394 txsamples: .ds 0x40 0040 395 stack: .ds 0x80-0x40 396 397 .area DSEG (DATA) 0000 398 ctrlcode: .ds 1 0001 399 ctrlcount: .ds 2 0003 400 leddiv: .ds 1 0004 401 irqcount: .ds 1 0005 402 sofcount: .ds 1 0006 403 divider: .ds 2 0008 404 divrel: .ds 1 0009 405 framesize: .ds 1 000A 406 pllcorrvar: .ds 1 000B 407 txfifocount: .ds 1 000C 408 pttforce: .ds 1 409 410 ;; UART receiver 000D 411 uartbuf: .ds 16 001D 412 uartwr: .ds 1 001E 413 uartrd: .ds 1 414 415 ;; Port state 001F 416 t7fout: .ds 1 0020 417 mdisctris: .ds 1 0021 418 mdiscout: .ds 1 419 420 ;; USB state 0022 421 numconfig: .ds 1 0023 422 altsetting: .ds NUMINTERFACES 423 424 .area XSEG (DATA) 0000 425 blah: .ds 1 426 427 428 .area GSINIT (CODE) 0002 429 ar2 = 0x02 0003 430 ar3 = 0x03 0004 431 ar4 = 0x04 0005 432 ar5 = 0x05 0006 433 ar6 = 0x06 0007 434 ar7 = 0x07 0000 435 ar0 = 0x00 0001 436 ar1 = 0x01 437 0000 438 startup: 0000 75 81r40 439 mov sp,#stack ; -1 0003 E4 440 clr a 0004 F5 D0 441 mov psw,a 0006 F5 86 442 mov dps,a 443 ;lcall __sdcc_external_startup 444 ;mov a,dpl0 445 ;jz __sdcc_init_data 446 ;ljmp __sdcc_program_startup 0008 447 __sdcc_init_data: 448 449 .area GSINIT2 (CODE) 0000 450 __sdcc_program_startup: 451 ;; assembler code startup 0000 E4 452 clr a 0001 F5*04 453 mov irqcount,a 0003 F5*05 454 mov sofcount,a 0005 F5*0C 455 mov pttforce,a 0007 F5*1E 456 mov uartrd,a 0009 F5*1D 457 mov uartwr,a 000B F5 86 458 mov dps,a 000D D2*09 459 setb uartempty 460 ;; some indirect register setup 000F 75 8E 30 461 mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs 462 ;; Timer setup: 463 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 464 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0012 75 89 21 465 mov tmod,#0x21 0015 75 88 55 466 mov tcon,#0x55 ; INT0/INT1 edge 0018 75 8D 64 467 mov th1,#256-156 ; 1200 bauds 001B 75 87 00 468 mov pcon,#0 ; SMOD0=0 469 ;; init USB subsystem 001E 74 00 470 mov a,#0x00 ; IN8 FIFO at address 0x0000 0020 90 7F F8 471 mov dptr,#IN8ADDR 0023 F0 472 movx @dptr,a 0024 74 04 473 mov a,#0x04 ; OUT8 FIFO at address 0x0010 0026 90 7F F0 474 mov dptr,#OUT8ADDR 0029 F0 475 movx @dptr,a 002A 90 7F A1 476 mov dptr,#ISOCTL 002D E4 477 clr a ; enable ISO endpoints 002E F0 478 movx @dptr,a 002F 90 7F AF 479 mov dptr,#USBBAV 0032 74 01 480 mov a,#1 ; enable autovector, disable breakpoint logic 0034 F0 481 movx @dptr,a 0035 74 01 482 mov a,#0x01 ; enable ISO endpoint 8 for input/output 0037 90 7F E0 483 mov dptr,#INISOVAL 003A F0 484 movx @dptr,a 003B 90 7F E1 485 mov dptr,#OUTISOVAL 003E F0 486 movx @dptr,a 003F 90 7F DD 487 mov dptr,#USBPAIR 0042 74 89 488 mov a,#0x89 ; pair EP 2&3 for input & output, ISOSEND0 0044 F0 489 movx @dptr,a 0045 90 7F DE 490 mov dptr,#IN07VAL 0048 74 03 491 mov a,#0x3 ; enable EP0+EP1 004A F0 492 movx @dptr,a 004B 90 7F DF 493 mov dptr,#OUT07VAL 004E 74 01 494 mov a,#0x1 ; enable EP0 0050 F0 495 movx @dptr,a 496 ;; USB: init endpoint toggles 0051 90 7F D7 497 mov dptr,#TOGCTL 0054 74 12 498 mov a,#0x12 0056 F0 499 movx @dptr,a 0057 74 32 500 mov a,#0x32 ; clear EP 2 in toggle 0059 F0 501 movx @dptr,a 005A 74 02 502 mov a,#0x02 005C F0 503 movx @dptr,a 005D 74 22 504 mov a,#0x22 ; clear EP 2 out toggle 005F F0 505 movx @dptr,a 506 ;; configure IO ports 0060 90 7F 93 507 mov dptr,#PORTACFG 0063 74 00 508 mov a,#0 0065 F0 509 movx @dptr,a 0066 90 7F 96 510 mov dptr,#OUTA 0069 74 82 511 mov a,#0x82 ; set PROG hi 006B F0 512 movx @dptr,a 006C 90 7F 9C 513 mov dptr,#OEA 006F 74 C2 514 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0071 F0 515 movx @dptr,a 0072 90 7F 94 516 mov dptr,#PORTBCFG 0075 74 00 517 mov a,#0 0077 F0 518 movx @dptr,a 0078 90 7F 9D 519 mov dptr,#OEB 007B 74 00 520 mov a,#0 007D F0 521 movx @dptr,a 007E 90 7F 95 522 mov dptr,#PORTCCFG 0081 74 C3 523 mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins 0083 F0 524 movx @dptr,a 0084 90 7F 98 525 mov dptr,#OUTC 0087 74 28 526 mov a,#0x28 0089 F0 527 movx @dptr,a 008A 90 7F 9E 528 mov dptr,#OEC 008D 74 2A 529 mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT 008F F0 530 movx @dptr,a 531 ;; enable interrupts 0090 75 A8 92 532 mov ie,#0x92 ; enable timer 0 and ser 0 int 0093 75 E8 01 533 mov eie,#0x01 ; enable USB interrupts 0096 90 7F AE 534 mov dptr,#USBIEN 0099 74 01 535 mov a,#1 ; enable SUDAV interrupt 009B F0 536 movx @dptr,a 009C 90 7F AC 537 mov dptr,#IN07IEN 009F 74 03 538 mov a,#3 ; enable EP0+EP1 interrupt 00A1 F0 539 movx @dptr,a 00A2 90 7F AD 540 mov dptr,#OUT07IEN 00A5 74 01 541 mov a,#1 ; enable EP0 interrupt 00A7 F0 542 movx @dptr,a 543 ;; initialize UART 0 for T7F communication 00A8 75 98 52 544 mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable 545 ;; copy configuration to bit addressable variables 00AB 75 20 00 546 mov ctrlreg,#AUDIOCTRLCNTRES 00AE 78rE1 547 mov r0,#parpttmute 00B0 E2 548 movx a,@r0 00B1 A2 E0 549 mov c,acc.0 00B3 92*08 550 mov pttmute,c 00B5 92*01 551 mov ctrl_pttmute,c 552 ;; turn off transmitter 00B7 90 C0 08 553 mov dptr,#AUDIOCTRL 00BA E5 20 554 mov a,ctrlreg 00BC F0 555 movx @dptr,a 556 ;; Initialize modem disc port / t7f port 00BD 90 C0 0C 557 mov dptr,#AUDIOMDISCTRIS 00C0 74 FF 558 mov a,#0xff 00C2 F0 559 movx @dptr,a 00C3 F5*20 560 mov mdisctris,a 00C5 90 C0 0D 561 mov dptr,#AUDIOMDISCOUT 00C8 E4 562 clr a 00C9 F0 563 movx @dptr,a 00CA F5*21 564 mov mdiscout,a 00CC 90 C0 0A 565 mov dptr,#AUDIOT7FOUT 00CF 74 1F 566 mov a,#0x1f 00D1 F0 567 movx @dptr,a 00D2 F5*1F 568 mov t7fout,a 569 ;; Copy serial number 00D4 78rF0 570 mov r0,#parserial 00D6 90s0Cr90 571 mov dptr,#stringserial+2 00D9 E2 572 1$: movx a,@r0 00DA 60 06 573 jz 2$ 00DC F0 574 movx @dptr,a 00DD A3 575 inc dptr 00DE A3 576 inc dptr 00DF 08 577 inc r0 00E0 80 F7 578 sjmp 1$ 00E2 E8 579 2$: mov a,r0 00E3 24 11 580 add a,#1-0xf0 ; 1-parserial 00E5 25 E0 581 add a,acc 00E7 90s0Cr8E 582 mov dptr,#stringserial 00EA F0 583 movx @dptr,a 584 ;; check parameters 00EB 585 chkparam: 00EB 75*08 80 586 mov divrel,#0x80 00EE 78rE0 587 mov r0,#parframesize 00F0 E2 588 movx a,@r0 00F1 B4 02 02 589 cjne a,#02,11$ 00F4 80 4E 590 sjmp 2$ 00F6 B4 03 02 591 11$: cjne a,#03,1$ 00F9 80 49 592 sjmp 2$ 00FB 24 F8 593 1$: add a,#-8 00FD 50 0B 594 jnc 3$ 00FF 24 F0 595 add a,#-16 0101 40 03 596 jc 4$ 0103 E2 597 movx a,@r0 0104 80 06 598 sjmp 5$ 599 ;; sampling rate is: 24000000Hz/(divider+2) 0106 74 18 600 4$: mov a,#24 0108 80 02 601 sjmp 5$ 010A 74 08 602 3$: mov a,#8 603 ;; 16 bit by 8 bit divide 604 ;; r2: divisor 605 ;; r3: loop counter 606 ;; r4: dividend/result low 607 ;; r5: dividend/result mid 608 ;; r6: dividend/result high 010C FA 609 5$: mov r2,a 010D 7B 11 610 mov r3,#17 010F 7C C0 611 mov r4,#24000 0111 7D 5D 612 mov r5,#24000>>8 0113 7E 00 613 mov r6,#0 0115 C3 614 6$: clr c 0116 EE 615 mov a,r6 0117 9A 616 subb a,r2 0118 40 01 617 jc 7$ 011A FE 618 mov r6,a 011B B3 619 7$: cpl c 011C EC 620 mov a,r4 011D 33 621 rlc a 011E FC 622 mov r4,a 011F ED 623 mov a,r5 0120 33 624 rlc a 0121 FD 625 mov r5,a 0122 EE 626 mov a,r6 0123 33 627 rlc a 0124 FE 628 mov r6,a 0125 DB EE 629 djnz r3,6$ 630 ;; subtract two 0127 EC 631 mov a,r4 0128 C3 632 clr c 0129 94 02 633 subb a,#2 012B FC 634 mov r4,a 012C ED 635 mov a,r5 012D 94 00 636 subb a,#0 012F FD 637 mov r5,a 638 ;; store result into audio divider 0130 90 C0 02 639 mov dptr,#AUDIODIVIDERHI 0133 F0 640 movx @dptr,a 0134 EC 641 mov a,r4 0135 90 C0 01 642 mov dptr,#AUDIODIVIDERLO 0138 F0 643 movx @dptr,a 0139 C3 644 clr c 013A 94 08 645 subb a,#0x08 013C F5*06 646 mov divider,a 013E ED 647 mov a,r5 013F 94 00 648 subb a,#0 0141 F5*07 649 mov divider+1,a 650 ;; reload divider into accu 0143 EA 651 mov a,r2 0144 F5*09 652 2$: mov framesize,a 0146 90s0Cr14 653 mov dptr,#descinframesize 0149 F0 654 movx @dptr,a 014A 90s0Cr48 655 mov dptr,#descoutframesize 014D F0 656 movx @dptr,a 657 ;; set sampling rate in descriptor 014E 75 F0 E8 658 mov b,#1000 0151 A4 659 mul ab 0152 90s0Cr0D 660 mov dptr,#descinsrate 0155 F0 661 movx @dptr,a 0156 90s0Cr41 662 mov dptr,#descoutsrate 0159 F0 663 movx @dptr,a 015A AB F0 664 mov r3,b 015C E5*09 665 mov a,framesize 015E 75 F0 03 666 mov b,#1000>>8 0161 A4 667 mul ab 0162 2B 668 add a,r3 0163 90s0Cr0E 669 mov dptr,#descinsrate+1 0166 F0 670 movx @dptr,a 0167 90s0Cr42 671 mov dptr,#descoutsrate+1 016A F0 672 movx @dptr,a 016B E4 673 clr a 016C 35 F0 674 addc a,b 016E 90s0Cr0F 675 mov dptr,#descinsrate+2 0171 F0 676 movx @dptr,a 0172 90s0Cr43 677 mov dptr,#descoutsrate+2 0175 F0 678 movx @dptr,a 679 ;; initialize USB state 0176 680 usbinit: 681 0000 682 .if 0 683 ;; XXXXX 684 ;; check if windows needs 11025Hz 685 mov a,#12 686 mov dptr,#descinframesize 687 movx @dptr,a 688 mov dptr,#descoutframesize 689 movx @dptr,a 690 mov a,#0x11 691 mov dptr,#descinsrate 692 movx @dptr,a 693 mov dptr,#descoutsrate 694 movx @dptr,a 695 mov a,#0x2b 696 mov dptr,#descinsrate+1 697 movx @dptr,a 698 mov dptr,#descoutsrate+1 699 movx @dptr,a 700 mov a,#0 701 mov dptr,#descinsrate+2 702 movx @dptr,a 703 mov dptr,#descoutsrate+2 704 movx @dptr,a 705 ;; XXXXX 706 .endif 707 0176 E4 708 clr a 0177 F5*22 709 mov numconfig,a 0179 78r23 710 mov r0,#altsetting 017B 7A 04 711 mov r2,#NUMINTERFACES 017D F6 712 3$: mov @r0,a 017E 08 713 inc r0 017F DA FC 714 djnz r2,3$ 715 ;; give Windows a chance to finish the writecpucs control transfer 716 ;; 20ms delay loop 0181 90 D1 20 717 mov dptr,#(-12000)&0xffff 0184 A3 718 2$: inc dptr ; 3 cycles 0185 E5 82 719 mov a,dpl0 ; 2 cycles 0187 45 83 720 orl a,dph0 ; 2 cycles 0189 70 F9 721 jnz 2$ ; 3 cycles 0001 722 .if 1 723 ;; disconnect from USB bus 018B 90 7F D6 724 mov dptr,#USBCS 018E 74 0A 725 mov a,#10 0190 F0 726 movx @dptr,a 727 ;; wait 0.3 sec 0191 7A 1E 728 mov r2,#30 729 ;; 10ms delay loop 0193 90 E8 90 730 0$: mov dptr,#(-6000)&0xffff 0196 A3 731 1$: inc dptr ; 3 cycles 0197 E5 82 732 mov a,dpl0 ; 2 cycles 0199 45 83 733 orl a,dph0 ; 2 cycles 019B 70 F9 734 jnz 1$ ; 3 cycles 019D DA F4 735 djnz r2,0$ 736 ;; reconnect to USB bus 019F 90 7F D6 737 mov dptr,#USBCS 738 ;mov a,#2 ; 8051 handles control 739 ;movx @dptr,a 01A2 74 06 740 mov a,#6 ; reconnect, 8051 handles control 01A4 F0 741 movx @dptr,a 742 .endif 743 744 ;; final 01A5 12s08rBC 745 lcall fillusbintr 01A8 746 fifoinit: 747 ;; first wait for a new frame 01A8 90 7F D8 748 mov dptr,#USBFRAMEL 01AB E0 749 movx a,@dptr 01AC FA 750 mov r2,a 01AD E0 751 1$: movx a,@dptr 01AE B5 02 02 752 cjne a,ar2,2$ 01B1 80 FA 753 sjmp 1$ 01B3 90 C0 01 754 2$: mov dptr,#AUDIORXFIFOCNT 01B6 E0 755 movx a,@dptr 01B7 24 FC 756 add a,#-4 01B9 54 3F 757 anl a,#0x3f 01BB 60 07 758 jz 4$ 01BD FA 759 mov r2,a 01BE 90 C0 00 760 mov dptr,#AUDIORXFIFO 01C1 E0 761 3$: movx a,@dptr 01C2 DA FD 762 djnz r2,3$ 01C4 90 C0 02 763 4$: mov dptr,#AUDIOTXFIFOCNT 01C7 E0 764 movx a,@dptr 01C8 24 FC 765 add a,#-4 01CA 54 3F 766 anl a,#0x3f 01CC 60 F6 767 jz 4$ 01CE FA 768 mov r2,a 01CF 90 C0 00 769 mov dptr,#AUDIOTXFIFO 01D2 E4 770 clr a 01D3 F0 771 5$: movx @dptr,a 01D4 DA FD 772 djnz r2,5$ 01D6 773 6$: ;; clear SOFIR interrupt 01D6 90 7F AB 774 mov dptr,#USBIRQ 01D9 74 02 775 mov a,#0x02 01DB F0 776 movx @dptr,a 777 ;; finally enable SOFIR interrupt 01DC 90 7F AE 778 mov dptr,#USBIEN 01DF 74 03 779 mov a,#3 ; enable SUDAV+SOFIR interrupt 01E1 F0 780 movx @dptr,a 01E2 12s08rBC 781 lcall fillusbintr 01E5 02s00r00 782 ljmp mainloop 783 784 785 .area CSEG (CODE) 0002 786 ar2 = 0x02 0003 787 ar3 = 0x03 0004 788 ar4 = 0x04 0005 789 ar5 = 0x05 0006 790 ar6 = 0x06 0007 791 ar7 = 0x07 0000 792 ar0 = 0x00 0001 793 ar1 = 0x01 794 795 ;; WARNING! The assembler doesn't check for 796 ;; out of range short jump labels!! Double check 797 ;; that the jump labels are within the range! 0000 798 mainloop: 0000 E5*0C 799 mov a,pttforce 0002 A2 E0 800 mov c,acc.0 0004 92*00 801 mov ctrl_ptt,c 0006 92*02 802 mov ctrl_ledptt,c 0008 B3 803 cpl c 0009 82*08 804 anl c,pttmute 000B 92*01 805 mov ctrl_pttmute,c 000D 90 C0 08 806 mov dptr,#AUDIOCTRL 0010 E5 20 807 mov a,ctrlreg 0012 F0 808 movx @dptr,a 0013 02s00r00 809 ljmp mainloop 810 811 ;; ------------------ interrupt handlers ------------------------ 812 0016 813 int0_isr: 0016 C0 E0 814 push acc 0018 C0 F0 815 push b 001A C0 82 816 push dpl0 001C C0 83 817 push dph0 001E C0 D0 818 push psw 0020 75 D0 00 819 mov psw,#0x00 0023 C0 86 820 push dps 0025 75 86 00 821 mov dps,#0 822 ;; clear interrupt 0028 C2 89 823 clr tcon+1 824 ;; handle interrupt 825 ;; epilogue 002A D0 86 826 pop dps 002C D0 D0 827 pop psw 002E D0 83 828 pop dph0 0030 D0 82 829 pop dpl0 0032 D0 F0 830 pop b 0034 D0 E0 831 pop acc 0036 32 832 reti 833 0037 834 timer0_isr: 0037 C0 E0 835 push acc 0039 C0 F0 836 push b 003B C0 82 837 push dpl0 003D C0 83 838 push dph0 003F C0 D0 839 push psw 0041 75 D0 00 840 mov psw,#0x00 0044 C0 86 841 push dps 0046 75 86 00 842 mov dps,#0 843 ;; clear interrupt 0049 C2 8D 844 clr tcon+5 845 ;; handle interrupt 0000 846 .if 0 847 inc leddiv 848 mov a,leddiv 849 anl a,#7 850 jnz 0$ 851 mov dptr,#OUTC 852 movx a,@dptr 853 xrl a,#0x08 854 movx @dptr,a 855 0$: 856 .endif 857 ;; epilogue 004B D0 86 858 pop dps 004D D0 D0 859 pop psw 004F D0 83 860 pop dph0 0051 D0 82 861 pop dpl0 0053 D0 F0 862 pop b 0055 D0 E0 863 pop acc 0057 32 864 reti 865 0058 866 int1_isr: 0058 C0 E0 867 push acc 005A C0 F0 868 push b 005C C0 82 869 push dpl0 005E C0 83 870 push dph0 0060 C0 D0 871 push psw 0062 75 D0 00 872 mov psw,#0x00 0065 C0 86 873 push dps 0067 75 86 00 874 mov dps,#0 875 ;; clear interrupt 006A C2 8B 876 clr tcon+3 877 ;; handle interrupt 878 ;; epilogue 006C D0 86 879 pop dps 006E D0 D0 880 pop psw 0070 D0 83 881 pop dph0 0072 D0 82 882 pop dpl0 0074 D0 F0 883 pop b 0076 D0 E0 884 pop acc 0078 32 885 reti 886 0079 887 timer1_isr: 0079 C0 E0 888 push acc 007B C0 F0 889 push b 007D C0 82 890 push dpl0 007F C0 83 891 push dph0 0081 C0 D0 892 push psw 0083 75 D0 00 893 mov psw,#0x00 0086 C0 86 894 push dps 0088 75 86 00 895 mov dps,#0 896 ;; clear interrupt 008B C2 8F 897 clr tcon+7 898 ;; handle interrupt 899 ;; epilogue 008D D0 86 900 pop dps 008F D0 D0 901 pop psw 0091 D0 83 902 pop dph0 0093 D0 82 903 pop dpl0 0095 D0 F0 904 pop b 0097 D0 E0 905 pop acc 0099 32 906 reti 907 009A 908 ser0_isr: 009A C0 E0 909 push acc 009C C0 F0 910 push b 009E C0 82 911 push dpl0 00A0 C0 83 912 push dph0 00A2 C0 D0 913 push psw 00A4 75 D0 00 914 mov psw,#0x00 00A7 C0 86 915 push dps 00A9 75 86 00 916 mov dps,#0 00AC C0 00 917 push ar0 918 ;; clear interrupt 00AE 10 98 16 919 jbc scon0+0,1$ ; RI 00B1 10 99 0F 920 0$: jbc scon0+1,2$ ; TI 921 ;; handle interrupt 922 ;; epilogue 00B4 D0 00 923 3$: pop ar0 00B6 D0 86 924 pop dps 00B8 D0 D0 925 pop psw 00BA D0 83 926 pop dph0 00BC D0 82 927 pop dpl0 00BE D0 F0 928 pop b 00C0 D0 E0 929 pop acc 00C2 32 930 reti 931 00C3 D2*09 932 2$: setb uartempty 00C5 80 EA 933 sjmp 0$ 934 00C7 E5*1D 935 1$: mov a,uartwr 00C9 24r0D 936 add a,#uartbuf 00CB F8 937 mov r0,a 00CC E5 99 938 mov a,sbuf0 00CE F6 939 mov @r0,a 00CF E5*1D 940 mov a,uartwr 00D1 04 941 inc a 00D2 54 0F 942 anl a,#0xf 00D4 F5*1D 943 mov uartwr,a 00D6 80 DC 944 sjmp 3$ 945 00D8 946 timer2_isr: 00D8 C0 E0 947 push acc 00DA C0 F0 948 push b 00DC C0 82 949 push dpl0 00DE C0 83 950 push dph0 00E0 C0 D0 951 push psw 00E2 75 D0 00 952 mov psw,#0x00 00E5 C0 86 953 push dps 00E7 75 86 00 954 mov dps,#0 955 ;; clear interrupt 00EA C2 CF 956 clr t2con+7 957 ;; handle interrupt 958 ;; epilogue 00EC D0 86 959 pop dps 00EE D0 D0 960 pop psw 00F0 D0 83 961 pop dph0 00F2 D0 82 962 pop dpl0 00F4 D0 F0 963 pop b 00F6 D0 E0 964 pop acc 00F8 32 965 reti 966 00F9 967 resume_isr: 00F9 C0 E0 968 push acc 00FB C0 F0 969 push b 00FD C0 82 970 push dpl0 00FF C0 83 971 push dph0 0101 C0 D0 972 push psw 0103 75 D0 00 973 mov psw,#0x00 0106 C0 86 974 push dps 0108 75 86 00 975 mov dps,#0 976 ;; clear interrupt 010B C2 DC 977 clr eicon+4 978 ;; handle interrupt 979 ;; epilogue 010D D0 86 980 pop dps 010F D0 D0 981 pop psw 0111 D0 83 982 pop dph0 0113 D0 82 983 pop dpl0 0115 D0 F0 984 pop b 0117 D0 E0 985 pop acc 0119 32 986 reti 987 011A 988 ser1_isr: 011A C0 E0 989 push acc 011C C0 F0 990 push b 011E C0 82 991 push dpl0 0120 C0 83 992 push dph0 0122 C0 D0 993 push psw 0124 75 D0 00 994 mov psw,#0x00 0127 C0 86 995 push dps 0129 75 86 00 996 mov dps,#0 997 ;; clear interrupt 012C C2 C0 998 clr scon1+0 012E C2 C1 999 clr scon1+1 1000 ;; handle interrupt 1001 ;; epilogue 0130 D0 86 1002 pop dps 0132 D0 D0 1003 pop psw 0134 D0 83 1004 pop dph0 0136 D0 82 1005 pop dpl0 0138 D0 F0 1006 pop b 013A D0 E0 1007 pop acc 013C 32 1008 reti 1009 013D 1010 i2c_isr: 013D C0 E0 1011 push acc 013F C0 F0 1012 push b 0141 C0 82 1013 push dpl0 0143 C0 83 1014 push dph0 0145 C0 D0 1015 push psw 0147 75 D0 00 1016 mov psw,#0x00 014A C0 86 1017 push dps 014C 75 86 00 1018 mov dps,#0 1019 ;; clear interrupt 014F E5 91 1020 mov a,exif 0151 C2 E5 1021 clr acc.5 0153 F5 91 1022 mov exif,a 1023 ;; handle interrupt 1024 ;; epilogue 0155 D0 86 1025 pop dps 0157 D0 D0 1026 pop psw 0159 D0 83 1027 pop dph0 015B D0 82 1028 pop dpl0 015D D0 F0 1029 pop b 015F D0 E0 1030 pop acc 0161 32 1031 reti 1032 0162 1033 int4_isr: 0162 C0 E0 1034 push acc 0164 C0 F0 1035 push b 0166 C0 82 1036 push dpl0 0168 C0 83 1037 push dph0 016A C0 D0 1038 push psw 016C 75 D0 00 1039 mov psw,#0x00 016F C0 86 1040 push dps 0171 75 86 00 1041 mov dps,#0 1042 ;; clear interrupt 0174 E5 91 1043 mov a,exif 0176 C2 E6 1044 clr acc.6 0178 F5 91 1045 mov exif,a 1046 ;; handle interrupt 1047 ;; epilogue 017A D0 86 1048 pop dps 017C D0 D0 1049 pop psw 017E D0 83 1050 pop dph0 0180 D0 82 1051 pop dpl0 0182 D0 F0 1052 pop b 0184 D0 E0 1053 pop acc 0186 32 1054 reti 1055 0187 1056 int5_isr: 0187 C0 E0 1057 push acc 0189 C0 F0 1058 push b 018B C0 82 1059 push dpl0 018D C0 83 1060 push dph0 018F C0 D0 1061 push psw 0191 75 D0 00 1062 mov psw,#0x00 0194 C0 86 1063 push dps 0196 75 86 00 1064 mov dps,#0 1065 ;; clear interrupt 0199 E5 91 1066 mov a,exif 019B C2 E7 1067 clr acc.7 019D F5 91 1068 mov exif,a 1069 ;; handle interrupt 1070 ;; epilogue 019F D0 86 1071 pop dps 01A1 D0 D0 1072 pop psw 01A3 D0 83 1073 pop dph0 01A5 D0 82 1074 pop dpl0 01A7 D0 F0 1075 pop b 01A9 D0 E0 1076 pop acc 01AB 32 1077 reti 1078 01AC 1079 int6_isr: 01AC C0 E0 1080 push acc 01AE C0 F0 1081 push b 01B0 C0 82 1082 push dpl0 01B2 C0 83 1083 push dph0 01B4 C0 D0 1084 push psw 01B6 75 D0 00 1085 mov psw,#0x00 01B9 C0 86 1086 push dps 01BB 75 86 00 1087 mov dps,#0 1088 ;; clear interrupt 01BE C2 DB 1089 clr eicon+3 1090 ;; handle interrupt 1091 ;; epilogue 01C0 D0 86 1092 pop dps 01C2 D0 D0 1093 pop psw 01C4 D0 83 1094 pop dph0 01C6 D0 82 1095 pop dpl0 01C8 D0 F0 1096 pop b 01CA D0 E0 1097 pop acc 01CC 32 1098 reti 1099 01CD 1100 usb_sudav_isr: 01CD C0 E0 1101 push acc 01CF C0 F0 1102 push b 01D1 C0 82 1103 push dpl0 01D3 C0 83 1104 push dph0 01D5 C0 84 1105 push dpl1 01D7 C0 85 1106 push dph1 01D9 C0 D0 1107 push psw 01DB 75 D0 00 1108 mov psw,#0x00 01DE C0 86 1109 push dps 01E0 75 86 00 1110 mov dps,#0 01E3 C0 00 1111 push ar0 01E5 C0 07 1112 push ar7 1113 ;; clear interrupt 01E7 E5 91 1114 mov a,exif 01E9 C2 E4 1115 clr acc.4 01EB F5 91 1116 mov exif,a 01ED 90 7F AB 1117 mov dptr,#USBIRQ 01F0 74 01 1118 mov a,#0x01 01F2 F0 1119 movx @dptr,a 1120 ;; handle interrupt 01F3 75*00 00 1121 mov ctrlcode,#0 ; reset control out code 01F6 90 7F E9 1122 mov dptr,#SETUPDAT+1 01F9 E0 1123 movx a,@dptr ; bRequest field 1124 ;; standard commands 1125 ;; USB_REQ_GET_DESCRIPTOR 01FA B4 06 59 1126 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 01FD 90 7F E8 1127 mov dptr,#SETUPDAT ; bRequestType == 0x80 0200 E0 1128 movx a,@dptr 0201 B4 80 4F 1129 cjne a,#USB_DIR_IN,setupstallstd 0204 90 7F EB 1130 mov dptr,#SETUPDAT+3 0207 E0 1131 movx a,@dptr 0208 B4 01 0C 1132 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 020B 90 7F D4 1133 mov dptr,#SUDPTRH 020E 74s0B 1134 mov a,#>devicedescr 0210 F0 1135 movx @dptr,a 0211 A3 1136 inc dptr 0212 74r74 1137 mov a,#config0descr 0225 F0 1147 movx @dptr,a 0226 A3 1148 inc dptr 0227 74r86 1149 mov a,#stringdescr 0241 F5 83 1164 mov dph0,a 0243 E0 1165 movx a,@dptr 0244 F5 F0 1166 mov b,a 0246 A3 1167 inc dptr 0247 E0 1168 movx a,@dptr 0248 90 7F D4 1169 mov dptr,#SUDPTRH 024B F0 1170 movx @dptr,a 024C A3 1171 inc dptr 024D E5 F0 1172 mov a,b 024F F0 1173 movx @dptr,a 1174 ; sjmp setupackstd 0250 1175 setupackstd: 0250 02s06r60 1176 ljmp setupack 0253 1177 setupstallstd: 0253 02s06r5C 1178 ljmp setupstall 0256 1179 cmdnotgetdesc: 1180 ;; USB_REQ_SET_CONFIGURATION 0256 B4 09 41 1181 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 0259 90 7F E8 1182 mov dptr,#SETUPDAT 025C E0 1183 movx a,@dptr 025D 70 F4 1184 jnz setupstallstd 025F 90 7F EA 1185 mov dptr,#SETUPDAT+2 0262 E0 1186 movx a,@dptr 0263 24 FE 1187 add a,#-2 0265 40 EC 1188 jc setupstallstd 0267 E0 1189 movx a,@dptr 0268 F5*22 1190 mov numconfig,a 026A 1191 cmdresettoggleshalt: 026A 90 7F D7 1192 mov dptr,#TOGCTL 026D 78 07 1193 mov r0,#7 026F E8 1194 0$: mov a,r0 0270 44 10 1195 orl a,#0x10 0272 F0 1196 movx @dptr,a 0273 44 30 1197 orl a,#0x30 0275 F0 1198 movx @dptr,a 0276 E8 1199 mov a,r0 0277 F0 1200 movx @dptr,a 0278 44 20 1201 orl a,#0x20 027A F0 1202 movx @dptr,a 027B D8 F2 1203 djnz r0,0$ 027D E4 1204 clr a 027E F0 1205 movx @dptr,a 027F 74 02 1206 mov a,#2 0281 90 7F B6 1207 mov dptr,#IN1CS 0284 78 07 1208 mov r0,#7 0286 F0 1209 1$: movx @dptr,a 0287 A3 1210 inc dptr 0288 A3 1211 inc dptr 0289 D8 FB 1212 djnz r0,1$ 028B 90 7F C6 1213 mov dptr,#OUT1CS 028E 78 07 1214 mov r0,#7 0290 F0 1215 2$: movx @dptr,a 0291 A3 1216 inc dptr 0292 A3 1217 inc dptr 0293 D8 FB 1218 djnz r0,2$ 0295 12s08rBC 1219 lcall fillusbintr 0298 80 B6 1220 sjmp setupackstd 029A 1221 cmdnotsetconf: 1222 ;; USB_REQ_SET_INTERFACE 029A B4 0B 1E 1223 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 029D 90 7F E8 1224 mov dptr,#SETUPDAT 02A0 E0 1225 movx a,@dptr 02A1 B4 01 AF 1226 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 02A4 E5*22 1227 mov a,numconfig 02A6 B4 01 AA 1228 cjne a,#1,setupstallstd 02A9 90 7F EC 1229 mov dptr,#SETUPDAT+4 02AC E0 1230 movx a,@dptr 02AD 24 FC 1231 add a,#-NUMINTERFACES 02AF 40 A2 1232 jc setupstallstd 02B1 24r27 1233 add a,#NUMINTERFACES+altsetting 02B3 F8 1234 mov r0,a 02B4 90 7F EA 1235 mov dptr,#SETUPDAT+2 02B7 E0 1236 movx a,@dptr 02B8 F6 1237 mov @r0,a 02B9 80 AF 1238 sjmp cmdresettoggleshalt 02BB 1239 cmdnotsetint: 1240 ;; USB_REQ_GET_INTERFACE 02BB B4 0A 24 1241 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 02BE 90 7F E8 1242 mov dptr,#SETUPDAT 02C1 E0 1243 movx a,@dptr 02C2 B4 81 8E 1244 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 02C5 E5*22 1245 mov a,numconfig 02C7 B4 01 89 1246 cjne a,#1,setupstallstd 02CA 90 7F EC 1247 mov dptr,#SETUPDAT+4 02CD E0 1248 movx a,@dptr 02CE 24 FC 1249 add a,#-NUMINTERFACES 02D0 40 81 1250 jc setupstallstd 02D2 24r27 1251 add a,#NUMINTERFACES+altsetting 02D4 F8 1252 mov r0,a 02D5 E6 1253 mov a,@r0 02D6 1254 cmdrespondonebyte: 02D6 90 7F 00 1255 mov dptr,#IN0BUF 02D9 F0 1256 movx @dptr,a 02DA 90 7F B5 1257 mov dptr,#IN0BC 02DD 74 01 1258 mov a,#1 02DF F0 1259 movx @dptr,a 02E0 80 4E 1260 sjmp setupackstd2 02E2 1261 cmdnotgetint: 1262 ;; USB_REQ_GET_CONFIGURATION 02E2 B4 08 0B 1263 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 02E5 90 7F E8 1264 mov dptr,#SETUPDAT 02E8 E0 1265 movx a,@dptr 02E9 B4 80 47 1266 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 02EC E5*22 1267 mov a,numconfig 02EE 80 E6 1268 sjmp cmdrespondonebyte 02F0 1269 cmdnotgetconf: 1270 ;; USB_REQ_GET_STATUS (0) 02F0 70 44 1271 jnz cmdnotgetstat 02F2 90 7F E8 1272 mov dptr,#SETUPDAT 02F5 E0 1273 movx a,@dptr 02F6 B4 80 11 1274 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 02F9 74 01 1275 mov a,#1 02FB 1276 cmdrespondstat: 02FB 90 7F 00 1277 mov dptr,#IN0BUF 02FE F0 1278 movx @dptr,a 02FF A3 1279 inc dptr 0300 E4 1280 clr a 0301 F0 1281 movx @dptr,a 0302 90 7F B5 1282 mov dptr,#IN0BC 0305 74 02 1283 mov a,#2 0307 F0 1284 movx @dptr,a 0308 80 26 1285 sjmp setupackstd2 030A 1286 cmdnotgetstatdev: 030A B4 81 03 1287 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 030D E4 1288 clr a 030E 80 EB 1289 sjmp cmdrespondstat 0310 1290 cmdnotgetstatintf: 0310 B4 82 20 1291 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 0313 90 7F EC 1292 mov dptr,#SETUPDAT+4 0316 E0 1293 movx a,@dptr 0317 90 7F C4 1294 mov dptr,#OUT1CS-2 031A 30 E7 03 1295 jnb acc.7,0$ 031D 90 7F B4 1296 mov dptr,#IN1CS-2 0320 54 0F 1297 0$: anl a,#15 0322 60 0F 1298 jz setupstallstd2 0324 20 E3 0C 1299 jb acc.3,setupstallstd2 0327 25 E0 1300 add a,acc 0329 25 82 1301 add a,dpl0 032B F5 82 1302 mov dpl0,a 032D E0 1303 movx a,@dptr 032E 80 CB 1304 sjmp cmdrespondstat 0330 1305 setupackstd2: 0330 02s06r60 1306 ljmp setupack 0333 1307 setupstallstd2: 0333 02s06r5C 1308 ljmp setupstall 0336 1309 cmdnotgetstat: 1310 ;; USB_REQ_SET_FEATURE 0336 B4 03 05 1311 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 0339 75 F0 01 1312 mov b,#1 033C 80 06 1313 sjmp handleftr 033E 1314 cmdnotsetftr: 1315 ;; USB_REQ_CLEAR_FEATURE 033E B4 01 44 1316 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 0341 75 F0 00 1317 mov b,#0 0344 1318 handleftr: 0344 90 7F E8 1319 mov dptr,#SETUPDAT 0347 E0 1320 movx a,@dptr 0348 B4 02 E8 1321 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 034B A3 1322 inc dptr 034C A3 1323 inc dptr 034D E0 1324 movx a,@dptr 034E 70 E3 1325 jnz setupstallstd2 ; not ENDPOINT_HALT feature 0350 A3 1326 inc dptr 0351 E0 1327 movx a,@dptr 0352 70 DF 1328 jnz setupstallstd2 0354 A3 1329 inc dptr 0355 E0 1330 movx a,@dptr 0356 90 7F C4 1331 mov dptr,#OUT1CS-2 0359 30 E7 05 1332 jnb acc.7,0$ 035C 90 7F B4 1333 mov dptr,#IN1CS-2 035F 44 10 1334 orl a,#0x10 0361 20 E3 CF 1335 0$: jb acc.3,setupstallstd2 1336 ;; clear data toggle 0364 54 1F 1337 anl a,#0x1f 0366 05 86 1338 inc dps 0368 90 7F D7 1339 mov dptr,#TOGCTL 036B F0 1340 movx @dptr,a 036C 44 20 1341 orl a,#0x20 036E F0 1342 movx @dptr,a 036F 54 0F 1343 anl a,#15 0371 F0 1344 movx @dptr,a 0372 15 86 1345 dec dps 1346 ;; clear/set ep halt feature 0374 25 E0 1347 add a,acc 0376 25 82 1348 add a,dpl0 0378 F5 82 1349 mov dpl0,a 037A E5 F0 1350 mov a,b 037C F0 1351 movx @dptr,a 037D 80 B1 1352 sjmp setupackstd2 1353 037F 1354 cmdnotc0_1: 037F 02s04r17 1355 ljmp cmdnotc0 0382 1356 setupstallc0_1: 0382 02s06r5C 1357 ljmp setupstall 1358 0385 1359 cmdnotclrftr: 1360 ;; vendor specific commands 1361 ;; 0xc0 0385 B4 C0 F7 1362 cjne a,#0xc0,cmdnotc0_1 0388 90 7F E8 1363 mov dptr,#SETUPDAT ; bRequestType == 0xc0 038B E0 1364 movx a,@dptr 038C B4 C0 F3 1365 cjne a,#0xc0,setupstallc0_1 1366 ;; fill status buffer 038F E5*0C 1367 mov a,pttforce 0391 F5 F0 1368 mov b,a 0393 A2 E0 1369 mov c,acc.0 0395 92 F2 1370 mov b.2,c 0397 90 C0 09 1371 mov dptr,#AUDIOSTAT 039A E0 1372 movx a,@dptr 039B A2 E0 1373 mov c,acc.0 039D B3 1374 cpl c 039E 92 F3 1375 mov b.3,c 03A0 A2*09 1376 mov c,uartempty 03A2 92 F5 1377 mov b.5,c 03A4 E4 1378 clr a 03A5 90 7F 04 1379 mov dptr,#(IN0BUF+4) 03A8 F0 1380 movx @dptr,a 1381 ;; bytewide elements 03A9 90 7F 00 1382 mov dptr,#(IN0BUF) 03AC E5 F0 1383 mov a,b 03AE F0 1384 movx @dptr,a 03AF E4 1385 clr a 03B0 90 7F 01 1386 mov dptr,#(IN0BUF+1) 03B3 F0 1387 movx @dptr,a 03B4 90 7F 02 1388 mov dptr,#(IN0BUF+2) 03B7 F0 1389 movx @dptr,a 03B8 90 C0 04 1390 mov dptr,#AUDIORSSI 03BB E0 1391 movx a,@dptr 03BC 90 7F 03 1392 mov dptr,#(IN0BUF+3) 03BF F0 1393 movx @dptr,a 1394 ;; counter 03C0 05*04 1395 inc irqcount 03C2 E5*04 1396 mov a,irqcount 03C4 90 7F 05 1397 mov dptr,#(IN0BUF+5) 03C7 F0 1398 movx @dptr,a 1399 ;; additional fields (HDLC state mach) 03C8 E4 1400 clr a 03C9 A3 1401 inc dptr 03CA F0 1402 movx @dptr,a 03CB A3 1403 inc dptr 03CC F0 1404 movx @dptr,a 03CD A3 1405 inc dptr 03CE F0 1406 movx @dptr,a 03CF A3 1407 inc dptr 03D0 F0 1408 movx @dptr,a 03D1 A3 1409 inc dptr 03D2 F0 1410 movx @dptr,a 03D3 A3 1411 inc dptr 03D4 F0 1412 movx @dptr,a 03D5 A3 1413 inc dptr 03D6 F0 1414 movx @dptr,a 03D7 A3 1415 inc dptr 03D8 F0 1416 movx @dptr,a 03D9 A3 1417 inc dptr 03DA F0 1418 movx @dptr,a 03DB A3 1419 inc dptr 03DC F0 1420 movx @dptr,a 03DD A3 1421 inc dptr 03DE F0 1422 movx @dptr,a 03DF A3 1423 inc dptr 03E0 F0 1424 movx @dptr,a 1425 ;; FPGA registers 03E1 90 C0 01 1426 mov dptr,#AUDIORXFIFOCNT 03E4 E0 1427 movx a,@dptr 03E5 90 7F 12 1428 mov dptr,#(IN0BUF+18) 03E8 F0 1429 movx @dptr,a 03E9 90 C0 02 1430 mov dptr,#AUDIOTXFIFOCNT 03EC E0 1431 movx a,@dptr 03ED 90 7F 13 1432 mov dptr,#(IN0BUF+19) 03F0 F0 1433 movx @dptr,a 03F1 E5 20 1434 mov a,ctrlreg 03F3 A3 1435 inc dptr 03F4 F0 1436 movx @dptr,a 03F5 90 C0 09 1437 mov dptr,#AUDIOSTAT 03F8 E0 1438 movx a,@dptr 03F9 90 7F 15 1439 mov dptr,#(IN0BUF+21) 03FC F0 1440 movx @dptr,a 1441 ;; Anchor Registers 03FD 90 7F C8 1442 mov dptr,#OUT2CS 0400 E0 1443 movx a,@dptr 0401 90 7F 16 1444 mov dptr,#(IN0BUF+22) 0404 F0 1445 movx @dptr,a 1446 ;; set length 0405 90 7F EE 1447 mov dptr,#SETUPDAT+6 ; wLength 0408 E0 1448 movx a,@dptr 0409 24 E9 1449 add a,#-(6+12+4+1) 040B 50 01 1450 jnc 4$ 040D E4 1451 clr a 040E 24 17 1452 4$: add a,#(6+12+4+1) 0410 90 7F B5 1453 mov dptr,#IN0BC 0413 F0 1454 movx @dptr,a 0414 02s06r60 1455 ljmp setupack 0417 1456 cmdnotc0: 1457 ;; 0xc8 0417 B4 C8 19 1458 cjne a,#0xc8,cmdnotc8 041A 90 7F E8 1459 mov dptr,#SETUPDAT ; bRequestType == 0xc0 041D E0 1460 movx a,@dptr 041E B4 C0 0F 1461 cjne a,#0xc0,setupstallc8 0421 74 04 1462 mov a,#4 0423 90 7F 00 1463 mov dptr,#IN0BUF 0426 F0 1464 movx @dptr,a 0427 90 7F B5 1465 mov dptr,#IN0BC 042A 74 01 1466 mov a,#1 042C F0 1467 movx @dptr,a 042D 02s06r60 1468 ljmp setupack 0430 1469 setupstallc8: 0430 02s06r5C 1470 ljmp setupstall 0433 1471 cmdnotc8: 1472 ;; 0xc9 0433 B4 C9 21 1473 cjne a,#0xc9,cmdnotc9 0436 90 7F E8 1474 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0439 E0 1475 movx a,@dptr 043A B4 C0 17 1476 cjne a,#0xc0,setupstallc9 043D 90 7F 00 1477 mov dptr,#IN0BUF 0440 78rF0 1478 mov r0,#parserial 0442 E2 1479 0$: movx a,@r0 0443 60 05 1480 jz 1$ 0445 F0 1481 movx @dptr,a 0446 08 1482 inc r0 0447 A3 1483 inc dptr 0448 80 F8 1484 sjmp 0$ 044A E8 1485 1$: mov a,r0 044B 24 10 1486 add a,#-0xf0 ; -parserial 044D 90 7F B5 1487 mov dptr,#IN0BC 0450 F0 1488 movx @dptr,a 0451 02s06r60 1489 ljmp setupack 0454 1490 setupstallc9: 0454 02s06r5C 1491 ljmp setupstall 0457 1492 cmdnotc9: 1493 ;; 0xd0 0457 B4 D0 45 1494 cjne a,#0xd0,cmdnotd0 045A 90 7F E8 1495 mov dptr,#SETUPDAT ; bRequestType == 0xc0 045D E0 1496 movx a,@dptr 045E B4 C0 3B 1497 cjne a,#0xc0,setupstalld0 0461 90 7F EC 1498 mov dptr,#SETUPDAT+4 ; wIndex 0464 E0 1499 movx a,@dptr 0465 B4 01 08 1500 cjne a,#1,0$ 0468 90 7F EA 1501 mov dptr,#SETUPDAT+2 ; wValue 046B E0 1502 movx a,@dptr 046C 54 01 1503 anl a,#1 046E F5*0C 1504 mov pttforce,a 0470 1505 0$: ;; PTT status 0470 90 7F 00 1506 mov dptr,#IN0BUF 0473 E5*0C 1507 mov a,pttforce 0475 F0 1508 movx @dptr,a 1509 ;; DCD status 0476 90 C0 09 1510 mov dptr,#AUDIOSTAT 0479 E0 1511 movx a,@dptr 047A 54 01 1512 anl a,#1 047C 64 01 1513 xrl a,#1 047E 90 7F 01 1514 mov dptr,#IN0BUF+1 0481 F0 1515 movx @dptr,a 1516 ;; RSSI 0482 90 C0 04 1517 mov dptr,#AUDIORSSI 0485 E0 1518 movx a,@dptr 0486 90 7F 02 1519 mov dptr,#IN0BUF+2 0489 F0 1520 movx @dptr,a 1521 ;; length 048A 90 7F EE 1522 mov dptr,#SETUPDAT+6 ; wLength 048D E0 1523 movx a,@dptr 048E 24 FD 1524 add a,#-3 0490 50 01 1525 jnc 2$ 0492 E4 1526 clr a 0493 24 03 1527 2$: add a,#3 0495 90 7F B5 1528 mov dptr,#IN0BC 0498 F0 1529 movx @dptr,a 0499 02s06r60 1530 ljmp setupack 049C 1531 setupstalld0: 049C 02s06r5C 1532 ljmp setupstall 049F 1533 cmdnotd0: 1534 ;; 0xd2 049F B4 D2 20 1535 cjne a,#0xd2,cmdnotd2 04A2 90 7F E8 1536 mov dptr,#SETUPDAT ; bRequestType == 0x40 04A5 E0 1537 movx a,@dptr 04A6 B4 40 16 1538 cjne a,#0x40,setupstalld2 04A9 90 7F EA 1539 mov dptr,#SETUPDAT+2 ; wValue 04AC E0 1540 movx a,@dptr 04AD F5 F0 1541 mov b,a 04AF 90 7F 98 1542 mov dptr,#OUTC 04B2 E0 1543 movx a,@dptr 04B3 A2 F0 1544 mov c,b.0 04B5 92 E3 1545 mov acc.3,c 04B7 A2 F1 1546 mov c,b.1 04B9 92 E5 1547 mov acc.5,c 04BB F0 1548 movx @dptr,a 04BC 02s06r60 1549 ljmp setupack 04BF 1550 setupstalld2: 04BF 02s06r5C 1551 ljmp setupstall 04C2 1552 cmdnotd2: 1553 ;; 0xd3 04C2 B4 D3 16 1554 cjne a,#0xd3,cmdnotd3 04C5 90 7F E8 1555 mov dptr,#SETUPDAT ; bRequestType == 0x40 04C8 E0 1556 movx a,@dptr 04C9 B4 40 07 1557 cjne a,#0x40,setupstalld3 04CC 90 7F EA 1558 mov dptr,#SETUPDAT+2 ; wValue 04CF E0 1559 movx a,@dptr 04D0 10*09 03 1560 jbc uartempty,cmdd2cont 04D3 1561 setupstalld3: 04D3 02s06r5C 1562 ljmp setupstall 04D6 1563 cmdd2cont: 04D6 F5 99 1564 mov sbuf0,a 04D8 02s06r60 1565 ljmp setupack 04DB 1566 cmdnotd3: 1567 ;; 0xd4 04DB B4 D4 49 1568 cjne a,#0xd4,cmdnotd4 04DE 90 7F E8 1569 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04E1 E0 1570 movx a,@dptr 04E2 B4 C0 3F 1571 cjne a,#0xc0,setupstalld4 04E5 90 7F EC 1572 mov dptr,#SETUPDAT+4 ; wIndex 04E8 E0 1573 movx a,@dptr 04E9 90 7F EA 1574 mov dptr,#SETUPDAT+2 ; wValue 04EC B4 01 09 1575 cjne a,#1,0$ 04EF E0 1576 movx a,@dptr 04F0 90 C0 0D 1577 mov dptr,#AUDIOMDISCOUT 04F3 F0 1578 movx @dptr,a 04F4 F5*21 1579 mov mdiscout,a 04F6 80 0A 1580 sjmp 1$ 04F8 B4 02 07 1581 0$: cjne a,#2,1$ 04FB E0 1582 movx a,@dptr 04FC 90 C0 0C 1583 mov dptr,#AUDIOMDISCTRIS 04FF F0 1584 movx @dptr,a 0500 F5*20 1585 mov mdisctris,a 0502 90 C0 0E 1586 1$: mov dptr,#AUDIOMDISCIN 0505 E0 1587 movx a,@dptr 0506 90 7F 00 1588 mov dptr,#IN0BUF+0 0509 F0 1589 movx @dptr,a 050A E5*21 1590 mov a,mdiscout 050C A3 1591 inc dptr 050D F0 1592 movx @dptr,a 050E E5*20 1593 mov a,mdisctris 0510 A3 1594 inc dptr 0511 F0 1595 movx @dptr,a 1596 ;; length 0512 90 7F EE 1597 mov dptr,#SETUPDAT+6 ; wLength 0515 E0 1598 movx a,@dptr 0516 24 FD 1599 add a,#-3 0518 50 01 1600 jnc 2$ 051A E4 1601 clr a 051B 24 03 1602 2$: add a,#3 051D 90 7F B5 1603 mov dptr,#IN0BC 0520 F0 1604 movx @dptr,a 0521 02s06r60 1605 ljmp setupack 0524 1606 setupstalld4: 0524 02s06r5C 1607 ljmp setupstall 0527 1608 cmdnotd4: 1609 ;; 0xd5 0527 B4 D5 3F 1610 cjne a,#0xd5,cmdnotd5 052A 90 7F E8 1611 mov dptr,#SETUPDAT ; bRequestType == 0xc0 052D E0 1612 movx a,@dptr 052E B4 C0 32 1613 cjne a,#0xc0,setupstalld5 0531 90 7F EC 1614 mov dptr,#SETUPDAT+4 ; wIndex 0534 E0 1615 movx a,@dptr 0535 B4 01 0A 1616 cjne a,#1,0$ 0538 90 7F EA 1617 mov dptr,#SETUPDAT+2 ; wValue 053B E0 1618 movx a,@dptr 053C 90 C0 0A 1619 mov dptr,#AUDIOT7FOUT 053F F0 1620 movx @dptr,a 0540 F5*1F 1621 mov t7fout,a 0542 90 C0 0B 1622 0$: mov dptr,#AUDIOT7FIN 0545 E0 1623 movx a,@dptr 0546 90 7F 00 1624 mov dptr,#IN0BUF+0 0549 F0 1625 movx @dptr,a 054A E5*1F 1626 mov a,t7fout 054C A3 1627 inc dptr 054D 90 7F 01 1628 mov dptr,#IN0BUF+1 0550 F0 1629 movx @dptr,a 1630 ;; length 0551 90 7F EE 1631 mov dptr,#SETUPDAT+6 ; wLength 0554 E0 1632 movx a,@dptr 0555 24 FE 1633 add a,#-2 0557 50 01 1634 jnc 2$ 0559 E4 1635 clr a 055A 24 02 1636 2$: add a,#2 055C 90 7F B5 1637 mov dptr,#IN0BC 055F F0 1638 movx @dptr,a 0560 02s06r60 1639 ljmp setupack 0563 1640 setupstalld5: 0563 1641 setupstalle0: 0563 02s06r5C 1642 ljmp setupstall 0566 1643 cmdnote0_0: 0566 02s05rFC 1644 ljmp cmdnote0 0569 1645 cmdnotd5: 1646 ;; 0xe0 0569 B4 E0 FA 1647 cjne a,#0xe0,cmdnote0_0 056C 90 7F E8 1648 mov dptr,#SETUPDAT ; bRequestType == 0xc0 056F E0 1649 movx a,@dptr 0570 B4 C0 F0 1650 cjne a,#0xc0,setupstalle0 1651 ;; set PTT, LED's and counter mode 0573 90 7F EC 1652 mov dptr,#SETUPDAT+4 ; wIndex 0576 E0 1653 movx a,@dptr 0577 B4 01 12 1654 cjne a,#1,1$ 057A 90 7F EA 1655 mov dptr,#SETUPDAT+2 ; wValue 057D E0 1656 movx a,@dptr 057E 54 78 1657 anl a,#0x78 0580 C5 20 1658 xch a,ctrlreg 0582 54 07 1659 anl a,#0x07 0584 45 20 1660 orl a,ctrlreg 0586 F5 20 1661 mov ctrlreg,a 0588 90 C0 08 1662 mov dptr,#AUDIOCTRL 058B F0 1663 movx @dptr,a 058C 90 7F EE 1664 1$: mov dptr,#SETUPDAT+6 ; wLength 058F E0 1665 movx a,@dptr 0590 60 0D 1666 jz 3$ 0592 B4 01 11 1667 cjne a,#1,2$ 0595 E5 20 1668 mov a,ctrlreg 0597 90 7F 00 1669 mov dptr,#IN0BUF 059A 54 7F 1670 anl a,#0x7f 059C F0 1671 movx @dptr,a 059D 74 01 1672 mov a,#1 059F 90 7F B5 1673 3$: mov dptr,#IN0BC 05A2 F0 1674 movx @dptr,a 05A3 02s06r60 1675 ljmp setupack 05A6 90 C0 08 1676 2$: mov dptr,#AUDIOCTRL 05A9 D2*07 1677 setb ctrl_cntsel 05AB E5 20 1678 mov a,ctrlreg 05AD F0 1679 movx @dptr,a 05AE 90 C0 05 1680 mov dptr,#AUDIOCNTLOW 05B1 E0 1681 movx a,@dptr 05B2 90 7F 04 1682 mov dptr,#IN0BUF+4 05B5 F0 1683 movx @dptr,a 05B6 90 C0 06 1684 mov dptr,#AUDIOCNTMID 05B9 E0 1685 movx a,@dptr 05BA 90 7F 05 1686 mov dptr,#IN0BUF+5 05BD F0 1687 movx @dptr,a 05BE 90 C0 07 1688 mov dptr,#AUDIOCNTHIGH 05C1 E0 1689 movx a,@dptr 05C2 90 7F 06 1690 mov dptr,#IN0BUF+6 05C5 F0 1691 movx @dptr,a 05C6 90 C0 08 1692 mov dptr,#AUDIOCTRL 05C9 C2*07 1693 clr ctrl_cntsel 05CB E5 20 1694 mov a,ctrlreg 05CD F0 1695 movx @dptr,a 05CE 90 7F 00 1696 mov dptr,#IN0BUF 05D1 F0 1697 movx @dptr,a 05D2 90 C0 05 1698 mov dptr,#AUDIOCNTLOW 05D5 E0 1699 movx a,@dptr 05D6 90 7F 01 1700 mov dptr,#IN0BUF+1 05D9 F0 1701 movx @dptr,a 05DA 90 C0 06 1702 mov dptr,#AUDIOCNTMID 05DD E0 1703 movx a,@dptr 05DE 90 7F 02 1704 mov dptr,#IN0BUF+2 05E1 F0 1705 movx @dptr,a 05E2 90 C0 07 1706 mov dptr,#AUDIOCNTHIGH 05E5 E0 1707 movx a,@dptr 05E6 90 7F 03 1708 mov dptr,#IN0BUF+3 05E9 F0 1709 movx @dptr,a 1710 ;; length 05EA 90 7F EE 1711 mov dptr,#SETUPDAT+6 ; wLength 05ED E0 1712 movx a,@dptr 05EE 24 F9 1713 add a,#-7 05F0 50 01 1714 jnc 4$ 05F2 E4 1715 clr a 05F3 24 07 1716 4$: add a,#7 05F5 90 7F B5 1717 mov dptr,#IN0BC 05F8 F0 1718 movx @dptr,a 05F9 02s06r60 1719 ljmp setupack 05FC 1720 cmdnote0: 1721 ;; 0xe1 05FC B4 E1 3A 1722 cjne a,#0xe1,cmdnote1 05FF 90 7F E8 1723 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0602 E0 1724 movx a,@dptr 0603 B4 C0 30 1725 cjne a,#0xc0,setupstalle1 0606 90 7F 00 1726 mov dptr,#IN0BUF 0609 E5*05 1727 mov a,sofcount 060B F0 1728 movx @dptr,a 060C A3 1729 inc dptr 060D E5*09 1730 mov a,framesize 060F F0 1731 movx @dptr,a 0610 A3 1732 inc dptr 0611 E5*06 1733 mov a,divider 0613 F0 1734 movx @dptr,a 0614 A3 1735 inc dptr 0615 E5*07 1736 mov a,divider+1 0617 F0 1737 movx @dptr,a 0618 A3 1738 inc dptr 0619 E5*08 1739 mov a,divrel 061B F0 1740 movx @dptr,a 061C A3 1741 inc dptr 061D E5*0A 1742 mov a,pllcorrvar 061F F0 1743 movx @dptr,a 0620 A3 1744 inc dptr 0621 E5*0B 1745 mov a,txfifocount 0623 F0 1746 movx @dptr,a 1747 1748 ;mov dptr,#AUDIOTXFIFOCNT 1749 ;movx a,@dptr 1750 ;mov dptr,#IN0BUF+6 1751 ;movx @dptr,a 1752 1753 ;; length 0624 90 7F EE 1754 mov dptr,#SETUPDAT+6 ; wLength 0627 E0 1755 movx a,@dptr 0628 24 F9 1756 add a,#-7 062A 50 01 1757 jnc 1$ 062C E4 1758 clr a 062D 24 07 1759 1$: add a,#7 062F 90 7F B5 1760 mov dptr,#IN0BC 0632 F0 1761 movx @dptr,a 0633 02s06r60 1762 ljmp setupack 0636 1763 setupstalle1: 0636 02s06r5C 1764 ljmp setupstall 0639 1765 cmdnote1: 1766 ;; 0xe2 0639 B4 E2 20 1767 cjne a,#0xe2,cmdnote2 063C 90 7F E8 1768 mov dptr,#SETUPDAT ; bRequestType == 0xc0 063F E0 1769 movx a,@dptr 0640 B4 C0 16 1770 cjne a,#0xc0,setupstalle2 0643 90 7F 00 1771 mov dptr,#IN0BUF 0646 78r00 1772 mov r0,#txsamples 0648 AF*09 1773 mov r7,framesize 064A E6 1774 1$: mov a,@r0 064B F0 1775 movx @dptr,a 064C 08 1776 inc r0 064D A3 1777 inc dptr 064E DF FA 1778 djnz r7,1$ 0650 90 7F B5 1779 mov dptr,#IN0BC 0653 E5*09 1780 mov a,framesize 0655 F0 1781 movx @dptr,a 0656 02s06r60 1782 ljmp setupack 0659 1783 setupstalle2: 0659 02s06r5C 1784 ljmp setupstall 065C 1785 cmdnote2: 1786 1787 ;; unknown commands fall through to setupstall 1788 065C 1789 setupstall: 065C 74 03 1790 mov a,#3 065E 80 02 1791 sjmp endsetup 0660 1792 setupack: 0660 74 02 1793 mov a,#2 0662 1794 endsetup: 0662 90 7F B4 1795 mov dptr,#EP0CS 0665 F0 1796 movx @dptr,a 0666 1797 endusbisr: 1798 ;; epilogue 0666 D0 07 1799 pop ar7 0668 D0 00 1800 pop ar0 066A D0 86 1801 pop dps 066C D0 D0 1802 pop psw 066E D0 85 1803 pop dph1 0670 D0 84 1804 pop dpl1 0672 D0 83 1805 pop dph0 0674 D0 82 1806 pop dpl0 0676 D0 F0 1807 pop b 0678 D0 E0 1808 pop acc 067A 32 1809 reti 1810 067B 1811 usb_sof_isr: 067B C0 E0 1812 push acc 067D C0 F0 1813 push b 067F C0 82 1814 push dpl0 0681 C0 83 1815 push dph0 0683 C0 84 1816 push dpl1 0685 C0 85 1817 push dph1 0687 C0 D0 1818 push psw 0689 75 D0 00 1819 mov psw,#0x00 068C C0 86 1820 push dps 068E 75 86 00 1821 mov dps,#0 0691 C0 02 1822 push ar2 0693 C0 03 1823 push ar3 0695 C0 00 1824 push ar0 1825 ;; clear interrupt 0697 E5 91 1826 mov a,exif 0699 C2 E4 1827 clr acc.4 069B F5 91 1828 mov exif,a 069D 90 7F AB 1829 mov dptr,#USBIRQ 06A0 74 02 1830 mov a,#0x02 06A2 F0 1831 movx @dptr,a 1832 ;; handle interrupt 06A3 05*05 1833 inc sofcount 1834 ;; debugging: we have two cases 1835 ;; if the ISO frame size is just 2 bytes, 1836 ;; we return the frame number, otherwise 1837 ;; the required numbers of samples 06A5 E5*09 1838 mov a,framesize 06A7 B4 02 14 1839 cjne a,#2,1$ 1840 ;; copy the frame number 06AA 90 7F D8 1841 mov dptr,#USBFRAMEL 06AD E0 1842 movx a,@dptr 06AE A3 1843 inc dptr 06AF 05 86 1844 inc dps 06B1 90 7F 68 1845 mov dptr,#IN8DATA 06B4 F0 1846 movx @dptr,a 06B5 15 86 1847 dec dps 06B7 E0 1848 movx a,@dptr 06B8 05 86 1849 inc dps 06BA F0 1850 movx @dptr,a 06BB 02s07rAE 1851 ljmp sofendisr 06BE B4 03 36 1852 1$: cjne a,#3,sofsampleisr 06C1 90 7F A0 1853 mov dptr,#ISOERR 06C4 E0 1854 movx a,@dptr 06C5 20 E0 23 1855 jb acc.0,3$ 06C8 90 7F 70 1856 mov dptr,#OUT8BCH 06CB E0 1857 movx a,@dptr 06CC 70 1D 1858 jnz 3$ 06CE 90 7F 71 1859 mov dptr,#OUT8BCL 06D1 E0 1860 movx a,@dptr 06D2 B4 03 16 1861 cjne a,#3,3$ 06D5 FA 1862 mov r2,a 06D6 90 7F 60 1863 mov dptr,#OUT8DATA 06D9 05 86 1864 inc dps 06DB 90 7F 68 1865 mov dptr,#IN8DATA 06DE 15 86 1866 dec dps 06E0 E0 1867 2$: movx a,@dptr 06E1 05 86 1868 inc dps 06E3 F0 1869 movx @dptr,a 06E4 15 86 1870 dec dps 06E6 DA F8 1871 djnz r2,2$ 06E8 02s07rAE 1872 ljmp sofendisr 06EB 7A 03 1873 3$: mov r2,#3 06ED 90 7F 68 1874 mov dptr,#IN8DATA 06F0 E4 1875 clr a 06F1 F0 1876 4$: movx @dptr,a 06F2 DA FD 1877 djnz r2,4$ 06F4 02s07rAE 1878 ljmp sofendisr 06F7 1879 sofsampleisr: 06F7 90 C0 01 1880 mov dptr,#AUDIORXFIFOCNT 06FA E0 1881 movx a,@dptr 06FB C3 1882 clr c 06FC 95*09 1883 subb a,framesize 06FE E0 1884 movx a,@dptr 06FF 40 02 1885 jc 1$ 0701 E5*09 1886 mov a,framesize 0703 FA 1887 1$: mov r2,a 0704 FB 1888 mov r3,a 0705 60 12 1889 jz 2$ 0707 90 C0 00 1890 mov dptr,#AUDIORXFIFO 070A 05 86 1891 inc dps 070C 90 7F 68 1892 mov dptr,#IN8DATA 070F 15 86 1893 dec dps 0711 E0 1894 3$: movx a,@dptr 0712 05 86 1895 inc dps 0714 F0 1896 movx @dptr,a 0715 15 86 1897 dec dps 0717 DA F8 1898 djnz r2,3$ 0719 E5*09 1899 2$: mov a,framesize 071B C3 1900 clr c 071C 9B 1901 subb a,r3 071D 60 08 1902 jz 4$ 071F FA 1903 mov r2,a 0720 90 7F 68 1904 mov dptr,#IN8DATA 0723 E4 1905 clr a 0724 F0 1906 5$: movx @dptr,a 0725 DA FD 1907 djnz r2,5$ 1908 ;; sample rate adjustment 0727 90 C0 01 1909 4$: mov dptr,#AUDIORXFIFOCNT 072A E0 1910 movx a,@dptr 072B F5*0A 1911 mov pllcorrvar,a 072D 24 FC 1912 add a,#-4 072F 60 05 1913 jz 10$ ; no adjustment 0731 33 1914 rlc a 0732 95 E0 1915 subb a,acc 0734 D2 E0 1916 setb acc.0 0736 FB 1917 10$: mov r3,a ; r3 & acc contain the adjust value 0737 25*08 1918 add a,divrel 1919 ;; zero is the guard value 0739 60 02 1920 jz 11$ 073B F5*08 1921 mov divrel,a 073D E5*08 1922 11$: mov a,divrel 073F 03 1923 rr a 0740 03 1924 rr a 0741 03 1925 rr a 0742 03 1926 rr a 0743 54 0F 1927 anl a,#0xf 0745 2B 1928 add a,r3 ; momentary correction 0746 25*06 1929 add a,divider 0748 FA 1930 mov r2,a 0749 E5*07 1931 mov a,divider+1 074B 34 00 1932 addc a,#0 074D 90 C0 02 1933 mov dptr,#AUDIODIVIDERHI 0750 F0 1934 movx @dptr,a 0751 EA 1935 mov a,r2 0752 90 C0 01 1936 mov dptr,#AUDIODIVIDERLO 0755 F0 1937 movx @dptr,a 1938 ;; OUT data 0756 90 7F A0 1939 mov dptr,#ISOERR 0759 E0 1940 movx a,@dptr 075A 20 E0 39 1941 jb acc.0,20$ 075D 90 7F 70 1942 mov dptr,#OUT8BCH 0760 E0 1943 movx a,@dptr 0761 70 33 1944 jnz 20$ 0763 90 7F 71 1945 mov dptr,#OUT8BCL 0766 E0 1946 movx a,@dptr 0767 C3 1947 clr c 0768 95*09 1948 subb a,framesize 076A 70 2A 1949 jnz 20$ 076C 90 C0 02 1950 mov dptr,#AUDIOTXFIFOCNT 076F E0 1951 movx a,@dptr 0770 F5*0B 1952 mov txfifocount,a 0772 C3 1953 clr c 0773 95*09 1954 subb a,framesize 0775 E5*0B 1955 mov a,txfifocount 0777 40 02 1956 jc 14$ 0779 E5*09 1957 mov a,framesize 077B 60 17 1958 14$: jz 13$ 077D FA 1959 mov r2,a 077E 90 7F 60 1960 mov dptr,#OUT8DATA 0781 05 86 1961 inc dps 0783 90 C0 00 1962 mov dptr,#AUDIOTXFIFO 0786 15 86 1963 dec dps 0788 78r00 1964 mov r0,#txsamples 078A E0 1965 12$: movx a,@dptr 078B 05 86 1966 inc dps 078D F0 1967 movx @dptr,a 078E 15 86 1968 dec dps 0790 F6 1969 mov @r0,a 0791 08 1970 inc r0 0792 DA F6 1971 djnz r2,12$ 0794 80 18 1972 13$: sjmp sofendisr 1973 ;; initialize TX if invalid packet 0796 90 C0 02 1974 20$: mov dptr,#AUDIOTXFIFOCNT 0799 E0 1975 movx a,@dptr 079A F5*0B 1976 mov txfifocount,a 079C 24 FC 1977 add a,#-4 079E 54 3F 1978 anl a,#0x3f 07A0 60 0C 1979 jz sofendisr 07A2 FA 1980 mov r2,a 07A3 90 C0 00 1981 mov dptr,#AUDIOTXFIFO 07A6 E4 1982 clr a 07A7 78r00 1983 mov r0,#txsamples 07A9 F0 1984 21$: movx @dptr,a 07AA F6 1985 mov @r0,a 07AB 08 1986 inc r0 07AC DA FB 1987 djnz r2,21$ 1988 07AE 1989 sofendisr: 1990 ;; epilogue 07AE D0 00 1991 pop ar0 07B0 D0 03 1992 pop ar3 07B2 D0 02 1993 pop ar2 07B4 D0 86 1994 pop dps 07B6 D0 D0 1995 pop psw 07B8 D0 85 1996 pop dph1 07BA D0 84 1997 pop dpl1 07BC D0 83 1998 pop dph0 07BE D0 82 1999 pop dpl0 07C0 D0 F0 2000 pop b 07C2 D0 E0 2001 pop acc 07C4 32 2002 reti 2003 2004 07C5 2005 usb_sutok_isr: 07C5 C0 E0 2006 push acc 07C7 C0 F0 2007 push b 07C9 C0 82 2008 push dpl0 07CB C0 83 2009 push dph0 07CD C0 D0 2010 push psw 07CF 75 D0 00 2011 mov psw,#0x00 07D2 C0 86 2012 push dps 07D4 75 86 00 2013 mov dps,#0 2014 ;; clear interrupt 07D7 E5 91 2015 mov a,exif 07D9 C2 E4 2016 clr acc.4 07DB F5 91 2017 mov exif,a 07DD 90 7F AB 2018 mov dptr,#USBIRQ 07E0 74 04 2019 mov a,#0x04 07E2 F0 2020 movx @dptr,a 2021 ;; handle interrupt 2022 ;; epilogue 07E3 D0 86 2023 pop dps 07E5 D0 D0 2024 pop psw 07E7 D0 83 2025 pop dph0 07E9 D0 82 2026 pop dpl0 07EB D0 F0 2027 pop b 07ED D0 E0 2028 pop acc 07EF 32 2029 reti 2030 07F0 2031 usb_suspend_isr: 07F0 C0 E0 2032 push acc 07F2 C0 F0 2033 push b 07F4 C0 82 2034 push dpl0 07F6 C0 83 2035 push dph0 07F8 C0 D0 2036 push psw 07FA 75 D0 00 2037 mov psw,#0x00 07FD C0 86 2038 push dps 07FF 75 86 00 2039 mov dps,#0 2040 ;; clear interrupt 0802 E5 91 2041 mov a,exif 0804 C2 E4 2042 clr acc.4 0806 F5 91 2043 mov exif,a 0808 90 7F AB 2044 mov dptr,#USBIRQ 080B 74 08 2045 mov a,#0x08 080D F0 2046 movx @dptr,a 2047 ;; handle interrupt 2048 ;; epilogue 080E D0 86 2049 pop dps 0810 D0 D0 2050 pop psw 0812 D0 83 2051 pop dph0 0814 D0 82 2052 pop dpl0 0816 D0 F0 2053 pop b 0818 D0 E0 2054 pop acc 081A 32 2055 reti 2056 081B 2057 usb_usbreset_isr: 081B C0 E0 2058 push acc 081D C0 F0 2059 push b 081F C0 82 2060 push dpl0 0821 C0 83 2061 push dph0 0823 C0 D0 2062 push psw 0825 75 D0 00 2063 mov psw,#0x00 0828 C0 86 2064 push dps 082A 75 86 00 2065 mov dps,#0 2066 ;; clear interrupt 082D E5 91 2067 mov a,exif 082F C2 E4 2068 clr acc.4 0831 F5 91 2069 mov exif,a 0833 90 7F AB 2070 mov dptr,#USBIRQ 0836 74 10 2071 mov a,#0x10 0838 F0 2072 movx @dptr,a 2073 ;; handle interrupt 2074 ;; epilogue 0839 D0 86 2075 pop dps 083B D0 D0 2076 pop psw 083D D0 83 2077 pop dph0 083F D0 82 2078 pop dpl0 0841 D0 F0 2079 pop b 0843 D0 E0 2080 pop acc 0845 32 2081 reti 2082 0846 2083 usb_ep0in_isr: 0846 C0 E0 2084 push acc 0848 C0 F0 2085 push b 084A C0 82 2086 push dpl0 084C C0 83 2087 push dph0 084E C0 84 2088 push dpl1 0850 C0 85 2089 push dph1 0852 C0 D0 2090 push psw 0854 75 D0 00 2091 mov psw,#0x00 0857 C0 86 2092 push dps 0859 75 86 00 2093 mov dps,#0 085C C0 00 2094 push ar0 085E C0 07 2095 push ar7 2096 ;; clear interrupt 0860 E5 91 2097 mov a,exif 0862 C2 E4 2098 clr acc.4 0864 F5 91 2099 mov exif,a 0866 90 7F A9 2100 mov dptr,#IN07IRQ 0869 74 01 2101 mov a,#0x01 086B F0 2102 movx @dptr,a 2103 ;; handle interrupt 2104 ;; epilogue 086C D0 07 2105 pop ar7 086E D0 00 2106 pop ar0 0870 D0 86 2107 pop dps 0872 D0 D0 2108 pop psw 0874 D0 85 2109 pop dph1 0876 D0 84 2110 pop dpl1 0878 D0 83 2111 pop dph0 087A D0 82 2112 pop dpl0 087C D0 F0 2113 pop b 087E D0 E0 2114 pop acc 0880 32 2115 reti 2116 0881 2117 usb_ep0out_isr: 0881 C0 E0 2118 push acc 0883 C0 F0 2119 push b 0885 C0 82 2120 push dpl0 0887 C0 83 2121 push dph0 0889 C0 84 2122 push dpl1 088B C0 85 2123 push dph1 088D C0 D0 2124 push psw 088F 75 D0 00 2125 mov psw,#0x00 0892 C0 86 2126 push dps 0894 75 86 00 2127 mov dps,#0 0897 C0 00 2128 push ar0 0899 C0 06 2129 push ar6 2130 ;; clear interrupt 089B E5 91 2131 mov a,exif 089D C2 E4 2132 clr acc.4 089F F5 91 2133 mov exif,a 08A1 90 7F AA 2134 mov dptr,#OUT07IRQ 08A4 74 01 2135 mov a,#0x01 08A6 F0 2136 movx @dptr,a 2137 ;; handle interrupt 2138 ;; epilogue 08A7 D0 06 2139 pop ar6 08A9 D0 00 2140 pop ar0 08AB D0 86 2141 pop dps 08AD D0 D0 2142 pop psw 08AF D0 85 2143 pop dph1 08B1 D0 84 2144 pop dpl1 08B3 D0 83 2145 pop dph0 08B5 D0 82 2146 pop dpl0 08B7 D0 F0 2147 pop b 08B9 D0 E0 2148 pop acc 08BB 32 2149 reti 2150 08BC 2151 fillusbintr:: 08BC E5*0C 2152 mov a,pttforce 08BE F5 F0 2153 mov b,a 08C0 A2 E0 2154 mov c,acc.0 08C2 92 F2 2155 mov b.2,c 08C4 90 C0 09 2156 mov dptr,#AUDIOSTAT 08C7 E0 2157 movx a,@dptr 08C8 A2 E0 2158 mov c,acc.0 08CA 92 F3 2159 mov b.3,c 08CC A2*09 2160 mov c,uartempty 08CE 92 F5 2161 mov b.5,c 2162 ;; bytewide elements 08D0 90 7E 80 2163 mov dptr,#(IN1BUF) 08D3 E5 F0 2164 mov a,b 08D5 F0 2165 movx @dptr,a 08D6 E5*05 2166 mov a,sofcount 08D8 90 7E 81 2167 mov dptr,#(IN1BUF+1) 08DB F0 2168 movx @dptr,a 08DC 90 7F E0 2169 mov dptr,#INISOVAL 08DF E0 2170 movx a,@dptr 08E0 90 7E 82 2171 mov dptr,#(IN1BUF+2) 08E3 F0 2172 movx @dptr,a 08E4 90 C0 04 2173 mov dptr,#AUDIORSSI 08E7 E0 2174 movx a,@dptr 08E8 90 7E 83 2175 mov dptr,#(IN1BUF+3) 08EB F0 2176 movx @dptr,a 2177 ; counter 08EC 05*04 2178 inc irqcount 08EE E5*04 2179 mov a,irqcount 08F0 90 7E 84 2180 mov dptr,#(IN1BUF+4) 08F3 F0 2181 movx @dptr,a 2182 ; UART buffer 08F4 75 F0 05 2183 mov b,#5 08F7 90 7E 85 2184 mov dptr,#(IN1BUF+5) 08FA E5*1E 2185 2$: mov a,uartrd 08FC B5*1D 07 2186 cjne a,uartwr,3$ 2187 ; set length 08FF 90 7F B7 2188 mov dptr,#IN1BC 0902 E5 F0 2189 mov a,b 0904 F0 2190 movx @dptr,a 0905 22 2191 ret 2192 0906 24r0D 2193 3$: add a,#uartbuf 0908 F8 2194 mov r0,a 0909 E6 2195 mov a,@r0 090A F0 2196 movx @dptr,a 090B A3 2197 inc dptr 090C 05 F0 2198 inc b 090E E5*1E 2199 mov a,uartrd 0910 04 2200 inc a 0911 54 0F 2201 anl a,#0xf 0913 F5*1E 2202 mov uartrd,a 0915 80 E3 2203 sjmp 2$ 2204 2205 0917 2206 usb_ep1in_isr: 0917 C0 E0 2207 push acc 0919 C0 F0 2208 push b 091B C0 82 2209 push dpl0 091D C0 83 2210 push dph0 091F C0 D0 2211 push psw 0921 75 D0 00 2212 mov psw,#0x00 0924 C0 86 2213 push dps 0926 75 86 00 2214 mov dps,#0 2215 ;; clear interrupt 0929 E5 91 2216 mov a,exif 092B C2 E4 2217 clr acc.4 092D F5 91 2218 mov exif,a 092F 90 7F A9 2219 mov dptr,#IN07IRQ 0932 74 02 2220 mov a,#0x02 0934 F0 2221 movx @dptr,a 2222 ;; handle interrupt 0935 12s08rBC 2223 lcall fillusbintr 2224 ;; epilogue 0938 D0 86 2225 pop dps 093A D0 D0 2226 pop psw 093C D0 83 2227 pop dph0 093E D0 82 2228 pop dpl0 0940 D0 F0 2229 pop b 0942 D0 E0 2230 pop acc 0944 32 2231 reti 2232 0945 2233 usb_ep1out_isr: 0945 C0 E0 2234 push acc 0947 C0 F0 2235 push b 0949 C0 82 2236 push dpl0 094B C0 83 2237 push dph0 094D C0 D0 2238 push psw 094F 75 D0 00 2239 mov psw,#0x00 0952 C0 86 2240 push dps 0954 75 86 00 2241 mov dps,#0 2242 ;; clear interrupt 0957 E5 91 2243 mov a,exif 0959 C2 E4 2244 clr acc.4 095B F5 91 2245 mov exif,a 095D 90 7F AA 2246 mov dptr,#OUT07IRQ 0960 74 02 2247 mov a,#0x02 0962 F0 2248 movx @dptr,a 2249 ;; handle interrupt 2250 ;; epilogue 0963 D0 86 2251 pop dps 0965 D0 D0 2252 pop psw 0967 D0 83 2253 pop dph0 0969 D0 82 2254 pop dpl0 096B D0 F0 2255 pop b 096D D0 E0 2256 pop acc 096F 32 2257 reti 2258 0970 2259 usb_ep2in_isr: 0970 C0 E0 2260 push acc 0972 C0 F0 2261 push b 0974 C0 82 2262 push dpl0 0976 C0 83 2263 push dph0 0978 C0 D0 2264 push psw 097A 75 D0 00 2265 mov psw,#0x00 097D C0 86 2266 push dps 097F 75 86 00 2267 mov dps,#0 2268 ;; clear interrupt 0982 E5 91 2269 mov a,exif 0984 C2 E4 2270 clr acc.4 0986 F5 91 2271 mov exif,a 0988 90 7F A9 2272 mov dptr,#IN07IRQ 098B 74 04 2273 mov a,#0x04 098D F0 2274 movx @dptr,a 2275 ;; handle interrupt 2276 ;; epilogue 098E D0 86 2277 pop dps 0990 D0 D0 2278 pop psw 0992 D0 83 2279 pop dph0 0994 D0 82 2280 pop dpl0 0996 D0 F0 2281 pop b 0998 D0 E0 2282 pop acc 099A 32 2283 reti 2284 099B 2285 usb_ep2out_isr: 099B C0 E0 2286 push acc 099D C0 F0 2287 push b 099F C0 82 2288 push dpl0 09A1 C0 83 2289 push dph0 09A3 C0 D0 2290 push psw 09A5 75 D0 00 2291 mov psw,#0x00 09A8 C0 86 2292 push dps 09AA 75 86 00 2293 mov dps,#0 2294 ;; clear interrupt 09AD E5 91 2295 mov a,exif 09AF C2 E4 2296 clr acc.4 09B1 F5 91 2297 mov exif,a 09B3 90 7F AA 2298 mov dptr,#OUT07IRQ 09B6 74 04 2299 mov a,#0x04 09B8 F0 2300 movx @dptr,a 2301 ;; handle interrupt 2302 ;; epilogue 09B9 D0 86 2303 pop dps 09BB D0 D0 2304 pop psw 09BD D0 83 2305 pop dph0 09BF D0 82 2306 pop dpl0 09C1 D0 F0 2307 pop b 09C3 D0 E0 2308 pop acc 09C5 32 2309 reti 2310 09C6 2311 usb_ep3in_isr: 09C6 C0 E0 2312 push acc 09C8 C0 F0 2313 push b 09CA C0 82 2314 push dpl0 09CC C0 83 2315 push dph0 09CE C0 D0 2316 push psw 09D0 75 D0 00 2317 mov psw,#0x00 09D3 C0 86 2318 push dps 09D5 75 86 00 2319 mov dps,#0 2320 ;; clear interrupt 09D8 E5 91 2321 mov a,exif 09DA C2 E4 2322 clr acc.4 09DC F5 91 2323 mov exif,a 09DE 90 7F A9 2324 mov dptr,#IN07IRQ 09E1 74 08 2325 mov a,#0x08 09E3 F0 2326 movx @dptr,a 2327 ;; handle interrupt 2328 ;; epilogue 09E4 D0 86 2329 pop dps 09E6 D0 D0 2330 pop psw 09E8 D0 83 2331 pop dph0 09EA D0 82 2332 pop dpl0 09EC D0 F0 2333 pop b 09EE D0 E0 2334 pop acc 09F0 32 2335 reti 2336 09F1 2337 usb_ep3out_isr: 09F1 C0 E0 2338 push acc 09F3 C0 F0 2339 push b 09F5 C0 82 2340 push dpl0 09F7 C0 83 2341 push dph0 09F9 C0 D0 2342 push psw 09FB 75 D0 00 2343 mov psw,#0x00 09FE C0 86 2344 push dps 0A00 75 86 00 2345 mov dps,#0 2346 ;; clear interrupt 0A03 E5 91 2347 mov a,exif 0A05 C2 E4 2348 clr acc.4 0A07 F5 91 2349 mov exif,a 0A09 90 7F AA 2350 mov dptr,#OUT07IRQ 0A0C 74 08 2351 mov a,#0x08 0A0E F0 2352 movx @dptr,a 2353 ;; handle interrupt 2354 ;; epilogue 0A0F D0 86 2355 pop dps 0A11 D0 D0 2356 pop psw 0A13 D0 83 2357 pop dph0 0A15 D0 82 2358 pop dpl0 0A17 D0 F0 2359 pop b 0A19 D0 E0 2360 pop acc 0A1B 32 2361 reti 2362 0A1C 2363 usb_ep4in_isr: 0A1C C0 E0 2364 push acc 0A1E C0 F0 2365 push b 0A20 C0 82 2366 push dpl0 0A22 C0 83 2367 push dph0 0A24 C0 D0 2368 push psw 0A26 75 D0 00 2369 mov psw,#0x00 0A29 C0 86 2370 push dps 0A2B 75 86 00 2371 mov dps,#0 2372 ;; clear interrupt 0A2E E5 91 2373 mov a,exif 0A30 C2 E4 2374 clr acc.4 0A32 F5 91 2375 mov exif,a 0A34 90 7F A9 2376 mov dptr,#IN07IRQ 0A37 74 10 2377 mov a,#0x10 0A39 F0 2378 movx @dptr,a 2379 ;; handle interrupt 2380 ;; epilogue 0A3A D0 86 2381 pop dps 0A3C D0 D0 2382 pop psw 0A3E D0 83 2383 pop dph0 0A40 D0 82 2384 pop dpl0 0A42 D0 F0 2385 pop b 0A44 D0 E0 2386 pop acc 0A46 32 2387 reti 2388 0A47 2389 usb_ep4out_isr: 0A47 C0 E0 2390 push acc 0A49 C0 F0 2391 push b 0A4B C0 82 2392 push dpl0 0A4D C0 83 2393 push dph0 0A4F C0 D0 2394 push psw 0A51 75 D0 00 2395 mov psw,#0x00 0A54 C0 86 2396 push dps 0A56 75 86 00 2397 mov dps,#0 2398 ;; clear interrupt 0A59 E5 91 2399 mov a,exif 0A5B C2 E4 2400 clr acc.4 0A5D F5 91 2401 mov exif,a 0A5F 90 7F AA 2402 mov dptr,#OUT07IRQ 0A62 74 10 2403 mov a,#0x10 0A64 F0 2404 movx @dptr,a 2405 ;; handle interrupt 2406 ;; epilogue 0A65 D0 86 2407 pop dps 0A67 D0 D0 2408 pop psw 0A69 D0 83 2409 pop dph0 0A6B D0 82 2410 pop dpl0 0A6D D0 F0 2411 pop b 0A6F D0 E0 2412 pop acc 0A71 32 2413 reti 2414 0A72 2415 usb_ep5in_isr: 0A72 C0 E0 2416 push acc 0A74 C0 F0 2417 push b 0A76 C0 82 2418 push dpl0 0A78 C0 83 2419 push dph0 0A7A C0 D0 2420 push psw 0A7C 75 D0 00 2421 mov psw,#0x00 0A7F C0 86 2422 push dps 0A81 75 86 00 2423 mov dps,#0 2424 ;; clear interrupt 0A84 E5 91 2425 mov a,exif 0A86 C2 E4 2426 clr acc.4 0A88 F5 91 2427 mov exif,a 0A8A 90 7F A9 2428 mov dptr,#IN07IRQ 0A8D 74 20 2429 mov a,#0x20 0A8F F0 2430 movx @dptr,a 2431 ;; handle interrupt 2432 ;; epilogue 0A90 D0 86 2433 pop dps 0A92 D0 D0 2434 pop psw 0A94 D0 83 2435 pop dph0 0A96 D0 82 2436 pop dpl0 0A98 D0 F0 2437 pop b 0A9A D0 E0 2438 pop acc 0A9C 32 2439 reti 2440 0A9D 2441 usb_ep5out_isr: 0A9D C0 E0 2442 push acc 0A9F C0 F0 2443 push b 0AA1 C0 82 2444 push dpl0 0AA3 C0 83 2445 push dph0 0AA5 C0 D0 2446 push psw 0AA7 75 D0 00 2447 mov psw,#0x00 0AAA C0 86 2448 push dps 0AAC 75 86 00 2449 mov dps,#0 2450 ;; clear interrupt 0AAF E5 91 2451 mov a,exif 0AB1 C2 E4 2452 clr acc.4 0AB3 F5 91 2453 mov exif,a 0AB5 90 7F AA 2454 mov dptr,#OUT07IRQ 0AB8 74 20 2455 mov a,#0x20 0ABA F0 2456 movx @dptr,a 2457 ;; handle interrupt 2458 ;; epilogue 0ABB D0 86 2459 pop dps 0ABD D0 D0 2460 pop psw 0ABF D0 83 2461 pop dph0 0AC1 D0 82 2462 pop dpl0 0AC3 D0 F0 2463 pop b 0AC5 D0 E0 2464 pop acc 0AC7 32 2465 reti 2466 0AC8 2467 usb_ep6in_isr: 0AC8 C0 E0 2468 push acc 0ACA C0 F0 2469 push b 0ACC C0 82 2470 push dpl0 0ACE C0 83 2471 push dph0 0AD0 C0 D0 2472 push psw 0AD2 75 D0 00 2473 mov psw,#0x00 0AD5 C0 86 2474 push dps 0AD7 75 86 00 2475 mov dps,#0 2476 ;; clear interrupt 0ADA E5 91 2477 mov a,exif 0ADC C2 E4 2478 clr acc.4 0ADE F5 91 2479 mov exif,a 0AE0 90 7F A9 2480 mov dptr,#IN07IRQ 0AE3 74 40 2481 mov a,#0x40 0AE5 F0 2482 movx @dptr,a 2483 ;; handle interrupt 2484 ;; epilogue 0AE6 D0 86 2485 pop dps 0AE8 D0 D0 2486 pop psw 0AEA D0 83 2487 pop dph0 0AEC D0 82 2488 pop dpl0 0AEE D0 F0 2489 pop b 0AF0 D0 E0 2490 pop acc 0AF2 32 2491 reti 2492 0AF3 2493 usb_ep6out_isr: 0AF3 C0 E0 2494 push acc 0AF5 C0 F0 2495 push b 0AF7 C0 82 2496 push dpl0 0AF9 C0 83 2497 push dph0 0AFB C0 D0 2498 push psw 0AFD 75 D0 00 2499 mov psw,#0x00 0B00 C0 86 2500 push dps 0B02 75 86 00 2501 mov dps,#0 2502 ;; clear interrupt 0B05 E5 91 2503 mov a,exif 0B07 C2 E4 2504 clr acc.4 0B09 F5 91 2505 mov exif,a 0B0B 90 7F AA 2506 mov dptr,#OUT07IRQ 0B0E 74 40 2507 mov a,#0x40 0B10 F0 2508 movx @dptr,a 2509 ;; handle interrupt 2510 ;; epilogue 0B11 D0 86 2511 pop dps 0B13 D0 D0 2512 pop psw 0B15 D0 83 2513 pop dph0 0B17 D0 82 2514 pop dpl0 0B19 D0 F0 2515 pop b 0B1B D0 E0 2516 pop acc 0B1D 32 2517 reti 2518 0B1E 2519 usb_ep7in_isr: 0B1E C0 E0 2520 push acc 0B20 C0 F0 2521 push b 0B22 C0 82 2522 push dpl0 0B24 C0 83 2523 push dph0 0B26 C0 D0 2524 push psw 0B28 75 D0 00 2525 mov psw,#0x00 0B2B C0 86 2526 push dps 0B2D 75 86 00 2527 mov dps,#0 2528 ;; clear interrupt 0B30 E5 91 2529 mov a,exif 0B32 C2 E4 2530 clr acc.4 0B34 F5 91 2531 mov exif,a 0B36 90 7F A9 2532 mov dptr,#IN07IRQ 0B39 74 80 2533 mov a,#0x80 0B3B F0 2534 movx @dptr,a 2535 ;; handle interrupt 2536 ;; epilogue 0B3C D0 86 2537 pop dps 0B3E D0 D0 2538 pop psw 0B40 D0 83 2539 pop dph0 0B42 D0 82 2540 pop dpl0 0B44 D0 F0 2541 pop b 0B46 D0 E0 2542 pop acc 0B48 32 2543 reti 2544 0B49 2545 usb_ep7out_isr: 0B49 C0 E0 2546 push acc 0B4B C0 F0 2547 push b 0B4D C0 82 2548 push dpl0 0B4F C0 83 2549 push dph0 0B51 C0 D0 2550 push psw 0B53 75 D0 00 2551 mov psw,#0x00 0B56 C0 86 2552 push dps 0B58 75 86 00 2553 mov dps,#0 2554 ;; clear interrupt 0B5B E5 91 2555 mov a,exif 0B5D C2 E4 2556 clr acc.4 0B5F F5 91 2557 mov exif,a 0B61 90 7F AA 2558 mov dptr,#OUT07IRQ 0B64 74 80 2559 mov a,#0x80 0B66 F0 2560 movx @dptr,a 2561 ;; handle interrupt 2562 ;; epilogue 0B67 D0 86 2563 pop dps 0B69 D0 D0 2564 pop psw 0B6B D0 83 2565 pop dph0 0B6D D0 82 2566 pop dpl0 0B6F D0 F0 2567 pop b 0B71 D0 E0 2568 pop acc 0B73 32 2569 reti 2570 2571 ;; ----------------------------------------------------- 2572 ;; USB descriptors 2573 ;; ----------------------------------------------------- 2574 2575 ;; Device and/or Interface Class codes 0000 2576 USB_CLASS_PER_INTERFACE = 0 0001 2577 USB_CLASS_AUDIO = 1 0002 2578 USB_CLASS_COMM = 2 0003 2579 USB_CLASS_HID = 3 0007 2580 USB_CLASS_PRINTER = 7 0008 2581 USB_CLASS_MASS_STORAGE = 8 0009 2582 USB_CLASS_HUB = 9 00FF 2583 USB_CLASS_VENDOR_SPEC = 0xff 2584 0001 2585 USB_SUBCLASS_AUDIOCONTROL = 1 0002 2586 USB_SUBCLASS_AUDIOSTREAMING = 2 2587 2588 ;; Descriptor types 0001 2589 USB_DT_DEVICE = 0x01 0002 2590 USB_DT_CONFIG = 0x02 0003 2591 USB_DT_STRING = 0x03 0004 2592 USB_DT_INTERFACE = 0x04 0005 2593 USB_DT_ENDPOINT = 0x05 2594 2595 ;; Audio Class descriptor types 0020 2596 USB_DT_AUDIO_UNDEFINED = 0x20 0021 2597 USB_DT_AUDIO_DEVICE = 0x21 0022 2598 USB_DT_AUDIO_CONFIG = 0x22 0023 2599 USB_DT_AUDIO_STRING = 0x23 0024 2600 USB_DT_AUDIO_INTERFACE = 0x24 0025 2601 USB_DT_AUDIO_ENDPOINT = 0x25 2602 0000 2603 USB_SDT_AUDIO_UNDEFINED = 0x00 0001 2604 USB_SDT_AUDIO_HEADER = 0x01 0002 2605 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 0003 2606 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 0004 2607 USB_SDT_AUDIO_MIXER_UNIT = 0x04 0005 2608 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 0006 2609 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 0007 2610 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 0008 2611 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 2612 2613 ;; Standard requests 0000 2614 USB_REQ_GET_STATUS = 0x00 0001 2615 USB_REQ_CLEAR_FEATURE = 0x01 0003 2616 USB_REQ_SET_FEATURE = 0x03 0005 2617 USB_REQ_SET_ADDRESS = 0x05 0006 2618 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2619 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2620 USB_REQ_GET_CONFIGURATION = 0x08 0009 2621 USB_REQ_SET_CONFIGURATION = 0x09 000A 2622 USB_REQ_GET_INTERFACE = 0x0A 000B 2623 USB_REQ_SET_INTERFACE = 0x0B 000C 2624 USB_REQ_SYNCH_FRAME = 0x0C 2625 2626 ;; Audio Class Requests 0001 2627 USB_REQ_AUDIO_SET_CUR = 0x01 0081 2628 USB_REQ_AUDIO_GET_CUR = 0x81 0002 2629 USB_REQ_AUDIO_SET_MIN = 0x02 0082 2630 USB_REQ_AUDIO_GET_MIN = 0x82 0003 2631 USB_REQ_AUDIO_SET_MAX = 0x03 0083 2632 USB_REQ_AUDIO_GET_MAX = 0x83 0004 2633 USB_REQ_AUDIO_SET_RES = 0x04 0084 2634 USB_REQ_AUDIO_GET_RES = 0x84 0005 2635 USB_REQ_AUDIO_SET_MEM = 0x05 0085 2636 USB_REQ_AUDIO_GET_MEM = 0x85 00FF 2637 USB_REQ_AUDIO_GET_STAT = 0xff 2638 2639 ;; USB Request Type and Endpoint Directions 0000 2640 USB_DIR_OUT = 0 0080 2641 USB_DIR_IN = 0x80 2642 0000 2643 USB_TYPE_STANDARD = (0x00 << 5) 0020 2644 USB_TYPE_CLASS = (0x01 << 5) 0040 2645 USB_TYPE_VENDOR = (0x02 << 5) 0060 2646 USB_TYPE_RESERVED = (0x03 << 5) 2647 0000 2648 USB_RECIP_DEVICE = 0x00 0001 2649 USB_RECIP_INTERFACE = 0x01 0002 2650 USB_RECIP_ENDPOINT = 0x02 0003 2651 USB_RECIP_OTHER = 0x03 2652 2653 ;; Request target types. 0000 2654 USB_RT_DEVICE = 0x00 0001 2655 USB_RT_INTERFACE = 0x01 0002 2656 USB_RT_ENDPOINT = 0x02 2657 BAC0 2658 VENDID = 0xbac0 6137 2659 PRODID = 0x6137 2660 0B74 2661 devicedescr: 0B74 12 2662 .db 18 ; bLength 0B75 01 2663 .db USB_DT_DEVICE ; bDescriptorType 0B76 00 01 2664 .db 0x00, 0x01 ; bcdUSB 0B78 00 2665 .db USB_CLASS_PER_INTERFACE ; bDeviceClass 0B79 00 2666 .db 0 ; bDeviceSubClass 0B7A 00 2667 .db 0x00 ; bDeviceProtocol 0B7B 40 2668 .db 0x40 ; bMaxPacketSize0 0B7C C0 BA 2669 .db VENDID ; idVendor 0B7E 37 61 2670 .db PRODID ; idProduct 0B80 01 00 2671 .db 0x01,0x00 ; bcdDevice 0B82 01 2672 .db 1 ; iManufacturer 0B83 02 2673 .db 2 ; iProduct 0B84 03 2674 .db 3 ; iSerialNumber 0B85 01 2675 .db 1 ; bNumConfigurations 2676 0B86 2677 config0descr: 0B86 09 2678 .db 9 ; bLength 0B87 02 2679 .db USB_DT_CONFIG ; bDescriptorType 0B88 CE 00 2680 .db config0sz ; wTotalLength 0B8A 04 2681 .db 4 ; bNumInterfaces 0B8B 01 2682 .db 1 ; bConfigurationValue 0B8C 00 2683 .db 0 ; iConfiguration 0B8D 40 2684 .db 0b01000000 ; bmAttributs (self powered) 0B8E 00 2685 .db 0 ; MaxPower (mA/2) (self powered so 0) 2686 ;; standard packet interface (needed so the driver can hook to it) 2687 ;; interface descriptor I0:A0 0B8F 09 2688 .db 9 ; bLength 0B90 04 2689 .db USB_DT_INTERFACE ; bDescriptorType 0B91 00 2690 .db 0 ; bInterfaceNumber 0B92 00 2691 .db 0 ; bAlternateSetting 0B93 01 2692 .db 1 ; bNumEndpoints 0B94 FF 2693 .db 0xff ; bInterfaceClass (vendor specific) 0B95 00 2694 .db 0x00 ; bInterfaceSubClass 0B96 FF 2695 .db 0xff ; bInterfaceProtocol (vendor specific) 0B97 00 2696 .db 0 ; iInterface 2697 ;; endpoint descriptor I0:A0:E0 0B98 07 2698 .db 7 ; bLength 0B99 05 2699 .db USB_DT_ENDPOINT ; bDescriptorType 0B9A 81 2700 .db (USB_DIR_IN | 1) ; bEndpointAddress 0B9B 02 2701 .db 0x02 ; bmAttributes (bulk) 0B9C 40 00 2702 .db 0x40,0x00 ; wMaxPacketSize 0B9E 00 2703 .db 0 ; bInterval 2704 ;; interface descriptor I0:A1 0B9F 09 2705 .db 9 ; bLength 0BA0 04 2706 .db USB_DT_INTERFACE ; bDescriptorType 0BA1 00 2707 .db 0 ; bInterfaceNumber 0BA2 01 2708 .db 1 ; bAlternateSetting 0BA3 01 2709 .db 1 ; bNumEndpoints 0BA4 FF 2710 .db 0xff ; bInterfaceClass (vendor specific) 0BA5 00 2711 .db 0x00 ; bInterfaceSubClass 0BA6 FF 2712 .db 0xff ; bInterfaceProtocol (vendor specific) 0BA7 00 2713 .db 0 ; iInterface 2714 ;; endpoint descriptor I0:A1:E0 0BA8 07 2715 .db 7 ; bLength 0BA9 05 2716 .db USB_DT_ENDPOINT ; bDescriptorType 0BAA 81 2717 .db (USB_DIR_IN | 1) ; bEndpointAddress 0BAB 03 2718 .db 0x03 ; bmAttributes (interrupt) 0BAC 40 00 2719 .db 0x40,0x00 ; wMaxPacketSize 0BAE 08 2720 .db 8 ; bInterval 2721 ;; interface descriptor I1:A0 0BAF 09 2722 .db 9 ; bLength 0BB0 04 2723 .db USB_DT_INTERFACE ; bDescriptorType 0BB1 01 2724 .db 1 ; bInterfaceNumber 0BB2 00 2725 .db 0 ; bAlternateSetting 0BB3 00 2726 .db 0 ; bNumEndpoints (only control endpoint) 0BB4 01 2727 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0BB5 01 2728 .db USB_SUBCLASS_AUDIOCONTROL ; bInterfaceSubClass 0BB6 00 2729 .db 0x00 ; bInterfaceProtocol (none) 0BB7 00 2730 .db 0 ; iInterface 0BB8 2731 acctrl: 2732 ;; class specific audio interface descriptor I1:A0 0BB8 0A 2733 .db 10 ; bLength 0BB9 24 2734 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0BBA 01 2735 .db USB_SDT_AUDIO_HEADER ; bDescriptorSubtype 0BBB 00 01 2736 .db 0x00,0x01 ; bcdADC (Audio Class Spec Revision 1.0) 0BBD 34 00 2737 .db acctrlsz ; wTotalLength (Audio Class specific desctiptors) 0BBF 02 2738 .db 2 ; bInCollection (number of streaming interfaces) 0BC0 02 2739 .db 2 ; baInterfaceNr0 (number of AudioStreaming interface) 0BC1 03 2740 .db 3 ; baInterfaceNr1 (number of AudioStreaming interface) 2741 ;; audio input terminal descriptor 0BC2 0C 2742 .db 12 ; bLength 0BC3 24 2743 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0BC4 02 2744 .db USB_SDT_AUDIO_INPUT_TERMINAL ; bDescriptorSubtype 0BC5 01 2745 .db 1 ; bTerminalID 0BC6 10 07 2746 .db 0x10,0x07 ; wTerminalType (Radio Receiver) 0BC8 00 2747 .db 0 ; bAssocTerminal (none) 0BC9 01 2748 .db 1 ; bNrChannels (one channel) 0BCA 00 00 2749 .db 0,0 ; wChannelConfig (mono has no position bits) 0BCC 00 2750 .db 0 ; iChannelNames 0BCD 00 2751 .db 0 ; iTerminal 2752 ;; audio output terminal descriptor 0BCE 09 2753 .db 9 ; bLength 0BCF 24 2754 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0BD0 03 2755 .db USB_SDT_AUDIO_OUTPUT_TERMINAL ; bDescriptorSubtype 0BD1 02 2756 .db 2 ; bTerminalID 0BD2 11 07 2757 .db 0x11,0x07 ; wTerminalType (Radio Transmitter) 0BD4 00 2758 .db 0 ; bAssocTerminal (none) 0BD5 03 2759 .db 3 ; bSourceID 0BD6 00 2760 .db 0 ; iTerminal 2761 ;; USB input terminal descriptor 0BD7 0C 2762 .db 12 ; bLength 0BD8 24 2763 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0BD9 02 2764 .db USB_SDT_AUDIO_INPUT_TERMINAL ; bDescriptorSubtype 0BDA 03 2765 .db 3 ; bTerminalID 0BDB 01 01 2766 .db 0x01,0x01 ; wTerminalType (USB streaming) 0BDD 00 2767 .db 0 ; bAssocTerminal (none) 0BDE 01 2768 .db 1 ; bNrChannels (one channel) 0BDF 00 00 2769 .db 0,0 ; wChannelConfig (mono has no position bits) 0BE1 00 2770 .db 0 ; iChannelNames 0BE2 00 2771 .db 0 ; iTerminal 2772 ;; USB output terminal descriptor 0BE3 09 2773 .db 9 ; bLength 0BE4 24 2774 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0BE5 03 2775 .db USB_SDT_AUDIO_OUTPUT_TERMINAL ; bDescriptorSubtype 0BE6 04 2776 .db 4 ; bTerminalID 0BE7 01 01 2777 .db 0x01,0x01 ; wTerminalType (USB streaming) 0BE9 00 2778 .db 0 ; bAssocTerminal (none) 0BEA 01 2779 .db 1 ; bSourceID 0BEB 00 2780 .db 0 ; iTerminal 0034 2781 acctrlsz = . - acctrl 2782 ;; interface descriptor I2:A0 0BEC 09 2783 .db 9 ; bLength 0BED 04 2784 .db USB_DT_INTERFACE ; bDescriptorType 0BEE 02 2785 .db 2 ; bInterfaceNumber 0BEF 00 2786 .db 0 ; bAlternateSetting 0BF0 00 2787 .db 0 ; bNumEndpoints (use control endpoint only) 0BF1 01 2788 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0BF2 02 2789 .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass 0BF3 00 2790 .db 0x00 ; bInterfaceProtocol (none) 0BF4 00 2791 .db 0 ; iInterface 2792 ;; interface descriptor I2:A1 0BF5 09 2793 .db 9 ; bLength 0BF6 04 2794 .db USB_DT_INTERFACE ; bDescriptorType 0BF7 02 2795 .db 2 ; bInterfaceNumber 0BF8 01 2796 .db 1 ; bAlternateSetting 0BF9 01 2797 .db 1 ; bNumEndpoints 0BFA 01 2798 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0BFB 02 2799 .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass 0BFC 00 2800 .db 0x00 ; bInterfaceProtocol (none) 0BFD 00 2801 .db 0 ; iInterface 2802 ;.db 1,0 ; wNumClasses 2803 ;; audio class specific general interface descriptor I2:A1 0BFE 07 2804 .db 7 ; bLength 0BFF 24 2805 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0C00 01 2806 .db 0x01 ; bDescriptorSubtype (general) 0C01 04 2807 .db 4 ; bTerminalLink 0C02 01 2808 .db 1 ; bDelay (in frames) 0C03 01 00 2809 .db 1,0 ; wFormatTag (PCM) 2810 ;; audio class specific format type I interface descriptor I2:A1 0C05 0B 2811 .db 11 ; bLength 0C06 24 2812 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0C07 02 2813 .db 0x02 ; bDescriptorSubtype (format type) 0C08 01 2814 .db 0x01 ; bFormatType (1) 0C09 01 2815 .db 1 ; bNrChannels 0C0A 01 2816 .db 1 ; bSubFrameSize 0C0B 08 2817 .db 8 ; bBitResolution 0C0C 01 2818 .db 1 ; bSamFreqType (one sampling frequency supported) 0C0D 2819 descinsrate: 0C0D 00 00 00 2820 .db 0,0,0 ; tSamFreq 2821 ;; endpoint descriptor I2:A1:E0 0C10 09 2822 .db 9 ; bLength 0C11 05 2823 .db USB_DT_ENDPOINT ; bDescriptorType 0C12 88 2824 .db (USB_DIR_IN | 8) ; bEndpointAddress 0C13 01 2825 .db 0x01 ; bmAttributes (iso) 0C14 2826 descinframesize: 0C14 02 00 2827 .db 0x02,0x00 ; wMaxPacketSize 0C16 01 2828 .db 1 ; bInterval 0C17 00 2829 .db 0 ; bRefresh 0C18 00 2830 .db 0 ; bSynchAddress 2831 ;; audio class specific endpoint descriptor I2:A1:E0 0C19 07 2832 .db 7 ; bLength 0C1A 25 2833 .db USB_DT_AUDIO_ENDPOINT ; bDescriptorType 0C1B 01 2834 .db 1 ; bDescriptorSubtype (general) 0C1C 00 2835 .db 0 ; bmAttributes (no sampling rate control etc.) 0C1D 00 2836 .db 0 ; bLockDelayUnits 0C1E 00 00 2837 .db 0,0 ; wLockDelay 2838 ;; interface descriptor I3:A0 0C20 09 2839 .db 9 ; bLength 0C21 04 2840 .db USB_DT_INTERFACE ; bDescriptorType 0C22 03 2841 .db 3 ; bInterfaceNumber 0C23 00 2842 .db 0 ; bAlternateSetting 0C24 00 2843 .db 0 ; bNumEndpoints (use control endpoint only) 0C25 01 2844 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0C26 02 2845 .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass 0C27 00 2846 .db 0x00 ; bInterfaceProtocol (none) 0C28 00 2847 .db 0 ; iInterface 2848 ;; interface descriptor I3:A1 0C29 09 2849 .db 9 ; bLength 0C2A 04 2850 .db USB_DT_INTERFACE ; bDescriptorType 0C2B 03 2851 .db 3 ; bInterfaceNumber 0C2C 01 2852 .db 1 ; bAlternateSetting 0C2D 01 2853 .db 1 ; bNumEndpoints 0C2E 01 2854 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0C2F 02 2855 .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass 0C30 00 2856 .db 0x00 ; bInterfaceProtocol (none) 0C31 00 2857 .db 0 ; iInterface 2858 ;.db 1,0 ; wNumClasses 2859 ;; audio class specific general interface descriptor I3:A1 0C32 07 2860 .db 7 ; bLength 0C33 24 2861 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0C34 01 2862 .db 0x01 ; bDescriptorSubtype (general) 0C35 03 2863 .db 3 ; bTerminalLink 0C36 01 2864 .db 1 ; bDelay (in frames) 0C37 01 00 2865 .db 1,0 ; wFormatTag (PCM) 2866 ;; audio class specific format type I interface descriptor I3:A1 0C39 0B 2867 .db 11 ; bLength 0C3A 24 2868 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0C3B 02 2869 .db 0x02 ; bDescriptorSubtype (format type) 0C3C 01 2870 .db 0x01 ; bFormatType (1) 0C3D 01 2871 .db 1 ; bNrChannels 0C3E 01 2872 .db 1 ; bSubFrameSize 0C3F 08 2873 .db 8 ; bBitResolution 0C40 01 2874 .db 1 ; bSamFreqType (one sampling frequency supported) 0C41 2875 descoutsrate: 0C41 00 00 00 2876 .db 0,0,0 ; tSamFreq 2877 ;; endpoint descriptor I3:A1:E0 0C44 09 2878 .db 9 ; bLength 0C45 05 2879 .db USB_DT_ENDPOINT ; bDescriptorType 0C46 08 2880 .db (USB_DIR_OUT | 8) ; bEndpointAddress 0C47 01 2881 .db 0x01 ; bmAttributes (iso) 0C48 2882 descoutframesize: 0C48 02 00 2883 .db 0x02,0x00 ; wMaxPacketSize 0C4A 01 2884 .db 1 ; bInterval 0C4B 00 2885 .db 0 ; bRefresh 0C4C 00 2886 .db 0 ; bSynchAddress 2887 ;; audio class specific endpoint descriptor I3:A1:E0 0C4D 07 2888 .db 7 ; bLength 0C4E 25 2889 .db USB_DT_AUDIO_ENDPOINT ; bDescriptorType 0C4F 01 2890 .db 1 ; bDescriptorSubtype (general) 0C50 00 2891 .db 0 ; bmAttributes (no sampling rate control etc.) 0C51 00 2892 .db 0 ; bLockDelayUnits 0C52 00 00 2893 .db 0,0 ; wLockDelay 00CE 2894 config0sz = . - config0descr 2895 0C54 2896 stringdescr: 0C54r5Cs0C 2897 .db string0 0C56r60s0C 2898 .db string1 0C58r6Es0C 2899 .db string2 0C5Ar8Es0C 2900 .db stringserial 2901 0004 2902 numstrings = (. - stringdescr)/2 2903 0C5C 2904 string0: 0C5C 04 2905 .db string0sz ; bLength 0C5D 03 2906 .db USB_DT_STRING ; bDescriptorType 0C5E 00 00 2907 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2908 string0sz = . - string0 2909 0C60 2910 string1: 0C60 0E 2911 .db string1sz ; bLength 0C61 03 2912 .db USB_DT_STRING ; bDescriptorType 0C62 42 00 61 00 79 00 2913 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2914 string1sz = . - string1 2915 0C6E 2916 string2: 0C6E 20 2917 .db string2sz ; bLength 0C6F 03 2918 .db USB_DT_STRING ; bDescriptorType 0C70 55 00 53 00 42 00 2919 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0C80 28 00 41 00 75 00 2920 .db '(,0,'A,0,'u,0,'d,0,'i,0,'o,0,'),0 64 00 69 00 6F 00 29 00 0020 2921 string2sz = . - string2 2922 0C8E 2923 stringserial: 0C8E 02 2924 .db 2 ; bLength 0C8F 03 2925 .db USB_DT_STRING ; bDescriptorType 0C90 00 00 00 00 00 00 2926 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0CA0 00 00 00 00 00 00 2927 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2928 baycomusb-0.10.orig/firmware/audiofirmware/main.rst0100644000175100017510000043434507337536151020567 0ustar abaaba 1 .module main 2 3 ;; ENDPOINTS 4 ;; EP0 in/out Control 5 ;; EP1 in Interrupt: Status 6 ;; Byte 0: Modem Status 7 ;; Bit 0-1: Transmitter status 8 ;; 0: idle (off) 9 ;; 1: keyup 10 ;; 2: transmitting packets 11 ;; 3: tail 12 ;; Bit 2: PTT status (1=on) 13 ;; Bit 3: DCD 14 ;; Bit 5: UART transmitter empty 15 ;; Bit 6-7: unused 16 ;; Byte 1: Number of empty 64 byte chunks in TX fifo (sofcount) 17 ;; Byte 2: Number of full 64 byte chunks in RX fifo (INISOVAL) 18 ;; Byte 3: RSSI value 19 ;; Byte 4: IRQ count 20 ;; Byte 5-20: (as needed) UART receiver chars 21 ;; EP8 out audio output 22 ;; EP8 in audio input 23 24 ;; COMMAND LIST 25 ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) 26 ;; C0 C8 read mode 27 ;; Return: 28 ;; Byte 0: 4 (MODE_AUDIO) 29 ;; C0 C9 return serial number string 30 ;; C0 D0 get/set PTT/DCD/RSSI 31 ;; wIndex = 1: set forced ptt to wValue 32 ;; Return: 33 ;; Byte 0: PTT status 34 ;; Byte 1: DCD status 35 ;; Byte 2: RSSI status 36 ;; 40 D2 set CON/STA led 37 ;; Bits 0-1 of wValue 38 ;; 40 D3 send byte to UART 39 ;; Byte in wValue 40 ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) 41 ;; wIndex = 1: write wValue to output register 42 ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) 43 ;; Return: 44 ;; Byte 0: Modem Disconnect Input 45 ;; Byte 1: Modem Disconnect Output register 46 ;; Byte 2: Modem Disconnect Tristate register 47 ;; C0 D5 get/set T7F port 48 ;; wIndex = 1: write wValue to T7F output register 49 ;; Return: 50 ;; Byte 0: T7F Input 51 ;; Byte 1: T7F Output register 52 ;; C0 E0 get/set control register/counter values 53 ;; wIndex = 1: write wValue to control register 54 ;; Return: 55 ;; Byte 0: control register value 56 ;; Byte 1-3: counter0 register 57 ;; Byte 4-6: counter1 register 58 ;; C0 E1 get debug status 59 ;; Return: 60 ;; Byte 0: SOF count 61 ;; Byte 1: framesize 62 ;; Byte 2-3: divider 63 ;; Byte 4: divrel 64 ;; Byte 5: pllcorrvar 65 ;; Byte 6: txfifocount 66 ;; C0 E2 xxdebug stuff 67 68 ;; define code segments link order 69 .area CODE (CODE) 70 .area CSEG (CODE) 71 .area GSINIT (CODE) 72 .area GSINIT2 (CODE) 73 74 ;; ----------------------------------------------------- 75 76 ;; special function registers (which are not predefined) 0082 77 dpl0 = 0x82 0083 78 dph0 = 0x83 0084 79 dpl1 = 0x84 0085 80 dph1 = 0x85 0086 81 dps = 0x86 008E 82 ckcon = 0x8E 008F 83 spc_fnc = 0x8F 0091 84 exif = 0x91 0092 85 mpage = 0x92 0098 86 scon0 = 0x98 0099 87 sbuf0 = 0x99 00C0 88 scon1 = 0xC0 00C1 89 sbuf1 = 0xC1 00D8 90 eicon = 0xD8 00E8 91 eie = 0xE8 00F8 92 eip = 0xF8 93 94 ;; anchor xdata registers 7F00 95 IN0BUF = 0x7F00 7EC0 96 OUT0BUF = 0x7EC0 7E80 97 IN1BUF = 0x7E80 7E40 98 OUT1BUF = 0x7E40 7E00 99 IN2BUF = 0x7E00 7DC0 100 OUT2BUF = 0x7DC0 7D80 101 IN3BUF = 0x7D80 7D40 102 OUT3BUF = 0x7D40 7D00 103 IN4BUF = 0x7D00 7CC0 104 OUT4BUF = 0x7CC0 7C80 105 IN5BUF = 0x7C80 7C40 106 OUT5BUF = 0x7C40 7C00 107 IN6BUF = 0x7C00 7BC0 108 OUT6BUF = 0x7BC0 7B80 109 IN7BUF = 0x7B80 7B40 110 OUT7BUF = 0x7B40 7FE8 111 SETUPBUF = 0x7FE8 7FE8 112 SETUPDAT = 0x7FE8 113 7FB4 114 EP0CS = 0x7FB4 7FB5 115 IN0BC = 0x7FB5 7FB6 116 IN1CS = 0x7FB6 7FB7 117 IN1BC = 0x7FB7 7FB8 118 IN2CS = 0x7FB8 7FB9 119 IN2BC = 0x7FB9 7FBA 120 IN3CS = 0x7FBA 7FBB 121 IN3BC = 0x7FBB 7FBC 122 IN4CS = 0x7FBC 7FBD 123 IN4BC = 0x7FBD 7FBE 124 IN5CS = 0x7FBE 7FBF 125 IN5BC = 0x7FBF 7FC0 126 IN6CS = 0x7FC0 7FC1 127 IN6BC = 0x7FC1 7FC2 128 IN7CS = 0x7FC2 7FC3 129 IN7BC = 0x7FC3 7FC5 130 OUT0BC = 0x7FC5 7FC6 131 OUT1CS = 0x7FC6 7FC7 132 OUT1BC = 0x7FC7 7FC8 133 OUT2CS = 0x7FC8 7FC9 134 OUT2BC = 0x7FC9 7FCA 135 OUT3CS = 0x7FCA 7FCB 136 OUT3BC = 0x7FCB 7FCC 137 OUT4CS = 0x7FCC 7FCD 138 OUT4BC = 0x7FCD 7FCE 139 OUT5CS = 0x7FCE 7FCF 140 OUT5BC = 0x7FCF 7FD0 141 OUT6CS = 0x7FD0 7FD1 142 OUT6BC = 0x7FD1 7FD2 143 OUT7CS = 0x7FD2 7FD3 144 OUT7BC = 0x7FD3 145 7FA8 146 IVEC = 0x7FA8 7FA9 147 IN07IRQ = 0x7FA9 7FAA 148 OUT07IRQ = 0x7FAA 7FAB 149 USBIRQ = 0x7FAB 7FAC 150 IN07IEN = 0x7FAC 7FAD 151 OUT07IEN = 0x7FAD 7FAE 152 USBIEN = 0x7FAE 7FAF 153 USBBAV = 0x7FAF 7FB2 154 BPADDRH = 0x7FB2 7FB3 155 BPADDRL = 0x7FB3 156 7FD4 157 SUDPTRH = 0x7FD4 7FD5 158 SUDPTRL = 0x7FD5 7FD6 159 USBCS = 0x7FD6 7FD7 160 TOGCTL = 0x7FD7 7FD8 161 USBFRAMEL = 0x7FD8 7FD9 162 USBFRAMEH = 0x7FD9 7FDB 163 FNADDR = 0x7FDB 7FDD 164 USBPAIR = 0x7FDD 7FDE 165 IN07VAL = 0x7FDE 7FDF 166 OUT07VAL = 0x7FDF 7FE3 167 AUTOPTRH = 0x7FE3 7FE4 168 AUTOPTRL = 0x7FE4 7FE5 169 AUTODATA = 0x7FE5 170 171 ;; isochronous endpoints. only available if ISODISAB=0 172 7F60 173 OUT8DATA = 0x7F60 7F61 174 OUT9DATA = 0x7F61 7F62 175 OUT10DATA = 0x7F62 7F63 176 OUT11DATA = 0x7F63 7F64 177 OUT12DATA = 0x7F64 7F65 178 OUT13DATA = 0x7F65 7F66 179 OUT14DATA = 0x7F66 7F67 180 OUT15DATA = 0x7F67 181 7F68 182 IN8DATA = 0x7F68 7F69 183 IN9DATA = 0x7F69 7F6A 184 IN10DATA = 0x7F6A 7F6B 185 IN11DATA = 0x7F6B 7F6C 186 IN12DATA = 0x7F6C 7F6D 187 IN13DATA = 0x7F6D 7F6E 188 IN14DATA = 0x7F6E 7F6F 189 IN15DATA = 0x7F6F 190 7F70 191 OUT8BCH = 0x7F70 7F71 192 OUT8BCL = 0x7F71 7F72 193 OUT9BCH = 0x7F72 7F73 194 OUT9BCL = 0x7F73 7F74 195 OUT10BCH = 0x7F74 7F75 196 OUT10BCL = 0x7F75 7F76 197 OUT11BCH = 0x7F76 7F77 198 OUT11BCL = 0x7F77 7F78 199 OUT12BCH = 0x7F78 7F79 200 OUT12BCL = 0x7F79 7F7A 201 OUT13BCH = 0x7F7A 7F7B 202 OUT13BCL = 0x7F7B 7F7C 203 OUT14BCH = 0x7F7C 7F7D 204 OUT14BCL = 0x7F7D 7F7E 205 OUT15BCH = 0x7F7E 7F7F 206 OUT15BCL = 0x7F7F 207 7FF0 208 OUT8ADDR = 0x7FF0 7FF1 209 OUT9ADDR = 0x7FF1 7FF2 210 OUT10ADDR = 0x7FF2 7FF3 211 OUT11ADDR = 0x7FF3 7FF4 212 OUT12ADDR = 0x7FF4 7FF5 213 OUT13ADDR = 0x7FF5 7FF6 214 OUT14ADDR = 0x7FF6 7FF7 215 OUT15ADDR = 0x7FF7 7FF8 216 IN8ADDR = 0x7FF8 7FF9 217 IN9ADDR = 0x7FF9 7FFA 218 IN10ADDR = 0x7FFA 7FFB 219 IN11ADDR = 0x7FFB 7FFC 220 IN12ADDR = 0x7FFC 7FFD 221 IN13ADDR = 0x7FFD 7FFE 222 IN14ADDR = 0x7FFE 7FFF 223 IN15ADDR = 0x7FFF 224 7FA0 225 ISOERR = 0x7FA0 7FA1 226 ISOCTL = 0x7FA1 7FA2 227 ZBCOUNT = 0x7FA2 7FE0 228 INISOVAL = 0x7FE0 7FE1 229 OUTISOVAL = 0x7FE1 7FE2 230 FASTXFR = 0x7FE2 231 232 ;; CPU control registers 233 7F92 234 CPUCS = 0x7F92 235 236 ;; IO port control registers 237 7F93 238 PORTACFG = 0x7F93 7F94 239 PORTBCFG = 0x7F94 7F95 240 PORTCCFG = 0x7F95 7F96 241 OUTA = 0x7F96 7F97 242 OUTB = 0x7F97 7F98 243 OUTC = 0x7F98 7F99 244 PINSA = 0x7F99 7F9A 245 PINSB = 0x7F9A 7F9B 246 PINSC = 0x7F9B 7F9C 247 OEA = 0x7F9C 7F9D 248 OEB = 0x7F9D 7F9E 249 OEC = 0x7F9E 250 251 ;; I2C controller registers 252 7FA5 253 I2CS = 0x7FA5 7FA6 254 I2DAT = 0x7FA6 255 256 ;; Xilinx FPGA registers C000 257 AUDIORXFIFO = 0xc000 C000 258 AUDIOTXFIFO = 0xc000 C001 259 AUDIORXFIFOCNT = 0xc001 C002 260 AUDIOTXFIFOCNT = 0xc002 C001 261 AUDIODIVIDERLO = 0xc001 C002 262 AUDIODIVIDERHI = 0xc002 C004 263 AUDIORSSI = 0xc004 C005 264 AUDIOCNTLOW = 0xc005 C006 265 AUDIOCNTMID = 0xc006 C007 266 AUDIOCNTHIGH = 0xc007 C008 267 AUDIOCTRL = 0xc008 C009 268 AUDIOSTAT = 0xc009 C00A 269 AUDIOT7FOUT = 0xc00a C00B 270 AUDIOT7FIN = 0xc00b C00C 271 AUDIOMDISCTRIS = 0xc00c C00D 272 AUDIOMDISCOUT = 0xc00d C00E 273 AUDIOMDISCIN = 0xc00e 274 0001 275 AUDIOCTRLPTT = 0x01 0002 276 AUDIOCTRLMUTE = 0x02 0004 277 AUDIOCTRLLEDPTT = 0x04 0008 278 AUDIOCTRLLEDDCD = 0x08 0000 279 AUDIOCTRLCNTRES = 0x00 0010 280 AUDIOCTRLCNTDIS = 0x10 0040 281 AUDIOCTRLCNTCK0 = 0x40 0050 282 AUDIOCTRLCNTCK1 = 0x50 0060 283 AUDIOCTRLCNTCK2 = 0x60 0070 284 AUDIOCTRLCNTCK3 = 0x70 0080 285 AUDIOCTRLCNTRD1 = 0x80 286 287 ;; ----------------------------------------------------- 288 289 .area CODE (CODE) 0000 02 0E 07 290 ljmp startup 0003 02 01 6D 291 ljmp int0_isr 0006 292 .ds 5 000B 02 01 8E 293 ljmp timer0_isr 000E 294 .ds 5 0013 02 01 AF 295 ljmp int1_isr 0016 296 .ds 5 001B 02 01 D0 297 ljmp timer1_isr 001E 298 .ds 5 0023 02 01 F1 299 ljmp ser0_isr 0026 300 .ds 5 002B 02 02 2F 301 ljmp timer2_isr 002E 302 .ds 5 0033 02 02 50 303 ljmp resume_isr 0036 304 .ds 5 003B 02 02 71 305 ljmp ser1_isr 003E 306 .ds 5 0043 02 01 00 307 ljmp usb_isr 0046 308 .ds 5 004B 02 02 94 309 ljmp i2c_isr 004E 310 .ds 5 0053 02 02 B9 311 ljmp int4_isr 0056 312 .ds 5 005B 02 02 DE 313 ljmp int5_isr 005E 314 .ds 5 0063 02 03 03 315 ljmp int6_isr 316 317 ;; Parameter block at 0xe0 0066 318 .ds 0x7a 00E0 08 319 parframesize: .db 8 00E1 01 320 parpttmute: .db 1 321 322 ;; Serial# string at 0xf0 00E2 323 .ds 14 00F0 324 parserial: 00F0 30 30 30 30 30 30 325 .db '0,'0,'0,'0,'0,'0,'0,'0,0 30 30 00 00F9 326 .ds 7 327 0100 328 usb_isr: 0100 02 03 24 329 ljmp usb_sudav_isr 0103 330 .ds 1 0104 02 07 D2 331 ljmp usb_sof_isr 0107 332 .ds 1 0108 02 09 1C 333 ljmp usb_sutok_isr 010B 334 .ds 1 010C 02 09 47 335 ljmp usb_suspend_isr 010F 336 .ds 1 0110 02 09 72 337 ljmp usb_usbreset_isr 0113 338 .ds 1 0114 32 339 reti 0115 340 .ds 3 0118 02 09 9D 341 ljmp usb_ep0in_isr 011B 342 .ds 1 011C 02 09 D8 343 ljmp usb_ep0out_isr 011F 344 .ds 1 0120 02 0A 6E 345 ljmp usb_ep1in_isr 0123 346 .ds 1 0124 02 0A 9C 347 ljmp usb_ep1out_isr 0127 348 .ds 1 0128 02 0A C7 349 ljmp usb_ep2in_isr 012B 350 .ds 1 012C 02 0A F2 351 ljmp usb_ep2out_isr 012F 352 .ds 1 0130 02 0B 1D 353 ljmp usb_ep3in_isr 0133 354 .ds 1 0134 02 0B 48 355 ljmp usb_ep3out_isr 0137 356 .ds 1 0138 02 0B 73 357 ljmp usb_ep4in_isr 013B 358 .ds 1 013C 02 0B 9E 359 ljmp usb_ep4out_isr 013F 360 .ds 1 0140 02 0B C9 361 ljmp usb_ep5in_isr 0143 362 .ds 1 0144 02 0B F4 363 ljmp usb_ep5out_isr 0147 364 .ds 1 0148 02 0C 1F 365 ljmp usb_ep6in_isr 014B 366 .ds 1 014C 02 0C 4A 367 ljmp usb_ep6out_isr 014F 368 .ds 1 0150 02 0C 75 369 ljmp usb_ep7in_isr 0153 370 .ds 1 0154 02 0C A0 371 ljmp usb_ep7out_isr 372 373 ;; ----------------------------------------------------- 374 0004 375 NUMINTERFACES = 4 376 377 .area OSEG (OVR,DATA) 378 .area BSEG (BIT) 0000 379 ctrl_ptt: .ds 1 0001 380 ctrl_pttmute: .ds 1 0002 381 ctrl_ledptt: .ds 1 0003 382 ctrl_leddcd: .ds 1 0004 383 ctrl_cntmode0: .ds 1 0005 384 ctrl_cntmode1: .ds 1 0006 385 ctrl_cntmode2: .ds 1 0007 386 ctrl_cntsel: .ds 1 0020 387 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) 388 0008 389 pttmute: .ds 1 0009 390 uartempty: .ds 1 391 392 393 .area ISEG (DATA) 0080 394 txsamples: .ds 0x40 00C0 395 stack: .ds 0x80-0x40 396 397 .area DSEG (DATA) 0040 398 ctrlcode: .ds 1 0041 399 ctrlcount: .ds 2 0043 400 leddiv: .ds 1 0044 401 irqcount: .ds 1 0045 402 sofcount: .ds 1 0046 403 divider: .ds 2 0048 404 divrel: .ds 1 0049 405 framesize: .ds 1 004A 406 pllcorrvar: .ds 1 004B 407 txfifocount: .ds 1 004C 408 pttforce: .ds 1 409 410 ;; UART receiver 004D 411 uartbuf: .ds 16 005D 412 uartwr: .ds 1 005E 413 uartrd: .ds 1 414 415 ;; Port state 005F 416 t7fout: .ds 1 0060 417 mdisctris: .ds 1 0061 418 mdiscout: .ds 1 419 420 ;; USB state 0062 421 numconfig: .ds 1 0063 422 altsetting: .ds NUMINTERFACES 423 424 .area XSEG (DATA) 1000 425 blah: .ds 1 426 427 428 .area GSINIT (CODE) 0002 429 ar2 = 0x02 0003 430 ar3 = 0x03 0004 431 ar4 = 0x04 0005 432 ar5 = 0x05 0006 433 ar6 = 0x06 0007 434 ar7 = 0x07 0000 435 ar0 = 0x00 0001 436 ar1 = 0x01 437 0E07 438 startup: 0E07 75 81 C0 439 mov sp,#stack ; -1 0E0A E4 440 clr a 0E0B F5 D0 441 mov psw,a 0E0D F5 86 442 mov dps,a 443 ;lcall __sdcc_external_startup 444 ;mov a,dpl0 445 ;jz __sdcc_init_data 446 ;ljmp __sdcc_program_startup 0E0F 447 __sdcc_init_data: 448 449 .area GSINIT2 (CODE) 0E0F 450 __sdcc_program_startup: 451 ;; assembler code startup 0E0F E4 452 clr a 0E10 F5 44 453 mov irqcount,a 0E12 F5 45 454 mov sofcount,a 0E14 F5 4C 455 mov pttforce,a 0E16 F5 5E 456 mov uartrd,a 0E18 F5 5D 457 mov uartwr,a 0E1A F5 86 458 mov dps,a 0E1C D2 09 459 setb uartempty 460 ;; some indirect register setup 0E1E 75 8E 30 461 mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs 462 ;; Timer setup: 463 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 464 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0E21 75 89 21 465 mov tmod,#0x21 0E24 75 88 55 466 mov tcon,#0x55 ; INT0/INT1 edge 0E27 75 8D 64 467 mov th1,#256-156 ; 1200 bauds 0E2A 75 87 00 468 mov pcon,#0 ; SMOD0=0 469 ;; init USB subsystem 0E2D 74 00 470 mov a,#0x00 ; IN8 FIFO at address 0x0000 0E2F 90 7F F8 471 mov dptr,#IN8ADDR 0E32 F0 472 movx @dptr,a 0E33 74 04 473 mov a,#0x04 ; OUT8 FIFO at address 0x0010 0E35 90 7F F0 474 mov dptr,#OUT8ADDR 0E38 F0 475 movx @dptr,a 0E39 90 7F A1 476 mov dptr,#ISOCTL 0E3C E4 477 clr a ; enable ISO endpoints 0E3D F0 478 movx @dptr,a 0E3E 90 7F AF 479 mov dptr,#USBBAV 0E41 74 01 480 mov a,#1 ; enable autovector, disable breakpoint logic 0E43 F0 481 movx @dptr,a 0E44 74 01 482 mov a,#0x01 ; enable ISO endpoint 8 for input/output 0E46 90 7F E0 483 mov dptr,#INISOVAL 0E49 F0 484 movx @dptr,a 0E4A 90 7F E1 485 mov dptr,#OUTISOVAL 0E4D F0 486 movx @dptr,a 0E4E 90 7F DD 487 mov dptr,#USBPAIR 0E51 74 89 488 mov a,#0x89 ; pair EP 2&3 for input & output, ISOSEND0 0E53 F0 489 movx @dptr,a 0E54 90 7F DE 490 mov dptr,#IN07VAL 0E57 74 03 491 mov a,#0x3 ; enable EP0+EP1 0E59 F0 492 movx @dptr,a 0E5A 90 7F DF 493 mov dptr,#OUT07VAL 0E5D 74 01 494 mov a,#0x1 ; enable EP0 0E5F F0 495 movx @dptr,a 496 ;; USB: init endpoint toggles 0E60 90 7F D7 497 mov dptr,#TOGCTL 0E63 74 12 498 mov a,#0x12 0E65 F0 499 movx @dptr,a 0E66 74 32 500 mov a,#0x32 ; clear EP 2 in toggle 0E68 F0 501 movx @dptr,a 0E69 74 02 502 mov a,#0x02 0E6B F0 503 movx @dptr,a 0E6C 74 22 504 mov a,#0x22 ; clear EP 2 out toggle 0E6E F0 505 movx @dptr,a 506 ;; configure IO ports 0E6F 90 7F 93 507 mov dptr,#PORTACFG 0E72 74 00 508 mov a,#0 0E74 F0 509 movx @dptr,a 0E75 90 7F 96 510 mov dptr,#OUTA 0E78 74 82 511 mov a,#0x82 ; set PROG hi 0E7A F0 512 movx @dptr,a 0E7B 90 7F 9C 513 mov dptr,#OEA 0E7E 74 C2 514 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0E80 F0 515 movx @dptr,a 0E81 90 7F 94 516 mov dptr,#PORTBCFG 0E84 74 00 517 mov a,#0 0E86 F0 518 movx @dptr,a 0E87 90 7F 9D 519 mov dptr,#OEB 0E8A 74 00 520 mov a,#0 0E8C F0 521 movx @dptr,a 0E8D 90 7F 95 522 mov dptr,#PORTCCFG 0E90 74 C3 523 mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins 0E92 F0 524 movx @dptr,a 0E93 90 7F 98 525 mov dptr,#OUTC 0E96 74 28 526 mov a,#0x28 0E98 F0 527 movx @dptr,a 0E99 90 7F 9E 528 mov dptr,#OEC 0E9C 74 2A 529 mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT 0E9E F0 530 movx @dptr,a 531 ;; enable interrupts 0E9F 75 A8 92 532 mov ie,#0x92 ; enable timer 0 and ser 0 int 0EA2 75 E8 01 533 mov eie,#0x01 ; enable USB interrupts 0EA5 90 7F AE 534 mov dptr,#USBIEN 0EA8 74 01 535 mov a,#1 ; enable SUDAV interrupt 0EAA F0 536 movx @dptr,a 0EAB 90 7F AC 537 mov dptr,#IN07IEN 0EAE 74 03 538 mov a,#3 ; enable EP0+EP1 interrupt 0EB0 F0 539 movx @dptr,a 0EB1 90 7F AD 540 mov dptr,#OUT07IEN 0EB4 74 01 541 mov a,#1 ; enable EP0 interrupt 0EB6 F0 542 movx @dptr,a 543 ;; initialize UART 0 for T7F communication 0EB7 75 98 52 544 mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable 545 ;; copy configuration to bit addressable variables 0EBA 75 20 00 546 mov ctrlreg,#AUDIOCTRLCNTRES 0EBD 78 E1 547 mov r0,#parpttmute 0EBF E2 548 movx a,@r0 0EC0 A2 E0 549 mov c,acc.0 0EC2 92 08 550 mov pttmute,c 0EC4 92 01 551 mov ctrl_pttmute,c 552 ;; turn off transmitter 0EC6 90 C0 08 553 mov dptr,#AUDIOCTRL 0EC9 E5 20 554 mov a,ctrlreg 0ECB F0 555 movx @dptr,a 556 ;; Initialize modem disc port / t7f port 0ECC 90 C0 0C 557 mov dptr,#AUDIOMDISCTRIS 0ECF 74 FF 558 mov a,#0xff 0ED1 F0 559 movx @dptr,a 0ED2 F5 60 560 mov mdisctris,a 0ED4 90 C0 0D 561 mov dptr,#AUDIOMDISCOUT 0ED7 E4 562 clr a 0ED8 F0 563 movx @dptr,a 0ED9 F5 61 564 mov mdiscout,a 0EDB 90 C0 0A 565 mov dptr,#AUDIOT7FOUT 0EDE 74 1F 566 mov a,#0x1f 0EE0 F0 567 movx @dptr,a 0EE1 F5 5F 568 mov t7fout,a 569 ;; Copy serial number 0EE3 78 F0 570 mov r0,#parserial 0EE5 90 0D E7 571 mov dptr,#stringserial+2 0EE8 E2 572 1$: movx a,@r0 0EE9 60 06 573 jz 2$ 0EEB F0 574 movx @dptr,a 0EEC A3 575 inc dptr 0EED A3 576 inc dptr 0EEE 08 577 inc r0 0EEF 80 F7 578 sjmp 1$ 0EF1 E8 579 2$: mov a,r0 0EF2 24 11 580 add a,#1-0xf0 ; 1-parserial 0EF4 25 E0 581 add a,acc 0EF6 90 0D E5 582 mov dptr,#stringserial 0EF9 F0 583 movx @dptr,a 584 ;; check parameters 0EFA 585 chkparam: 0EFA 75 48 80 586 mov divrel,#0x80 0EFD 78 E0 587 mov r0,#parframesize 0EFF E2 588 movx a,@r0 0F00 B4 02 02 589 cjne a,#02,11$ 0F03 80 4E 590 sjmp 2$ 0F05 B4 03 02 591 11$: cjne a,#03,1$ 0F08 80 49 592 sjmp 2$ 0F0A 24 F8 593 1$: add a,#-8 0F0C 50 0B 594 jnc 3$ 0F0E 24 F0 595 add a,#-16 0F10 40 03 596 jc 4$ 0F12 E2 597 movx a,@r0 0F13 80 06 598 sjmp 5$ 599 ;; sampling rate is: 24000000Hz/(divider+2) 0F15 74 18 600 4$: mov a,#24 0F17 80 02 601 sjmp 5$ 0F19 74 08 602 3$: mov a,#8 603 ;; 16 bit by 8 bit divide 604 ;; r2: divisor 605 ;; r3: loop counter 606 ;; r4: dividend/result low 607 ;; r5: dividend/result mid 608 ;; r6: dividend/result high 0F1B FA 609 5$: mov r2,a 0F1C 7B 11 610 mov r3,#17 0F1E 7C C0 611 mov r4,#24000 0F20 7D 5D 612 mov r5,#24000>>8 0F22 7E 00 613 mov r6,#0 0F24 C3 614 6$: clr c 0F25 EE 615 mov a,r6 0F26 9A 616 subb a,r2 0F27 40 01 617 jc 7$ 0F29 FE 618 mov r6,a 0F2A B3 619 7$: cpl c 0F2B EC 620 mov a,r4 0F2C 33 621 rlc a 0F2D FC 622 mov r4,a 0F2E ED 623 mov a,r5 0F2F 33 624 rlc a 0F30 FD 625 mov r5,a 0F31 EE 626 mov a,r6 0F32 33 627 rlc a 0F33 FE 628 mov r6,a 0F34 DB EE 629 djnz r3,6$ 630 ;; subtract two 0F36 EC 631 mov a,r4 0F37 C3 632 clr c 0F38 94 02 633 subb a,#2 0F3A FC 634 mov r4,a 0F3B ED 635 mov a,r5 0F3C 94 00 636 subb a,#0 0F3E FD 637 mov r5,a 638 ;; store result into audio divider 0F3F 90 C0 02 639 mov dptr,#AUDIODIVIDERHI 0F42 F0 640 movx @dptr,a 0F43 EC 641 mov a,r4 0F44 90 C0 01 642 mov dptr,#AUDIODIVIDERLO 0F47 F0 643 movx @dptr,a 0F48 C3 644 clr c 0F49 94 08 645 subb a,#0x08 0F4B F5 46 646 mov divider,a 0F4D ED 647 mov a,r5 0F4E 94 00 648 subb a,#0 0F50 F5 47 649 mov divider+1,a 650 ;; reload divider into accu 0F52 EA 651 mov a,r2 0F53 F5 49 652 2$: mov framesize,a 0F55 90 0D 6B 653 mov dptr,#descinframesize 0F58 F0 654 movx @dptr,a 0F59 90 0D 9F 655 mov dptr,#descoutframesize 0F5C F0 656 movx @dptr,a 657 ;; set sampling rate in descriptor 0F5D 75 F0 E8 658 mov b,#1000 0F60 A4 659 mul ab 0F61 90 0D 64 660 mov dptr,#descinsrate 0F64 F0 661 movx @dptr,a 0F65 90 0D 98 662 mov dptr,#descoutsrate 0F68 F0 663 movx @dptr,a 0F69 AB F0 664 mov r3,b 0F6B E5 49 665 mov a,framesize 0F6D 75 F0 03 666 mov b,#1000>>8 0F70 A4 667 mul ab 0F71 2B 668 add a,r3 0F72 90 0D 65 669 mov dptr,#descinsrate+1 0F75 F0 670 movx @dptr,a 0F76 90 0D 99 671 mov dptr,#descoutsrate+1 0F79 F0 672 movx @dptr,a 0F7A E4 673 clr a 0F7B 35 F0 674 addc a,b 0F7D 90 0D 66 675 mov dptr,#descinsrate+2 0F80 F0 676 movx @dptr,a 0F81 90 0D 9A 677 mov dptr,#descoutsrate+2 0F84 F0 678 movx @dptr,a 679 ;; initialize USB state 0F85 680 usbinit: 681 0000 682 .if 0 683 ;; XXXXX 684 ;; check if windows needs 11025Hz 685 mov a,#12 686 mov dptr,#descinframesize 687 movx @dptr,a 688 mov dptr,#descoutframesize 689 movx @dptr,a 690 mov a,#0x11 691 mov dptr,#descinsrate 692 movx @dptr,a 693 mov dptr,#descoutsrate 694 movx @dptr,a 695 mov a,#0x2b 696 mov dptr,#descinsrate+1 697 movx @dptr,a 698 mov dptr,#descoutsrate+1 699 movx @dptr,a 700 mov a,#0 701 mov dptr,#descinsrate+2 702 movx @dptr,a 703 mov dptr,#descoutsrate+2 704 movx @dptr,a 705 ;; XXXXX 706 .endif 707 0F85 E4 708 clr a 0F86 F5 62 709 mov numconfig,a 0F88 78 63 710 mov r0,#altsetting 0F8A 7A 04 711 mov r2,#NUMINTERFACES 0F8C F6 712 3$: mov @r0,a 0F8D 08 713 inc r0 0F8E DA FC 714 djnz r2,3$ 715 ;; give Windows a chance to finish the writecpucs control transfer 716 ;; 20ms delay loop 0F90 90 D1 20 717 mov dptr,#(-12000)&0xffff 0F93 A3 718 2$: inc dptr ; 3 cycles 0F94 E5 82 719 mov a,dpl0 ; 2 cycles 0F96 45 83 720 orl a,dph0 ; 2 cycles 0F98 70 F9 721 jnz 2$ ; 3 cycles 0001 722 .if 1 723 ;; disconnect from USB bus 0F9A 90 7F D6 724 mov dptr,#USBCS 0F9D 74 0A 725 mov a,#10 0F9F F0 726 movx @dptr,a 727 ;; wait 0.3 sec 0FA0 7A 1E 728 mov r2,#30 729 ;; 10ms delay loop 0FA2 90 E8 90 730 0$: mov dptr,#(-6000)&0xffff 0FA5 A3 731 1$: inc dptr ; 3 cycles 0FA6 E5 82 732 mov a,dpl0 ; 2 cycles 0FA8 45 83 733 orl a,dph0 ; 2 cycles 0FAA 70 F9 734 jnz 1$ ; 3 cycles 0FAC DA F4 735 djnz r2,0$ 736 ;; reconnect to USB bus 0FAE 90 7F D6 737 mov dptr,#USBCS 738 ;mov a,#2 ; 8051 handles control 739 ;movx @dptr,a 0FB1 74 06 740 mov a,#6 ; reconnect, 8051 handles control 0FB3 F0 741 movx @dptr,a 742 .endif 743 744 ;; final 0FB4 12 0A 13 745 lcall fillusbintr 0FB7 746 fifoinit: 747 ;; first wait for a new frame 0FB7 90 7F D8 748 mov dptr,#USBFRAMEL 0FBA E0 749 movx a,@dptr 0FBB FA 750 mov r2,a 0FBC E0 751 1$: movx a,@dptr 0FBD B5 02 02 752 cjne a,ar2,2$ 0FC0 80 FA 753 sjmp 1$ 0FC2 90 C0 01 754 2$: mov dptr,#AUDIORXFIFOCNT 0FC5 E0 755 movx a,@dptr 0FC6 24 FC 756 add a,#-4 0FC8 54 3F 757 anl a,#0x3f 0FCA 60 07 758 jz 4$ 0FCC FA 759 mov r2,a 0FCD 90 C0 00 760 mov dptr,#AUDIORXFIFO 0FD0 E0 761 3$: movx a,@dptr 0FD1 DA FD 762 djnz r2,3$ 0FD3 90 C0 02 763 4$: mov dptr,#AUDIOTXFIFOCNT 0FD6 E0 764 movx a,@dptr 0FD7 24 FC 765 add a,#-4 0FD9 54 3F 766 anl a,#0x3f 0FDB 60 F6 767 jz 4$ 0FDD FA 768 mov r2,a 0FDE 90 C0 00 769 mov dptr,#AUDIOTXFIFO 0FE1 E4 770 clr a 0FE2 F0 771 5$: movx @dptr,a 0FE3 DA FD 772 djnz r2,5$ 0FE5 773 6$: ;; clear SOFIR interrupt 0FE5 90 7F AB 774 mov dptr,#USBIRQ 0FE8 74 02 775 mov a,#0x02 0FEA F0 776 movx @dptr,a 777 ;; finally enable SOFIR interrupt 0FEB 90 7F AE 778 mov dptr,#USBIEN 0FEE 74 03 779 mov a,#3 ; enable SUDAV+SOFIR interrupt 0FF0 F0 780 movx @dptr,a 0FF1 12 0A 13 781 lcall fillusbintr 0FF4 02 01 57 782 ljmp mainloop 783 784 785 .area CSEG (CODE) 0002 786 ar2 = 0x02 0003 787 ar3 = 0x03 0004 788 ar4 = 0x04 0005 789 ar5 = 0x05 0006 790 ar6 = 0x06 0007 791 ar7 = 0x07 0000 792 ar0 = 0x00 0001 793 ar1 = 0x01 794 795 ;; WARNING! The assembler doesn't check for 796 ;; out of range short jump labels!! Double check 797 ;; that the jump labels are within the range! 0157 798 mainloop: 0157 E5 4C 799 mov a,pttforce 0159 A2 E0 800 mov c,acc.0 015B 92 00 801 mov ctrl_ptt,c 015D 92 02 802 mov ctrl_ledptt,c 015F B3 803 cpl c 0160 82 08 804 anl c,pttmute 0162 92 01 805 mov ctrl_pttmute,c 0164 90 C0 08 806 mov dptr,#AUDIOCTRL 0167 E5 20 807 mov a,ctrlreg 0169 F0 808 movx @dptr,a 016A 02 01 57 809 ljmp mainloop 810 811 ;; ------------------ interrupt handlers ------------------------ 812 016D 813 int0_isr: 016D C0 E0 814 push acc 016F C0 F0 815 push b 0171 C0 82 816 push dpl0 0173 C0 83 817 push dph0 0175 C0 D0 818 push psw 0177 75 D0 00 819 mov psw,#0x00 017A C0 86 820 push dps 017C 75 86 00 821 mov dps,#0 822 ;; clear interrupt 017F C2 89 823 clr tcon+1 824 ;; handle interrupt 825 ;; epilogue 0181 D0 86 826 pop dps 0183 D0 D0 827 pop psw 0185 D0 83 828 pop dph0 0187 D0 82 829 pop dpl0 0189 D0 F0 830 pop b 018B D0 E0 831 pop acc 018D 32 832 reti 833 018E 834 timer0_isr: 018E C0 E0 835 push acc 0190 C0 F0 836 push b 0192 C0 82 837 push dpl0 0194 C0 83 838 push dph0 0196 C0 D0 839 push psw 0198 75 D0 00 840 mov psw,#0x00 019B C0 86 841 push dps 019D 75 86 00 842 mov dps,#0 843 ;; clear interrupt 01A0 C2 8D 844 clr tcon+5 845 ;; handle interrupt 0000 846 .if 0 847 inc leddiv 848 mov a,leddiv 849 anl a,#7 850 jnz 0$ 851 mov dptr,#OUTC 852 movx a,@dptr 853 xrl a,#0x08 854 movx @dptr,a 855 0$: 856 .endif 857 ;; epilogue 01A2 D0 86 858 pop dps 01A4 D0 D0 859 pop psw 01A6 D0 83 860 pop dph0 01A8 D0 82 861 pop dpl0 01AA D0 F0 862 pop b 01AC D0 E0 863 pop acc 01AE 32 864 reti 865 01AF 866 int1_isr: 01AF C0 E0 867 push acc 01B1 C0 F0 868 push b 01B3 C0 82 869 push dpl0 01B5 C0 83 870 push dph0 01B7 C0 D0 871 push psw 01B9 75 D0 00 872 mov psw,#0x00 01BC C0 86 873 push dps 01BE 75 86 00 874 mov dps,#0 875 ;; clear interrupt 01C1 C2 8B 876 clr tcon+3 877 ;; handle interrupt 878 ;; epilogue 01C3 D0 86 879 pop dps 01C5 D0 D0 880 pop psw 01C7 D0 83 881 pop dph0 01C9 D0 82 882 pop dpl0 01CB D0 F0 883 pop b 01CD D0 E0 884 pop acc 01CF 32 885 reti 886 01D0 887 timer1_isr: 01D0 C0 E0 888 push acc 01D2 C0 F0 889 push b 01D4 C0 82 890 push dpl0 01D6 C0 83 891 push dph0 01D8 C0 D0 892 push psw 01DA 75 D0 00 893 mov psw,#0x00 01DD C0 86 894 push dps 01DF 75 86 00 895 mov dps,#0 896 ;; clear interrupt 01E2 C2 8F 897 clr tcon+7 898 ;; handle interrupt 899 ;; epilogue 01E4 D0 86 900 pop dps 01E6 D0 D0 901 pop psw 01E8 D0 83 902 pop dph0 01EA D0 82 903 pop dpl0 01EC D0 F0 904 pop b 01EE D0 E0 905 pop acc 01F0 32 906 reti 907 01F1 908 ser0_isr: 01F1 C0 E0 909 push acc 01F3 C0 F0 910 push b 01F5 C0 82 911 push dpl0 01F7 C0 83 912 push dph0 01F9 C0 D0 913 push psw 01FB 75 D0 00 914 mov psw,#0x00 01FE C0 86 915 push dps 0200 75 86 00 916 mov dps,#0 0203 C0 00 917 push ar0 918 ;; clear interrupt 0205 10 98 16 919 jbc scon0+0,1$ ; RI 0208 10 99 0F 920 0$: jbc scon0+1,2$ ; TI 921 ;; handle interrupt 922 ;; epilogue 020B D0 00 923 3$: pop ar0 020D D0 86 924 pop dps 020F D0 D0 925 pop psw 0211 D0 83 926 pop dph0 0213 D0 82 927 pop dpl0 0215 D0 F0 928 pop b 0217 D0 E0 929 pop acc 0219 32 930 reti 931 021A D2 09 932 2$: setb uartempty 021C 80 EA 933 sjmp 0$ 934 021E E5 5D 935 1$: mov a,uartwr 0220 24 4D 936 add a,#uartbuf 0222 F8 937 mov r0,a 0223 E5 99 938 mov a,sbuf0 0225 F6 939 mov @r0,a 0226 E5 5D 940 mov a,uartwr 0228 04 941 inc a 0229 54 0F 942 anl a,#0xf 022B F5 5D 943 mov uartwr,a 022D 80 DC 944 sjmp 3$ 945 022F 946 timer2_isr: 022F C0 E0 947 push acc 0231 C0 F0 948 push b 0233 C0 82 949 push dpl0 0235 C0 83 950 push dph0 0237 C0 D0 951 push psw 0239 75 D0 00 952 mov psw,#0x00 023C C0 86 953 push dps 023E 75 86 00 954 mov dps,#0 955 ;; clear interrupt 0241 C2 CF 956 clr t2con+7 957 ;; handle interrupt 958 ;; epilogue 0243 D0 86 959 pop dps 0245 D0 D0 960 pop psw 0247 D0 83 961 pop dph0 0249 D0 82 962 pop dpl0 024B D0 F0 963 pop b 024D D0 E0 964 pop acc 024F 32 965 reti 966 0250 967 resume_isr: 0250 C0 E0 968 push acc 0252 C0 F0 969 push b 0254 C0 82 970 push dpl0 0256 C0 83 971 push dph0 0258 C0 D0 972 push psw 025A 75 D0 00 973 mov psw,#0x00 025D C0 86 974 push dps 025F 75 86 00 975 mov dps,#0 976 ;; clear interrupt 0262 C2 DC 977 clr eicon+4 978 ;; handle interrupt 979 ;; epilogue 0264 D0 86 980 pop dps 0266 D0 D0 981 pop psw 0268 D0 83 982 pop dph0 026A D0 82 983 pop dpl0 026C D0 F0 984 pop b 026E D0 E0 985 pop acc 0270 32 986 reti 987 0271 988 ser1_isr: 0271 C0 E0 989 push acc 0273 C0 F0 990 push b 0275 C0 82 991 push dpl0 0277 C0 83 992 push dph0 0279 C0 D0 993 push psw 027B 75 D0 00 994 mov psw,#0x00 027E C0 86 995 push dps 0280 75 86 00 996 mov dps,#0 997 ;; clear interrupt 0283 C2 C0 998 clr scon1+0 0285 C2 C1 999 clr scon1+1 1000 ;; handle interrupt 1001 ;; epilogue 0287 D0 86 1002 pop dps 0289 D0 D0 1003 pop psw 028B D0 83 1004 pop dph0 028D D0 82 1005 pop dpl0 028F D0 F0 1006 pop b 0291 D0 E0 1007 pop acc 0293 32 1008 reti 1009 0294 1010 i2c_isr: 0294 C0 E0 1011 push acc 0296 C0 F0 1012 push b 0298 C0 82 1013 push dpl0 029A C0 83 1014 push dph0 029C C0 D0 1015 push psw 029E 75 D0 00 1016 mov psw,#0x00 02A1 C0 86 1017 push dps 02A3 75 86 00 1018 mov dps,#0 1019 ;; clear interrupt 02A6 E5 91 1020 mov a,exif 02A8 C2 E5 1021 clr acc.5 02AA F5 91 1022 mov exif,a 1023 ;; handle interrupt 1024 ;; epilogue 02AC D0 86 1025 pop dps 02AE D0 D0 1026 pop psw 02B0 D0 83 1027 pop dph0 02B2 D0 82 1028 pop dpl0 02B4 D0 F0 1029 pop b 02B6 D0 E0 1030 pop acc 02B8 32 1031 reti 1032 02B9 1033 int4_isr: 02B9 C0 E0 1034 push acc 02BB C0 F0 1035 push b 02BD C0 82 1036 push dpl0 02BF C0 83 1037 push dph0 02C1 C0 D0 1038 push psw 02C3 75 D0 00 1039 mov psw,#0x00 02C6 C0 86 1040 push dps 02C8 75 86 00 1041 mov dps,#0 1042 ;; clear interrupt 02CB E5 91 1043 mov a,exif 02CD C2 E6 1044 clr acc.6 02CF F5 91 1045 mov exif,a 1046 ;; handle interrupt 1047 ;; epilogue 02D1 D0 86 1048 pop dps 02D3 D0 D0 1049 pop psw 02D5 D0 83 1050 pop dph0 02D7 D0 82 1051 pop dpl0 02D9 D0 F0 1052 pop b 02DB D0 E0 1053 pop acc 02DD 32 1054 reti 1055 02DE 1056 int5_isr: 02DE C0 E0 1057 push acc 02E0 C0 F0 1058 push b 02E2 C0 82 1059 push dpl0 02E4 C0 83 1060 push dph0 02E6 C0 D0 1061 push psw 02E8 75 D0 00 1062 mov psw,#0x00 02EB C0 86 1063 push dps 02ED 75 86 00 1064 mov dps,#0 1065 ;; clear interrupt 02F0 E5 91 1066 mov a,exif 02F2 C2 E7 1067 clr acc.7 02F4 F5 91 1068 mov exif,a 1069 ;; handle interrupt 1070 ;; epilogue 02F6 D0 86 1071 pop dps 02F8 D0 D0 1072 pop psw 02FA D0 83 1073 pop dph0 02FC D0 82 1074 pop dpl0 02FE D0 F0 1075 pop b 0300 D0 E0 1076 pop acc 0302 32 1077 reti 1078 0303 1079 int6_isr: 0303 C0 E0 1080 push acc 0305 C0 F0 1081 push b 0307 C0 82 1082 push dpl0 0309 C0 83 1083 push dph0 030B C0 D0 1084 push psw 030D 75 D0 00 1085 mov psw,#0x00 0310 C0 86 1086 push dps 0312 75 86 00 1087 mov dps,#0 1088 ;; clear interrupt 0315 C2 DB 1089 clr eicon+3 1090 ;; handle interrupt 1091 ;; epilogue 0317 D0 86 1092 pop dps 0319 D0 D0 1093 pop psw 031B D0 83 1094 pop dph0 031D D0 82 1095 pop dpl0 031F D0 F0 1096 pop b 0321 D0 E0 1097 pop acc 0323 32 1098 reti 1099 0324 1100 usb_sudav_isr: 0324 C0 E0 1101 push acc 0326 C0 F0 1102 push b 0328 C0 82 1103 push dpl0 032A C0 83 1104 push dph0 032C C0 84 1105 push dpl1 032E C0 85 1106 push dph1 0330 C0 D0 1107 push psw 0332 75 D0 00 1108 mov psw,#0x00 0335 C0 86 1109 push dps 0337 75 86 00 1110 mov dps,#0 033A C0 00 1111 push ar0 033C C0 07 1112 push ar7 1113 ;; clear interrupt 033E E5 91 1114 mov a,exif 0340 C2 E4 1115 clr acc.4 0342 F5 91 1116 mov exif,a 0344 90 7F AB 1117 mov dptr,#USBIRQ 0347 74 01 1118 mov a,#0x01 0349 F0 1119 movx @dptr,a 1120 ;; handle interrupt 034A 75 40 00 1121 mov ctrlcode,#0 ; reset control out code 034D 90 7F E9 1122 mov dptr,#SETUPDAT+1 0350 E0 1123 movx a,@dptr ; bRequest field 1124 ;; standard commands 1125 ;; USB_REQ_GET_DESCRIPTOR 0351 B4 06 59 1126 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 0354 90 7F E8 1127 mov dptr,#SETUPDAT ; bRequestType == 0x80 0357 E0 1128 movx a,@dptr 0358 B4 80 4F 1129 cjne a,#USB_DIR_IN,setupstallstd 035B 90 7F EB 1130 mov dptr,#SETUPDAT+3 035E E0 1131 movx a,@dptr 035F B4 01 0C 1132 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 0362 90 7F D4 1133 mov dptr,#SUDPTRH 0365 74 0C 1134 mov a,#>devicedescr 0367 F0 1135 movx @dptr,a 0368 A3 1136 inc dptr 0369 74 CB 1137 mov a,#config0descr 037C F0 1147 movx @dptr,a 037D A3 1148 inc dptr 037E 74 DD 1149 mov a,#stringdescr 0398 F5 83 1164 mov dph0,a 039A E0 1165 movx a,@dptr 039B F5 F0 1166 mov b,a 039D A3 1167 inc dptr 039E E0 1168 movx a,@dptr 039F 90 7F D4 1169 mov dptr,#SUDPTRH 03A2 F0 1170 movx @dptr,a 03A3 A3 1171 inc dptr 03A4 E5 F0 1172 mov a,b 03A6 F0 1173 movx @dptr,a 1174 ; sjmp setupackstd 03A7 1175 setupackstd: 03A7 02 07 B7 1176 ljmp setupack 03AA 1177 setupstallstd: 03AA 02 07 B3 1178 ljmp setupstall 03AD 1179 cmdnotgetdesc: 1180 ;; USB_REQ_SET_CONFIGURATION 03AD B4 09 41 1181 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 03B0 90 7F E8 1182 mov dptr,#SETUPDAT 03B3 E0 1183 movx a,@dptr 03B4 70 F4 1184 jnz setupstallstd 03B6 90 7F EA 1185 mov dptr,#SETUPDAT+2 03B9 E0 1186 movx a,@dptr 03BA 24 FE 1187 add a,#-2 03BC 40 EC 1188 jc setupstallstd 03BE E0 1189 movx a,@dptr 03BF F5 62 1190 mov numconfig,a 03C1 1191 cmdresettoggleshalt: 03C1 90 7F D7 1192 mov dptr,#TOGCTL 03C4 78 07 1193 mov r0,#7 03C6 E8 1194 0$: mov a,r0 03C7 44 10 1195 orl a,#0x10 03C9 F0 1196 movx @dptr,a 03CA 44 30 1197 orl a,#0x30 03CC F0 1198 movx @dptr,a 03CD E8 1199 mov a,r0 03CE F0 1200 movx @dptr,a 03CF 44 20 1201 orl a,#0x20 03D1 F0 1202 movx @dptr,a 03D2 D8 F2 1203 djnz r0,0$ 03D4 E4 1204 clr a 03D5 F0 1205 movx @dptr,a 03D6 74 02 1206 mov a,#2 03D8 90 7F B6 1207 mov dptr,#IN1CS 03DB 78 07 1208 mov r0,#7 03DD F0 1209 1$: movx @dptr,a 03DE A3 1210 inc dptr 03DF A3 1211 inc dptr 03E0 D8 FB 1212 djnz r0,1$ 03E2 90 7F C6 1213 mov dptr,#OUT1CS 03E5 78 07 1214 mov r0,#7 03E7 F0 1215 2$: movx @dptr,a 03E8 A3 1216 inc dptr 03E9 A3 1217 inc dptr 03EA D8 FB 1218 djnz r0,2$ 03EC 12 0A 13 1219 lcall fillusbintr 03EF 80 B6 1220 sjmp setupackstd 03F1 1221 cmdnotsetconf: 1222 ;; USB_REQ_SET_INTERFACE 03F1 B4 0B 1E 1223 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 03F4 90 7F E8 1224 mov dptr,#SETUPDAT 03F7 E0 1225 movx a,@dptr 03F8 B4 01 AF 1226 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 03FB E5 62 1227 mov a,numconfig 03FD B4 01 AA 1228 cjne a,#1,setupstallstd 0400 90 7F EC 1229 mov dptr,#SETUPDAT+4 0403 E0 1230 movx a,@dptr 0404 24 FC 1231 add a,#-NUMINTERFACES 0406 40 A2 1232 jc setupstallstd 0408 24 67 1233 add a,#NUMINTERFACES+altsetting 040A F8 1234 mov r0,a 040B 90 7F EA 1235 mov dptr,#SETUPDAT+2 040E E0 1236 movx a,@dptr 040F F6 1237 mov @r0,a 0410 80 AF 1238 sjmp cmdresettoggleshalt 0412 1239 cmdnotsetint: 1240 ;; USB_REQ_GET_INTERFACE 0412 B4 0A 24 1241 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 0415 90 7F E8 1242 mov dptr,#SETUPDAT 0418 E0 1243 movx a,@dptr 0419 B4 81 8E 1244 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 041C E5 62 1245 mov a,numconfig 041E B4 01 89 1246 cjne a,#1,setupstallstd 0421 90 7F EC 1247 mov dptr,#SETUPDAT+4 0424 E0 1248 movx a,@dptr 0425 24 FC 1249 add a,#-NUMINTERFACES 0427 40 81 1250 jc setupstallstd 0429 24 67 1251 add a,#NUMINTERFACES+altsetting 042B F8 1252 mov r0,a 042C E6 1253 mov a,@r0 042D 1254 cmdrespondonebyte: 042D 90 7F 00 1255 mov dptr,#IN0BUF 0430 F0 1256 movx @dptr,a 0431 90 7F B5 1257 mov dptr,#IN0BC 0434 74 01 1258 mov a,#1 0436 F0 1259 movx @dptr,a 0437 80 4E 1260 sjmp setupackstd2 0439 1261 cmdnotgetint: 1262 ;; USB_REQ_GET_CONFIGURATION 0439 B4 08 0B 1263 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 043C 90 7F E8 1264 mov dptr,#SETUPDAT 043F E0 1265 movx a,@dptr 0440 B4 80 47 1266 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 0443 E5 62 1267 mov a,numconfig 0445 80 E6 1268 sjmp cmdrespondonebyte 0447 1269 cmdnotgetconf: 1270 ;; USB_REQ_GET_STATUS (0) 0447 70 44 1271 jnz cmdnotgetstat 0449 90 7F E8 1272 mov dptr,#SETUPDAT 044C E0 1273 movx a,@dptr 044D B4 80 11 1274 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 0450 74 01 1275 mov a,#1 0452 1276 cmdrespondstat: 0452 90 7F 00 1277 mov dptr,#IN0BUF 0455 F0 1278 movx @dptr,a 0456 A3 1279 inc dptr 0457 E4 1280 clr a 0458 F0 1281 movx @dptr,a 0459 90 7F B5 1282 mov dptr,#IN0BC 045C 74 02 1283 mov a,#2 045E F0 1284 movx @dptr,a 045F 80 26 1285 sjmp setupackstd2 0461 1286 cmdnotgetstatdev: 0461 B4 81 03 1287 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 0464 E4 1288 clr a 0465 80 EB 1289 sjmp cmdrespondstat 0467 1290 cmdnotgetstatintf: 0467 B4 82 20 1291 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 046A 90 7F EC 1292 mov dptr,#SETUPDAT+4 046D E0 1293 movx a,@dptr 046E 90 7F C4 1294 mov dptr,#OUT1CS-2 0471 30 E7 03 1295 jnb acc.7,0$ 0474 90 7F B4 1296 mov dptr,#IN1CS-2 0477 54 0F 1297 0$: anl a,#15 0479 60 0F 1298 jz setupstallstd2 047B 20 E3 0C 1299 jb acc.3,setupstallstd2 047E 25 E0 1300 add a,acc 0480 25 82 1301 add a,dpl0 0482 F5 82 1302 mov dpl0,a 0484 E0 1303 movx a,@dptr 0485 80 CB 1304 sjmp cmdrespondstat 0487 1305 setupackstd2: 0487 02 07 B7 1306 ljmp setupack 048A 1307 setupstallstd2: 048A 02 07 B3 1308 ljmp setupstall 048D 1309 cmdnotgetstat: 1310 ;; USB_REQ_SET_FEATURE 048D B4 03 05 1311 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 0490 75 F0 01 1312 mov b,#1 0493 80 06 1313 sjmp handleftr 0495 1314 cmdnotsetftr: 1315 ;; USB_REQ_CLEAR_FEATURE 0495 B4 01 44 1316 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 0498 75 F0 00 1317 mov b,#0 049B 1318 handleftr: 049B 90 7F E8 1319 mov dptr,#SETUPDAT 049E E0 1320 movx a,@dptr 049F B4 02 E8 1321 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 04A2 A3 1322 inc dptr 04A3 A3 1323 inc dptr 04A4 E0 1324 movx a,@dptr 04A5 70 E3 1325 jnz setupstallstd2 ; not ENDPOINT_HALT feature 04A7 A3 1326 inc dptr 04A8 E0 1327 movx a,@dptr 04A9 70 DF 1328 jnz setupstallstd2 04AB A3 1329 inc dptr 04AC E0 1330 movx a,@dptr 04AD 90 7F C4 1331 mov dptr,#OUT1CS-2 04B0 30 E7 05 1332 jnb acc.7,0$ 04B3 90 7F B4 1333 mov dptr,#IN1CS-2 04B6 44 10 1334 orl a,#0x10 04B8 20 E3 CF 1335 0$: jb acc.3,setupstallstd2 1336 ;; clear data toggle 04BB 54 1F 1337 anl a,#0x1f 04BD 05 86 1338 inc dps 04BF 90 7F D7 1339 mov dptr,#TOGCTL 04C2 F0 1340 movx @dptr,a 04C3 44 20 1341 orl a,#0x20 04C5 F0 1342 movx @dptr,a 04C6 54 0F 1343 anl a,#15 04C8 F0 1344 movx @dptr,a 04C9 15 86 1345 dec dps 1346 ;; clear/set ep halt feature 04CB 25 E0 1347 add a,acc 04CD 25 82 1348 add a,dpl0 04CF F5 82 1349 mov dpl0,a 04D1 E5 F0 1350 mov a,b 04D3 F0 1351 movx @dptr,a 04D4 80 B1 1352 sjmp setupackstd2 1353 04D6 1354 cmdnotc0_1: 04D6 02 05 6E 1355 ljmp cmdnotc0 04D9 1356 setupstallc0_1: 04D9 02 07 B3 1357 ljmp setupstall 1358 04DC 1359 cmdnotclrftr: 1360 ;; vendor specific commands 1361 ;; 0xc0 04DC B4 C0 F7 1362 cjne a,#0xc0,cmdnotc0_1 04DF 90 7F E8 1363 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04E2 E0 1364 movx a,@dptr 04E3 B4 C0 F3 1365 cjne a,#0xc0,setupstallc0_1 1366 ;; fill status buffer 04E6 E5 4C 1367 mov a,pttforce 04E8 F5 F0 1368 mov b,a 04EA A2 E0 1369 mov c,acc.0 04EC 92 F2 1370 mov b.2,c 04EE 90 C0 09 1371 mov dptr,#AUDIOSTAT 04F1 E0 1372 movx a,@dptr 04F2 A2 E0 1373 mov c,acc.0 04F4 B3 1374 cpl c 04F5 92 F3 1375 mov b.3,c 04F7 A2 09 1376 mov c,uartempty 04F9 92 F5 1377 mov b.5,c 04FB E4 1378 clr a 04FC 90 7F 04 1379 mov dptr,#(IN0BUF+4) 04FF F0 1380 movx @dptr,a 1381 ;; bytewide elements 0500 90 7F 00 1382 mov dptr,#(IN0BUF) 0503 E5 F0 1383 mov a,b 0505 F0 1384 movx @dptr,a 0506 E4 1385 clr a 0507 90 7F 01 1386 mov dptr,#(IN0BUF+1) 050A F0 1387 movx @dptr,a 050B 90 7F 02 1388 mov dptr,#(IN0BUF+2) 050E F0 1389 movx @dptr,a 050F 90 C0 04 1390 mov dptr,#AUDIORSSI 0512 E0 1391 movx a,@dptr 0513 90 7F 03 1392 mov dptr,#(IN0BUF+3) 0516 F0 1393 movx @dptr,a 1394 ;; counter 0517 05 44 1395 inc irqcount 0519 E5 44 1396 mov a,irqcount 051B 90 7F 05 1397 mov dptr,#(IN0BUF+5) 051E F0 1398 movx @dptr,a 1399 ;; additional fields (HDLC state mach) 051F E4 1400 clr a 0520 A3 1401 inc dptr 0521 F0 1402 movx @dptr,a 0522 A3 1403 inc dptr 0523 F0 1404 movx @dptr,a 0524 A3 1405 inc dptr 0525 F0 1406 movx @dptr,a 0526 A3 1407 inc dptr 0527 F0 1408 movx @dptr,a 0528 A3 1409 inc dptr 0529 F0 1410 movx @dptr,a 052A A3 1411 inc dptr 052B F0 1412 movx @dptr,a 052C A3 1413 inc dptr 052D F0 1414 movx @dptr,a 052E A3 1415 inc dptr 052F F0 1416 movx @dptr,a 0530 A3 1417 inc dptr 0531 F0 1418 movx @dptr,a 0532 A3 1419 inc dptr 0533 F0 1420 movx @dptr,a 0534 A3 1421 inc dptr 0535 F0 1422 movx @dptr,a 0536 A3 1423 inc dptr 0537 F0 1424 movx @dptr,a 1425 ;; FPGA registers 0538 90 C0 01 1426 mov dptr,#AUDIORXFIFOCNT 053B E0 1427 movx a,@dptr 053C 90 7F 12 1428 mov dptr,#(IN0BUF+18) 053F F0 1429 movx @dptr,a 0540 90 C0 02 1430 mov dptr,#AUDIOTXFIFOCNT 0543 E0 1431 movx a,@dptr 0544 90 7F 13 1432 mov dptr,#(IN0BUF+19) 0547 F0 1433 movx @dptr,a 0548 E5 20 1434 mov a,ctrlreg 054A A3 1435 inc dptr 054B F0 1436 movx @dptr,a 054C 90 C0 09 1437 mov dptr,#AUDIOSTAT 054F E0 1438 movx a,@dptr 0550 90 7F 15 1439 mov dptr,#(IN0BUF+21) 0553 F0 1440 movx @dptr,a 1441 ;; Anchor Registers 0554 90 7F C8 1442 mov dptr,#OUT2CS 0557 E0 1443 movx a,@dptr 0558 90 7F 16 1444 mov dptr,#(IN0BUF+22) 055B F0 1445 movx @dptr,a 1446 ;; set length 055C 90 7F EE 1447 mov dptr,#SETUPDAT+6 ; wLength 055F E0 1448 movx a,@dptr 0560 24 E9 1449 add a,#-(6+12+4+1) 0562 50 01 1450 jnc 4$ 0564 E4 1451 clr a 0565 24 17 1452 4$: add a,#(6+12+4+1) 0567 90 7F B5 1453 mov dptr,#IN0BC 056A F0 1454 movx @dptr,a 056B 02 07 B7 1455 ljmp setupack 056E 1456 cmdnotc0: 1457 ;; 0xc8 056E B4 C8 19 1458 cjne a,#0xc8,cmdnotc8 0571 90 7F E8 1459 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0574 E0 1460 movx a,@dptr 0575 B4 C0 0F 1461 cjne a,#0xc0,setupstallc8 0578 74 04 1462 mov a,#4 057A 90 7F 00 1463 mov dptr,#IN0BUF 057D F0 1464 movx @dptr,a 057E 90 7F B5 1465 mov dptr,#IN0BC 0581 74 01 1466 mov a,#1 0583 F0 1467 movx @dptr,a 0584 02 07 B7 1468 ljmp setupack 0587 1469 setupstallc8: 0587 02 07 B3 1470 ljmp setupstall 058A 1471 cmdnotc8: 1472 ;; 0xc9 058A B4 C9 21 1473 cjne a,#0xc9,cmdnotc9 058D 90 7F E8 1474 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0590 E0 1475 movx a,@dptr 0591 B4 C0 17 1476 cjne a,#0xc0,setupstallc9 0594 90 7F 00 1477 mov dptr,#IN0BUF 0597 78 F0 1478 mov r0,#parserial 0599 E2 1479 0$: movx a,@r0 059A 60 05 1480 jz 1$ 059C F0 1481 movx @dptr,a 059D 08 1482 inc r0 059E A3 1483 inc dptr 059F 80 F8 1484 sjmp 0$ 05A1 E8 1485 1$: mov a,r0 05A2 24 10 1486 add a,#-0xf0 ; -parserial 05A4 90 7F B5 1487 mov dptr,#IN0BC 05A7 F0 1488 movx @dptr,a 05A8 02 07 B7 1489 ljmp setupack 05AB 1490 setupstallc9: 05AB 02 07 B3 1491 ljmp setupstall 05AE 1492 cmdnotc9: 1493 ;; 0xd0 05AE B4 D0 45 1494 cjne a,#0xd0,cmdnotd0 05B1 90 7F E8 1495 mov dptr,#SETUPDAT ; bRequestType == 0xc0 05B4 E0 1496 movx a,@dptr 05B5 B4 C0 3B 1497 cjne a,#0xc0,setupstalld0 05B8 90 7F EC 1498 mov dptr,#SETUPDAT+4 ; wIndex 05BB E0 1499 movx a,@dptr 05BC B4 01 08 1500 cjne a,#1,0$ 05BF 90 7F EA 1501 mov dptr,#SETUPDAT+2 ; wValue 05C2 E0 1502 movx a,@dptr 05C3 54 01 1503 anl a,#1 05C5 F5 4C 1504 mov pttforce,a 05C7 1505 0$: ;; PTT status 05C7 90 7F 00 1506 mov dptr,#IN0BUF 05CA E5 4C 1507 mov a,pttforce 05CC F0 1508 movx @dptr,a 1509 ;; DCD status 05CD 90 C0 09 1510 mov dptr,#AUDIOSTAT 05D0 E0 1511 movx a,@dptr 05D1 54 01 1512 anl a,#1 05D3 64 01 1513 xrl a,#1 05D5 90 7F 01 1514 mov dptr,#IN0BUF+1 05D8 F0 1515 movx @dptr,a 1516 ;; RSSI 05D9 90 C0 04 1517 mov dptr,#AUDIORSSI 05DC E0 1518 movx a,@dptr 05DD 90 7F 02 1519 mov dptr,#IN0BUF+2 05E0 F0 1520 movx @dptr,a 1521 ;; length 05E1 90 7F EE 1522 mov dptr,#SETUPDAT+6 ; wLength 05E4 E0 1523 movx a,@dptr 05E5 24 FD 1524 add a,#-3 05E7 50 01 1525 jnc 2$ 05E9 E4 1526 clr a 05EA 24 03 1527 2$: add a,#3 05EC 90 7F B5 1528 mov dptr,#IN0BC 05EF F0 1529 movx @dptr,a 05F0 02 07 B7 1530 ljmp setupack 05F3 1531 setupstalld0: 05F3 02 07 B3 1532 ljmp setupstall 05F6 1533 cmdnotd0: 1534 ;; 0xd2 05F6 B4 D2 20 1535 cjne a,#0xd2,cmdnotd2 05F9 90 7F E8 1536 mov dptr,#SETUPDAT ; bRequestType == 0x40 05FC E0 1537 movx a,@dptr 05FD B4 40 16 1538 cjne a,#0x40,setupstalld2 0600 90 7F EA 1539 mov dptr,#SETUPDAT+2 ; wValue 0603 E0 1540 movx a,@dptr 0604 F5 F0 1541 mov b,a 0606 90 7F 98 1542 mov dptr,#OUTC 0609 E0 1543 movx a,@dptr 060A A2 F0 1544 mov c,b.0 060C 92 E3 1545 mov acc.3,c 060E A2 F1 1546 mov c,b.1 0610 92 E5 1547 mov acc.5,c 0612 F0 1548 movx @dptr,a 0613 02 07 B7 1549 ljmp setupack 0616 1550 setupstalld2: 0616 02 07 B3 1551 ljmp setupstall 0619 1552 cmdnotd2: 1553 ;; 0xd3 0619 B4 D3 16 1554 cjne a,#0xd3,cmdnotd3 061C 90 7F E8 1555 mov dptr,#SETUPDAT ; bRequestType == 0x40 061F E0 1556 movx a,@dptr 0620 B4 40 07 1557 cjne a,#0x40,setupstalld3 0623 90 7F EA 1558 mov dptr,#SETUPDAT+2 ; wValue 0626 E0 1559 movx a,@dptr 0627 10 09 03 1560 jbc uartempty,cmdd2cont 062A 1561 setupstalld3: 062A 02 07 B3 1562 ljmp setupstall 062D 1563 cmdd2cont: 062D F5 99 1564 mov sbuf0,a 062F 02 07 B7 1565 ljmp setupack 0632 1566 cmdnotd3: 1567 ;; 0xd4 0632 B4 D4 49 1568 cjne a,#0xd4,cmdnotd4 0635 90 7F E8 1569 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0638 E0 1570 movx a,@dptr 0639 B4 C0 3F 1571 cjne a,#0xc0,setupstalld4 063C 90 7F EC 1572 mov dptr,#SETUPDAT+4 ; wIndex 063F E0 1573 movx a,@dptr 0640 90 7F EA 1574 mov dptr,#SETUPDAT+2 ; wValue 0643 B4 01 09 1575 cjne a,#1,0$ 0646 E0 1576 movx a,@dptr 0647 90 C0 0D 1577 mov dptr,#AUDIOMDISCOUT 064A F0 1578 movx @dptr,a 064B F5 61 1579 mov mdiscout,a 064D 80 0A 1580 sjmp 1$ 064F B4 02 07 1581 0$: cjne a,#2,1$ 0652 E0 1582 movx a,@dptr 0653 90 C0 0C 1583 mov dptr,#AUDIOMDISCTRIS 0656 F0 1584 movx @dptr,a 0657 F5 60 1585 mov mdisctris,a 0659 90 C0 0E 1586 1$: mov dptr,#AUDIOMDISCIN 065C E0 1587 movx a,@dptr 065D 90 7F 00 1588 mov dptr,#IN0BUF+0 0660 F0 1589 movx @dptr,a 0661 E5 61 1590 mov a,mdiscout 0663 A3 1591 inc dptr 0664 F0 1592 movx @dptr,a 0665 E5 60 1593 mov a,mdisctris 0667 A3 1594 inc dptr 0668 F0 1595 movx @dptr,a 1596 ;; length 0669 90 7F EE 1597 mov dptr,#SETUPDAT+6 ; wLength 066C E0 1598 movx a,@dptr 066D 24 FD 1599 add a,#-3 066F 50 01 1600 jnc 2$ 0671 E4 1601 clr a 0672 24 03 1602 2$: add a,#3 0674 90 7F B5 1603 mov dptr,#IN0BC 0677 F0 1604 movx @dptr,a 0678 02 07 B7 1605 ljmp setupack 067B 1606 setupstalld4: 067B 02 07 B3 1607 ljmp setupstall 067E 1608 cmdnotd4: 1609 ;; 0xd5 067E B4 D5 3F 1610 cjne a,#0xd5,cmdnotd5 0681 90 7F E8 1611 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0684 E0 1612 movx a,@dptr 0685 B4 C0 32 1613 cjne a,#0xc0,setupstalld5 0688 90 7F EC 1614 mov dptr,#SETUPDAT+4 ; wIndex 068B E0 1615 movx a,@dptr 068C B4 01 0A 1616 cjne a,#1,0$ 068F 90 7F EA 1617 mov dptr,#SETUPDAT+2 ; wValue 0692 E0 1618 movx a,@dptr 0693 90 C0 0A 1619 mov dptr,#AUDIOT7FOUT 0696 F0 1620 movx @dptr,a 0697 F5 5F 1621 mov t7fout,a 0699 90 C0 0B 1622 0$: mov dptr,#AUDIOT7FIN 069C E0 1623 movx a,@dptr 069D 90 7F 00 1624 mov dptr,#IN0BUF+0 06A0 F0 1625 movx @dptr,a 06A1 E5 5F 1626 mov a,t7fout 06A3 A3 1627 inc dptr 06A4 90 7F 01 1628 mov dptr,#IN0BUF+1 06A7 F0 1629 movx @dptr,a 1630 ;; length 06A8 90 7F EE 1631 mov dptr,#SETUPDAT+6 ; wLength 06AB E0 1632 movx a,@dptr 06AC 24 FE 1633 add a,#-2 06AE 50 01 1634 jnc 2$ 06B0 E4 1635 clr a 06B1 24 02 1636 2$: add a,#2 06B3 90 7F B5 1637 mov dptr,#IN0BC 06B6 F0 1638 movx @dptr,a 06B7 02 07 B7 1639 ljmp setupack 06BA 1640 setupstalld5: 06BA 1641 setupstalle0: 06BA 02 07 B3 1642 ljmp setupstall 06BD 1643 cmdnote0_0: 06BD 02 07 53 1644 ljmp cmdnote0 06C0 1645 cmdnotd5: 1646 ;; 0xe0 06C0 B4 E0 FA 1647 cjne a,#0xe0,cmdnote0_0 06C3 90 7F E8 1648 mov dptr,#SETUPDAT ; bRequestType == 0xc0 06C6 E0 1649 movx a,@dptr 06C7 B4 C0 F0 1650 cjne a,#0xc0,setupstalle0 1651 ;; set PTT, LED's and counter mode 06CA 90 7F EC 1652 mov dptr,#SETUPDAT+4 ; wIndex 06CD E0 1653 movx a,@dptr 06CE B4 01 12 1654 cjne a,#1,1$ 06D1 90 7F EA 1655 mov dptr,#SETUPDAT+2 ; wValue 06D4 E0 1656 movx a,@dptr 06D5 54 78 1657 anl a,#0x78 06D7 C5 20 1658 xch a,ctrlreg 06D9 54 07 1659 anl a,#0x07 06DB 45 20 1660 orl a,ctrlreg 06DD F5 20 1661 mov ctrlreg,a 06DF 90 C0 08 1662 mov dptr,#AUDIOCTRL 06E2 F0 1663 movx @dptr,a 06E3 90 7F EE 1664 1$: mov dptr,#SETUPDAT+6 ; wLength 06E6 E0 1665 movx a,@dptr 06E7 60 0D 1666 jz 3$ 06E9 B4 01 11 1667 cjne a,#1,2$ 06EC E5 20 1668 mov a,ctrlreg 06EE 90 7F 00 1669 mov dptr,#IN0BUF 06F1 54 7F 1670 anl a,#0x7f 06F3 F0 1671 movx @dptr,a 06F4 74 01 1672 mov a,#1 06F6 90 7F B5 1673 3$: mov dptr,#IN0BC 06F9 F0 1674 movx @dptr,a 06FA 02 07 B7 1675 ljmp setupack 06FD 90 C0 08 1676 2$: mov dptr,#AUDIOCTRL 0700 D2 07 1677 setb ctrl_cntsel 0702 E5 20 1678 mov a,ctrlreg 0704 F0 1679 movx @dptr,a 0705 90 C0 05 1680 mov dptr,#AUDIOCNTLOW 0708 E0 1681 movx a,@dptr 0709 90 7F 04 1682 mov dptr,#IN0BUF+4 070C F0 1683 movx @dptr,a 070D 90 C0 06 1684 mov dptr,#AUDIOCNTMID 0710 E0 1685 movx a,@dptr 0711 90 7F 05 1686 mov dptr,#IN0BUF+5 0714 F0 1687 movx @dptr,a 0715 90 C0 07 1688 mov dptr,#AUDIOCNTHIGH 0718 E0 1689 movx a,@dptr 0719 90 7F 06 1690 mov dptr,#IN0BUF+6 071C F0 1691 movx @dptr,a 071D 90 C0 08 1692 mov dptr,#AUDIOCTRL 0720 C2 07 1693 clr ctrl_cntsel 0722 E5 20 1694 mov a,ctrlreg 0724 F0 1695 movx @dptr,a 0725 90 7F 00 1696 mov dptr,#IN0BUF 0728 F0 1697 movx @dptr,a 0729 90 C0 05 1698 mov dptr,#AUDIOCNTLOW 072C E0 1699 movx a,@dptr 072D 90 7F 01 1700 mov dptr,#IN0BUF+1 0730 F0 1701 movx @dptr,a 0731 90 C0 06 1702 mov dptr,#AUDIOCNTMID 0734 E0 1703 movx a,@dptr 0735 90 7F 02 1704 mov dptr,#IN0BUF+2 0738 F0 1705 movx @dptr,a 0739 90 C0 07 1706 mov dptr,#AUDIOCNTHIGH 073C E0 1707 movx a,@dptr 073D 90 7F 03 1708 mov dptr,#IN0BUF+3 0740 F0 1709 movx @dptr,a 1710 ;; length 0741 90 7F EE 1711 mov dptr,#SETUPDAT+6 ; wLength 0744 E0 1712 movx a,@dptr 0745 24 F9 1713 add a,#-7 0747 50 01 1714 jnc 4$ 0749 E4 1715 clr a 074A 24 07 1716 4$: add a,#7 074C 90 7F B5 1717 mov dptr,#IN0BC 074F F0 1718 movx @dptr,a 0750 02 07 B7 1719 ljmp setupack 0753 1720 cmdnote0: 1721 ;; 0xe1 0753 B4 E1 3A 1722 cjne a,#0xe1,cmdnote1 0756 90 7F E8 1723 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0759 E0 1724 movx a,@dptr 075A B4 C0 30 1725 cjne a,#0xc0,setupstalle1 075D 90 7F 00 1726 mov dptr,#IN0BUF 0760 E5 45 1727 mov a,sofcount 0762 F0 1728 movx @dptr,a 0763 A3 1729 inc dptr 0764 E5 49 1730 mov a,framesize 0766 F0 1731 movx @dptr,a 0767 A3 1732 inc dptr 0768 E5 46 1733 mov a,divider 076A F0 1734 movx @dptr,a 076B A3 1735 inc dptr 076C E5 47 1736 mov a,divider+1 076E F0 1737 movx @dptr,a 076F A3 1738 inc dptr 0770 E5 48 1739 mov a,divrel 0772 F0 1740 movx @dptr,a 0773 A3 1741 inc dptr 0774 E5 4A 1742 mov a,pllcorrvar 0776 F0 1743 movx @dptr,a 0777 A3 1744 inc dptr 0778 E5 4B 1745 mov a,txfifocount 077A F0 1746 movx @dptr,a 1747 1748 ;mov dptr,#AUDIOTXFIFOCNT 1749 ;movx a,@dptr 1750 ;mov dptr,#IN0BUF+6 1751 ;movx @dptr,a 1752 1753 ;; length 077B 90 7F EE 1754 mov dptr,#SETUPDAT+6 ; wLength 077E E0 1755 movx a,@dptr 077F 24 F9 1756 add a,#-7 0781 50 01 1757 jnc 1$ 0783 E4 1758 clr a 0784 24 07 1759 1$: add a,#7 0786 90 7F B5 1760 mov dptr,#IN0BC 0789 F0 1761 movx @dptr,a 078A 02 07 B7 1762 ljmp setupack 078D 1763 setupstalle1: 078D 02 07 B3 1764 ljmp setupstall 0790 1765 cmdnote1: 1766 ;; 0xe2 0790 B4 E2 20 1767 cjne a,#0xe2,cmdnote2 0793 90 7F E8 1768 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0796 E0 1769 movx a,@dptr 0797 B4 C0 16 1770 cjne a,#0xc0,setupstalle2 079A 90 7F 00 1771 mov dptr,#IN0BUF 079D 78 80 1772 mov r0,#txsamples 079F AF 49 1773 mov r7,framesize 07A1 E6 1774 1$: mov a,@r0 07A2 F0 1775 movx @dptr,a 07A3 08 1776 inc r0 07A4 A3 1777 inc dptr 07A5 DF FA 1778 djnz r7,1$ 07A7 90 7F B5 1779 mov dptr,#IN0BC 07AA E5 49 1780 mov a,framesize 07AC F0 1781 movx @dptr,a 07AD 02 07 B7 1782 ljmp setupack 07B0 1783 setupstalle2: 07B0 02 07 B3 1784 ljmp setupstall 07B3 1785 cmdnote2: 1786 1787 ;; unknown commands fall through to setupstall 1788 07B3 1789 setupstall: 07B3 74 03 1790 mov a,#3 07B5 80 02 1791 sjmp endsetup 07B7 1792 setupack: 07B7 74 02 1793 mov a,#2 07B9 1794 endsetup: 07B9 90 7F B4 1795 mov dptr,#EP0CS 07BC F0 1796 movx @dptr,a 07BD 1797 endusbisr: 1798 ;; epilogue 07BD D0 07 1799 pop ar7 07BF D0 00 1800 pop ar0 07C1 D0 86 1801 pop dps 07C3 D0 D0 1802 pop psw 07C5 D0 85 1803 pop dph1 07C7 D0 84 1804 pop dpl1 07C9 D0 83 1805 pop dph0 07CB D0 82 1806 pop dpl0 07CD D0 F0 1807 pop b 07CF D0 E0 1808 pop acc 07D1 32 1809 reti 1810 07D2 1811 usb_sof_isr: 07D2 C0 E0 1812 push acc 07D4 C0 F0 1813 push b 07D6 C0 82 1814 push dpl0 07D8 C0 83 1815 push dph0 07DA C0 84 1816 push dpl1 07DC C0 85 1817 push dph1 07DE C0 D0 1818 push psw 07E0 75 D0 00 1819 mov psw,#0x00 07E3 C0 86 1820 push dps 07E5 75 86 00 1821 mov dps,#0 07E8 C0 02 1822 push ar2 07EA C0 03 1823 push ar3 07EC C0 00 1824 push ar0 1825 ;; clear interrupt 07EE E5 91 1826 mov a,exif 07F0 C2 E4 1827 clr acc.4 07F2 F5 91 1828 mov exif,a 07F4 90 7F AB 1829 mov dptr,#USBIRQ 07F7 74 02 1830 mov a,#0x02 07F9 F0 1831 movx @dptr,a 1832 ;; handle interrupt 07FA 05 45 1833 inc sofcount 1834 ;; debugging: we have two cases 1835 ;; if the ISO frame size is just 2 bytes, 1836 ;; we return the frame number, otherwise 1837 ;; the required numbers of samples 07FC E5 49 1838 mov a,framesize 07FE B4 02 14 1839 cjne a,#2,1$ 1840 ;; copy the frame number 0801 90 7F D8 1841 mov dptr,#USBFRAMEL 0804 E0 1842 movx a,@dptr 0805 A3 1843 inc dptr 0806 05 86 1844 inc dps 0808 90 7F 68 1845 mov dptr,#IN8DATA 080B F0 1846 movx @dptr,a 080C 15 86 1847 dec dps 080E E0 1848 movx a,@dptr 080F 05 86 1849 inc dps 0811 F0 1850 movx @dptr,a 0812 02 09 05 1851 ljmp sofendisr 0815 B4 03 36 1852 1$: cjne a,#3,sofsampleisr 0818 90 7F A0 1853 mov dptr,#ISOERR 081B E0 1854 movx a,@dptr 081C 20 E0 23 1855 jb acc.0,3$ 081F 90 7F 70 1856 mov dptr,#OUT8BCH 0822 E0 1857 movx a,@dptr 0823 70 1D 1858 jnz 3$ 0825 90 7F 71 1859 mov dptr,#OUT8BCL 0828 E0 1860 movx a,@dptr 0829 B4 03 16 1861 cjne a,#3,3$ 082C FA 1862 mov r2,a 082D 90 7F 60 1863 mov dptr,#OUT8DATA 0830 05 86 1864 inc dps 0832 90 7F 68 1865 mov dptr,#IN8DATA 0835 15 86 1866 dec dps 0837 E0 1867 2$: movx a,@dptr 0838 05 86 1868 inc dps 083A F0 1869 movx @dptr,a 083B 15 86 1870 dec dps 083D DA F8 1871 djnz r2,2$ 083F 02 09 05 1872 ljmp sofendisr 0842 7A 03 1873 3$: mov r2,#3 0844 90 7F 68 1874 mov dptr,#IN8DATA 0847 E4 1875 clr a 0848 F0 1876 4$: movx @dptr,a 0849 DA FD 1877 djnz r2,4$ 084B 02 09 05 1878 ljmp sofendisr 084E 1879 sofsampleisr: 084E 90 C0 01 1880 mov dptr,#AUDIORXFIFOCNT 0851 E0 1881 movx a,@dptr 0852 C3 1882 clr c 0853 95 49 1883 subb a,framesize 0855 E0 1884 movx a,@dptr 0856 40 02 1885 jc 1$ 0858 E5 49 1886 mov a,framesize 085A FA 1887 1$: mov r2,a 085B FB 1888 mov r3,a 085C 60 12 1889 jz 2$ 085E 90 C0 00 1890 mov dptr,#AUDIORXFIFO 0861 05 86 1891 inc dps 0863 90 7F 68 1892 mov dptr,#IN8DATA 0866 15 86 1893 dec dps 0868 E0 1894 3$: movx a,@dptr 0869 05 86 1895 inc dps 086B F0 1896 movx @dptr,a 086C 15 86 1897 dec dps 086E DA F8 1898 djnz r2,3$ 0870 E5 49 1899 2$: mov a,framesize 0872 C3 1900 clr c 0873 9B 1901 subb a,r3 0874 60 08 1902 jz 4$ 0876 FA 1903 mov r2,a 0877 90 7F 68 1904 mov dptr,#IN8DATA 087A E4 1905 clr a 087B F0 1906 5$: movx @dptr,a 087C DA FD 1907 djnz r2,5$ 1908 ;; sample rate adjustment 087E 90 C0 01 1909 4$: mov dptr,#AUDIORXFIFOCNT 0881 E0 1910 movx a,@dptr 0882 F5 4A 1911 mov pllcorrvar,a 0884 24 FC 1912 add a,#-4 0886 60 05 1913 jz 10$ ; no adjustment 0888 33 1914 rlc a 0889 95 E0 1915 subb a,acc 088B D2 E0 1916 setb acc.0 088D FB 1917 10$: mov r3,a ; r3 & acc contain the adjust value 088E 25 48 1918 add a,divrel 1919 ;; zero is the guard value 0890 60 02 1920 jz 11$ 0892 F5 48 1921 mov divrel,a 0894 E5 48 1922 11$: mov a,divrel 0896 03 1923 rr a 0897 03 1924 rr a 0898 03 1925 rr a 0899 03 1926 rr a 089A 54 0F 1927 anl a,#0xf 089C 2B 1928 add a,r3 ; momentary correction 089D 25 46 1929 add a,divider 089F FA 1930 mov r2,a 08A0 E5 47 1931 mov a,divider+1 08A2 34 00 1932 addc a,#0 08A4 90 C0 02 1933 mov dptr,#AUDIODIVIDERHI 08A7 F0 1934 movx @dptr,a 08A8 EA 1935 mov a,r2 08A9 90 C0 01 1936 mov dptr,#AUDIODIVIDERLO 08AC F0 1937 movx @dptr,a 1938 ;; OUT data 08AD 90 7F A0 1939 mov dptr,#ISOERR 08B0 E0 1940 movx a,@dptr 08B1 20 E0 39 1941 jb acc.0,20$ 08B4 90 7F 70 1942 mov dptr,#OUT8BCH 08B7 E0 1943 movx a,@dptr 08B8 70 33 1944 jnz 20$ 08BA 90 7F 71 1945 mov dptr,#OUT8BCL 08BD E0 1946 movx a,@dptr 08BE C3 1947 clr c 08BF 95 49 1948 subb a,framesize 08C1 70 2A 1949 jnz 20$ 08C3 90 C0 02 1950 mov dptr,#AUDIOTXFIFOCNT 08C6 E0 1951 movx a,@dptr 08C7 F5 4B 1952 mov txfifocount,a 08C9 C3 1953 clr c 08CA 95 49 1954 subb a,framesize 08CC E5 4B 1955 mov a,txfifocount 08CE 40 02 1956 jc 14$ 08D0 E5 49 1957 mov a,framesize 08D2 60 17 1958 14$: jz 13$ 08D4 FA 1959 mov r2,a 08D5 90 7F 60 1960 mov dptr,#OUT8DATA 08D8 05 86 1961 inc dps 08DA 90 C0 00 1962 mov dptr,#AUDIOTXFIFO 08DD 15 86 1963 dec dps 08DF 78 80 1964 mov r0,#txsamples 08E1 E0 1965 12$: movx a,@dptr 08E2 05 86 1966 inc dps 08E4 F0 1967 movx @dptr,a 08E5 15 86 1968 dec dps 08E7 F6 1969 mov @r0,a 08E8 08 1970 inc r0 08E9 DA F6 1971 djnz r2,12$ 08EB 80 18 1972 13$: sjmp sofendisr 1973 ;; initialize TX if invalid packet 08ED 90 C0 02 1974 20$: mov dptr,#AUDIOTXFIFOCNT 08F0 E0 1975 movx a,@dptr 08F1 F5 4B 1976 mov txfifocount,a 08F3 24 FC 1977 add a,#-4 08F5 54 3F 1978 anl a,#0x3f 08F7 60 0C 1979 jz sofendisr 08F9 FA 1980 mov r2,a 08FA 90 C0 00 1981 mov dptr,#AUDIOTXFIFO 08FD E4 1982 clr a 08FE 78 80 1983 mov r0,#txsamples 0900 F0 1984 21$: movx @dptr,a 0901 F6 1985 mov @r0,a 0902 08 1986 inc r0 0903 DA FB 1987 djnz r2,21$ 1988 0905 1989 sofendisr: 1990 ;; epilogue 0905 D0 00 1991 pop ar0 0907 D0 03 1992 pop ar3 0909 D0 02 1993 pop ar2 090B D0 86 1994 pop dps 090D D0 D0 1995 pop psw 090F D0 85 1996 pop dph1 0911 D0 84 1997 pop dpl1 0913 D0 83 1998 pop dph0 0915 D0 82 1999 pop dpl0 0917 D0 F0 2000 pop b 0919 D0 E0 2001 pop acc 091B 32 2002 reti 2003 2004 091C 2005 usb_sutok_isr: 091C C0 E0 2006 push acc 091E C0 F0 2007 push b 0920 C0 82 2008 push dpl0 0922 C0 83 2009 push dph0 0924 C0 D0 2010 push psw 0926 75 D0 00 2011 mov psw,#0x00 0929 C0 86 2012 push dps 092B 75 86 00 2013 mov dps,#0 2014 ;; clear interrupt 092E E5 91 2015 mov a,exif 0930 C2 E4 2016 clr acc.4 0932 F5 91 2017 mov exif,a 0934 90 7F AB 2018 mov dptr,#USBIRQ 0937 74 04 2019 mov a,#0x04 0939 F0 2020 movx @dptr,a 2021 ;; handle interrupt 2022 ;; epilogue 093A D0 86 2023 pop dps 093C D0 D0 2024 pop psw 093E D0 83 2025 pop dph0 0940 D0 82 2026 pop dpl0 0942 D0 F0 2027 pop b 0944 D0 E0 2028 pop acc 0946 32 2029 reti 2030 0947 2031 usb_suspend_isr: 0947 C0 E0 2032 push acc 0949 C0 F0 2033 push b 094B C0 82 2034 push dpl0 094D C0 83 2035 push dph0 094F C0 D0 2036 push psw 0951 75 D0 00 2037 mov psw,#0x00 0954 C0 86 2038 push dps 0956 75 86 00 2039 mov dps,#0 2040 ;; clear interrupt 0959 E5 91 2041 mov a,exif 095B C2 E4 2042 clr acc.4 095D F5 91 2043 mov exif,a 095F 90 7F AB 2044 mov dptr,#USBIRQ 0962 74 08 2045 mov a,#0x08 0964 F0 2046 movx @dptr,a 2047 ;; handle interrupt 2048 ;; epilogue 0965 D0 86 2049 pop dps 0967 D0 D0 2050 pop psw 0969 D0 83 2051 pop dph0 096B D0 82 2052 pop dpl0 096D D0 F0 2053 pop b 096F D0 E0 2054 pop acc 0971 32 2055 reti 2056 0972 2057 usb_usbreset_isr: 0972 C0 E0 2058 push acc 0974 C0 F0 2059 push b 0976 C0 82 2060 push dpl0 0978 C0 83 2061 push dph0 097A C0 D0 2062 push psw 097C 75 D0 00 2063 mov psw,#0x00 097F C0 86 2064 push dps 0981 75 86 00 2065 mov dps,#0 2066 ;; clear interrupt 0984 E5 91 2067 mov a,exif 0986 C2 E4 2068 clr acc.4 0988 F5 91 2069 mov exif,a 098A 90 7F AB 2070 mov dptr,#USBIRQ 098D 74 10 2071 mov a,#0x10 098F F0 2072 movx @dptr,a 2073 ;; handle interrupt 2074 ;; epilogue 0990 D0 86 2075 pop dps 0992 D0 D0 2076 pop psw 0994 D0 83 2077 pop dph0 0996 D0 82 2078 pop dpl0 0998 D0 F0 2079 pop b 099A D0 E0 2080 pop acc 099C 32 2081 reti 2082 099D 2083 usb_ep0in_isr: 099D C0 E0 2084 push acc 099F C0 F0 2085 push b 09A1 C0 82 2086 push dpl0 09A3 C0 83 2087 push dph0 09A5 C0 84 2088 push dpl1 09A7 C0 85 2089 push dph1 09A9 C0 D0 2090 push psw 09AB 75 D0 00 2091 mov psw,#0x00 09AE C0 86 2092 push dps 09B0 75 86 00 2093 mov dps,#0 09B3 C0 00 2094 push ar0 09B5 C0 07 2095 push ar7 2096 ;; clear interrupt 09B7 E5 91 2097 mov a,exif 09B9 C2 E4 2098 clr acc.4 09BB F5 91 2099 mov exif,a 09BD 90 7F A9 2100 mov dptr,#IN07IRQ 09C0 74 01 2101 mov a,#0x01 09C2 F0 2102 movx @dptr,a 2103 ;; handle interrupt 2104 ;; epilogue 09C3 D0 07 2105 pop ar7 09C5 D0 00 2106 pop ar0 09C7 D0 86 2107 pop dps 09C9 D0 D0 2108 pop psw 09CB D0 85 2109 pop dph1 09CD D0 84 2110 pop dpl1 09CF D0 83 2111 pop dph0 09D1 D0 82 2112 pop dpl0 09D3 D0 F0 2113 pop b 09D5 D0 E0 2114 pop acc 09D7 32 2115 reti 2116 09D8 2117 usb_ep0out_isr: 09D8 C0 E0 2118 push acc 09DA C0 F0 2119 push b 09DC C0 82 2120 push dpl0 09DE C0 83 2121 push dph0 09E0 C0 84 2122 push dpl1 09E2 C0 85 2123 push dph1 09E4 C0 D0 2124 push psw 09E6 75 D0 00 2125 mov psw,#0x00 09E9 C0 86 2126 push dps 09EB 75 86 00 2127 mov dps,#0 09EE C0 00 2128 push ar0 09F0 C0 06 2129 push ar6 2130 ;; clear interrupt 09F2 E5 91 2131 mov a,exif 09F4 C2 E4 2132 clr acc.4 09F6 F5 91 2133 mov exif,a 09F8 90 7F AA 2134 mov dptr,#OUT07IRQ 09FB 74 01 2135 mov a,#0x01 09FD F0 2136 movx @dptr,a 2137 ;; handle interrupt 2138 ;; epilogue 09FE D0 06 2139 pop ar6 0A00 D0 00 2140 pop ar0 0A02 D0 86 2141 pop dps 0A04 D0 D0 2142 pop psw 0A06 D0 85 2143 pop dph1 0A08 D0 84 2144 pop dpl1 0A0A D0 83 2145 pop dph0 0A0C D0 82 2146 pop dpl0 0A0E D0 F0 2147 pop b 0A10 D0 E0 2148 pop acc 0A12 32 2149 reti 2150 0A13 2151 fillusbintr:: 0A13 E5 4C 2152 mov a,pttforce 0A15 F5 F0 2153 mov b,a 0A17 A2 E0 2154 mov c,acc.0 0A19 92 F2 2155 mov b.2,c 0A1B 90 C0 09 2156 mov dptr,#AUDIOSTAT 0A1E E0 2157 movx a,@dptr 0A1F A2 E0 2158 mov c,acc.0 0A21 92 F3 2159 mov b.3,c 0A23 A2 09 2160 mov c,uartempty 0A25 92 F5 2161 mov b.5,c 2162 ;; bytewide elements 0A27 90 7E 80 2163 mov dptr,#(IN1BUF) 0A2A E5 F0 2164 mov a,b 0A2C F0 2165 movx @dptr,a 0A2D E5 45 2166 mov a,sofcount 0A2F 90 7E 81 2167 mov dptr,#(IN1BUF+1) 0A32 F0 2168 movx @dptr,a 0A33 90 7F E0 2169 mov dptr,#INISOVAL 0A36 E0 2170 movx a,@dptr 0A37 90 7E 82 2171 mov dptr,#(IN1BUF+2) 0A3A F0 2172 movx @dptr,a 0A3B 90 C0 04 2173 mov dptr,#AUDIORSSI 0A3E E0 2174 movx a,@dptr 0A3F 90 7E 83 2175 mov dptr,#(IN1BUF+3) 0A42 F0 2176 movx @dptr,a 2177 ; counter 0A43 05 44 2178 inc irqcount 0A45 E5 44 2179 mov a,irqcount 0A47 90 7E 84 2180 mov dptr,#(IN1BUF+4) 0A4A F0 2181 movx @dptr,a 2182 ; UART buffer 0A4B 75 F0 05 2183 mov b,#5 0A4E 90 7E 85 2184 mov dptr,#(IN1BUF+5) 0A51 E5 5E 2185 2$: mov a,uartrd 0A53 B5 5D 07 2186 cjne a,uartwr,3$ 2187 ; set length 0A56 90 7F B7 2188 mov dptr,#IN1BC 0A59 E5 F0 2189 mov a,b 0A5B F0 2190 movx @dptr,a 0A5C 22 2191 ret 2192 0A5D 24 4D 2193 3$: add a,#uartbuf 0A5F F8 2194 mov r0,a 0A60 E6 2195 mov a,@r0 0A61 F0 2196 movx @dptr,a 0A62 A3 2197 inc dptr 0A63 05 F0 2198 inc b 0A65 E5 5E 2199 mov a,uartrd 0A67 04 2200 inc a 0A68 54 0F 2201 anl a,#0xf 0A6A F5 5E 2202 mov uartrd,a 0A6C 80 E3 2203 sjmp 2$ 2204 2205 0A6E 2206 usb_ep1in_isr: 0A6E C0 E0 2207 push acc 0A70 C0 F0 2208 push b 0A72 C0 82 2209 push dpl0 0A74 C0 83 2210 push dph0 0A76 C0 D0 2211 push psw 0A78 75 D0 00 2212 mov psw,#0x00 0A7B C0 86 2213 push dps 0A7D 75 86 00 2214 mov dps,#0 2215 ;; clear interrupt 0A80 E5 91 2216 mov a,exif 0A82 C2 E4 2217 clr acc.4 0A84 F5 91 2218 mov exif,a 0A86 90 7F A9 2219 mov dptr,#IN07IRQ 0A89 74 02 2220 mov a,#0x02 0A8B F0 2221 movx @dptr,a 2222 ;; handle interrupt 0A8C 12 0A 13 2223 lcall fillusbintr 2224 ;; epilogue 0A8F D0 86 2225 pop dps 0A91 D0 D0 2226 pop psw 0A93 D0 83 2227 pop dph0 0A95 D0 82 2228 pop dpl0 0A97 D0 F0 2229 pop b 0A99 D0 E0 2230 pop acc 0A9B 32 2231 reti 2232 0A9C 2233 usb_ep1out_isr: 0A9C C0 E0 2234 push acc 0A9E C0 F0 2235 push b 0AA0 C0 82 2236 push dpl0 0AA2 C0 83 2237 push dph0 0AA4 C0 D0 2238 push psw 0AA6 75 D0 00 2239 mov psw,#0x00 0AA9 C0 86 2240 push dps 0AAB 75 86 00 2241 mov dps,#0 2242 ;; clear interrupt 0AAE E5 91 2243 mov a,exif 0AB0 C2 E4 2244 clr acc.4 0AB2 F5 91 2245 mov exif,a 0AB4 90 7F AA 2246 mov dptr,#OUT07IRQ 0AB7 74 02 2247 mov a,#0x02 0AB9 F0 2248 movx @dptr,a 2249 ;; handle interrupt 2250 ;; epilogue 0ABA D0 86 2251 pop dps 0ABC D0 D0 2252 pop psw 0ABE D0 83 2253 pop dph0 0AC0 D0 82 2254 pop dpl0 0AC2 D0 F0 2255 pop b 0AC4 D0 E0 2256 pop acc 0AC6 32 2257 reti 2258 0AC7 2259 usb_ep2in_isr: 0AC7 C0 E0 2260 push acc 0AC9 C0 F0 2261 push b 0ACB C0 82 2262 push dpl0 0ACD C0 83 2263 push dph0 0ACF C0 D0 2264 push psw 0AD1 75 D0 00 2265 mov psw,#0x00 0AD4 C0 86 2266 push dps 0AD6 75 86 00 2267 mov dps,#0 2268 ;; clear interrupt 0AD9 E5 91 2269 mov a,exif 0ADB C2 E4 2270 clr acc.4 0ADD F5 91 2271 mov exif,a 0ADF 90 7F A9 2272 mov dptr,#IN07IRQ 0AE2 74 04 2273 mov a,#0x04 0AE4 F0 2274 movx @dptr,a 2275 ;; handle interrupt 2276 ;; epilogue 0AE5 D0 86 2277 pop dps 0AE7 D0 D0 2278 pop psw 0AE9 D0 83 2279 pop dph0 0AEB D0 82 2280 pop dpl0 0AED D0 F0 2281 pop b 0AEF D0 E0 2282 pop acc 0AF1 32 2283 reti 2284 0AF2 2285 usb_ep2out_isr: 0AF2 C0 E0 2286 push acc 0AF4 C0 F0 2287 push b 0AF6 C0 82 2288 push dpl0 0AF8 C0 83 2289 push dph0 0AFA C0 D0 2290 push psw 0AFC 75 D0 00 2291 mov psw,#0x00 0AFF C0 86 2292 push dps 0B01 75 86 00 2293 mov dps,#0 2294 ;; clear interrupt 0B04 E5 91 2295 mov a,exif 0B06 C2 E4 2296 clr acc.4 0B08 F5 91 2297 mov exif,a 0B0A 90 7F AA 2298 mov dptr,#OUT07IRQ 0B0D 74 04 2299 mov a,#0x04 0B0F F0 2300 movx @dptr,a 2301 ;; handle interrupt 2302 ;; epilogue 0B10 D0 86 2303 pop dps 0B12 D0 D0 2304 pop psw 0B14 D0 83 2305 pop dph0 0B16 D0 82 2306 pop dpl0 0B18 D0 F0 2307 pop b 0B1A D0 E0 2308 pop acc 0B1C 32 2309 reti 2310 0B1D 2311 usb_ep3in_isr: 0B1D C0 E0 2312 push acc 0B1F C0 F0 2313 push b 0B21 C0 82 2314 push dpl0 0B23 C0 83 2315 push dph0 0B25 C0 D0 2316 push psw 0B27 75 D0 00 2317 mov psw,#0x00 0B2A C0 86 2318 push dps 0B2C 75 86 00 2319 mov dps,#0 2320 ;; clear interrupt 0B2F E5 91 2321 mov a,exif 0B31 C2 E4 2322 clr acc.4 0B33 F5 91 2323 mov exif,a 0B35 90 7F A9 2324 mov dptr,#IN07IRQ 0B38 74 08 2325 mov a,#0x08 0B3A F0 2326 movx @dptr,a 2327 ;; handle interrupt 2328 ;; epilogue 0B3B D0 86 2329 pop dps 0B3D D0 D0 2330 pop psw 0B3F D0 83 2331 pop dph0 0B41 D0 82 2332 pop dpl0 0B43 D0 F0 2333 pop b 0B45 D0 E0 2334 pop acc 0B47 32 2335 reti 2336 0B48 2337 usb_ep3out_isr: 0B48 C0 E0 2338 push acc 0B4A C0 F0 2339 push b 0B4C C0 82 2340 push dpl0 0B4E C0 83 2341 push dph0 0B50 C0 D0 2342 push psw 0B52 75 D0 00 2343 mov psw,#0x00 0B55 C0 86 2344 push dps 0B57 75 86 00 2345 mov dps,#0 2346 ;; clear interrupt 0B5A E5 91 2347 mov a,exif 0B5C C2 E4 2348 clr acc.4 0B5E F5 91 2349 mov exif,a 0B60 90 7F AA 2350 mov dptr,#OUT07IRQ 0B63 74 08 2351 mov a,#0x08 0B65 F0 2352 movx @dptr,a 2353 ;; handle interrupt 2354 ;; epilogue 0B66 D0 86 2355 pop dps 0B68 D0 D0 2356 pop psw 0B6A D0 83 2357 pop dph0 0B6C D0 82 2358 pop dpl0 0B6E D0 F0 2359 pop b 0B70 D0 E0 2360 pop acc 0B72 32 2361 reti 2362 0B73 2363 usb_ep4in_isr: 0B73 C0 E0 2364 push acc 0B75 C0 F0 2365 push b 0B77 C0 82 2366 push dpl0 0B79 C0 83 2367 push dph0 0B7B C0 D0 2368 push psw 0B7D 75 D0 00 2369 mov psw,#0x00 0B80 C0 86 2370 push dps 0B82 75 86 00 2371 mov dps,#0 2372 ;; clear interrupt 0B85 E5 91 2373 mov a,exif 0B87 C2 E4 2374 clr acc.4 0B89 F5 91 2375 mov exif,a 0B8B 90 7F A9 2376 mov dptr,#IN07IRQ 0B8E 74 10 2377 mov a,#0x10 0B90 F0 2378 movx @dptr,a 2379 ;; handle interrupt 2380 ;; epilogue 0B91 D0 86 2381 pop dps 0B93 D0 D0 2382 pop psw 0B95 D0 83 2383 pop dph0 0B97 D0 82 2384 pop dpl0 0B99 D0 F0 2385 pop b 0B9B D0 E0 2386 pop acc 0B9D 32 2387 reti 2388 0B9E 2389 usb_ep4out_isr: 0B9E C0 E0 2390 push acc 0BA0 C0 F0 2391 push b 0BA2 C0 82 2392 push dpl0 0BA4 C0 83 2393 push dph0 0BA6 C0 D0 2394 push psw 0BA8 75 D0 00 2395 mov psw,#0x00 0BAB C0 86 2396 push dps 0BAD 75 86 00 2397 mov dps,#0 2398 ;; clear interrupt 0BB0 E5 91 2399 mov a,exif 0BB2 C2 E4 2400 clr acc.4 0BB4 F5 91 2401 mov exif,a 0BB6 90 7F AA 2402 mov dptr,#OUT07IRQ 0BB9 74 10 2403 mov a,#0x10 0BBB F0 2404 movx @dptr,a 2405 ;; handle interrupt 2406 ;; epilogue 0BBC D0 86 2407 pop dps 0BBE D0 D0 2408 pop psw 0BC0 D0 83 2409 pop dph0 0BC2 D0 82 2410 pop dpl0 0BC4 D0 F0 2411 pop b 0BC6 D0 E0 2412 pop acc 0BC8 32 2413 reti 2414 0BC9 2415 usb_ep5in_isr: 0BC9 C0 E0 2416 push acc 0BCB C0 F0 2417 push b 0BCD C0 82 2418 push dpl0 0BCF C0 83 2419 push dph0 0BD1 C0 D0 2420 push psw 0BD3 75 D0 00 2421 mov psw,#0x00 0BD6 C0 86 2422 push dps 0BD8 75 86 00 2423 mov dps,#0 2424 ;; clear interrupt 0BDB E5 91 2425 mov a,exif 0BDD C2 E4 2426 clr acc.4 0BDF F5 91 2427 mov exif,a 0BE1 90 7F A9 2428 mov dptr,#IN07IRQ 0BE4 74 20 2429 mov a,#0x20 0BE6 F0 2430 movx @dptr,a 2431 ;; handle interrupt 2432 ;; epilogue 0BE7 D0 86 2433 pop dps 0BE9 D0 D0 2434 pop psw 0BEB D0 83 2435 pop dph0 0BED D0 82 2436 pop dpl0 0BEF D0 F0 2437 pop b 0BF1 D0 E0 2438 pop acc 0BF3 32 2439 reti 2440 0BF4 2441 usb_ep5out_isr: 0BF4 C0 E0 2442 push acc 0BF6 C0 F0 2443 push b 0BF8 C0 82 2444 push dpl0 0BFA C0 83 2445 push dph0 0BFC C0 D0 2446 push psw 0BFE 75 D0 00 2447 mov psw,#0x00 0C01 C0 86 2448 push dps 0C03 75 86 00 2449 mov dps,#0 2450 ;; clear interrupt 0C06 E5 91 2451 mov a,exif 0C08 C2 E4 2452 clr acc.4 0C0A F5 91 2453 mov exif,a 0C0C 90 7F AA 2454 mov dptr,#OUT07IRQ 0C0F 74 20 2455 mov a,#0x20 0C11 F0 2456 movx @dptr,a 2457 ;; handle interrupt 2458 ;; epilogue 0C12 D0 86 2459 pop dps 0C14 D0 D0 2460 pop psw 0C16 D0 83 2461 pop dph0 0C18 D0 82 2462 pop dpl0 0C1A D0 F0 2463 pop b 0C1C D0 E0 2464 pop acc 0C1E 32 2465 reti 2466 0C1F 2467 usb_ep6in_isr: 0C1F C0 E0 2468 push acc 0C21 C0 F0 2469 push b 0C23 C0 82 2470 push dpl0 0C25 C0 83 2471 push dph0 0C27 C0 D0 2472 push psw 0C29 75 D0 00 2473 mov psw,#0x00 0C2C C0 86 2474 push dps 0C2E 75 86 00 2475 mov dps,#0 2476 ;; clear interrupt 0C31 E5 91 2477 mov a,exif 0C33 C2 E4 2478 clr acc.4 0C35 F5 91 2479 mov exif,a 0C37 90 7F A9 2480 mov dptr,#IN07IRQ 0C3A 74 40 2481 mov a,#0x40 0C3C F0 2482 movx @dptr,a 2483 ;; handle interrupt 2484 ;; epilogue 0C3D D0 86 2485 pop dps 0C3F D0 D0 2486 pop psw 0C41 D0 83 2487 pop dph0 0C43 D0 82 2488 pop dpl0 0C45 D0 F0 2489 pop b 0C47 D0 E0 2490 pop acc 0C49 32 2491 reti 2492 0C4A 2493 usb_ep6out_isr: 0C4A C0 E0 2494 push acc 0C4C C0 F0 2495 push b 0C4E C0 82 2496 push dpl0 0C50 C0 83 2497 push dph0 0C52 C0 D0 2498 push psw 0C54 75 D0 00 2499 mov psw,#0x00 0C57 C0 86 2500 push dps 0C59 75 86 00 2501 mov dps,#0 2502 ;; clear interrupt 0C5C E5 91 2503 mov a,exif 0C5E C2 E4 2504 clr acc.4 0C60 F5 91 2505 mov exif,a 0C62 90 7F AA 2506 mov dptr,#OUT07IRQ 0C65 74 40 2507 mov a,#0x40 0C67 F0 2508 movx @dptr,a 2509 ;; handle interrupt 2510 ;; epilogue 0C68 D0 86 2511 pop dps 0C6A D0 D0 2512 pop psw 0C6C D0 83 2513 pop dph0 0C6E D0 82 2514 pop dpl0 0C70 D0 F0 2515 pop b 0C72 D0 E0 2516 pop acc 0C74 32 2517 reti 2518 0C75 2519 usb_ep7in_isr: 0C75 C0 E0 2520 push acc 0C77 C0 F0 2521 push b 0C79 C0 82 2522 push dpl0 0C7B C0 83 2523 push dph0 0C7D C0 D0 2524 push psw 0C7F 75 D0 00 2525 mov psw,#0x00 0C82 C0 86 2526 push dps 0C84 75 86 00 2527 mov dps,#0 2528 ;; clear interrupt 0C87 E5 91 2529 mov a,exif 0C89 C2 E4 2530 clr acc.4 0C8B F5 91 2531 mov exif,a 0C8D 90 7F A9 2532 mov dptr,#IN07IRQ 0C90 74 80 2533 mov a,#0x80 0C92 F0 2534 movx @dptr,a 2535 ;; handle interrupt 2536 ;; epilogue 0C93 D0 86 2537 pop dps 0C95 D0 D0 2538 pop psw 0C97 D0 83 2539 pop dph0 0C99 D0 82 2540 pop dpl0 0C9B D0 F0 2541 pop b 0C9D D0 E0 2542 pop acc 0C9F 32 2543 reti 2544 0CA0 2545 usb_ep7out_isr: 0CA0 C0 E0 2546 push acc 0CA2 C0 F0 2547 push b 0CA4 C0 82 2548 push dpl0 0CA6 C0 83 2549 push dph0 0CA8 C0 D0 2550 push psw 0CAA 75 D0 00 2551 mov psw,#0x00 0CAD C0 86 2552 push dps 0CAF 75 86 00 2553 mov dps,#0 2554 ;; clear interrupt 0CB2 E5 91 2555 mov a,exif 0CB4 C2 E4 2556 clr acc.4 0CB6 F5 91 2557 mov exif,a 0CB8 90 7F AA 2558 mov dptr,#OUT07IRQ 0CBB 74 80 2559 mov a,#0x80 0CBD F0 2560 movx @dptr,a 2561 ;; handle interrupt 2562 ;; epilogue 0CBE D0 86 2563 pop dps 0CC0 D0 D0 2564 pop psw 0CC2 D0 83 2565 pop dph0 0CC4 D0 82 2566 pop dpl0 0CC6 D0 F0 2567 pop b 0CC8 D0 E0 2568 pop acc 0CCA 32 2569 reti 2570 2571 ;; ----------------------------------------------------- 2572 ;; USB descriptors 2573 ;; ----------------------------------------------------- 2574 2575 ;; Device and/or Interface Class codes 0000 2576 USB_CLASS_PER_INTERFACE = 0 0001 2577 USB_CLASS_AUDIO = 1 0002 2578 USB_CLASS_COMM = 2 0003 2579 USB_CLASS_HID = 3 0007 2580 USB_CLASS_PRINTER = 7 0008 2581 USB_CLASS_MASS_STORAGE = 8 0009 2582 USB_CLASS_HUB = 9 00FF 2583 USB_CLASS_VENDOR_SPEC = 0xff 2584 0001 2585 USB_SUBCLASS_AUDIOCONTROL = 1 0002 2586 USB_SUBCLASS_AUDIOSTREAMING = 2 2587 2588 ;; Descriptor types 0001 2589 USB_DT_DEVICE = 0x01 0002 2590 USB_DT_CONFIG = 0x02 0003 2591 USB_DT_STRING = 0x03 0004 2592 USB_DT_INTERFACE = 0x04 0005 2593 USB_DT_ENDPOINT = 0x05 2594 2595 ;; Audio Class descriptor types 0020 2596 USB_DT_AUDIO_UNDEFINED = 0x20 0021 2597 USB_DT_AUDIO_DEVICE = 0x21 0022 2598 USB_DT_AUDIO_CONFIG = 0x22 0023 2599 USB_DT_AUDIO_STRING = 0x23 0024 2600 USB_DT_AUDIO_INTERFACE = 0x24 0025 2601 USB_DT_AUDIO_ENDPOINT = 0x25 2602 0000 2603 USB_SDT_AUDIO_UNDEFINED = 0x00 0001 2604 USB_SDT_AUDIO_HEADER = 0x01 0002 2605 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 0003 2606 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 0004 2607 USB_SDT_AUDIO_MIXER_UNIT = 0x04 0005 2608 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 0006 2609 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 0007 2610 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 0008 2611 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 2612 2613 ;; Standard requests 0000 2614 USB_REQ_GET_STATUS = 0x00 0001 2615 USB_REQ_CLEAR_FEATURE = 0x01 0003 2616 USB_REQ_SET_FEATURE = 0x03 0005 2617 USB_REQ_SET_ADDRESS = 0x05 0006 2618 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2619 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2620 USB_REQ_GET_CONFIGURATION = 0x08 0009 2621 USB_REQ_SET_CONFIGURATION = 0x09 000A 2622 USB_REQ_GET_INTERFACE = 0x0A 000B 2623 USB_REQ_SET_INTERFACE = 0x0B 000C 2624 USB_REQ_SYNCH_FRAME = 0x0C 2625 2626 ;; Audio Class Requests 0001 2627 USB_REQ_AUDIO_SET_CUR = 0x01 0081 2628 USB_REQ_AUDIO_GET_CUR = 0x81 0002 2629 USB_REQ_AUDIO_SET_MIN = 0x02 0082 2630 USB_REQ_AUDIO_GET_MIN = 0x82 0003 2631 USB_REQ_AUDIO_SET_MAX = 0x03 0083 2632 USB_REQ_AUDIO_GET_MAX = 0x83 0004 2633 USB_REQ_AUDIO_SET_RES = 0x04 0084 2634 USB_REQ_AUDIO_GET_RES = 0x84 0005 2635 USB_REQ_AUDIO_SET_MEM = 0x05 0085 2636 USB_REQ_AUDIO_GET_MEM = 0x85 00FF 2637 USB_REQ_AUDIO_GET_STAT = 0xff 2638 2639 ;; USB Request Type and Endpoint Directions 0000 2640 USB_DIR_OUT = 0 0080 2641 USB_DIR_IN = 0x80 2642 0000 2643 USB_TYPE_STANDARD = (0x00 << 5) 0020 2644 USB_TYPE_CLASS = (0x01 << 5) 0040 2645 USB_TYPE_VENDOR = (0x02 << 5) 0060 2646 USB_TYPE_RESERVED = (0x03 << 5) 2647 0000 2648 USB_RECIP_DEVICE = 0x00 0001 2649 USB_RECIP_INTERFACE = 0x01 0002 2650 USB_RECIP_ENDPOINT = 0x02 0003 2651 USB_RECIP_OTHER = 0x03 2652 2653 ;; Request target types. 0000 2654 USB_RT_DEVICE = 0x00 0001 2655 USB_RT_INTERFACE = 0x01 0002 2656 USB_RT_ENDPOINT = 0x02 2657 BAC0 2658 VENDID = 0xbac0 6137 2659 PRODID = 0x6137 2660 0CCB 2661 devicedescr: 0CCB 12 2662 .db 18 ; bLength 0CCC 01 2663 .db USB_DT_DEVICE ; bDescriptorType 0CCD 00 01 2664 .db 0x00, 0x01 ; bcdUSB 0CCF 00 2665 .db USB_CLASS_PER_INTERFACE ; bDeviceClass 0CD0 00 2666 .db 0 ; bDeviceSubClass 0CD1 00 2667 .db 0x00 ; bDeviceProtocol 0CD2 40 2668 .db 0x40 ; bMaxPacketSize0 0CD3 C0 BA 2669 .db VENDID ; idVendor 0CD5 37 61 2670 .db PRODID ; idProduct 0CD7 01 00 2671 .db 0x01,0x00 ; bcdDevice 0CD9 01 2672 .db 1 ; iManufacturer 0CDA 02 2673 .db 2 ; iProduct 0CDB 03 2674 .db 3 ; iSerialNumber 0CDC 01 2675 .db 1 ; bNumConfigurations 2676 0CDD 2677 config0descr: 0CDD 09 2678 .db 9 ; bLength 0CDE 02 2679 .db USB_DT_CONFIG ; bDescriptorType 0CDF CE 00 2680 .db config0sz ; wTotalLength 0CE1 04 2681 .db 4 ; bNumInterfaces 0CE2 01 2682 .db 1 ; bConfigurationValue 0CE3 00 2683 .db 0 ; iConfiguration 0CE4 40 2684 .db 0b01000000 ; bmAttributs (self powered) 0CE5 00 2685 .db 0 ; MaxPower (mA/2) (self powered so 0) 2686 ;; standard packet interface (needed so the driver can hook to it) 2687 ;; interface descriptor I0:A0 0CE6 09 2688 .db 9 ; bLength 0CE7 04 2689 .db USB_DT_INTERFACE ; bDescriptorType 0CE8 00 2690 .db 0 ; bInterfaceNumber 0CE9 00 2691 .db 0 ; bAlternateSetting 0CEA 01 2692 .db 1 ; bNumEndpoints 0CEB FF 2693 .db 0xff ; bInterfaceClass (vendor specific) 0CEC 00 2694 .db 0x00 ; bInterfaceSubClass 0CED FF 2695 .db 0xff ; bInterfaceProtocol (vendor specific) 0CEE 00 2696 .db 0 ; iInterface 2697 ;; endpoint descriptor I0:A0:E0 0CEF 07 2698 .db 7 ; bLength 0CF0 05 2699 .db USB_DT_ENDPOINT ; bDescriptorType 0CF1 81 2700 .db (USB_DIR_IN | 1) ; bEndpointAddress 0CF2 02 2701 .db 0x02 ; bmAttributes (bulk) 0CF3 40 00 2702 .db 0x40,0x00 ; wMaxPacketSize 0CF5 00 2703 .db 0 ; bInterval 2704 ;; interface descriptor I0:A1 0CF6 09 2705 .db 9 ; bLength 0CF7 04 2706 .db USB_DT_INTERFACE ; bDescriptorType 0CF8 00 2707 .db 0 ; bInterfaceNumber 0CF9 01 2708 .db 1 ; bAlternateSetting 0CFA 01 2709 .db 1 ; bNumEndpoints 0CFB FF 2710 .db 0xff ; bInterfaceClass (vendor specific) 0CFC 00 2711 .db 0x00 ; bInterfaceSubClass 0CFD FF 2712 .db 0xff ; bInterfaceProtocol (vendor specific) 0CFE 00 2713 .db 0 ; iInterface 2714 ;; endpoint descriptor I0:A1:E0 0CFF 07 2715 .db 7 ; bLength 0D00 05 2716 .db USB_DT_ENDPOINT ; bDescriptorType 0D01 81 2717 .db (USB_DIR_IN | 1) ; bEndpointAddress 0D02 03 2718 .db 0x03 ; bmAttributes (interrupt) 0D03 40 00 2719 .db 0x40,0x00 ; wMaxPacketSize 0D05 08 2720 .db 8 ; bInterval 2721 ;; interface descriptor I1:A0 0D06 09 2722 .db 9 ; bLength 0D07 04 2723 .db USB_DT_INTERFACE ; bDescriptorType 0D08 01 2724 .db 1 ; bInterfaceNumber 0D09 00 2725 .db 0 ; bAlternateSetting 0D0A 00 2726 .db 0 ; bNumEndpoints (only control endpoint) 0D0B 01 2727 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0D0C 01 2728 .db USB_SUBCLASS_AUDIOCONTROL ; bInterfaceSubClass 0D0D 00 2729 .db 0x00 ; bInterfaceProtocol (none) 0D0E 00 2730 .db 0 ; iInterface 0D0F 2731 acctrl: 2732 ;; class specific audio interface descriptor I1:A0 0D0F 0A 2733 .db 10 ; bLength 0D10 24 2734 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D11 01 2735 .db USB_SDT_AUDIO_HEADER ; bDescriptorSubtype 0D12 00 01 2736 .db 0x00,0x01 ; bcdADC (Audio Class Spec Revision 1.0) 0D14 34 00 2737 .db acctrlsz ; wTotalLength (Audio Class specific desctiptors) 0D16 02 2738 .db 2 ; bInCollection (number of streaming interfaces) 0D17 02 2739 .db 2 ; baInterfaceNr0 (number of AudioStreaming interface) 0D18 03 2740 .db 3 ; baInterfaceNr1 (number of AudioStreaming interface) 2741 ;; audio input terminal descriptor 0D19 0C 2742 .db 12 ; bLength 0D1A 24 2743 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D1B 02 2744 .db USB_SDT_AUDIO_INPUT_TERMINAL ; bDescriptorSubtype 0D1C 01 2745 .db 1 ; bTerminalID 0D1D 10 07 2746 .db 0x10,0x07 ; wTerminalType (Radio Receiver) 0D1F 00 2747 .db 0 ; bAssocTerminal (none) 0D20 01 2748 .db 1 ; bNrChannels (one channel) 0D21 00 00 2749 .db 0,0 ; wChannelConfig (mono has no position bits) 0D23 00 2750 .db 0 ; iChannelNames 0D24 00 2751 .db 0 ; iTerminal 2752 ;; audio output terminal descriptor 0D25 09 2753 .db 9 ; bLength 0D26 24 2754 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D27 03 2755 .db USB_SDT_AUDIO_OUTPUT_TERMINAL ; bDescriptorSubtype 0D28 02 2756 .db 2 ; bTerminalID 0D29 11 07 2757 .db 0x11,0x07 ; wTerminalType (Radio Transmitter) 0D2B 00 2758 .db 0 ; bAssocTerminal (none) 0D2C 03 2759 .db 3 ; bSourceID 0D2D 00 2760 .db 0 ; iTerminal 2761 ;; USB input terminal descriptor 0D2E 0C 2762 .db 12 ; bLength 0D2F 24 2763 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D30 02 2764 .db USB_SDT_AUDIO_INPUT_TERMINAL ; bDescriptorSubtype 0D31 03 2765 .db 3 ; bTerminalID 0D32 01 01 2766 .db 0x01,0x01 ; wTerminalType (USB streaming) 0D34 00 2767 .db 0 ; bAssocTerminal (none) 0D35 01 2768 .db 1 ; bNrChannels (one channel) 0D36 00 00 2769 .db 0,0 ; wChannelConfig (mono has no position bits) 0D38 00 2770 .db 0 ; iChannelNames 0D39 00 2771 .db 0 ; iTerminal 2772 ;; USB output terminal descriptor 0D3A 09 2773 .db 9 ; bLength 0D3B 24 2774 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D3C 03 2775 .db USB_SDT_AUDIO_OUTPUT_TERMINAL ; bDescriptorSubtype 0D3D 04 2776 .db 4 ; bTerminalID 0D3E 01 01 2777 .db 0x01,0x01 ; wTerminalType (USB streaming) 0D40 00 2778 .db 0 ; bAssocTerminal (none) 0D41 01 2779 .db 1 ; bSourceID 0D42 00 2780 .db 0 ; iTerminal 0034 2781 acctrlsz = . - acctrl 2782 ;; interface descriptor I2:A0 0D43 09 2783 .db 9 ; bLength 0D44 04 2784 .db USB_DT_INTERFACE ; bDescriptorType 0D45 02 2785 .db 2 ; bInterfaceNumber 0D46 00 2786 .db 0 ; bAlternateSetting 0D47 00 2787 .db 0 ; bNumEndpoints (use control endpoint only) 0D48 01 2788 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0D49 02 2789 .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass 0D4A 00 2790 .db 0x00 ; bInterfaceProtocol (none) 0D4B 00 2791 .db 0 ; iInterface 2792 ;; interface descriptor I2:A1 0D4C 09 2793 .db 9 ; bLength 0D4D 04 2794 .db USB_DT_INTERFACE ; bDescriptorType 0D4E 02 2795 .db 2 ; bInterfaceNumber 0D4F 01 2796 .db 1 ; bAlternateSetting 0D50 01 2797 .db 1 ; bNumEndpoints 0D51 01 2798 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0D52 02 2799 .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass 0D53 00 2800 .db 0x00 ; bInterfaceProtocol (none) 0D54 00 2801 .db 0 ; iInterface 2802 ;.db 1,0 ; wNumClasses 2803 ;; audio class specific general interface descriptor I2:A1 0D55 07 2804 .db 7 ; bLength 0D56 24 2805 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D57 01 2806 .db 0x01 ; bDescriptorSubtype (general) 0D58 04 2807 .db 4 ; bTerminalLink 0D59 01 2808 .db 1 ; bDelay (in frames) 0D5A 01 00 2809 .db 1,0 ; wFormatTag (PCM) 2810 ;; audio class specific format type I interface descriptor I2:A1 0D5C 0B 2811 .db 11 ; bLength 0D5D 24 2812 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D5E 02 2813 .db 0x02 ; bDescriptorSubtype (format type) 0D5F 01 2814 .db 0x01 ; bFormatType (1) 0D60 01 2815 .db 1 ; bNrChannels 0D61 01 2816 .db 1 ; bSubFrameSize 0D62 08 2817 .db 8 ; bBitResolution 0D63 01 2818 .db 1 ; bSamFreqType (one sampling frequency supported) 0D64 2819 descinsrate: 0D64 00 00 00 2820 .db 0,0,0 ; tSamFreq 2821 ;; endpoint descriptor I2:A1:E0 0D67 09 2822 .db 9 ; bLength 0D68 05 2823 .db USB_DT_ENDPOINT ; bDescriptorType 0D69 88 2824 .db (USB_DIR_IN | 8) ; bEndpointAddress 0D6A 01 2825 .db 0x01 ; bmAttributes (iso) 0D6B 2826 descinframesize: 0D6B 02 00 2827 .db 0x02,0x00 ; wMaxPacketSize 0D6D 01 2828 .db 1 ; bInterval 0D6E 00 2829 .db 0 ; bRefresh 0D6F 00 2830 .db 0 ; bSynchAddress 2831 ;; audio class specific endpoint descriptor I2:A1:E0 0D70 07 2832 .db 7 ; bLength 0D71 25 2833 .db USB_DT_AUDIO_ENDPOINT ; bDescriptorType 0D72 01 2834 .db 1 ; bDescriptorSubtype (general) 0D73 00 2835 .db 0 ; bmAttributes (no sampling rate control etc.) 0D74 00 2836 .db 0 ; bLockDelayUnits 0D75 00 00 2837 .db 0,0 ; wLockDelay 2838 ;; interface descriptor I3:A0 0D77 09 2839 .db 9 ; bLength 0D78 04 2840 .db USB_DT_INTERFACE ; bDescriptorType 0D79 03 2841 .db 3 ; bInterfaceNumber 0D7A 00 2842 .db 0 ; bAlternateSetting 0D7B 00 2843 .db 0 ; bNumEndpoints (use control endpoint only) 0D7C 01 2844 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0D7D 02 2845 .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass 0D7E 00 2846 .db 0x00 ; bInterfaceProtocol (none) 0D7F 00 2847 .db 0 ; iInterface 2848 ;; interface descriptor I3:A1 0D80 09 2849 .db 9 ; bLength 0D81 04 2850 .db USB_DT_INTERFACE ; bDescriptorType 0D82 03 2851 .db 3 ; bInterfaceNumber 0D83 01 2852 .db 1 ; bAlternateSetting 0D84 01 2853 .db 1 ; bNumEndpoints 0D85 01 2854 .db USB_CLASS_AUDIO ; bInterfaceClass (audio) 0D86 02 2855 .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass 0D87 00 2856 .db 0x00 ; bInterfaceProtocol (none) 0D88 00 2857 .db 0 ; iInterface 2858 ;.db 1,0 ; wNumClasses 2859 ;; audio class specific general interface descriptor I3:A1 0D89 07 2860 .db 7 ; bLength 0D8A 24 2861 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D8B 01 2862 .db 0x01 ; bDescriptorSubtype (general) 0D8C 03 2863 .db 3 ; bTerminalLink 0D8D 01 2864 .db 1 ; bDelay (in frames) 0D8E 01 00 2865 .db 1,0 ; wFormatTag (PCM) 2866 ;; audio class specific format type I interface descriptor I3:A1 0D90 0B 2867 .db 11 ; bLength 0D91 24 2868 .db USB_DT_AUDIO_INTERFACE ; bDescriptorType 0D92 02 2869 .db 0x02 ; bDescriptorSubtype (format type) 0D93 01 2870 .db 0x01 ; bFormatType (1) 0D94 01 2871 .db 1 ; bNrChannels 0D95 01 2872 .db 1 ; bSubFrameSize 0D96 08 2873 .db 8 ; bBitResolution 0D97 01 2874 .db 1 ; bSamFreqType (one sampling frequency supported) 0D98 2875 descoutsrate: 0D98 00 00 00 2876 .db 0,0,0 ; tSamFreq 2877 ;; endpoint descriptor I3:A1:E0 0D9B 09 2878 .db 9 ; bLength 0D9C 05 2879 .db USB_DT_ENDPOINT ; bDescriptorType 0D9D 08 2880 .db (USB_DIR_OUT | 8) ; bEndpointAddress 0D9E 01 2881 .db 0x01 ; bmAttributes (iso) 0D9F 2882 descoutframesize: 0D9F 02 00 2883 .db 0x02,0x00 ; wMaxPacketSize 0DA1 01 2884 .db 1 ; bInterval 0DA2 00 2885 .db 0 ; bRefresh 0DA3 00 2886 .db 0 ; bSynchAddress 2887 ;; audio class specific endpoint descriptor I3:A1:E0 0DA4 07 2888 .db 7 ; bLength 0DA5 25 2889 .db USB_DT_AUDIO_ENDPOINT ; bDescriptorType 0DA6 01 2890 .db 1 ; bDescriptorSubtype (general) 0DA7 00 2891 .db 0 ; bmAttributes (no sampling rate control etc.) 0DA8 00 2892 .db 0 ; bLockDelayUnits 0DA9 00 00 2893 .db 0,0 ; wLockDelay 00CE 2894 config0sz = . - config0descr 2895 0DAB 2896 stringdescr: 0DAB B3 0D 2897 .db string0 0DAD B7 0D 2898 .db string1 0DAF C5 0D 2899 .db string2 0DB1 E5 0D 2900 .db stringserial 2901 0004 2902 numstrings = (. - stringdescr)/2 2903 0DB3 2904 string0: 0DB3 04 2905 .db string0sz ; bLength 0DB4 03 2906 .db USB_DT_STRING ; bDescriptorType 0DB5 00 00 2907 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2908 string0sz = . - string0 2909 0DB7 2910 string1: 0DB7 0E 2911 .db string1sz ; bLength 0DB8 03 2912 .db USB_DT_STRING ; bDescriptorType 0DB9 42 00 61 00 79 00 2913 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2914 string1sz = . - string1 2915 0DC5 2916 string2: 0DC5 20 2917 .db string2sz ; bLength 0DC6 03 2918 .db USB_DT_STRING ; bDescriptorType 0DC7 55 00 53 00 42 00 2919 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0DD7 28 00 41 00 75 00 2920 .db '(,0,'A,0,'u,0,'d,0,'i,0,'o,0,'),0 64 00 69 00 6F 00 29 00 0020 2921 string2sz = . - string2 2922 0DE5 2923 stringserial: 0DE5 02 2924 .db 2 ; bLength 0DE6 03 2925 .db USB_DT_STRING ; bDescriptorType 0DE7 00 00 00 00 00 00 2926 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0DF7 00 00 00 00 00 00 2927 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2928 baycomusb-0.10.orig/firmware/audiofirmware/main.map0100644000175100017510000000665507337536151020533 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 s_OSEG 0000 l__CODE 0000 s__CODE 0000 s_CODE 0000 s_BSEG 0000 l_OSEG 0001 l_XSEG 0008 l_GSINIT 000A l_BSEG 0027 l_DSEG 0040 s_DSEG 0080 l_ISEG 0080 s_ISEG 0157 l_CODE 0157 s_CSEG 01E8 l_GSINIT2 0CB0 l_CSEG 0E07 s_GSINIT 0E0F s_GSINIT2 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 0157 = 343. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 0157 0CB0 = 3248. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:0A13 fillusbintr Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT 0E07 0008 = 8. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT2 0E0F 01E8 = 488. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ OSEG 0000 0000 = 0. bytes (REL,OVR) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 000A = 10. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0080 = 128. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 0027 = 39. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 0001 = 1. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/audiofirmware/main.asm0100644000175100017510000014501007337522014020514 0ustar abaaba .module main ;; ENDPOINTS ;; EP0 in/out Control ;; EP1 in Interrupt: Status ;; Byte 0: Modem Status ;; Bit 0-1: Transmitter status ;; 0: idle (off) ;; 1: keyup ;; 2: transmitting packets ;; 3: tail ;; Bit 2: PTT status (1=on) ;; Bit 3: DCD ;; Bit 5: UART transmitter empty ;; Bit 6-7: unused ;; Byte 1: Number of empty 64 byte chunks in TX fifo (sofcount) ;; Byte 2: Number of full 64 byte chunks in RX fifo (INISOVAL) ;; Byte 3: RSSI value ;; Byte 4: IRQ count ;; Byte 5-20: (as needed) UART receiver chars ;; EP8 out audio output ;; EP8 in audio input ;; COMMAND LIST ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) ;; C0 C8 read mode ;; Return: ;; Byte 0: 4 (MODE_AUDIO) ;; C0 C9 return serial number string ;; C0 D0 get/set PTT/DCD/RSSI ;; wIndex = 1: set forced ptt to wValue ;; Return: ;; Byte 0: PTT status ;; Byte 1: DCD status ;; Byte 2: RSSI status ;; 40 D2 set CON/STA led ;; Bits 0-1 of wValue ;; 40 D3 send byte to UART ;; Byte in wValue ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) ;; wIndex = 1: write wValue to output register ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) ;; Return: ;; Byte 0: Modem Disconnect Input ;; Byte 1: Modem Disconnect Output register ;; Byte 2: Modem Disconnect Tristate register ;; C0 D5 get/set T7F port ;; wIndex = 1: write wValue to T7F output register ;; Return: ;; Byte 0: T7F Input ;; Byte 1: T7F Output register ;; C0 E0 get/set control register/counter values ;; wIndex = 1: write wValue to control register ;; Return: ;; Byte 0: control register value ;; Byte 1-3: counter0 register ;; Byte 4-6: counter1 register ;; C0 E1 get debug status ;; Return: ;; Byte 0: SOF count ;; Byte 1: framesize ;; Byte 2-3: divider ;; Byte 4: divrel ;; Byte 5: pllcorrvar ;; Byte 6: txfifocount ;; C0 E2 xxdebug stuff ;; define code segments link order .area CODE (CODE) .area CSEG (CODE) .area GSINIT (CODE) .area GSINIT2 (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; Xilinx FPGA registers AUDIORXFIFO = 0xc000 AUDIOTXFIFO = 0xc000 AUDIORXFIFOCNT = 0xc001 AUDIOTXFIFOCNT = 0xc002 AUDIODIVIDERLO = 0xc001 AUDIODIVIDERHI = 0xc002 AUDIORSSI = 0xc004 AUDIOCNTLOW = 0xc005 AUDIOCNTMID = 0xc006 AUDIOCNTHIGH = 0xc007 AUDIOCTRL = 0xc008 AUDIOSTAT = 0xc009 AUDIOT7FOUT = 0xc00a AUDIOT7FIN = 0xc00b AUDIOMDISCTRIS = 0xc00c AUDIOMDISCOUT = 0xc00d AUDIOMDISCIN = 0xc00e AUDIOCTRLPTT = 0x01 AUDIOCTRLMUTE = 0x02 AUDIOCTRLLEDPTT = 0x04 AUDIOCTRLLEDDCD = 0x08 AUDIOCTRLCNTRES = 0x00 AUDIOCTRLCNTDIS = 0x10 AUDIOCTRLCNTCK0 = 0x40 AUDIOCTRLCNTCK1 = 0x50 AUDIOCTRLCNTCK2 = 0x60 AUDIOCTRLCNTCK3 = 0x70 AUDIOCTRLCNTRD1 = 0x80 ;; ----------------------------------------------------- .area CODE (CODE) ljmp startup ljmp int0_isr .ds 5 ljmp timer0_isr .ds 5 ljmp int1_isr .ds 5 ljmp timer1_isr .ds 5 ljmp ser0_isr .ds 5 ljmp timer2_isr .ds 5 ljmp resume_isr .ds 5 ljmp ser1_isr .ds 5 ljmp usb_isr .ds 5 ljmp i2c_isr .ds 5 ljmp int4_isr .ds 5 ljmp int5_isr .ds 5 ljmp int6_isr ;; Parameter block at 0xe0 .ds 0x7a parframesize: .db 8 parpttmute: .db 1 ;; Serial# string at 0xf0 .ds 14 parserial: .db '0,'0,'0,'0,'0,'0,'0,'0,0 .ds 7 usb_isr: ljmp usb_sudav_isr .ds 1 ljmp usb_sof_isr .ds 1 ljmp usb_sutok_isr .ds 1 ljmp usb_suspend_isr .ds 1 ljmp usb_usbreset_isr .ds 1 reti .ds 3 ljmp usb_ep0in_isr .ds 1 ljmp usb_ep0out_isr .ds 1 ljmp usb_ep1in_isr .ds 1 ljmp usb_ep1out_isr .ds 1 ljmp usb_ep2in_isr .ds 1 ljmp usb_ep2out_isr .ds 1 ljmp usb_ep3in_isr .ds 1 ljmp usb_ep3out_isr .ds 1 ljmp usb_ep4in_isr .ds 1 ljmp usb_ep4out_isr .ds 1 ljmp usb_ep5in_isr .ds 1 ljmp usb_ep5out_isr .ds 1 ljmp usb_ep6in_isr .ds 1 ljmp usb_ep6out_isr .ds 1 ljmp usb_ep7in_isr .ds 1 ljmp usb_ep7out_isr ;; ----------------------------------------------------- NUMINTERFACES = 4 .area OSEG (OVR,DATA) .area BSEG (BIT) ctrl_ptt: .ds 1 ctrl_pttmute: .ds 1 ctrl_ledptt: .ds 1 ctrl_leddcd: .ds 1 ctrl_cntmode0: .ds 1 ctrl_cntmode1: .ds 1 ctrl_cntmode2: .ds 1 ctrl_cntsel: .ds 1 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) pttmute: .ds 1 uartempty: .ds 1 .area ISEG (DATA) txsamples: .ds 0x40 stack: .ds 0x80-0x40 .area DSEG (DATA) ctrlcode: .ds 1 ctrlcount: .ds 2 leddiv: .ds 1 irqcount: .ds 1 sofcount: .ds 1 divider: .ds 2 divrel: .ds 1 framesize: .ds 1 pllcorrvar: .ds 1 txfifocount: .ds 1 pttforce: .ds 1 ;; UART receiver uartbuf: .ds 16 uartwr: .ds 1 uartrd: .ds 1 ;; Port state t7fout: .ds 1 mdisctris: .ds 1 mdiscout: .ds 1 ;; USB state numconfig: .ds 1 altsetting: .ds NUMINTERFACES .area XSEG (DATA) blah: .ds 1 .area GSINIT (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 startup: mov sp,#stack ; -1 clr a mov psw,a mov dps,a ;lcall __sdcc_external_startup ;mov a,dpl0 ;jz __sdcc_init_data ;ljmp __sdcc_program_startup __sdcc_init_data: .area GSINIT2 (CODE) __sdcc_program_startup: ;; assembler code startup clr a mov irqcount,a mov sofcount,a mov pttforce,a mov uartrd,a mov uartwr,a mov dps,a setb uartempty ;; some indirect register setup mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs ;; Timer setup: ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 mov tmod,#0x21 mov tcon,#0x55 ; INT0/INT1 edge mov th1,#256-156 ; 1200 bauds mov pcon,#0 ; SMOD0=0 ;; init USB subsystem mov a,#0x00 ; IN8 FIFO at address 0x0000 mov dptr,#IN8ADDR movx @dptr,a mov a,#0x04 ; OUT8 FIFO at address 0x0010 mov dptr,#OUT8ADDR movx @dptr,a mov dptr,#ISOCTL clr a ; enable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a mov a,#0x01 ; enable ISO endpoint 8 for input/output mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR mov a,#0x89 ; pair EP 2&3 for input & output, ISOSEND0 movx @dptr,a mov dptr,#IN07VAL mov a,#0x3 ; enable EP0+EP1 movx @dptr,a mov dptr,#OUT07VAL mov a,#0x1 ; enable EP0 movx @dptr,a ;; USB: init endpoint toggles mov dptr,#TOGCTL mov a,#0x12 movx @dptr,a mov a,#0x32 ; clear EP 2 in toggle movx @dptr,a mov a,#0x02 movx @dptr,a mov a,#0x22 ; clear EP 2 out toggle movx @dptr,a ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x82 ; set PROG hi movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins movx @dptr,a mov dptr,#OUTC mov a,#0x28 movx @dptr,a mov dptr,#OEC mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT movx @dptr,a ;; enable interrupts mov ie,#0x92 ; enable timer 0 and ser 0 int mov eie,#0x01 ; enable USB interrupts mov dptr,#USBIEN mov a,#1 ; enable SUDAV interrupt movx @dptr,a mov dptr,#IN07IEN mov a,#3 ; enable EP0+EP1 interrupt movx @dptr,a mov dptr,#OUT07IEN mov a,#1 ; enable EP0 interrupt movx @dptr,a ;; initialize UART 0 for T7F communication mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable ;; copy configuration to bit addressable variables mov ctrlreg,#AUDIOCTRLCNTRES mov r0,#parpttmute movx a,@r0 mov c,acc.0 mov pttmute,c mov ctrl_pttmute,c ;; turn off transmitter mov dptr,#AUDIOCTRL mov a,ctrlreg movx @dptr,a ;; Initialize modem disc port / t7f port mov dptr,#AUDIOMDISCTRIS mov a,#0xff movx @dptr,a mov mdisctris,a mov dptr,#AUDIOMDISCOUT clr a movx @dptr,a mov mdiscout,a mov dptr,#AUDIOT7FOUT mov a,#0x1f movx @dptr,a mov t7fout,a ;; Copy serial number mov r0,#parserial mov dptr,#stringserial+2 1$: movx a,@r0 jz 2$ movx @dptr,a inc dptr inc dptr inc r0 sjmp 1$ 2$: mov a,r0 add a,#1-0xf0 ; 1-parserial add a,acc mov dptr,#stringserial movx @dptr,a ;; check parameters chkparam: mov divrel,#0x80 mov r0,#parframesize movx a,@r0 cjne a,#02,11$ sjmp 2$ 11$: cjne a,#03,1$ sjmp 2$ 1$: add a,#-8 jnc 3$ add a,#-16 jc 4$ movx a,@r0 sjmp 5$ ;; sampling rate is: 24000000Hz/(divider+2) 4$: mov a,#24 sjmp 5$ 3$: mov a,#8 ;; 16 bit by 8 bit divide ;; r2: divisor ;; r3: loop counter ;; r4: dividend/result low ;; r5: dividend/result mid ;; r6: dividend/result high 5$: mov r2,a mov r3,#17 mov r4,#24000 mov r5,#24000>>8 mov r6,#0 6$: clr c mov a,r6 subb a,r2 jc 7$ mov r6,a 7$: cpl c mov a,r4 rlc a mov r4,a mov a,r5 rlc a mov r5,a mov a,r6 rlc a mov r6,a djnz r3,6$ ;; subtract two mov a,r4 clr c subb a,#2 mov r4,a mov a,r5 subb a,#0 mov r5,a ;; store result into audio divider mov dptr,#AUDIODIVIDERHI movx @dptr,a mov a,r4 mov dptr,#AUDIODIVIDERLO movx @dptr,a clr c subb a,#0x08 mov divider,a mov a,r5 subb a,#0 mov divider+1,a ;; reload divider into accu mov a,r2 2$: mov framesize,a mov dptr,#descinframesize movx @dptr,a mov dptr,#descoutframesize movx @dptr,a ;; set sampling rate in descriptor mov b,#1000 mul ab mov dptr,#descinsrate movx @dptr,a mov dptr,#descoutsrate movx @dptr,a mov r3,b mov a,framesize mov b,#1000>>8 mul ab add a,r3 mov dptr,#descinsrate+1 movx @dptr,a mov dptr,#descoutsrate+1 movx @dptr,a clr a addc a,b mov dptr,#descinsrate+2 movx @dptr,a mov dptr,#descoutsrate+2 movx @dptr,a ;; initialize USB state usbinit: .if 0 ;; XXXXX ;; check if windows needs 11025Hz mov a,#12 mov dptr,#descinframesize movx @dptr,a mov dptr,#descoutframesize movx @dptr,a mov a,#0x11 mov dptr,#descinsrate movx @dptr,a mov dptr,#descoutsrate movx @dptr,a mov a,#0x2b mov dptr,#descinsrate+1 movx @dptr,a mov dptr,#descoutsrate+1 movx @dptr,a mov a,#0 mov dptr,#descinsrate+2 movx @dptr,a mov dptr,#descoutsrate+2 movx @dptr,a ;; XXXXX .endif clr a mov numconfig,a mov r0,#altsetting mov r2,#NUMINTERFACES 3$: mov @r0,a inc r0 djnz r2,3$ ;; give Windows a chance to finish the writecpucs control transfer ;; 20ms delay loop mov dptr,#(-12000)&0xffff 2$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 2$ ; 3 cycles .if 1 ;; disconnect from USB bus mov dptr,#USBCS mov a,#10 movx @dptr,a ;; wait 0.3 sec mov r2,#30 ;; 10ms delay loop 0$: mov dptr,#(-6000)&0xffff 1$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 1$ ; 3 cycles djnz r2,0$ ;; reconnect to USB bus mov dptr,#USBCS ;mov a,#2 ; 8051 handles control ;movx @dptr,a mov a,#6 ; reconnect, 8051 handles control movx @dptr,a .endif ;; final lcall fillusbintr fifoinit: ;; first wait for a new frame mov dptr,#USBFRAMEL movx a,@dptr mov r2,a 1$: movx a,@dptr cjne a,ar2,2$ sjmp 1$ 2$: mov dptr,#AUDIORXFIFOCNT movx a,@dptr add a,#-4 anl a,#0x3f jz 4$ mov r2,a mov dptr,#AUDIORXFIFO 3$: movx a,@dptr djnz r2,3$ 4$: mov dptr,#AUDIOTXFIFOCNT movx a,@dptr add a,#-4 anl a,#0x3f jz 4$ mov r2,a mov dptr,#AUDIOTXFIFO clr a 5$: movx @dptr,a djnz r2,5$ 6$: ;; clear SOFIR interrupt mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; finally enable SOFIR interrupt mov dptr,#USBIEN mov a,#3 ; enable SUDAV+SOFIR interrupt movx @dptr,a lcall fillusbintr ljmp mainloop .area CSEG (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 ;; WARNING! The assembler doesn't check for ;; out of range short jump labels!! Double check ;; that the jump labels are within the range! mainloop: mov a,pttforce mov c,acc.0 mov ctrl_ptt,c mov ctrl_ledptt,c cpl c anl c,pttmute mov ctrl_pttmute,c mov dptr,#AUDIOCTRL mov a,ctrlreg movx @dptr,a ljmp mainloop ;; ------------------ interrupt handlers ------------------------ int0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+5 ;; handle interrupt .if 0 inc leddiv mov a,leddiv anl a,#7 jnz 0$ mov dptr,#OUTC movx a,@dptr xrl a,#0x08 movx @dptr,a 0$: .endif ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 ;; clear interrupt jbc scon0+0,1$ ; RI 0$: jbc scon0+1,2$ ; TI ;; handle interrupt ;; epilogue 3$: pop ar0 pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti 2$: setb uartempty sjmp 0$ 1$: mov a,uartwr add a,#uartbuf mov r0,a mov a,sbuf0 mov @r0,a mov a,uartwr inc a anl a,#0xf mov uartwr,a sjmp 3$ timer2_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr t2con+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti resume_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+4 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon1+0 clr scon1+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti i2c_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.5 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int4_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.6 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int5_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.7 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int6_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sudav_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov ctrlcode,#0 ; reset control out code mov dptr,#SETUPDAT+1 movx a,@dptr ; bRequest field ;; standard commands ;; USB_REQ_GET_DESCRIPTOR cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc mov dptr,#SETUPDAT ; bRequestType == 0x80 movx a,@dptr cjne a,#USB_DIR_IN,setupstallstd mov dptr,#SETUPDAT+3 movx a,@dptr cjne a,#USB_DT_DEVICE,cmdnotgetdescdev mov dptr,#SUDPTRH mov a,#>devicedescr movx @dptr,a inc dptr mov a,#config0descr movx @dptr,a inc dptr mov a,#stringdescr mov dph0,a movx a,@dptr mov b,a inc dptr movx a,@dptr mov dptr,#SUDPTRH movx @dptr,a inc dptr mov a,b movx @dptr,a ; sjmp setupackstd setupackstd: ljmp setupack setupstallstd: ljmp setupstall cmdnotgetdesc: ;; USB_REQ_SET_CONFIGURATION cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf mov dptr,#SETUPDAT movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr add a,#-2 jc setupstallstd movx a,@dptr mov numconfig,a cmdresettoggleshalt: mov dptr,#TOGCTL mov r0,#7 0$: mov a,r0 orl a,#0x10 movx @dptr,a orl a,#0x30 movx @dptr,a mov a,r0 movx @dptr,a orl a,#0x20 movx @dptr,a djnz r0,0$ clr a movx @dptr,a mov a,#2 mov dptr,#IN1CS mov r0,#7 1$: movx @dptr,a inc dptr inc dptr djnz r0,1$ mov dptr,#OUT1CS mov r0,#7 2$: movx @dptr,a inc dptr inc dptr djnz r0,2$ lcall fillusbintr sjmp setupackstd cmdnotsetconf: ;; USB_REQ_SET_INTERFACE cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr add a,#-NUMINTERFACES jc setupstallstd add a,#NUMINTERFACES+altsetting mov r0,a mov dptr,#SETUPDAT+2 movx a,@dptr mov @r0,a sjmp cmdresettoggleshalt cmdnotsetint: ;; USB_REQ_GET_INTERFACE cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr add a,#-NUMINTERFACES jc setupstallstd add a,#NUMINTERFACES+altsetting mov r0,a mov a,@r0 cmdrespondonebyte: mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a sjmp setupackstd2 cmdnotgetint: ;; USB_REQ_GET_CONFIGURATION cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 mov a,numconfig sjmp cmdrespondonebyte cmdnotgetconf: ;; USB_REQ_GET_STATUS (0) jnz cmdnotgetstat mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev mov a,#1 cmdrespondstat: mov dptr,#IN0BUF movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#IN0BC mov a,#2 movx @dptr,a sjmp setupackstd2 cmdnotgetstatdev: cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf clr a sjmp cmdrespondstat cmdnotgetstatintf: cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 mov dptr,#SETUPDAT+4 movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 0$: anl a,#15 jz setupstallstd2 jb acc.3,setupstallstd2 add a,acc add a,dpl0 mov dpl0,a movx a,@dptr sjmp cmdrespondstat setupackstd2: ljmp setupack setupstallstd2: ljmp setupstall cmdnotgetstat: ;; USB_REQ_SET_FEATURE cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr mov b,#1 sjmp handleftr cmdnotsetftr: ;; USB_REQ_CLEAR_FEATURE cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr mov b,#0 handleftr: mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 inc dptr inc dptr movx a,@dptr jnz setupstallstd2 ; not ENDPOINT_HALT feature inc dptr movx a,@dptr jnz setupstallstd2 inc dptr movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 orl a,#0x10 0$: jb acc.3,setupstallstd2 ;; clear data toggle anl a,#0x1f inc dps mov dptr,#TOGCTL movx @dptr,a orl a,#0x20 movx @dptr,a anl a,#15 movx @dptr,a dec dps ;; clear/set ep halt feature add a,acc add a,dpl0 mov dpl0,a mov a,b movx @dptr,a sjmp setupackstd2 cmdnotc0_1: ljmp cmdnotc0 setupstallc0_1: ljmp setupstall cmdnotclrftr: ;; vendor specific commands ;; 0xc0 cjne a,#0xc0,cmdnotc0_1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc0_1 ;; fill status buffer mov a,pttforce mov b,a mov c,acc.0 mov b.2,c mov dptr,#AUDIOSTAT movx a,@dptr mov c,acc.0 cpl c mov b.3,c mov c,uartempty mov b.5,c clr a mov dptr,#(IN0BUF+4) movx @dptr,a ;; bytewide elements mov dptr,#(IN0BUF) mov a,b movx @dptr,a clr a mov dptr,#(IN0BUF+1) movx @dptr,a mov dptr,#(IN0BUF+2) movx @dptr,a mov dptr,#AUDIORSSI movx a,@dptr mov dptr,#(IN0BUF+3) movx @dptr,a ;; counter inc irqcount mov a,irqcount mov dptr,#(IN0BUF+5) movx @dptr,a ;; additional fields (HDLC state mach) clr a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a ;; FPGA registers mov dptr,#AUDIORXFIFOCNT movx a,@dptr mov dptr,#(IN0BUF+18) movx @dptr,a mov dptr,#AUDIOTXFIFOCNT movx a,@dptr mov dptr,#(IN0BUF+19) movx @dptr,a mov a,ctrlreg inc dptr movx @dptr,a mov dptr,#AUDIOSTAT movx a,@dptr mov dptr,#(IN0BUF+21) movx @dptr,a ;; Anchor Registers mov dptr,#OUT2CS movx a,@dptr mov dptr,#(IN0BUF+22) movx @dptr,a ;; set length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-(6+12+4+1) jnc 4$ clr a 4$: add a,#(6+12+4+1) mov dptr,#IN0BC movx @dptr,a ljmp setupack cmdnotc0: ;; 0xc8 cjne a,#0xc8,cmdnotc8 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc8 mov a,#4 mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a ljmp setupack setupstallc8: ljmp setupstall cmdnotc8: ;; 0xc9 cjne a,#0xc9,cmdnotc9 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc9 mov dptr,#IN0BUF mov r0,#parserial 0$: movx a,@r0 jz 1$ movx @dptr,a inc r0 inc dptr sjmp 0$ 1$: mov a,r0 add a,#-0xf0 ; -parserial mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallc9: ljmp setupstall cmdnotc9: ;; 0xd0 cjne a,#0xd0,cmdnotd0 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld0 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,0$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr anl a,#1 mov pttforce,a 0$: ;; PTT status mov dptr,#IN0BUF mov a,pttforce movx @dptr,a ;; DCD status mov dptr,#AUDIOSTAT movx a,@dptr anl a,#1 xrl a,#1 mov dptr,#IN0BUF+1 movx @dptr,a ;; RSSI mov dptr,#AUDIORSSI movx a,@dptr mov dptr,#IN0BUF+2 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-3 jnc 2$ clr a 2$: add a,#3 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld0: ljmp setupstall cmdnotd0: ;; 0xd2 cjne a,#0xd2,cmdnotd2 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,setupstalld2 mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr mov b,a mov dptr,#OUTC movx a,@dptr mov c,b.0 mov acc.3,c mov c,b.1 mov acc.5,c movx @dptr,a ljmp setupack setupstalld2: ljmp setupstall cmdnotd2: ;; 0xd3 cjne a,#0xd3,cmdnotd3 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,setupstalld3 mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr jbc uartempty,cmdd2cont setupstalld3: ljmp setupstall cmdd2cont: mov sbuf0,a ljmp setupack cmdnotd3: ;; 0xd4 cjne a,#0xd4,cmdnotd4 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld4 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr mov dptr,#SETUPDAT+2 ; wValue cjne a,#1,0$ movx a,@dptr mov dptr,#AUDIOMDISCOUT movx @dptr,a mov mdiscout,a sjmp 1$ 0$: cjne a,#2,1$ movx a,@dptr mov dptr,#AUDIOMDISCTRIS movx @dptr,a mov mdisctris,a 1$: mov dptr,#AUDIOMDISCIN movx a,@dptr mov dptr,#IN0BUF+0 movx @dptr,a mov a,mdiscout inc dptr movx @dptr,a mov a,mdisctris inc dptr movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-3 jnc 2$ clr a 2$: add a,#3 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld4: ljmp setupstall cmdnotd4: ;; 0xd5 cjne a,#0xd5,cmdnotd5 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld5 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,0$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr mov dptr,#AUDIOT7FOUT movx @dptr,a mov t7fout,a 0$: mov dptr,#AUDIOT7FIN movx a,@dptr mov dptr,#IN0BUF+0 movx @dptr,a mov a,t7fout inc dptr mov dptr,#IN0BUF+1 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-2 jnc 2$ clr a 2$: add a,#2 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld5: setupstalle0: ljmp setupstall cmdnote0_0: ljmp cmdnote0 cmdnotd5: ;; 0xe0 cjne a,#0xe0,cmdnote0_0 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalle0 ;; set PTT, LED's and counter mode mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,1$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr anl a,#0x78 xch a,ctrlreg anl a,#0x07 orl a,ctrlreg mov ctrlreg,a mov dptr,#AUDIOCTRL movx @dptr,a 1$: mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr jz 3$ cjne a,#1,2$ mov a,ctrlreg mov dptr,#IN0BUF anl a,#0x7f movx @dptr,a mov a,#1 3$: mov dptr,#IN0BC movx @dptr,a ljmp setupack 2$: mov dptr,#AUDIOCTRL setb ctrl_cntsel mov a,ctrlreg movx @dptr,a mov dptr,#AUDIOCNTLOW movx a,@dptr mov dptr,#IN0BUF+4 movx @dptr,a mov dptr,#AUDIOCNTMID movx a,@dptr mov dptr,#IN0BUF+5 movx @dptr,a mov dptr,#AUDIOCNTHIGH movx a,@dptr mov dptr,#IN0BUF+6 movx @dptr,a mov dptr,#AUDIOCTRL clr ctrl_cntsel mov a,ctrlreg movx @dptr,a mov dptr,#IN0BUF movx @dptr,a mov dptr,#AUDIOCNTLOW movx a,@dptr mov dptr,#IN0BUF+1 movx @dptr,a mov dptr,#AUDIOCNTMID movx a,@dptr mov dptr,#IN0BUF+2 movx @dptr,a mov dptr,#AUDIOCNTHIGH movx a,@dptr mov dptr,#IN0BUF+3 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-7 jnc 4$ clr a 4$: add a,#7 mov dptr,#IN0BC movx @dptr,a ljmp setupack cmdnote0: ;; 0xe1 cjne a,#0xe1,cmdnote1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalle1 mov dptr,#IN0BUF mov a,sofcount movx @dptr,a inc dptr mov a,framesize movx @dptr,a inc dptr mov a,divider movx @dptr,a inc dptr mov a,divider+1 movx @dptr,a inc dptr mov a,divrel movx @dptr,a inc dptr mov a,pllcorrvar movx @dptr,a inc dptr mov a,txfifocount movx @dptr,a ;mov dptr,#AUDIOTXFIFOCNT ;movx a,@dptr ;mov dptr,#IN0BUF+6 ;movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-7 jnc 1$ clr a 1$: add a,#7 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalle1: ljmp setupstall cmdnote1: ;; 0xe2 cjne a,#0xe2,cmdnote2 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalle2 mov dptr,#IN0BUF mov r0,#txsamples mov r7,framesize 1$: mov a,@r0 movx @dptr,a inc r0 inc dptr djnz r7,1$ mov dptr,#IN0BC mov a,framesize movx @dptr,a ljmp setupack setupstalle2: ljmp setupstall cmdnote2: ;; unknown commands fall through to setupstall setupstall: mov a,#3 sjmp endsetup setupack: mov a,#2 endsetup: mov dptr,#EP0CS movx @dptr,a endusbisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sof_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar2 push ar3 push ar0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; handle interrupt inc sofcount ;; debugging: we have two cases ;; if the ISO frame size is just 2 bytes, ;; we return the frame number, otherwise ;; the required numbers of samples mov a,framesize cjne a,#2,1$ ;; copy the frame number mov dptr,#USBFRAMEL movx a,@dptr inc dptr inc dps mov dptr,#IN8DATA movx @dptr,a dec dps movx a,@dptr inc dps movx @dptr,a ljmp sofendisr 1$: cjne a,#3,sofsampleisr mov dptr,#ISOERR movx a,@dptr jb acc.0,3$ mov dptr,#OUT8BCH movx a,@dptr jnz 3$ mov dptr,#OUT8BCL movx a,@dptr cjne a,#3,3$ mov r2,a mov dptr,#OUT8DATA inc dps mov dptr,#IN8DATA dec dps 2$: movx a,@dptr inc dps movx @dptr,a dec dps djnz r2,2$ ljmp sofendisr 3$: mov r2,#3 mov dptr,#IN8DATA clr a 4$: movx @dptr,a djnz r2,4$ ljmp sofendisr sofsampleisr: mov dptr,#AUDIORXFIFOCNT movx a,@dptr clr c subb a,framesize movx a,@dptr jc 1$ mov a,framesize 1$: mov r2,a mov r3,a jz 2$ mov dptr,#AUDIORXFIFO inc dps mov dptr,#IN8DATA dec dps 3$: movx a,@dptr inc dps movx @dptr,a dec dps djnz r2,3$ 2$: mov a,framesize clr c subb a,r3 jz 4$ mov r2,a mov dptr,#IN8DATA clr a 5$: movx @dptr,a djnz r2,5$ ;; sample rate adjustment 4$: mov dptr,#AUDIORXFIFOCNT movx a,@dptr mov pllcorrvar,a add a,#-4 jz 10$ ; no adjustment rlc a subb a,acc setb acc.0 10$: mov r3,a ; r3 & acc contain the adjust value add a,divrel ;; zero is the guard value jz 11$ mov divrel,a 11$: mov a,divrel rr a rr a rr a rr a anl a,#0xf add a,r3 ; momentary correction add a,divider mov r2,a mov a,divider+1 addc a,#0 mov dptr,#AUDIODIVIDERHI movx @dptr,a mov a,r2 mov dptr,#AUDIODIVIDERLO movx @dptr,a ;; OUT data mov dptr,#ISOERR movx a,@dptr jb acc.0,20$ mov dptr,#OUT8BCH movx a,@dptr jnz 20$ mov dptr,#OUT8BCL movx a,@dptr clr c subb a,framesize jnz 20$ mov dptr,#AUDIOTXFIFOCNT movx a,@dptr mov txfifocount,a clr c subb a,framesize mov a,txfifocount jc 14$ mov a,framesize 14$: jz 13$ mov r2,a mov dptr,#OUT8DATA inc dps mov dptr,#AUDIOTXFIFO dec dps mov r0,#txsamples 12$: movx a,@dptr inc dps movx @dptr,a dec dps mov @r0,a inc r0 djnz r2,12$ 13$: sjmp sofendisr ;; initialize TX if invalid packet 20$: mov dptr,#AUDIOTXFIFOCNT movx a,@dptr mov txfifocount,a add a,#-4 anl a,#0x3f jz sofendisr mov r2,a mov dptr,#AUDIOTXFIFO clr a mov r0,#txsamples 21$: movx @dptr,a mov @r0,a inc r0 djnz r2,21$ sofendisr: ;; epilogue pop ar0 pop ar3 pop ar2 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sutok_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_suspend_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_usbreset_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep0in_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_ep0out_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar6 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt ;; epilogue pop ar6 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti fillusbintr:: mov a,pttforce mov b,a mov c,acc.0 mov b.2,c mov dptr,#AUDIOSTAT movx a,@dptr mov c,acc.0 mov b.3,c mov c,uartempty mov b.5,c ;; bytewide elements mov dptr,#(IN1BUF) mov a,b movx @dptr,a mov a,sofcount mov dptr,#(IN1BUF+1) movx @dptr,a mov dptr,#INISOVAL movx a,@dptr mov dptr,#(IN1BUF+2) movx @dptr,a mov dptr,#AUDIORSSI movx a,@dptr mov dptr,#(IN1BUF+3) movx @dptr,a ; counter inc irqcount mov a,irqcount mov dptr,#(IN1BUF+4) movx @dptr,a ; UART buffer mov b,#5 mov dptr,#(IN1BUF+5) 2$: mov a,uartrd cjne a,uartwr,3$ ; set length mov dptr,#IN1BC mov a,b movx @dptr,a ret 3$: add a,#uartbuf mov r0,a mov a,@r0 movx @dptr,a inc dptr inc b mov a,uartrd inc a anl a,#0xf mov uartrd,a sjmp 2$ usb_ep1in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt lcall fillusbintr ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep1out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ;; ----------------------------------------------------- ;; USB descriptors ;; ----------------------------------------------------- ;; Device and/or Interface Class codes USB_CLASS_PER_INTERFACE = 0 USB_CLASS_AUDIO = 1 USB_CLASS_COMM = 2 USB_CLASS_HID = 3 USB_CLASS_PRINTER = 7 USB_CLASS_MASS_STORAGE = 8 USB_CLASS_HUB = 9 USB_CLASS_VENDOR_SPEC = 0xff USB_SUBCLASS_AUDIOCONTROL = 1 USB_SUBCLASS_AUDIOSTREAMING = 2 ;; Descriptor types USB_DT_DEVICE = 0x01 USB_DT_CONFIG = 0x02 USB_DT_STRING = 0x03 USB_DT_INTERFACE = 0x04 USB_DT_ENDPOINT = 0x05 ;; Audio Class descriptor types USB_DT_AUDIO_UNDEFINED = 0x20 USB_DT_AUDIO_DEVICE = 0x21 USB_DT_AUDIO_CONFIG = 0x22 USB_DT_AUDIO_STRING = 0x23 USB_DT_AUDIO_INTERFACE = 0x24 USB_DT_AUDIO_ENDPOINT = 0x25 USB_SDT_AUDIO_UNDEFINED = 0x00 USB_SDT_AUDIO_HEADER = 0x01 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 USB_SDT_AUDIO_MIXER_UNIT = 0x04 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 ;; Standard requests USB_REQ_GET_STATUS = 0x00 USB_REQ_CLEAR_FEATURE = 0x01 USB_REQ_SET_FEATURE = 0x03 USB_REQ_SET_ADDRESS = 0x05 USB_REQ_GET_DESCRIPTOR = 0x06 USB_REQ_SET_DESCRIPTOR = 0x07 USB_REQ_GET_CONFIGURATION = 0x08 USB_REQ_SET_CONFIGURATION = 0x09 USB_REQ_GET_INTERFACE = 0x0A USB_REQ_SET_INTERFACE = 0x0B USB_REQ_SYNCH_FRAME = 0x0C ;; Audio Class Requests USB_REQ_AUDIO_SET_CUR = 0x01 USB_REQ_AUDIO_GET_CUR = 0x81 USB_REQ_AUDIO_SET_MIN = 0x02 USB_REQ_AUDIO_GET_MIN = 0x82 USB_REQ_AUDIO_SET_MAX = 0x03 USB_REQ_AUDIO_GET_MAX = 0x83 USB_REQ_AUDIO_SET_RES = 0x04 USB_REQ_AUDIO_GET_RES = 0x84 USB_REQ_AUDIO_SET_MEM = 0x05 USB_REQ_AUDIO_GET_MEM = 0x85 USB_REQ_AUDIO_GET_STAT = 0xff ;; USB Request Type and Endpoint Directions USB_DIR_OUT = 0 USB_DIR_IN = 0x80 USB_TYPE_STANDARD = (0x00 << 5) USB_TYPE_CLASS = (0x01 << 5) USB_TYPE_VENDOR = (0x02 << 5) USB_TYPE_RESERVED = (0x03 << 5) USB_RECIP_DEVICE = 0x00 USB_RECIP_INTERFACE = 0x01 USB_RECIP_ENDPOINT = 0x02 USB_RECIP_OTHER = 0x03 ;; Request target types. USB_RT_DEVICE = 0x00 USB_RT_INTERFACE = 0x01 USB_RT_ENDPOINT = 0x02 VENDID = 0xbac0 PRODID = 0x6137 devicedescr: .db 18 ; bLength .db USB_DT_DEVICE ; bDescriptorType .db 0x00, 0x01 ; bcdUSB .db USB_CLASS_PER_INTERFACE ; bDeviceClass .db 0 ; bDeviceSubClass .db 0x00 ; bDeviceProtocol .db 0x40 ; bMaxPacketSize0 .db VENDID ; idVendor .db PRODID ; idProduct .db 0x01,0x00 ; bcdDevice .db 1 ; iManufacturer .db 2 ; iProduct .db 3 ; iSerialNumber .db 1 ; bNumConfigurations config0descr: .db 9 ; bLength .db USB_DT_CONFIG ; bDescriptorType .db config0sz ; wTotalLength .db 4 ; bNumInterfaces .db 1 ; bConfigurationValue .db 0 ; iConfiguration .db 0b01000000 ; bmAttributs (self powered) .db 0 ; MaxPower (mA/2) (self powered so 0) ;; standard packet interface (needed so the driver can hook to it) ;; interface descriptor I0:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 1 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A0:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; interface descriptor I0:A1 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 1 ; bAlternateSetting .db 1 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A1:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x03 ; bmAttributes (interrupt) .db 0x40,0x00 ; wMaxPacketSize .db 8 ; bInterval ;; interface descriptor I1:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 1 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 0 ; bNumEndpoints (only control endpoint) .db USB_CLASS_AUDIO ; bInterfaceClass (audio) .db USB_SUBCLASS_AUDIOCONTROL ; bInterfaceSubClass .db 0x00 ; bInterfaceProtocol (none) .db 0 ; iInterface acctrl: ;; class specific audio interface descriptor I1:A0 .db 10 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db USB_SDT_AUDIO_HEADER ; bDescriptorSubtype .db 0x00,0x01 ; bcdADC (Audio Class Spec Revision 1.0) .db acctrlsz ; wTotalLength (Audio Class specific desctiptors) .db 2 ; bInCollection (number of streaming interfaces) .db 2 ; baInterfaceNr0 (number of AudioStreaming interface) .db 3 ; baInterfaceNr1 (number of AudioStreaming interface) ;; audio input terminal descriptor .db 12 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db USB_SDT_AUDIO_INPUT_TERMINAL ; bDescriptorSubtype .db 1 ; bTerminalID .db 0x10,0x07 ; wTerminalType (Radio Receiver) .db 0 ; bAssocTerminal (none) .db 1 ; bNrChannels (one channel) .db 0,0 ; wChannelConfig (mono has no position bits) .db 0 ; iChannelNames .db 0 ; iTerminal ;; audio output terminal descriptor .db 9 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db USB_SDT_AUDIO_OUTPUT_TERMINAL ; bDescriptorSubtype .db 2 ; bTerminalID .db 0x11,0x07 ; wTerminalType (Radio Transmitter) .db 0 ; bAssocTerminal (none) .db 3 ; bSourceID .db 0 ; iTerminal ;; USB input terminal descriptor .db 12 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db USB_SDT_AUDIO_INPUT_TERMINAL ; bDescriptorSubtype .db 3 ; bTerminalID .db 0x01,0x01 ; wTerminalType (USB streaming) .db 0 ; bAssocTerminal (none) .db 1 ; bNrChannels (one channel) .db 0,0 ; wChannelConfig (mono has no position bits) .db 0 ; iChannelNames .db 0 ; iTerminal ;; USB output terminal descriptor .db 9 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db USB_SDT_AUDIO_OUTPUT_TERMINAL ; bDescriptorSubtype .db 4 ; bTerminalID .db 0x01,0x01 ; wTerminalType (USB streaming) .db 0 ; bAssocTerminal (none) .db 1 ; bSourceID .db 0 ; iTerminal acctrlsz = . - acctrl ;; interface descriptor I2:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 2 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 0 ; bNumEndpoints (use control endpoint only) .db USB_CLASS_AUDIO ; bInterfaceClass (audio) .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass .db 0x00 ; bInterfaceProtocol (none) .db 0 ; iInterface ;; interface descriptor I2:A1 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 2 ; bInterfaceNumber .db 1 ; bAlternateSetting .db 1 ; bNumEndpoints .db USB_CLASS_AUDIO ; bInterfaceClass (audio) .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass .db 0x00 ; bInterfaceProtocol (none) .db 0 ; iInterface ;.db 1,0 ; wNumClasses ;; audio class specific general interface descriptor I2:A1 .db 7 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db 0x01 ; bDescriptorSubtype (general) .db 4 ; bTerminalLink .db 1 ; bDelay (in frames) .db 1,0 ; wFormatTag (PCM) ;; audio class specific format type I interface descriptor I2:A1 .db 11 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db 0x02 ; bDescriptorSubtype (format type) .db 0x01 ; bFormatType (1) .db 1 ; bNrChannels .db 1 ; bSubFrameSize .db 8 ; bBitResolution .db 1 ; bSamFreqType (one sampling frequency supported) descinsrate: .db 0,0,0 ; tSamFreq ;; endpoint descriptor I2:A1:E0 .db 9 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 8) ; bEndpointAddress .db 0x01 ; bmAttributes (iso) descinframesize: .db 0x02,0x00 ; wMaxPacketSize .db 1 ; bInterval .db 0 ; bRefresh .db 0 ; bSynchAddress ;; audio class specific endpoint descriptor I2:A1:E0 .db 7 ; bLength .db USB_DT_AUDIO_ENDPOINT ; bDescriptorType .db 1 ; bDescriptorSubtype (general) .db 0 ; bmAttributes (no sampling rate control etc.) .db 0 ; bLockDelayUnits .db 0,0 ; wLockDelay ;; interface descriptor I3:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 3 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 0 ; bNumEndpoints (use control endpoint only) .db USB_CLASS_AUDIO ; bInterfaceClass (audio) .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass .db 0x00 ; bInterfaceProtocol (none) .db 0 ; iInterface ;; interface descriptor I3:A1 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 3 ; bInterfaceNumber .db 1 ; bAlternateSetting .db 1 ; bNumEndpoints .db USB_CLASS_AUDIO ; bInterfaceClass (audio) .db USB_SUBCLASS_AUDIOSTREAMING ; bInterfaceSubClass .db 0x00 ; bInterfaceProtocol (none) .db 0 ; iInterface ;.db 1,0 ; wNumClasses ;; audio class specific general interface descriptor I3:A1 .db 7 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db 0x01 ; bDescriptorSubtype (general) .db 3 ; bTerminalLink .db 1 ; bDelay (in frames) .db 1,0 ; wFormatTag (PCM) ;; audio class specific format type I interface descriptor I3:A1 .db 11 ; bLength .db USB_DT_AUDIO_INTERFACE ; bDescriptorType .db 0x02 ; bDescriptorSubtype (format type) .db 0x01 ; bFormatType (1) .db 1 ; bNrChannels .db 1 ; bSubFrameSize .db 8 ; bBitResolution .db 1 ; bSamFreqType (one sampling frequency supported) descoutsrate: .db 0,0,0 ; tSamFreq ;; endpoint descriptor I3:A1:E0 .db 9 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 8) ; bEndpointAddress .db 0x01 ; bmAttributes (iso) descoutframesize: .db 0x02,0x00 ; wMaxPacketSize .db 1 ; bInterval .db 0 ; bRefresh .db 0 ; bSynchAddress ;; audio class specific endpoint descriptor I3:A1:E0 .db 7 ; bLength .db USB_DT_AUDIO_ENDPOINT ; bDescriptorType .db 1 ; bDescriptorSubtype (general) .db 0 ; bmAttributes (no sampling rate control etc.) .db 0 ; bLockDelayUnits .db 0,0 ; wLockDelay config0sz = . - config0descr stringdescr: .db string0 .db string1 .db string2 .db stringserial numstrings = (. - stringdescr)/2 string0: .db string0sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 0,0 ; LANGID[0]: Lang Neutral string0sz = . - string0 string1: .db string1sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 string1sz = . - string1 string2: .db string2sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 .db '(,0,'A,0,'u,0,'d,0,'i,0,'o,0,'),0 string2sz = . - string2 stringserial: .db 2 ; bLength .db USB_DT_STRING ; bDescriptorType .dw 0,0,0,0,0,0,0,0 .dw 0,0,0,0,0,0,0,0 baycomusb-0.10.orig/firmware/audiofirmware/main.lnk0100644000175100017510000000014707325134422020520 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/firmware/audio2firmware/0042755000175100017510000000000007340500002017137 5ustar abaababaycomusb-0.10.orig/firmware/audio2firmware/Makefile.in0100644000175100017510000001403107340500002021176 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/audio2firmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/audio2firmware/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 = firmware/audio2firmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/audio2firmware/main.rel: $(top_srcdir)/firmware/audio2firmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/audio2firmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/audio2firmware/main.ihx: $(top_srcdir)/firmware/audio2firmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/audio2firmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/audio2firmware/Makefile.am0100644000175100017510000000101007325134422021172 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/audio2firmware/main.rel: $(top_srcdir)/firmware/audio2firmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/audio2firmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/audio2firmware/main.ihx $(top_srcdir)/firmware/audio2firmware/main.ihx: $(top_srcdir)/firmware/audio2firmware/main.rel cd $(top_srcdir)/firmware/audio2firmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk baycomusb-0.10.orig/firmware/audio2firmware/main.ihx0100644000175100017510000002707407337536151020626 0ustar abaaba:06000000020D7402016D07 :03000B0002018E61 :030013000201AF38 :03001B000201D00F :030023000201F1E6 :03002B0002022F9F :0300330002025076 :03003B000202714D :03004300020100B7 :03004B000202941A :030053000202B9ED :03005B000202DEC0 :0300630002030392 :0200E000080115 :0900F00030303030303030300087 :03010000020324D3 :030104000207D21D :0301080002091CCD :03010C000209479E :030110000209726F :0101140032B8 :0301180002099D3C :03011C000209D8FD :03012000020A6E62 :03012400020A9C30 :03012800020AC701 :03012C00020AF2D2 :03013000020B1DA2 :03013400020B4873 :03013800020B7344 :03013C00020B9E15 :03014000020BC9E6 :03014400020BF4B7 :03014800020C1F87 :03014C00020C4A58 :03015000020C7529 :03015400020CA0FA :080D74007581C0E4F5D0F5869D :060D7C00E4F544F545F525 :040D82004CF55EF5D9 :0C0D86005DF586D209758E3075892175E7 :0E0D92008855758D647587007400907FF8F0A9 :0E0DA0007404907FF0F0907FA1E4F0907FAF9C :0E0DAE007401F07401907FE0F0907FE1F0900E :0E0DBC007FDD7489F0907FDE7403F0907FDF9E :0E0DCA007401F0907FD77412F07432F074024E :0E0DD800F07422F0907F937400F0907F967478 :0E0DE60082F0907F9C74C2F0907F947400F0B5 :0D0DF400907F9D7400F0907F9574C3F09087 :0E0E01007F987428F0907F9E742AF075A89256 :0E0E0F0075E801907FAE7401F0907FAC740323 :0E0E1D00F0907FAD7401F0759852752000784A :070E2B00E1E2A2E09208924F :0D0E32000190C008E520F090C00C74FFF0A6 :0C0E3F00F56090C00DE4F0F56190C00A71 :080E4B00741FF0F55F78F090D0 :0E0E53000D54E26006F0A3A30880F7E8241116 :060E610025E0900D52F0A7 :0C0E670075488078E0E2B40202804EB4CE :0E0E73000302804924F8500B24F04003E28073 :0E0E810006741880027408FA7B117CC07D5D37 :0E0E8F007E00C3EE9A4001FEB3EC33FCED335F :0E0E9D00FDEE33FEDBEEECC39402FCED9400A0 :0E0EAB00FD90C002F0EC90C001F0C39408F579 :080EB90046ED9400F547EAF54F :060EC10049900D0AF090BB :030EC7000D13F018 :0C0ECA00E4F56278637A04F608DAFC9024 :0E0ED600D120A3E582458370F9907FD6740A7F :0E0EE400F07A1E90E890A3E582458370F9DA5B :0A0EF200F4907FD67406F0120A1384 :0E0EFC00907FD8E0FAE0B5020280FA90C001C3 :0E0F0A00E024FC543F6007FA90C000E0DAFDDE :0E0F180090C002E024FC543F60F6FA90C00046 :040F2600E4F0DAFD1C :0D0F2A00907FAB7402F0907FAE7403F01264 :050F37000A130201573E :07015700E54CA2E0920092CA :05015E0002B3820892CB :0A0163000190C008E520F0020157EA :0E016D00C0E0C0F0C082C083C0D075D000C01A :0E017B0086758600C289D086D0D0D083D0820F :05018900D0F0D0E032CF :0E018E00C0E0C0F0C082C083C0D075D000C0F9 :0E019C0086758600C28DD086D0D0D083D082EA :0501AA00D0F0D0E032AE :0E01AF00C0E0C0F0C082C083C0D075D000C0D8 :0E01BD0086758600C28BD086D0D0D083D082CB :0501CB00D0F0D0E0328D :0E01D000C0E0C0F0C082C083C0D075D000C0B7 :0E01DE0086758600C28FD086D0D0D083D082A6 :0501EC00D0F0D0E0326C :0E01F100C0E0C0F0C082C083C0D075D000C096 :0E01FF0086758600C00010981610990FD0006B :0E020D00D086D0D0D083D082D0F0D0E032D2D4 :06021B000980EAE55D2404 :0B0221004DF8E599F6E55D04540FF57B :03022C005D80DC16 :0E022F00C0E0C0F0C082C083C0D075D000C057 :0E023D0086758600C2CFD086D0D0D083D08206 :05024B00D0F0D0E0320C :0E025000C0E0C0F0C082C083C0D075D000C036 :0E025E0086758600C2DCD086D0D0D083D082D8 :05026C00D0F0D0E032EB :0E027100C0E0C0F0C082C083C0D075D000C015 :0E027F0086758600C2C0C2C1D086D0D0D083A2 :07028D00D082D0F0D0E03276 :0E029400C0E0C0F0C082C083C0D075D000C0F2 :0E02A20086758600E591C2E5F591D086D0D034 :0902B000D083D082D0F0D0E032FE :0E02B900C0E0C0F0C082C083C0D075D000C0CD :0E02C70086758600E591C2E6F591D086D0D00E :0902D500D083D082D0F0D0E032D9 :0E02DE00C0E0C0F0C082C083C0D075D000C0A8 :0E02EC0086758600E591C2E7F591D086D0D0E8 :0902FA00D083D082D0F0D0E032B4 :0E030300C0E0C0F0C082C083C0D075D000C082 :0E03110086758600C2DBD086D0D0D083D08225 :05031F00D0F0D0E03237 :0E032400C0E0C0F0C082C083C084C085C0D0DD :0E03320075D000C086758600C000C007E5913A :0D034000C2E4F591907FAB7401F0754000B0 :0E034D00907FE9E0B40659907FE8E0B4804F5D :0D035B00907FEBE0B4010C907FD4740CF0A7 :06036800A374CBF0803904 :0D036E00B40212907FEAE07033907FD474E7 :08037B000CF0A374DDF08024F6 :0E038300B40324907FEAE024FC401CE025E057 :0C0391002418F582E4340DF583E0F5F04B :0A039D00A3E0907FD4F0A3E5F0F098 :0303A7000207B793 :0303AA000207B394 :0E03AD00B40941907FE8E070F4907FEAE0240C :0603BB00FE40ECE0F562DB :0E03C100907FD77807E84410F04430F0E8F061 :0E03CF004420F0D8F2E4F07402907FB6780774 :0E03DD00F0A3A3D8FB907FC67807F0A3A3D8A7 :0603EB00FB120A1380B6AC :0D03F100B40B1E907FE8E0B401AFE562B4EC :0D03FE0001AA907FECE024FC40A22467F8E7 :07040B00907FEAE0F680AFEC :0D041200B40A24907FE8E0B4818EE562B466 :0D041F000189907FECE024FC40812467F807 :01042C00E6E9 :0C042D00907F00F0907FB57401F0804ECD :0D043900B4080B907FE8E0B48047E56280D6 :01044600E6CF :0B0447007044907FE8E0B48011740165 :0E045200907F00F0A3E4F0907FB57402F0807C :010460002675 :06046100B48103E480EB0E :0E046700B48220907FECE0907FC430E70390D9 :0E0475007FB4540F600F20E30C25E02582F5C4 :0404830082E080CBC8 :030487000207B7B2 :03048A000207B3B3 :08048D00B4030575F0018006BF :06049500B4014475F00003 :0E049B00907FE8E0B402E8A3A3E070E3A3E0E2 :0E04A90070DFA3E0907FC430E705907FB4447D :0E04B7001020E3CF541F0586907FD7F044201D :0E04C500F0540FF0158625E02582F582E5F053 :0304D300F080B105 :0304D60002056EAE :0304D9000207B364 :0D04DC00B4C0F7907FE8E0B4C0F3E54CF544 :0E04E900F0A2E092F290C009E0A2E0B392F31C :0D04F700A20992F5E4907F04F0907F00E5EB :0E050400F0F0E4907F01F0907F02F090C004D0 :0C051200E0907F03F00544E544907F0575 :0E051E00F0E4A3F0A3F0A3F0A3F0A3F0A3F089 :0D052C00A3F0A3F0A3F0A3F0A3F0A3F090C0 :0E053900C001E0907F12F090C002E0907F13AE :0E054700F0E520A3F090C009E0907F15F09041 :0E0555007FC8E0907F16F0907FEEE024E95022 :0B05630001E42417907FB5F00207B7F9 :0D056E00B4C819907FE8E0B4C00F74049089 :0C057B007F00F0907FB57401F00207B71C :030587000207B3B5 :0E058A00B4C921907FE8E0B4C017907F0078DC :0D059800F0E26005F008A380F8E824109060 :0605A5007FB5F00207B76C :0305AB000207B391 :0E05AE00B4D045907FE8E0B4C03B907FECE015 :0B05BC00B40108907FEAE05401F54C08 :0D05C700907F00E54CF090C009E054016405 :0E05D40001907F01F090C004E0907F02F09053 :0E05E2007FEEE024FD5001E42403907FB5F08D :0305F0000207B748 :0305F3000207B349 :0E05F600B4D220907FE8E0B44016907FEAE097 :0E060400F5F0907F98E0A2F092E3A2F192E56B :04061200F00207B734 :030616000207B325 :0E061900B4D316907FE8E0B44007907FEAE08B :03062700100903B4 :03062A000207B311 :05062D00F5990207B77A :0E063200B4D449907FE8E0B4C03F907FECE084 :0D064000907FEAB40109E090C00DF0F56173 :0D064D00800AB40207E090C00CF0F5609048 :0C065A00C00EE0907F00F0E561A3F0E529 :0D06660060A3F0907FEEE024FD5001E4243D :0806730003907FB5F00207B708 :03067B000207B3C0 :0E067E00B4D53F907FE8E0B4C032907FECE04E :0D068C00B4010A907FEAE090C00AF0F55F2B :0C06990090C00BE0907F00F0E55FA390A4 :0E06A5007F01F0907FEEE024FE5001E424027D :0706B300907FB5F00207B7CC :0306BA000207B381 :0306BD00020753DE :0E06C000B4E0FA907FE8E0B4C0F0907FECE088 :0E06CE00B40112907FEAE05478C5205407452D :0E06DC0020F52090C008F0907FEEE0600DB495 :0D06EA000111E520907F00547FF074019015 :0D06F7007FB5F00207B790C008D207E520DC :0E070400F090C005E0907F04F090C006E090F9 :0E0712007F05F090C007E0907F06F090C008D1 :0D072000C207E520F0907F00F090C005E0DA :0D072D00907F01F090C006E0907F02F090F8 :0E073A00C007E0907F03F0907FEEE024F950BE :0B07480001E42407907FB5F00207B722 :0E075300B4E13A907FE8E0B4C030907F00E55A :0807610045F0A3E549F0A3E512 :0807690046F0A3E547F0A3E50B :0807710048F0A3E54AF0A3E5FE :0D0779004BF0907FEEE024F95001E42407DE :07078600907FB5F00207B7F8 :03078D000207B3AD :0E079000B4E220907FE8E0B4C016907F0078BD :0C079E0080AF49E6F008A3DFFA907FB5B9 :0607AA00E549F00207B76B :0307B0000207B38A :0407B3007403800249 :0207B7007402CA :0407B900907FB4F089 :0E07BD00D007D000D086D0D0D085D084D08395 :0707CB00D082D0F0D0E03233 :0E07D200C0E0C0F0C082C083C084C085C0D02B :0E07E00075D000C086758600C002C003C00040 :0D07EE00E591C2E4F591907FAB7402F00537 :0C07FB0045E549B40214907FD8E0A30546 :0E08070086907F68F01586E00586F0020905F0 :0E081500B40336907FA0E020E023907F70E0D7 :0E082300701D907F71E0B40316FA907F60059F :0E08310086907F681586E00586F01586DAF859 :0D083F000209057A03907F68E4F0DAFD02FB :02084C0009059C :0C084E0090C001E0C39549E04002E5497C :0E085A00FAFB601290C0000586907F6815863C :0D086800E00586F01586DAF8E549C39B60CF :0E08750008FA907F68E4F0DAFD90C001E0F52B :0C0883004A24FC60053395E0D2E0FB2520 :06088F00486002F548E597 :0C0895004803030303540F2B2546FAE52B :0D08A10047340090C002F0EA90C001F090D2 :0D08AE007FA0E020E039907F70E070339073 :0D08BB007F71E0C39549702A90C002E0F5FE :0508C8004BC39549E55A :0C08CD004B4002E5496017FA907F60057F :0D08D9008690C00015867880E00586F01539 :0D08E60086F608DAF6801890C002E0F54BA7 :0D08F30024FC543F600CFA90C000E47880B3 :05090000F0F608DAFB2F :0E090500D000D003D002D086D0D0D085D084D0 :09091300D083D082D0F0D0E03294 :0E091C00C0E0C0F0C082C083C0D075D000C063 :0E092A0086758600E591C2E4F591907FAB746E :0E09380004F0D086D0D0D083D082D0F0D0E0B2 :01094600327E :0E094700C0E0C0F0C082C083C0D075D000C038 :0E09550086758600E591C2E4F591907FAB7443 :0E09630008F0D086D0D0D083D082D0F0D0E083 :010971003253 :0E097200C0E0C0F0C082C083C0D075D000C00D :0E09800086758600E591C2E4F591907FAB7418 :0E098E0010F0D086D0D0D083D082D0F0D0E050 :01099C003228 :0E099D00C0E0C0F0C082C083C084C085C0D05E :0E09AB0075D000C086758600C000C007E591BB :0E09B900C2E4F591907FA97401F0D007D00040 :0E09C700D086D0D0D085D084D083D082D0F01E :0309D500D0E0323D :0E09D800C0E0C0F0C082C083C084C085C0D023 :0E09E60075D000C086758600C000C006E59181 :0E09F400C2E4F591907FAA7401F0D006D00005 :0E0A0200D086D0D0D085D084D083D082D0F0E2 :030A1000D0E03201 :0D0A1300E54CF5F0A2E092F290C009E0A2DF :0D0A2000E092F3A20992F5907E80E5F0F0DF :0D0A2D00E545907E81F0907FE0E0907E82B4 :0C0A3A00F090C004E0907E83F00544E5DD :0C0A460044907E84F075F005907E85E5FC :0C0A52005EB55D07907FB7E5F0F0222450 :0C0A5E004DF8E6F0A305F0E55E04540F2F :040A6A00F55E80E3D2 :0E0A6E00C0E0C0F0C082C083C0D075D000C010 :0E0A7C0086758600E591C2E4F591907FA9741D :0E0A8A0002F0120A13D086D0D0D083D082D0D2 :040A9800F0D0E03288 :0E0A9C00C0E0C0F0C082C083C0D075D000C0E2 :0E0AAA0086758600E591C2E4F591907FAA74EE :0E0AB80002F0D086D0D0D083D082D0F0D0E033 :010AC60032FD :0E0AC700C0E0C0F0C082C083C0D075D000C0B7 :0E0AD50086758600E591C2E4F591907FA974C4 :0E0AE30004F0D086D0D0D083D082D0F0D0E006 :010AF10032D2 :0E0AF200C0E0C0F0C082C083C0D075D000C08C :0E0B000086758600E591C2E4F591907FAA7497 :0E0B0E0004F0D086D0D0D083D082D0F0D0E0DA :010B1C0032A6 :0E0B1D00C0E0C0F0C082C083C0D075D000C060 :0E0B2B0086758600E591C2E4F591907FA9746D :0E0B390008F0D086D0D0D083D082D0F0D0E0AB :010B4700327B :0E0B4800C0E0C0F0C082C083C0D075D000C035 :0E0B560086758600E591C2E4F591907FAA7441 :0E0B640008F0D086D0D0D083D082D0F0D0E080 :010B72003250 :0E0B7300C0E0C0F0C082C083C0D075D000C00A :0E0B810086758600E591C2E4F591907FA97417 :0E0B8F0010F0D086D0D0D083D082D0F0D0E04D :010B9D003225 :0E0B9E00C0E0C0F0C082C083C0D075D000C0DF :0E0BAC0086758600E591C2E4F591907FAA74EB :0E0BBA0010F0D086D0D0D083D082D0F0D0E022 :010BC80032FA :0E0BC900C0E0C0F0C082C083C0D075D000C0B4 :0E0BD70086758600E591C2E4F591907FA974C1 :0E0BE50020F0D086D0D0D083D082D0F0D0E0E7 :010BF30032CF :0E0BF400C0E0C0F0C082C083C0D075D000C089 :0E0C020086758600E591C2E4F591907FAA7494 :0E0C100020F0D086D0D0D083D082D0F0D0E0BB :010C1E0032A3 :0E0C1F00C0E0C0F0C082C083C0D075D000C05D :0E0C2D0086758600E591C2E4F591907FA9746A :0E0C3B0040F0D086D0D0D083D082D0F0D0E070 :010C49003278 :0E0C4A00C0E0C0F0C082C083C0D075D000C032 :0E0C580086758600E591C2E4F591907FAA743E :0E0C660040F0D086D0D0D083D082D0F0D0E045 :010C7400324D :0E0C7500C0E0C0F0C082C083C0D075D000C007 :0E0C830086758600E591C2E4F591907FA97414 :0E0C910080F0D086D0D0D083D082D0F0D0E0DA :010C9F003222 :0E0CA000C0E0C0F0C082C083C0D075D000C0DC :0E0CAE0086758600E591C2E4F591907FAA74E8 :0E0CBC0080F0D086D0D0D083D082D0F0D0E0AF :010CCA0032F7 :0E0CCB0012010001FF00FF40C0BA37610100B6 :040CD9000102030110 :0E0CDD0009023B000101004000090400000173 :0E0CEB00FF00FF000705810240000009040021 :0E0CF9000103FF00FF0007058103400008090A :030D07000588015B :090D0A00020001000009050801C6 :050D13000200010000D8 :020D1800200DAC :020D1A00240DA6 :020D1C00320D96 :020D1E00520D74 :040D200004030000C8 :0E0D24000E0342006100790063006F006D0055 :0E0D3200200355005300420046004C004500CF :0E0D4000580020002800410075006400690082 :040D4E006F00290009 :0E0D520002030000000000000000000000008E :0E0D6000000000000000000000000000000085 :060D6E000000000000007F :00000001FF baycomusb-0.10.orig/firmware/audio2firmware/main.rel0100644000175100017510000006237107337536151020617 0ustar abaabaXH H A areas 1 global symbols M main A _CODE size 0 flags 0 A CODE size 157 flags 20 A CSEG size C1D flags 20 S fillusbintr Def08BC A GSINIT size 8 flags 20 A GSINIT2 size 1C0 flags 20 A OSEG size 0 flags 4 A BSEG size A flags 80 A ISEG size 80 flags 0 A DSEG size 27 flags 0 A XSEG size 1 flags 0 T 00 00 02 00 00 02 00 16 R 00 00 00 01 00 03 00 03 00 06 00 02 T 00 06 R 00 00 00 01 T 00 0B 02 00 37 R 00 00 00 01 00 03 00 02 T 00 0E R 00 00 00 01 T 00 13 02 00 58 R 00 00 00 01 00 03 00 02 T 00 16 R 00 00 00 01 T 00 1B 02 00 79 R 00 00 00 01 00 03 00 02 T 00 1E R 00 00 00 01 T 00 23 02 00 9A R 00 00 00 01 00 03 00 02 T 00 26 R 00 00 00 01 T 00 2B 02 00 D8 R 00 00 00 01 00 03 00 02 T 00 2E R 00 00 00 01 T 00 33 02 00 F9 R 00 00 00 01 00 03 00 02 T 00 36 R 00 00 00 01 T 00 3B 02 01 1A R 00 00 00 01 00 03 00 02 T 00 3E R 00 00 00 01 T 00 43 02 01 00 R 00 00 00 01 00 03 00 01 T 00 46 R 00 00 00 01 T 00 4B 02 01 3D R 00 00 00 01 00 03 00 02 T 00 4E R 00 00 00 01 T 00 53 02 01 62 R 00 00 00 01 00 03 00 02 T 00 56 R 00 00 00 01 T 00 5B 02 01 87 R 00 00 00 01 00 03 00 02 T 00 5E R 00 00 00 01 T 00 63 02 01 AC R 00 00 00 01 00 03 00 02 T 00 66 R 00 00 00 01 T 00 E0 08 01 R 00 00 00 01 T 00 E2 R 00 00 00 01 T 00 F0 R 00 00 00 01 T 00 F0 30 30 30 30 30 30 30 30 00 R 00 00 00 01 T 00 F9 R 00 00 00 01 T 01 00 R 00 00 00 01 T 01 00 02 01 CD R 00 00 00 01 00 03 00 02 T 01 03 R 00 00 00 01 T 01 04 02 06 7B R 00 00 00 01 00 03 00 02 T 01 07 R 00 00 00 01 T 01 08 02 07 C5 R 00 00 00 01 00 03 00 02 T 01 0B R 00 00 00 01 T 01 0C 02 07 F0 R 00 00 00 01 00 03 00 02 T 01 0F R 00 00 00 01 T 01 10 02 08 1B R 00 00 00 01 00 03 00 02 T 01 13 R 00 00 00 01 T 01 14 32 R 00 00 00 01 T 01 15 R 00 00 00 01 T 01 18 02 08 46 R 00 00 00 01 00 03 00 02 T 01 1B R 00 00 00 01 T 01 1C 02 08 81 R 00 00 00 01 00 03 00 02 T 01 1F R 00 00 00 01 T 01 20 02 09 17 R 00 00 00 01 00 03 00 02 T 01 23 R 00 00 00 01 T 01 24 02 09 45 R 00 00 00 01 00 03 00 02 T 01 27 R 00 00 00 01 T 01 28 02 09 70 R 00 00 00 01 00 03 00 02 T 01 2B R 00 00 00 01 T 01 2C 02 09 9B R 00 00 00 01 00 03 00 02 T 01 2F R 00 00 00 01 T 01 30 02 09 C6 R 00 00 00 01 00 03 00 02 T 01 33 R 00 00 00 01 T 01 34 02 09 F1 R 00 00 00 01 00 03 00 02 T 01 37 R 00 00 00 01 T 01 38 02 0A 1C R 00 00 00 01 00 03 00 02 T 01 3B R 00 00 00 01 T 01 3C 02 0A 47 R 00 00 00 01 00 03 00 02 T 01 3F R 00 00 00 01 T 01 40 02 0A 72 R 00 00 00 01 00 03 00 02 T 01 43 R 00 00 00 01 T 01 44 02 0A 9D R 00 00 00 01 00 03 00 02 T 01 47 R 00 00 00 01 T 01 48 02 0A C8 R 00 00 00 01 00 03 00 02 T 01 4B R 00 00 00 01 T 01 4C 02 0A F3 R 00 00 00 01 00 03 00 02 T 01 4F R 00 00 00 01 T 01 50 02 0B 1E R 00 00 00 01 00 03 00 02 T 01 53 R 00 00 00 01 T 01 54 02 0B 49 R 00 00 00 01 00 03 00 02 T 00 00 R 00 00 00 06 T 00 01 R 00 00 00 06 T 00 02 R 00 00 00 06 T 00 03 R 00 00 00 06 T 00 04 R 00 00 00 06 T 00 05 R 00 00 00 06 T 00 06 R 00 00 00 06 T 00 07 R 00 00 00 06 T 00 08 R 00 00 00 06 T 00 09 R 00 00 00 06 T 00 00 R 00 00 00 07 T 00 40 R 00 00 00 07 T 00 00 R 00 00 00 08 T 00 01 R 00 00 00 08 T 00 03 R 00 00 00 08 T 00 04 R 00 00 00 08 T 00 05 R 00 00 00 08 T 00 06 R 00 00 00 08 T 00 08 R 00 00 00 08 T 00 09 R 00 00 00 08 T 00 0A R 00 00 00 08 T 00 0B R 00 00 00 08 T 00 0C R 00 00 00 08 T 00 0D R 00 00 00 08 T 00 1D R 00 00 00 08 T 00 1E R 00 00 00 08 T 00 1F R 00 00 00 08 T 00 20 R 00 00 00 08 T 00 21 R 00 00 00 08 T 00 22 R 00 00 00 08 T 00 23 R 00 00 00 08 T 00 00 R 00 00 00 09 T 00 00 R 00 00 00 03 T 00 00 75 81 00 40 E4 F5 D0 F5 86 R 00 00 00 03 09 04 00 07 T 00 08 R 00 00 00 03 T 00 00 R 00 00 00 04 T 00 00 E4 F5 00 04 F5 00 05 F5 R 00 00 00 04 29 04 00 08 29 07 00 08 T 00 06 00 0C F5 00 1E F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 0A 00 1D F5 86 D2 00 09 75 8E 30 75 89 21 75 R 00 00 00 04 29 02 00 08 29 07 00 06 T 00 16 88 55 75 8D 64 75 87 00 74 00 90 7F F8 F0 R 00 00 00 04 T 00 24 74 04 90 7F F0 F0 90 7F A1 E4 F0 90 7F AF R 00 00 00 04 T 00 32 74 01 F0 74 01 90 7F E0 F0 90 7F E1 F0 90 R 00 00 00 04 T 00 40 7F DD 74 89 F0 90 7F DE 74 03 F0 90 7F DF R 00 00 00 04 T 00 4E 74 01 F0 90 7F D7 74 12 F0 74 32 F0 74 02 R 00 00 00 04 T 00 5C F0 74 22 F0 90 7F 93 74 00 F0 90 7F 96 74 R 00 00 00 04 T 00 6A 82 F0 90 7F 9C 74 C2 F0 90 7F 94 74 00 F0 R 00 00 00 04 T 00 78 90 7F 9D 74 00 F0 90 7F 95 74 C3 F0 90 R 00 00 00 04 T 00 85 7F 98 74 28 F0 90 7F 9E 74 2A F0 75 A8 92 R 00 00 00 04 T 00 93 75 E8 01 90 7F AE 74 01 F0 90 7F AC 74 03 R 00 00 00 04 T 00 A1 F0 90 7F AD 74 01 F0 75 98 52 75 20 00 78 R 00 00 00 04 T 00 AF 00 E1 E2 A2 E0 92 00 08 92 R 00 00 00 04 09 02 00 01 29 08 00 06 T 00 B6 00 01 90 C0 08 E5 20 F0 90 C0 0C 74 FF F0 R 00 00 00 04 29 02 00 06 T 00 C3 F5 00 20 90 C0 0D E4 F0 F5 00 21 90 C0 0A R 00 00 00 04 29 03 00 08 29 0B 00 08 T 00 CF 74 1F F0 F5 00 1F 78 00 F0 90 R 00 00 00 04 29 06 00 08 09 09 00 01 T 00 D7 0B FD E2 60 06 F0 A3 A3 08 80 F7 E8 24 11 R 00 00 00 04 00 02 00 02 T 00 E5 25 E0 90 0B FB F0 R 00 00 00 04 00 05 00 02 T 00 EB R 00 00 00 04 T 00 EB 75 00 08 80 78 00 E0 E2 B4 02 02 80 4E B4 R 00 00 00 04 29 03 00 08 09 07 00 01 T 00 F7 03 02 80 49 24 F8 50 0B 24 F0 40 03 E2 80 R 00 00 00 04 T 01 05 06 74 18 80 02 74 08 FA 7B 11 7C C0 7D 5D R 00 00 00 04 T 01 13 7E 00 C3 EE 9A 40 01 FE B3 EC 33 FC ED 33 R 00 00 00 04 T 01 21 FD EE 33 FE DB EE EC C3 94 02 FC ED 94 00 R 00 00 00 04 T 01 2F FD 90 C0 02 F0 EC 90 C0 01 F0 C3 94 08 F5 R 00 00 00 04 T 01 3D 00 06 ED 94 00 F5 00 07 EA F5 R 00 00 00 04 29 02 00 08 29 08 00 08 T 01 45 00 09 90 0B B3 F0 90 R 00 00 00 04 29 02 00 08 00 05 00 02 T 01 4B 0B BC F0 R 00 00 00 04 00 02 00 02 T 01 4E R 00 00 00 04 T 01 4E E4 F5 00 22 78 00 23 7A 04 F6 08 DA FC 90 R 00 00 00 04 29 04 00 08 09 07 00 08 T 01 5A D1 20 A3 E5 82 45 83 70 F9 90 7F D6 74 0A R 00 00 00 04 T 01 68 F0 7A 1E 90 E8 90 A3 E5 82 45 83 70 F9 DA R 00 00 00 04 T 01 76 F4 90 7F D6 74 06 F0 12 08 BC R 00 00 00 04 00 0A 00 02 T 01 80 R 00 00 00 04 T 01 80 90 7F D8 E0 FA E0 B5 02 02 80 FA 90 C0 01 R 00 00 00 04 T 01 8E E0 24 FC 54 3F 60 07 FA 90 C0 00 E0 DA FD R 00 00 00 04 T 01 9C 90 C0 02 E0 24 FC 54 3F 60 F6 FA 90 C0 00 R 00 00 00 04 T 01 AA E4 F0 DA FD R 00 00 00 04 T 01 AE R 00 00 00 04 T 01 AE 90 7F AB 74 02 F0 90 7F AE 74 03 F0 12 R 00 00 00 04 T 01 BB 08 BC 02 00 00 R 00 00 00 04 00 02 00 02 00 05 00 02 T 00 00 R 00 00 00 02 T 00 00 E5 00 0C A2 E0 92 00 00 92 R 00 00 00 02 29 03 00 08 29 08 00 06 T 00 07 00 02 B3 82 00 08 92 R 00 00 00 02 29 02 00 06 29 06 00 06 T 00 0C 00 01 90 C0 08 E5 20 F0 02 00 00 R 00 00 00 02 29 02 00 06 00 0B 00 02 T 00 16 R 00 00 00 02 T 00 16 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 24 86 75 86 00 C2 89 D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 32 D0 F0 D0 E0 32 R 00 00 00 02 T 00 37 R 00 00 00 02 T 00 37 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 45 86 75 86 00 C2 8D D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 53 D0 F0 D0 E0 32 R 00 00 00 02 T 00 58 R 00 00 00 02 T 00 58 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 66 86 75 86 00 C2 8B D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 74 D0 F0 D0 E0 32 R 00 00 00 02 T 00 79 R 00 00 00 02 T 00 79 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 87 86 75 86 00 C2 8F D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 95 D0 F0 D0 E0 32 R 00 00 00 02 T 00 9A R 00 00 00 02 T 00 9A C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 A8 86 75 86 00 C0 00 10 98 16 10 99 0F D0 00 R 00 00 00 02 T 00 B6 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 32 D2 R 00 00 00 02 T 00 C4 00 09 80 EA E5 00 1D 24 R 00 00 00 02 29 02 00 06 29 07 00 08 T 00 CA 00 0D F8 E5 99 F6 E5 00 1D 04 54 0F F5 R 00 00 00 02 09 02 00 08 29 09 00 08 T 00 D5 00 1D 80 DC R 00 00 00 02 29 02 00 08 T 00 D8 R 00 00 00 02 T 00 D8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 E6 86 75 86 00 C2 CF D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 F4 D0 F0 D0 E0 32 R 00 00 00 02 T 00 F9 R 00 00 00 02 T 00 F9 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 07 86 75 86 00 C2 DC D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 15 D0 F0 D0 E0 32 R 00 00 00 02 T 01 1A R 00 00 00 02 T 01 1A C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 28 86 75 86 00 C2 C0 C2 C1 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 36 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 3D R 00 00 00 02 T 01 3D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 4B 86 75 86 00 E5 91 C2 E5 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 59 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 62 R 00 00 00 02 T 01 62 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 70 86 75 86 00 E5 91 C2 E6 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 7E D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 87 R 00 00 00 02 T 01 87 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 95 86 75 86 00 E5 91 C2 E7 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 A3 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 AC R 00 00 00 02 T 01 AC C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 BA 86 75 86 00 C2 DB D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 C8 D0 F0 D0 E0 32 R 00 00 00 02 T 01 CD R 00 00 00 02 T 01 CD C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 01 DB 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 01 E9 C2 E4 F5 91 90 7F AB 74 01 F0 75 00 00 00 R 00 00 00 02 29 0D 00 08 T 01 F6 90 7F E9 E0 B4 06 59 90 7F E8 E0 B4 80 4F R 00 00 00 02 T 02 04 90 7F EB E0 B4 01 0C 90 7F D4 74 0B 74 F0 R 00 00 00 02 89 0D 00 02 T 02 11 A3 74 0B 74 F0 80 39 R 00 00 00 02 09 04 00 02 T 02 17 R 00 00 00 02 T 02 17 B4 02 12 90 7F EA E0 70 33 90 7F D4 74 R 00 00 00 02 T 02 24 0B 86 F0 A3 74 0B 86 F0 80 24 R 00 00 00 02 89 02 00 02 09 07 00 02 T 02 2C R 00 00 00 02 T 02 2C B4 03 24 90 7F EA E0 24 FC 40 1C E0 25 E0 R 00 00 00 02 T 02 3A 24 0B C1 F5 82 E4 34 0B C1 F5 83 E0 F5 F0 R 00 00 00 02 09 03 00 02 89 09 00 02 T 02 46 A3 E0 90 7F D4 F0 A3 E5 F0 F0 R 00 00 00 02 T 02 50 R 00 00 00 02 T 02 50 02 06 60 R 00 00 00 02 00 03 00 02 T 02 53 R 00 00 00 02 T 02 53 02 06 5C R 00 00 00 02 00 03 00 02 T 02 56 R 00 00 00 02 T 02 56 B4 09 41 90 7F E8 E0 70 F4 90 7F EA E0 24 R 00 00 00 02 T 02 64 FE 40 EC E0 F5 00 22 R 00 00 00 02 29 07 00 08 T 02 6A R 00 00 00 02 T 02 6A 90 7F D7 78 07 E8 44 10 F0 44 30 F0 E8 F0 R 00 00 00 02 T 02 78 44 20 F0 D8 F2 E4 F0 74 02 90 7F B6 78 07 R 00 00 00 02 T 02 86 F0 A3 A3 D8 FB 90 7F C6 78 07 F0 A3 A3 D8 R 00 00 00 02 T 02 94 FB 12 08 BC 80 B6 R 00 00 00 02 00 04 00 02 T 02 9A R 00 00 00 02 T 02 9A B4 0B 1E 90 7F E8 E0 B4 01 AF E5 00 22 B4 R 00 00 00 02 29 0D 00 08 T 02 A7 01 AA 90 7F EC E0 24 FC 40 A2 24 00 27 F8 R 00 00 00 02 09 0D 00 08 T 02 B4 90 7F EA E0 F6 80 AF R 00 00 00 02 T 02 BB R 00 00 00 02 T 02 BB B4 0A 24 90 7F E8 E0 B4 81 8E E5 00 22 B4 R 00 00 00 02 29 0D 00 08 T 02 C8 01 89 90 7F EC E0 24 FC 40 81 24 00 27 F8 R 00 00 00 02 09 0D 00 08 T 02 D5 E6 R 00 00 00 02 T 02 D6 R 00 00 00 02 T 02 D6 90 7F 00 F0 90 7F B5 74 01 F0 80 4E R 00 00 00 02 T 02 E2 R 00 00 00 02 T 02 E2 B4 08 0B 90 7F E8 E0 B4 80 47 E5 00 22 80 R 00 00 00 02 29 0D 00 08 T 02 EF E6 R 00 00 00 02 T 02 F0 R 00 00 00 02 T 02 F0 70 44 90 7F E8 E0 B4 80 11 74 01 R 00 00 00 02 T 02 FB R 00 00 00 02 T 02 FB 90 7F 00 F0 A3 E4 F0 90 7F B5 74 02 F0 80 R 00 00 00 02 T 03 09 26 R 00 00 00 02 T 03 0A R 00 00 00 02 T 03 0A B4 81 03 E4 80 EB R 00 00 00 02 T 03 10 R 00 00 00 02 T 03 10 B4 82 20 90 7F EC E0 90 7F C4 30 E7 03 90 R 00 00 00 02 T 03 1E 7F B4 54 0F 60 0F 20 E3 0C 25 E0 25 82 F5 R 00 00 00 02 T 03 2C 82 E0 80 CB R 00 00 00 02 T 03 30 R 00 00 00 02 T 03 30 02 06 60 R 00 00 00 02 00 03 00 02 T 03 33 R 00 00 00 02 T 03 33 02 06 5C R 00 00 00 02 00 03 00 02 T 03 36 R 00 00 00 02 T 03 36 B4 03 05 75 F0 01 80 06 R 00 00 00 02 T 03 3E R 00 00 00 02 T 03 3E B4 01 44 75 F0 00 R 00 00 00 02 T 03 44 R 00 00 00 02 T 03 44 90 7F E8 E0 B4 02 E8 A3 A3 E0 70 E3 A3 E0 R 00 00 00 02 T 03 52 70 DF A3 E0 90 7F C4 30 E7 05 90 7F B4 44 R 00 00 00 02 T 03 60 10 20 E3 CF 54 1F 05 86 90 7F D7 F0 44 20 R 00 00 00 02 T 03 6E F0 54 0F F0 15 86 25 E0 25 82 F5 82 E5 F0 R 00 00 00 02 T 03 7C F0 80 B1 R 00 00 00 02 T 03 7F R 00 00 00 02 T 03 7F 02 04 17 R 00 00 00 02 00 03 00 02 T 03 82 R 00 00 00 02 T 03 82 02 06 5C R 00 00 00 02 00 03 00 02 T 03 85 R 00 00 00 02 T 03 85 B4 C0 F7 90 7F E8 E0 B4 C0 F3 E5 00 0C F5 R 00 00 00 02 29 0D 00 08 T 03 92 F0 A2 E0 92 F2 90 C0 09 E0 A2 E0 B3 92 F3 R 00 00 00 02 T 03 A0 A2 00 09 92 F5 E4 90 7F 04 F0 90 7F 00 E5 R 00 00 00 02 29 03 00 06 T 03 AD F0 F0 E4 90 7F 01 F0 90 7F 02 F0 90 C0 04 R 00 00 00 02 T 03 BB E0 90 7F 03 F0 05 00 04 E5 00 04 90 7F 05 R 00 00 00 02 29 08 00 08 29 0B 00 08 T 03 C7 F0 E4 A3 F0 A3 F0 A3 F0 A3 F0 A3 F0 A3 F0 R 00 00 00 02 T 03 D5 A3 F0 A3 F0 A3 F0 A3 F0 A3 F0 A3 F0 90 R 00 00 00 02 T 03 E2 C0 01 E0 90 7F 12 F0 90 C0 02 E0 90 7F 13 R 00 00 00 02 T 03 F0 F0 E5 20 A3 F0 90 C0 09 E0 90 7F 15 F0 90 R 00 00 00 02 T 03 FE 7F C8 E0 90 7F 16 F0 90 7F EE E0 24 E9 50 R 00 00 00 02 T 04 0C 01 E4 24 17 90 7F B5 F0 02 06 60 R 00 00 00 02 00 0B 00 02 T 04 17 R 00 00 00 02 T 04 17 B4 C8 19 90 7F E8 E0 B4 C0 0F 74 04 90 R 00 00 00 02 T 04 24 7F 00 F0 90 7F B5 74 01 F0 02 06 60 R 00 00 00 02 00 0C 00 02 T 04 30 R 00 00 00 02 T 04 30 02 06 5C R 00 00 00 02 00 03 00 02 T 04 33 R 00 00 00 02 T 04 33 B4 C9 21 90 7F E8 E0 B4 C0 17 90 7F 00 78 R 00 00 00 02 T 04 41 00 F0 E2 60 05 F0 08 A3 80 F8 E8 24 10 90 R 00 00 00 02 09 02 00 01 T 04 4E 7F B5 F0 02 06 60 R 00 00 00 02 00 06 00 02 T 04 54 R 00 00 00 02 T 04 54 02 06 5C R 00 00 00 02 00 03 00 02 T 04 57 R 00 00 00 02 T 04 57 B4 D0 45 90 7F E8 E0 B4 C0 3B 90 7F EC E0 R 00 00 00 02 T 04 65 B4 01 08 90 7F EA E0 54 01 F5 00 0C R 00 00 00 02 29 0C 00 08 T 04 70 R 00 00 00 02 T 04 70 90 7F 00 E5 00 0C F0 90 C0 09 E0 54 01 64 R 00 00 00 02 29 06 00 08 T 04 7D 01 90 7F 01 F0 90 C0 04 E0 90 7F 02 F0 90 R 00 00 00 02 T 04 8B 7F EE E0 24 FD 50 01 E4 24 03 90 7F B5 F0 R 00 00 00 02 T 04 99 02 06 60 R 00 00 00 02 00 03 00 02 T 04 9C R 00 00 00 02 T 04 9C 02 06 5C R 00 00 00 02 00 03 00 02 T 04 9F R 00 00 00 02 T 04 9F B4 D2 20 90 7F E8 E0 B4 40 16 90 7F EA E0 R 00 00 00 02 T 04 AD F5 F0 90 7F 98 E0 A2 F0 92 E3 A2 F1 92 E5 R 00 00 00 02 T 04 BB F0 02 06 60 R 00 00 00 02 00 04 00 02 T 04 BF R 00 00 00 02 T 04 BF 02 06 5C R 00 00 00 02 00 03 00 02 T 04 C2 R 00 00 00 02 T 04 C2 B4 D3 16 90 7F E8 E0 B4 40 07 90 7F EA E0 R 00 00 00 02 T 04 D0 10 00 09 03 R 00 00 00 02 29 03 00 06 T 04 D3 R 00 00 00 02 T 04 D3 02 06 5C R 00 00 00 02 00 03 00 02 T 04 D6 R 00 00 00 02 T 04 D6 F5 99 02 06 60 R 00 00 00 02 00 05 00 02 T 04 DB R 00 00 00 02 T 04 DB B4 D4 49 90 7F E8 E0 B4 C0 3F 90 7F EC E0 R 00 00 00 02 T 04 E9 90 7F EA B4 01 09 E0 90 C0 0D F0 F5 00 21 R 00 00 00 02 29 0E 00 08 T 04 F6 80 0A B4 02 07 E0 90 C0 0C F0 F5 00 20 90 R 00 00 00 02 29 0D 00 08 T 05 03 C0 0E E0 90 7F 00 F0 E5 00 21 A3 F0 E5 R 00 00 00 02 29 0A 00 08 T 05 0F 00 20 A3 F0 90 7F EE E0 24 FD 50 01 E4 24 R 00 00 00 02 29 02 00 08 T 05 1C 03 90 7F B5 F0 02 06 60 R 00 00 00 02 00 08 00 02 T 05 24 R 00 00 00 02 T 05 24 02 06 5C R 00 00 00 02 00 03 00 02 T 05 27 R 00 00 00 02 T 05 27 B4 D5 3F 90 7F E8 E0 B4 C0 32 90 7F EC E0 R 00 00 00 02 T 05 35 B4 01 0A 90 7F EA E0 90 C0 0A F0 F5 00 1F R 00 00 00 02 29 0E 00 08 T 05 42 90 C0 0B E0 90 7F 00 F0 E5 00 1F A3 90 R 00 00 00 02 29 0B 00 08 T 05 4E 7F 01 F0 90 7F EE E0 24 FE 50 01 E4 24 02 R 00 00 00 02 T 05 5C 90 7F B5 F0 02 06 60 R 00 00 00 02 00 07 00 02 T 05 63 R 00 00 00 02 T 05 63 R 00 00 00 02 T 05 63 02 06 5C R 00 00 00 02 00 03 00 02 T 05 66 R 00 00 00 02 T 05 66 02 05 FC R 00 00 00 02 00 03 00 02 T 05 69 R 00 00 00 02 T 05 69 B4 E0 FA 90 7F E8 E0 B4 C0 F0 90 7F EC E0 R 00 00 00 02 T 05 77 B4 01 12 90 7F EA E0 54 78 C5 20 54 07 45 R 00 00 00 02 T 05 85 20 F5 20 90 C0 08 F0 90 7F EE E0 60 0D B4 R 00 00 00 02 T 05 93 01 11 E5 20 90 7F 00 54 7F F0 74 01 90 R 00 00 00 02 T 05 A0 7F B5 F0 02 06 60 90 C0 08 D2 00 07 E5 20 R 00 00 00 02 00 06 00 02 29 0C 00 06 T 05 AD F0 90 C0 05 E0 90 7F 04 F0 90 C0 06 E0 90 R 00 00 00 02 T 05 BB 7F 05 F0 90 C0 07 E0 90 7F 06 F0 90 C0 08 R 00 00 00 02 T 05 C9 C2 00 07 E5 20 F0 90 7F 00 F0 90 C0 05 E0 R 00 00 00 02 29 03 00 06 T 05 D6 90 7F 01 F0 90 C0 06 E0 90 7F 02 F0 90 R 00 00 00 02 T 05 E3 C0 07 E0 90 7F 03 F0 90 7F EE E0 24 F9 50 R 00 00 00 02 T 05 F1 01 E4 24 07 90 7F B5 F0 02 06 60 R 00 00 00 02 00 0B 00 02 T 05 FC R 00 00 00 02 T 05 FC B4 E1 3A 90 7F E8 E0 B4 C0 30 90 7F 00 E5 R 00 00 00 02 T 06 0A 00 05 F0 A3 E5 00 09 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 12 00 06 F0 A3 E5 00 07 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 1A 00 08 F0 A3 E5 00 0A F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 22 00 0B F0 90 7F EE E0 24 F9 50 01 E4 24 07 R 00 00 00 02 29 02 00 08 T 06 2F 90 7F B5 F0 02 06 60 R 00 00 00 02 00 07 00 02 T 06 36 R 00 00 00 02 T 06 36 02 06 5C R 00 00 00 02 00 03 00 02 T 06 39 R 00 00 00 02 T 06 39 B4 E2 20 90 7F E8 E0 B4 C0 16 90 7F 00 78 R 00 00 00 02 T 06 47 00 00 AF 00 09 E6 F0 08 A3 DF FA 90 7F B5 R 00 00 00 02 09 02 00 07 29 05 00 08 T 06 53 E5 00 09 F0 02 06 60 R 00 00 00 02 29 03 00 08 00 07 00 02 T 06 59 R 00 00 00 02 T 06 59 02 06 5C R 00 00 00 02 00 03 00 02 T 06 5C R 00 00 00 02 T 06 5C R 00 00 00 02 T 06 5C 74 03 80 02 R 00 00 00 02 T 06 60 R 00 00 00 02 T 06 60 74 02 R 00 00 00 02 T 06 62 R 00 00 00 02 T 06 62 90 7F B4 F0 R 00 00 00 02 T 06 66 R 00 00 00 02 T 06 66 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 06 74 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 06 7B R 00 00 00 02 T 06 7B C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 06 89 75 D0 00 C0 86 75 86 00 C0 02 C0 03 C0 00 R 00 00 00 02 T 06 97 E5 91 C2 E4 F5 91 90 7F AB 74 02 F0 05 R 00 00 00 02 T 06 A4 00 05 E5 00 09 B4 02 14 90 7F D8 E0 A3 05 R 00 00 00 02 29 02 00 08 29 05 00 08 T 06 B0 86 90 7F 68 F0 15 86 E0 05 86 F0 02 07 AE R 00 00 00 02 00 0E 00 02 T 06 BE B4 03 36 90 7F A0 E0 20 E0 23 90 7F 70 E0 R 00 00 00 02 T 06 CC 70 1D 90 7F 71 E0 B4 03 16 FA 90 7F 60 05 R 00 00 00 02 T 06 DA 86 90 7F 68 15 86 E0 05 86 F0 15 86 DA F8 R 00 00 00 02 T 06 E8 02 07 AE 7A 03 90 7F 68 E4 F0 DA FD 02 R 00 00 00 02 00 03 00 02 T 06 F5 07 AE R 00 00 00 02 00 02 00 02 T 06 F7 R 00 00 00 02 T 06 F7 90 C0 01 E0 C3 95 00 09 E0 40 02 E5 00 09 R 00 00 00 02 29 08 00 08 29 0E 00 08 T 07 03 FA FB 60 12 90 C0 00 05 86 90 7F 68 15 86 R 00 00 00 02 T 07 11 E0 05 86 F0 15 86 DA F8 E5 00 09 C3 9B 60 R 00 00 00 02 29 0B 00 08 T 07 1E 08 FA 90 7F 68 E4 F0 DA FD 90 C0 01 E0 F5 R 00 00 00 02 T 07 2C 00 0A 24 FC 60 05 33 95 E0 D2 E0 FB 25 R 00 00 00 02 29 02 00 08 T 07 38 00 08 60 02 F5 00 08 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 07 3E 00 08 03 03 03 03 54 0F 2B 25 00 06 FA E5 R 00 00 00 02 29 02 00 08 29 0C 00 08 T 07 4A 00 07 34 00 90 C0 02 F0 EA 90 C0 01 F0 90 R 00 00 00 02 29 02 00 08 T 07 57 7F A0 E0 20 E0 39 90 7F 70 E0 70 33 90 R 00 00 00 02 T 07 64 7F 71 E0 C3 95 00 09 70 2A 90 C0 02 E0 F5 R 00 00 00 02 29 07 00 08 T 07 71 00 0B C3 95 00 09 E5 R 00 00 00 02 29 02 00 08 29 06 00 08 T 07 76 00 0B 40 02 E5 00 09 60 17 FA 90 7F 60 05 R 00 00 00 02 29 02 00 08 29 07 00 08 T 07 82 86 90 C0 00 15 86 78 00 00 E0 05 86 F0 15 R 00 00 00 02 09 09 00 07 T 07 8F 86 F6 08 DA F6 80 18 90 C0 02 E0 F5 00 0B R 00 00 00 02 29 0E 00 08 T 07 9C 24 FC 54 3F 60 0C FA 90 C0 00 E4 78 00 00 R 00 00 00 02 09 0E 00 07 T 07 A9 F0 F6 08 DA FB R 00 00 00 02 T 07 AE R 00 00 00 02 T 07 AE D0 00 D0 03 D0 02 D0 86 D0 D0 D0 85 D0 84 R 00 00 00 02 T 07 BC D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 07 C5 R 00 00 00 02 T 07 C5 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 D3 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 07 E1 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 EF 32 R 00 00 00 02 T 07 F0 R 00 00 00 02 T 07 F0 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 FE 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 0C 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 1A 32 R 00 00 00 02 T 08 1B R 00 00 00 02 T 08 1B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 29 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 37 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 45 32 R 00 00 00 02 T 08 46 R 00 00 00 02 T 08 46 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 08 54 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 08 62 C2 E4 F5 91 90 7F A9 74 01 F0 D0 07 D0 00 R 00 00 00 02 T 08 70 D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 D0 F0 R 00 00 00 02 T 08 7E D0 E0 32 R 00 00 00 02 T 08 81 R 00 00 00 02 T 08 81 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 08 8F 75 D0 00 C0 86 75 86 00 C0 00 C0 06 E5 91 R 00 00 00 02 T 08 9D C2 E4 F5 91 90 7F AA 74 01 F0 D0 06 D0 00 R 00 00 00 02 T 08 AB D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 D0 F0 R 00 00 00 02 T 08 B9 D0 E0 32 R 00 00 00 02 T 08 BC R 00 00 00 02 T 08 BC E5 00 0C F5 F0 A2 E0 92 F2 90 C0 09 E0 A2 R 00 00 00 02 29 03 00 08 T 08 C9 E0 92 F3 A2 00 09 92 F5 90 7E 80 E5 F0 F0 R 00 00 00 02 29 06 00 06 T 08 D6 E5 00 05 90 7E 81 F0 90 7F E0 E0 90 7E 82 R 00 00 00 02 29 03 00 08 T 08 E3 F0 90 C0 04 E0 90 7E 83 F0 05 00 04 E5 R 00 00 00 02 29 0C 00 08 T 08 EF 00 04 90 7E 84 F0 75 F0 05 90 7E 85 E5 R 00 00 00 02 29 02 00 08 T 08 FB 00 1E B5 00 1D 07 90 7F B7 E5 F0 F0 22 24 R 00 00 00 02 29 02 00 08 29 05 00 08 T 09 07 00 0D F8 E6 F0 A3 05 F0 E5 00 1E 04 54 0F R 00 00 00 02 09 02 00 08 29 0B 00 08 T 09 13 F5 00 1E 80 E3 R 00 00 00 02 29 03 00 08 T 09 17 R 00 00 00 02 T 09 17 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 25 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 33 02 F0 12 08 BC D0 86 D0 D0 D0 83 D0 82 D0 R 00 00 00 02 00 05 00 02 T 09 41 F0 D0 E0 32 R 00 00 00 02 T 09 45 R 00 00 00 02 T 09 45 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 53 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 61 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 6F 32 R 00 00 00 02 T 09 70 R 00 00 00 02 T 09 70 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 7E 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 8C 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 9A 32 R 00 00 00 02 T 09 9B R 00 00 00 02 T 09 9B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 A9 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 B7 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 C5 32 R 00 00 00 02 T 09 C6 R 00 00 00 02 T 09 C6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 D4 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 E2 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 F0 32 R 00 00 00 02 T 09 F1 R 00 00 00 02 T 09 F1 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 FF 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A 0D 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 1B 32 R 00 00 00 02 T 0A 1C R 00 00 00 02 T 0A 1C C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 2A 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A 38 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 46 32 R 00 00 00 02 T 0A 47 R 00 00 00 02 T 0A 47 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 55 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A 63 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 71 32 R 00 00 00 02 T 0A 72 R 00 00 00 02 T 0A 72 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 80 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A 8E 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 9C 32 R 00 00 00 02 T 0A 9D R 00 00 00 02 T 0A 9D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A AB 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A B9 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A C7 32 R 00 00 00 02 T 0A C8 R 00 00 00 02 T 0A C8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A D6 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A E4 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A F2 32 R 00 00 00 02 T 0A F3 R 00 00 00 02 T 0A F3 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 01 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B 0F 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 1D 32 R 00 00 00 02 T 0B 1E R 00 00 00 02 T 0B 1E C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 2C 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0B 3A 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 48 32 R 00 00 00 02 T 0B 49 R 00 00 00 02 T 0B 49 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 57 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B 65 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 73 32 R 00 00 00 02 T 0B 74 R 00 00 00 02 T 0B 74 12 01 00 01 FF 00 FF 40 C0 BA 37 61 01 00 R 00 00 00 02 T 0B 82 01 02 03 01 R 00 00 00 02 T 0B 86 R 00 00 00 02 T 0B 86 09 02 3B 00 01 01 00 40 00 09 04 00 00 01 R 00 00 00 02 T 0B 94 FF 00 FF 00 07 05 81 02 40 00 00 09 04 00 R 00 00 00 02 T 0B A2 01 03 FF 00 FF 00 07 05 81 03 40 00 08 09 R 00 00 00 02 T 0B B0 05 88 01 R 00 00 00 02 T 0B B3 R 00 00 00 02 T 0B B3 02 00 01 00 00 09 05 08 01 R 00 00 00 02 T 0B BC R 00 00 00 02 T 0B BC 02 00 01 00 00 R 00 00 00 02 T 0B C1 R 00 00 00 02 T 0B C1 0B C9 0B C9 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0B C3 0B CD 0B CD R 00 00 00 02 09 02 00 02 89 04 00 02 T 0B C5 0B DB 0B DB R 00 00 00 02 09 02 00 02 89 04 00 02 T 0B C7 0B FB 0B FB R 00 00 00 02 09 02 00 02 89 04 00 02 T 0B C9 R 00 00 00 02 T 0B C9 04 03 00 00 R 00 00 00 02 T 0B CD R 00 00 00 02 T 0B CD 0E 03 42 00 61 00 79 00 63 00 6F 00 6D 00 R 00 00 00 02 T 0B DB R 00 00 00 02 T 0B DB 20 03 55 00 53 00 42 00 46 00 4C 00 45 00 R 00 00 00 02 T 0B E9 58 00 20 00 28 00 41 00 75 00 64 00 69 00 R 00 00 00 02 T 0B F7 6F 00 29 00 R 00 00 00 02 T 0B FB R 00 00 00 02 T 0B FB 02 03 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0C 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0C 17 00 00 00 00 00 00 R 00 00 00 02 baycomusb-0.10.orig/firmware/audio2firmware/main.lst0100644000175100017510000041045307337536151020635 0ustar abaaba 1 .module main 2 3 ;; same as audiofirmware, but do not announce as 4 ;; audio class compliant 5 6 ;; ENDPOINTS 7 ;; EP0 in/out Control 8 ;; EP1 in Interrupt: Status 9 ;; Byte 0: Modem Status 10 ;; Bit 0-1: Transmitter status 11 ;; 0: idle (off) 12 ;; 1: keyup 13 ;; 2: transmitting packets 14 ;; 3: tail 15 ;; Bit 2: PTT status (1=on) 16 ;; Bit 3: DCD 17 ;; Bit 5: UART transmitter empty 18 ;; Bit 6-7: unused 19 ;; Byte 1: Number of empty 64 byte chunks in TX fifo (sofcount) 20 ;; Byte 2: Number of full 64 byte chunks in RX fifo (INISOVAL) 21 ;; Byte 3: RSSI value 22 ;; Byte 4: IRQ count 23 ;; Byte 5-20: (as needed) UART receiver chars 24 ;; EP8 out audio output 25 ;; EP8 in audio input 26 27 ;; COMMAND LIST 28 ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) 29 ;; C0 C8 read mode 30 ;; Return: 31 ;; Byte 0: 4 (MODE_AUDIO) 32 ;; C0 C9 return serial number string 33 ;; C0 D0 get/set PTT/DCD/RSSI 34 ;; wIndex = 1: set forced ptt to wValue 35 ;; Return: 36 ;; Byte 0: PTT status 37 ;; Byte 1: DCD status 38 ;; Byte 2: RSSI status 39 ;; 40 D2 set CON/STA led 40 ;; Bits 0-1 of wValue 41 ;; 40 D3 send byte to UART 42 ;; Byte in wValue 43 ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) 44 ;; wIndex = 1: write wValue to output register 45 ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) 46 ;; Return: 47 ;; Byte 0: Modem Disconnect Input 48 ;; Byte 1: Modem Disconnect Output register 49 ;; Byte 2: Modem Disconnect Tristate register 50 ;; C0 D5 get/set T7F port 51 ;; wIndex = 1: write wValue to T7F output register 52 ;; Return: 53 ;; Byte 0: T7F Input 54 ;; Byte 1: T7F Output register 55 ;; C0 E0 get/set control register/counter values 56 ;; wIndex = 1: write wValue to control register 57 ;; Return: 58 ;; Byte 0: control register value 59 ;; Byte 1-3: counter0 register 60 ;; Byte 4-6: counter1 register 61 ;; C0 E1 get debug status 62 ;; Return: 63 ;; Byte 0: SOF count 64 ;; Byte 1: framesize 65 ;; Byte 2-3: divider 66 ;; Byte 4: divrel 67 ;; Byte 5: pllcorrvar 68 ;; Byte 6: txfifocount 69 ;; C0 E2 xxdebug stuff 70 71 ;; define code segments link order 72 .area CODE (CODE) 73 .area CSEG (CODE) 74 .area GSINIT (CODE) 75 .area GSINIT2 (CODE) 76 77 ;; ----------------------------------------------------- 78 79 ;; special function registers (which are not predefined) 0082 80 dpl0 = 0x82 0083 81 dph0 = 0x83 0084 82 dpl1 = 0x84 0085 83 dph1 = 0x85 0086 84 dps = 0x86 008E 85 ckcon = 0x8E 008F 86 spc_fnc = 0x8F 0091 87 exif = 0x91 0092 88 mpage = 0x92 0098 89 scon0 = 0x98 0099 90 sbuf0 = 0x99 00C0 91 scon1 = 0xC0 00C1 92 sbuf1 = 0xC1 00D8 93 eicon = 0xD8 00E8 94 eie = 0xE8 00F8 95 eip = 0xF8 96 97 ;; anchor xdata registers 7F00 98 IN0BUF = 0x7F00 7EC0 99 OUT0BUF = 0x7EC0 7E80 100 IN1BUF = 0x7E80 7E40 101 OUT1BUF = 0x7E40 7E00 102 IN2BUF = 0x7E00 7DC0 103 OUT2BUF = 0x7DC0 7D80 104 IN3BUF = 0x7D80 7D40 105 OUT3BUF = 0x7D40 7D00 106 IN4BUF = 0x7D00 7CC0 107 OUT4BUF = 0x7CC0 7C80 108 IN5BUF = 0x7C80 7C40 109 OUT5BUF = 0x7C40 7C00 110 IN6BUF = 0x7C00 7BC0 111 OUT6BUF = 0x7BC0 7B80 112 IN7BUF = 0x7B80 7B40 113 OUT7BUF = 0x7B40 7FE8 114 SETUPBUF = 0x7FE8 7FE8 115 SETUPDAT = 0x7FE8 116 7FB4 117 EP0CS = 0x7FB4 7FB5 118 IN0BC = 0x7FB5 7FB6 119 IN1CS = 0x7FB6 7FB7 120 IN1BC = 0x7FB7 7FB8 121 IN2CS = 0x7FB8 7FB9 122 IN2BC = 0x7FB9 7FBA 123 IN3CS = 0x7FBA 7FBB 124 IN3BC = 0x7FBB 7FBC 125 IN4CS = 0x7FBC 7FBD 126 IN4BC = 0x7FBD 7FBE 127 IN5CS = 0x7FBE 7FBF 128 IN5BC = 0x7FBF 7FC0 129 IN6CS = 0x7FC0 7FC1 130 IN6BC = 0x7FC1 7FC2 131 IN7CS = 0x7FC2 7FC3 132 IN7BC = 0x7FC3 7FC5 133 OUT0BC = 0x7FC5 7FC6 134 OUT1CS = 0x7FC6 7FC7 135 OUT1BC = 0x7FC7 7FC8 136 OUT2CS = 0x7FC8 7FC9 137 OUT2BC = 0x7FC9 7FCA 138 OUT3CS = 0x7FCA 7FCB 139 OUT3BC = 0x7FCB 7FCC 140 OUT4CS = 0x7FCC 7FCD 141 OUT4BC = 0x7FCD 7FCE 142 OUT5CS = 0x7FCE 7FCF 143 OUT5BC = 0x7FCF 7FD0 144 OUT6CS = 0x7FD0 7FD1 145 OUT6BC = 0x7FD1 7FD2 146 OUT7CS = 0x7FD2 7FD3 147 OUT7BC = 0x7FD3 148 7FA8 149 IVEC = 0x7FA8 7FA9 150 IN07IRQ = 0x7FA9 7FAA 151 OUT07IRQ = 0x7FAA 7FAB 152 USBIRQ = 0x7FAB 7FAC 153 IN07IEN = 0x7FAC 7FAD 154 OUT07IEN = 0x7FAD 7FAE 155 USBIEN = 0x7FAE 7FAF 156 USBBAV = 0x7FAF 7FB2 157 BPADDRH = 0x7FB2 7FB3 158 BPADDRL = 0x7FB3 159 7FD4 160 SUDPTRH = 0x7FD4 7FD5 161 SUDPTRL = 0x7FD5 7FD6 162 USBCS = 0x7FD6 7FD7 163 TOGCTL = 0x7FD7 7FD8 164 USBFRAMEL = 0x7FD8 7FD9 165 USBFRAMEH = 0x7FD9 7FDB 166 FNADDR = 0x7FDB 7FDD 167 USBPAIR = 0x7FDD 7FDE 168 IN07VAL = 0x7FDE 7FDF 169 OUT07VAL = 0x7FDF 7FE3 170 AUTOPTRH = 0x7FE3 7FE4 171 AUTOPTRL = 0x7FE4 7FE5 172 AUTODATA = 0x7FE5 173 174 ;; isochronous endpoints. only available if ISODISAB=0 175 7F60 176 OUT8DATA = 0x7F60 7F61 177 OUT9DATA = 0x7F61 7F62 178 OUT10DATA = 0x7F62 7F63 179 OUT11DATA = 0x7F63 7F64 180 OUT12DATA = 0x7F64 7F65 181 OUT13DATA = 0x7F65 7F66 182 OUT14DATA = 0x7F66 7F67 183 OUT15DATA = 0x7F67 184 7F68 185 IN8DATA = 0x7F68 7F69 186 IN9DATA = 0x7F69 7F6A 187 IN10DATA = 0x7F6A 7F6B 188 IN11DATA = 0x7F6B 7F6C 189 IN12DATA = 0x7F6C 7F6D 190 IN13DATA = 0x7F6D 7F6E 191 IN14DATA = 0x7F6E 7F6F 192 IN15DATA = 0x7F6F 193 7F70 194 OUT8BCH = 0x7F70 7F71 195 OUT8BCL = 0x7F71 7F72 196 OUT9BCH = 0x7F72 7F73 197 OUT9BCL = 0x7F73 7F74 198 OUT10BCH = 0x7F74 7F75 199 OUT10BCL = 0x7F75 7F76 200 OUT11BCH = 0x7F76 7F77 201 OUT11BCL = 0x7F77 7F78 202 OUT12BCH = 0x7F78 7F79 203 OUT12BCL = 0x7F79 7F7A 204 OUT13BCH = 0x7F7A 7F7B 205 OUT13BCL = 0x7F7B 7F7C 206 OUT14BCH = 0x7F7C 7F7D 207 OUT14BCL = 0x7F7D 7F7E 208 OUT15BCH = 0x7F7E 7F7F 209 OUT15BCL = 0x7F7F 210 7FF0 211 OUT8ADDR = 0x7FF0 7FF1 212 OUT9ADDR = 0x7FF1 7FF2 213 OUT10ADDR = 0x7FF2 7FF3 214 OUT11ADDR = 0x7FF3 7FF4 215 OUT12ADDR = 0x7FF4 7FF5 216 OUT13ADDR = 0x7FF5 7FF6 217 OUT14ADDR = 0x7FF6 7FF7 218 OUT15ADDR = 0x7FF7 7FF8 219 IN8ADDR = 0x7FF8 7FF9 220 IN9ADDR = 0x7FF9 7FFA 221 IN10ADDR = 0x7FFA 7FFB 222 IN11ADDR = 0x7FFB 7FFC 223 IN12ADDR = 0x7FFC 7FFD 224 IN13ADDR = 0x7FFD 7FFE 225 IN14ADDR = 0x7FFE 7FFF 226 IN15ADDR = 0x7FFF 227 7FA0 228 ISOERR = 0x7FA0 7FA1 229 ISOCTL = 0x7FA1 7FA2 230 ZBCOUNT = 0x7FA2 7FE0 231 INISOVAL = 0x7FE0 7FE1 232 OUTISOVAL = 0x7FE1 7FE2 233 FASTXFR = 0x7FE2 234 235 ;; CPU control registers 236 7F92 237 CPUCS = 0x7F92 238 239 ;; IO port control registers 240 7F93 241 PORTACFG = 0x7F93 7F94 242 PORTBCFG = 0x7F94 7F95 243 PORTCCFG = 0x7F95 7F96 244 OUTA = 0x7F96 7F97 245 OUTB = 0x7F97 7F98 246 OUTC = 0x7F98 7F99 247 PINSA = 0x7F99 7F9A 248 PINSB = 0x7F9A 7F9B 249 PINSC = 0x7F9B 7F9C 250 OEA = 0x7F9C 7F9D 251 OEB = 0x7F9D 7F9E 252 OEC = 0x7F9E 253 254 ;; I2C controller registers 255 7FA5 256 I2CS = 0x7FA5 7FA6 257 I2DAT = 0x7FA6 258 259 ;; Xilinx FPGA registers C000 260 AUDIORXFIFO = 0xc000 C000 261 AUDIOTXFIFO = 0xc000 C001 262 AUDIORXFIFOCNT = 0xc001 C002 263 AUDIOTXFIFOCNT = 0xc002 C001 264 AUDIODIVIDERLO = 0xc001 C002 265 AUDIODIVIDERHI = 0xc002 C004 266 AUDIORSSI = 0xc004 C005 267 AUDIOCNTLOW = 0xc005 C006 268 AUDIOCNTMID = 0xc006 C007 269 AUDIOCNTHIGH = 0xc007 C008 270 AUDIOCTRL = 0xc008 C009 271 AUDIOSTAT = 0xc009 C00A 272 AUDIOT7FOUT = 0xc00a C00B 273 AUDIOT7FIN = 0xc00b C00C 274 AUDIOMDISCTRIS = 0xc00c C00D 275 AUDIOMDISCOUT = 0xc00d C00E 276 AUDIOMDISCIN = 0xc00e 277 0001 278 AUDIOCTRLPTT = 0x01 0002 279 AUDIOCTRLMUTE = 0x02 0004 280 AUDIOCTRLLEDPTT = 0x04 0008 281 AUDIOCTRLLEDDCD = 0x08 0000 282 AUDIOCTRLCNTRES = 0x00 0010 283 AUDIOCTRLCNTDIS = 0x10 0040 284 AUDIOCTRLCNTCK0 = 0x40 0050 285 AUDIOCTRLCNTCK1 = 0x50 0060 286 AUDIOCTRLCNTCK2 = 0x60 0070 287 AUDIOCTRLCNTCK3 = 0x70 0080 288 AUDIOCTRLCNTRD1 = 0x80 289 290 ;; ----------------------------------------------------- 291 292 .area CODE (CODE) 0000 02s00r00 293 ljmp startup 0003 02s00r16 294 ljmp int0_isr 0006 295 .ds 5 000B 02s00r37 296 ljmp timer0_isr 000E 297 .ds 5 0013 02s00r58 298 ljmp int1_isr 0016 299 .ds 5 001B 02s00r79 300 ljmp timer1_isr 001E 301 .ds 5 0023 02s00r9A 302 ljmp ser0_isr 0026 303 .ds 5 002B 02s00rD8 304 ljmp timer2_isr 002E 305 .ds 5 0033 02s00rF9 306 ljmp resume_isr 0036 307 .ds 5 003B 02s01r1A 308 ljmp ser1_isr 003E 309 .ds 5 0043 02s01r00 310 ljmp usb_isr 0046 311 .ds 5 004B 02s01r3D 312 ljmp i2c_isr 004E 313 .ds 5 0053 02s01r62 314 ljmp int4_isr 0056 315 .ds 5 005B 02s01r87 316 ljmp int5_isr 005E 317 .ds 5 0063 02s01rAC 318 ljmp int6_isr 319 320 ;; Parameter block at 0xe0 0066 321 .ds 0x7a 00E0 08 322 parframesize: .db 8 00E1 01 323 parpttmute: .db 1 324 325 ;; Serial# string at 0xf0 00E2 326 .ds 14 00F0 327 parserial: 00F0 30 30 30 30 30 30 328 .db '0,'0,'0,'0,'0,'0,'0,'0,0 30 30 00 00F9 329 .ds 7 330 0100 331 usb_isr: 0100 02s01rCD 332 ljmp usb_sudav_isr 0103 333 .ds 1 0104 02s06r7B 334 ljmp usb_sof_isr 0107 335 .ds 1 0108 02s07rC5 336 ljmp usb_sutok_isr 010B 337 .ds 1 010C 02s07rF0 338 ljmp usb_suspend_isr 010F 339 .ds 1 0110 02s08r1B 340 ljmp usb_usbreset_isr 0113 341 .ds 1 0114 32 342 reti 0115 343 .ds 3 0118 02s08r46 344 ljmp usb_ep0in_isr 011B 345 .ds 1 011C 02s08r81 346 ljmp usb_ep0out_isr 011F 347 .ds 1 0120 02s09r17 348 ljmp usb_ep1in_isr 0123 349 .ds 1 0124 02s09r45 350 ljmp usb_ep1out_isr 0127 351 .ds 1 0128 02s09r70 352 ljmp usb_ep2in_isr 012B 353 .ds 1 012C 02s09r9B 354 ljmp usb_ep2out_isr 012F 355 .ds 1 0130 02s09rC6 356 ljmp usb_ep3in_isr 0133 357 .ds 1 0134 02s09rF1 358 ljmp usb_ep3out_isr 0137 359 .ds 1 0138 02s0Ar1C 360 ljmp usb_ep4in_isr 013B 361 .ds 1 013C 02s0Ar47 362 ljmp usb_ep4out_isr 013F 363 .ds 1 0140 02s0Ar72 364 ljmp usb_ep5in_isr 0143 365 .ds 1 0144 02s0Ar9D 366 ljmp usb_ep5out_isr 0147 367 .ds 1 0148 02s0ArC8 368 ljmp usb_ep6in_isr 014B 369 .ds 1 014C 02s0ArF3 370 ljmp usb_ep6out_isr 014F 371 .ds 1 0150 02s0Br1E 372 ljmp usb_ep7in_isr 0153 373 .ds 1 0154 02s0Br49 374 ljmp usb_ep7out_isr 375 376 ;; ----------------------------------------------------- 377 0004 378 NUMINTERFACES = 4 379 380 .area OSEG (OVR,DATA) 381 .area BSEG (BIT) 0000 382 ctrl_ptt: .ds 1 0001 383 ctrl_pttmute: .ds 1 0002 384 ctrl_ledptt: .ds 1 0003 385 ctrl_leddcd: .ds 1 0004 386 ctrl_cntmode0: .ds 1 0005 387 ctrl_cntmode1: .ds 1 0006 388 ctrl_cntmode2: .ds 1 0007 389 ctrl_cntsel: .ds 1 0020 390 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) 391 0008 392 pttmute: .ds 1 0009 393 uartempty: .ds 1 394 395 396 .area ISEG (DATA) 0000 397 txsamples: .ds 0x40 0040 398 stack: .ds 0x80-0x40 399 400 .area DSEG (DATA) 0000 401 ctrlcode: .ds 1 0001 402 ctrlcount: .ds 2 0003 403 leddiv: .ds 1 0004 404 irqcount: .ds 1 0005 405 sofcount: .ds 1 0006 406 divider: .ds 2 0008 407 divrel: .ds 1 0009 408 framesize: .ds 1 000A 409 pllcorrvar: .ds 1 000B 410 txfifocount: .ds 1 000C 411 pttforce: .ds 1 412 413 ;; UART receiver 000D 414 uartbuf: .ds 16 001D 415 uartwr: .ds 1 001E 416 uartrd: .ds 1 417 418 ;; Port state 001F 419 t7fout: .ds 1 0020 420 mdisctris: .ds 1 0021 421 mdiscout: .ds 1 422 423 ;; USB state 0022 424 numconfig: .ds 1 0023 425 altsetting: .ds NUMINTERFACES 426 427 .area XSEG (DATA) 0000 428 blah: .ds 1 429 430 431 .area GSINIT (CODE) 0002 432 ar2 = 0x02 0003 433 ar3 = 0x03 0004 434 ar4 = 0x04 0005 435 ar5 = 0x05 0006 436 ar6 = 0x06 0007 437 ar7 = 0x07 0000 438 ar0 = 0x00 0001 439 ar1 = 0x01 440 0000 441 startup: 0000 75 81r40 442 mov sp,#stack ; -1 0003 E4 443 clr a 0004 F5 D0 444 mov psw,a 0006 F5 86 445 mov dps,a 446 ;lcall __sdcc_external_startup 447 ;mov a,dpl0 448 ;jz __sdcc_init_data 449 ;ljmp __sdcc_program_startup 0008 450 __sdcc_init_data: 451 452 .area GSINIT2 (CODE) 0000 453 __sdcc_program_startup: 454 ;; assembler code startup 0000 E4 455 clr a 0001 F5*04 456 mov irqcount,a 0003 F5*05 457 mov sofcount,a 0005 F5*0C 458 mov pttforce,a 0007 F5*1E 459 mov uartrd,a 0009 F5*1D 460 mov uartwr,a 000B F5 86 461 mov dps,a 000D D2*09 462 setb uartempty 463 ;; some indirect register setup 000F 75 8E 30 464 mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs 465 ;; Timer setup: 466 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 467 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0012 75 89 21 468 mov tmod,#0x21 0015 75 88 55 469 mov tcon,#0x55 ; INT0/INT1 edge 0018 75 8D 64 470 mov th1,#256-156 ; 1200 bauds 001B 75 87 00 471 mov pcon,#0 ; SMOD0=0 472 ;; init USB subsystem 001E 74 00 473 mov a,#0x00 ; IN8 FIFO at address 0x0000 0020 90 7F F8 474 mov dptr,#IN8ADDR 0023 F0 475 movx @dptr,a 0024 74 04 476 mov a,#0x04 ; OUT8 FIFO at address 0x0010 0026 90 7F F0 477 mov dptr,#OUT8ADDR 0029 F0 478 movx @dptr,a 002A 90 7F A1 479 mov dptr,#ISOCTL 002D E4 480 clr a ; enable ISO endpoints 002E F0 481 movx @dptr,a 002F 90 7F AF 482 mov dptr,#USBBAV 0032 74 01 483 mov a,#1 ; enable autovector, disable breakpoint logic 0034 F0 484 movx @dptr,a 0035 74 01 485 mov a,#0x01 ; enable ISO endpoint 8 for input/output 0037 90 7F E0 486 mov dptr,#INISOVAL 003A F0 487 movx @dptr,a 003B 90 7F E1 488 mov dptr,#OUTISOVAL 003E F0 489 movx @dptr,a 003F 90 7F DD 490 mov dptr,#USBPAIR 0042 74 89 491 mov a,#0x89 ; pair EP 2&3 for input & output, ISOSEND0 0044 F0 492 movx @dptr,a 0045 90 7F DE 493 mov dptr,#IN07VAL 0048 74 03 494 mov a,#0x3 ; enable EP0+EP1 004A F0 495 movx @dptr,a 004B 90 7F DF 496 mov dptr,#OUT07VAL 004E 74 01 497 mov a,#0x1 ; enable EP0 0050 F0 498 movx @dptr,a 499 ;; USB: init endpoint toggles 0051 90 7F D7 500 mov dptr,#TOGCTL 0054 74 12 501 mov a,#0x12 0056 F0 502 movx @dptr,a 0057 74 32 503 mov a,#0x32 ; clear EP 2 in toggle 0059 F0 504 movx @dptr,a 005A 74 02 505 mov a,#0x02 005C F0 506 movx @dptr,a 005D 74 22 507 mov a,#0x22 ; clear EP 2 out toggle 005F F0 508 movx @dptr,a 509 ;; configure IO ports 0060 90 7F 93 510 mov dptr,#PORTACFG 0063 74 00 511 mov a,#0 0065 F0 512 movx @dptr,a 0066 90 7F 96 513 mov dptr,#OUTA 0069 74 82 514 mov a,#0x82 ; set PROG hi 006B F0 515 movx @dptr,a 006C 90 7F 9C 516 mov dptr,#OEA 006F 74 C2 517 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0071 F0 518 movx @dptr,a 0072 90 7F 94 519 mov dptr,#PORTBCFG 0075 74 00 520 mov a,#0 0077 F0 521 movx @dptr,a 0078 90 7F 9D 522 mov dptr,#OEB 007B 74 00 523 mov a,#0 007D F0 524 movx @dptr,a 007E 90 7F 95 525 mov dptr,#PORTCCFG 0081 74 C3 526 mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins 0083 F0 527 movx @dptr,a 0084 90 7F 98 528 mov dptr,#OUTC 0087 74 28 529 mov a,#0x28 0089 F0 530 movx @dptr,a 008A 90 7F 9E 531 mov dptr,#OEC 008D 74 2A 532 mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT 008F F0 533 movx @dptr,a 534 ;; enable interrupts 0090 75 A8 92 535 mov ie,#0x92 ; enable timer 0 and ser 0 int 0093 75 E8 01 536 mov eie,#0x01 ; enable USB interrupts 0096 90 7F AE 537 mov dptr,#USBIEN 0099 74 01 538 mov a,#1 ; enable SUDAV interrupt 009B F0 539 movx @dptr,a 009C 90 7F AC 540 mov dptr,#IN07IEN 009F 74 03 541 mov a,#3 ; enable EP0+EP1 interrupt 00A1 F0 542 movx @dptr,a 00A2 90 7F AD 543 mov dptr,#OUT07IEN 00A5 74 01 544 mov a,#1 ; enable EP0 interrupt 00A7 F0 545 movx @dptr,a 546 ;; initialize UART 0 for T7F communication 00A8 75 98 52 547 mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable 548 ;; copy configuration to bit addressable variables 00AB 75 20 00 549 mov ctrlreg,#AUDIOCTRLCNTRES 00AE 78rE1 550 mov r0,#parpttmute 00B0 E2 551 movx a,@r0 00B1 A2 E0 552 mov c,acc.0 00B3 92*08 553 mov pttmute,c 00B5 92*01 554 mov ctrl_pttmute,c 555 ;; turn off transmitter 00B7 90 C0 08 556 mov dptr,#AUDIOCTRL 00BA E5 20 557 mov a,ctrlreg 00BC F0 558 movx @dptr,a 559 ;; Initialize modem disc port / t7f port 00BD 90 C0 0C 560 mov dptr,#AUDIOMDISCTRIS 00C0 74 FF 561 mov a,#0xff 00C2 F0 562 movx @dptr,a 00C3 F5*20 563 mov mdisctris,a 00C5 90 C0 0D 564 mov dptr,#AUDIOMDISCOUT 00C8 E4 565 clr a 00C9 F0 566 movx @dptr,a 00CA F5*21 567 mov mdiscout,a 00CC 90 C0 0A 568 mov dptr,#AUDIOT7FOUT 00CF 74 1F 569 mov a,#0x1f 00D1 F0 570 movx @dptr,a 00D2 F5*1F 571 mov t7fout,a 572 ;; Copy serial number 00D4 78rF0 573 mov r0,#parserial 00D6 90s0BrFD 574 mov dptr,#stringserial+2 00D9 E2 575 1$: movx a,@r0 00DA 60 06 576 jz 2$ 00DC F0 577 movx @dptr,a 00DD A3 578 inc dptr 00DE A3 579 inc dptr 00DF 08 580 inc r0 00E0 80 F7 581 sjmp 1$ 00E2 E8 582 2$: mov a,r0 00E3 24 11 583 add a,#1-0xf0 ; 1-parserial 00E5 25 E0 584 add a,acc 00E7 90s0BrFB 585 mov dptr,#stringserial 00EA F0 586 movx @dptr,a 587 ;; check parameters 00EB 588 chkparam: 00EB 75*08 80 589 mov divrel,#0x80 00EE 78rE0 590 mov r0,#parframesize 00F0 E2 591 movx a,@r0 00F1 B4 02 02 592 cjne a,#02,11$ 00F4 80 4E 593 sjmp 2$ 00F6 B4 03 02 594 11$: cjne a,#03,1$ 00F9 80 49 595 sjmp 2$ 00FB 24 F8 596 1$: add a,#-8 00FD 50 0B 597 jnc 3$ 00FF 24 F0 598 add a,#-16 0101 40 03 599 jc 4$ 0103 E2 600 movx a,@r0 0104 80 06 601 sjmp 5$ 602 ;; sampling rate is: 24000000Hz/(divider+2) 0106 74 18 603 4$: mov a,#24 0108 80 02 604 sjmp 5$ 010A 74 08 605 3$: mov a,#8 606 ;; 16 bit by 8 bit divide 607 ;; r2: divisor 608 ;; r3: loop counter 609 ;; r4: dividend/result low 610 ;; r5: dividend/result mid 611 ;; r6: dividend/result high 010C FA 612 5$: mov r2,a 010D 7B 11 613 mov r3,#17 010F 7C C0 614 mov r4,#24000 0111 7D 5D 615 mov r5,#24000>>8 0113 7E 00 616 mov r6,#0 0115 C3 617 6$: clr c 0116 EE 618 mov a,r6 0117 9A 619 subb a,r2 0118 40 01 620 jc 7$ 011A FE 621 mov r6,a 011B B3 622 7$: cpl c 011C EC 623 mov a,r4 011D 33 624 rlc a 011E FC 625 mov r4,a 011F ED 626 mov a,r5 0120 33 627 rlc a 0121 FD 628 mov r5,a 0122 EE 629 mov a,r6 0123 33 630 rlc a 0124 FE 631 mov r6,a 0125 DB EE 632 djnz r3,6$ 633 ;; subtract two 0127 EC 634 mov a,r4 0128 C3 635 clr c 0129 94 02 636 subb a,#2 012B FC 637 mov r4,a 012C ED 638 mov a,r5 012D 94 00 639 subb a,#0 012F FD 640 mov r5,a 641 ;; store result into audio divider 0130 90 C0 02 642 mov dptr,#AUDIODIVIDERHI 0133 F0 643 movx @dptr,a 0134 EC 644 mov a,r4 0135 90 C0 01 645 mov dptr,#AUDIODIVIDERLO 0138 F0 646 movx @dptr,a 0139 C3 647 clr c 013A 94 08 648 subb a,#0x08 013C F5*06 649 mov divider,a 013E ED 650 mov a,r5 013F 94 00 651 subb a,#0 0141 F5*07 652 mov divider+1,a 653 ;; reload divider into accu 0143 EA 654 mov a,r2 0144 F5*09 655 2$: mov framesize,a 0146 90s0BrB3 656 mov dptr,#descinframesize 0149 F0 657 movx @dptr,a 014A 90s0BrBC 658 mov dptr,#descoutframesize 014D F0 659 movx @dptr,a 660 ;; set sampling rate in descriptor 0000 661 .if 0 662 mov b,#1000 663 mul ab 664 mov dptr,#descinsrate 665 movx @dptr,a 666 mov dptr,#descoutsrate 667 movx @dptr,a 668 mov r3,b 669 mov a,framesize 670 mov b,#1000>>8 671 mul ab 672 add a,r3 673 mov dptr,#descinsrate+1 674 movx @dptr,a 675 mov dptr,#descoutsrate+1 676 movx @dptr,a 677 clr a 678 addc a,b 679 mov dptr,#descinsrate+2 680 movx @dptr,a 681 mov dptr,#descoutsrate+2 682 movx @dptr,a 683 .endif 684 ;; initialize USB state 014E 685 usbinit: 686 0000 687 .if 0 688 ;; XXXXX 689 ;; check if windows needs 11025Hz 690 mov a,#12 691 mov dptr,#descinframesize 692 movx @dptr,a 693 mov dptr,#descoutframesize 694 movx @dptr,a 695 mov a,#0x11 696 mov dptr,#descinsrate 697 movx @dptr,a 698 mov dptr,#descoutsrate 699 movx @dptr,a 700 mov a,#0x2b 701 mov dptr,#descinsrate+1 702 movx @dptr,a 703 mov dptr,#descoutsrate+1 704 movx @dptr,a 705 mov a,#0 706 mov dptr,#descinsrate+2 707 movx @dptr,a 708 mov dptr,#descoutsrate+2 709 movx @dptr,a 710 ;; XXXXX 711 .endif 712 014E E4 713 clr a 014F F5*22 714 mov numconfig,a 0151 78r23 715 mov r0,#altsetting 0153 7A 04 716 mov r2,#NUMINTERFACES 0155 F6 717 3$: mov @r0,a 0156 08 718 inc r0 0157 DA FC 719 djnz r2,3$ 720 ;; give Windows a chance to finish the writecpucs control transfer 721 ;; 20ms delay loop 0159 90 D1 20 722 mov dptr,#(-12000)&0xffff 015C A3 723 2$: inc dptr ; 3 cycles 015D E5 82 724 mov a,dpl0 ; 2 cycles 015F 45 83 725 orl a,dph0 ; 2 cycles 0161 70 F9 726 jnz 2$ ; 3 cycles 0001 727 .if 1 728 ;; disconnect from USB bus 0163 90 7F D6 729 mov dptr,#USBCS 0166 74 0A 730 mov a,#10 0168 F0 731 movx @dptr,a 732 ;; wait 0.3 sec 0169 7A 1E 733 mov r2,#30 734 ;; 10ms delay loop 016B 90 E8 90 735 0$: mov dptr,#(-6000)&0xffff 016E A3 736 1$: inc dptr ; 3 cycles 016F E5 82 737 mov a,dpl0 ; 2 cycles 0171 45 83 738 orl a,dph0 ; 2 cycles 0173 70 F9 739 jnz 1$ ; 3 cycles 0175 DA F4 740 djnz r2,0$ 741 ;; reconnect to USB bus 0177 90 7F D6 742 mov dptr,#USBCS 743 ;mov a,#2 ; 8051 handles control 744 ;movx @dptr,a 017A 74 06 745 mov a,#6 ; reconnect, 8051 handles control 017C F0 746 movx @dptr,a 747 .endif 748 749 ;; final 017D 12s08rBC 750 lcall fillusbintr 0180 751 fifoinit: 752 ;; first wait for a new frame 0180 90 7F D8 753 mov dptr,#USBFRAMEL 0183 E0 754 movx a,@dptr 0184 FA 755 mov r2,a 0185 E0 756 1$: movx a,@dptr 0186 B5 02 02 757 cjne a,ar2,2$ 0189 80 FA 758 sjmp 1$ 018B 90 C0 01 759 2$: mov dptr,#AUDIORXFIFOCNT 018E E0 760 movx a,@dptr 018F 24 FC 761 add a,#-4 0191 54 3F 762 anl a,#0x3f 0193 60 07 763 jz 4$ 0195 FA 764 mov r2,a 0196 90 C0 00 765 mov dptr,#AUDIORXFIFO 0199 E0 766 3$: movx a,@dptr 019A DA FD 767 djnz r2,3$ 019C 90 C0 02 768 4$: mov dptr,#AUDIOTXFIFOCNT 019F E0 769 movx a,@dptr 01A0 24 FC 770 add a,#-4 01A2 54 3F 771 anl a,#0x3f 01A4 60 F6 772 jz 4$ 01A6 FA 773 mov r2,a 01A7 90 C0 00 774 mov dptr,#AUDIOTXFIFO 01AA E4 775 clr a 01AB F0 776 5$: movx @dptr,a 01AC DA FD 777 djnz r2,5$ 01AE 778 6$: ;; clear SOFIR interrupt 01AE 90 7F AB 779 mov dptr,#USBIRQ 01B1 74 02 780 mov a,#0x02 01B3 F0 781 movx @dptr,a 782 ;; finally enable SOFIR interrupt 01B4 90 7F AE 783 mov dptr,#USBIEN 01B7 74 03 784 mov a,#3 ; enable SUDAV+SOFIR interrupt 01B9 F0 785 movx @dptr,a 01BA 12s08rBC 786 lcall fillusbintr 01BD 02s00r00 787 ljmp mainloop 788 789 790 .area CSEG (CODE) 0002 791 ar2 = 0x02 0003 792 ar3 = 0x03 0004 793 ar4 = 0x04 0005 794 ar5 = 0x05 0006 795 ar6 = 0x06 0007 796 ar7 = 0x07 0000 797 ar0 = 0x00 0001 798 ar1 = 0x01 799 800 ;; WARNING! The assembler doesn't check for 801 ;; out of range short jump labels!! Double check 802 ;; that the jump labels are within the range! 0000 803 mainloop: 0000 E5*0C 804 mov a,pttforce 0002 A2 E0 805 mov c,acc.0 0004 92*00 806 mov ctrl_ptt,c 0006 92*02 807 mov ctrl_ledptt,c 0008 B3 808 cpl c 0009 82*08 809 anl c,pttmute 000B 92*01 810 mov ctrl_pttmute,c 000D 90 C0 08 811 mov dptr,#AUDIOCTRL 0010 E5 20 812 mov a,ctrlreg 0012 F0 813 movx @dptr,a 0013 02s00r00 814 ljmp mainloop 815 816 ;; ------------------ interrupt handlers ------------------------ 817 0016 818 int0_isr: 0016 C0 E0 819 push acc 0018 C0 F0 820 push b 001A C0 82 821 push dpl0 001C C0 83 822 push dph0 001E C0 D0 823 push psw 0020 75 D0 00 824 mov psw,#0x00 0023 C0 86 825 push dps 0025 75 86 00 826 mov dps,#0 827 ;; clear interrupt 0028 C2 89 828 clr tcon+1 829 ;; handle interrupt 830 ;; epilogue 002A D0 86 831 pop dps 002C D0 D0 832 pop psw 002E D0 83 833 pop dph0 0030 D0 82 834 pop dpl0 0032 D0 F0 835 pop b 0034 D0 E0 836 pop acc 0036 32 837 reti 838 0037 839 timer0_isr: 0037 C0 E0 840 push acc 0039 C0 F0 841 push b 003B C0 82 842 push dpl0 003D C0 83 843 push dph0 003F C0 D0 844 push psw 0041 75 D0 00 845 mov psw,#0x00 0044 C0 86 846 push dps 0046 75 86 00 847 mov dps,#0 848 ;; clear interrupt 0049 C2 8D 849 clr tcon+5 850 ;; handle interrupt 0000 851 .if 0 852 inc leddiv 853 mov a,leddiv 854 anl a,#7 855 jnz 0$ 856 mov dptr,#OUTC 857 movx a,@dptr 858 xrl a,#0x08 859 movx @dptr,a 860 0$: 861 .endif 862 ;; epilogue 004B D0 86 863 pop dps 004D D0 D0 864 pop psw 004F D0 83 865 pop dph0 0051 D0 82 866 pop dpl0 0053 D0 F0 867 pop b 0055 D0 E0 868 pop acc 0057 32 869 reti 870 0058 871 int1_isr: 0058 C0 E0 872 push acc 005A C0 F0 873 push b 005C C0 82 874 push dpl0 005E C0 83 875 push dph0 0060 C0 D0 876 push psw 0062 75 D0 00 877 mov psw,#0x00 0065 C0 86 878 push dps 0067 75 86 00 879 mov dps,#0 880 ;; clear interrupt 006A C2 8B 881 clr tcon+3 882 ;; handle interrupt 883 ;; epilogue 006C D0 86 884 pop dps 006E D0 D0 885 pop psw 0070 D0 83 886 pop dph0 0072 D0 82 887 pop dpl0 0074 D0 F0 888 pop b 0076 D0 E0 889 pop acc 0078 32 890 reti 891 0079 892 timer1_isr: 0079 C0 E0 893 push acc 007B C0 F0 894 push b 007D C0 82 895 push dpl0 007F C0 83 896 push dph0 0081 C0 D0 897 push psw 0083 75 D0 00 898 mov psw,#0x00 0086 C0 86 899 push dps 0088 75 86 00 900 mov dps,#0 901 ;; clear interrupt 008B C2 8F 902 clr tcon+7 903 ;; handle interrupt 904 ;; epilogue 008D D0 86 905 pop dps 008F D0 D0 906 pop psw 0091 D0 83 907 pop dph0 0093 D0 82 908 pop dpl0 0095 D0 F0 909 pop b 0097 D0 E0 910 pop acc 0099 32 911 reti 912 009A 913 ser0_isr: 009A C0 E0 914 push acc 009C C0 F0 915 push b 009E C0 82 916 push dpl0 00A0 C0 83 917 push dph0 00A2 C0 D0 918 push psw 00A4 75 D0 00 919 mov psw,#0x00 00A7 C0 86 920 push dps 00A9 75 86 00 921 mov dps,#0 00AC C0 00 922 push ar0 923 ;; clear interrupt 00AE 10 98 16 924 jbc scon0+0,1$ ; RI 00B1 10 99 0F 925 0$: jbc scon0+1,2$ ; TI 926 ;; handle interrupt 927 ;; epilogue 00B4 D0 00 928 3$: pop ar0 00B6 D0 86 929 pop dps 00B8 D0 D0 930 pop psw 00BA D0 83 931 pop dph0 00BC D0 82 932 pop dpl0 00BE D0 F0 933 pop b 00C0 D0 E0 934 pop acc 00C2 32 935 reti 936 00C3 D2*09 937 2$: setb uartempty 00C5 80 EA 938 sjmp 0$ 939 00C7 E5*1D 940 1$: mov a,uartwr 00C9 24r0D 941 add a,#uartbuf 00CB F8 942 mov r0,a 00CC E5 99 943 mov a,sbuf0 00CE F6 944 mov @r0,a 00CF E5*1D 945 mov a,uartwr 00D1 04 946 inc a 00D2 54 0F 947 anl a,#0xf 00D4 F5*1D 948 mov uartwr,a 00D6 80 DC 949 sjmp 3$ 950 00D8 951 timer2_isr: 00D8 C0 E0 952 push acc 00DA C0 F0 953 push b 00DC C0 82 954 push dpl0 00DE C0 83 955 push dph0 00E0 C0 D0 956 push psw 00E2 75 D0 00 957 mov psw,#0x00 00E5 C0 86 958 push dps 00E7 75 86 00 959 mov dps,#0 960 ;; clear interrupt 00EA C2 CF 961 clr t2con+7 962 ;; handle interrupt 963 ;; epilogue 00EC D0 86 964 pop dps 00EE D0 D0 965 pop psw 00F0 D0 83 966 pop dph0 00F2 D0 82 967 pop dpl0 00F4 D0 F0 968 pop b 00F6 D0 E0 969 pop acc 00F8 32 970 reti 971 00F9 972 resume_isr: 00F9 C0 E0 973 push acc 00FB C0 F0 974 push b 00FD C0 82 975 push dpl0 00FF C0 83 976 push dph0 0101 C0 D0 977 push psw 0103 75 D0 00 978 mov psw,#0x00 0106 C0 86 979 push dps 0108 75 86 00 980 mov dps,#0 981 ;; clear interrupt 010B C2 DC 982 clr eicon+4 983 ;; handle interrupt 984 ;; epilogue 010D D0 86 985 pop dps 010F D0 D0 986 pop psw 0111 D0 83 987 pop dph0 0113 D0 82 988 pop dpl0 0115 D0 F0 989 pop b 0117 D0 E0 990 pop acc 0119 32 991 reti 992 011A 993 ser1_isr: 011A C0 E0 994 push acc 011C C0 F0 995 push b 011E C0 82 996 push dpl0 0120 C0 83 997 push dph0 0122 C0 D0 998 push psw 0124 75 D0 00 999 mov psw,#0x00 0127 C0 86 1000 push dps 0129 75 86 00 1001 mov dps,#0 1002 ;; clear interrupt 012C C2 C0 1003 clr scon1+0 012E C2 C1 1004 clr scon1+1 1005 ;; handle interrupt 1006 ;; epilogue 0130 D0 86 1007 pop dps 0132 D0 D0 1008 pop psw 0134 D0 83 1009 pop dph0 0136 D0 82 1010 pop dpl0 0138 D0 F0 1011 pop b 013A D0 E0 1012 pop acc 013C 32 1013 reti 1014 013D 1015 i2c_isr: 013D C0 E0 1016 push acc 013F C0 F0 1017 push b 0141 C0 82 1018 push dpl0 0143 C0 83 1019 push dph0 0145 C0 D0 1020 push psw 0147 75 D0 00 1021 mov psw,#0x00 014A C0 86 1022 push dps 014C 75 86 00 1023 mov dps,#0 1024 ;; clear interrupt 014F E5 91 1025 mov a,exif 0151 C2 E5 1026 clr acc.5 0153 F5 91 1027 mov exif,a 1028 ;; handle interrupt 1029 ;; epilogue 0155 D0 86 1030 pop dps 0157 D0 D0 1031 pop psw 0159 D0 83 1032 pop dph0 015B D0 82 1033 pop dpl0 015D D0 F0 1034 pop b 015F D0 E0 1035 pop acc 0161 32 1036 reti 1037 0162 1038 int4_isr: 0162 C0 E0 1039 push acc 0164 C0 F0 1040 push b 0166 C0 82 1041 push dpl0 0168 C0 83 1042 push dph0 016A C0 D0 1043 push psw 016C 75 D0 00 1044 mov psw,#0x00 016F C0 86 1045 push dps 0171 75 86 00 1046 mov dps,#0 1047 ;; clear interrupt 0174 E5 91 1048 mov a,exif 0176 C2 E6 1049 clr acc.6 0178 F5 91 1050 mov exif,a 1051 ;; handle interrupt 1052 ;; epilogue 017A D0 86 1053 pop dps 017C D0 D0 1054 pop psw 017E D0 83 1055 pop dph0 0180 D0 82 1056 pop dpl0 0182 D0 F0 1057 pop b 0184 D0 E0 1058 pop acc 0186 32 1059 reti 1060 0187 1061 int5_isr: 0187 C0 E0 1062 push acc 0189 C0 F0 1063 push b 018B C0 82 1064 push dpl0 018D C0 83 1065 push dph0 018F C0 D0 1066 push psw 0191 75 D0 00 1067 mov psw,#0x00 0194 C0 86 1068 push dps 0196 75 86 00 1069 mov dps,#0 1070 ;; clear interrupt 0199 E5 91 1071 mov a,exif 019B C2 E7 1072 clr acc.7 019D F5 91 1073 mov exif,a 1074 ;; handle interrupt 1075 ;; epilogue 019F D0 86 1076 pop dps 01A1 D0 D0 1077 pop psw 01A3 D0 83 1078 pop dph0 01A5 D0 82 1079 pop dpl0 01A7 D0 F0 1080 pop b 01A9 D0 E0 1081 pop acc 01AB 32 1082 reti 1083 01AC 1084 int6_isr: 01AC C0 E0 1085 push acc 01AE C0 F0 1086 push b 01B0 C0 82 1087 push dpl0 01B2 C0 83 1088 push dph0 01B4 C0 D0 1089 push psw 01B6 75 D0 00 1090 mov psw,#0x00 01B9 C0 86 1091 push dps 01BB 75 86 00 1092 mov dps,#0 1093 ;; clear interrupt 01BE C2 DB 1094 clr eicon+3 1095 ;; handle interrupt 1096 ;; epilogue 01C0 D0 86 1097 pop dps 01C2 D0 D0 1098 pop psw 01C4 D0 83 1099 pop dph0 01C6 D0 82 1100 pop dpl0 01C8 D0 F0 1101 pop b 01CA D0 E0 1102 pop acc 01CC 32 1103 reti 1104 01CD 1105 usb_sudav_isr: 01CD C0 E0 1106 push acc 01CF C0 F0 1107 push b 01D1 C0 82 1108 push dpl0 01D3 C0 83 1109 push dph0 01D5 C0 84 1110 push dpl1 01D7 C0 85 1111 push dph1 01D9 C0 D0 1112 push psw 01DB 75 D0 00 1113 mov psw,#0x00 01DE C0 86 1114 push dps 01E0 75 86 00 1115 mov dps,#0 01E3 C0 00 1116 push ar0 01E5 C0 07 1117 push ar7 1118 ;; clear interrupt 01E7 E5 91 1119 mov a,exif 01E9 C2 E4 1120 clr acc.4 01EB F5 91 1121 mov exif,a 01ED 90 7F AB 1122 mov dptr,#USBIRQ 01F0 74 01 1123 mov a,#0x01 01F2 F0 1124 movx @dptr,a 1125 ;; handle interrupt 01F3 75*00 00 1126 mov ctrlcode,#0 ; reset control out code 01F6 90 7F E9 1127 mov dptr,#SETUPDAT+1 01F9 E0 1128 movx a,@dptr ; bRequest field 1129 ;; standard commands 1130 ;; USB_REQ_GET_DESCRIPTOR 01FA B4 06 59 1131 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 01FD 90 7F E8 1132 mov dptr,#SETUPDAT ; bRequestType == 0x80 0200 E0 1133 movx a,@dptr 0201 B4 80 4F 1134 cjne a,#USB_DIR_IN,setupstallstd 0204 90 7F EB 1135 mov dptr,#SETUPDAT+3 0207 E0 1136 movx a,@dptr 0208 B4 01 0C 1137 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 020B 90 7F D4 1138 mov dptr,#SUDPTRH 020E 74s0B 1139 mov a,#>devicedescr 0210 F0 1140 movx @dptr,a 0211 A3 1141 inc dptr 0212 74r74 1142 mov a,#config0descr 0225 F0 1152 movx @dptr,a 0226 A3 1153 inc dptr 0227 74r86 1154 mov a,#stringdescr 0241 F5 83 1169 mov dph0,a 0243 E0 1170 movx a,@dptr 0244 F5 F0 1171 mov b,a 0246 A3 1172 inc dptr 0247 E0 1173 movx a,@dptr 0248 90 7F D4 1174 mov dptr,#SUDPTRH 024B F0 1175 movx @dptr,a 024C A3 1176 inc dptr 024D E5 F0 1177 mov a,b 024F F0 1178 movx @dptr,a 1179 ; sjmp setupackstd 0250 1180 setupackstd: 0250 02s06r60 1181 ljmp setupack 0253 1182 setupstallstd: 0253 02s06r5C 1183 ljmp setupstall 0256 1184 cmdnotgetdesc: 1185 ;; USB_REQ_SET_CONFIGURATION 0256 B4 09 41 1186 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 0259 90 7F E8 1187 mov dptr,#SETUPDAT 025C E0 1188 movx a,@dptr 025D 70 F4 1189 jnz setupstallstd 025F 90 7F EA 1190 mov dptr,#SETUPDAT+2 0262 E0 1191 movx a,@dptr 0263 24 FE 1192 add a,#-2 0265 40 EC 1193 jc setupstallstd 0267 E0 1194 movx a,@dptr 0268 F5*22 1195 mov numconfig,a 026A 1196 cmdresettoggleshalt: 026A 90 7F D7 1197 mov dptr,#TOGCTL 026D 78 07 1198 mov r0,#7 026F E8 1199 0$: mov a,r0 0270 44 10 1200 orl a,#0x10 0272 F0 1201 movx @dptr,a 0273 44 30 1202 orl a,#0x30 0275 F0 1203 movx @dptr,a 0276 E8 1204 mov a,r0 0277 F0 1205 movx @dptr,a 0278 44 20 1206 orl a,#0x20 027A F0 1207 movx @dptr,a 027B D8 F2 1208 djnz r0,0$ 027D E4 1209 clr a 027E F0 1210 movx @dptr,a 027F 74 02 1211 mov a,#2 0281 90 7F B6 1212 mov dptr,#IN1CS 0284 78 07 1213 mov r0,#7 0286 F0 1214 1$: movx @dptr,a 0287 A3 1215 inc dptr 0288 A3 1216 inc dptr 0289 D8 FB 1217 djnz r0,1$ 028B 90 7F C6 1218 mov dptr,#OUT1CS 028E 78 07 1219 mov r0,#7 0290 F0 1220 2$: movx @dptr,a 0291 A3 1221 inc dptr 0292 A3 1222 inc dptr 0293 D8 FB 1223 djnz r0,2$ 0295 12s08rBC 1224 lcall fillusbintr 0298 80 B6 1225 sjmp setupackstd 029A 1226 cmdnotsetconf: 1227 ;; USB_REQ_SET_INTERFACE 029A B4 0B 1E 1228 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 029D 90 7F E8 1229 mov dptr,#SETUPDAT 02A0 E0 1230 movx a,@dptr 02A1 B4 01 AF 1231 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 02A4 E5*22 1232 mov a,numconfig 02A6 B4 01 AA 1233 cjne a,#1,setupstallstd 02A9 90 7F EC 1234 mov dptr,#SETUPDAT+4 02AC E0 1235 movx a,@dptr 02AD 24 FC 1236 add a,#-NUMINTERFACES 02AF 40 A2 1237 jc setupstallstd 02B1 24r27 1238 add a,#NUMINTERFACES+altsetting 02B3 F8 1239 mov r0,a 02B4 90 7F EA 1240 mov dptr,#SETUPDAT+2 02B7 E0 1241 movx a,@dptr 02B8 F6 1242 mov @r0,a 02B9 80 AF 1243 sjmp cmdresettoggleshalt 02BB 1244 cmdnotsetint: 1245 ;; USB_REQ_GET_INTERFACE 02BB B4 0A 24 1246 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 02BE 90 7F E8 1247 mov dptr,#SETUPDAT 02C1 E0 1248 movx a,@dptr 02C2 B4 81 8E 1249 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 02C5 E5*22 1250 mov a,numconfig 02C7 B4 01 89 1251 cjne a,#1,setupstallstd 02CA 90 7F EC 1252 mov dptr,#SETUPDAT+4 02CD E0 1253 movx a,@dptr 02CE 24 FC 1254 add a,#-NUMINTERFACES 02D0 40 81 1255 jc setupstallstd 02D2 24r27 1256 add a,#NUMINTERFACES+altsetting 02D4 F8 1257 mov r0,a 02D5 E6 1258 mov a,@r0 02D6 1259 cmdrespondonebyte: 02D6 90 7F 00 1260 mov dptr,#IN0BUF 02D9 F0 1261 movx @dptr,a 02DA 90 7F B5 1262 mov dptr,#IN0BC 02DD 74 01 1263 mov a,#1 02DF F0 1264 movx @dptr,a 02E0 80 4E 1265 sjmp setupackstd2 02E2 1266 cmdnotgetint: 1267 ;; USB_REQ_GET_CONFIGURATION 02E2 B4 08 0B 1268 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 02E5 90 7F E8 1269 mov dptr,#SETUPDAT 02E8 E0 1270 movx a,@dptr 02E9 B4 80 47 1271 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 02EC E5*22 1272 mov a,numconfig 02EE 80 E6 1273 sjmp cmdrespondonebyte 02F0 1274 cmdnotgetconf: 1275 ;; USB_REQ_GET_STATUS (0) 02F0 70 44 1276 jnz cmdnotgetstat 02F2 90 7F E8 1277 mov dptr,#SETUPDAT 02F5 E0 1278 movx a,@dptr 02F6 B4 80 11 1279 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 02F9 74 01 1280 mov a,#1 02FB 1281 cmdrespondstat: 02FB 90 7F 00 1282 mov dptr,#IN0BUF 02FE F0 1283 movx @dptr,a 02FF A3 1284 inc dptr 0300 E4 1285 clr a 0301 F0 1286 movx @dptr,a 0302 90 7F B5 1287 mov dptr,#IN0BC 0305 74 02 1288 mov a,#2 0307 F0 1289 movx @dptr,a 0308 80 26 1290 sjmp setupackstd2 030A 1291 cmdnotgetstatdev: 030A B4 81 03 1292 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 030D E4 1293 clr a 030E 80 EB 1294 sjmp cmdrespondstat 0310 1295 cmdnotgetstatintf: 0310 B4 82 20 1296 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 0313 90 7F EC 1297 mov dptr,#SETUPDAT+4 0316 E0 1298 movx a,@dptr 0317 90 7F C4 1299 mov dptr,#OUT1CS-2 031A 30 E7 03 1300 jnb acc.7,0$ 031D 90 7F B4 1301 mov dptr,#IN1CS-2 0320 54 0F 1302 0$: anl a,#15 0322 60 0F 1303 jz setupstallstd2 0324 20 E3 0C 1304 jb acc.3,setupstallstd2 0327 25 E0 1305 add a,acc 0329 25 82 1306 add a,dpl0 032B F5 82 1307 mov dpl0,a 032D E0 1308 movx a,@dptr 032E 80 CB 1309 sjmp cmdrespondstat 0330 1310 setupackstd2: 0330 02s06r60 1311 ljmp setupack 0333 1312 setupstallstd2: 0333 02s06r5C 1313 ljmp setupstall 0336 1314 cmdnotgetstat: 1315 ;; USB_REQ_SET_FEATURE 0336 B4 03 05 1316 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 0339 75 F0 01 1317 mov b,#1 033C 80 06 1318 sjmp handleftr 033E 1319 cmdnotsetftr: 1320 ;; USB_REQ_CLEAR_FEATURE 033E B4 01 44 1321 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 0341 75 F0 00 1322 mov b,#0 0344 1323 handleftr: 0344 90 7F E8 1324 mov dptr,#SETUPDAT 0347 E0 1325 movx a,@dptr 0348 B4 02 E8 1326 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 034B A3 1327 inc dptr 034C A3 1328 inc dptr 034D E0 1329 movx a,@dptr 034E 70 E3 1330 jnz setupstallstd2 ; not ENDPOINT_HALT feature 0350 A3 1331 inc dptr 0351 E0 1332 movx a,@dptr 0352 70 DF 1333 jnz setupstallstd2 0354 A3 1334 inc dptr 0355 E0 1335 movx a,@dptr 0356 90 7F C4 1336 mov dptr,#OUT1CS-2 0359 30 E7 05 1337 jnb acc.7,0$ 035C 90 7F B4 1338 mov dptr,#IN1CS-2 035F 44 10 1339 orl a,#0x10 0361 20 E3 CF 1340 0$: jb acc.3,setupstallstd2 1341 ;; clear data toggle 0364 54 1F 1342 anl a,#0x1f 0366 05 86 1343 inc dps 0368 90 7F D7 1344 mov dptr,#TOGCTL 036B F0 1345 movx @dptr,a 036C 44 20 1346 orl a,#0x20 036E F0 1347 movx @dptr,a 036F 54 0F 1348 anl a,#15 0371 F0 1349 movx @dptr,a 0372 15 86 1350 dec dps 1351 ;; clear/set ep halt feature 0374 25 E0 1352 add a,acc 0376 25 82 1353 add a,dpl0 0378 F5 82 1354 mov dpl0,a 037A E5 F0 1355 mov a,b 037C F0 1356 movx @dptr,a 037D 80 B1 1357 sjmp setupackstd2 1358 037F 1359 cmdnotc0_1: 037F 02s04r17 1360 ljmp cmdnotc0 0382 1361 setupstallc0_1: 0382 02s06r5C 1362 ljmp setupstall 1363 0385 1364 cmdnotclrftr: 1365 ;; vendor specific commands 1366 ;; 0xc0 0385 B4 C0 F7 1367 cjne a,#0xc0,cmdnotc0_1 0388 90 7F E8 1368 mov dptr,#SETUPDAT ; bRequestType == 0xc0 038B E0 1369 movx a,@dptr 038C B4 C0 F3 1370 cjne a,#0xc0,setupstallc0_1 1371 ;; fill status buffer 038F E5*0C 1372 mov a,pttforce 0391 F5 F0 1373 mov b,a 0393 A2 E0 1374 mov c,acc.0 0395 92 F2 1375 mov b.2,c 0397 90 C0 09 1376 mov dptr,#AUDIOSTAT 039A E0 1377 movx a,@dptr 039B A2 E0 1378 mov c,acc.0 039D B3 1379 cpl c 039E 92 F3 1380 mov b.3,c 03A0 A2*09 1381 mov c,uartempty 03A2 92 F5 1382 mov b.5,c 03A4 E4 1383 clr a 03A5 90 7F 04 1384 mov dptr,#(IN0BUF+4) 03A8 F0 1385 movx @dptr,a 1386 ;; bytewide elements 03A9 90 7F 00 1387 mov dptr,#(IN0BUF) 03AC E5 F0 1388 mov a,b 03AE F0 1389 movx @dptr,a 03AF E4 1390 clr a 03B0 90 7F 01 1391 mov dptr,#(IN0BUF+1) 03B3 F0 1392 movx @dptr,a 03B4 90 7F 02 1393 mov dptr,#(IN0BUF+2) 03B7 F0 1394 movx @dptr,a 03B8 90 C0 04 1395 mov dptr,#AUDIORSSI 03BB E0 1396 movx a,@dptr 03BC 90 7F 03 1397 mov dptr,#(IN0BUF+3) 03BF F0 1398 movx @dptr,a 1399 ;; counter 03C0 05*04 1400 inc irqcount 03C2 E5*04 1401 mov a,irqcount 03C4 90 7F 05 1402 mov dptr,#(IN0BUF+5) 03C7 F0 1403 movx @dptr,a 1404 ;; additional fields (HDLC state mach) 03C8 E4 1405 clr a 03C9 A3 1406 inc dptr 03CA F0 1407 movx @dptr,a 03CB A3 1408 inc dptr 03CC F0 1409 movx @dptr,a 03CD A3 1410 inc dptr 03CE F0 1411 movx @dptr,a 03CF A3 1412 inc dptr 03D0 F0 1413 movx @dptr,a 03D1 A3 1414 inc dptr 03D2 F0 1415 movx @dptr,a 03D3 A3 1416 inc dptr 03D4 F0 1417 movx @dptr,a 03D5 A3 1418 inc dptr 03D6 F0 1419 movx @dptr,a 03D7 A3 1420 inc dptr 03D8 F0 1421 movx @dptr,a 03D9 A3 1422 inc dptr 03DA F0 1423 movx @dptr,a 03DB A3 1424 inc dptr 03DC F0 1425 movx @dptr,a 03DD A3 1426 inc dptr 03DE F0 1427 movx @dptr,a 03DF A3 1428 inc dptr 03E0 F0 1429 movx @dptr,a 1430 ;; FPGA registers 03E1 90 C0 01 1431 mov dptr,#AUDIORXFIFOCNT 03E4 E0 1432 movx a,@dptr 03E5 90 7F 12 1433 mov dptr,#(IN0BUF+18) 03E8 F0 1434 movx @dptr,a 03E9 90 C0 02 1435 mov dptr,#AUDIOTXFIFOCNT 03EC E0 1436 movx a,@dptr 03ED 90 7F 13 1437 mov dptr,#(IN0BUF+19) 03F0 F0 1438 movx @dptr,a 03F1 E5 20 1439 mov a,ctrlreg 03F3 A3 1440 inc dptr 03F4 F0 1441 movx @dptr,a 03F5 90 C0 09 1442 mov dptr,#AUDIOSTAT 03F8 E0 1443 movx a,@dptr 03F9 90 7F 15 1444 mov dptr,#(IN0BUF+21) 03FC F0 1445 movx @dptr,a 1446 ;; Anchor Registers 03FD 90 7F C8 1447 mov dptr,#OUT2CS 0400 E0 1448 movx a,@dptr 0401 90 7F 16 1449 mov dptr,#(IN0BUF+22) 0404 F0 1450 movx @dptr,a 1451 ;; set length 0405 90 7F EE 1452 mov dptr,#SETUPDAT+6 ; wLength 0408 E0 1453 movx a,@dptr 0409 24 E9 1454 add a,#-(6+12+4+1) 040B 50 01 1455 jnc 4$ 040D E4 1456 clr a 040E 24 17 1457 4$: add a,#(6+12+4+1) 0410 90 7F B5 1458 mov dptr,#IN0BC 0413 F0 1459 movx @dptr,a 0414 02s06r60 1460 ljmp setupack 0417 1461 cmdnotc0: 1462 ;; 0xc8 0417 B4 C8 19 1463 cjne a,#0xc8,cmdnotc8 041A 90 7F E8 1464 mov dptr,#SETUPDAT ; bRequestType == 0xc0 041D E0 1465 movx a,@dptr 041E B4 C0 0F 1466 cjne a,#0xc0,setupstallc8 0421 74 04 1467 mov a,#4 0423 90 7F 00 1468 mov dptr,#IN0BUF 0426 F0 1469 movx @dptr,a 0427 90 7F B5 1470 mov dptr,#IN0BC 042A 74 01 1471 mov a,#1 042C F0 1472 movx @dptr,a 042D 02s06r60 1473 ljmp setupack 0430 1474 setupstallc8: 0430 02s06r5C 1475 ljmp setupstall 0433 1476 cmdnotc8: 1477 ;; 0xc9 0433 B4 C9 21 1478 cjne a,#0xc9,cmdnotc9 0436 90 7F E8 1479 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0439 E0 1480 movx a,@dptr 043A B4 C0 17 1481 cjne a,#0xc0,setupstallc9 043D 90 7F 00 1482 mov dptr,#IN0BUF 0440 78rF0 1483 mov r0,#parserial 0442 E2 1484 0$: movx a,@r0 0443 60 05 1485 jz 1$ 0445 F0 1486 movx @dptr,a 0446 08 1487 inc r0 0447 A3 1488 inc dptr 0448 80 F8 1489 sjmp 0$ 044A E8 1490 1$: mov a,r0 044B 24 10 1491 add a,#-0xf0 ; -parserial 044D 90 7F B5 1492 mov dptr,#IN0BC 0450 F0 1493 movx @dptr,a 0451 02s06r60 1494 ljmp setupack 0454 1495 setupstallc9: 0454 02s06r5C 1496 ljmp setupstall 0457 1497 cmdnotc9: 1498 ;; 0xd0 0457 B4 D0 45 1499 cjne a,#0xd0,cmdnotd0 045A 90 7F E8 1500 mov dptr,#SETUPDAT ; bRequestType == 0xc0 045D E0 1501 movx a,@dptr 045E B4 C0 3B 1502 cjne a,#0xc0,setupstalld0 0461 90 7F EC 1503 mov dptr,#SETUPDAT+4 ; wIndex 0464 E0 1504 movx a,@dptr 0465 B4 01 08 1505 cjne a,#1,0$ 0468 90 7F EA 1506 mov dptr,#SETUPDAT+2 ; wValue 046B E0 1507 movx a,@dptr 046C 54 01 1508 anl a,#1 046E F5*0C 1509 mov pttforce,a 0470 1510 0$: ;; PTT status 0470 90 7F 00 1511 mov dptr,#IN0BUF 0473 E5*0C 1512 mov a,pttforce 0475 F0 1513 movx @dptr,a 1514 ;; DCD status 0476 90 C0 09 1515 mov dptr,#AUDIOSTAT 0479 E0 1516 movx a,@dptr 047A 54 01 1517 anl a,#1 047C 64 01 1518 xrl a,#1 047E 90 7F 01 1519 mov dptr,#IN0BUF+1 0481 F0 1520 movx @dptr,a 1521 ;; RSSI 0482 90 C0 04 1522 mov dptr,#AUDIORSSI 0485 E0 1523 movx a,@dptr 0486 90 7F 02 1524 mov dptr,#IN0BUF+2 0489 F0 1525 movx @dptr,a 1526 ;; length 048A 90 7F EE 1527 mov dptr,#SETUPDAT+6 ; wLength 048D E0 1528 movx a,@dptr 048E 24 FD 1529 add a,#-3 0490 50 01 1530 jnc 2$ 0492 E4 1531 clr a 0493 24 03 1532 2$: add a,#3 0495 90 7F B5 1533 mov dptr,#IN0BC 0498 F0 1534 movx @dptr,a 0499 02s06r60 1535 ljmp setupack 049C 1536 setupstalld0: 049C 02s06r5C 1537 ljmp setupstall 049F 1538 cmdnotd0: 1539 ;; 0xd2 049F B4 D2 20 1540 cjne a,#0xd2,cmdnotd2 04A2 90 7F E8 1541 mov dptr,#SETUPDAT ; bRequestType == 0x40 04A5 E0 1542 movx a,@dptr 04A6 B4 40 16 1543 cjne a,#0x40,setupstalld2 04A9 90 7F EA 1544 mov dptr,#SETUPDAT+2 ; wValue 04AC E0 1545 movx a,@dptr 04AD F5 F0 1546 mov b,a 04AF 90 7F 98 1547 mov dptr,#OUTC 04B2 E0 1548 movx a,@dptr 04B3 A2 F0 1549 mov c,b.0 04B5 92 E3 1550 mov acc.3,c 04B7 A2 F1 1551 mov c,b.1 04B9 92 E5 1552 mov acc.5,c 04BB F0 1553 movx @dptr,a 04BC 02s06r60 1554 ljmp setupack 04BF 1555 setupstalld2: 04BF 02s06r5C 1556 ljmp setupstall 04C2 1557 cmdnotd2: 1558 ;; 0xd3 04C2 B4 D3 16 1559 cjne a,#0xd3,cmdnotd3 04C5 90 7F E8 1560 mov dptr,#SETUPDAT ; bRequestType == 0x40 04C8 E0 1561 movx a,@dptr 04C9 B4 40 07 1562 cjne a,#0x40,setupstalld3 04CC 90 7F EA 1563 mov dptr,#SETUPDAT+2 ; wValue 04CF E0 1564 movx a,@dptr 04D0 10*09 03 1565 jbc uartempty,cmdd2cont 04D3 1566 setupstalld3: 04D3 02s06r5C 1567 ljmp setupstall 04D6 1568 cmdd2cont: 04D6 F5 99 1569 mov sbuf0,a 04D8 02s06r60 1570 ljmp setupack 04DB 1571 cmdnotd3: 1572 ;; 0xd4 04DB B4 D4 49 1573 cjne a,#0xd4,cmdnotd4 04DE 90 7F E8 1574 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04E1 E0 1575 movx a,@dptr 04E2 B4 C0 3F 1576 cjne a,#0xc0,setupstalld4 04E5 90 7F EC 1577 mov dptr,#SETUPDAT+4 ; wIndex 04E8 E0 1578 movx a,@dptr 04E9 90 7F EA 1579 mov dptr,#SETUPDAT+2 ; wValue 04EC B4 01 09 1580 cjne a,#1,0$ 04EF E0 1581 movx a,@dptr 04F0 90 C0 0D 1582 mov dptr,#AUDIOMDISCOUT 04F3 F0 1583 movx @dptr,a 04F4 F5*21 1584 mov mdiscout,a 04F6 80 0A 1585 sjmp 1$ 04F8 B4 02 07 1586 0$: cjne a,#2,1$ 04FB E0 1587 movx a,@dptr 04FC 90 C0 0C 1588 mov dptr,#AUDIOMDISCTRIS 04FF F0 1589 movx @dptr,a 0500 F5*20 1590 mov mdisctris,a 0502 90 C0 0E 1591 1$: mov dptr,#AUDIOMDISCIN 0505 E0 1592 movx a,@dptr 0506 90 7F 00 1593 mov dptr,#IN0BUF+0 0509 F0 1594 movx @dptr,a 050A E5*21 1595 mov a,mdiscout 050C A3 1596 inc dptr 050D F0 1597 movx @dptr,a 050E E5*20 1598 mov a,mdisctris 0510 A3 1599 inc dptr 0511 F0 1600 movx @dptr,a 1601 ;; length 0512 90 7F EE 1602 mov dptr,#SETUPDAT+6 ; wLength 0515 E0 1603 movx a,@dptr 0516 24 FD 1604 add a,#-3 0518 50 01 1605 jnc 2$ 051A E4 1606 clr a 051B 24 03 1607 2$: add a,#3 051D 90 7F B5 1608 mov dptr,#IN0BC 0520 F0 1609 movx @dptr,a 0521 02s06r60 1610 ljmp setupack 0524 1611 setupstalld4: 0524 02s06r5C 1612 ljmp setupstall 0527 1613 cmdnotd4: 1614 ;; 0xd5 0527 B4 D5 3F 1615 cjne a,#0xd5,cmdnotd5 052A 90 7F E8 1616 mov dptr,#SETUPDAT ; bRequestType == 0xc0 052D E0 1617 movx a,@dptr 052E B4 C0 32 1618 cjne a,#0xc0,setupstalld5 0531 90 7F EC 1619 mov dptr,#SETUPDAT+4 ; wIndex 0534 E0 1620 movx a,@dptr 0535 B4 01 0A 1621 cjne a,#1,0$ 0538 90 7F EA 1622 mov dptr,#SETUPDAT+2 ; wValue 053B E0 1623 movx a,@dptr 053C 90 C0 0A 1624 mov dptr,#AUDIOT7FOUT 053F F0 1625 movx @dptr,a 0540 F5*1F 1626 mov t7fout,a 0542 90 C0 0B 1627 0$: mov dptr,#AUDIOT7FIN 0545 E0 1628 movx a,@dptr 0546 90 7F 00 1629 mov dptr,#IN0BUF+0 0549 F0 1630 movx @dptr,a 054A E5*1F 1631 mov a,t7fout 054C A3 1632 inc dptr 054D 90 7F 01 1633 mov dptr,#IN0BUF+1 0550 F0 1634 movx @dptr,a 1635 ;; length 0551 90 7F EE 1636 mov dptr,#SETUPDAT+6 ; wLength 0554 E0 1637 movx a,@dptr 0555 24 FE 1638 add a,#-2 0557 50 01 1639 jnc 2$ 0559 E4 1640 clr a 055A 24 02 1641 2$: add a,#2 055C 90 7F B5 1642 mov dptr,#IN0BC 055F F0 1643 movx @dptr,a 0560 02s06r60 1644 ljmp setupack 0563 1645 setupstalld5: 0563 1646 setupstalle0: 0563 02s06r5C 1647 ljmp setupstall 0566 1648 cmdnote0_0: 0566 02s05rFC 1649 ljmp cmdnote0 0569 1650 cmdnotd5: 1651 ;; 0xe0 0569 B4 E0 FA 1652 cjne a,#0xe0,cmdnote0_0 056C 90 7F E8 1653 mov dptr,#SETUPDAT ; bRequestType == 0xc0 056F E0 1654 movx a,@dptr 0570 B4 C0 F0 1655 cjne a,#0xc0,setupstalle0 1656 ;; set PTT, LED's and counter mode 0573 90 7F EC 1657 mov dptr,#SETUPDAT+4 ; wIndex 0576 E0 1658 movx a,@dptr 0577 B4 01 12 1659 cjne a,#1,1$ 057A 90 7F EA 1660 mov dptr,#SETUPDAT+2 ; wValue 057D E0 1661 movx a,@dptr 057E 54 78 1662 anl a,#0x78 0580 C5 20 1663 xch a,ctrlreg 0582 54 07 1664 anl a,#0x07 0584 45 20 1665 orl a,ctrlreg 0586 F5 20 1666 mov ctrlreg,a 0588 90 C0 08 1667 mov dptr,#AUDIOCTRL 058B F0 1668 movx @dptr,a 058C 90 7F EE 1669 1$: mov dptr,#SETUPDAT+6 ; wLength 058F E0 1670 movx a,@dptr 0590 60 0D 1671 jz 3$ 0592 B4 01 11 1672 cjne a,#1,2$ 0595 E5 20 1673 mov a,ctrlreg 0597 90 7F 00 1674 mov dptr,#IN0BUF 059A 54 7F 1675 anl a,#0x7f 059C F0 1676 movx @dptr,a 059D 74 01 1677 mov a,#1 059F 90 7F B5 1678 3$: mov dptr,#IN0BC 05A2 F0 1679 movx @dptr,a 05A3 02s06r60 1680 ljmp setupack 05A6 90 C0 08 1681 2$: mov dptr,#AUDIOCTRL 05A9 D2*07 1682 setb ctrl_cntsel 05AB E5 20 1683 mov a,ctrlreg 05AD F0 1684 movx @dptr,a 05AE 90 C0 05 1685 mov dptr,#AUDIOCNTLOW 05B1 E0 1686 movx a,@dptr 05B2 90 7F 04 1687 mov dptr,#IN0BUF+4 05B5 F0 1688 movx @dptr,a 05B6 90 C0 06 1689 mov dptr,#AUDIOCNTMID 05B9 E0 1690 movx a,@dptr 05BA 90 7F 05 1691 mov dptr,#IN0BUF+5 05BD F0 1692 movx @dptr,a 05BE 90 C0 07 1693 mov dptr,#AUDIOCNTHIGH 05C1 E0 1694 movx a,@dptr 05C2 90 7F 06 1695 mov dptr,#IN0BUF+6 05C5 F0 1696 movx @dptr,a 05C6 90 C0 08 1697 mov dptr,#AUDIOCTRL 05C9 C2*07 1698 clr ctrl_cntsel 05CB E5 20 1699 mov a,ctrlreg 05CD F0 1700 movx @dptr,a 05CE 90 7F 00 1701 mov dptr,#IN0BUF 05D1 F0 1702 movx @dptr,a 05D2 90 C0 05 1703 mov dptr,#AUDIOCNTLOW 05D5 E0 1704 movx a,@dptr 05D6 90 7F 01 1705 mov dptr,#IN0BUF+1 05D9 F0 1706 movx @dptr,a 05DA 90 C0 06 1707 mov dptr,#AUDIOCNTMID 05DD E0 1708 movx a,@dptr 05DE 90 7F 02 1709 mov dptr,#IN0BUF+2 05E1 F0 1710 movx @dptr,a 05E2 90 C0 07 1711 mov dptr,#AUDIOCNTHIGH 05E5 E0 1712 movx a,@dptr 05E6 90 7F 03 1713 mov dptr,#IN0BUF+3 05E9 F0 1714 movx @dptr,a 1715 ;; length 05EA 90 7F EE 1716 mov dptr,#SETUPDAT+6 ; wLength 05ED E0 1717 movx a,@dptr 05EE 24 F9 1718 add a,#-7 05F0 50 01 1719 jnc 4$ 05F2 E4 1720 clr a 05F3 24 07 1721 4$: add a,#7 05F5 90 7F B5 1722 mov dptr,#IN0BC 05F8 F0 1723 movx @dptr,a 05F9 02s06r60 1724 ljmp setupack 05FC 1725 cmdnote0: 1726 ;; 0xe1 05FC B4 E1 3A 1727 cjne a,#0xe1,cmdnote1 05FF 90 7F E8 1728 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0602 E0 1729 movx a,@dptr 0603 B4 C0 30 1730 cjne a,#0xc0,setupstalle1 0606 90 7F 00 1731 mov dptr,#IN0BUF 0609 E5*05 1732 mov a,sofcount 060B F0 1733 movx @dptr,a 060C A3 1734 inc dptr 060D E5*09 1735 mov a,framesize 060F F0 1736 movx @dptr,a 0610 A3 1737 inc dptr 0611 E5*06 1738 mov a,divider 0613 F0 1739 movx @dptr,a 0614 A3 1740 inc dptr 0615 E5*07 1741 mov a,divider+1 0617 F0 1742 movx @dptr,a 0618 A3 1743 inc dptr 0619 E5*08 1744 mov a,divrel 061B F0 1745 movx @dptr,a 061C A3 1746 inc dptr 061D E5*0A 1747 mov a,pllcorrvar 061F F0 1748 movx @dptr,a 0620 A3 1749 inc dptr 0621 E5*0B 1750 mov a,txfifocount 0623 F0 1751 movx @dptr,a 1752 1753 ;mov dptr,#AUDIOTXFIFOCNT 1754 ;movx a,@dptr 1755 ;mov dptr,#IN0BUF+6 1756 ;movx @dptr,a 1757 1758 ;; length 0624 90 7F EE 1759 mov dptr,#SETUPDAT+6 ; wLength 0627 E0 1760 movx a,@dptr 0628 24 F9 1761 add a,#-7 062A 50 01 1762 jnc 1$ 062C E4 1763 clr a 062D 24 07 1764 1$: add a,#7 062F 90 7F B5 1765 mov dptr,#IN0BC 0632 F0 1766 movx @dptr,a 0633 02s06r60 1767 ljmp setupack 0636 1768 setupstalle1: 0636 02s06r5C 1769 ljmp setupstall 0639 1770 cmdnote1: 1771 ;; 0xe2 0639 B4 E2 20 1772 cjne a,#0xe2,cmdnote2 063C 90 7F E8 1773 mov dptr,#SETUPDAT ; bRequestType == 0xc0 063F E0 1774 movx a,@dptr 0640 B4 C0 16 1775 cjne a,#0xc0,setupstalle2 0643 90 7F 00 1776 mov dptr,#IN0BUF 0646 78r00 1777 mov r0,#txsamples 0648 AF*09 1778 mov r7,framesize 064A E6 1779 1$: mov a,@r0 064B F0 1780 movx @dptr,a 064C 08 1781 inc r0 064D A3 1782 inc dptr 064E DF FA 1783 djnz r7,1$ 0650 90 7F B5 1784 mov dptr,#IN0BC 0653 E5*09 1785 mov a,framesize 0655 F0 1786 movx @dptr,a 0656 02s06r60 1787 ljmp setupack 0659 1788 setupstalle2: 0659 02s06r5C 1789 ljmp setupstall 065C 1790 cmdnote2: 1791 1792 ;; unknown commands fall through to setupstall 1793 065C 1794 setupstall: 065C 74 03 1795 mov a,#3 065E 80 02 1796 sjmp endsetup 0660 1797 setupack: 0660 74 02 1798 mov a,#2 0662 1799 endsetup: 0662 90 7F B4 1800 mov dptr,#EP0CS 0665 F0 1801 movx @dptr,a 0666 1802 endusbisr: 1803 ;; epilogue 0666 D0 07 1804 pop ar7 0668 D0 00 1805 pop ar0 066A D0 86 1806 pop dps 066C D0 D0 1807 pop psw 066E D0 85 1808 pop dph1 0670 D0 84 1809 pop dpl1 0672 D0 83 1810 pop dph0 0674 D0 82 1811 pop dpl0 0676 D0 F0 1812 pop b 0678 D0 E0 1813 pop acc 067A 32 1814 reti 1815 067B 1816 usb_sof_isr: 067B C0 E0 1817 push acc 067D C0 F0 1818 push b 067F C0 82 1819 push dpl0 0681 C0 83 1820 push dph0 0683 C0 84 1821 push dpl1 0685 C0 85 1822 push dph1 0687 C0 D0 1823 push psw 0689 75 D0 00 1824 mov psw,#0x00 068C C0 86 1825 push dps 068E 75 86 00 1826 mov dps,#0 0691 C0 02 1827 push ar2 0693 C0 03 1828 push ar3 0695 C0 00 1829 push ar0 1830 ;; clear interrupt 0697 E5 91 1831 mov a,exif 0699 C2 E4 1832 clr acc.4 069B F5 91 1833 mov exif,a 069D 90 7F AB 1834 mov dptr,#USBIRQ 06A0 74 02 1835 mov a,#0x02 06A2 F0 1836 movx @dptr,a 1837 ;; handle interrupt 06A3 05*05 1838 inc sofcount 1839 ;; debugging: we have two cases 1840 ;; if the ISO frame size is just 2 bytes, 1841 ;; we return the frame number, otherwise 1842 ;; the required numbers of samples 06A5 E5*09 1843 mov a,framesize 06A7 B4 02 14 1844 cjne a,#2,1$ 1845 ;; copy the frame number 06AA 90 7F D8 1846 mov dptr,#USBFRAMEL 06AD E0 1847 movx a,@dptr 06AE A3 1848 inc dptr 06AF 05 86 1849 inc dps 06B1 90 7F 68 1850 mov dptr,#IN8DATA 06B4 F0 1851 movx @dptr,a 06B5 15 86 1852 dec dps 06B7 E0 1853 movx a,@dptr 06B8 05 86 1854 inc dps 06BA F0 1855 movx @dptr,a 06BB 02s07rAE 1856 ljmp sofendisr 06BE B4 03 36 1857 1$: cjne a,#3,sofsampleisr 06C1 90 7F A0 1858 mov dptr,#ISOERR 06C4 E0 1859 movx a,@dptr 06C5 20 E0 23 1860 jb acc.0,3$ 06C8 90 7F 70 1861 mov dptr,#OUT8BCH 06CB E0 1862 movx a,@dptr 06CC 70 1D 1863 jnz 3$ 06CE 90 7F 71 1864 mov dptr,#OUT8BCL 06D1 E0 1865 movx a,@dptr 06D2 B4 03 16 1866 cjne a,#3,3$ 06D5 FA 1867 mov r2,a 06D6 90 7F 60 1868 mov dptr,#OUT8DATA 06D9 05 86 1869 inc dps 06DB 90 7F 68 1870 mov dptr,#IN8DATA 06DE 15 86 1871 dec dps 06E0 E0 1872 2$: movx a,@dptr 06E1 05 86 1873 inc dps 06E3 F0 1874 movx @dptr,a 06E4 15 86 1875 dec dps 06E6 DA F8 1876 djnz r2,2$ 06E8 02s07rAE 1877 ljmp sofendisr 06EB 7A 03 1878 3$: mov r2,#3 06ED 90 7F 68 1879 mov dptr,#IN8DATA 06F0 E4 1880 clr a 06F1 F0 1881 4$: movx @dptr,a 06F2 DA FD 1882 djnz r2,4$ 06F4 02s07rAE 1883 ljmp sofendisr 06F7 1884 sofsampleisr: 06F7 90 C0 01 1885 mov dptr,#AUDIORXFIFOCNT 06FA E0 1886 movx a,@dptr 06FB C3 1887 clr c 06FC 95*09 1888 subb a,framesize 06FE E0 1889 movx a,@dptr 06FF 40 02 1890 jc 1$ 0701 E5*09 1891 mov a,framesize 0703 FA 1892 1$: mov r2,a 0704 FB 1893 mov r3,a 0705 60 12 1894 jz 2$ 0707 90 C0 00 1895 mov dptr,#AUDIORXFIFO 070A 05 86 1896 inc dps 070C 90 7F 68 1897 mov dptr,#IN8DATA 070F 15 86 1898 dec dps 0711 E0 1899 3$: movx a,@dptr 0712 05 86 1900 inc dps 0714 F0 1901 movx @dptr,a 0715 15 86 1902 dec dps 0717 DA F8 1903 djnz r2,3$ 0719 E5*09 1904 2$: mov a,framesize 071B C3 1905 clr c 071C 9B 1906 subb a,r3 071D 60 08 1907 jz 4$ 071F FA 1908 mov r2,a 0720 90 7F 68 1909 mov dptr,#IN8DATA 0723 E4 1910 clr a 0724 F0 1911 5$: movx @dptr,a 0725 DA FD 1912 djnz r2,5$ 1913 ;; sample rate adjustment 0727 90 C0 01 1914 4$: mov dptr,#AUDIORXFIFOCNT 072A E0 1915 movx a,@dptr 072B F5*0A 1916 mov pllcorrvar,a 072D 24 FC 1917 add a,#-4 072F 60 05 1918 jz 10$ ; no adjustment 0731 33 1919 rlc a 0732 95 E0 1920 subb a,acc 0734 D2 E0 1921 setb acc.0 0736 FB 1922 10$: mov r3,a ; r3 & acc contain the adjust value 0737 25*08 1923 add a,divrel 1924 ;; zero is the guard value 0739 60 02 1925 jz 11$ 073B F5*08 1926 mov divrel,a 073D E5*08 1927 11$: mov a,divrel 073F 03 1928 rr a 0740 03 1929 rr a 0741 03 1930 rr a 0742 03 1931 rr a 0743 54 0F 1932 anl a,#0xf 0745 2B 1933 add a,r3 ; momentary correction 0746 25*06 1934 add a,divider 0748 FA 1935 mov r2,a 0749 E5*07 1936 mov a,divider+1 074B 34 00 1937 addc a,#0 074D 90 C0 02 1938 mov dptr,#AUDIODIVIDERHI 0750 F0 1939 movx @dptr,a 0751 EA 1940 mov a,r2 0752 90 C0 01 1941 mov dptr,#AUDIODIVIDERLO 0755 F0 1942 movx @dptr,a 1943 ;; OUT data 0756 90 7F A0 1944 mov dptr,#ISOERR 0759 E0 1945 movx a,@dptr 075A 20 E0 39 1946 jb acc.0,20$ 075D 90 7F 70 1947 mov dptr,#OUT8BCH 0760 E0 1948 movx a,@dptr 0761 70 33 1949 jnz 20$ 0763 90 7F 71 1950 mov dptr,#OUT8BCL 0766 E0 1951 movx a,@dptr 0767 C3 1952 clr c 0768 95*09 1953 subb a,framesize 076A 70 2A 1954 jnz 20$ 076C 90 C0 02 1955 mov dptr,#AUDIOTXFIFOCNT 076F E0 1956 movx a,@dptr 0770 F5*0B 1957 mov txfifocount,a 0772 C3 1958 clr c 0773 95*09 1959 subb a,framesize 0775 E5*0B 1960 mov a,txfifocount 0777 40 02 1961 jc 14$ 0779 E5*09 1962 mov a,framesize 077B 60 17 1963 14$: jz 13$ 077D FA 1964 mov r2,a 077E 90 7F 60 1965 mov dptr,#OUT8DATA 0781 05 86 1966 inc dps 0783 90 C0 00 1967 mov dptr,#AUDIOTXFIFO 0786 15 86 1968 dec dps 0788 78r00 1969 mov r0,#txsamples 078A E0 1970 12$: movx a,@dptr 078B 05 86 1971 inc dps 078D F0 1972 movx @dptr,a 078E 15 86 1973 dec dps 0790 F6 1974 mov @r0,a 0791 08 1975 inc r0 0792 DA F6 1976 djnz r2,12$ 0794 80 18 1977 13$: sjmp sofendisr 1978 ;; initialize TX if invalid packet 0796 90 C0 02 1979 20$: mov dptr,#AUDIOTXFIFOCNT 0799 E0 1980 movx a,@dptr 079A F5*0B 1981 mov txfifocount,a 079C 24 FC 1982 add a,#-4 079E 54 3F 1983 anl a,#0x3f 07A0 60 0C 1984 jz sofendisr 07A2 FA 1985 mov r2,a 07A3 90 C0 00 1986 mov dptr,#AUDIOTXFIFO 07A6 E4 1987 clr a 07A7 78r00 1988 mov r0,#txsamples 07A9 F0 1989 21$: movx @dptr,a 07AA F6 1990 mov @r0,a 07AB 08 1991 inc r0 07AC DA FB 1992 djnz r2,21$ 1993 07AE 1994 sofendisr: 1995 ;; epilogue 07AE D0 00 1996 pop ar0 07B0 D0 03 1997 pop ar3 07B2 D0 02 1998 pop ar2 07B4 D0 86 1999 pop dps 07B6 D0 D0 2000 pop psw 07B8 D0 85 2001 pop dph1 07BA D0 84 2002 pop dpl1 07BC D0 83 2003 pop dph0 07BE D0 82 2004 pop dpl0 07C0 D0 F0 2005 pop b 07C2 D0 E0 2006 pop acc 07C4 32 2007 reti 2008 2009 07C5 2010 usb_sutok_isr: 07C5 C0 E0 2011 push acc 07C7 C0 F0 2012 push b 07C9 C0 82 2013 push dpl0 07CB C0 83 2014 push dph0 07CD C0 D0 2015 push psw 07CF 75 D0 00 2016 mov psw,#0x00 07D2 C0 86 2017 push dps 07D4 75 86 00 2018 mov dps,#0 2019 ;; clear interrupt 07D7 E5 91 2020 mov a,exif 07D9 C2 E4 2021 clr acc.4 07DB F5 91 2022 mov exif,a 07DD 90 7F AB 2023 mov dptr,#USBIRQ 07E0 74 04 2024 mov a,#0x04 07E2 F0 2025 movx @dptr,a 2026 ;; handle interrupt 2027 ;; epilogue 07E3 D0 86 2028 pop dps 07E5 D0 D0 2029 pop psw 07E7 D0 83 2030 pop dph0 07E9 D0 82 2031 pop dpl0 07EB D0 F0 2032 pop b 07ED D0 E0 2033 pop acc 07EF 32 2034 reti 2035 07F0 2036 usb_suspend_isr: 07F0 C0 E0 2037 push acc 07F2 C0 F0 2038 push b 07F4 C0 82 2039 push dpl0 07F6 C0 83 2040 push dph0 07F8 C0 D0 2041 push psw 07FA 75 D0 00 2042 mov psw,#0x00 07FD C0 86 2043 push dps 07FF 75 86 00 2044 mov dps,#0 2045 ;; clear interrupt 0802 E5 91 2046 mov a,exif 0804 C2 E4 2047 clr acc.4 0806 F5 91 2048 mov exif,a 0808 90 7F AB 2049 mov dptr,#USBIRQ 080B 74 08 2050 mov a,#0x08 080D F0 2051 movx @dptr,a 2052 ;; handle interrupt 2053 ;; epilogue 080E D0 86 2054 pop dps 0810 D0 D0 2055 pop psw 0812 D0 83 2056 pop dph0 0814 D0 82 2057 pop dpl0 0816 D0 F0 2058 pop b 0818 D0 E0 2059 pop acc 081A 32 2060 reti 2061 081B 2062 usb_usbreset_isr: 081B C0 E0 2063 push acc 081D C0 F0 2064 push b 081F C0 82 2065 push dpl0 0821 C0 83 2066 push dph0 0823 C0 D0 2067 push psw 0825 75 D0 00 2068 mov psw,#0x00 0828 C0 86 2069 push dps 082A 75 86 00 2070 mov dps,#0 2071 ;; clear interrupt 082D E5 91 2072 mov a,exif 082F C2 E4 2073 clr acc.4 0831 F5 91 2074 mov exif,a 0833 90 7F AB 2075 mov dptr,#USBIRQ 0836 74 10 2076 mov a,#0x10 0838 F0 2077 movx @dptr,a 2078 ;; handle interrupt 2079 ;; epilogue 0839 D0 86 2080 pop dps 083B D0 D0 2081 pop psw 083D D0 83 2082 pop dph0 083F D0 82 2083 pop dpl0 0841 D0 F0 2084 pop b 0843 D0 E0 2085 pop acc 0845 32 2086 reti 2087 0846 2088 usb_ep0in_isr: 0846 C0 E0 2089 push acc 0848 C0 F0 2090 push b 084A C0 82 2091 push dpl0 084C C0 83 2092 push dph0 084E C0 84 2093 push dpl1 0850 C0 85 2094 push dph1 0852 C0 D0 2095 push psw 0854 75 D0 00 2096 mov psw,#0x00 0857 C0 86 2097 push dps 0859 75 86 00 2098 mov dps,#0 085C C0 00 2099 push ar0 085E C0 07 2100 push ar7 2101 ;; clear interrupt 0860 E5 91 2102 mov a,exif 0862 C2 E4 2103 clr acc.4 0864 F5 91 2104 mov exif,a 0866 90 7F A9 2105 mov dptr,#IN07IRQ 0869 74 01 2106 mov a,#0x01 086B F0 2107 movx @dptr,a 2108 ;; handle interrupt 2109 ;; epilogue 086C D0 07 2110 pop ar7 086E D0 00 2111 pop ar0 0870 D0 86 2112 pop dps 0872 D0 D0 2113 pop psw 0874 D0 85 2114 pop dph1 0876 D0 84 2115 pop dpl1 0878 D0 83 2116 pop dph0 087A D0 82 2117 pop dpl0 087C D0 F0 2118 pop b 087E D0 E0 2119 pop acc 0880 32 2120 reti 2121 0881 2122 usb_ep0out_isr: 0881 C0 E0 2123 push acc 0883 C0 F0 2124 push b 0885 C0 82 2125 push dpl0 0887 C0 83 2126 push dph0 0889 C0 84 2127 push dpl1 088B C0 85 2128 push dph1 088D C0 D0 2129 push psw 088F 75 D0 00 2130 mov psw,#0x00 0892 C0 86 2131 push dps 0894 75 86 00 2132 mov dps,#0 0897 C0 00 2133 push ar0 0899 C0 06 2134 push ar6 2135 ;; clear interrupt 089B E5 91 2136 mov a,exif 089D C2 E4 2137 clr acc.4 089F F5 91 2138 mov exif,a 08A1 90 7F AA 2139 mov dptr,#OUT07IRQ 08A4 74 01 2140 mov a,#0x01 08A6 F0 2141 movx @dptr,a 2142 ;; handle interrupt 2143 ;; epilogue 08A7 D0 06 2144 pop ar6 08A9 D0 00 2145 pop ar0 08AB D0 86 2146 pop dps 08AD D0 D0 2147 pop psw 08AF D0 85 2148 pop dph1 08B1 D0 84 2149 pop dpl1 08B3 D0 83 2150 pop dph0 08B5 D0 82 2151 pop dpl0 08B7 D0 F0 2152 pop b 08B9 D0 E0 2153 pop acc 08BB 32 2154 reti 2155 08BC 2156 fillusbintr:: 08BC E5*0C 2157 mov a,pttforce 08BE F5 F0 2158 mov b,a 08C0 A2 E0 2159 mov c,acc.0 08C2 92 F2 2160 mov b.2,c 08C4 90 C0 09 2161 mov dptr,#AUDIOSTAT 08C7 E0 2162 movx a,@dptr 08C8 A2 E0 2163 mov c,acc.0 08CA 92 F3 2164 mov b.3,c 08CC A2*09 2165 mov c,uartempty 08CE 92 F5 2166 mov b.5,c 2167 ;; bytewide elements 08D0 90 7E 80 2168 mov dptr,#(IN1BUF) 08D3 E5 F0 2169 mov a,b 08D5 F0 2170 movx @dptr,a 08D6 E5*05 2171 mov a,sofcount 08D8 90 7E 81 2172 mov dptr,#(IN1BUF+1) 08DB F0 2173 movx @dptr,a 08DC 90 7F E0 2174 mov dptr,#INISOVAL 08DF E0 2175 movx a,@dptr 08E0 90 7E 82 2176 mov dptr,#(IN1BUF+2) 08E3 F0 2177 movx @dptr,a 08E4 90 C0 04 2178 mov dptr,#AUDIORSSI 08E7 E0 2179 movx a,@dptr 08E8 90 7E 83 2180 mov dptr,#(IN1BUF+3) 08EB F0 2181 movx @dptr,a 2182 ; counter 08EC 05*04 2183 inc irqcount 08EE E5*04 2184 mov a,irqcount 08F0 90 7E 84 2185 mov dptr,#(IN1BUF+4) 08F3 F0 2186 movx @dptr,a 2187 ; UART buffer 08F4 75 F0 05 2188 mov b,#5 08F7 90 7E 85 2189 mov dptr,#(IN1BUF+5) 08FA E5*1E 2190 2$: mov a,uartrd 08FC B5*1D 07 2191 cjne a,uartwr,3$ 2192 ; set length 08FF 90 7F B7 2193 mov dptr,#IN1BC 0902 E5 F0 2194 mov a,b 0904 F0 2195 movx @dptr,a 0905 22 2196 ret 2197 0906 24r0D 2198 3$: add a,#uartbuf 0908 F8 2199 mov r0,a 0909 E6 2200 mov a,@r0 090A F0 2201 movx @dptr,a 090B A3 2202 inc dptr 090C 05 F0 2203 inc b 090E E5*1E 2204 mov a,uartrd 0910 04 2205 inc a 0911 54 0F 2206 anl a,#0xf 0913 F5*1E 2207 mov uartrd,a 0915 80 E3 2208 sjmp 2$ 2209 2210 0917 2211 usb_ep1in_isr: 0917 C0 E0 2212 push acc 0919 C0 F0 2213 push b 091B C0 82 2214 push dpl0 091D C0 83 2215 push dph0 091F C0 D0 2216 push psw 0921 75 D0 00 2217 mov psw,#0x00 0924 C0 86 2218 push dps 0926 75 86 00 2219 mov dps,#0 2220 ;; clear interrupt 0929 E5 91 2221 mov a,exif 092B C2 E4 2222 clr acc.4 092D F5 91 2223 mov exif,a 092F 90 7F A9 2224 mov dptr,#IN07IRQ 0932 74 02 2225 mov a,#0x02 0934 F0 2226 movx @dptr,a 2227 ;; handle interrupt 0935 12s08rBC 2228 lcall fillusbintr 2229 ;; epilogue 0938 D0 86 2230 pop dps 093A D0 D0 2231 pop psw 093C D0 83 2232 pop dph0 093E D0 82 2233 pop dpl0 0940 D0 F0 2234 pop b 0942 D0 E0 2235 pop acc 0944 32 2236 reti 2237 0945 2238 usb_ep1out_isr: 0945 C0 E0 2239 push acc 0947 C0 F0 2240 push b 0949 C0 82 2241 push dpl0 094B C0 83 2242 push dph0 094D C0 D0 2243 push psw 094F 75 D0 00 2244 mov psw,#0x00 0952 C0 86 2245 push dps 0954 75 86 00 2246 mov dps,#0 2247 ;; clear interrupt 0957 E5 91 2248 mov a,exif 0959 C2 E4 2249 clr acc.4 095B F5 91 2250 mov exif,a 095D 90 7F AA 2251 mov dptr,#OUT07IRQ 0960 74 02 2252 mov a,#0x02 0962 F0 2253 movx @dptr,a 2254 ;; handle interrupt 2255 ;; epilogue 0963 D0 86 2256 pop dps 0965 D0 D0 2257 pop psw 0967 D0 83 2258 pop dph0 0969 D0 82 2259 pop dpl0 096B D0 F0 2260 pop b 096D D0 E0 2261 pop acc 096F 32 2262 reti 2263 0970 2264 usb_ep2in_isr: 0970 C0 E0 2265 push acc 0972 C0 F0 2266 push b 0974 C0 82 2267 push dpl0 0976 C0 83 2268 push dph0 0978 C0 D0 2269 push psw 097A 75 D0 00 2270 mov psw,#0x00 097D C0 86 2271 push dps 097F 75 86 00 2272 mov dps,#0 2273 ;; clear interrupt 0982 E5 91 2274 mov a,exif 0984 C2 E4 2275 clr acc.4 0986 F5 91 2276 mov exif,a 0988 90 7F A9 2277 mov dptr,#IN07IRQ 098B 74 04 2278 mov a,#0x04 098D F0 2279 movx @dptr,a 2280 ;; handle interrupt 2281 ;; epilogue 098E D0 86 2282 pop dps 0990 D0 D0 2283 pop psw 0992 D0 83 2284 pop dph0 0994 D0 82 2285 pop dpl0 0996 D0 F0 2286 pop b 0998 D0 E0 2287 pop acc 099A 32 2288 reti 2289 099B 2290 usb_ep2out_isr: 099B C0 E0 2291 push acc 099D C0 F0 2292 push b 099F C0 82 2293 push dpl0 09A1 C0 83 2294 push dph0 09A3 C0 D0 2295 push psw 09A5 75 D0 00 2296 mov psw,#0x00 09A8 C0 86 2297 push dps 09AA 75 86 00 2298 mov dps,#0 2299 ;; clear interrupt 09AD E5 91 2300 mov a,exif 09AF C2 E4 2301 clr acc.4 09B1 F5 91 2302 mov exif,a 09B3 90 7F AA 2303 mov dptr,#OUT07IRQ 09B6 74 04 2304 mov a,#0x04 09B8 F0 2305 movx @dptr,a 2306 ;; handle interrupt 2307 ;; epilogue 09B9 D0 86 2308 pop dps 09BB D0 D0 2309 pop psw 09BD D0 83 2310 pop dph0 09BF D0 82 2311 pop dpl0 09C1 D0 F0 2312 pop b 09C3 D0 E0 2313 pop acc 09C5 32 2314 reti 2315 09C6 2316 usb_ep3in_isr: 09C6 C0 E0 2317 push acc 09C8 C0 F0 2318 push b 09CA C0 82 2319 push dpl0 09CC C0 83 2320 push dph0 09CE C0 D0 2321 push psw 09D0 75 D0 00 2322 mov psw,#0x00 09D3 C0 86 2323 push dps 09D5 75 86 00 2324 mov dps,#0 2325 ;; clear interrupt 09D8 E5 91 2326 mov a,exif 09DA C2 E4 2327 clr acc.4 09DC F5 91 2328 mov exif,a 09DE 90 7F A9 2329 mov dptr,#IN07IRQ 09E1 74 08 2330 mov a,#0x08 09E3 F0 2331 movx @dptr,a 2332 ;; handle interrupt 2333 ;; epilogue 09E4 D0 86 2334 pop dps 09E6 D0 D0 2335 pop psw 09E8 D0 83 2336 pop dph0 09EA D0 82 2337 pop dpl0 09EC D0 F0 2338 pop b 09EE D0 E0 2339 pop acc 09F0 32 2340 reti 2341 09F1 2342 usb_ep3out_isr: 09F1 C0 E0 2343 push acc 09F3 C0 F0 2344 push b 09F5 C0 82 2345 push dpl0 09F7 C0 83 2346 push dph0 09F9 C0 D0 2347 push psw 09FB 75 D0 00 2348 mov psw,#0x00 09FE C0 86 2349 push dps 0A00 75 86 00 2350 mov dps,#0 2351 ;; clear interrupt 0A03 E5 91 2352 mov a,exif 0A05 C2 E4 2353 clr acc.4 0A07 F5 91 2354 mov exif,a 0A09 90 7F AA 2355 mov dptr,#OUT07IRQ 0A0C 74 08 2356 mov a,#0x08 0A0E F0 2357 movx @dptr,a 2358 ;; handle interrupt 2359 ;; epilogue 0A0F D0 86 2360 pop dps 0A11 D0 D0 2361 pop psw 0A13 D0 83 2362 pop dph0 0A15 D0 82 2363 pop dpl0 0A17 D0 F0 2364 pop b 0A19 D0 E0 2365 pop acc 0A1B 32 2366 reti 2367 0A1C 2368 usb_ep4in_isr: 0A1C C0 E0 2369 push acc 0A1E C0 F0 2370 push b 0A20 C0 82 2371 push dpl0 0A22 C0 83 2372 push dph0 0A24 C0 D0 2373 push psw 0A26 75 D0 00 2374 mov psw,#0x00 0A29 C0 86 2375 push dps 0A2B 75 86 00 2376 mov dps,#0 2377 ;; clear interrupt 0A2E E5 91 2378 mov a,exif 0A30 C2 E4 2379 clr acc.4 0A32 F5 91 2380 mov exif,a 0A34 90 7F A9 2381 mov dptr,#IN07IRQ 0A37 74 10 2382 mov a,#0x10 0A39 F0 2383 movx @dptr,a 2384 ;; handle interrupt 2385 ;; epilogue 0A3A D0 86 2386 pop dps 0A3C D0 D0 2387 pop psw 0A3E D0 83 2388 pop dph0 0A40 D0 82 2389 pop dpl0 0A42 D0 F0 2390 pop b 0A44 D0 E0 2391 pop acc 0A46 32 2392 reti 2393 0A47 2394 usb_ep4out_isr: 0A47 C0 E0 2395 push acc 0A49 C0 F0 2396 push b 0A4B C0 82 2397 push dpl0 0A4D C0 83 2398 push dph0 0A4F C0 D0 2399 push psw 0A51 75 D0 00 2400 mov psw,#0x00 0A54 C0 86 2401 push dps 0A56 75 86 00 2402 mov dps,#0 2403 ;; clear interrupt 0A59 E5 91 2404 mov a,exif 0A5B C2 E4 2405 clr acc.4 0A5D F5 91 2406 mov exif,a 0A5F 90 7F AA 2407 mov dptr,#OUT07IRQ 0A62 74 10 2408 mov a,#0x10 0A64 F0 2409 movx @dptr,a 2410 ;; handle interrupt 2411 ;; epilogue 0A65 D0 86 2412 pop dps 0A67 D0 D0 2413 pop psw 0A69 D0 83 2414 pop dph0 0A6B D0 82 2415 pop dpl0 0A6D D0 F0 2416 pop b 0A6F D0 E0 2417 pop acc 0A71 32 2418 reti 2419 0A72 2420 usb_ep5in_isr: 0A72 C0 E0 2421 push acc 0A74 C0 F0 2422 push b 0A76 C0 82 2423 push dpl0 0A78 C0 83 2424 push dph0 0A7A C0 D0 2425 push psw 0A7C 75 D0 00 2426 mov psw,#0x00 0A7F C0 86 2427 push dps 0A81 75 86 00 2428 mov dps,#0 2429 ;; clear interrupt 0A84 E5 91 2430 mov a,exif 0A86 C2 E4 2431 clr acc.4 0A88 F5 91 2432 mov exif,a 0A8A 90 7F A9 2433 mov dptr,#IN07IRQ 0A8D 74 20 2434 mov a,#0x20 0A8F F0 2435 movx @dptr,a 2436 ;; handle interrupt 2437 ;; epilogue 0A90 D0 86 2438 pop dps 0A92 D0 D0 2439 pop psw 0A94 D0 83 2440 pop dph0 0A96 D0 82 2441 pop dpl0 0A98 D0 F0 2442 pop b 0A9A D0 E0 2443 pop acc 0A9C 32 2444 reti 2445 0A9D 2446 usb_ep5out_isr: 0A9D C0 E0 2447 push acc 0A9F C0 F0 2448 push b 0AA1 C0 82 2449 push dpl0 0AA3 C0 83 2450 push dph0 0AA5 C0 D0 2451 push psw 0AA7 75 D0 00 2452 mov psw,#0x00 0AAA C0 86 2453 push dps 0AAC 75 86 00 2454 mov dps,#0 2455 ;; clear interrupt 0AAF E5 91 2456 mov a,exif 0AB1 C2 E4 2457 clr acc.4 0AB3 F5 91 2458 mov exif,a 0AB5 90 7F AA 2459 mov dptr,#OUT07IRQ 0AB8 74 20 2460 mov a,#0x20 0ABA F0 2461 movx @dptr,a 2462 ;; handle interrupt 2463 ;; epilogue 0ABB D0 86 2464 pop dps 0ABD D0 D0 2465 pop psw 0ABF D0 83 2466 pop dph0 0AC1 D0 82 2467 pop dpl0 0AC3 D0 F0 2468 pop b 0AC5 D0 E0 2469 pop acc 0AC7 32 2470 reti 2471 0AC8 2472 usb_ep6in_isr: 0AC8 C0 E0 2473 push acc 0ACA C0 F0 2474 push b 0ACC C0 82 2475 push dpl0 0ACE C0 83 2476 push dph0 0AD0 C0 D0 2477 push psw 0AD2 75 D0 00 2478 mov psw,#0x00 0AD5 C0 86 2479 push dps 0AD7 75 86 00 2480 mov dps,#0 2481 ;; clear interrupt 0ADA E5 91 2482 mov a,exif 0ADC C2 E4 2483 clr acc.4 0ADE F5 91 2484 mov exif,a 0AE0 90 7F A9 2485 mov dptr,#IN07IRQ 0AE3 74 40 2486 mov a,#0x40 0AE5 F0 2487 movx @dptr,a 2488 ;; handle interrupt 2489 ;; epilogue 0AE6 D0 86 2490 pop dps 0AE8 D0 D0 2491 pop psw 0AEA D0 83 2492 pop dph0 0AEC D0 82 2493 pop dpl0 0AEE D0 F0 2494 pop b 0AF0 D0 E0 2495 pop acc 0AF2 32 2496 reti 2497 0AF3 2498 usb_ep6out_isr: 0AF3 C0 E0 2499 push acc 0AF5 C0 F0 2500 push b 0AF7 C0 82 2501 push dpl0 0AF9 C0 83 2502 push dph0 0AFB C0 D0 2503 push psw 0AFD 75 D0 00 2504 mov psw,#0x00 0B00 C0 86 2505 push dps 0B02 75 86 00 2506 mov dps,#0 2507 ;; clear interrupt 0B05 E5 91 2508 mov a,exif 0B07 C2 E4 2509 clr acc.4 0B09 F5 91 2510 mov exif,a 0B0B 90 7F AA 2511 mov dptr,#OUT07IRQ 0B0E 74 40 2512 mov a,#0x40 0B10 F0 2513 movx @dptr,a 2514 ;; handle interrupt 2515 ;; epilogue 0B11 D0 86 2516 pop dps 0B13 D0 D0 2517 pop psw 0B15 D0 83 2518 pop dph0 0B17 D0 82 2519 pop dpl0 0B19 D0 F0 2520 pop b 0B1B D0 E0 2521 pop acc 0B1D 32 2522 reti 2523 0B1E 2524 usb_ep7in_isr: 0B1E C0 E0 2525 push acc 0B20 C0 F0 2526 push b 0B22 C0 82 2527 push dpl0 0B24 C0 83 2528 push dph0 0B26 C0 D0 2529 push psw 0B28 75 D0 00 2530 mov psw,#0x00 0B2B C0 86 2531 push dps 0B2D 75 86 00 2532 mov dps,#0 2533 ;; clear interrupt 0B30 E5 91 2534 mov a,exif 0B32 C2 E4 2535 clr acc.4 0B34 F5 91 2536 mov exif,a 0B36 90 7F A9 2537 mov dptr,#IN07IRQ 0B39 74 80 2538 mov a,#0x80 0B3B F0 2539 movx @dptr,a 2540 ;; handle interrupt 2541 ;; epilogue 0B3C D0 86 2542 pop dps 0B3E D0 D0 2543 pop psw 0B40 D0 83 2544 pop dph0 0B42 D0 82 2545 pop dpl0 0B44 D0 F0 2546 pop b 0B46 D0 E0 2547 pop acc 0B48 32 2548 reti 2549 0B49 2550 usb_ep7out_isr: 0B49 C0 E0 2551 push acc 0B4B C0 F0 2552 push b 0B4D C0 82 2553 push dpl0 0B4F C0 83 2554 push dph0 0B51 C0 D0 2555 push psw 0B53 75 D0 00 2556 mov psw,#0x00 0B56 C0 86 2557 push dps 0B58 75 86 00 2558 mov dps,#0 2559 ;; clear interrupt 0B5B E5 91 2560 mov a,exif 0B5D C2 E4 2561 clr acc.4 0B5F F5 91 2562 mov exif,a 0B61 90 7F AA 2563 mov dptr,#OUT07IRQ 0B64 74 80 2564 mov a,#0x80 0B66 F0 2565 movx @dptr,a 2566 ;; handle interrupt 2567 ;; epilogue 0B67 D0 86 2568 pop dps 0B69 D0 D0 2569 pop psw 0B6B D0 83 2570 pop dph0 0B6D D0 82 2571 pop dpl0 0B6F D0 F0 2572 pop b 0B71 D0 E0 2573 pop acc 0B73 32 2574 reti 2575 2576 ;; ----------------------------------------------------- 2577 ;; USB descriptors 2578 ;; ----------------------------------------------------- 2579 2580 ;; Device and/or Interface Class codes 0000 2581 USB_CLASS_PER_INTERFACE = 0 0001 2582 USB_CLASS_AUDIO = 1 0002 2583 USB_CLASS_COMM = 2 0003 2584 USB_CLASS_HID = 3 0007 2585 USB_CLASS_PRINTER = 7 0008 2586 USB_CLASS_MASS_STORAGE = 8 0009 2587 USB_CLASS_HUB = 9 00FF 2588 USB_CLASS_VENDOR_SPEC = 0xff 2589 0001 2590 USB_SUBCLASS_AUDIOCONTROL = 1 0002 2591 USB_SUBCLASS_AUDIOSTREAMING = 2 2592 2593 ;; Descriptor types 0001 2594 USB_DT_DEVICE = 0x01 0002 2595 USB_DT_CONFIG = 0x02 0003 2596 USB_DT_STRING = 0x03 0004 2597 USB_DT_INTERFACE = 0x04 0005 2598 USB_DT_ENDPOINT = 0x05 2599 2600 ;; Audio Class descriptor types 0020 2601 USB_DT_AUDIO_UNDEFINED = 0x20 0021 2602 USB_DT_AUDIO_DEVICE = 0x21 0022 2603 USB_DT_AUDIO_CONFIG = 0x22 0023 2604 USB_DT_AUDIO_STRING = 0x23 0024 2605 USB_DT_AUDIO_INTERFACE = 0x24 0025 2606 USB_DT_AUDIO_ENDPOINT = 0x25 2607 0000 2608 USB_SDT_AUDIO_UNDEFINED = 0x00 0001 2609 USB_SDT_AUDIO_HEADER = 0x01 0002 2610 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 0003 2611 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 0004 2612 USB_SDT_AUDIO_MIXER_UNIT = 0x04 0005 2613 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 0006 2614 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 0007 2615 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 0008 2616 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 2617 2618 ;; Standard requests 0000 2619 USB_REQ_GET_STATUS = 0x00 0001 2620 USB_REQ_CLEAR_FEATURE = 0x01 0003 2621 USB_REQ_SET_FEATURE = 0x03 0005 2622 USB_REQ_SET_ADDRESS = 0x05 0006 2623 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2624 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2625 USB_REQ_GET_CONFIGURATION = 0x08 0009 2626 USB_REQ_SET_CONFIGURATION = 0x09 000A 2627 USB_REQ_GET_INTERFACE = 0x0A 000B 2628 USB_REQ_SET_INTERFACE = 0x0B 000C 2629 USB_REQ_SYNCH_FRAME = 0x0C 2630 2631 ;; Audio Class Requests 0001 2632 USB_REQ_AUDIO_SET_CUR = 0x01 0081 2633 USB_REQ_AUDIO_GET_CUR = 0x81 0002 2634 USB_REQ_AUDIO_SET_MIN = 0x02 0082 2635 USB_REQ_AUDIO_GET_MIN = 0x82 0003 2636 USB_REQ_AUDIO_SET_MAX = 0x03 0083 2637 USB_REQ_AUDIO_GET_MAX = 0x83 0004 2638 USB_REQ_AUDIO_SET_RES = 0x04 0084 2639 USB_REQ_AUDIO_GET_RES = 0x84 0005 2640 USB_REQ_AUDIO_SET_MEM = 0x05 0085 2641 USB_REQ_AUDIO_GET_MEM = 0x85 00FF 2642 USB_REQ_AUDIO_GET_STAT = 0xff 2643 2644 ;; USB Request Type and Endpoint Directions 0000 2645 USB_DIR_OUT = 0 0080 2646 USB_DIR_IN = 0x80 2647 0000 2648 USB_TYPE_STANDARD = (0x00 << 5) 0020 2649 USB_TYPE_CLASS = (0x01 << 5) 0040 2650 USB_TYPE_VENDOR = (0x02 << 5) 0060 2651 USB_TYPE_RESERVED = (0x03 << 5) 2652 0000 2653 USB_RECIP_DEVICE = 0x00 0001 2654 USB_RECIP_INTERFACE = 0x01 0002 2655 USB_RECIP_ENDPOINT = 0x02 0003 2656 USB_RECIP_OTHER = 0x03 2657 2658 ;; Request target types. 0000 2659 USB_RT_DEVICE = 0x00 0001 2660 USB_RT_INTERFACE = 0x01 0002 2661 USB_RT_ENDPOINT = 0x02 2662 BAC0 2663 VENDID = 0xbac0 6137 2664 PRODID = 0x6137 2665 0B74 2666 devicedescr: 0B74 12 2667 .db 18 ; bLength 0B75 01 2668 .db USB_DT_DEVICE ; bDescriptorType 0B76 00 01 2669 .db 0x00, 0x01 ; bcdUSB 0B78 FF 2670 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 0B79 00 2671 .db 0 ; bDeviceSubClass 0B7A FF 2672 .db 0xff ; bDeviceProtocol 0B7B 40 2673 .db 0x40 ; bMaxPacketSize0 0B7C C0 BA 2674 .db VENDID ; idVendor 0B7E 37 61 2675 .db PRODID ; idProduct 0B80 01 00 2676 .db 0x01,0x00 ; bcdDevice 0B82 01 2677 .db 1 ; iManufacturer 0B83 02 2678 .db 2 ; iProduct 0B84 03 2679 .db 3 ; iSerialNumber 0B85 01 2680 .db 1 ; bNumConfigurations 2681 0B86 2682 config0descr: 0B86 09 2683 .db 9 ; bLength 0B87 02 2684 .db USB_DT_CONFIG ; bDescriptorType 0B88 3B 00 2685 .db config0sz ; wTotalLength 0B8A 01 2686 .db 1 ; bNumInterfaces 0B8B 01 2687 .db 1 ; bConfigurationValue 0B8C 00 2688 .db 0 ; iConfiguration 0B8D 40 2689 .db 0b01000000 ; bmAttributs (self powered) 0B8E 00 2690 .db 0 ; MaxPower (mA/2) (self powered so 0) 2691 ;; standard packet interface (needed so the driver can hook to it) 2692 ;; interface descriptor I0:A0 0B8F 09 2693 .db 9 ; bLength 0B90 04 2694 .db USB_DT_INTERFACE ; bDescriptorType 0B91 00 2695 .db 0 ; bInterfaceNumber 0B92 00 2696 .db 0 ; bAlternateSetting 0B93 01 2697 .db 1 ; bNumEndpoints 0B94 FF 2698 .db 0xff ; bInterfaceClass (vendor specific) 0B95 00 2699 .db 0x00 ; bInterfaceSubClass 0B96 FF 2700 .db 0xff ; bInterfaceProtocol (vendor specific) 0B97 00 2701 .db 0 ; iInterface 2702 ;; endpoint descriptor I0:A0:E0 0B98 07 2703 .db 7 ; bLength 0B99 05 2704 .db USB_DT_ENDPOINT ; bDescriptorType 0B9A 81 2705 .db (USB_DIR_IN | 1) ; bEndpointAddress 0B9B 02 2706 .db 0x02 ; bmAttributes (bulk) 0B9C 40 00 2707 .db 0x40,0x00 ; wMaxPacketSize 0B9E 00 2708 .db 0 ; bInterval 2709 ;; interface descriptor I0:A1 0B9F 09 2710 .db 9 ; bLength 0BA0 04 2711 .db USB_DT_INTERFACE ; bDescriptorType 0BA1 00 2712 .db 0 ; bInterfaceNumber 0BA2 01 2713 .db 1 ; bAlternateSetting 0BA3 03 2714 .db 3 ; bNumEndpoints 0BA4 FF 2715 .db 0xff ; bInterfaceClass (vendor specific) 0BA5 00 2716 .db 0x00 ; bInterfaceSubClass 0BA6 FF 2717 .db 0xff ; bInterfaceProtocol (vendor specific) 0BA7 00 2718 .db 0 ; iInterface 2719 ;; endpoint descriptor I0:A1:E0 0BA8 07 2720 .db 7 ; bLength 0BA9 05 2721 .db USB_DT_ENDPOINT ; bDescriptorType 0BAA 81 2722 .db (USB_DIR_IN | 1) ; bEndpointAddress 0BAB 03 2723 .db 0x03 ; bmAttributes (interrupt) 0BAC 40 00 2724 .db 0x40,0x00 ; wMaxPacketSize 0BAE 08 2725 .db 8 ; bInterval 2726 ;; endpoint descriptor I0:A1:E1 0BAF 09 2727 .db 9 ; bLength 0BB0 05 2728 .db USB_DT_ENDPOINT ; bDescriptorType 0BB1 88 2729 .db (USB_DIR_IN | 8) ; bEndpointAddress 0BB2 01 2730 .db 0x01 ; bmAttributes (iso) 0BB3 2731 descinframesize: 0BB3 02 00 2732 .db 0x02,0x00 ; wMaxPacketSize 0BB5 01 2733 .db 1 ; bInterval 0BB6 00 2734 .db 0 ; bRefresh 0BB7 00 2735 .db 0 ; bSynchAddress 2736 ;; endpoint descriptor I0:A1:E2 0BB8 09 2737 .db 9 ; bLength 0BB9 05 2738 .db USB_DT_ENDPOINT ; bDescriptorType 0BBA 08 2739 .db (USB_DIR_OUT | 8) ; bEndpointAddress 0BBB 01 2740 .db 0x01 ; bmAttributes (iso) 0BBC 2741 descoutframesize: 0BBC 02 00 2742 .db 0x02,0x00 ; wMaxPacketSize 0BBE 01 2743 .db 1 ; bInterval 0BBF 00 2744 .db 0 ; bRefresh 0BC0 00 2745 .db 0 ; bSynchAddress 003B 2746 config0sz = . - config0descr 2747 0BC1 2748 stringdescr: 0BC1rC9s0B 2749 .db string0 0BC3rCDs0B 2750 .db string1 0BC5rDBs0B 2751 .db string2 0BC7rFBs0B 2752 .db stringserial 2753 0004 2754 numstrings = (. - stringdescr)/2 2755 0BC9 2756 string0: 0BC9 04 2757 .db string0sz ; bLength 0BCA 03 2758 .db USB_DT_STRING ; bDescriptorType 0BCB 00 00 2759 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2760 string0sz = . - string0 2761 0BCD 2762 string1: 0BCD 0E 2763 .db string1sz ; bLength 0BCE 03 2764 .db USB_DT_STRING ; bDescriptorType 0BCF 42 00 61 00 79 00 2765 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2766 string1sz = . - string1 2767 0BDB 2768 string2: 0BDB 20 2769 .db string2sz ; bLength 0BDC 03 2770 .db USB_DT_STRING ; bDescriptorType 0BDD 55 00 53 00 42 00 2771 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0BED 28 00 41 00 75 00 2772 .db '(,0,'A,0,'u,0,'d,0,'i,0,'o,0,'),0 64 00 69 00 6F 00 29 00 0020 2773 string2sz = . - string2 2774 0BFB 2775 stringserial: 0BFB 02 2776 .db 2 ; bLength 0BFC 03 2777 .db USB_DT_STRING ; bDescriptorType 0BFD 00 00 00 00 00 00 2778 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0C0D 00 00 00 00 00 00 2779 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2780 baycomusb-0.10.orig/firmware/audio2firmware/main.rst0100644000175100017510000041045307337536151020643 0ustar abaaba 1 .module main 2 3 ;; same as audiofirmware, but do not announce as 4 ;; audio class compliant 5 6 ;; ENDPOINTS 7 ;; EP0 in/out Control 8 ;; EP1 in Interrupt: Status 9 ;; Byte 0: Modem Status 10 ;; Bit 0-1: Transmitter status 11 ;; 0: idle (off) 12 ;; 1: keyup 13 ;; 2: transmitting packets 14 ;; 3: tail 15 ;; Bit 2: PTT status (1=on) 16 ;; Bit 3: DCD 17 ;; Bit 5: UART transmitter empty 18 ;; Bit 6-7: unused 19 ;; Byte 1: Number of empty 64 byte chunks in TX fifo (sofcount) 20 ;; Byte 2: Number of full 64 byte chunks in RX fifo (INISOVAL) 21 ;; Byte 3: RSSI value 22 ;; Byte 4: IRQ count 23 ;; Byte 5-20: (as needed) UART receiver chars 24 ;; EP8 out audio output 25 ;; EP8 in audio input 26 27 ;; COMMAND LIST 28 ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) 29 ;; C0 C8 read mode 30 ;; Return: 31 ;; Byte 0: 4 (MODE_AUDIO) 32 ;; C0 C9 return serial number string 33 ;; C0 D0 get/set PTT/DCD/RSSI 34 ;; wIndex = 1: set forced ptt to wValue 35 ;; Return: 36 ;; Byte 0: PTT status 37 ;; Byte 1: DCD status 38 ;; Byte 2: RSSI status 39 ;; 40 D2 set CON/STA led 40 ;; Bits 0-1 of wValue 41 ;; 40 D3 send byte to UART 42 ;; Byte in wValue 43 ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) 44 ;; wIndex = 1: write wValue to output register 45 ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) 46 ;; Return: 47 ;; Byte 0: Modem Disconnect Input 48 ;; Byte 1: Modem Disconnect Output register 49 ;; Byte 2: Modem Disconnect Tristate register 50 ;; C0 D5 get/set T7F port 51 ;; wIndex = 1: write wValue to T7F output register 52 ;; Return: 53 ;; Byte 0: T7F Input 54 ;; Byte 1: T7F Output register 55 ;; C0 E0 get/set control register/counter values 56 ;; wIndex = 1: write wValue to control register 57 ;; Return: 58 ;; Byte 0: control register value 59 ;; Byte 1-3: counter0 register 60 ;; Byte 4-6: counter1 register 61 ;; C0 E1 get debug status 62 ;; Return: 63 ;; Byte 0: SOF count 64 ;; Byte 1: framesize 65 ;; Byte 2-3: divider 66 ;; Byte 4: divrel 67 ;; Byte 5: pllcorrvar 68 ;; Byte 6: txfifocount 69 ;; C0 E2 xxdebug stuff 70 71 ;; define code segments link order 72 .area CODE (CODE) 73 .area CSEG (CODE) 74 .area GSINIT (CODE) 75 .area GSINIT2 (CODE) 76 77 ;; ----------------------------------------------------- 78 79 ;; special function registers (which are not predefined) 0082 80 dpl0 = 0x82 0083 81 dph0 = 0x83 0084 82 dpl1 = 0x84 0085 83 dph1 = 0x85 0086 84 dps = 0x86 008E 85 ckcon = 0x8E 008F 86 spc_fnc = 0x8F 0091 87 exif = 0x91 0092 88 mpage = 0x92 0098 89 scon0 = 0x98 0099 90 sbuf0 = 0x99 00C0 91 scon1 = 0xC0 00C1 92 sbuf1 = 0xC1 00D8 93 eicon = 0xD8 00E8 94 eie = 0xE8 00F8 95 eip = 0xF8 96 97 ;; anchor xdata registers 7F00 98 IN0BUF = 0x7F00 7EC0 99 OUT0BUF = 0x7EC0 7E80 100 IN1BUF = 0x7E80 7E40 101 OUT1BUF = 0x7E40 7E00 102 IN2BUF = 0x7E00 7DC0 103 OUT2BUF = 0x7DC0 7D80 104 IN3BUF = 0x7D80 7D40 105 OUT3BUF = 0x7D40 7D00 106 IN4BUF = 0x7D00 7CC0 107 OUT4BUF = 0x7CC0 7C80 108 IN5BUF = 0x7C80 7C40 109 OUT5BUF = 0x7C40 7C00 110 IN6BUF = 0x7C00 7BC0 111 OUT6BUF = 0x7BC0 7B80 112 IN7BUF = 0x7B80 7B40 113 OUT7BUF = 0x7B40 7FE8 114 SETUPBUF = 0x7FE8 7FE8 115 SETUPDAT = 0x7FE8 116 7FB4 117 EP0CS = 0x7FB4 7FB5 118 IN0BC = 0x7FB5 7FB6 119 IN1CS = 0x7FB6 7FB7 120 IN1BC = 0x7FB7 7FB8 121 IN2CS = 0x7FB8 7FB9 122 IN2BC = 0x7FB9 7FBA 123 IN3CS = 0x7FBA 7FBB 124 IN3BC = 0x7FBB 7FBC 125 IN4CS = 0x7FBC 7FBD 126 IN4BC = 0x7FBD 7FBE 127 IN5CS = 0x7FBE 7FBF 128 IN5BC = 0x7FBF 7FC0 129 IN6CS = 0x7FC0 7FC1 130 IN6BC = 0x7FC1 7FC2 131 IN7CS = 0x7FC2 7FC3 132 IN7BC = 0x7FC3 7FC5 133 OUT0BC = 0x7FC5 7FC6 134 OUT1CS = 0x7FC6 7FC7 135 OUT1BC = 0x7FC7 7FC8 136 OUT2CS = 0x7FC8 7FC9 137 OUT2BC = 0x7FC9 7FCA 138 OUT3CS = 0x7FCA 7FCB 139 OUT3BC = 0x7FCB 7FCC 140 OUT4CS = 0x7FCC 7FCD 141 OUT4BC = 0x7FCD 7FCE 142 OUT5CS = 0x7FCE 7FCF 143 OUT5BC = 0x7FCF 7FD0 144 OUT6CS = 0x7FD0 7FD1 145 OUT6BC = 0x7FD1 7FD2 146 OUT7CS = 0x7FD2 7FD3 147 OUT7BC = 0x7FD3 148 7FA8 149 IVEC = 0x7FA8 7FA9 150 IN07IRQ = 0x7FA9 7FAA 151 OUT07IRQ = 0x7FAA 7FAB 152 USBIRQ = 0x7FAB 7FAC 153 IN07IEN = 0x7FAC 7FAD 154 OUT07IEN = 0x7FAD 7FAE 155 USBIEN = 0x7FAE 7FAF 156 USBBAV = 0x7FAF 7FB2 157 BPADDRH = 0x7FB2 7FB3 158 BPADDRL = 0x7FB3 159 7FD4 160 SUDPTRH = 0x7FD4 7FD5 161 SUDPTRL = 0x7FD5 7FD6 162 USBCS = 0x7FD6 7FD7 163 TOGCTL = 0x7FD7 7FD8 164 USBFRAMEL = 0x7FD8 7FD9 165 USBFRAMEH = 0x7FD9 7FDB 166 FNADDR = 0x7FDB 7FDD 167 USBPAIR = 0x7FDD 7FDE 168 IN07VAL = 0x7FDE 7FDF 169 OUT07VAL = 0x7FDF 7FE3 170 AUTOPTRH = 0x7FE3 7FE4 171 AUTOPTRL = 0x7FE4 7FE5 172 AUTODATA = 0x7FE5 173 174 ;; isochronous endpoints. only available if ISODISAB=0 175 7F60 176 OUT8DATA = 0x7F60 7F61 177 OUT9DATA = 0x7F61 7F62 178 OUT10DATA = 0x7F62 7F63 179 OUT11DATA = 0x7F63 7F64 180 OUT12DATA = 0x7F64 7F65 181 OUT13DATA = 0x7F65 7F66 182 OUT14DATA = 0x7F66 7F67 183 OUT15DATA = 0x7F67 184 7F68 185 IN8DATA = 0x7F68 7F69 186 IN9DATA = 0x7F69 7F6A 187 IN10DATA = 0x7F6A 7F6B 188 IN11DATA = 0x7F6B 7F6C 189 IN12DATA = 0x7F6C 7F6D 190 IN13DATA = 0x7F6D 7F6E 191 IN14DATA = 0x7F6E 7F6F 192 IN15DATA = 0x7F6F 193 7F70 194 OUT8BCH = 0x7F70 7F71 195 OUT8BCL = 0x7F71 7F72 196 OUT9BCH = 0x7F72 7F73 197 OUT9BCL = 0x7F73 7F74 198 OUT10BCH = 0x7F74 7F75 199 OUT10BCL = 0x7F75 7F76 200 OUT11BCH = 0x7F76 7F77 201 OUT11BCL = 0x7F77 7F78 202 OUT12BCH = 0x7F78 7F79 203 OUT12BCL = 0x7F79 7F7A 204 OUT13BCH = 0x7F7A 7F7B 205 OUT13BCL = 0x7F7B 7F7C 206 OUT14BCH = 0x7F7C 7F7D 207 OUT14BCL = 0x7F7D 7F7E 208 OUT15BCH = 0x7F7E 7F7F 209 OUT15BCL = 0x7F7F 210 7FF0 211 OUT8ADDR = 0x7FF0 7FF1 212 OUT9ADDR = 0x7FF1 7FF2 213 OUT10ADDR = 0x7FF2 7FF3 214 OUT11ADDR = 0x7FF3 7FF4 215 OUT12ADDR = 0x7FF4 7FF5 216 OUT13ADDR = 0x7FF5 7FF6 217 OUT14ADDR = 0x7FF6 7FF7 218 OUT15ADDR = 0x7FF7 7FF8 219 IN8ADDR = 0x7FF8 7FF9 220 IN9ADDR = 0x7FF9 7FFA 221 IN10ADDR = 0x7FFA 7FFB 222 IN11ADDR = 0x7FFB 7FFC 223 IN12ADDR = 0x7FFC 7FFD 224 IN13ADDR = 0x7FFD 7FFE 225 IN14ADDR = 0x7FFE 7FFF 226 IN15ADDR = 0x7FFF 227 7FA0 228 ISOERR = 0x7FA0 7FA1 229 ISOCTL = 0x7FA1 7FA2 230 ZBCOUNT = 0x7FA2 7FE0 231 INISOVAL = 0x7FE0 7FE1 232 OUTISOVAL = 0x7FE1 7FE2 233 FASTXFR = 0x7FE2 234 235 ;; CPU control registers 236 7F92 237 CPUCS = 0x7F92 238 239 ;; IO port control registers 240 7F93 241 PORTACFG = 0x7F93 7F94 242 PORTBCFG = 0x7F94 7F95 243 PORTCCFG = 0x7F95 7F96 244 OUTA = 0x7F96 7F97 245 OUTB = 0x7F97 7F98 246 OUTC = 0x7F98 7F99 247 PINSA = 0x7F99 7F9A 248 PINSB = 0x7F9A 7F9B 249 PINSC = 0x7F9B 7F9C 250 OEA = 0x7F9C 7F9D 251 OEB = 0x7F9D 7F9E 252 OEC = 0x7F9E 253 254 ;; I2C controller registers 255 7FA5 256 I2CS = 0x7FA5 7FA6 257 I2DAT = 0x7FA6 258 259 ;; Xilinx FPGA registers C000 260 AUDIORXFIFO = 0xc000 C000 261 AUDIOTXFIFO = 0xc000 C001 262 AUDIORXFIFOCNT = 0xc001 C002 263 AUDIOTXFIFOCNT = 0xc002 C001 264 AUDIODIVIDERLO = 0xc001 C002 265 AUDIODIVIDERHI = 0xc002 C004 266 AUDIORSSI = 0xc004 C005 267 AUDIOCNTLOW = 0xc005 C006 268 AUDIOCNTMID = 0xc006 C007 269 AUDIOCNTHIGH = 0xc007 C008 270 AUDIOCTRL = 0xc008 C009 271 AUDIOSTAT = 0xc009 C00A 272 AUDIOT7FOUT = 0xc00a C00B 273 AUDIOT7FIN = 0xc00b C00C 274 AUDIOMDISCTRIS = 0xc00c C00D 275 AUDIOMDISCOUT = 0xc00d C00E 276 AUDIOMDISCIN = 0xc00e 277 0001 278 AUDIOCTRLPTT = 0x01 0002 279 AUDIOCTRLMUTE = 0x02 0004 280 AUDIOCTRLLEDPTT = 0x04 0008 281 AUDIOCTRLLEDDCD = 0x08 0000 282 AUDIOCTRLCNTRES = 0x00 0010 283 AUDIOCTRLCNTDIS = 0x10 0040 284 AUDIOCTRLCNTCK0 = 0x40 0050 285 AUDIOCTRLCNTCK1 = 0x50 0060 286 AUDIOCTRLCNTCK2 = 0x60 0070 287 AUDIOCTRLCNTCK3 = 0x70 0080 288 AUDIOCTRLCNTRD1 = 0x80 289 290 ;; ----------------------------------------------------- 291 292 .area CODE (CODE) 0000 02 0D 74 293 ljmp startup 0003 02 01 6D 294 ljmp int0_isr 0006 295 .ds 5 000B 02 01 8E 296 ljmp timer0_isr 000E 297 .ds 5 0013 02 01 AF 298 ljmp int1_isr 0016 299 .ds 5 001B 02 01 D0 300 ljmp timer1_isr 001E 301 .ds 5 0023 02 01 F1 302 ljmp ser0_isr 0026 303 .ds 5 002B 02 02 2F 304 ljmp timer2_isr 002E 305 .ds 5 0033 02 02 50 306 ljmp resume_isr 0036 307 .ds 5 003B 02 02 71 308 ljmp ser1_isr 003E 309 .ds 5 0043 02 01 00 310 ljmp usb_isr 0046 311 .ds 5 004B 02 02 94 312 ljmp i2c_isr 004E 313 .ds 5 0053 02 02 B9 314 ljmp int4_isr 0056 315 .ds 5 005B 02 02 DE 316 ljmp int5_isr 005E 317 .ds 5 0063 02 03 03 318 ljmp int6_isr 319 320 ;; Parameter block at 0xe0 0066 321 .ds 0x7a 00E0 08 322 parframesize: .db 8 00E1 01 323 parpttmute: .db 1 324 325 ;; Serial# string at 0xf0 00E2 326 .ds 14 00F0 327 parserial: 00F0 30 30 30 30 30 30 328 .db '0,'0,'0,'0,'0,'0,'0,'0,0 30 30 00 00F9 329 .ds 7 330 0100 331 usb_isr: 0100 02 03 24 332 ljmp usb_sudav_isr 0103 333 .ds 1 0104 02 07 D2 334 ljmp usb_sof_isr 0107 335 .ds 1 0108 02 09 1C 336 ljmp usb_sutok_isr 010B 337 .ds 1 010C 02 09 47 338 ljmp usb_suspend_isr 010F 339 .ds 1 0110 02 09 72 340 ljmp usb_usbreset_isr 0113 341 .ds 1 0114 32 342 reti 0115 343 .ds 3 0118 02 09 9D 344 ljmp usb_ep0in_isr 011B 345 .ds 1 011C 02 09 D8 346 ljmp usb_ep0out_isr 011F 347 .ds 1 0120 02 0A 6E 348 ljmp usb_ep1in_isr 0123 349 .ds 1 0124 02 0A 9C 350 ljmp usb_ep1out_isr 0127 351 .ds 1 0128 02 0A C7 352 ljmp usb_ep2in_isr 012B 353 .ds 1 012C 02 0A F2 354 ljmp usb_ep2out_isr 012F 355 .ds 1 0130 02 0B 1D 356 ljmp usb_ep3in_isr 0133 357 .ds 1 0134 02 0B 48 358 ljmp usb_ep3out_isr 0137 359 .ds 1 0138 02 0B 73 360 ljmp usb_ep4in_isr 013B 361 .ds 1 013C 02 0B 9E 362 ljmp usb_ep4out_isr 013F 363 .ds 1 0140 02 0B C9 364 ljmp usb_ep5in_isr 0143 365 .ds 1 0144 02 0B F4 366 ljmp usb_ep5out_isr 0147 367 .ds 1 0148 02 0C 1F 368 ljmp usb_ep6in_isr 014B 369 .ds 1 014C 02 0C 4A 370 ljmp usb_ep6out_isr 014F 371 .ds 1 0150 02 0C 75 372 ljmp usb_ep7in_isr 0153 373 .ds 1 0154 02 0C A0 374 ljmp usb_ep7out_isr 375 376 ;; ----------------------------------------------------- 377 0004 378 NUMINTERFACES = 4 379 380 .area OSEG (OVR,DATA) 381 .area BSEG (BIT) 0000 382 ctrl_ptt: .ds 1 0001 383 ctrl_pttmute: .ds 1 0002 384 ctrl_ledptt: .ds 1 0003 385 ctrl_leddcd: .ds 1 0004 386 ctrl_cntmode0: .ds 1 0005 387 ctrl_cntmode1: .ds 1 0006 388 ctrl_cntmode2: .ds 1 0007 389 ctrl_cntsel: .ds 1 0020 390 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) 391 0008 392 pttmute: .ds 1 0009 393 uartempty: .ds 1 394 395 396 .area ISEG (DATA) 0080 397 txsamples: .ds 0x40 00C0 398 stack: .ds 0x80-0x40 399 400 .area DSEG (DATA) 0040 401 ctrlcode: .ds 1 0041 402 ctrlcount: .ds 2 0043 403 leddiv: .ds 1 0044 404 irqcount: .ds 1 0045 405 sofcount: .ds 1 0046 406 divider: .ds 2 0048 407 divrel: .ds 1 0049 408 framesize: .ds 1 004A 409 pllcorrvar: .ds 1 004B 410 txfifocount: .ds 1 004C 411 pttforce: .ds 1 412 413 ;; UART receiver 004D 414 uartbuf: .ds 16 005D 415 uartwr: .ds 1 005E 416 uartrd: .ds 1 417 418 ;; Port state 005F 419 t7fout: .ds 1 0060 420 mdisctris: .ds 1 0061 421 mdiscout: .ds 1 422 423 ;; USB state 0062 424 numconfig: .ds 1 0063 425 altsetting: .ds NUMINTERFACES 426 427 .area XSEG (DATA) 1000 428 blah: .ds 1 429 430 431 .area GSINIT (CODE) 0002 432 ar2 = 0x02 0003 433 ar3 = 0x03 0004 434 ar4 = 0x04 0005 435 ar5 = 0x05 0006 436 ar6 = 0x06 0007 437 ar7 = 0x07 0000 438 ar0 = 0x00 0001 439 ar1 = 0x01 440 0D74 441 startup: 0D74 75 81 C0 442 mov sp,#stack ; -1 0D77 E4 443 clr a 0D78 F5 D0 444 mov psw,a 0D7A F5 86 445 mov dps,a 446 ;lcall __sdcc_external_startup 447 ;mov a,dpl0 448 ;jz __sdcc_init_data 449 ;ljmp __sdcc_program_startup 0D7C 450 __sdcc_init_data: 451 452 .area GSINIT2 (CODE) 0D7C 453 __sdcc_program_startup: 454 ;; assembler code startup 0D7C E4 455 clr a 0D7D F5 44 456 mov irqcount,a 0D7F F5 45 457 mov sofcount,a 0D81 F5 4C 458 mov pttforce,a 0D83 F5 5E 459 mov uartrd,a 0D85 F5 5D 460 mov uartwr,a 0D87 F5 86 461 mov dps,a 0D89 D2 09 462 setb uartempty 463 ;; some indirect register setup 0D8B 75 8E 30 464 mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs 465 ;; Timer setup: 466 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 467 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0D8E 75 89 21 468 mov tmod,#0x21 0D91 75 88 55 469 mov tcon,#0x55 ; INT0/INT1 edge 0D94 75 8D 64 470 mov th1,#256-156 ; 1200 bauds 0D97 75 87 00 471 mov pcon,#0 ; SMOD0=0 472 ;; init USB subsystem 0D9A 74 00 473 mov a,#0x00 ; IN8 FIFO at address 0x0000 0D9C 90 7F F8 474 mov dptr,#IN8ADDR 0D9F F0 475 movx @dptr,a 0DA0 74 04 476 mov a,#0x04 ; OUT8 FIFO at address 0x0010 0DA2 90 7F F0 477 mov dptr,#OUT8ADDR 0DA5 F0 478 movx @dptr,a 0DA6 90 7F A1 479 mov dptr,#ISOCTL 0DA9 E4 480 clr a ; enable ISO endpoints 0DAA F0 481 movx @dptr,a 0DAB 90 7F AF 482 mov dptr,#USBBAV 0DAE 74 01 483 mov a,#1 ; enable autovector, disable breakpoint logic 0DB0 F0 484 movx @dptr,a 0DB1 74 01 485 mov a,#0x01 ; enable ISO endpoint 8 for input/output 0DB3 90 7F E0 486 mov dptr,#INISOVAL 0DB6 F0 487 movx @dptr,a 0DB7 90 7F E1 488 mov dptr,#OUTISOVAL 0DBA F0 489 movx @dptr,a 0DBB 90 7F DD 490 mov dptr,#USBPAIR 0DBE 74 89 491 mov a,#0x89 ; pair EP 2&3 for input & output, ISOSEND0 0DC0 F0 492 movx @dptr,a 0DC1 90 7F DE 493 mov dptr,#IN07VAL 0DC4 74 03 494 mov a,#0x3 ; enable EP0+EP1 0DC6 F0 495 movx @dptr,a 0DC7 90 7F DF 496 mov dptr,#OUT07VAL 0DCA 74 01 497 mov a,#0x1 ; enable EP0 0DCC F0 498 movx @dptr,a 499 ;; USB: init endpoint toggles 0DCD 90 7F D7 500 mov dptr,#TOGCTL 0DD0 74 12 501 mov a,#0x12 0DD2 F0 502 movx @dptr,a 0DD3 74 32 503 mov a,#0x32 ; clear EP 2 in toggle 0DD5 F0 504 movx @dptr,a 0DD6 74 02 505 mov a,#0x02 0DD8 F0 506 movx @dptr,a 0DD9 74 22 507 mov a,#0x22 ; clear EP 2 out toggle 0DDB F0 508 movx @dptr,a 509 ;; configure IO ports 0DDC 90 7F 93 510 mov dptr,#PORTACFG 0DDF 74 00 511 mov a,#0 0DE1 F0 512 movx @dptr,a 0DE2 90 7F 96 513 mov dptr,#OUTA 0DE5 74 82 514 mov a,#0x82 ; set PROG hi 0DE7 F0 515 movx @dptr,a 0DE8 90 7F 9C 516 mov dptr,#OEA 0DEB 74 C2 517 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0DED F0 518 movx @dptr,a 0DEE 90 7F 94 519 mov dptr,#PORTBCFG 0DF1 74 00 520 mov a,#0 0DF3 F0 521 movx @dptr,a 0DF4 90 7F 9D 522 mov dptr,#OEB 0DF7 74 00 523 mov a,#0 0DF9 F0 524 movx @dptr,a 0DFA 90 7F 95 525 mov dptr,#PORTCCFG 0DFD 74 C3 526 mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins 0DFF F0 527 movx @dptr,a 0E00 90 7F 98 528 mov dptr,#OUTC 0E03 74 28 529 mov a,#0x28 0E05 F0 530 movx @dptr,a 0E06 90 7F 9E 531 mov dptr,#OEC 0E09 74 2A 532 mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT 0E0B F0 533 movx @dptr,a 534 ;; enable interrupts 0E0C 75 A8 92 535 mov ie,#0x92 ; enable timer 0 and ser 0 int 0E0F 75 E8 01 536 mov eie,#0x01 ; enable USB interrupts 0E12 90 7F AE 537 mov dptr,#USBIEN 0E15 74 01 538 mov a,#1 ; enable SUDAV interrupt 0E17 F0 539 movx @dptr,a 0E18 90 7F AC 540 mov dptr,#IN07IEN 0E1B 74 03 541 mov a,#3 ; enable EP0+EP1 interrupt 0E1D F0 542 movx @dptr,a 0E1E 90 7F AD 543 mov dptr,#OUT07IEN 0E21 74 01 544 mov a,#1 ; enable EP0 interrupt 0E23 F0 545 movx @dptr,a 546 ;; initialize UART 0 for T7F communication 0E24 75 98 52 547 mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable 548 ;; copy configuration to bit addressable variables 0E27 75 20 00 549 mov ctrlreg,#AUDIOCTRLCNTRES 0E2A 78 E1 550 mov r0,#parpttmute 0E2C E2 551 movx a,@r0 0E2D A2 E0 552 mov c,acc.0 0E2F 92 08 553 mov pttmute,c 0E31 92 01 554 mov ctrl_pttmute,c 555 ;; turn off transmitter 0E33 90 C0 08 556 mov dptr,#AUDIOCTRL 0E36 E5 20 557 mov a,ctrlreg 0E38 F0 558 movx @dptr,a 559 ;; Initialize modem disc port / t7f port 0E39 90 C0 0C 560 mov dptr,#AUDIOMDISCTRIS 0E3C 74 FF 561 mov a,#0xff 0E3E F0 562 movx @dptr,a 0E3F F5 60 563 mov mdisctris,a 0E41 90 C0 0D 564 mov dptr,#AUDIOMDISCOUT 0E44 E4 565 clr a 0E45 F0 566 movx @dptr,a 0E46 F5 61 567 mov mdiscout,a 0E48 90 C0 0A 568 mov dptr,#AUDIOT7FOUT 0E4B 74 1F 569 mov a,#0x1f 0E4D F0 570 movx @dptr,a 0E4E F5 5F 571 mov t7fout,a 572 ;; Copy serial number 0E50 78 F0 573 mov r0,#parserial 0E52 90 0D 54 574 mov dptr,#stringserial+2 0E55 E2 575 1$: movx a,@r0 0E56 60 06 576 jz 2$ 0E58 F0 577 movx @dptr,a 0E59 A3 578 inc dptr 0E5A A3 579 inc dptr 0E5B 08 580 inc r0 0E5C 80 F7 581 sjmp 1$ 0E5E E8 582 2$: mov a,r0 0E5F 24 11 583 add a,#1-0xf0 ; 1-parserial 0E61 25 E0 584 add a,acc 0E63 90 0D 52 585 mov dptr,#stringserial 0E66 F0 586 movx @dptr,a 587 ;; check parameters 0E67 588 chkparam: 0E67 75 48 80 589 mov divrel,#0x80 0E6A 78 E0 590 mov r0,#parframesize 0E6C E2 591 movx a,@r0 0E6D B4 02 02 592 cjne a,#02,11$ 0E70 80 4E 593 sjmp 2$ 0E72 B4 03 02 594 11$: cjne a,#03,1$ 0E75 80 49 595 sjmp 2$ 0E77 24 F8 596 1$: add a,#-8 0E79 50 0B 597 jnc 3$ 0E7B 24 F0 598 add a,#-16 0E7D 40 03 599 jc 4$ 0E7F E2 600 movx a,@r0 0E80 80 06 601 sjmp 5$ 602 ;; sampling rate is: 24000000Hz/(divider+2) 0E82 74 18 603 4$: mov a,#24 0E84 80 02 604 sjmp 5$ 0E86 74 08 605 3$: mov a,#8 606 ;; 16 bit by 8 bit divide 607 ;; r2: divisor 608 ;; r3: loop counter 609 ;; r4: dividend/result low 610 ;; r5: dividend/result mid 611 ;; r6: dividend/result high 0E88 FA 612 5$: mov r2,a 0E89 7B 11 613 mov r3,#17 0E8B 7C C0 614 mov r4,#24000 0E8D 7D 5D 615 mov r5,#24000>>8 0E8F 7E 00 616 mov r6,#0 0E91 C3 617 6$: clr c 0E92 EE 618 mov a,r6 0E93 9A 619 subb a,r2 0E94 40 01 620 jc 7$ 0E96 FE 621 mov r6,a 0E97 B3 622 7$: cpl c 0E98 EC 623 mov a,r4 0E99 33 624 rlc a 0E9A FC 625 mov r4,a 0E9B ED 626 mov a,r5 0E9C 33 627 rlc a 0E9D FD 628 mov r5,a 0E9E EE 629 mov a,r6 0E9F 33 630 rlc a 0EA0 FE 631 mov r6,a 0EA1 DB EE 632 djnz r3,6$ 633 ;; subtract two 0EA3 EC 634 mov a,r4 0EA4 C3 635 clr c 0EA5 94 02 636 subb a,#2 0EA7 FC 637 mov r4,a 0EA8 ED 638 mov a,r5 0EA9 94 00 639 subb a,#0 0EAB FD 640 mov r5,a 641 ;; store result into audio divider 0EAC 90 C0 02 642 mov dptr,#AUDIODIVIDERHI 0EAF F0 643 movx @dptr,a 0EB0 EC 644 mov a,r4 0EB1 90 C0 01 645 mov dptr,#AUDIODIVIDERLO 0EB4 F0 646 movx @dptr,a 0EB5 C3 647 clr c 0EB6 94 08 648 subb a,#0x08 0EB8 F5 46 649 mov divider,a 0EBA ED 650 mov a,r5 0EBB 94 00 651 subb a,#0 0EBD F5 47 652 mov divider+1,a 653 ;; reload divider into accu 0EBF EA 654 mov a,r2 0EC0 F5 49 655 2$: mov framesize,a 0EC2 90 0D 0A 656 mov dptr,#descinframesize 0EC5 F0 657 movx @dptr,a 0EC6 90 0D 13 658 mov dptr,#descoutframesize 0EC9 F0 659 movx @dptr,a 660 ;; set sampling rate in descriptor 0000 661 .if 0 662 mov b,#1000 663 mul ab 664 mov dptr,#descinsrate 665 movx @dptr,a 666 mov dptr,#descoutsrate 667 movx @dptr,a 668 mov r3,b 669 mov a,framesize 670 mov b,#1000>>8 671 mul ab 672 add a,r3 673 mov dptr,#descinsrate+1 674 movx @dptr,a 675 mov dptr,#descoutsrate+1 676 movx @dptr,a 677 clr a 678 addc a,b 679 mov dptr,#descinsrate+2 680 movx @dptr,a 681 mov dptr,#descoutsrate+2 682 movx @dptr,a 683 .endif 684 ;; initialize USB state 0ECA 685 usbinit: 686 0000 687 .if 0 688 ;; XXXXX 689 ;; check if windows needs 11025Hz 690 mov a,#12 691 mov dptr,#descinframesize 692 movx @dptr,a 693 mov dptr,#descoutframesize 694 movx @dptr,a 695 mov a,#0x11 696 mov dptr,#descinsrate 697 movx @dptr,a 698 mov dptr,#descoutsrate 699 movx @dptr,a 700 mov a,#0x2b 701 mov dptr,#descinsrate+1 702 movx @dptr,a 703 mov dptr,#descoutsrate+1 704 movx @dptr,a 705 mov a,#0 706 mov dptr,#descinsrate+2 707 movx @dptr,a 708 mov dptr,#descoutsrate+2 709 movx @dptr,a 710 ;; XXXXX 711 .endif 712 0ECA E4 713 clr a 0ECB F5 62 714 mov numconfig,a 0ECD 78 63 715 mov r0,#altsetting 0ECF 7A 04 716 mov r2,#NUMINTERFACES 0ED1 F6 717 3$: mov @r0,a 0ED2 08 718 inc r0 0ED3 DA FC 719 djnz r2,3$ 720 ;; give Windows a chance to finish the writecpucs control transfer 721 ;; 20ms delay loop 0ED5 90 D1 20 722 mov dptr,#(-12000)&0xffff 0ED8 A3 723 2$: inc dptr ; 3 cycles 0ED9 E5 82 724 mov a,dpl0 ; 2 cycles 0EDB 45 83 725 orl a,dph0 ; 2 cycles 0EDD 70 F9 726 jnz 2$ ; 3 cycles 0001 727 .if 1 728 ;; disconnect from USB bus 0EDF 90 7F D6 729 mov dptr,#USBCS 0EE2 74 0A 730 mov a,#10 0EE4 F0 731 movx @dptr,a 732 ;; wait 0.3 sec 0EE5 7A 1E 733 mov r2,#30 734 ;; 10ms delay loop 0EE7 90 E8 90 735 0$: mov dptr,#(-6000)&0xffff 0EEA A3 736 1$: inc dptr ; 3 cycles 0EEB E5 82 737 mov a,dpl0 ; 2 cycles 0EED 45 83 738 orl a,dph0 ; 2 cycles 0EEF 70 F9 739 jnz 1$ ; 3 cycles 0EF1 DA F4 740 djnz r2,0$ 741 ;; reconnect to USB bus 0EF3 90 7F D6 742 mov dptr,#USBCS 743 ;mov a,#2 ; 8051 handles control 744 ;movx @dptr,a 0EF6 74 06 745 mov a,#6 ; reconnect, 8051 handles control 0EF8 F0 746 movx @dptr,a 747 .endif 748 749 ;; final 0EF9 12 0A 13 750 lcall fillusbintr 0EFC 751 fifoinit: 752 ;; first wait for a new frame 0EFC 90 7F D8 753 mov dptr,#USBFRAMEL 0EFF E0 754 movx a,@dptr 0F00 FA 755 mov r2,a 0F01 E0 756 1$: movx a,@dptr 0F02 B5 02 02 757 cjne a,ar2,2$ 0F05 80 FA 758 sjmp 1$ 0F07 90 C0 01 759 2$: mov dptr,#AUDIORXFIFOCNT 0F0A E0 760 movx a,@dptr 0F0B 24 FC 761 add a,#-4 0F0D 54 3F 762 anl a,#0x3f 0F0F 60 07 763 jz 4$ 0F11 FA 764 mov r2,a 0F12 90 C0 00 765 mov dptr,#AUDIORXFIFO 0F15 E0 766 3$: movx a,@dptr 0F16 DA FD 767 djnz r2,3$ 0F18 90 C0 02 768 4$: mov dptr,#AUDIOTXFIFOCNT 0F1B E0 769 movx a,@dptr 0F1C 24 FC 770 add a,#-4 0F1E 54 3F 771 anl a,#0x3f 0F20 60 F6 772 jz 4$ 0F22 FA 773 mov r2,a 0F23 90 C0 00 774 mov dptr,#AUDIOTXFIFO 0F26 E4 775 clr a 0F27 F0 776 5$: movx @dptr,a 0F28 DA FD 777 djnz r2,5$ 0F2A 778 6$: ;; clear SOFIR interrupt 0F2A 90 7F AB 779 mov dptr,#USBIRQ 0F2D 74 02 780 mov a,#0x02 0F2F F0 781 movx @dptr,a 782 ;; finally enable SOFIR interrupt 0F30 90 7F AE 783 mov dptr,#USBIEN 0F33 74 03 784 mov a,#3 ; enable SUDAV+SOFIR interrupt 0F35 F0 785 movx @dptr,a 0F36 12 0A 13 786 lcall fillusbintr 0F39 02 01 57 787 ljmp mainloop 788 789 790 .area CSEG (CODE) 0002 791 ar2 = 0x02 0003 792 ar3 = 0x03 0004 793 ar4 = 0x04 0005 794 ar5 = 0x05 0006 795 ar6 = 0x06 0007 796 ar7 = 0x07 0000 797 ar0 = 0x00 0001 798 ar1 = 0x01 799 800 ;; WARNING! The assembler doesn't check for 801 ;; out of range short jump labels!! Double check 802 ;; that the jump labels are within the range! 0157 803 mainloop: 0157 E5 4C 804 mov a,pttforce 0159 A2 E0 805 mov c,acc.0 015B 92 00 806 mov ctrl_ptt,c 015D 92 02 807 mov ctrl_ledptt,c 015F B3 808 cpl c 0160 82 08 809 anl c,pttmute 0162 92 01 810 mov ctrl_pttmute,c 0164 90 C0 08 811 mov dptr,#AUDIOCTRL 0167 E5 20 812 mov a,ctrlreg 0169 F0 813 movx @dptr,a 016A 02 01 57 814 ljmp mainloop 815 816 ;; ------------------ interrupt handlers ------------------------ 817 016D 818 int0_isr: 016D C0 E0 819 push acc 016F C0 F0 820 push b 0171 C0 82 821 push dpl0 0173 C0 83 822 push dph0 0175 C0 D0 823 push psw 0177 75 D0 00 824 mov psw,#0x00 017A C0 86 825 push dps 017C 75 86 00 826 mov dps,#0 827 ;; clear interrupt 017F C2 89 828 clr tcon+1 829 ;; handle interrupt 830 ;; epilogue 0181 D0 86 831 pop dps 0183 D0 D0 832 pop psw 0185 D0 83 833 pop dph0 0187 D0 82 834 pop dpl0 0189 D0 F0 835 pop b 018B D0 E0 836 pop acc 018D 32 837 reti 838 018E 839 timer0_isr: 018E C0 E0 840 push acc 0190 C0 F0 841 push b 0192 C0 82 842 push dpl0 0194 C0 83 843 push dph0 0196 C0 D0 844 push psw 0198 75 D0 00 845 mov psw,#0x00 019B C0 86 846 push dps 019D 75 86 00 847 mov dps,#0 848 ;; clear interrupt 01A0 C2 8D 849 clr tcon+5 850 ;; handle interrupt 0000 851 .if 0 852 inc leddiv 853 mov a,leddiv 854 anl a,#7 855 jnz 0$ 856 mov dptr,#OUTC 857 movx a,@dptr 858 xrl a,#0x08 859 movx @dptr,a 860 0$: 861 .endif 862 ;; epilogue 01A2 D0 86 863 pop dps 01A4 D0 D0 864 pop psw 01A6 D0 83 865 pop dph0 01A8 D0 82 866 pop dpl0 01AA D0 F0 867 pop b 01AC D0 E0 868 pop acc 01AE 32 869 reti 870 01AF 871 int1_isr: 01AF C0 E0 872 push acc 01B1 C0 F0 873 push b 01B3 C0 82 874 push dpl0 01B5 C0 83 875 push dph0 01B7 C0 D0 876 push psw 01B9 75 D0 00 877 mov psw,#0x00 01BC C0 86 878 push dps 01BE 75 86 00 879 mov dps,#0 880 ;; clear interrupt 01C1 C2 8B 881 clr tcon+3 882 ;; handle interrupt 883 ;; epilogue 01C3 D0 86 884 pop dps 01C5 D0 D0 885 pop psw 01C7 D0 83 886 pop dph0 01C9 D0 82 887 pop dpl0 01CB D0 F0 888 pop b 01CD D0 E0 889 pop acc 01CF 32 890 reti 891 01D0 892 timer1_isr: 01D0 C0 E0 893 push acc 01D2 C0 F0 894 push b 01D4 C0 82 895 push dpl0 01D6 C0 83 896 push dph0 01D8 C0 D0 897 push psw 01DA 75 D0 00 898 mov psw,#0x00 01DD C0 86 899 push dps 01DF 75 86 00 900 mov dps,#0 901 ;; clear interrupt 01E2 C2 8F 902 clr tcon+7 903 ;; handle interrupt 904 ;; epilogue 01E4 D0 86 905 pop dps 01E6 D0 D0 906 pop psw 01E8 D0 83 907 pop dph0 01EA D0 82 908 pop dpl0 01EC D0 F0 909 pop b 01EE D0 E0 910 pop acc 01F0 32 911 reti 912 01F1 913 ser0_isr: 01F1 C0 E0 914 push acc 01F3 C0 F0 915 push b 01F5 C0 82 916 push dpl0 01F7 C0 83 917 push dph0 01F9 C0 D0 918 push psw 01FB 75 D0 00 919 mov psw,#0x00 01FE C0 86 920 push dps 0200 75 86 00 921 mov dps,#0 0203 C0 00 922 push ar0 923 ;; clear interrupt 0205 10 98 16 924 jbc scon0+0,1$ ; RI 0208 10 99 0F 925 0$: jbc scon0+1,2$ ; TI 926 ;; handle interrupt 927 ;; epilogue 020B D0 00 928 3$: pop ar0 020D D0 86 929 pop dps 020F D0 D0 930 pop psw 0211 D0 83 931 pop dph0 0213 D0 82 932 pop dpl0 0215 D0 F0 933 pop b 0217 D0 E0 934 pop acc 0219 32 935 reti 936 021A D2 09 937 2$: setb uartempty 021C 80 EA 938 sjmp 0$ 939 021E E5 5D 940 1$: mov a,uartwr 0220 24 4D 941 add a,#uartbuf 0222 F8 942 mov r0,a 0223 E5 99 943 mov a,sbuf0 0225 F6 944 mov @r0,a 0226 E5 5D 945 mov a,uartwr 0228 04 946 inc a 0229 54 0F 947 anl a,#0xf 022B F5 5D 948 mov uartwr,a 022D 80 DC 949 sjmp 3$ 950 022F 951 timer2_isr: 022F C0 E0 952 push acc 0231 C0 F0 953 push b 0233 C0 82 954 push dpl0 0235 C0 83 955 push dph0 0237 C0 D0 956 push psw 0239 75 D0 00 957 mov psw,#0x00 023C C0 86 958 push dps 023E 75 86 00 959 mov dps,#0 960 ;; clear interrupt 0241 C2 CF 961 clr t2con+7 962 ;; handle interrupt 963 ;; epilogue 0243 D0 86 964 pop dps 0245 D0 D0 965 pop psw 0247 D0 83 966 pop dph0 0249 D0 82 967 pop dpl0 024B D0 F0 968 pop b 024D D0 E0 969 pop acc 024F 32 970 reti 971 0250 972 resume_isr: 0250 C0 E0 973 push acc 0252 C0 F0 974 push b 0254 C0 82 975 push dpl0 0256 C0 83 976 push dph0 0258 C0 D0 977 push psw 025A 75 D0 00 978 mov psw,#0x00 025D C0 86 979 push dps 025F 75 86 00 980 mov dps,#0 981 ;; clear interrupt 0262 C2 DC 982 clr eicon+4 983 ;; handle interrupt 984 ;; epilogue 0264 D0 86 985 pop dps 0266 D0 D0 986 pop psw 0268 D0 83 987 pop dph0 026A D0 82 988 pop dpl0 026C D0 F0 989 pop b 026E D0 E0 990 pop acc 0270 32 991 reti 992 0271 993 ser1_isr: 0271 C0 E0 994 push acc 0273 C0 F0 995 push b 0275 C0 82 996 push dpl0 0277 C0 83 997 push dph0 0279 C0 D0 998 push psw 027B 75 D0 00 999 mov psw,#0x00 027E C0 86 1000 push dps 0280 75 86 00 1001 mov dps,#0 1002 ;; clear interrupt 0283 C2 C0 1003 clr scon1+0 0285 C2 C1 1004 clr scon1+1 1005 ;; handle interrupt 1006 ;; epilogue 0287 D0 86 1007 pop dps 0289 D0 D0 1008 pop psw 028B D0 83 1009 pop dph0 028D D0 82 1010 pop dpl0 028F D0 F0 1011 pop b 0291 D0 E0 1012 pop acc 0293 32 1013 reti 1014 0294 1015 i2c_isr: 0294 C0 E0 1016 push acc 0296 C0 F0 1017 push b 0298 C0 82 1018 push dpl0 029A C0 83 1019 push dph0 029C C0 D0 1020 push psw 029E 75 D0 00 1021 mov psw,#0x00 02A1 C0 86 1022 push dps 02A3 75 86 00 1023 mov dps,#0 1024 ;; clear interrupt 02A6 E5 91 1025 mov a,exif 02A8 C2 E5 1026 clr acc.5 02AA F5 91 1027 mov exif,a 1028 ;; handle interrupt 1029 ;; epilogue 02AC D0 86 1030 pop dps 02AE D0 D0 1031 pop psw 02B0 D0 83 1032 pop dph0 02B2 D0 82 1033 pop dpl0 02B4 D0 F0 1034 pop b 02B6 D0 E0 1035 pop acc 02B8 32 1036 reti 1037 02B9 1038 int4_isr: 02B9 C0 E0 1039 push acc 02BB C0 F0 1040 push b 02BD C0 82 1041 push dpl0 02BF C0 83 1042 push dph0 02C1 C0 D0 1043 push psw 02C3 75 D0 00 1044 mov psw,#0x00 02C6 C0 86 1045 push dps 02C8 75 86 00 1046 mov dps,#0 1047 ;; clear interrupt 02CB E5 91 1048 mov a,exif 02CD C2 E6 1049 clr acc.6 02CF F5 91 1050 mov exif,a 1051 ;; handle interrupt 1052 ;; epilogue 02D1 D0 86 1053 pop dps 02D3 D0 D0 1054 pop psw 02D5 D0 83 1055 pop dph0 02D7 D0 82 1056 pop dpl0 02D9 D0 F0 1057 pop b 02DB D0 E0 1058 pop acc 02DD 32 1059 reti 1060 02DE 1061 int5_isr: 02DE C0 E0 1062 push acc 02E0 C0 F0 1063 push b 02E2 C0 82 1064 push dpl0 02E4 C0 83 1065 push dph0 02E6 C0 D0 1066 push psw 02E8 75 D0 00 1067 mov psw,#0x00 02EB C0 86 1068 push dps 02ED 75 86 00 1069 mov dps,#0 1070 ;; clear interrupt 02F0 E5 91 1071 mov a,exif 02F2 C2 E7 1072 clr acc.7 02F4 F5 91 1073 mov exif,a 1074 ;; handle interrupt 1075 ;; epilogue 02F6 D0 86 1076 pop dps 02F8 D0 D0 1077 pop psw 02FA D0 83 1078 pop dph0 02FC D0 82 1079 pop dpl0 02FE D0 F0 1080 pop b 0300 D0 E0 1081 pop acc 0302 32 1082 reti 1083 0303 1084 int6_isr: 0303 C0 E0 1085 push acc 0305 C0 F0 1086 push b 0307 C0 82 1087 push dpl0 0309 C0 83 1088 push dph0 030B C0 D0 1089 push psw 030D 75 D0 00 1090 mov psw,#0x00 0310 C0 86 1091 push dps 0312 75 86 00 1092 mov dps,#0 1093 ;; clear interrupt 0315 C2 DB 1094 clr eicon+3 1095 ;; handle interrupt 1096 ;; epilogue 0317 D0 86 1097 pop dps 0319 D0 D0 1098 pop psw 031B D0 83 1099 pop dph0 031D D0 82 1100 pop dpl0 031F D0 F0 1101 pop b 0321 D0 E0 1102 pop acc 0323 32 1103 reti 1104 0324 1105 usb_sudav_isr: 0324 C0 E0 1106 push acc 0326 C0 F0 1107 push b 0328 C0 82 1108 push dpl0 032A C0 83 1109 push dph0 032C C0 84 1110 push dpl1 032E C0 85 1111 push dph1 0330 C0 D0 1112 push psw 0332 75 D0 00 1113 mov psw,#0x00 0335 C0 86 1114 push dps 0337 75 86 00 1115 mov dps,#0 033A C0 00 1116 push ar0 033C C0 07 1117 push ar7 1118 ;; clear interrupt 033E E5 91 1119 mov a,exif 0340 C2 E4 1120 clr acc.4 0342 F5 91 1121 mov exif,a 0344 90 7F AB 1122 mov dptr,#USBIRQ 0347 74 01 1123 mov a,#0x01 0349 F0 1124 movx @dptr,a 1125 ;; handle interrupt 034A 75 40 00 1126 mov ctrlcode,#0 ; reset control out code 034D 90 7F E9 1127 mov dptr,#SETUPDAT+1 0350 E0 1128 movx a,@dptr ; bRequest field 1129 ;; standard commands 1130 ;; USB_REQ_GET_DESCRIPTOR 0351 B4 06 59 1131 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 0354 90 7F E8 1132 mov dptr,#SETUPDAT ; bRequestType == 0x80 0357 E0 1133 movx a,@dptr 0358 B4 80 4F 1134 cjne a,#USB_DIR_IN,setupstallstd 035B 90 7F EB 1135 mov dptr,#SETUPDAT+3 035E E0 1136 movx a,@dptr 035F B4 01 0C 1137 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 0362 90 7F D4 1138 mov dptr,#SUDPTRH 0365 74 0C 1139 mov a,#>devicedescr 0367 F0 1140 movx @dptr,a 0368 A3 1141 inc dptr 0369 74 CB 1142 mov a,#config0descr 037C F0 1152 movx @dptr,a 037D A3 1153 inc dptr 037E 74 DD 1154 mov a,#stringdescr 0398 F5 83 1169 mov dph0,a 039A E0 1170 movx a,@dptr 039B F5 F0 1171 mov b,a 039D A3 1172 inc dptr 039E E0 1173 movx a,@dptr 039F 90 7F D4 1174 mov dptr,#SUDPTRH 03A2 F0 1175 movx @dptr,a 03A3 A3 1176 inc dptr 03A4 E5 F0 1177 mov a,b 03A6 F0 1178 movx @dptr,a 1179 ; sjmp setupackstd 03A7 1180 setupackstd: 03A7 02 07 B7 1181 ljmp setupack 03AA 1182 setupstallstd: 03AA 02 07 B3 1183 ljmp setupstall 03AD 1184 cmdnotgetdesc: 1185 ;; USB_REQ_SET_CONFIGURATION 03AD B4 09 41 1186 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 03B0 90 7F E8 1187 mov dptr,#SETUPDAT 03B3 E0 1188 movx a,@dptr 03B4 70 F4 1189 jnz setupstallstd 03B6 90 7F EA 1190 mov dptr,#SETUPDAT+2 03B9 E0 1191 movx a,@dptr 03BA 24 FE 1192 add a,#-2 03BC 40 EC 1193 jc setupstallstd 03BE E0 1194 movx a,@dptr 03BF F5 62 1195 mov numconfig,a 03C1 1196 cmdresettoggleshalt: 03C1 90 7F D7 1197 mov dptr,#TOGCTL 03C4 78 07 1198 mov r0,#7 03C6 E8 1199 0$: mov a,r0 03C7 44 10 1200 orl a,#0x10 03C9 F0 1201 movx @dptr,a 03CA 44 30 1202 orl a,#0x30 03CC F0 1203 movx @dptr,a 03CD E8 1204 mov a,r0 03CE F0 1205 movx @dptr,a 03CF 44 20 1206 orl a,#0x20 03D1 F0 1207 movx @dptr,a 03D2 D8 F2 1208 djnz r0,0$ 03D4 E4 1209 clr a 03D5 F0 1210 movx @dptr,a 03D6 74 02 1211 mov a,#2 03D8 90 7F B6 1212 mov dptr,#IN1CS 03DB 78 07 1213 mov r0,#7 03DD F0 1214 1$: movx @dptr,a 03DE A3 1215 inc dptr 03DF A3 1216 inc dptr 03E0 D8 FB 1217 djnz r0,1$ 03E2 90 7F C6 1218 mov dptr,#OUT1CS 03E5 78 07 1219 mov r0,#7 03E7 F0 1220 2$: movx @dptr,a 03E8 A3 1221 inc dptr 03E9 A3 1222 inc dptr 03EA D8 FB 1223 djnz r0,2$ 03EC 12 0A 13 1224 lcall fillusbintr 03EF 80 B6 1225 sjmp setupackstd 03F1 1226 cmdnotsetconf: 1227 ;; USB_REQ_SET_INTERFACE 03F1 B4 0B 1E 1228 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 03F4 90 7F E8 1229 mov dptr,#SETUPDAT 03F7 E0 1230 movx a,@dptr 03F8 B4 01 AF 1231 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 03FB E5 62 1232 mov a,numconfig 03FD B4 01 AA 1233 cjne a,#1,setupstallstd 0400 90 7F EC 1234 mov dptr,#SETUPDAT+4 0403 E0 1235 movx a,@dptr 0404 24 FC 1236 add a,#-NUMINTERFACES 0406 40 A2 1237 jc setupstallstd 0408 24 67 1238 add a,#NUMINTERFACES+altsetting 040A F8 1239 mov r0,a 040B 90 7F EA 1240 mov dptr,#SETUPDAT+2 040E E0 1241 movx a,@dptr 040F F6 1242 mov @r0,a 0410 80 AF 1243 sjmp cmdresettoggleshalt 0412 1244 cmdnotsetint: 1245 ;; USB_REQ_GET_INTERFACE 0412 B4 0A 24 1246 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 0415 90 7F E8 1247 mov dptr,#SETUPDAT 0418 E0 1248 movx a,@dptr 0419 B4 81 8E 1249 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 041C E5 62 1250 mov a,numconfig 041E B4 01 89 1251 cjne a,#1,setupstallstd 0421 90 7F EC 1252 mov dptr,#SETUPDAT+4 0424 E0 1253 movx a,@dptr 0425 24 FC 1254 add a,#-NUMINTERFACES 0427 40 81 1255 jc setupstallstd 0429 24 67 1256 add a,#NUMINTERFACES+altsetting 042B F8 1257 mov r0,a 042C E6 1258 mov a,@r0 042D 1259 cmdrespondonebyte: 042D 90 7F 00 1260 mov dptr,#IN0BUF 0430 F0 1261 movx @dptr,a 0431 90 7F B5 1262 mov dptr,#IN0BC 0434 74 01 1263 mov a,#1 0436 F0 1264 movx @dptr,a 0437 80 4E 1265 sjmp setupackstd2 0439 1266 cmdnotgetint: 1267 ;; USB_REQ_GET_CONFIGURATION 0439 B4 08 0B 1268 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 043C 90 7F E8 1269 mov dptr,#SETUPDAT 043F E0 1270 movx a,@dptr 0440 B4 80 47 1271 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 0443 E5 62 1272 mov a,numconfig 0445 80 E6 1273 sjmp cmdrespondonebyte 0447 1274 cmdnotgetconf: 1275 ;; USB_REQ_GET_STATUS (0) 0447 70 44 1276 jnz cmdnotgetstat 0449 90 7F E8 1277 mov dptr,#SETUPDAT 044C E0 1278 movx a,@dptr 044D B4 80 11 1279 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 0450 74 01 1280 mov a,#1 0452 1281 cmdrespondstat: 0452 90 7F 00 1282 mov dptr,#IN0BUF 0455 F0 1283 movx @dptr,a 0456 A3 1284 inc dptr 0457 E4 1285 clr a 0458 F0 1286 movx @dptr,a 0459 90 7F B5 1287 mov dptr,#IN0BC 045C 74 02 1288 mov a,#2 045E F0 1289 movx @dptr,a 045F 80 26 1290 sjmp setupackstd2 0461 1291 cmdnotgetstatdev: 0461 B4 81 03 1292 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 0464 E4 1293 clr a 0465 80 EB 1294 sjmp cmdrespondstat 0467 1295 cmdnotgetstatintf: 0467 B4 82 20 1296 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 046A 90 7F EC 1297 mov dptr,#SETUPDAT+4 046D E0 1298 movx a,@dptr 046E 90 7F C4 1299 mov dptr,#OUT1CS-2 0471 30 E7 03 1300 jnb acc.7,0$ 0474 90 7F B4 1301 mov dptr,#IN1CS-2 0477 54 0F 1302 0$: anl a,#15 0479 60 0F 1303 jz setupstallstd2 047B 20 E3 0C 1304 jb acc.3,setupstallstd2 047E 25 E0 1305 add a,acc 0480 25 82 1306 add a,dpl0 0482 F5 82 1307 mov dpl0,a 0484 E0 1308 movx a,@dptr 0485 80 CB 1309 sjmp cmdrespondstat 0487 1310 setupackstd2: 0487 02 07 B7 1311 ljmp setupack 048A 1312 setupstallstd2: 048A 02 07 B3 1313 ljmp setupstall 048D 1314 cmdnotgetstat: 1315 ;; USB_REQ_SET_FEATURE 048D B4 03 05 1316 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 0490 75 F0 01 1317 mov b,#1 0493 80 06 1318 sjmp handleftr 0495 1319 cmdnotsetftr: 1320 ;; USB_REQ_CLEAR_FEATURE 0495 B4 01 44 1321 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 0498 75 F0 00 1322 mov b,#0 049B 1323 handleftr: 049B 90 7F E8 1324 mov dptr,#SETUPDAT 049E E0 1325 movx a,@dptr 049F B4 02 E8 1326 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 04A2 A3 1327 inc dptr 04A3 A3 1328 inc dptr 04A4 E0 1329 movx a,@dptr 04A5 70 E3 1330 jnz setupstallstd2 ; not ENDPOINT_HALT feature 04A7 A3 1331 inc dptr 04A8 E0 1332 movx a,@dptr 04A9 70 DF 1333 jnz setupstallstd2 04AB A3 1334 inc dptr 04AC E0 1335 movx a,@dptr 04AD 90 7F C4 1336 mov dptr,#OUT1CS-2 04B0 30 E7 05 1337 jnb acc.7,0$ 04B3 90 7F B4 1338 mov dptr,#IN1CS-2 04B6 44 10 1339 orl a,#0x10 04B8 20 E3 CF 1340 0$: jb acc.3,setupstallstd2 1341 ;; clear data toggle 04BB 54 1F 1342 anl a,#0x1f 04BD 05 86 1343 inc dps 04BF 90 7F D7 1344 mov dptr,#TOGCTL 04C2 F0 1345 movx @dptr,a 04C3 44 20 1346 orl a,#0x20 04C5 F0 1347 movx @dptr,a 04C6 54 0F 1348 anl a,#15 04C8 F0 1349 movx @dptr,a 04C9 15 86 1350 dec dps 1351 ;; clear/set ep halt feature 04CB 25 E0 1352 add a,acc 04CD 25 82 1353 add a,dpl0 04CF F5 82 1354 mov dpl0,a 04D1 E5 F0 1355 mov a,b 04D3 F0 1356 movx @dptr,a 04D4 80 B1 1357 sjmp setupackstd2 1358 04D6 1359 cmdnotc0_1: 04D6 02 05 6E 1360 ljmp cmdnotc0 04D9 1361 setupstallc0_1: 04D9 02 07 B3 1362 ljmp setupstall 1363 04DC 1364 cmdnotclrftr: 1365 ;; vendor specific commands 1366 ;; 0xc0 04DC B4 C0 F7 1367 cjne a,#0xc0,cmdnotc0_1 04DF 90 7F E8 1368 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04E2 E0 1369 movx a,@dptr 04E3 B4 C0 F3 1370 cjne a,#0xc0,setupstallc0_1 1371 ;; fill status buffer 04E6 E5 4C 1372 mov a,pttforce 04E8 F5 F0 1373 mov b,a 04EA A2 E0 1374 mov c,acc.0 04EC 92 F2 1375 mov b.2,c 04EE 90 C0 09 1376 mov dptr,#AUDIOSTAT 04F1 E0 1377 movx a,@dptr 04F2 A2 E0 1378 mov c,acc.0 04F4 B3 1379 cpl c 04F5 92 F3 1380 mov b.3,c 04F7 A2 09 1381 mov c,uartempty 04F9 92 F5 1382 mov b.5,c 04FB E4 1383 clr a 04FC 90 7F 04 1384 mov dptr,#(IN0BUF+4) 04FF F0 1385 movx @dptr,a 1386 ;; bytewide elements 0500 90 7F 00 1387 mov dptr,#(IN0BUF) 0503 E5 F0 1388 mov a,b 0505 F0 1389 movx @dptr,a 0506 E4 1390 clr a 0507 90 7F 01 1391 mov dptr,#(IN0BUF+1) 050A F0 1392 movx @dptr,a 050B 90 7F 02 1393 mov dptr,#(IN0BUF+2) 050E F0 1394 movx @dptr,a 050F 90 C0 04 1395 mov dptr,#AUDIORSSI 0512 E0 1396 movx a,@dptr 0513 90 7F 03 1397 mov dptr,#(IN0BUF+3) 0516 F0 1398 movx @dptr,a 1399 ;; counter 0517 05 44 1400 inc irqcount 0519 E5 44 1401 mov a,irqcount 051B 90 7F 05 1402 mov dptr,#(IN0BUF+5) 051E F0 1403 movx @dptr,a 1404 ;; additional fields (HDLC state mach) 051F E4 1405 clr a 0520 A3 1406 inc dptr 0521 F0 1407 movx @dptr,a 0522 A3 1408 inc dptr 0523 F0 1409 movx @dptr,a 0524 A3 1410 inc dptr 0525 F0 1411 movx @dptr,a 0526 A3 1412 inc dptr 0527 F0 1413 movx @dptr,a 0528 A3 1414 inc dptr 0529 F0 1415 movx @dptr,a 052A A3 1416 inc dptr 052B F0 1417 movx @dptr,a 052C A3 1418 inc dptr 052D F0 1419 movx @dptr,a 052E A3 1420 inc dptr 052F F0 1421 movx @dptr,a 0530 A3 1422 inc dptr 0531 F0 1423 movx @dptr,a 0532 A3 1424 inc dptr 0533 F0 1425 movx @dptr,a 0534 A3 1426 inc dptr 0535 F0 1427 movx @dptr,a 0536 A3 1428 inc dptr 0537 F0 1429 movx @dptr,a 1430 ;; FPGA registers 0538 90 C0 01 1431 mov dptr,#AUDIORXFIFOCNT 053B E0 1432 movx a,@dptr 053C 90 7F 12 1433 mov dptr,#(IN0BUF+18) 053F F0 1434 movx @dptr,a 0540 90 C0 02 1435 mov dptr,#AUDIOTXFIFOCNT 0543 E0 1436 movx a,@dptr 0544 90 7F 13 1437 mov dptr,#(IN0BUF+19) 0547 F0 1438 movx @dptr,a 0548 E5 20 1439 mov a,ctrlreg 054A A3 1440 inc dptr 054B F0 1441 movx @dptr,a 054C 90 C0 09 1442 mov dptr,#AUDIOSTAT 054F E0 1443 movx a,@dptr 0550 90 7F 15 1444 mov dptr,#(IN0BUF+21) 0553 F0 1445 movx @dptr,a 1446 ;; Anchor Registers 0554 90 7F C8 1447 mov dptr,#OUT2CS 0557 E0 1448 movx a,@dptr 0558 90 7F 16 1449 mov dptr,#(IN0BUF+22) 055B F0 1450 movx @dptr,a 1451 ;; set length 055C 90 7F EE 1452 mov dptr,#SETUPDAT+6 ; wLength 055F E0 1453 movx a,@dptr 0560 24 E9 1454 add a,#-(6+12+4+1) 0562 50 01 1455 jnc 4$ 0564 E4 1456 clr a 0565 24 17 1457 4$: add a,#(6+12+4+1) 0567 90 7F B5 1458 mov dptr,#IN0BC 056A F0 1459 movx @dptr,a 056B 02 07 B7 1460 ljmp setupack 056E 1461 cmdnotc0: 1462 ;; 0xc8 056E B4 C8 19 1463 cjne a,#0xc8,cmdnotc8 0571 90 7F E8 1464 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0574 E0 1465 movx a,@dptr 0575 B4 C0 0F 1466 cjne a,#0xc0,setupstallc8 0578 74 04 1467 mov a,#4 057A 90 7F 00 1468 mov dptr,#IN0BUF 057D F0 1469 movx @dptr,a 057E 90 7F B5 1470 mov dptr,#IN0BC 0581 74 01 1471 mov a,#1 0583 F0 1472 movx @dptr,a 0584 02 07 B7 1473 ljmp setupack 0587 1474 setupstallc8: 0587 02 07 B3 1475 ljmp setupstall 058A 1476 cmdnotc8: 1477 ;; 0xc9 058A B4 C9 21 1478 cjne a,#0xc9,cmdnotc9 058D 90 7F E8 1479 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0590 E0 1480 movx a,@dptr 0591 B4 C0 17 1481 cjne a,#0xc0,setupstallc9 0594 90 7F 00 1482 mov dptr,#IN0BUF 0597 78 F0 1483 mov r0,#parserial 0599 E2 1484 0$: movx a,@r0 059A 60 05 1485 jz 1$ 059C F0 1486 movx @dptr,a 059D 08 1487 inc r0 059E A3 1488 inc dptr 059F 80 F8 1489 sjmp 0$ 05A1 E8 1490 1$: mov a,r0 05A2 24 10 1491 add a,#-0xf0 ; -parserial 05A4 90 7F B5 1492 mov dptr,#IN0BC 05A7 F0 1493 movx @dptr,a 05A8 02 07 B7 1494 ljmp setupack 05AB 1495 setupstallc9: 05AB 02 07 B3 1496 ljmp setupstall 05AE 1497 cmdnotc9: 1498 ;; 0xd0 05AE B4 D0 45 1499 cjne a,#0xd0,cmdnotd0 05B1 90 7F E8 1500 mov dptr,#SETUPDAT ; bRequestType == 0xc0 05B4 E0 1501 movx a,@dptr 05B5 B4 C0 3B 1502 cjne a,#0xc0,setupstalld0 05B8 90 7F EC 1503 mov dptr,#SETUPDAT+4 ; wIndex 05BB E0 1504 movx a,@dptr 05BC B4 01 08 1505 cjne a,#1,0$ 05BF 90 7F EA 1506 mov dptr,#SETUPDAT+2 ; wValue 05C2 E0 1507 movx a,@dptr 05C3 54 01 1508 anl a,#1 05C5 F5 4C 1509 mov pttforce,a 05C7 1510 0$: ;; PTT status 05C7 90 7F 00 1511 mov dptr,#IN0BUF 05CA E5 4C 1512 mov a,pttforce 05CC F0 1513 movx @dptr,a 1514 ;; DCD status 05CD 90 C0 09 1515 mov dptr,#AUDIOSTAT 05D0 E0 1516 movx a,@dptr 05D1 54 01 1517 anl a,#1 05D3 64 01 1518 xrl a,#1 05D5 90 7F 01 1519 mov dptr,#IN0BUF+1 05D8 F0 1520 movx @dptr,a 1521 ;; RSSI 05D9 90 C0 04 1522 mov dptr,#AUDIORSSI 05DC E0 1523 movx a,@dptr 05DD 90 7F 02 1524 mov dptr,#IN0BUF+2 05E0 F0 1525 movx @dptr,a 1526 ;; length 05E1 90 7F EE 1527 mov dptr,#SETUPDAT+6 ; wLength 05E4 E0 1528 movx a,@dptr 05E5 24 FD 1529 add a,#-3 05E7 50 01 1530 jnc 2$ 05E9 E4 1531 clr a 05EA 24 03 1532 2$: add a,#3 05EC 90 7F B5 1533 mov dptr,#IN0BC 05EF F0 1534 movx @dptr,a 05F0 02 07 B7 1535 ljmp setupack 05F3 1536 setupstalld0: 05F3 02 07 B3 1537 ljmp setupstall 05F6 1538 cmdnotd0: 1539 ;; 0xd2 05F6 B4 D2 20 1540 cjne a,#0xd2,cmdnotd2 05F9 90 7F E8 1541 mov dptr,#SETUPDAT ; bRequestType == 0x40 05FC E0 1542 movx a,@dptr 05FD B4 40 16 1543 cjne a,#0x40,setupstalld2 0600 90 7F EA 1544 mov dptr,#SETUPDAT+2 ; wValue 0603 E0 1545 movx a,@dptr 0604 F5 F0 1546 mov b,a 0606 90 7F 98 1547 mov dptr,#OUTC 0609 E0 1548 movx a,@dptr 060A A2 F0 1549 mov c,b.0 060C 92 E3 1550 mov acc.3,c 060E A2 F1 1551 mov c,b.1 0610 92 E5 1552 mov acc.5,c 0612 F0 1553 movx @dptr,a 0613 02 07 B7 1554 ljmp setupack 0616 1555 setupstalld2: 0616 02 07 B3 1556 ljmp setupstall 0619 1557 cmdnotd2: 1558 ;; 0xd3 0619 B4 D3 16 1559 cjne a,#0xd3,cmdnotd3 061C 90 7F E8 1560 mov dptr,#SETUPDAT ; bRequestType == 0x40 061F E0 1561 movx a,@dptr 0620 B4 40 07 1562 cjne a,#0x40,setupstalld3 0623 90 7F EA 1563 mov dptr,#SETUPDAT+2 ; wValue 0626 E0 1564 movx a,@dptr 0627 10 09 03 1565 jbc uartempty,cmdd2cont 062A 1566 setupstalld3: 062A 02 07 B3 1567 ljmp setupstall 062D 1568 cmdd2cont: 062D F5 99 1569 mov sbuf0,a 062F 02 07 B7 1570 ljmp setupack 0632 1571 cmdnotd3: 1572 ;; 0xd4 0632 B4 D4 49 1573 cjne a,#0xd4,cmdnotd4 0635 90 7F E8 1574 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0638 E0 1575 movx a,@dptr 0639 B4 C0 3F 1576 cjne a,#0xc0,setupstalld4 063C 90 7F EC 1577 mov dptr,#SETUPDAT+4 ; wIndex 063F E0 1578 movx a,@dptr 0640 90 7F EA 1579 mov dptr,#SETUPDAT+2 ; wValue 0643 B4 01 09 1580 cjne a,#1,0$ 0646 E0 1581 movx a,@dptr 0647 90 C0 0D 1582 mov dptr,#AUDIOMDISCOUT 064A F0 1583 movx @dptr,a 064B F5 61 1584 mov mdiscout,a 064D 80 0A 1585 sjmp 1$ 064F B4 02 07 1586 0$: cjne a,#2,1$ 0652 E0 1587 movx a,@dptr 0653 90 C0 0C 1588 mov dptr,#AUDIOMDISCTRIS 0656 F0 1589 movx @dptr,a 0657 F5 60 1590 mov mdisctris,a 0659 90 C0 0E 1591 1$: mov dptr,#AUDIOMDISCIN 065C E0 1592 movx a,@dptr 065D 90 7F 00 1593 mov dptr,#IN0BUF+0 0660 F0 1594 movx @dptr,a 0661 E5 61 1595 mov a,mdiscout 0663 A3 1596 inc dptr 0664 F0 1597 movx @dptr,a 0665 E5 60 1598 mov a,mdisctris 0667 A3 1599 inc dptr 0668 F0 1600 movx @dptr,a 1601 ;; length 0669 90 7F EE 1602 mov dptr,#SETUPDAT+6 ; wLength 066C E0 1603 movx a,@dptr 066D 24 FD 1604 add a,#-3 066F 50 01 1605 jnc 2$ 0671 E4 1606 clr a 0672 24 03 1607 2$: add a,#3 0674 90 7F B5 1608 mov dptr,#IN0BC 0677 F0 1609 movx @dptr,a 0678 02 07 B7 1610 ljmp setupack 067B 1611 setupstalld4: 067B 02 07 B3 1612 ljmp setupstall 067E 1613 cmdnotd4: 1614 ;; 0xd5 067E B4 D5 3F 1615 cjne a,#0xd5,cmdnotd5 0681 90 7F E8 1616 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0684 E0 1617 movx a,@dptr 0685 B4 C0 32 1618 cjne a,#0xc0,setupstalld5 0688 90 7F EC 1619 mov dptr,#SETUPDAT+4 ; wIndex 068B E0 1620 movx a,@dptr 068C B4 01 0A 1621 cjne a,#1,0$ 068F 90 7F EA 1622 mov dptr,#SETUPDAT+2 ; wValue 0692 E0 1623 movx a,@dptr 0693 90 C0 0A 1624 mov dptr,#AUDIOT7FOUT 0696 F0 1625 movx @dptr,a 0697 F5 5F 1626 mov t7fout,a 0699 90 C0 0B 1627 0$: mov dptr,#AUDIOT7FIN 069C E0 1628 movx a,@dptr 069D 90 7F 00 1629 mov dptr,#IN0BUF+0 06A0 F0 1630 movx @dptr,a 06A1 E5 5F 1631 mov a,t7fout 06A3 A3 1632 inc dptr 06A4 90 7F 01 1633 mov dptr,#IN0BUF+1 06A7 F0 1634 movx @dptr,a 1635 ;; length 06A8 90 7F EE 1636 mov dptr,#SETUPDAT+6 ; wLength 06AB E0 1637 movx a,@dptr 06AC 24 FE 1638 add a,#-2 06AE 50 01 1639 jnc 2$ 06B0 E4 1640 clr a 06B1 24 02 1641 2$: add a,#2 06B3 90 7F B5 1642 mov dptr,#IN0BC 06B6 F0 1643 movx @dptr,a 06B7 02 07 B7 1644 ljmp setupack 06BA 1645 setupstalld5: 06BA 1646 setupstalle0: 06BA 02 07 B3 1647 ljmp setupstall 06BD 1648 cmdnote0_0: 06BD 02 07 53 1649 ljmp cmdnote0 06C0 1650 cmdnotd5: 1651 ;; 0xe0 06C0 B4 E0 FA 1652 cjne a,#0xe0,cmdnote0_0 06C3 90 7F E8 1653 mov dptr,#SETUPDAT ; bRequestType == 0xc0 06C6 E0 1654 movx a,@dptr 06C7 B4 C0 F0 1655 cjne a,#0xc0,setupstalle0 1656 ;; set PTT, LED's and counter mode 06CA 90 7F EC 1657 mov dptr,#SETUPDAT+4 ; wIndex 06CD E0 1658 movx a,@dptr 06CE B4 01 12 1659 cjne a,#1,1$ 06D1 90 7F EA 1660 mov dptr,#SETUPDAT+2 ; wValue 06D4 E0 1661 movx a,@dptr 06D5 54 78 1662 anl a,#0x78 06D7 C5 20 1663 xch a,ctrlreg 06D9 54 07 1664 anl a,#0x07 06DB 45 20 1665 orl a,ctrlreg 06DD F5 20 1666 mov ctrlreg,a 06DF 90 C0 08 1667 mov dptr,#AUDIOCTRL 06E2 F0 1668 movx @dptr,a 06E3 90 7F EE 1669 1$: mov dptr,#SETUPDAT+6 ; wLength 06E6 E0 1670 movx a,@dptr 06E7 60 0D 1671 jz 3$ 06E9 B4 01 11 1672 cjne a,#1,2$ 06EC E5 20 1673 mov a,ctrlreg 06EE 90 7F 00 1674 mov dptr,#IN0BUF 06F1 54 7F 1675 anl a,#0x7f 06F3 F0 1676 movx @dptr,a 06F4 74 01 1677 mov a,#1 06F6 90 7F B5 1678 3$: mov dptr,#IN0BC 06F9 F0 1679 movx @dptr,a 06FA 02 07 B7 1680 ljmp setupack 06FD 90 C0 08 1681 2$: mov dptr,#AUDIOCTRL 0700 D2 07 1682 setb ctrl_cntsel 0702 E5 20 1683 mov a,ctrlreg 0704 F0 1684 movx @dptr,a 0705 90 C0 05 1685 mov dptr,#AUDIOCNTLOW 0708 E0 1686 movx a,@dptr 0709 90 7F 04 1687 mov dptr,#IN0BUF+4 070C F0 1688 movx @dptr,a 070D 90 C0 06 1689 mov dptr,#AUDIOCNTMID 0710 E0 1690 movx a,@dptr 0711 90 7F 05 1691 mov dptr,#IN0BUF+5 0714 F0 1692 movx @dptr,a 0715 90 C0 07 1693 mov dptr,#AUDIOCNTHIGH 0718 E0 1694 movx a,@dptr 0719 90 7F 06 1695 mov dptr,#IN0BUF+6 071C F0 1696 movx @dptr,a 071D 90 C0 08 1697 mov dptr,#AUDIOCTRL 0720 C2 07 1698 clr ctrl_cntsel 0722 E5 20 1699 mov a,ctrlreg 0724 F0 1700 movx @dptr,a 0725 90 7F 00 1701 mov dptr,#IN0BUF 0728 F0 1702 movx @dptr,a 0729 90 C0 05 1703 mov dptr,#AUDIOCNTLOW 072C E0 1704 movx a,@dptr 072D 90 7F 01 1705 mov dptr,#IN0BUF+1 0730 F0 1706 movx @dptr,a 0731 90 C0 06 1707 mov dptr,#AUDIOCNTMID 0734 E0 1708 movx a,@dptr 0735 90 7F 02 1709 mov dptr,#IN0BUF+2 0738 F0 1710 movx @dptr,a 0739 90 C0 07 1711 mov dptr,#AUDIOCNTHIGH 073C E0 1712 movx a,@dptr 073D 90 7F 03 1713 mov dptr,#IN0BUF+3 0740 F0 1714 movx @dptr,a 1715 ;; length 0741 90 7F EE 1716 mov dptr,#SETUPDAT+6 ; wLength 0744 E0 1717 movx a,@dptr 0745 24 F9 1718 add a,#-7 0747 50 01 1719 jnc 4$ 0749 E4 1720 clr a 074A 24 07 1721 4$: add a,#7 074C 90 7F B5 1722 mov dptr,#IN0BC 074F F0 1723 movx @dptr,a 0750 02 07 B7 1724 ljmp setupack 0753 1725 cmdnote0: 1726 ;; 0xe1 0753 B4 E1 3A 1727 cjne a,#0xe1,cmdnote1 0756 90 7F E8 1728 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0759 E0 1729 movx a,@dptr 075A B4 C0 30 1730 cjne a,#0xc0,setupstalle1 075D 90 7F 00 1731 mov dptr,#IN0BUF 0760 E5 45 1732 mov a,sofcount 0762 F0 1733 movx @dptr,a 0763 A3 1734 inc dptr 0764 E5 49 1735 mov a,framesize 0766 F0 1736 movx @dptr,a 0767 A3 1737 inc dptr 0768 E5 46 1738 mov a,divider 076A F0 1739 movx @dptr,a 076B A3 1740 inc dptr 076C E5 47 1741 mov a,divider+1 076E F0 1742 movx @dptr,a 076F A3 1743 inc dptr 0770 E5 48 1744 mov a,divrel 0772 F0 1745 movx @dptr,a 0773 A3 1746 inc dptr 0774 E5 4A 1747 mov a,pllcorrvar 0776 F0 1748 movx @dptr,a 0777 A3 1749 inc dptr 0778 E5 4B 1750 mov a,txfifocount 077A F0 1751 movx @dptr,a 1752 1753 ;mov dptr,#AUDIOTXFIFOCNT 1754 ;movx a,@dptr 1755 ;mov dptr,#IN0BUF+6 1756 ;movx @dptr,a 1757 1758 ;; length 077B 90 7F EE 1759 mov dptr,#SETUPDAT+6 ; wLength 077E E0 1760 movx a,@dptr 077F 24 F9 1761 add a,#-7 0781 50 01 1762 jnc 1$ 0783 E4 1763 clr a 0784 24 07 1764 1$: add a,#7 0786 90 7F B5 1765 mov dptr,#IN0BC 0789 F0 1766 movx @dptr,a 078A 02 07 B7 1767 ljmp setupack 078D 1768 setupstalle1: 078D 02 07 B3 1769 ljmp setupstall 0790 1770 cmdnote1: 1771 ;; 0xe2 0790 B4 E2 20 1772 cjne a,#0xe2,cmdnote2 0793 90 7F E8 1773 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0796 E0 1774 movx a,@dptr 0797 B4 C0 16 1775 cjne a,#0xc0,setupstalle2 079A 90 7F 00 1776 mov dptr,#IN0BUF 079D 78 80 1777 mov r0,#txsamples 079F AF 49 1778 mov r7,framesize 07A1 E6 1779 1$: mov a,@r0 07A2 F0 1780 movx @dptr,a 07A3 08 1781 inc r0 07A4 A3 1782 inc dptr 07A5 DF FA 1783 djnz r7,1$ 07A7 90 7F B5 1784 mov dptr,#IN0BC 07AA E5 49 1785 mov a,framesize 07AC F0 1786 movx @dptr,a 07AD 02 07 B7 1787 ljmp setupack 07B0 1788 setupstalle2: 07B0 02 07 B3 1789 ljmp setupstall 07B3 1790 cmdnote2: 1791 1792 ;; unknown commands fall through to setupstall 1793 07B3 1794 setupstall: 07B3 74 03 1795 mov a,#3 07B5 80 02 1796 sjmp endsetup 07B7 1797 setupack: 07B7 74 02 1798 mov a,#2 07B9 1799 endsetup: 07B9 90 7F B4 1800 mov dptr,#EP0CS 07BC F0 1801 movx @dptr,a 07BD 1802 endusbisr: 1803 ;; epilogue 07BD D0 07 1804 pop ar7 07BF D0 00 1805 pop ar0 07C1 D0 86 1806 pop dps 07C3 D0 D0 1807 pop psw 07C5 D0 85 1808 pop dph1 07C7 D0 84 1809 pop dpl1 07C9 D0 83 1810 pop dph0 07CB D0 82 1811 pop dpl0 07CD D0 F0 1812 pop b 07CF D0 E0 1813 pop acc 07D1 32 1814 reti 1815 07D2 1816 usb_sof_isr: 07D2 C0 E0 1817 push acc 07D4 C0 F0 1818 push b 07D6 C0 82 1819 push dpl0 07D8 C0 83 1820 push dph0 07DA C0 84 1821 push dpl1 07DC C0 85 1822 push dph1 07DE C0 D0 1823 push psw 07E0 75 D0 00 1824 mov psw,#0x00 07E3 C0 86 1825 push dps 07E5 75 86 00 1826 mov dps,#0 07E8 C0 02 1827 push ar2 07EA C0 03 1828 push ar3 07EC C0 00 1829 push ar0 1830 ;; clear interrupt 07EE E5 91 1831 mov a,exif 07F0 C2 E4 1832 clr acc.4 07F2 F5 91 1833 mov exif,a 07F4 90 7F AB 1834 mov dptr,#USBIRQ 07F7 74 02 1835 mov a,#0x02 07F9 F0 1836 movx @dptr,a 1837 ;; handle interrupt 07FA 05 45 1838 inc sofcount 1839 ;; debugging: we have two cases 1840 ;; if the ISO frame size is just 2 bytes, 1841 ;; we return the frame number, otherwise 1842 ;; the required numbers of samples 07FC E5 49 1843 mov a,framesize 07FE B4 02 14 1844 cjne a,#2,1$ 1845 ;; copy the frame number 0801 90 7F D8 1846 mov dptr,#USBFRAMEL 0804 E0 1847 movx a,@dptr 0805 A3 1848 inc dptr 0806 05 86 1849 inc dps 0808 90 7F 68 1850 mov dptr,#IN8DATA 080B F0 1851 movx @dptr,a 080C 15 86 1852 dec dps 080E E0 1853 movx a,@dptr 080F 05 86 1854 inc dps 0811 F0 1855 movx @dptr,a 0812 02 09 05 1856 ljmp sofendisr 0815 B4 03 36 1857 1$: cjne a,#3,sofsampleisr 0818 90 7F A0 1858 mov dptr,#ISOERR 081B E0 1859 movx a,@dptr 081C 20 E0 23 1860 jb acc.0,3$ 081F 90 7F 70 1861 mov dptr,#OUT8BCH 0822 E0 1862 movx a,@dptr 0823 70 1D 1863 jnz 3$ 0825 90 7F 71 1864 mov dptr,#OUT8BCL 0828 E0 1865 movx a,@dptr 0829 B4 03 16 1866 cjne a,#3,3$ 082C FA 1867 mov r2,a 082D 90 7F 60 1868 mov dptr,#OUT8DATA 0830 05 86 1869 inc dps 0832 90 7F 68 1870 mov dptr,#IN8DATA 0835 15 86 1871 dec dps 0837 E0 1872 2$: movx a,@dptr 0838 05 86 1873 inc dps 083A F0 1874 movx @dptr,a 083B 15 86 1875 dec dps 083D DA F8 1876 djnz r2,2$ 083F 02 09 05 1877 ljmp sofendisr 0842 7A 03 1878 3$: mov r2,#3 0844 90 7F 68 1879 mov dptr,#IN8DATA 0847 E4 1880 clr a 0848 F0 1881 4$: movx @dptr,a 0849 DA FD 1882 djnz r2,4$ 084B 02 09 05 1883 ljmp sofendisr 084E 1884 sofsampleisr: 084E 90 C0 01 1885 mov dptr,#AUDIORXFIFOCNT 0851 E0 1886 movx a,@dptr 0852 C3 1887 clr c 0853 95 49 1888 subb a,framesize 0855 E0 1889 movx a,@dptr 0856 40 02 1890 jc 1$ 0858 E5 49 1891 mov a,framesize 085A FA 1892 1$: mov r2,a 085B FB 1893 mov r3,a 085C 60 12 1894 jz 2$ 085E 90 C0 00 1895 mov dptr,#AUDIORXFIFO 0861 05 86 1896 inc dps 0863 90 7F 68 1897 mov dptr,#IN8DATA 0866 15 86 1898 dec dps 0868 E0 1899 3$: movx a,@dptr 0869 05 86 1900 inc dps 086B F0 1901 movx @dptr,a 086C 15 86 1902 dec dps 086E DA F8 1903 djnz r2,3$ 0870 E5 49 1904 2$: mov a,framesize 0872 C3 1905 clr c 0873 9B 1906 subb a,r3 0874 60 08 1907 jz 4$ 0876 FA 1908 mov r2,a 0877 90 7F 68 1909 mov dptr,#IN8DATA 087A E4 1910 clr a 087B F0 1911 5$: movx @dptr,a 087C DA FD 1912 djnz r2,5$ 1913 ;; sample rate adjustment 087E 90 C0 01 1914 4$: mov dptr,#AUDIORXFIFOCNT 0881 E0 1915 movx a,@dptr 0882 F5 4A 1916 mov pllcorrvar,a 0884 24 FC 1917 add a,#-4 0886 60 05 1918 jz 10$ ; no adjustment 0888 33 1919 rlc a 0889 95 E0 1920 subb a,acc 088B D2 E0 1921 setb acc.0 088D FB 1922 10$: mov r3,a ; r3 & acc contain the adjust value 088E 25 48 1923 add a,divrel 1924 ;; zero is the guard value 0890 60 02 1925 jz 11$ 0892 F5 48 1926 mov divrel,a 0894 E5 48 1927 11$: mov a,divrel 0896 03 1928 rr a 0897 03 1929 rr a 0898 03 1930 rr a 0899 03 1931 rr a 089A 54 0F 1932 anl a,#0xf 089C 2B 1933 add a,r3 ; momentary correction 089D 25 46 1934 add a,divider 089F FA 1935 mov r2,a 08A0 E5 47 1936 mov a,divider+1 08A2 34 00 1937 addc a,#0 08A4 90 C0 02 1938 mov dptr,#AUDIODIVIDERHI 08A7 F0 1939 movx @dptr,a 08A8 EA 1940 mov a,r2 08A9 90 C0 01 1941 mov dptr,#AUDIODIVIDERLO 08AC F0 1942 movx @dptr,a 1943 ;; OUT data 08AD 90 7F A0 1944 mov dptr,#ISOERR 08B0 E0 1945 movx a,@dptr 08B1 20 E0 39 1946 jb acc.0,20$ 08B4 90 7F 70 1947 mov dptr,#OUT8BCH 08B7 E0 1948 movx a,@dptr 08B8 70 33 1949 jnz 20$ 08BA 90 7F 71 1950 mov dptr,#OUT8BCL 08BD E0 1951 movx a,@dptr 08BE C3 1952 clr c 08BF 95 49 1953 subb a,framesize 08C1 70 2A 1954 jnz 20$ 08C3 90 C0 02 1955 mov dptr,#AUDIOTXFIFOCNT 08C6 E0 1956 movx a,@dptr 08C7 F5 4B 1957 mov txfifocount,a 08C9 C3 1958 clr c 08CA 95 49 1959 subb a,framesize 08CC E5 4B 1960 mov a,txfifocount 08CE 40 02 1961 jc 14$ 08D0 E5 49 1962 mov a,framesize 08D2 60 17 1963 14$: jz 13$ 08D4 FA 1964 mov r2,a 08D5 90 7F 60 1965 mov dptr,#OUT8DATA 08D8 05 86 1966 inc dps 08DA 90 C0 00 1967 mov dptr,#AUDIOTXFIFO 08DD 15 86 1968 dec dps 08DF 78 80 1969 mov r0,#txsamples 08E1 E0 1970 12$: movx a,@dptr 08E2 05 86 1971 inc dps 08E4 F0 1972 movx @dptr,a 08E5 15 86 1973 dec dps 08E7 F6 1974 mov @r0,a 08E8 08 1975 inc r0 08E9 DA F6 1976 djnz r2,12$ 08EB 80 18 1977 13$: sjmp sofendisr 1978 ;; initialize TX if invalid packet 08ED 90 C0 02 1979 20$: mov dptr,#AUDIOTXFIFOCNT 08F0 E0 1980 movx a,@dptr 08F1 F5 4B 1981 mov txfifocount,a 08F3 24 FC 1982 add a,#-4 08F5 54 3F 1983 anl a,#0x3f 08F7 60 0C 1984 jz sofendisr 08F9 FA 1985 mov r2,a 08FA 90 C0 00 1986 mov dptr,#AUDIOTXFIFO 08FD E4 1987 clr a 08FE 78 80 1988 mov r0,#txsamples 0900 F0 1989 21$: movx @dptr,a 0901 F6 1990 mov @r0,a 0902 08 1991 inc r0 0903 DA FB 1992 djnz r2,21$ 1993 0905 1994 sofendisr: 1995 ;; epilogue 0905 D0 00 1996 pop ar0 0907 D0 03 1997 pop ar3 0909 D0 02 1998 pop ar2 090B D0 86 1999 pop dps 090D D0 D0 2000 pop psw 090F D0 85 2001 pop dph1 0911 D0 84 2002 pop dpl1 0913 D0 83 2003 pop dph0 0915 D0 82 2004 pop dpl0 0917 D0 F0 2005 pop b 0919 D0 E0 2006 pop acc 091B 32 2007 reti 2008 2009 091C 2010 usb_sutok_isr: 091C C0 E0 2011 push acc 091E C0 F0 2012 push b 0920 C0 82 2013 push dpl0 0922 C0 83 2014 push dph0 0924 C0 D0 2015 push psw 0926 75 D0 00 2016 mov psw,#0x00 0929 C0 86 2017 push dps 092B 75 86 00 2018 mov dps,#0 2019 ;; clear interrupt 092E E5 91 2020 mov a,exif 0930 C2 E4 2021 clr acc.4 0932 F5 91 2022 mov exif,a 0934 90 7F AB 2023 mov dptr,#USBIRQ 0937 74 04 2024 mov a,#0x04 0939 F0 2025 movx @dptr,a 2026 ;; handle interrupt 2027 ;; epilogue 093A D0 86 2028 pop dps 093C D0 D0 2029 pop psw 093E D0 83 2030 pop dph0 0940 D0 82 2031 pop dpl0 0942 D0 F0 2032 pop b 0944 D0 E0 2033 pop acc 0946 32 2034 reti 2035 0947 2036 usb_suspend_isr: 0947 C0 E0 2037 push acc 0949 C0 F0 2038 push b 094B C0 82 2039 push dpl0 094D C0 83 2040 push dph0 094F C0 D0 2041 push psw 0951 75 D0 00 2042 mov psw,#0x00 0954 C0 86 2043 push dps 0956 75 86 00 2044 mov dps,#0 2045 ;; clear interrupt 0959 E5 91 2046 mov a,exif 095B C2 E4 2047 clr acc.4 095D F5 91 2048 mov exif,a 095F 90 7F AB 2049 mov dptr,#USBIRQ 0962 74 08 2050 mov a,#0x08 0964 F0 2051 movx @dptr,a 2052 ;; handle interrupt 2053 ;; epilogue 0965 D0 86 2054 pop dps 0967 D0 D0 2055 pop psw 0969 D0 83 2056 pop dph0 096B D0 82 2057 pop dpl0 096D D0 F0 2058 pop b 096F D0 E0 2059 pop acc 0971 32 2060 reti 2061 0972 2062 usb_usbreset_isr: 0972 C0 E0 2063 push acc 0974 C0 F0 2064 push b 0976 C0 82 2065 push dpl0 0978 C0 83 2066 push dph0 097A C0 D0 2067 push psw 097C 75 D0 00 2068 mov psw,#0x00 097F C0 86 2069 push dps 0981 75 86 00 2070 mov dps,#0 2071 ;; clear interrupt 0984 E5 91 2072 mov a,exif 0986 C2 E4 2073 clr acc.4 0988 F5 91 2074 mov exif,a 098A 90 7F AB 2075 mov dptr,#USBIRQ 098D 74 10 2076 mov a,#0x10 098F F0 2077 movx @dptr,a 2078 ;; handle interrupt 2079 ;; epilogue 0990 D0 86 2080 pop dps 0992 D0 D0 2081 pop psw 0994 D0 83 2082 pop dph0 0996 D0 82 2083 pop dpl0 0998 D0 F0 2084 pop b 099A D0 E0 2085 pop acc 099C 32 2086 reti 2087 099D 2088 usb_ep0in_isr: 099D C0 E0 2089 push acc 099F C0 F0 2090 push b 09A1 C0 82 2091 push dpl0 09A3 C0 83 2092 push dph0 09A5 C0 84 2093 push dpl1 09A7 C0 85 2094 push dph1 09A9 C0 D0 2095 push psw 09AB 75 D0 00 2096 mov psw,#0x00 09AE C0 86 2097 push dps 09B0 75 86 00 2098 mov dps,#0 09B3 C0 00 2099 push ar0 09B5 C0 07 2100 push ar7 2101 ;; clear interrupt 09B7 E5 91 2102 mov a,exif 09B9 C2 E4 2103 clr acc.4 09BB F5 91 2104 mov exif,a 09BD 90 7F A9 2105 mov dptr,#IN07IRQ 09C0 74 01 2106 mov a,#0x01 09C2 F0 2107 movx @dptr,a 2108 ;; handle interrupt 2109 ;; epilogue 09C3 D0 07 2110 pop ar7 09C5 D0 00 2111 pop ar0 09C7 D0 86 2112 pop dps 09C9 D0 D0 2113 pop psw 09CB D0 85 2114 pop dph1 09CD D0 84 2115 pop dpl1 09CF D0 83 2116 pop dph0 09D1 D0 82 2117 pop dpl0 09D3 D0 F0 2118 pop b 09D5 D0 E0 2119 pop acc 09D7 32 2120 reti 2121 09D8 2122 usb_ep0out_isr: 09D8 C0 E0 2123 push acc 09DA C0 F0 2124 push b 09DC C0 82 2125 push dpl0 09DE C0 83 2126 push dph0 09E0 C0 84 2127 push dpl1 09E2 C0 85 2128 push dph1 09E4 C0 D0 2129 push psw 09E6 75 D0 00 2130 mov psw,#0x00 09E9 C0 86 2131 push dps 09EB 75 86 00 2132 mov dps,#0 09EE C0 00 2133 push ar0 09F0 C0 06 2134 push ar6 2135 ;; clear interrupt 09F2 E5 91 2136 mov a,exif 09F4 C2 E4 2137 clr acc.4 09F6 F5 91 2138 mov exif,a 09F8 90 7F AA 2139 mov dptr,#OUT07IRQ 09FB 74 01 2140 mov a,#0x01 09FD F0 2141 movx @dptr,a 2142 ;; handle interrupt 2143 ;; epilogue 09FE D0 06 2144 pop ar6 0A00 D0 00 2145 pop ar0 0A02 D0 86 2146 pop dps 0A04 D0 D0 2147 pop psw 0A06 D0 85 2148 pop dph1 0A08 D0 84 2149 pop dpl1 0A0A D0 83 2150 pop dph0 0A0C D0 82 2151 pop dpl0 0A0E D0 F0 2152 pop b 0A10 D0 E0 2153 pop acc 0A12 32 2154 reti 2155 0A13 2156 fillusbintr:: 0A13 E5 4C 2157 mov a,pttforce 0A15 F5 F0 2158 mov b,a 0A17 A2 E0 2159 mov c,acc.0 0A19 92 F2 2160 mov b.2,c 0A1B 90 C0 09 2161 mov dptr,#AUDIOSTAT 0A1E E0 2162 movx a,@dptr 0A1F A2 E0 2163 mov c,acc.0 0A21 92 F3 2164 mov b.3,c 0A23 A2 09 2165 mov c,uartempty 0A25 92 F5 2166 mov b.5,c 2167 ;; bytewide elements 0A27 90 7E 80 2168 mov dptr,#(IN1BUF) 0A2A E5 F0 2169 mov a,b 0A2C F0 2170 movx @dptr,a 0A2D E5 45 2171 mov a,sofcount 0A2F 90 7E 81 2172 mov dptr,#(IN1BUF+1) 0A32 F0 2173 movx @dptr,a 0A33 90 7F E0 2174 mov dptr,#INISOVAL 0A36 E0 2175 movx a,@dptr 0A37 90 7E 82 2176 mov dptr,#(IN1BUF+2) 0A3A F0 2177 movx @dptr,a 0A3B 90 C0 04 2178 mov dptr,#AUDIORSSI 0A3E E0 2179 movx a,@dptr 0A3F 90 7E 83 2180 mov dptr,#(IN1BUF+3) 0A42 F0 2181 movx @dptr,a 2182 ; counter 0A43 05 44 2183 inc irqcount 0A45 E5 44 2184 mov a,irqcount 0A47 90 7E 84 2185 mov dptr,#(IN1BUF+4) 0A4A F0 2186 movx @dptr,a 2187 ; UART buffer 0A4B 75 F0 05 2188 mov b,#5 0A4E 90 7E 85 2189 mov dptr,#(IN1BUF+5) 0A51 E5 5E 2190 2$: mov a,uartrd 0A53 B5 5D 07 2191 cjne a,uartwr,3$ 2192 ; set length 0A56 90 7F B7 2193 mov dptr,#IN1BC 0A59 E5 F0 2194 mov a,b 0A5B F0 2195 movx @dptr,a 0A5C 22 2196 ret 2197 0A5D 24 4D 2198 3$: add a,#uartbuf 0A5F F8 2199 mov r0,a 0A60 E6 2200 mov a,@r0 0A61 F0 2201 movx @dptr,a 0A62 A3 2202 inc dptr 0A63 05 F0 2203 inc b 0A65 E5 5E 2204 mov a,uartrd 0A67 04 2205 inc a 0A68 54 0F 2206 anl a,#0xf 0A6A F5 5E 2207 mov uartrd,a 0A6C 80 E3 2208 sjmp 2$ 2209 2210 0A6E 2211 usb_ep1in_isr: 0A6E C0 E0 2212 push acc 0A70 C0 F0 2213 push b 0A72 C0 82 2214 push dpl0 0A74 C0 83 2215 push dph0 0A76 C0 D0 2216 push psw 0A78 75 D0 00 2217 mov psw,#0x00 0A7B C0 86 2218 push dps 0A7D 75 86 00 2219 mov dps,#0 2220 ;; clear interrupt 0A80 E5 91 2221 mov a,exif 0A82 C2 E4 2222 clr acc.4 0A84 F5 91 2223 mov exif,a 0A86 90 7F A9 2224 mov dptr,#IN07IRQ 0A89 74 02 2225 mov a,#0x02 0A8B F0 2226 movx @dptr,a 2227 ;; handle interrupt 0A8C 12 0A 13 2228 lcall fillusbintr 2229 ;; epilogue 0A8F D0 86 2230 pop dps 0A91 D0 D0 2231 pop psw 0A93 D0 83 2232 pop dph0 0A95 D0 82 2233 pop dpl0 0A97 D0 F0 2234 pop b 0A99 D0 E0 2235 pop acc 0A9B 32 2236 reti 2237 0A9C 2238 usb_ep1out_isr: 0A9C C0 E0 2239 push acc 0A9E C0 F0 2240 push b 0AA0 C0 82 2241 push dpl0 0AA2 C0 83 2242 push dph0 0AA4 C0 D0 2243 push psw 0AA6 75 D0 00 2244 mov psw,#0x00 0AA9 C0 86 2245 push dps 0AAB 75 86 00 2246 mov dps,#0 2247 ;; clear interrupt 0AAE E5 91 2248 mov a,exif 0AB0 C2 E4 2249 clr acc.4 0AB2 F5 91 2250 mov exif,a 0AB4 90 7F AA 2251 mov dptr,#OUT07IRQ 0AB7 74 02 2252 mov a,#0x02 0AB9 F0 2253 movx @dptr,a 2254 ;; handle interrupt 2255 ;; epilogue 0ABA D0 86 2256 pop dps 0ABC D0 D0 2257 pop psw 0ABE D0 83 2258 pop dph0 0AC0 D0 82 2259 pop dpl0 0AC2 D0 F0 2260 pop b 0AC4 D0 E0 2261 pop acc 0AC6 32 2262 reti 2263 0AC7 2264 usb_ep2in_isr: 0AC7 C0 E0 2265 push acc 0AC9 C0 F0 2266 push b 0ACB C0 82 2267 push dpl0 0ACD C0 83 2268 push dph0 0ACF C0 D0 2269 push psw 0AD1 75 D0 00 2270 mov psw,#0x00 0AD4 C0 86 2271 push dps 0AD6 75 86 00 2272 mov dps,#0 2273 ;; clear interrupt 0AD9 E5 91 2274 mov a,exif 0ADB C2 E4 2275 clr acc.4 0ADD F5 91 2276 mov exif,a 0ADF 90 7F A9 2277 mov dptr,#IN07IRQ 0AE2 74 04 2278 mov a,#0x04 0AE4 F0 2279 movx @dptr,a 2280 ;; handle interrupt 2281 ;; epilogue 0AE5 D0 86 2282 pop dps 0AE7 D0 D0 2283 pop psw 0AE9 D0 83 2284 pop dph0 0AEB D0 82 2285 pop dpl0 0AED D0 F0 2286 pop b 0AEF D0 E0 2287 pop acc 0AF1 32 2288 reti 2289 0AF2 2290 usb_ep2out_isr: 0AF2 C0 E0 2291 push acc 0AF4 C0 F0 2292 push b 0AF6 C0 82 2293 push dpl0 0AF8 C0 83 2294 push dph0 0AFA C0 D0 2295 push psw 0AFC 75 D0 00 2296 mov psw,#0x00 0AFF C0 86 2297 push dps 0B01 75 86 00 2298 mov dps,#0 2299 ;; clear interrupt 0B04 E5 91 2300 mov a,exif 0B06 C2 E4 2301 clr acc.4 0B08 F5 91 2302 mov exif,a 0B0A 90 7F AA 2303 mov dptr,#OUT07IRQ 0B0D 74 04 2304 mov a,#0x04 0B0F F0 2305 movx @dptr,a 2306 ;; handle interrupt 2307 ;; epilogue 0B10 D0 86 2308 pop dps 0B12 D0 D0 2309 pop psw 0B14 D0 83 2310 pop dph0 0B16 D0 82 2311 pop dpl0 0B18 D0 F0 2312 pop b 0B1A D0 E0 2313 pop acc 0B1C 32 2314 reti 2315 0B1D 2316 usb_ep3in_isr: 0B1D C0 E0 2317 push acc 0B1F C0 F0 2318 push b 0B21 C0 82 2319 push dpl0 0B23 C0 83 2320 push dph0 0B25 C0 D0 2321 push psw 0B27 75 D0 00 2322 mov psw,#0x00 0B2A C0 86 2323 push dps 0B2C 75 86 00 2324 mov dps,#0 2325 ;; clear interrupt 0B2F E5 91 2326 mov a,exif 0B31 C2 E4 2327 clr acc.4 0B33 F5 91 2328 mov exif,a 0B35 90 7F A9 2329 mov dptr,#IN07IRQ 0B38 74 08 2330 mov a,#0x08 0B3A F0 2331 movx @dptr,a 2332 ;; handle interrupt 2333 ;; epilogue 0B3B D0 86 2334 pop dps 0B3D D0 D0 2335 pop psw 0B3F D0 83 2336 pop dph0 0B41 D0 82 2337 pop dpl0 0B43 D0 F0 2338 pop b 0B45 D0 E0 2339 pop acc 0B47 32 2340 reti 2341 0B48 2342 usb_ep3out_isr: 0B48 C0 E0 2343 push acc 0B4A C0 F0 2344 push b 0B4C C0 82 2345 push dpl0 0B4E C0 83 2346 push dph0 0B50 C0 D0 2347 push psw 0B52 75 D0 00 2348 mov psw,#0x00 0B55 C0 86 2349 push dps 0B57 75 86 00 2350 mov dps,#0 2351 ;; clear interrupt 0B5A E5 91 2352 mov a,exif 0B5C C2 E4 2353 clr acc.4 0B5E F5 91 2354 mov exif,a 0B60 90 7F AA 2355 mov dptr,#OUT07IRQ 0B63 74 08 2356 mov a,#0x08 0B65 F0 2357 movx @dptr,a 2358 ;; handle interrupt 2359 ;; epilogue 0B66 D0 86 2360 pop dps 0B68 D0 D0 2361 pop psw 0B6A D0 83 2362 pop dph0 0B6C D0 82 2363 pop dpl0 0B6E D0 F0 2364 pop b 0B70 D0 E0 2365 pop acc 0B72 32 2366 reti 2367 0B73 2368 usb_ep4in_isr: 0B73 C0 E0 2369 push acc 0B75 C0 F0 2370 push b 0B77 C0 82 2371 push dpl0 0B79 C0 83 2372 push dph0 0B7B C0 D0 2373 push psw 0B7D 75 D0 00 2374 mov psw,#0x00 0B80 C0 86 2375 push dps 0B82 75 86 00 2376 mov dps,#0 2377 ;; clear interrupt 0B85 E5 91 2378 mov a,exif 0B87 C2 E4 2379 clr acc.4 0B89 F5 91 2380 mov exif,a 0B8B 90 7F A9 2381 mov dptr,#IN07IRQ 0B8E 74 10 2382 mov a,#0x10 0B90 F0 2383 movx @dptr,a 2384 ;; handle interrupt 2385 ;; epilogue 0B91 D0 86 2386 pop dps 0B93 D0 D0 2387 pop psw 0B95 D0 83 2388 pop dph0 0B97 D0 82 2389 pop dpl0 0B99 D0 F0 2390 pop b 0B9B D0 E0 2391 pop acc 0B9D 32 2392 reti 2393 0B9E 2394 usb_ep4out_isr: 0B9E C0 E0 2395 push acc 0BA0 C0 F0 2396 push b 0BA2 C0 82 2397 push dpl0 0BA4 C0 83 2398 push dph0 0BA6 C0 D0 2399 push psw 0BA8 75 D0 00 2400 mov psw,#0x00 0BAB C0 86 2401 push dps 0BAD 75 86 00 2402 mov dps,#0 2403 ;; clear interrupt 0BB0 E5 91 2404 mov a,exif 0BB2 C2 E4 2405 clr acc.4 0BB4 F5 91 2406 mov exif,a 0BB6 90 7F AA 2407 mov dptr,#OUT07IRQ 0BB9 74 10 2408 mov a,#0x10 0BBB F0 2409 movx @dptr,a 2410 ;; handle interrupt 2411 ;; epilogue 0BBC D0 86 2412 pop dps 0BBE D0 D0 2413 pop psw 0BC0 D0 83 2414 pop dph0 0BC2 D0 82 2415 pop dpl0 0BC4 D0 F0 2416 pop b 0BC6 D0 E0 2417 pop acc 0BC8 32 2418 reti 2419 0BC9 2420 usb_ep5in_isr: 0BC9 C0 E0 2421 push acc 0BCB C0 F0 2422 push b 0BCD C0 82 2423 push dpl0 0BCF C0 83 2424 push dph0 0BD1 C0 D0 2425 push psw 0BD3 75 D0 00 2426 mov psw,#0x00 0BD6 C0 86 2427 push dps 0BD8 75 86 00 2428 mov dps,#0 2429 ;; clear interrupt 0BDB E5 91 2430 mov a,exif 0BDD C2 E4 2431 clr acc.4 0BDF F5 91 2432 mov exif,a 0BE1 90 7F A9 2433 mov dptr,#IN07IRQ 0BE4 74 20 2434 mov a,#0x20 0BE6 F0 2435 movx @dptr,a 2436 ;; handle interrupt 2437 ;; epilogue 0BE7 D0 86 2438 pop dps 0BE9 D0 D0 2439 pop psw 0BEB D0 83 2440 pop dph0 0BED D0 82 2441 pop dpl0 0BEF D0 F0 2442 pop b 0BF1 D0 E0 2443 pop acc 0BF3 32 2444 reti 2445 0BF4 2446 usb_ep5out_isr: 0BF4 C0 E0 2447 push acc 0BF6 C0 F0 2448 push b 0BF8 C0 82 2449 push dpl0 0BFA C0 83 2450 push dph0 0BFC C0 D0 2451 push psw 0BFE 75 D0 00 2452 mov psw,#0x00 0C01 C0 86 2453 push dps 0C03 75 86 00 2454 mov dps,#0 2455 ;; clear interrupt 0C06 E5 91 2456 mov a,exif 0C08 C2 E4 2457 clr acc.4 0C0A F5 91 2458 mov exif,a 0C0C 90 7F AA 2459 mov dptr,#OUT07IRQ 0C0F 74 20 2460 mov a,#0x20 0C11 F0 2461 movx @dptr,a 2462 ;; handle interrupt 2463 ;; epilogue 0C12 D0 86 2464 pop dps 0C14 D0 D0 2465 pop psw 0C16 D0 83 2466 pop dph0 0C18 D0 82 2467 pop dpl0 0C1A D0 F0 2468 pop b 0C1C D0 E0 2469 pop acc 0C1E 32 2470 reti 2471 0C1F 2472 usb_ep6in_isr: 0C1F C0 E0 2473 push acc 0C21 C0 F0 2474 push b 0C23 C0 82 2475 push dpl0 0C25 C0 83 2476 push dph0 0C27 C0 D0 2477 push psw 0C29 75 D0 00 2478 mov psw,#0x00 0C2C C0 86 2479 push dps 0C2E 75 86 00 2480 mov dps,#0 2481 ;; clear interrupt 0C31 E5 91 2482 mov a,exif 0C33 C2 E4 2483 clr acc.4 0C35 F5 91 2484 mov exif,a 0C37 90 7F A9 2485 mov dptr,#IN07IRQ 0C3A 74 40 2486 mov a,#0x40 0C3C F0 2487 movx @dptr,a 2488 ;; handle interrupt 2489 ;; epilogue 0C3D D0 86 2490 pop dps 0C3F D0 D0 2491 pop psw 0C41 D0 83 2492 pop dph0 0C43 D0 82 2493 pop dpl0 0C45 D0 F0 2494 pop b 0C47 D0 E0 2495 pop acc 0C49 32 2496 reti 2497 0C4A 2498 usb_ep6out_isr: 0C4A C0 E0 2499 push acc 0C4C C0 F0 2500 push b 0C4E C0 82 2501 push dpl0 0C50 C0 83 2502 push dph0 0C52 C0 D0 2503 push psw 0C54 75 D0 00 2504 mov psw,#0x00 0C57 C0 86 2505 push dps 0C59 75 86 00 2506 mov dps,#0 2507 ;; clear interrupt 0C5C E5 91 2508 mov a,exif 0C5E C2 E4 2509 clr acc.4 0C60 F5 91 2510 mov exif,a 0C62 90 7F AA 2511 mov dptr,#OUT07IRQ 0C65 74 40 2512 mov a,#0x40 0C67 F0 2513 movx @dptr,a 2514 ;; handle interrupt 2515 ;; epilogue 0C68 D0 86 2516 pop dps 0C6A D0 D0 2517 pop psw 0C6C D0 83 2518 pop dph0 0C6E D0 82 2519 pop dpl0 0C70 D0 F0 2520 pop b 0C72 D0 E0 2521 pop acc 0C74 32 2522 reti 2523 0C75 2524 usb_ep7in_isr: 0C75 C0 E0 2525 push acc 0C77 C0 F0 2526 push b 0C79 C0 82 2527 push dpl0 0C7B C0 83 2528 push dph0 0C7D C0 D0 2529 push psw 0C7F 75 D0 00 2530 mov psw,#0x00 0C82 C0 86 2531 push dps 0C84 75 86 00 2532 mov dps,#0 2533 ;; clear interrupt 0C87 E5 91 2534 mov a,exif 0C89 C2 E4 2535 clr acc.4 0C8B F5 91 2536 mov exif,a 0C8D 90 7F A9 2537 mov dptr,#IN07IRQ 0C90 74 80 2538 mov a,#0x80 0C92 F0 2539 movx @dptr,a 2540 ;; handle interrupt 2541 ;; epilogue 0C93 D0 86 2542 pop dps 0C95 D0 D0 2543 pop psw 0C97 D0 83 2544 pop dph0 0C99 D0 82 2545 pop dpl0 0C9B D0 F0 2546 pop b 0C9D D0 E0 2547 pop acc 0C9F 32 2548 reti 2549 0CA0 2550 usb_ep7out_isr: 0CA0 C0 E0 2551 push acc 0CA2 C0 F0 2552 push b 0CA4 C0 82 2553 push dpl0 0CA6 C0 83 2554 push dph0 0CA8 C0 D0 2555 push psw 0CAA 75 D0 00 2556 mov psw,#0x00 0CAD C0 86 2557 push dps 0CAF 75 86 00 2558 mov dps,#0 2559 ;; clear interrupt 0CB2 E5 91 2560 mov a,exif 0CB4 C2 E4 2561 clr acc.4 0CB6 F5 91 2562 mov exif,a 0CB8 90 7F AA 2563 mov dptr,#OUT07IRQ 0CBB 74 80 2564 mov a,#0x80 0CBD F0 2565 movx @dptr,a 2566 ;; handle interrupt 2567 ;; epilogue 0CBE D0 86 2568 pop dps 0CC0 D0 D0 2569 pop psw 0CC2 D0 83 2570 pop dph0 0CC4 D0 82 2571 pop dpl0 0CC6 D0 F0 2572 pop b 0CC8 D0 E0 2573 pop acc 0CCA 32 2574 reti 2575 2576 ;; ----------------------------------------------------- 2577 ;; USB descriptors 2578 ;; ----------------------------------------------------- 2579 2580 ;; Device and/or Interface Class codes 0000 2581 USB_CLASS_PER_INTERFACE = 0 0001 2582 USB_CLASS_AUDIO = 1 0002 2583 USB_CLASS_COMM = 2 0003 2584 USB_CLASS_HID = 3 0007 2585 USB_CLASS_PRINTER = 7 0008 2586 USB_CLASS_MASS_STORAGE = 8 0009 2587 USB_CLASS_HUB = 9 00FF 2588 USB_CLASS_VENDOR_SPEC = 0xff 2589 0001 2590 USB_SUBCLASS_AUDIOCONTROL = 1 0002 2591 USB_SUBCLASS_AUDIOSTREAMING = 2 2592 2593 ;; Descriptor types 0001 2594 USB_DT_DEVICE = 0x01 0002 2595 USB_DT_CONFIG = 0x02 0003 2596 USB_DT_STRING = 0x03 0004 2597 USB_DT_INTERFACE = 0x04 0005 2598 USB_DT_ENDPOINT = 0x05 2599 2600 ;; Audio Class descriptor types 0020 2601 USB_DT_AUDIO_UNDEFINED = 0x20 0021 2602 USB_DT_AUDIO_DEVICE = 0x21 0022 2603 USB_DT_AUDIO_CONFIG = 0x22 0023 2604 USB_DT_AUDIO_STRING = 0x23 0024 2605 USB_DT_AUDIO_INTERFACE = 0x24 0025 2606 USB_DT_AUDIO_ENDPOINT = 0x25 2607 0000 2608 USB_SDT_AUDIO_UNDEFINED = 0x00 0001 2609 USB_SDT_AUDIO_HEADER = 0x01 0002 2610 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 0003 2611 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 0004 2612 USB_SDT_AUDIO_MIXER_UNIT = 0x04 0005 2613 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 0006 2614 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 0007 2615 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 0008 2616 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 2617 2618 ;; Standard requests 0000 2619 USB_REQ_GET_STATUS = 0x00 0001 2620 USB_REQ_CLEAR_FEATURE = 0x01 0003 2621 USB_REQ_SET_FEATURE = 0x03 0005 2622 USB_REQ_SET_ADDRESS = 0x05 0006 2623 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2624 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2625 USB_REQ_GET_CONFIGURATION = 0x08 0009 2626 USB_REQ_SET_CONFIGURATION = 0x09 000A 2627 USB_REQ_GET_INTERFACE = 0x0A 000B 2628 USB_REQ_SET_INTERFACE = 0x0B 000C 2629 USB_REQ_SYNCH_FRAME = 0x0C 2630 2631 ;; Audio Class Requests 0001 2632 USB_REQ_AUDIO_SET_CUR = 0x01 0081 2633 USB_REQ_AUDIO_GET_CUR = 0x81 0002 2634 USB_REQ_AUDIO_SET_MIN = 0x02 0082 2635 USB_REQ_AUDIO_GET_MIN = 0x82 0003 2636 USB_REQ_AUDIO_SET_MAX = 0x03 0083 2637 USB_REQ_AUDIO_GET_MAX = 0x83 0004 2638 USB_REQ_AUDIO_SET_RES = 0x04 0084 2639 USB_REQ_AUDIO_GET_RES = 0x84 0005 2640 USB_REQ_AUDIO_SET_MEM = 0x05 0085 2641 USB_REQ_AUDIO_GET_MEM = 0x85 00FF 2642 USB_REQ_AUDIO_GET_STAT = 0xff 2643 2644 ;; USB Request Type and Endpoint Directions 0000 2645 USB_DIR_OUT = 0 0080 2646 USB_DIR_IN = 0x80 2647 0000 2648 USB_TYPE_STANDARD = (0x00 << 5) 0020 2649 USB_TYPE_CLASS = (0x01 << 5) 0040 2650 USB_TYPE_VENDOR = (0x02 << 5) 0060 2651 USB_TYPE_RESERVED = (0x03 << 5) 2652 0000 2653 USB_RECIP_DEVICE = 0x00 0001 2654 USB_RECIP_INTERFACE = 0x01 0002 2655 USB_RECIP_ENDPOINT = 0x02 0003 2656 USB_RECIP_OTHER = 0x03 2657 2658 ;; Request target types. 0000 2659 USB_RT_DEVICE = 0x00 0001 2660 USB_RT_INTERFACE = 0x01 0002 2661 USB_RT_ENDPOINT = 0x02 2662 BAC0 2663 VENDID = 0xbac0 6137 2664 PRODID = 0x6137 2665 0CCB 2666 devicedescr: 0CCB 12 2667 .db 18 ; bLength 0CCC 01 2668 .db USB_DT_DEVICE ; bDescriptorType 0CCD 00 01 2669 .db 0x00, 0x01 ; bcdUSB 0CCF FF 2670 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 0CD0 00 2671 .db 0 ; bDeviceSubClass 0CD1 FF 2672 .db 0xff ; bDeviceProtocol 0CD2 40 2673 .db 0x40 ; bMaxPacketSize0 0CD3 C0 BA 2674 .db VENDID ; idVendor 0CD5 37 61 2675 .db PRODID ; idProduct 0CD7 01 00 2676 .db 0x01,0x00 ; bcdDevice 0CD9 01 2677 .db 1 ; iManufacturer 0CDA 02 2678 .db 2 ; iProduct 0CDB 03 2679 .db 3 ; iSerialNumber 0CDC 01 2680 .db 1 ; bNumConfigurations 2681 0CDD 2682 config0descr: 0CDD 09 2683 .db 9 ; bLength 0CDE 02 2684 .db USB_DT_CONFIG ; bDescriptorType 0CDF 3B 00 2685 .db config0sz ; wTotalLength 0CE1 01 2686 .db 1 ; bNumInterfaces 0CE2 01 2687 .db 1 ; bConfigurationValue 0CE3 00 2688 .db 0 ; iConfiguration 0CE4 40 2689 .db 0b01000000 ; bmAttributs (self powered) 0CE5 00 2690 .db 0 ; MaxPower (mA/2) (self powered so 0) 2691 ;; standard packet interface (needed so the driver can hook to it) 2692 ;; interface descriptor I0:A0 0CE6 09 2693 .db 9 ; bLength 0CE7 04 2694 .db USB_DT_INTERFACE ; bDescriptorType 0CE8 00 2695 .db 0 ; bInterfaceNumber 0CE9 00 2696 .db 0 ; bAlternateSetting 0CEA 01 2697 .db 1 ; bNumEndpoints 0CEB FF 2698 .db 0xff ; bInterfaceClass (vendor specific) 0CEC 00 2699 .db 0x00 ; bInterfaceSubClass 0CED FF 2700 .db 0xff ; bInterfaceProtocol (vendor specific) 0CEE 00 2701 .db 0 ; iInterface 2702 ;; endpoint descriptor I0:A0:E0 0CEF 07 2703 .db 7 ; bLength 0CF0 05 2704 .db USB_DT_ENDPOINT ; bDescriptorType 0CF1 81 2705 .db (USB_DIR_IN | 1) ; bEndpointAddress 0CF2 02 2706 .db 0x02 ; bmAttributes (bulk) 0CF3 40 00 2707 .db 0x40,0x00 ; wMaxPacketSize 0CF5 00 2708 .db 0 ; bInterval 2709 ;; interface descriptor I0:A1 0CF6 09 2710 .db 9 ; bLength 0CF7 04 2711 .db USB_DT_INTERFACE ; bDescriptorType 0CF8 00 2712 .db 0 ; bInterfaceNumber 0CF9 01 2713 .db 1 ; bAlternateSetting 0CFA 03 2714 .db 3 ; bNumEndpoints 0CFB FF 2715 .db 0xff ; bInterfaceClass (vendor specific) 0CFC 00 2716 .db 0x00 ; bInterfaceSubClass 0CFD FF 2717 .db 0xff ; bInterfaceProtocol (vendor specific) 0CFE 00 2718 .db 0 ; iInterface 2719 ;; endpoint descriptor I0:A1:E0 0CFF 07 2720 .db 7 ; bLength 0D00 05 2721 .db USB_DT_ENDPOINT ; bDescriptorType 0D01 81 2722 .db (USB_DIR_IN | 1) ; bEndpointAddress 0D02 03 2723 .db 0x03 ; bmAttributes (interrupt) 0D03 40 00 2724 .db 0x40,0x00 ; wMaxPacketSize 0D05 08 2725 .db 8 ; bInterval 2726 ;; endpoint descriptor I0:A1:E1 0D06 09 2727 .db 9 ; bLength 0D07 05 2728 .db USB_DT_ENDPOINT ; bDescriptorType 0D08 88 2729 .db (USB_DIR_IN | 8) ; bEndpointAddress 0D09 01 2730 .db 0x01 ; bmAttributes (iso) 0D0A 2731 descinframesize: 0D0A 02 00 2732 .db 0x02,0x00 ; wMaxPacketSize 0D0C 01 2733 .db 1 ; bInterval 0D0D 00 2734 .db 0 ; bRefresh 0D0E 00 2735 .db 0 ; bSynchAddress 2736 ;; endpoint descriptor I0:A1:E2 0D0F 09 2737 .db 9 ; bLength 0D10 05 2738 .db USB_DT_ENDPOINT ; bDescriptorType 0D11 08 2739 .db (USB_DIR_OUT | 8) ; bEndpointAddress 0D12 01 2740 .db 0x01 ; bmAttributes (iso) 0D13 2741 descoutframesize: 0D13 02 00 2742 .db 0x02,0x00 ; wMaxPacketSize 0D15 01 2743 .db 1 ; bInterval 0D16 00 2744 .db 0 ; bRefresh 0D17 00 2745 .db 0 ; bSynchAddress 003B 2746 config0sz = . - config0descr 2747 0D18 2748 stringdescr: 0D18 20 0D 2749 .db string0 0D1A 24 0D 2750 .db string1 0D1C 32 0D 2751 .db string2 0D1E 52 0D 2752 .db stringserial 2753 0004 2754 numstrings = (. - stringdescr)/2 2755 0D20 2756 string0: 0D20 04 2757 .db string0sz ; bLength 0D21 03 2758 .db USB_DT_STRING ; bDescriptorType 0D22 00 00 2759 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2760 string0sz = . - string0 2761 0D24 2762 string1: 0D24 0E 2763 .db string1sz ; bLength 0D25 03 2764 .db USB_DT_STRING ; bDescriptorType 0D26 42 00 61 00 79 00 2765 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2766 string1sz = . - string1 2767 0D32 2768 string2: 0D32 20 2769 .db string2sz ; bLength 0D33 03 2770 .db USB_DT_STRING ; bDescriptorType 0D34 55 00 53 00 42 00 2771 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0D44 28 00 41 00 75 00 2772 .db '(,0,'A,0,'u,0,'d,0,'i,0,'o,0,'),0 64 00 69 00 6F 00 29 00 0020 2773 string2sz = . - string2 2774 0D52 2775 stringserial: 0D52 02 2776 .db 2 ; bLength 0D53 03 2777 .db USB_DT_STRING ; bDescriptorType 0D54 00 00 00 00 00 00 2778 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0D64 00 00 00 00 00 00 2779 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2780 baycomusb-0.10.orig/firmware/audio2firmware/main.map0100644000175100017510000000665507337536151020615 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 s_OSEG 0000 l__CODE 0000 s__CODE 0000 s_CODE 0000 s_BSEG 0000 l_OSEG 0001 l_XSEG 0008 l_GSINIT 000A l_BSEG 0027 l_DSEG 0040 s_DSEG 0080 l_ISEG 0080 s_ISEG 0157 l_CODE 0157 s_CSEG 01C0 l_GSINIT2 0C1D l_CSEG 0D74 s_GSINIT 0D7C s_GSINIT2 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 0157 = 343. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 0157 0C1D = 3101. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:0A13 fillusbintr Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT 0D74 0008 = 8. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT2 0D7C 01C0 = 448. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ OSEG 0000 0000 = 0. bytes (REL,OVR) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 000A = 10. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0080 = 128. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 0027 = 39. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 0001 = 1. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/audio2firmware/main.asm0100644000175100017510000013231607337522030020601 0ustar abaaba .module main ;; same as audiofirmware, but do not announce as ;; audio class compliant ;; ENDPOINTS ;; EP0 in/out Control ;; EP1 in Interrupt: Status ;; Byte 0: Modem Status ;; Bit 0-1: Transmitter status ;; 0: idle (off) ;; 1: keyup ;; 2: transmitting packets ;; 3: tail ;; Bit 2: PTT status (1=on) ;; Bit 3: DCD ;; Bit 5: UART transmitter empty ;; Bit 6-7: unused ;; Byte 1: Number of empty 64 byte chunks in TX fifo (sofcount) ;; Byte 2: Number of full 64 byte chunks in RX fifo (INISOVAL) ;; Byte 3: RSSI value ;; Byte 4: IRQ count ;; Byte 5-20: (as needed) UART receiver chars ;; EP8 out audio output ;; EP8 in audio input ;; COMMAND LIST ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) ;; C0 C8 read mode ;; Return: ;; Byte 0: 4 (MODE_AUDIO) ;; C0 C9 return serial number string ;; C0 D0 get/set PTT/DCD/RSSI ;; wIndex = 1: set forced ptt to wValue ;; Return: ;; Byte 0: PTT status ;; Byte 1: DCD status ;; Byte 2: RSSI status ;; 40 D2 set CON/STA led ;; Bits 0-1 of wValue ;; 40 D3 send byte to UART ;; Byte in wValue ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) ;; wIndex = 1: write wValue to output register ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) ;; Return: ;; Byte 0: Modem Disconnect Input ;; Byte 1: Modem Disconnect Output register ;; Byte 2: Modem Disconnect Tristate register ;; C0 D5 get/set T7F port ;; wIndex = 1: write wValue to T7F output register ;; Return: ;; Byte 0: T7F Input ;; Byte 1: T7F Output register ;; C0 E0 get/set control register/counter values ;; wIndex = 1: write wValue to control register ;; Return: ;; Byte 0: control register value ;; Byte 1-3: counter0 register ;; Byte 4-6: counter1 register ;; C0 E1 get debug status ;; Return: ;; Byte 0: SOF count ;; Byte 1: framesize ;; Byte 2-3: divider ;; Byte 4: divrel ;; Byte 5: pllcorrvar ;; Byte 6: txfifocount ;; C0 E2 xxdebug stuff ;; define code segments link order .area CODE (CODE) .area CSEG (CODE) .area GSINIT (CODE) .area GSINIT2 (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; Xilinx FPGA registers AUDIORXFIFO = 0xc000 AUDIOTXFIFO = 0xc000 AUDIORXFIFOCNT = 0xc001 AUDIOTXFIFOCNT = 0xc002 AUDIODIVIDERLO = 0xc001 AUDIODIVIDERHI = 0xc002 AUDIORSSI = 0xc004 AUDIOCNTLOW = 0xc005 AUDIOCNTMID = 0xc006 AUDIOCNTHIGH = 0xc007 AUDIOCTRL = 0xc008 AUDIOSTAT = 0xc009 AUDIOT7FOUT = 0xc00a AUDIOT7FIN = 0xc00b AUDIOMDISCTRIS = 0xc00c AUDIOMDISCOUT = 0xc00d AUDIOMDISCIN = 0xc00e AUDIOCTRLPTT = 0x01 AUDIOCTRLMUTE = 0x02 AUDIOCTRLLEDPTT = 0x04 AUDIOCTRLLEDDCD = 0x08 AUDIOCTRLCNTRES = 0x00 AUDIOCTRLCNTDIS = 0x10 AUDIOCTRLCNTCK0 = 0x40 AUDIOCTRLCNTCK1 = 0x50 AUDIOCTRLCNTCK2 = 0x60 AUDIOCTRLCNTCK3 = 0x70 AUDIOCTRLCNTRD1 = 0x80 ;; ----------------------------------------------------- .area CODE (CODE) ljmp startup ljmp int0_isr .ds 5 ljmp timer0_isr .ds 5 ljmp int1_isr .ds 5 ljmp timer1_isr .ds 5 ljmp ser0_isr .ds 5 ljmp timer2_isr .ds 5 ljmp resume_isr .ds 5 ljmp ser1_isr .ds 5 ljmp usb_isr .ds 5 ljmp i2c_isr .ds 5 ljmp int4_isr .ds 5 ljmp int5_isr .ds 5 ljmp int6_isr ;; Parameter block at 0xe0 .ds 0x7a parframesize: .db 8 parpttmute: .db 1 ;; Serial# string at 0xf0 .ds 14 parserial: .db '0,'0,'0,'0,'0,'0,'0,'0,0 .ds 7 usb_isr: ljmp usb_sudav_isr .ds 1 ljmp usb_sof_isr .ds 1 ljmp usb_sutok_isr .ds 1 ljmp usb_suspend_isr .ds 1 ljmp usb_usbreset_isr .ds 1 reti .ds 3 ljmp usb_ep0in_isr .ds 1 ljmp usb_ep0out_isr .ds 1 ljmp usb_ep1in_isr .ds 1 ljmp usb_ep1out_isr .ds 1 ljmp usb_ep2in_isr .ds 1 ljmp usb_ep2out_isr .ds 1 ljmp usb_ep3in_isr .ds 1 ljmp usb_ep3out_isr .ds 1 ljmp usb_ep4in_isr .ds 1 ljmp usb_ep4out_isr .ds 1 ljmp usb_ep5in_isr .ds 1 ljmp usb_ep5out_isr .ds 1 ljmp usb_ep6in_isr .ds 1 ljmp usb_ep6out_isr .ds 1 ljmp usb_ep7in_isr .ds 1 ljmp usb_ep7out_isr ;; ----------------------------------------------------- NUMINTERFACES = 4 .area OSEG (OVR,DATA) .area BSEG (BIT) ctrl_ptt: .ds 1 ctrl_pttmute: .ds 1 ctrl_ledptt: .ds 1 ctrl_leddcd: .ds 1 ctrl_cntmode0: .ds 1 ctrl_cntmode1: .ds 1 ctrl_cntmode2: .ds 1 ctrl_cntsel: .ds 1 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) pttmute: .ds 1 uartempty: .ds 1 .area ISEG (DATA) txsamples: .ds 0x40 stack: .ds 0x80-0x40 .area DSEG (DATA) ctrlcode: .ds 1 ctrlcount: .ds 2 leddiv: .ds 1 irqcount: .ds 1 sofcount: .ds 1 divider: .ds 2 divrel: .ds 1 framesize: .ds 1 pllcorrvar: .ds 1 txfifocount: .ds 1 pttforce: .ds 1 ;; UART receiver uartbuf: .ds 16 uartwr: .ds 1 uartrd: .ds 1 ;; Port state t7fout: .ds 1 mdisctris: .ds 1 mdiscout: .ds 1 ;; USB state numconfig: .ds 1 altsetting: .ds NUMINTERFACES .area XSEG (DATA) blah: .ds 1 .area GSINIT (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 startup: mov sp,#stack ; -1 clr a mov psw,a mov dps,a ;lcall __sdcc_external_startup ;mov a,dpl0 ;jz __sdcc_init_data ;ljmp __sdcc_program_startup __sdcc_init_data: .area GSINIT2 (CODE) __sdcc_program_startup: ;; assembler code startup clr a mov irqcount,a mov sofcount,a mov pttforce,a mov uartrd,a mov uartwr,a mov dps,a setb uartempty ;; some indirect register setup mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs ;; Timer setup: ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 mov tmod,#0x21 mov tcon,#0x55 ; INT0/INT1 edge mov th1,#256-156 ; 1200 bauds mov pcon,#0 ; SMOD0=0 ;; init USB subsystem mov a,#0x00 ; IN8 FIFO at address 0x0000 mov dptr,#IN8ADDR movx @dptr,a mov a,#0x04 ; OUT8 FIFO at address 0x0010 mov dptr,#OUT8ADDR movx @dptr,a mov dptr,#ISOCTL clr a ; enable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a mov a,#0x01 ; enable ISO endpoint 8 for input/output mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR mov a,#0x89 ; pair EP 2&3 for input & output, ISOSEND0 movx @dptr,a mov dptr,#IN07VAL mov a,#0x3 ; enable EP0+EP1 movx @dptr,a mov dptr,#OUT07VAL mov a,#0x1 ; enable EP0 movx @dptr,a ;; USB: init endpoint toggles mov dptr,#TOGCTL mov a,#0x12 movx @dptr,a mov a,#0x32 ; clear EP 2 in toggle movx @dptr,a mov a,#0x02 movx @dptr,a mov a,#0x22 ; clear EP 2 out toggle movx @dptr,a ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x82 ; set PROG hi movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins movx @dptr,a mov dptr,#OUTC mov a,#0x28 movx @dptr,a mov dptr,#OEC mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT movx @dptr,a ;; enable interrupts mov ie,#0x92 ; enable timer 0 and ser 0 int mov eie,#0x01 ; enable USB interrupts mov dptr,#USBIEN mov a,#1 ; enable SUDAV interrupt movx @dptr,a mov dptr,#IN07IEN mov a,#3 ; enable EP0+EP1 interrupt movx @dptr,a mov dptr,#OUT07IEN mov a,#1 ; enable EP0 interrupt movx @dptr,a ;; initialize UART 0 for T7F communication mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable ;; copy configuration to bit addressable variables mov ctrlreg,#AUDIOCTRLCNTRES mov r0,#parpttmute movx a,@r0 mov c,acc.0 mov pttmute,c mov ctrl_pttmute,c ;; turn off transmitter mov dptr,#AUDIOCTRL mov a,ctrlreg movx @dptr,a ;; Initialize modem disc port / t7f port mov dptr,#AUDIOMDISCTRIS mov a,#0xff movx @dptr,a mov mdisctris,a mov dptr,#AUDIOMDISCOUT clr a movx @dptr,a mov mdiscout,a mov dptr,#AUDIOT7FOUT mov a,#0x1f movx @dptr,a mov t7fout,a ;; Copy serial number mov r0,#parserial mov dptr,#stringserial+2 1$: movx a,@r0 jz 2$ movx @dptr,a inc dptr inc dptr inc r0 sjmp 1$ 2$: mov a,r0 add a,#1-0xf0 ; 1-parserial add a,acc mov dptr,#stringserial movx @dptr,a ;; check parameters chkparam: mov divrel,#0x80 mov r0,#parframesize movx a,@r0 cjne a,#02,11$ sjmp 2$ 11$: cjne a,#03,1$ sjmp 2$ 1$: add a,#-8 jnc 3$ add a,#-16 jc 4$ movx a,@r0 sjmp 5$ ;; sampling rate is: 24000000Hz/(divider+2) 4$: mov a,#24 sjmp 5$ 3$: mov a,#8 ;; 16 bit by 8 bit divide ;; r2: divisor ;; r3: loop counter ;; r4: dividend/result low ;; r5: dividend/result mid ;; r6: dividend/result high 5$: mov r2,a mov r3,#17 mov r4,#24000 mov r5,#24000>>8 mov r6,#0 6$: clr c mov a,r6 subb a,r2 jc 7$ mov r6,a 7$: cpl c mov a,r4 rlc a mov r4,a mov a,r5 rlc a mov r5,a mov a,r6 rlc a mov r6,a djnz r3,6$ ;; subtract two mov a,r4 clr c subb a,#2 mov r4,a mov a,r5 subb a,#0 mov r5,a ;; store result into audio divider mov dptr,#AUDIODIVIDERHI movx @dptr,a mov a,r4 mov dptr,#AUDIODIVIDERLO movx @dptr,a clr c subb a,#0x08 mov divider,a mov a,r5 subb a,#0 mov divider+1,a ;; reload divider into accu mov a,r2 2$: mov framesize,a mov dptr,#descinframesize movx @dptr,a mov dptr,#descoutframesize movx @dptr,a ;; set sampling rate in descriptor .if 0 mov b,#1000 mul ab mov dptr,#descinsrate movx @dptr,a mov dptr,#descoutsrate movx @dptr,a mov r3,b mov a,framesize mov b,#1000>>8 mul ab add a,r3 mov dptr,#descinsrate+1 movx @dptr,a mov dptr,#descoutsrate+1 movx @dptr,a clr a addc a,b mov dptr,#descinsrate+2 movx @dptr,a mov dptr,#descoutsrate+2 movx @dptr,a .endif ;; initialize USB state usbinit: .if 0 ;; XXXXX ;; check if windows needs 11025Hz mov a,#12 mov dptr,#descinframesize movx @dptr,a mov dptr,#descoutframesize movx @dptr,a mov a,#0x11 mov dptr,#descinsrate movx @dptr,a mov dptr,#descoutsrate movx @dptr,a mov a,#0x2b mov dptr,#descinsrate+1 movx @dptr,a mov dptr,#descoutsrate+1 movx @dptr,a mov a,#0 mov dptr,#descinsrate+2 movx @dptr,a mov dptr,#descoutsrate+2 movx @dptr,a ;; XXXXX .endif clr a mov numconfig,a mov r0,#altsetting mov r2,#NUMINTERFACES 3$: mov @r0,a inc r0 djnz r2,3$ ;; give Windows a chance to finish the writecpucs control transfer ;; 20ms delay loop mov dptr,#(-12000)&0xffff 2$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 2$ ; 3 cycles .if 1 ;; disconnect from USB bus mov dptr,#USBCS mov a,#10 movx @dptr,a ;; wait 0.3 sec mov r2,#30 ;; 10ms delay loop 0$: mov dptr,#(-6000)&0xffff 1$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 1$ ; 3 cycles djnz r2,0$ ;; reconnect to USB bus mov dptr,#USBCS ;mov a,#2 ; 8051 handles control ;movx @dptr,a mov a,#6 ; reconnect, 8051 handles control movx @dptr,a .endif ;; final lcall fillusbintr fifoinit: ;; first wait for a new frame mov dptr,#USBFRAMEL movx a,@dptr mov r2,a 1$: movx a,@dptr cjne a,ar2,2$ sjmp 1$ 2$: mov dptr,#AUDIORXFIFOCNT movx a,@dptr add a,#-4 anl a,#0x3f jz 4$ mov r2,a mov dptr,#AUDIORXFIFO 3$: movx a,@dptr djnz r2,3$ 4$: mov dptr,#AUDIOTXFIFOCNT movx a,@dptr add a,#-4 anl a,#0x3f jz 4$ mov r2,a mov dptr,#AUDIOTXFIFO clr a 5$: movx @dptr,a djnz r2,5$ 6$: ;; clear SOFIR interrupt mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; finally enable SOFIR interrupt mov dptr,#USBIEN mov a,#3 ; enable SUDAV+SOFIR interrupt movx @dptr,a lcall fillusbintr ljmp mainloop .area CSEG (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 ;; WARNING! The assembler doesn't check for ;; out of range short jump labels!! Double check ;; that the jump labels are within the range! mainloop: mov a,pttforce mov c,acc.0 mov ctrl_ptt,c mov ctrl_ledptt,c cpl c anl c,pttmute mov ctrl_pttmute,c mov dptr,#AUDIOCTRL mov a,ctrlreg movx @dptr,a ljmp mainloop ;; ------------------ interrupt handlers ------------------------ int0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+5 ;; handle interrupt .if 0 inc leddiv mov a,leddiv anl a,#7 jnz 0$ mov dptr,#OUTC movx a,@dptr xrl a,#0x08 movx @dptr,a 0$: .endif ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 ;; clear interrupt jbc scon0+0,1$ ; RI 0$: jbc scon0+1,2$ ; TI ;; handle interrupt ;; epilogue 3$: pop ar0 pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti 2$: setb uartempty sjmp 0$ 1$: mov a,uartwr add a,#uartbuf mov r0,a mov a,sbuf0 mov @r0,a mov a,uartwr inc a anl a,#0xf mov uartwr,a sjmp 3$ timer2_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr t2con+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti resume_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+4 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon1+0 clr scon1+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti i2c_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.5 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int4_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.6 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int5_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.7 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int6_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sudav_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov ctrlcode,#0 ; reset control out code mov dptr,#SETUPDAT+1 movx a,@dptr ; bRequest field ;; standard commands ;; USB_REQ_GET_DESCRIPTOR cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc mov dptr,#SETUPDAT ; bRequestType == 0x80 movx a,@dptr cjne a,#USB_DIR_IN,setupstallstd mov dptr,#SETUPDAT+3 movx a,@dptr cjne a,#USB_DT_DEVICE,cmdnotgetdescdev mov dptr,#SUDPTRH mov a,#>devicedescr movx @dptr,a inc dptr mov a,#config0descr movx @dptr,a inc dptr mov a,#stringdescr mov dph0,a movx a,@dptr mov b,a inc dptr movx a,@dptr mov dptr,#SUDPTRH movx @dptr,a inc dptr mov a,b movx @dptr,a ; sjmp setupackstd setupackstd: ljmp setupack setupstallstd: ljmp setupstall cmdnotgetdesc: ;; USB_REQ_SET_CONFIGURATION cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf mov dptr,#SETUPDAT movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr add a,#-2 jc setupstallstd movx a,@dptr mov numconfig,a cmdresettoggleshalt: mov dptr,#TOGCTL mov r0,#7 0$: mov a,r0 orl a,#0x10 movx @dptr,a orl a,#0x30 movx @dptr,a mov a,r0 movx @dptr,a orl a,#0x20 movx @dptr,a djnz r0,0$ clr a movx @dptr,a mov a,#2 mov dptr,#IN1CS mov r0,#7 1$: movx @dptr,a inc dptr inc dptr djnz r0,1$ mov dptr,#OUT1CS mov r0,#7 2$: movx @dptr,a inc dptr inc dptr djnz r0,2$ lcall fillusbintr sjmp setupackstd cmdnotsetconf: ;; USB_REQ_SET_INTERFACE cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr add a,#-NUMINTERFACES jc setupstallstd add a,#NUMINTERFACES+altsetting mov r0,a mov dptr,#SETUPDAT+2 movx a,@dptr mov @r0,a sjmp cmdresettoggleshalt cmdnotsetint: ;; USB_REQ_GET_INTERFACE cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr add a,#-NUMINTERFACES jc setupstallstd add a,#NUMINTERFACES+altsetting mov r0,a mov a,@r0 cmdrespondonebyte: mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a sjmp setupackstd2 cmdnotgetint: ;; USB_REQ_GET_CONFIGURATION cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 mov a,numconfig sjmp cmdrespondonebyte cmdnotgetconf: ;; USB_REQ_GET_STATUS (0) jnz cmdnotgetstat mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev mov a,#1 cmdrespondstat: mov dptr,#IN0BUF movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#IN0BC mov a,#2 movx @dptr,a sjmp setupackstd2 cmdnotgetstatdev: cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf clr a sjmp cmdrespondstat cmdnotgetstatintf: cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 mov dptr,#SETUPDAT+4 movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 0$: anl a,#15 jz setupstallstd2 jb acc.3,setupstallstd2 add a,acc add a,dpl0 mov dpl0,a movx a,@dptr sjmp cmdrespondstat setupackstd2: ljmp setupack setupstallstd2: ljmp setupstall cmdnotgetstat: ;; USB_REQ_SET_FEATURE cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr mov b,#1 sjmp handleftr cmdnotsetftr: ;; USB_REQ_CLEAR_FEATURE cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr mov b,#0 handleftr: mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 inc dptr inc dptr movx a,@dptr jnz setupstallstd2 ; not ENDPOINT_HALT feature inc dptr movx a,@dptr jnz setupstallstd2 inc dptr movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 orl a,#0x10 0$: jb acc.3,setupstallstd2 ;; clear data toggle anl a,#0x1f inc dps mov dptr,#TOGCTL movx @dptr,a orl a,#0x20 movx @dptr,a anl a,#15 movx @dptr,a dec dps ;; clear/set ep halt feature add a,acc add a,dpl0 mov dpl0,a mov a,b movx @dptr,a sjmp setupackstd2 cmdnotc0_1: ljmp cmdnotc0 setupstallc0_1: ljmp setupstall cmdnotclrftr: ;; vendor specific commands ;; 0xc0 cjne a,#0xc0,cmdnotc0_1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc0_1 ;; fill status buffer mov a,pttforce mov b,a mov c,acc.0 mov b.2,c mov dptr,#AUDIOSTAT movx a,@dptr mov c,acc.0 cpl c mov b.3,c mov c,uartempty mov b.5,c clr a mov dptr,#(IN0BUF+4) movx @dptr,a ;; bytewide elements mov dptr,#(IN0BUF) mov a,b movx @dptr,a clr a mov dptr,#(IN0BUF+1) movx @dptr,a mov dptr,#(IN0BUF+2) movx @dptr,a mov dptr,#AUDIORSSI movx a,@dptr mov dptr,#(IN0BUF+3) movx @dptr,a ;; counter inc irqcount mov a,irqcount mov dptr,#(IN0BUF+5) movx @dptr,a ;; additional fields (HDLC state mach) clr a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a inc dptr movx @dptr,a ;; FPGA registers mov dptr,#AUDIORXFIFOCNT movx a,@dptr mov dptr,#(IN0BUF+18) movx @dptr,a mov dptr,#AUDIOTXFIFOCNT movx a,@dptr mov dptr,#(IN0BUF+19) movx @dptr,a mov a,ctrlreg inc dptr movx @dptr,a mov dptr,#AUDIOSTAT movx a,@dptr mov dptr,#(IN0BUF+21) movx @dptr,a ;; Anchor Registers mov dptr,#OUT2CS movx a,@dptr mov dptr,#(IN0BUF+22) movx @dptr,a ;; set length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-(6+12+4+1) jnc 4$ clr a 4$: add a,#(6+12+4+1) mov dptr,#IN0BC movx @dptr,a ljmp setupack cmdnotc0: ;; 0xc8 cjne a,#0xc8,cmdnotc8 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc8 mov a,#4 mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a ljmp setupack setupstallc8: ljmp setupstall cmdnotc8: ;; 0xc9 cjne a,#0xc9,cmdnotc9 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc9 mov dptr,#IN0BUF mov r0,#parserial 0$: movx a,@r0 jz 1$ movx @dptr,a inc r0 inc dptr sjmp 0$ 1$: mov a,r0 add a,#-0xf0 ; -parserial mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallc9: ljmp setupstall cmdnotc9: ;; 0xd0 cjne a,#0xd0,cmdnotd0 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld0 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,0$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr anl a,#1 mov pttforce,a 0$: ;; PTT status mov dptr,#IN0BUF mov a,pttforce movx @dptr,a ;; DCD status mov dptr,#AUDIOSTAT movx a,@dptr anl a,#1 xrl a,#1 mov dptr,#IN0BUF+1 movx @dptr,a ;; RSSI mov dptr,#AUDIORSSI movx a,@dptr mov dptr,#IN0BUF+2 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-3 jnc 2$ clr a 2$: add a,#3 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld0: ljmp setupstall cmdnotd0: ;; 0xd2 cjne a,#0xd2,cmdnotd2 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,setupstalld2 mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr mov b,a mov dptr,#OUTC movx a,@dptr mov c,b.0 mov acc.3,c mov c,b.1 mov acc.5,c movx @dptr,a ljmp setupack setupstalld2: ljmp setupstall cmdnotd2: ;; 0xd3 cjne a,#0xd3,cmdnotd3 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,setupstalld3 mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr jbc uartempty,cmdd2cont setupstalld3: ljmp setupstall cmdd2cont: mov sbuf0,a ljmp setupack cmdnotd3: ;; 0xd4 cjne a,#0xd4,cmdnotd4 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld4 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr mov dptr,#SETUPDAT+2 ; wValue cjne a,#1,0$ movx a,@dptr mov dptr,#AUDIOMDISCOUT movx @dptr,a mov mdiscout,a sjmp 1$ 0$: cjne a,#2,1$ movx a,@dptr mov dptr,#AUDIOMDISCTRIS movx @dptr,a mov mdisctris,a 1$: mov dptr,#AUDIOMDISCIN movx a,@dptr mov dptr,#IN0BUF+0 movx @dptr,a mov a,mdiscout inc dptr movx @dptr,a mov a,mdisctris inc dptr movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-3 jnc 2$ clr a 2$: add a,#3 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld4: ljmp setupstall cmdnotd4: ;; 0xd5 cjne a,#0xd5,cmdnotd5 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld5 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,0$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr mov dptr,#AUDIOT7FOUT movx @dptr,a mov t7fout,a 0$: mov dptr,#AUDIOT7FIN movx a,@dptr mov dptr,#IN0BUF+0 movx @dptr,a mov a,t7fout inc dptr mov dptr,#IN0BUF+1 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-2 jnc 2$ clr a 2$: add a,#2 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld5: setupstalle0: ljmp setupstall cmdnote0_0: ljmp cmdnote0 cmdnotd5: ;; 0xe0 cjne a,#0xe0,cmdnote0_0 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalle0 ;; set PTT, LED's and counter mode mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,1$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr anl a,#0x78 xch a,ctrlreg anl a,#0x07 orl a,ctrlreg mov ctrlreg,a mov dptr,#AUDIOCTRL movx @dptr,a 1$: mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr jz 3$ cjne a,#1,2$ mov a,ctrlreg mov dptr,#IN0BUF anl a,#0x7f movx @dptr,a mov a,#1 3$: mov dptr,#IN0BC movx @dptr,a ljmp setupack 2$: mov dptr,#AUDIOCTRL setb ctrl_cntsel mov a,ctrlreg movx @dptr,a mov dptr,#AUDIOCNTLOW movx a,@dptr mov dptr,#IN0BUF+4 movx @dptr,a mov dptr,#AUDIOCNTMID movx a,@dptr mov dptr,#IN0BUF+5 movx @dptr,a mov dptr,#AUDIOCNTHIGH movx a,@dptr mov dptr,#IN0BUF+6 movx @dptr,a mov dptr,#AUDIOCTRL clr ctrl_cntsel mov a,ctrlreg movx @dptr,a mov dptr,#IN0BUF movx @dptr,a mov dptr,#AUDIOCNTLOW movx a,@dptr mov dptr,#IN0BUF+1 movx @dptr,a mov dptr,#AUDIOCNTMID movx a,@dptr mov dptr,#IN0BUF+2 movx @dptr,a mov dptr,#AUDIOCNTHIGH movx a,@dptr mov dptr,#IN0BUF+3 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-7 jnc 4$ clr a 4$: add a,#7 mov dptr,#IN0BC movx @dptr,a ljmp setupack cmdnote0: ;; 0xe1 cjne a,#0xe1,cmdnote1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalle1 mov dptr,#IN0BUF mov a,sofcount movx @dptr,a inc dptr mov a,framesize movx @dptr,a inc dptr mov a,divider movx @dptr,a inc dptr mov a,divider+1 movx @dptr,a inc dptr mov a,divrel movx @dptr,a inc dptr mov a,pllcorrvar movx @dptr,a inc dptr mov a,txfifocount movx @dptr,a ;mov dptr,#AUDIOTXFIFOCNT ;movx a,@dptr ;mov dptr,#IN0BUF+6 ;movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-7 jnc 1$ clr a 1$: add a,#7 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalle1: ljmp setupstall cmdnote1: ;; 0xe2 cjne a,#0xe2,cmdnote2 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalle2 mov dptr,#IN0BUF mov r0,#txsamples mov r7,framesize 1$: mov a,@r0 movx @dptr,a inc r0 inc dptr djnz r7,1$ mov dptr,#IN0BC mov a,framesize movx @dptr,a ljmp setupack setupstalle2: ljmp setupstall cmdnote2: ;; unknown commands fall through to setupstall setupstall: mov a,#3 sjmp endsetup setupack: mov a,#2 endsetup: mov dptr,#EP0CS movx @dptr,a endusbisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sof_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar2 push ar3 push ar0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; handle interrupt inc sofcount ;; debugging: we have two cases ;; if the ISO frame size is just 2 bytes, ;; we return the frame number, otherwise ;; the required numbers of samples mov a,framesize cjne a,#2,1$ ;; copy the frame number mov dptr,#USBFRAMEL movx a,@dptr inc dptr inc dps mov dptr,#IN8DATA movx @dptr,a dec dps movx a,@dptr inc dps movx @dptr,a ljmp sofendisr 1$: cjne a,#3,sofsampleisr mov dptr,#ISOERR movx a,@dptr jb acc.0,3$ mov dptr,#OUT8BCH movx a,@dptr jnz 3$ mov dptr,#OUT8BCL movx a,@dptr cjne a,#3,3$ mov r2,a mov dptr,#OUT8DATA inc dps mov dptr,#IN8DATA dec dps 2$: movx a,@dptr inc dps movx @dptr,a dec dps djnz r2,2$ ljmp sofendisr 3$: mov r2,#3 mov dptr,#IN8DATA clr a 4$: movx @dptr,a djnz r2,4$ ljmp sofendisr sofsampleisr: mov dptr,#AUDIORXFIFOCNT movx a,@dptr clr c subb a,framesize movx a,@dptr jc 1$ mov a,framesize 1$: mov r2,a mov r3,a jz 2$ mov dptr,#AUDIORXFIFO inc dps mov dptr,#IN8DATA dec dps 3$: movx a,@dptr inc dps movx @dptr,a dec dps djnz r2,3$ 2$: mov a,framesize clr c subb a,r3 jz 4$ mov r2,a mov dptr,#IN8DATA clr a 5$: movx @dptr,a djnz r2,5$ ;; sample rate adjustment 4$: mov dptr,#AUDIORXFIFOCNT movx a,@dptr mov pllcorrvar,a add a,#-4 jz 10$ ; no adjustment rlc a subb a,acc setb acc.0 10$: mov r3,a ; r3 & acc contain the adjust value add a,divrel ;; zero is the guard value jz 11$ mov divrel,a 11$: mov a,divrel rr a rr a rr a rr a anl a,#0xf add a,r3 ; momentary correction add a,divider mov r2,a mov a,divider+1 addc a,#0 mov dptr,#AUDIODIVIDERHI movx @dptr,a mov a,r2 mov dptr,#AUDIODIVIDERLO movx @dptr,a ;; OUT data mov dptr,#ISOERR movx a,@dptr jb acc.0,20$ mov dptr,#OUT8BCH movx a,@dptr jnz 20$ mov dptr,#OUT8BCL movx a,@dptr clr c subb a,framesize jnz 20$ mov dptr,#AUDIOTXFIFOCNT movx a,@dptr mov txfifocount,a clr c subb a,framesize mov a,txfifocount jc 14$ mov a,framesize 14$: jz 13$ mov r2,a mov dptr,#OUT8DATA inc dps mov dptr,#AUDIOTXFIFO dec dps mov r0,#txsamples 12$: movx a,@dptr inc dps movx @dptr,a dec dps mov @r0,a inc r0 djnz r2,12$ 13$: sjmp sofendisr ;; initialize TX if invalid packet 20$: mov dptr,#AUDIOTXFIFOCNT movx a,@dptr mov txfifocount,a add a,#-4 anl a,#0x3f jz sofendisr mov r2,a mov dptr,#AUDIOTXFIFO clr a mov r0,#txsamples 21$: movx @dptr,a mov @r0,a inc r0 djnz r2,21$ sofendisr: ;; epilogue pop ar0 pop ar3 pop ar2 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sutok_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_suspend_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_usbreset_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep0in_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_ep0out_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar6 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt ;; epilogue pop ar6 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti fillusbintr:: mov a,pttforce mov b,a mov c,acc.0 mov b.2,c mov dptr,#AUDIOSTAT movx a,@dptr mov c,acc.0 mov b.3,c mov c,uartempty mov b.5,c ;; bytewide elements mov dptr,#(IN1BUF) mov a,b movx @dptr,a mov a,sofcount mov dptr,#(IN1BUF+1) movx @dptr,a mov dptr,#INISOVAL movx a,@dptr mov dptr,#(IN1BUF+2) movx @dptr,a mov dptr,#AUDIORSSI movx a,@dptr mov dptr,#(IN1BUF+3) movx @dptr,a ; counter inc irqcount mov a,irqcount mov dptr,#(IN1BUF+4) movx @dptr,a ; UART buffer mov b,#5 mov dptr,#(IN1BUF+5) 2$: mov a,uartrd cjne a,uartwr,3$ ; set length mov dptr,#IN1BC mov a,b movx @dptr,a ret 3$: add a,#uartbuf mov r0,a mov a,@r0 movx @dptr,a inc dptr inc b mov a,uartrd inc a anl a,#0xf mov uartrd,a sjmp 2$ usb_ep1in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt lcall fillusbintr ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep1out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ;; ----------------------------------------------------- ;; USB descriptors ;; ----------------------------------------------------- ;; Device and/or Interface Class codes USB_CLASS_PER_INTERFACE = 0 USB_CLASS_AUDIO = 1 USB_CLASS_COMM = 2 USB_CLASS_HID = 3 USB_CLASS_PRINTER = 7 USB_CLASS_MASS_STORAGE = 8 USB_CLASS_HUB = 9 USB_CLASS_VENDOR_SPEC = 0xff USB_SUBCLASS_AUDIOCONTROL = 1 USB_SUBCLASS_AUDIOSTREAMING = 2 ;; Descriptor types USB_DT_DEVICE = 0x01 USB_DT_CONFIG = 0x02 USB_DT_STRING = 0x03 USB_DT_INTERFACE = 0x04 USB_DT_ENDPOINT = 0x05 ;; Audio Class descriptor types USB_DT_AUDIO_UNDEFINED = 0x20 USB_DT_AUDIO_DEVICE = 0x21 USB_DT_AUDIO_CONFIG = 0x22 USB_DT_AUDIO_STRING = 0x23 USB_DT_AUDIO_INTERFACE = 0x24 USB_DT_AUDIO_ENDPOINT = 0x25 USB_SDT_AUDIO_UNDEFINED = 0x00 USB_SDT_AUDIO_HEADER = 0x01 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 USB_SDT_AUDIO_MIXER_UNIT = 0x04 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 ;; Standard requests USB_REQ_GET_STATUS = 0x00 USB_REQ_CLEAR_FEATURE = 0x01 USB_REQ_SET_FEATURE = 0x03 USB_REQ_SET_ADDRESS = 0x05 USB_REQ_GET_DESCRIPTOR = 0x06 USB_REQ_SET_DESCRIPTOR = 0x07 USB_REQ_GET_CONFIGURATION = 0x08 USB_REQ_SET_CONFIGURATION = 0x09 USB_REQ_GET_INTERFACE = 0x0A USB_REQ_SET_INTERFACE = 0x0B USB_REQ_SYNCH_FRAME = 0x0C ;; Audio Class Requests USB_REQ_AUDIO_SET_CUR = 0x01 USB_REQ_AUDIO_GET_CUR = 0x81 USB_REQ_AUDIO_SET_MIN = 0x02 USB_REQ_AUDIO_GET_MIN = 0x82 USB_REQ_AUDIO_SET_MAX = 0x03 USB_REQ_AUDIO_GET_MAX = 0x83 USB_REQ_AUDIO_SET_RES = 0x04 USB_REQ_AUDIO_GET_RES = 0x84 USB_REQ_AUDIO_SET_MEM = 0x05 USB_REQ_AUDIO_GET_MEM = 0x85 USB_REQ_AUDIO_GET_STAT = 0xff ;; USB Request Type and Endpoint Directions USB_DIR_OUT = 0 USB_DIR_IN = 0x80 USB_TYPE_STANDARD = (0x00 << 5) USB_TYPE_CLASS = (0x01 << 5) USB_TYPE_VENDOR = (0x02 << 5) USB_TYPE_RESERVED = (0x03 << 5) USB_RECIP_DEVICE = 0x00 USB_RECIP_INTERFACE = 0x01 USB_RECIP_ENDPOINT = 0x02 USB_RECIP_OTHER = 0x03 ;; Request target types. USB_RT_DEVICE = 0x00 USB_RT_INTERFACE = 0x01 USB_RT_ENDPOINT = 0x02 VENDID = 0xbac0 PRODID = 0x6137 devicedescr: .db 18 ; bLength .db USB_DT_DEVICE ; bDescriptorType .db 0x00, 0x01 ; bcdUSB .db USB_CLASS_VENDOR_SPEC ; bDeviceClass .db 0 ; bDeviceSubClass .db 0xff ; bDeviceProtocol .db 0x40 ; bMaxPacketSize0 .db VENDID ; idVendor .db PRODID ; idProduct .db 0x01,0x00 ; bcdDevice .db 1 ; iManufacturer .db 2 ; iProduct .db 3 ; iSerialNumber .db 1 ; bNumConfigurations config0descr: .db 9 ; bLength .db USB_DT_CONFIG ; bDescriptorType .db config0sz ; wTotalLength .db 1 ; bNumInterfaces .db 1 ; bConfigurationValue .db 0 ; iConfiguration .db 0b01000000 ; bmAttributs (self powered) .db 0 ; MaxPower (mA/2) (self powered so 0) ;; standard packet interface (needed so the driver can hook to it) ;; interface descriptor I0:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 1 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A0:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; interface descriptor I0:A1 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 1 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A1:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x03 ; bmAttributes (interrupt) .db 0x40,0x00 ; wMaxPacketSize .db 8 ; bInterval ;; endpoint descriptor I0:A1:E1 .db 9 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 8) ; bEndpointAddress .db 0x01 ; bmAttributes (iso) descinframesize: .db 0x02,0x00 ; wMaxPacketSize .db 1 ; bInterval .db 0 ; bRefresh .db 0 ; bSynchAddress ;; endpoint descriptor I0:A1:E2 .db 9 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 8) ; bEndpointAddress .db 0x01 ; bmAttributes (iso) descoutframesize: .db 0x02,0x00 ; wMaxPacketSize .db 1 ; bInterval .db 0 ; bRefresh .db 0 ; bSynchAddress config0sz = . - config0descr stringdescr: .db string0 .db string1 .db string2 .db stringserial numstrings = (. - stringdescr)/2 string0: .db string0sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 0,0 ; LANGID[0]: Lang Neutral string0sz = . - string0 string1: .db string1sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 string1sz = . - string1 string2: .db string2sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 .db '(,0,'A,0,'u,0,'d,0,'i,0,'o,0,'),0 string2sz = . - string2 stringserial: .db 2 ; bLength .db USB_DT_STRING ; bDescriptorType .dw 0,0,0,0,0,0,0,0 .dw 0,0,0,0,0,0,0,0 baycomusb-0.10.orig/firmware/audio2firmware/main.lnk0100644000175100017510000000014707325134422020602 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/firmware/bscanfirmware/0042755000175100017510000000000007340500002017042 5ustar abaababaycomusb-0.10.orig/firmware/bscanfirmware/Makefile.in0100644000175100017510000001402007340500002021077 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/bscanfirmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/bscanfirmware/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 = firmware/bscanfirmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/bscanfirmware/main.rel: $(top_srcdir)/firmware/bscanfirmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/bscanfirmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/bscanfirmware/main.ihx: $(top_srcdir)/firmware/bscanfirmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/bscanfirmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/bscanfirmware/Makefile.am0100644000175100017510000000100107325134422021075 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/bscanfirmware/main.rel: $(top_srcdir)/firmware/bscanfirmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/bscanfirmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/bscanfirmware/main.ihx $(top_srcdir)/firmware/bscanfirmware/main.ihx: $(top_srcdir)/firmware/bscanfirmware/main.rel cd $(top_srcdir)/firmware/bscanfirmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk baycomusb-0.10.orig/firmware/bscanfirmware/main.ihx0100644000175100017510000001744407325134422020521 0ustar abaaba:060000000209170201BD18 :03000B000201DE11 :0300130002020ED8 :03001B0002022FAF :0300230002025086 :03002B000202735B :0300330002029432 :03003B000202B509 :03004300020100B7 :03004B000202D8D6 :030053000202FDA9 :03005B000203227B :030063000203474E :0E00F0000E03300030003000300030003100D0 :030100000203B93E :03010400020517DA :03010800020542AB :03010C0002056D7C :030110000205984D :0101140032B8 :030118000205C31A :03011C00020619BF :030120000206BA1A :030124000206E8E8 :03012800020713B8 :03012C0002073E89 :030130000207695A :030134000207942B :030138000207BFFC :03013C000207EACD :030140000208159D :030144000208406E :0301480002086B3F :03014C0002089610 :030150000208C1E1 :030154000208ECB2 :0E100000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 :0E100E00FFFFFFCFFFFFFFFFFFFFFFFF7FFF92 :0E101C00FFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 :02102A00FFFFC6 :08091700758180E4F5D0F5863E :06091F00E4F540F541F58E :0409250042F543F55F :0C09290045F546758E317589217588559D :0D093500758D64758700907FA17401F090AE :0E0942007FAF7401F0E4907FE0F0907FE1F071 :0D095000907FDD7409F0907FDE7403F0905D :0E095D007FDF7405F0907FD77412F07432F0D3 :0D096B007402F07422F0907F937400F090FD :0E0978007F967480F0907F9C74C2F0907F9404 :0E0986007400F0907F9D7400F0907F957400D7 :0E099400F0907F987420F0907F9E742EF07586 :0E09A200A88275E801907FAE7401F0907FACE2 :0E09B0007401F0907FAD7403F0759820759976 :0E09BE00FF12069B907F967482F0907F99E066 :0A09CC0030E206754080020A3D1279 :0E09D60001577A057B007C0612015D7A087BD2 :0D09E400007C0012015D7A087B017C00128E :0B09F100015D74F82F60087540818FD5 :0B09FC0041020A3D7A077B017C1C12BF :0C0A0700015D12018B7A057B007C071258 :0B0A1300015D7A057B007C0C12015D88 :030A1E0075402000 :0C0A2100E540B421FB7A037B007C01124D :0C0A2D00015D12018B7A027B007C01123B :040A3900015D80E1FA :020A3D0080FE39 :060157007A057B007CFF2D :0E015D007E017F007402CB13CB92E6CC13CC54 :0E016B0092E7907F96F0907F9BE030E003EEED :0E0179004207907F98E0D2E1F0C2E1F0EE2361 :04018700FEDAD722A3 :0E018B00758600901000782A7A08E0FB7C0050 :0E019900C082C08312015DD083D082EFF0A33C :0D01A700D8EA7A08E0FB7C80C082C0831299 :0901B400015DD083D082EFF0223E :0E01BD00C0E0C0F0C082C083C0D075D000C0CA :0E01CB0086758600C289D086D0D0D083D082BF :0501D900D0F0D0E0327F :0E01DE00C0E0C0F0C082C083C0D075D000C0A9 :0C01EC0086758600C28D0544E54454076A :0901F8007007907F98E06408F0A4 :0D020100D086D0D0D083D082D0F0D0E032B3 :0E020E00C0E0C0F0C082C083C0D075D000C078 :0E021C0086758600C28BD086D0D0D083D0826B :05022A00D0F0D0E0322D :0E022F00C0E0C0F0C082C083C0D075D000C057 :0E023D0086758600C28FD086D0D0D083D08246 :05024B00D0F0D0E0320C :0E025000C0E0C0F0C082C083C0D075D000C036 :0E025E0086758600C298C299D086D0D0D08313 :07026C00D082D0F0D0E03297 :0E027300C0E0C0F0C082C083C0D075D000C013 :0E02810086758600C2CFD086D0D0D083D082C2 :05028F00D0F0D0E032C8 :0E029400C0E0C0F0C082C083C0D075D000C0F2 :0E02A20086758600C2DCD086D0D0D083D08294 :0502B000D0F0D0E032A7 :0E02B500C0E0C0F0C082C083C0D075D000C0D1 :0E02C30086758600C2C0C2C1D086D0D0D0835E :0702D100D082D0F0D0E03232 :0E02D800C0E0C0F0C082C083C0D075D000C0AE :0E02E60086758600E591C2E5F591D086D0D0F0 :0902F400D083D082D0F0D0E032BA :0E02FD00C0E0C0F0C082C083C0D075D000C089 :0E030B0086758600E591C2E6F591D086D0D0C9 :09031900D083D082D0F0D0E03294 :0E032200C0E0C0F0C082C083C0D075D000C063 :0E03300086758600E591C2E7F591D086D0D0A3 :09033E00D083D082D0F0D0E0326F :0E034700C0E0C0F0C082C083C0D075D000C03E :0E03550086758600C2DBD086D0D0D083D082E1 :05036300D0F0D0E032F3 :08036800E549454A700AE4F57D :0C037000467402907FB4F022E549FF249F :0B037C00C0F549E54A34FF400AE4F5F3 :0903870049F54AEF60E18004F53C :090390004A7440FFF8854782859C :0D0399004883758601907F001586E0A3055E :0C03A60086F0A31586D8F6858247858373 :0703B20048EF907FB5F02237 :0E03B900C0E0C0F0C082C083C084C085C0D048 :0E03C70075D000C086758600C000C007E591A5 :0D03D500C2E4F591907FAB7401F075460015 :0E03E200907FE9E0B4B13E907FE8E0B4C03413 :0C03F000907F00E540F0A3E541F0A3E59C :0E03FC0081C082C083907FDFE0D083D082F08A :0E040A00A37400C082C083907FC8E0D083D06E :0C04180082F0A3907FB57404F00204FC95 :030424000204F8D7 :0E042700B4B22B907FE8E0B4C021907F00E5D6 :0804350040F0A3E541F0A3E54E :08043D0042F0A3E543F0A3E542 :0B04450045F0907FB57405F0054502FE :0204500004FCAA :030452000204F8A9 :0D045500B4B83DE540B420F5907FEEE0B472 :0B0462002BEEA3E0B400E97547007525 :03046D00481075BF :0C047000492B754A00907FE8E0B4400A78 :0D047C00754601907FC5F0020502B4C0096D :070489007546021203680230 :02049000050263 :030492000204F869 :0D049500B4B917907FE8E0B4C0F3E540B4BF :0D04A20020EE754021907FB5E4F00204FCCF :0D04AF00B4C819907FE8E0B4C00F74059048 :0C04BC007F00F0907FB57401F00204FC9A :0304C8000204F833 :0E04CB00B4C92A907FE8E0B4C020907F0005FD :0E04D900869000F27F06E0A3A31586F0A3052F :0E04E70086DFF515867406907FB5F00204FCE2 :0304F5000204F806 :0404F8007403800207 :0204FC00740288 :0404FE00907FB4F047 :0E050200D007D000D086D0D0D085D084D08352 :07051000D082D0F0D0E032F0 :0E051700C0E0C0F0C082C083C0D075D000C06C :0E05250086758600E591C2E4F591907FAB7477 :0E05330002F0D086D0D0D083D082D0F0D0E0BD :010541003287 :0E054200C0E0C0F0C082C083C0D075D000C041 :0E05500086758600E591C2E4F591907FAB744C :0E055E0004F0D086D0D0D083D082D0F0D0E090 :01056C00325C :0E056D00C0E0C0F0C082C083C0D075D000C016 :0E057B0086758600E591C2E4F591907FAB7421 :0E05890008F0D086D0D0D083D082D0F0D0E061 :010597003231 :0E059800C0E0C0F0C082C083C0D075D000C0EB :0E05A60086758600E591C2E4F591907FAB74F6 :0E05B40010F0D086D0D0D083D082D0F0D0E02E :0105C2003206 :0E05C300C0E0C0F0C082C083C084C085C0D03C :0E05D10075D000C086758600C000C007E59199 :0D05DF00C2E4F591907FA97401F0E546B4E7 :0E05EC0002051203688011907FB5E4F08004D0 :0405FA007403800204 :0205FE00740285 :04060000907FB4F043 :0E060400D007D000D086D0D0D085D084D0834F :07061200D082D0F0D0E032ED :0E061900C0E0C0F0C082C083C084C085C0D0E5 :0E06270075D000C086758600C007E591C2E45C :0D063500F591907FAA7401F0E546B40136FE :0C064200907FC5E06028FFC3E5499FF5EC :06064E0049E54A9400F5A5 :0A0654004A4021907EC0854784854E :0D065E004885E0A30586F0A31586DFF6852C :06066B008447858548E587 :0706710049454A60098010B1 :0706780075460074038005C4 :05067F00754600740245 :04068400907FB4F0BF :0E068800D007D086D0D0D085D084D083D08249 :05069600D0F0D0E032BD :0C069B00907E80E540F0A3E541F0A3E56F :0806A70042F0A3E543F0A3E5D6 :0B06AF0045F0907FB77405F005452270 :0E06BA00C0E0C0F0C082C083C0D075D000C0C8 :0E06C80086758600E591C2E4F591907FA974D5 :0E06D60002F012069BD086D0D0D083D082D006 :0406E400F0D0E03240 :0E06E800C0E0C0F0C082C083C0D075D000C09A :0E06F60086758600E591C2E4F591907FAA74A6 :0E07040002F0D086D0D0D083D082D0F0D0E0EA :0107120032B4 :0E071300C0E0C0F0C082C083C0D075D000C06E :0E07210086758600E591C2E4F591907FA9747B :0E072F0004F0D086D0D0D083D082D0F0D0E0BD :01073D003289 :0E073E00C0E0C0F0C082C083C0D075D000C043 :0E074C0086758600E591C2E4F591907FAA744F :0E075A0004F0D086D0D0D083D082D0F0D0E092 :01076800325E :0E076900C0E0C0F0C082C083C0D075D000C018 :0E07770086758600E591C2E4F591907FA97425 :0E07850008F0D086D0D0D083D082D0F0D0E063 :010793003233 :0E079400C0E0C0F0C082C083C0D075D000C0ED :0E07A20086758600E591C2E4F591907FAA74F9 :0E07B00008F0D086D0D0D083D082D0F0D0E038 :0107BE003208 :0E07BF00C0E0C0F0C082C083C0D075D000C0C2 :0E07CD0086758600E591C2E4F591907FA974CF :0E07DB0010F0D086D0D0D083D082D0F0D0E005 :0107E90032DD :0E07EA00C0E0C0F0C082C083C0D075D000C097 :0E07F80086758600E591C2E4F591907FAA74A3 :0E08060010F0D086D0D0D083D082D0F0D0E0D9 :0108140032B1 :0E081500C0E0C0F0C082C083C0D075D000C06B :0E08230086758600E591C2E4F591907FA97478 :0E08310020F0D086D0D0D083D082D0F0D0E09E :01083F003286 :0E084000C0E0C0F0C082C083C0D075D000C040 :0E084E0086758600E591C2E4F591907FAA744C :0E085C0020F0D086D0D0D083D082D0F0D0E073 :01086A00325B :0E086B00C0E0C0F0C082C083C0D075D000C015 :0E08790086758600E591C2E4F591907FA97422 :0E08870040F0D086D0D0D083D082D0F0D0E028 :010895003230 :0E089600C0E0C0F0C082C083C0D075D000C0EA :0E08A40086758600E591C2E4F591907FAA74F6 :0E08B20040F0D086D0D0D083D082D0F0D0E0FD :0108C0003205 :0E08C100C0E0C0F0C082C083C0D075D000C0BF :0E08CF0086758600E591C2E4F591907FA974CC :0E08DD0080F0D086D0D0D083D082D0F0D0E092 :0108EB0032DA :0E08EC00C0E0C0F0C082C083C0D075D000C094 :0E08FA0086758600E591C2E4F591907FAA74A0 :0E09080080F0D086D0D0D083D082D0F0D0E066 :0109160032AE :00000001FF baycomusb-0.10.orig/firmware/bscanfirmware/main.rel0100644000175100017510000004234007325134422020504 0ustar abaabaXH H A areas 2 global symbols M main A _CODE size 0 flags 0 A CODE size 157 flags 20 A CSEG size 7C0 flags 20 S xmemread Def0211 S fillusbintr Def0544 A GSINIT size 8 flags 20 A GSINIT2 size 120 flags 20 A OSEG size 0 flags 4 A BSEG size 0 flags 80 A ISEG size 80 flags 0 A DSEG size B flags 0 A XSEG size 2C flags 0 T 00 00 02 00 00 02 00 66 R 00 00 00 01 00 03 00 03 00 06 00 02 T 00 06 R 00 00 00 01 T 00 0B 02 00 87 R 00 00 00 01 00 03 00 02 T 00 0E R 00 00 00 01 T 00 13 02 00 B7 R 00 00 00 01 00 03 00 02 T 00 16 R 00 00 00 01 T 00 1B 02 00 D8 R 00 00 00 01 00 03 00 02 T 00 1E R 00 00 00 01 T 00 23 02 00 F9 R 00 00 00 01 00 03 00 02 T 00 26 R 00 00 00 01 T 00 2B 02 01 1C R 00 00 00 01 00 03 00 02 T 00 2E R 00 00 00 01 T 00 33 02 01 3D R 00 00 00 01 00 03 00 02 T 00 36 R 00 00 00 01 T 00 3B 02 01 5E R 00 00 00 01 00 03 00 02 T 00 3E R 00 00 00 01 T 00 43 02 01 00 R 00 00 00 01 00 03 00 01 T 00 46 R 00 00 00 01 T 00 4B 02 01 81 R 00 00 00 01 00 03 00 02 T 00 4E R 00 00 00 01 T 00 53 02 01 A6 R 00 00 00 01 00 03 00 02 T 00 56 R 00 00 00 01 T 00 5B 02 01 CB R 00 00 00 01 00 03 00 02 T 00 5E R 00 00 00 01 T 00 63 02 01 F0 R 00 00 00 01 00 03 00 02 T 00 66 R 00 00 00 01 T 00 F0 R 00 00 00 01 T 00 F0 0E 03 30 00 30 00 30 00 30 00 30 00 31 00 R 00 00 00 01 T 00 FE R 00 00 00 01 T 01 00 R 00 00 00 01 T 01 00 02 02 62 R 00 00 00 01 00 03 00 02 T 01 03 R 00 00 00 01 T 01 04 02 03 C0 R 00 00 00 01 00 03 00 02 T 01 07 R 00 00 00 01 T 01 08 02 03 EB R 00 00 00 01 00 03 00 02 T 01 0B R 00 00 00 01 T 01 0C 02 04 16 R 00 00 00 01 00 03 00 02 T 01 0F R 00 00 00 01 T 01 10 02 04 41 R 00 00 00 01 00 03 00 02 T 01 13 R 00 00 00 01 T 01 14 32 R 00 00 00 01 T 01 15 R 00 00 00 01 T 01 18 02 04 6C R 00 00 00 01 00 03 00 02 T 01 1B R 00 00 00 01 T 01 1C 02 04 C2 R 00 00 00 01 00 03 00 02 T 01 1F R 00 00 00 01 T 01 20 02 05 63 R 00 00 00 01 00 03 00 02 T 01 23 R 00 00 00 01 T 01 24 02 05 91 R 00 00 00 01 00 03 00 02 T 01 27 R 00 00 00 01 T 01 28 02 05 BC R 00 00 00 01 00 03 00 02 T 01 2B R 00 00 00 01 T 01 2C 02 05 E7 R 00 00 00 01 00 03 00 02 T 01 2F R 00 00 00 01 T 01 30 02 06 12 R 00 00 00 01 00 03 00 02 T 01 33 R 00 00 00 01 T 01 34 02 06 3D R 00 00 00 01 00 03 00 02 T 01 37 R 00 00 00 01 T 01 38 02 06 68 R 00 00 00 01 00 03 00 02 T 01 3B R 00 00 00 01 T 01 3C 02 06 93 R 00 00 00 01 00 03 00 02 T 01 3F R 00 00 00 01 T 01 40 02 06 BE R 00 00 00 01 00 03 00 02 T 01 43 R 00 00 00 01 T 01 44 02 06 E9 R 00 00 00 01 00 03 00 02 T 01 47 R 00 00 00 01 T 01 48 02 07 14 R 00 00 00 01 00 03 00 02 T 01 4B R 00 00 00 01 T 01 4C 02 07 3F R 00 00 00 01 00 03 00 02 T 01 4F R 00 00 00 01 T 01 50 02 07 6A R 00 00 00 01 00 03 00 02 T 01 53 R 00 00 00 01 T 01 54 02 07 95 R 00 00 00 01 00 03 00 02 T 00 00 R 00 00 00 07 T 00 00 R 00 00 00 08 T 00 01 R 00 00 00 08 T 00 02 R 00 00 00 08 T 00 04 R 00 00 00 08 T 00 05 R 00 00 00 08 T 00 06 R 00 00 00 08 T 00 07 R 00 00 00 08 T 00 09 R 00 00 00 08 T 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF R 00 00 00 09 T 00 0E FF FF FF CF FF FF FF FF FF FF FF FF 7F FF R 00 00 00 09 T 00 1C FF FF FF FF FF FF FF FF FF FF FF FF FF FF R 00 00 00 09 T 00 2A FF FF R 00 00 00 09 T 00 00 R 00 00 00 03 T 00 00 75 81 00 00 E4 F5 D0 F5 86 R 00 00 00 03 09 04 00 07 T 00 08 R 00 00 00 03 T 00 00 R 00 00 00 04 T 00 00 E4 F5 00 00 F5 00 01 F5 R 00 00 00 04 29 04 00 08 29 07 00 08 T 00 06 00 02 F5 00 03 F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 0A 00 05 F5 00 06 75 8E 31 75 89 21 75 88 55 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 16 75 8D 64 75 87 00 90 7F A1 74 01 F0 90 R 00 00 00 04 T 00 23 7F AF 74 01 F0 E4 90 7F E0 F0 90 7F E1 F0 R 00 00 00 04 T 00 31 90 7F DD 74 09 F0 90 7F DE 74 03 F0 90 R 00 00 00 04 T 00 3E 7F DF 74 05 F0 90 7F D7 74 12 F0 74 32 F0 R 00 00 00 04 T 00 4C 74 02 F0 74 22 F0 90 7F 93 74 00 F0 90 R 00 00 00 04 T 00 59 7F 96 74 80 F0 90 7F 9C 74 C2 F0 90 7F 94 R 00 00 00 04 T 00 67 74 00 F0 90 7F 9D 74 00 F0 90 7F 95 74 00 R 00 00 00 04 T 00 75 F0 90 7F 98 74 20 F0 90 7F 9E 74 2E F0 75 R 00 00 00 04 T 00 83 A8 82 75 E8 01 90 7F AE 74 01 F0 90 7F AC R 00 00 00 04 T 00 91 74 01 F0 90 7F AD 74 03 F0 75 98 20 75 99 R 00 00 00 04 T 00 9F FF 12 05 44 90 7F 96 74 82 F0 90 7F 99 E0 R 00 00 00 04 00 04 00 02 T 00 AD 30 E2 06 75 00 00 80 02 01 1E 12 R 00 00 00 04 29 06 00 08 00 0A 00 04 T 00 B7 00 00 7A 05 7B 00 7C 06 12 00 06 7A 08 7B R 00 00 00 04 00 02 00 02 00 0B 00 02 T 00 C5 00 7C 00 12 00 06 7A 08 7B 01 7C 00 12 R 00 00 00 04 00 06 00 02 T 00 D2 00 06 74 F8 2F 60 08 75 00 00 81 8F R 00 00 00 04 00 02 00 02 29 0A 00 08 T 00 DD 00 01 02 01 1E 7A 07 7B 01 7C 1C 12 R 00 00 00 04 29 02 00 08 00 05 00 04 T 00 E8 00 06 12 00 34 7A 05 7B 00 7C 07 12 R 00 00 00 04 00 02 00 02 00 05 00 02 T 00 F4 00 06 7A 05 7B 00 7C 0C 12 00 06 R 00 00 00 04 00 02 00 02 00 0B 00 02 T 00 FF R 00 00 00 04 T 00 FF 75 00 00 20 R 00 00 00 04 29 03 00 08 T 01 02 R 00 00 00 04 T 01 02 E5 00 00 B4 21 FB 7A 03 7B 00 7C 01 12 R 00 00 00 04 29 03 00 08 T 01 0E 00 06 12 00 34 7A 02 7B 00 7C 01 12 R 00 00 00 04 00 02 00 02 00 05 00 02 T 01 1A 00 06 80 E1 R 00 00 00 04 00 02 00 02 T 01 1E R 00 00 00 04 T 01 1E 80 FE R 00 00 00 04 T 00 00 R 00 00 00 02 T 00 00 7A 05 7B 00 7C FF R 00 00 00 02 T 00 06 R 00 00 00 02 T 00 06 R 00 00 00 02 T 00 06 7E 01 7F 00 74 02 CB 13 CB 92 E6 CC 13 CC R 00 00 00 02 T 00 14 92 E7 90 7F 96 F0 90 7F 9B E0 30 E0 03 EE R 00 00 00 02 T 00 22 42 07 90 7F 98 E0 D2 E1 F0 C2 E1 F0 EE 23 R 00 00 00 02 T 00 30 FE DA D7 22 R 00 00 00 02 T 00 34 R 00 00 00 02 T 00 34 75 86 00 90 00 00 78 2A 7A 08 E0 FB 7C 00 R 00 00 00 02 00 06 00 09 T 00 42 C0 82 C0 83 12 00 06 D0 83 D0 82 EF F0 A3 R 00 00 00 02 00 07 00 02 T 00 50 D8 EA 7A 08 E0 FB 7C 80 C0 82 C0 83 12 R 00 00 00 02 T 00 5D 00 06 D0 83 D0 82 EF F0 22 R 00 00 00 02 00 02 00 02 T 00 66 R 00 00 00 02 T 00 66 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 74 86 75 86 00 C2 89 D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 82 D0 F0 D0 E0 32 R 00 00 00 02 T 00 87 R 00 00 00 02 T 00 87 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 95 86 75 86 00 C2 8D 05 00 04 E5 00 04 54 07 R 00 00 00 02 29 09 00 08 29 0C 00 08 T 00 A1 70 07 90 7F 98 E0 64 08 F0 R 00 00 00 02 T 00 AA R 00 00 00 02 T 00 AA D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 00 B7 R 00 00 00 02 T 00 B7 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 C5 86 75 86 00 C2 8B D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 D3 D0 F0 D0 E0 32 R 00 00 00 02 T 00 D8 R 00 00 00 02 T 00 D8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 E6 86 75 86 00 C2 8F D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 F4 D0 F0 D0 E0 32 R 00 00 00 02 T 00 F9 R 00 00 00 02 T 00 F9 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 07 86 75 86 00 C2 98 C2 99 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 15 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 1C R 00 00 00 02 T 01 1C C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 2A 86 75 86 00 C2 CF D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 38 D0 F0 D0 E0 32 R 00 00 00 02 T 01 3D R 00 00 00 02 T 01 3D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 4B 86 75 86 00 C2 DC D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 59 D0 F0 D0 E0 32 R 00 00 00 02 T 01 5E R 00 00 00 02 T 01 5E C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 6C 86 75 86 00 C2 C0 C2 C1 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 7A D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 81 R 00 00 00 02 T 01 81 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 8F 86 75 86 00 E5 91 C2 E5 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 9D D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 A6 R 00 00 00 02 T 01 A6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 B4 86 75 86 00 E5 91 C2 E6 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 C2 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 CB R 00 00 00 02 T 01 CB C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 D9 86 75 86 00 E5 91 C2 E7 F5 91 D0 86 D0 D0 R 00 00 00 02 T 01 E7 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 F0 R 00 00 00 02 T 01 F0 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 FE 86 75 86 00 C2 DB D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 02 0C D0 F0 D0 E0 32 R 00 00 00 02 T 02 11 R 00 00 00 02 T 02 11 E5 00 09 45 00 0A 70 0A E4 F5 R 00 00 00 02 29 03 00 08 29 06 00 08 T 02 19 00 06 74 02 90 7F B4 F0 22 E5 00 09 FF 24 R 00 00 00 02 29 02 00 08 29 0C 00 08 T 02 25 C0 F5 00 09 E5 00 0A 34 FF 40 0A E4 F5 R 00 00 00 02 29 04 00 08 29 07 00 08 T 02 30 00 09 F5 00 0A EF 60 E1 80 04 F5 R 00 00 00 02 29 02 00 08 29 05 00 08 T 02 39 00 0A 74 40 FF F8 85 00 07 82 85 R 00 00 00 02 29 02 00 08 29 09 00 08 T 02 42 00 08 83 75 86 01 90 7F 00 15 86 E0 A3 05 R 00 00 00 02 29 02 00 08 T 02 4F 86 F0 A3 15 86 D8 F6 85 82 00 07 85 83 R 00 00 00 02 29 0B 00 08 T 02 5B 00 08 EF 90 7F B5 F0 22 R 00 00 00 02 29 02 00 08 T 02 62 R 00 00 00 02 T 02 62 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 02 70 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 02 7E C2 E4 F5 91 90 7F AB 74 01 F0 75 00 06 00 R 00 00 00 02 29 0D 00 08 T 02 8B 90 7F E9 E0 B4 B1 3E 90 7F E8 E0 B4 C0 34 R 00 00 00 02 T 02 99 90 7F 00 E5 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 06 00 08 29 0B 00 08 T 02 A5 81 C0 82 C0 83 90 7F DF E0 D0 83 D0 82 F0 R 00 00 00 02 T 02 B3 A3 74 00 C0 82 C0 83 90 7F C8 E0 D0 83 D0 R 00 00 00 02 T 02 C1 82 F0 A3 90 7F B5 74 04 F0 02 03 A5 R 00 00 00 02 00 0C 00 02 T 02 CD R 00 00 00 02 T 02 CD 02 03 A1 R 00 00 00 02 00 03 00 02 T 02 D0 R 00 00 00 02 T 02 D0 B4 B2 2B 90 7F E8 E0 B4 C0 21 90 7F 00 E5 R 00 00 00 02 T 02 DE 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 02 E6 00 02 F0 A3 E5 00 03 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 02 EE 00 05 F0 90 7F B5 74 05 F0 05 00 05 02 R 00 00 00 02 29 02 00 08 29 0C 00 08 T 02 F9 03 A5 R 00 00 00 02 00 02 00 02 T 02 FB R 00 00 00 02 T 02 FB 02 03 A1 R 00 00 00 02 00 03 00 02 T 02 FE R 00 00 00 02 T 02 FE B4 B8 3D E5 00 00 B4 20 F5 90 7F EE E0 B4 R 00 00 00 02 29 06 00 08 T 03 0B 2B EE A3 E0 B4 00 E9 75 00 07 00 00 75 R 00 00 00 02 29 0A 00 08 09 0C 00 09 T 03 16 00 08 00 00 75 R 00 00 00 02 29 02 00 08 89 04 00 09 T 03 19 00 09 2B 75 00 0A 00 90 7F E8 E0 B4 40 0A R 00 00 00 02 29 02 00 08 29 06 00 08 T 03 25 75 00 06 01 90 7F C5 F0 02 03 AB B4 C0 09 R 00 00 00 02 29 03 00 08 00 0B 00 02 T 03 32 75 00 06 02 12 02 11 02 R 00 00 00 02 29 03 00 08 00 07 00 02 T 03 39 03 AB R 00 00 00 02 00 02 00 02 T 03 3B R 00 00 00 02 T 03 3B 02 03 A1 R 00 00 00 02 00 03 00 02 T 03 3E R 00 00 00 02 T 03 3E B4 B9 17 90 7F E8 E0 B4 C0 F3 E5 00 00 B4 R 00 00 00 02 29 0D 00 08 T 03 4B 20 EE 75 00 00 21 90 7F B5 E4 F0 02 03 A5 R 00 00 00 02 29 05 00 08 00 0E 00 02 T 03 58 R 00 00 00 02 T 03 58 B4 C8 19 90 7F E8 E0 B4 C0 0F 74 05 90 R 00 00 00 02 T 03 65 7F 00 F0 90 7F B5 74 01 F0 02 03 A5 R 00 00 00 02 00 0C 00 02 T 03 71 R 00 00 00 02 T 03 71 02 03 A1 R 00 00 00 02 00 03 00 02 T 03 74 R 00 00 00 02 T 03 74 B4 C9 2A 90 7F E8 E0 B4 C0 20 90 7F 00 05 R 00 00 00 02 T 03 82 86 90 00 F2 7F 06 E0 A3 A3 15 86 F0 A3 05 R 00 00 00 02 00 04 00 01 T 03 90 86 DF F5 15 86 74 06 90 7F B5 F0 02 03 A5 R 00 00 00 02 00 0E 00 02 T 03 9E R 00 00 00 02 T 03 9E 02 03 A1 R 00 00 00 02 00 03 00 02 T 03 A1 R 00 00 00 02 T 03 A1 R 00 00 00 02 T 03 A1 74 03 80 02 R 00 00 00 02 T 03 A5 R 00 00 00 02 T 03 A5 74 02 R 00 00 00 02 T 03 A7 R 00 00 00 02 T 03 A7 90 7F B4 F0 R 00 00 00 02 T 03 AB R 00 00 00 02 T 03 AB D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 03 B9 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 03 C0 R 00 00 00 02 T 03 C0 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 CE 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 03 DC 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 03 EA 32 R 00 00 00 02 T 03 EB R 00 00 00 02 T 03 EB C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 F9 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 04 07 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 04 15 32 R 00 00 00 02 T 04 16 R 00 00 00 02 T 04 16 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 24 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 04 32 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 04 40 32 R 00 00 00 02 T 04 41 R 00 00 00 02 T 04 41 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 4F 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 04 5D 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 04 6B 32 R 00 00 00 02 T 04 6C R 00 00 00 02 T 04 6C C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 04 7A 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 04 88 C2 E4 F5 91 90 7F A9 74 01 F0 E5 00 06 B4 R 00 00 00 02 29 0D 00 08 T 04 95 02 05 12 02 11 80 11 90 7F B5 E4 F0 80 04 R 00 00 00 02 00 05 00 02 T 04 A3 R 00 00 00 02 T 04 A3 74 03 80 02 R 00 00 00 02 T 04 A7 R 00 00 00 02 T 04 A7 74 02 R 00 00 00 02 T 04 A9 R 00 00 00 02 T 04 A9 90 7F B4 F0 R 00 00 00 02 T 04 AD R 00 00 00 02 T 04 AD D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 04 BB D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 04 C2 R 00 00 00 02 T 04 C2 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 04 D0 75 D0 00 C0 86 75 86 00 C0 07 E5 91 C2 E4 R 00 00 00 02 T 04 DE F5 91 90 7F AA 74 01 F0 E5 00 06 B4 01 36 R 00 00 00 02 29 0B 00 08 T 04 EB 90 7F C5 E0 60 28 FF C3 E5 00 09 9F F5 R 00 00 00 02 29 0B 00 08 T 04 F7 00 09 E5 00 0A 94 00 F5 R 00 00 00 02 29 02 00 08 29 05 00 08 T 04 FD 00 0A 40 21 90 7E C0 85 00 07 84 85 R 00 00 00 02 29 02 00 08 29 0A 00 08 T 05 07 00 08 85 E0 A3 05 86 F0 A3 15 86 DF F6 85 R 00 00 00 02 29 02 00 08 T 05 14 84 00 07 85 85 00 08 E5 R 00 00 00 02 29 03 00 08 29 07 00 08 T 05 1A 00 09 45 00 0A 60 09 80 10 R 00 00 00 02 29 02 00 08 29 05 00 08 T 05 21 R 00 00 00 02 T 05 21 75 00 06 00 74 03 80 05 R 00 00 00 02 29 03 00 08 T 05 28 R 00 00 00 02 T 05 28 75 00 06 00 74 02 R 00 00 00 02 29 03 00 08 T 05 2D R 00 00 00 02 T 05 2D 90 7F B4 F0 R 00 00 00 02 T 05 31 R 00 00 00 02 T 05 31 D0 07 D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 R 00 00 00 02 T 05 3F D0 F0 D0 E0 32 R 00 00 00 02 T 05 44 R 00 00 00 02 T 05 44 90 7E 80 E5 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 06 00 08 29 0B 00 08 T 05 50 00 02 F0 A3 E5 00 03 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 05 58 00 05 F0 90 7F B7 74 05 F0 05 00 05 22 R 00 00 00 02 29 02 00 08 29 0C 00 08 T 05 63 R 00 00 00 02 T 05 63 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 05 71 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 05 7F 02 F0 12 05 44 D0 86 D0 D0 D0 83 D0 82 D0 R 00 00 00 02 00 05 00 02 T 05 8D F0 D0 E0 32 R 00 00 00 02 T 05 91 R 00 00 00 02 T 05 91 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 05 9F 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 05 AD 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 05 BB 32 R 00 00 00 02 T 05 BC R 00 00 00 02 T 05 BC C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 05 CA 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 05 D8 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 05 E6 32 R 00 00 00 02 T 05 E7 R 00 00 00 02 T 05 E7 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 05 F5 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 06 03 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 11 32 R 00 00 00 02 T 06 12 R 00 00 00 02 T 06 12 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 20 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 06 2E 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 3C 32 R 00 00 00 02 T 06 3D R 00 00 00 02 T 06 3D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 4B 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 06 59 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 67 32 R 00 00 00 02 T 06 68 R 00 00 00 02 T 06 68 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 76 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 06 84 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 92 32 R 00 00 00 02 T 06 93 R 00 00 00 02 T 06 93 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 A1 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 06 AF 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 BD 32 R 00 00 00 02 T 06 BE R 00 00 00 02 T 06 BE C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 CC 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 06 DA 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 E8 32 R 00 00 00 02 T 06 E9 R 00 00 00 02 T 06 E9 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 F7 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 07 05 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 13 32 R 00 00 00 02 T 07 14 R 00 00 00 02 T 07 14 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 22 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 30 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 3E 32 R 00 00 00 02 T 07 3F R 00 00 00 02 T 07 3F C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 4D 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 07 5B 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 69 32 R 00 00 00 02 T 07 6A R 00 00 00 02 T 07 6A C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 78 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 86 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 94 32 R 00 00 00 02 T 07 95 R 00 00 00 02 T 07 95 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 A3 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 07 B1 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 BF 32 R 00 00 00 02 baycomusb-0.10.orig/firmware/bscanfirmware/main.lst0100644000175100017510000024501207325134422020525 0ustar abaaba 1 .module main 2 3 ;; define code segments link order 4 .area CODE (CODE) 5 .area CSEG (CODE) 6 .area GSINIT (CODE) 7 .area GSINIT2 (CODE) 8 9 ;; ----------------------------------------------------- 10 11 ;; special function registers (which are not predefined) 0082 12 dpl0 = 0x82 0083 13 dph0 = 0x83 0084 14 dpl1 = 0x84 0085 15 dph1 = 0x85 0086 16 dps = 0x86 008E 17 ckcon = 0x8E 008F 18 spc_fnc = 0x8F 0091 19 exif = 0x91 0092 20 mpage = 0x92 0098 21 scon0 = 0x98 0099 22 sbuf0 = 0x99 00C0 23 scon1 = 0xC0 00C1 24 sbuf1 = 0xC1 00D8 25 eicon = 0xD8 00E8 26 eie = 0xE8 00F8 27 eip = 0xF8 28 29 ;; anchor xdata registers 7F00 30 IN0BUF = 0x7F00 7EC0 31 OUT0BUF = 0x7EC0 7E80 32 IN1BUF = 0x7E80 7E40 33 OUT1BUF = 0x7E40 7E00 34 IN2BUF = 0x7E00 7DC0 35 OUT2BUF = 0x7DC0 7D80 36 IN3BUF = 0x7D80 7D40 37 OUT3BUF = 0x7D40 7D00 38 IN4BUF = 0x7D00 7CC0 39 OUT4BUF = 0x7CC0 7C80 40 IN5BUF = 0x7C80 7C40 41 OUT5BUF = 0x7C40 7C00 42 IN6BUF = 0x7C00 7BC0 43 OUT6BUF = 0x7BC0 7B80 44 IN7BUF = 0x7B80 7B40 45 OUT7BUF = 0x7B40 7FE8 46 SETUPBUF = 0x7FE8 7FE8 47 SETUPDAT = 0x7FE8 48 7FB4 49 EP0CS = 0x7FB4 7FB5 50 IN0BC = 0x7FB5 7FB6 51 IN1CS = 0x7FB6 7FB7 52 IN1BC = 0x7FB7 7FB8 53 IN2CS = 0x7FB8 7FB9 54 IN2BC = 0x7FB9 7FBA 55 IN3CS = 0x7FBA 7FBB 56 IN3BC = 0x7FBB 7FBC 57 IN4CS = 0x7FBC 7FBD 58 IN4BC = 0x7FBD 7FBE 59 IN5CS = 0x7FBE 7FBF 60 IN5BC = 0x7FBF 7FC0 61 IN6CS = 0x7FC0 7FC1 62 IN6BC = 0x7FC1 7FC2 63 IN7CS = 0x7FC2 7FC3 64 IN7BC = 0x7FC3 7FC5 65 OUT0BC = 0x7FC5 7FC6 66 OUT1CS = 0x7FC6 7FC7 67 OUT1BC = 0x7FC7 7FC8 68 OUT2CS = 0x7FC8 7FC9 69 OUT2BC = 0x7FC9 7FCA 70 OUT3CS = 0x7FCA 7FCB 71 OUT3BC = 0x7FCB 7FCC 72 OUT4CS = 0x7FCC 7FCD 73 OUT4BC = 0x7FCD 7FCE 74 OUT5CS = 0x7FCE 7FCF 75 OUT5BC = 0x7FCF 7FD0 76 OUT6CS = 0x7FD0 7FD1 77 OUT6BC = 0x7FD1 7FD2 78 OUT7CS = 0x7FD2 7FD3 79 OUT7BC = 0x7FD3 80 7FA8 81 IVEC = 0x7FA8 7FA9 82 IN07IRQ = 0x7FA9 7FAA 83 OUT07IRQ = 0x7FAA 7FAB 84 USBIRQ = 0x7FAB 7FAC 85 IN07IEN = 0x7FAC 7FAD 86 OUT07IEN = 0x7FAD 7FAE 87 USBIEN = 0x7FAE 7FAF 88 USBBAV = 0x7FAF 7FB2 89 BPADDRH = 0x7FB2 7FB3 90 BPADDRL = 0x7FB3 91 7FD4 92 SUDPTRH = 0x7FD4 7FD5 93 SUDPTRL = 0x7FD5 7FD6 94 USBCS = 0x7FD6 7FD7 95 TOGCTL = 0x7FD7 7FD8 96 USBFRAMEL = 0x7FD8 7FD9 97 USBFRAMEH = 0x7FD9 7FDB 98 FNADDR = 0x7FDB 7FDD 99 USBPAIR = 0x7FDD 7FDE 100 IN07VAL = 0x7FDE 7FDF 101 OUT07VAL = 0x7FDF 7FE3 102 AUTOPTRH = 0x7FE3 7FE4 103 AUTOPTRL = 0x7FE4 7FE5 104 AUTODATA = 0x7FE5 105 106 ;; isochronous endpoints. only available if ISODISAB=0 107 7F60 108 OUT8DATA = 0x7F60 7F61 109 OUT9DATA = 0x7F61 7F62 110 OUT10DATA = 0x7F62 7F63 111 OUT11DATA = 0x7F63 7F64 112 OUT12DATA = 0x7F64 7F65 113 OUT13DATA = 0x7F65 7F66 114 OUT14DATA = 0x7F66 7F67 115 OUT15DATA = 0x7F67 116 7F68 117 IN8DATA = 0x7F68 7F69 118 IN9DATA = 0x7F69 7F6A 119 IN10DATA = 0x7F6A 7F6B 120 IN11DATA = 0x7F6B 7F6C 121 IN12DATA = 0x7F6C 7F6D 122 IN13DATA = 0x7F6D 7F6E 123 IN14DATA = 0x7F6E 7F6F 124 IN15DATA = 0x7F6F 125 7F70 126 OUT8BCH = 0x7F70 7F71 127 OUT8BCL = 0x7F71 7F72 128 OUT9BCH = 0x7F72 7F73 129 OUT9BCL = 0x7F73 7F74 130 OUT10BCH = 0x7F74 7F75 131 OUT10BCL = 0x7F75 7F76 132 OUT11BCH = 0x7F76 7F77 133 OUT11BCL = 0x7F77 7F78 134 OUT12BCH = 0x7F78 7F79 135 OUT12BCL = 0x7F79 7F7A 136 OUT13BCH = 0x7F7A 7F7B 137 OUT13BCL = 0x7F7B 7F7C 138 OUT14BCH = 0x7F7C 7F7D 139 OUT14BCL = 0x7F7D 7F7E 140 OUT15BCH = 0x7F7E 7F7F 141 OUT15BCL = 0x7F7F 142 7FF0 143 OUT8ADDR = 0x7FF0 7FF1 144 OUT9ADDR = 0x7FF1 7FF2 145 OUT10ADDR = 0x7FF2 7FF3 146 OUT11ADDR = 0x7FF3 7FF4 147 OUT12ADDR = 0x7FF4 7FF5 148 OUT13ADDR = 0x7FF5 7FF6 149 OUT14ADDR = 0x7FF6 7FF7 150 OUT15ADDR = 0x7FF7 7FF8 151 IN8ADDR = 0x7FF8 7FF9 152 IN9ADDR = 0x7FF9 7FFA 153 IN10ADDR = 0x7FFA 7FFB 154 IN11ADDR = 0x7FFB 7FFC 155 IN12ADDR = 0x7FFC 7FFD 156 IN13ADDR = 0x7FFD 7FFE 157 IN14ADDR = 0x7FFE 7FFF 158 IN15ADDR = 0x7FFF 159 7FA0 160 ISOERR = 0x7FA0 7FA1 161 ISOCTL = 0x7FA1 7FA2 162 ZBCOUNT = 0x7FA2 7FE0 163 INISOVAL = 0x7FE0 7FE1 164 OUTISOVAL = 0x7FE1 7FE2 165 FASTXFR = 0x7FE2 166 167 ;; CPU control registers 168 7F92 169 CPUCS = 0x7F92 170 171 ;; IO port control registers 172 7F93 173 PORTACFG = 0x7F93 7F94 174 PORTBCFG = 0x7F94 7F95 175 PORTCCFG = 0x7F95 7F96 176 OUTA = 0x7F96 7F97 177 OUTB = 0x7F97 7F98 178 OUTC = 0x7F98 7F99 179 PINSA = 0x7F99 7F9A 180 PINSB = 0x7F9A 7F9B 181 PINSC = 0x7F9B 7F9C 182 OEA = 0x7F9C 7F9D 183 OEB = 0x7F9D 7F9E 184 OEC = 0x7F9E 185 186 ;; I2C controller registers 187 7FA5 188 I2CS = 0x7FA5 7FA6 189 I2DAT = 0x7FA6 190 191 ;; FPGA defines 0003 192 XC4K_IRLENGTH = 3 0000 193 XC4K_EXTEST = 0 0001 194 XC4K_PRELOAD = 1 0005 195 XC4K_CONFIGURE = 5 0007 196 XC4K_BYPASS = 7 197 2E64 198 FPGA_CONFIGSIZE = 11876 0158 199 FPGA_BOUND = 344 ; in bits 002A 200 FPGA_BOUND_BYTES = ((FPGA_BOUND-1)/8) 0008 201 FPGA_BOUND_RESIDUE = (FPGA_BOUND-8*FPGA_BOUND_BYTES) 002B 202 FPGA_BOUND_BSIZE = ((FPGA_BOUND+7)/8) 203 204 205 ;; ----------------------------------------------------- 206 207 .area CODE (CODE) 0000 02s00r00 208 ljmp startup 0003 02s00r66 209 ljmp int0_isr 0006 210 .ds 5 000B 02s00r87 211 ljmp timer0_isr 000E 212 .ds 5 0013 02s00rB7 213 ljmp int1_isr 0016 214 .ds 5 001B 02s00rD8 215 ljmp timer1_isr 001E 216 .ds 5 0023 02s00rF9 217 ljmp ser0_isr 0026 218 .ds 5 002B 02s01r1C 219 ljmp timer2_isr 002E 220 .ds 5 0033 02s01r3D 221 ljmp resume_isr 0036 222 .ds 5 003B 02s01r5E 223 ljmp ser1_isr 003E 224 .ds 5 0043 02s01r00 225 ljmp usb_isr 0046 226 .ds 5 004B 02s01r81 227 ljmp i2c_isr 004E 228 .ds 5 0053 02s01rA6 229 ljmp int4_isr 0056 230 .ds 5 005B 02s01rCB 231 ljmp int5_isr 005E 232 .ds 5 0063 02s01rF0 233 ljmp int6_isr 0066 234 .ds 0x8a 235 00F0 236 stringserial: 00F0 0E 237 .db stringserialsz ; bLength 00F1 03 238 .db USB_DT_STRING ; bDescriptorType 00F2 30 00 30 00 30 00 239 .db '0,0,'0,0,'0,0,'0,0,'0,0,'1,0 30 00 30 00 31 00 000E 240 stringserialsz = . - stringserial 00FE 241 .ds 0x10-stringserialsz 242 0100 243 usb_isr: 0100 02s02r62 244 ljmp usb_sudav_isr 0103 245 .ds 1 0104 02s03rC0 246 ljmp usb_sof_isr 0107 247 .ds 1 0108 02s03rEB 248 ljmp usb_sutok_isr 010B 249 .ds 1 010C 02s04r16 250 ljmp usb_suspend_isr 010F 251 .ds 1 0110 02s04r41 252 ljmp usb_usbreset_isr 0113 253 .ds 1 0114 32 254 reti 0115 255 .ds 3 0118 02s04r6C 256 ljmp usb_ep0in_isr 011B 257 .ds 1 011C 02s04rC2 258 ljmp usb_ep0out_isr 011F 259 .ds 1 0120 02s05r63 260 ljmp usb_ep1in_isr 0123 261 .ds 1 0124 02s05r91 262 ljmp usb_ep1out_isr 0127 263 .ds 1 0128 02s05rBC 264 ljmp usb_ep2in_isr 012B 265 .ds 1 012C 02s05rE7 266 ljmp usb_ep2out_isr 012F 267 .ds 1 0130 02s06r12 268 ljmp usb_ep3in_isr 0133 269 .ds 1 0134 02s06r3D 270 ljmp usb_ep3out_isr 0137 271 .ds 1 0138 02s06r68 272 ljmp usb_ep4in_isr 013B 273 .ds 1 013C 02s06r93 274 ljmp usb_ep4out_isr 013F 275 .ds 1 0140 02s06rBE 276 ljmp usb_ep5in_isr 0143 277 .ds 1 0144 02s06rE9 278 ljmp usb_ep5out_isr 0147 279 .ds 1 0148 02s07r14 280 ljmp usb_ep6in_isr 014B 281 .ds 1 014C 02s07r3F 282 ljmp usb_ep6out_isr 014F 283 .ds 1 0150 02s07r6A 284 ljmp usb_ep7in_isr 0153 285 .ds 1 0154 02s07r95 286 ljmp usb_ep7out_isr 287 288 ;; ----------------------------------------------------- 289 290 .area OSEG (OVR,DATA) 291 .area BSEG (BIT) 292 293 294 .area ISEG (DATA) 0000 295 stack: .ds 0x80 296 297 .area DSEG (DATA) 0000 298 errcode: .ds 1 0001 299 errval: .ds 1 0002 300 cfgcount: .ds 2 0004 301 leddiv: .ds 1 0005 302 irqcount: .ds 1 0006 303 ctrlcode: .ds 1 0007 304 ctrladdr: .ds 2 0009 305 ctrllen: .ds 2 306 307 .area XSEG (DATA) 0000 FF FF FF FF FF FF 308 fpgabound: .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff FF FF 0008 FF FF FF FF FF FF 309 .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff FF FF 0010 FF CF FF FF FF FF 310 .db 0xff,0xcf,0xff,0xff,0xff,0xff,0xff,0xff FF FF 0018 FF FF 7F FF FF FF 311 .db 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff FF FF 0020 FF FF FF FF FF FF 312 .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff FF FF 0028 FF FF FF FF 313 .db 0xff,0xff,0xff,0xff 314 315 .area GSINIT (CODE) 0000 316 startup: 0000 75 81r00 317 mov sp,#stack ; -1 0003 E4 318 clr a 0004 F5 D0 319 mov psw,a 0006 F5 86 320 mov dps,a 321 ;lcall __sdcc_external_startup 322 ;mov a,dpl0 323 ;jz __sdcc_init_data 324 ;ljmp __sdcc_program_startup 0008 325 __sdcc_init_data: 326 327 .area GSINIT2 (CODE) 328 0002 329 ar2 = 0x02 0003 330 ar3 = 0x03 0004 331 ar4 = 0x04 0005 332 ar5 = 0x05 0006 333 ar6 = 0x06 0007 334 ar7 = 0x07 0000 335 ar0 = 0x00 0001 336 ar1 = 0x01 337 0000 338 __sdcc_program_startup: 339 ;; assembler code startup 0000 E4 340 clr a 0001 F5*00 341 mov errcode,a 0003 F5*01 342 mov errval,a 0005 F5*02 343 mov cfgcount,a 0007 F5*03 344 mov cfgcount+1,a 0009 F5*05 345 mov irqcount,a 000B F5*06 346 mov ctrlcode,a 347 ;; some indirect register setup 000D 75 8E 31 348 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 349 ;; Timer setup: 350 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 351 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0010 75 89 21 352 mov tmod,#0x21 0013 75 88 55 353 mov tcon,#0x55 ; INT0/INT1 edge 0016 75 8D 64 354 mov th1,#256-156 ; 1200 bauds 0019 75 87 00 355 mov pcon,#0 ; SMOD0=0 356 ;; init USB subsystem 001C 90 7F A1 357 mov dptr,#ISOCTL 001F 74 01 358 mov a,#1 ; disable ISO endpoints 0021 F0 359 movx @dptr,a 0022 90 7F AF 360 mov dptr,#USBBAV 0025 74 01 361 mov a,#1 ; enable autovector, disable breakpoint logic 0027 F0 362 movx @dptr,a 0028 E4 363 clr a 0029 90 7F E0 364 mov dptr,#INISOVAL 002C F0 365 movx @dptr,a 002D 90 7F E1 366 mov dptr,#OUTISOVAL 0030 F0 367 movx @dptr,a 0031 90 7F DD 368 mov dptr,#USBPAIR 0034 74 09 369 mov a,#0x9 ; pair EP 2&3 for input & output 0036 F0 370 movx @dptr,a 0037 90 7F DE 371 mov dptr,#IN07VAL 003A 74 03 372 mov a,#0x3 ; enable EP0+EP1 003C F0 373 movx @dptr,a 003D 90 7F DF 374 mov dptr,#OUT07VAL 0040 74 05 375 mov a,#0x5 ; enable EP0+EP2 0042 F0 376 movx @dptr,a 377 ;; USB: init endpoint toggles 0043 90 7F D7 378 mov dptr,#TOGCTL 0046 74 12 379 mov a,#0x12 0048 F0 380 movx @dptr,a 0049 74 32 381 mov a,#0x32 ; clear EP 2 in toggle 004B F0 382 movx @dptr,a 004C 74 02 383 mov a,#0x02 004E F0 384 movx @dptr,a 004F 74 22 385 mov a,#0x22 ; clear EP 2 out toggle 0051 F0 386 movx @dptr,a 387 ;; configure IO ports 0052 90 7F 93 388 mov dptr,#PORTACFG 0055 74 00 389 mov a,#0 0057 F0 390 movx @dptr,a 0058 90 7F 96 391 mov dptr,#OUTA 005B 74 80 392 mov a,#0x80 ; set PROG lo 005D F0 393 movx @dptr,a 005E 90 7F 9C 394 mov dptr,#OEA 0061 74 C2 395 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0063 F0 396 movx @dptr,a 0064 90 7F 94 397 mov dptr,#PORTBCFG 0067 74 00 398 mov a,#0 0069 F0 399 movx @dptr,a 006A 90 7F 9D 400 mov dptr,#OEB 006D 74 00 401 mov a,#0 006F F0 402 movx @dptr,a 0070 90 7F 95 403 mov dptr,#PORTCCFG 0073 74 00 404 mov a,#0 0075 F0 405 movx @dptr,a 0076 90 7F 98 406 mov dptr,#OUTC 0079 74 20 407 mov a,#0x20 007B F0 408 movx @dptr,a 007C 90 7F 9E 409 mov dptr,#OEC 007F 74 2E 410 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 0081 F0 411 movx @dptr,a 412 ;; enable interrupts 0082 75 A8 82 413 mov ie,#0x82 ; enable timer 0 int 0085 75 E8 01 414 mov eie,#0x01 ; enable USB interrupts 0088 90 7F AE 415 mov dptr,#USBIEN 008B 74 01 416 mov a,#1 ; enable SUDAV interrupt 008D F0 417 movx @dptr,a 008E 90 7F AC 418 mov dptr,#IN07IEN 0091 74 01 419 mov a,#1 ; enable EP0 interrupt 0093 F0 420 movx @dptr,a 0094 90 7F AD 421 mov dptr,#OUT07IEN 0097 74 03 422 mov a,#3 ; enable EP0+EP1 interrupt 0099 F0 423 movx @dptr,a 424 ;; initialize UART 0 for config loading 009A 75 98 20 425 mov scon0,#0x20 ; mode 0, CLK24/4 009D 75 99 FF 426 mov sbuf0,#0xff 427 ;; initialize EP1 IN (irq) 00A0 12s05r44 428 lcall fillusbintr 429 430 ;; some short delay 00A3 90 7F 96 431 mov dptr,#OUTA 00A6 74 82 432 mov a,#0x82 ; set PROG hi 00A8 F0 433 movx @dptr,a 00A9 90 7F 99 434 mov dptr,#PINSA 00AC E0 435 movx a,@dptr 00AD 30 E2 06 436 jnb acc.2,1$ 437 ;; DONE stuck high 00B0 75*00 80 438 mov errcode,#0x80 00B3 02s01r1E 439 ljmp fpgaerr 00B6 12s00r00 440 1$: lcall jtag_reset_tap 00B9 7A 05 441 mov r2,#5 00BB 7B 00 442 mov r3,#0 00BD 7C 06 443 mov r4,#6 00BF 12s00r06 444 lcall jtag_shiftout ; enter SHIFT-IR state 00C2 7A 08 445 mov r2,#8 00C4 7B 00 446 mov r3,#0 00C6 7C 00 447 mov r4,#0 00C8 12s00r06 448 lcall jtag_shiftout ; assume max. 8bit IR 00CB 7A 08 449 mov r2,#8 00CD 7B 01 450 mov r3,#1 00CF 7C 00 451 mov r4,#0 00D1 12s00r06 452 lcall jtag_shift ; shift in a single bit 00D4 74 F8 453 mov a,#-(1<>8,setupstallb2 0312 75*07r00 998 mov ctrladdr,#fpgabound 0315 75*08s00 999 mov ctrladdr+1,#fpgabound>>8 0318 75*09 2B 1000 mov ctrllen,#FPGA_BOUND_BSIZE 031B 75*0A 00 1001 mov ctrllen+1,#FPGA_BOUND_BSIZE>>8 031E 90 7F E8 1002 mov dptr,#SETUPDAT ; bRequestType == 0x40 0321 E0 1003 movx a,@dptr 0322 B4 40 0A 1004 cjne a,#0x40,1$ 0325 75*06 01 1005 mov ctrlcode,#1 0328 90 7F C5 1006 mov dptr,#OUT0BC 032B F0 1007 movx @dptr,a 032C 02s03rAB 1008 ljmp endusbisr 032F B4 C0 09 1009 1$: cjne a,#0xc0,setupstallb8 ; bRequestType == 0xc0 0332 75*06 02 1010 mov ctrlcode,#2 0335 12s02r11 1011 lcall xmemread 0338 02s03rAB 1012 ljmp endusbisr 033B 1013 setupstallb8: 033B 02s03rA1 1014 ljmp setupstall 033E 1015 cmdnotb8: 1016 ;; 0xb9 033E B4 B9 17 1017 cjne a,#0xb9,cmdnotb9 0341 90 7F E8 1018 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0344 E0 1019 movx a,@dptr 0345 B4 C0 F3 1020 cjne a,#0xc0,setupstallb8 0348 E5*00 1021 mov a,errcode 034A B4 20 EE 1022 cjne a,#0x20,setupstallb8 034D 75*00 21 1023 mov errcode,#0x21 0350 90 7F B5 1024 mov dptr,#IN0BC 0353 E4 1025 clr a 0354 F0 1026 movx @dptr,a 0355 02s03rA5 1027 ljmp setupack 0358 1028 cmdnotb9: 1029 ;; 0xc8 0358 B4 C8 19 1030 cjne a,#0xc8,cmdnotc8 035B 90 7F E8 1031 mov dptr,#SETUPDAT ; bRequestType == 0xc0 035E E0 1032 movx a,@dptr 035F B4 C0 0F 1033 cjne a,#0xc0,setupstallc8 0362 74 05 1034 mov a,#5 0364 90 7F 00 1035 mov dptr,#IN0BUF 0367 F0 1036 movx @dptr,a 0368 90 7F B5 1037 mov dptr,#IN0BC 036B 74 01 1038 mov a,#1 036D F0 1039 movx @dptr,a 036E 02s03rA5 1040 ljmp setupack 0371 1041 setupstallc8: 0371 02s03rA1 1042 ljmp setupstall 0374 1043 cmdnotc8: 1044 ;; 0xc9 0374 B4 C9 2A 1045 cjne a,#0xc9,cmdnotc9 0377 90 7F E8 1046 mov dptr,#SETUPDAT ; bRequestType == 0xc0 037A E0 1047 movx a,@dptr 037B B4 C0 20 1048 cjne a,#0xc0,setupstallc9 037E 90 7F 00 1049 mov dptr,#IN0BUF 0381 05 86 1050 inc dps 0383 90s00rF2 1051 mov dptr,#stringserial+2 0386 7F 06 1052 mov r7,#(stringserialsz-2)/2 0388 E0 1053 0$: movx a,@dptr 0389 A3 1054 inc dptr 038A A3 1055 inc dptr 038B 15 86 1056 dec dps 038D F0 1057 movx @dptr,a 038E A3 1058 inc dptr 038F 05 86 1059 inc dps 0391 DF F5 1060 djnz r7,0$ 0393 15 86 1061 dec dps 0395 74 06 1062 mov a,#(stringserialsz-2)/2 0397 90 7F B5 1063 mov dptr,#IN0BC 039A F0 1064 movx @dptr,a 039B 02s03rA5 1065 ljmp setupack 039E 1066 setupstallc9: 039E 02s03rA1 1067 ljmp setupstall 03A1 1068 cmdnotc9: 1069 ;; unknown commands fall through to setupstall 1070 03A1 1071 setupstall: 03A1 74 03 1072 mov a,#3 03A3 80 02 1073 sjmp endsetup 03A5 1074 setupack: 03A5 74 02 1075 mov a,#2 03A7 1076 endsetup: 03A7 90 7F B4 1077 mov dptr,#EP0CS 03AA F0 1078 movx @dptr,a 03AB 1079 endusbisr: 1080 ;; epilogue 03AB D0 07 1081 pop ar7 03AD D0 00 1082 pop ar0 03AF D0 86 1083 pop dps 03B1 D0 D0 1084 pop psw 03B3 D0 85 1085 pop dph1 03B5 D0 84 1086 pop dpl1 03B7 D0 83 1087 pop dph0 03B9 D0 82 1088 pop dpl0 03BB D0 F0 1089 pop b 03BD D0 E0 1090 pop acc 03BF 32 1091 reti 1092 03C0 1093 usb_sof_isr: 03C0 C0 E0 1094 push acc 03C2 C0 F0 1095 push b 03C4 C0 82 1096 push dpl0 03C6 C0 83 1097 push dph0 03C8 C0 D0 1098 push psw 03CA 75 D0 00 1099 mov psw,#0x00 03CD C0 86 1100 push dps 03CF 75 86 00 1101 mov dps,#0 1102 ;; clear interrupt 03D2 E5 91 1103 mov a,exif 03D4 C2 E4 1104 clr acc.4 03D6 F5 91 1105 mov exif,a 03D8 90 7F AB 1106 mov dptr,#USBIRQ 03DB 74 02 1107 mov a,#0x02 03DD F0 1108 movx @dptr,a 1109 ;; handle interrupt 1110 ;; epilogue 03DE D0 86 1111 pop dps 03E0 D0 D0 1112 pop psw 03E2 D0 83 1113 pop dph0 03E4 D0 82 1114 pop dpl0 03E6 D0 F0 1115 pop b 03E8 D0 E0 1116 pop acc 03EA 32 1117 reti 1118 1119 03EB 1120 usb_sutok_isr: 03EB C0 E0 1121 push acc 03ED C0 F0 1122 push b 03EF C0 82 1123 push dpl0 03F1 C0 83 1124 push dph0 03F3 C0 D0 1125 push psw 03F5 75 D0 00 1126 mov psw,#0x00 03F8 C0 86 1127 push dps 03FA 75 86 00 1128 mov dps,#0 1129 ;; clear interrupt 03FD E5 91 1130 mov a,exif 03FF C2 E4 1131 clr acc.4 0401 F5 91 1132 mov exif,a 0403 90 7F AB 1133 mov dptr,#USBIRQ 0406 74 04 1134 mov a,#0x04 0408 F0 1135 movx @dptr,a 1136 ;; handle interrupt 1137 ;; epilogue 0409 D0 86 1138 pop dps 040B D0 D0 1139 pop psw 040D D0 83 1140 pop dph0 040F D0 82 1141 pop dpl0 0411 D0 F0 1142 pop b 0413 D0 E0 1143 pop acc 0415 32 1144 reti 1145 0416 1146 usb_suspend_isr: 0416 C0 E0 1147 push acc 0418 C0 F0 1148 push b 041A C0 82 1149 push dpl0 041C C0 83 1150 push dph0 041E C0 D0 1151 push psw 0420 75 D0 00 1152 mov psw,#0x00 0423 C0 86 1153 push dps 0425 75 86 00 1154 mov dps,#0 1155 ;; clear interrupt 0428 E5 91 1156 mov a,exif 042A C2 E4 1157 clr acc.4 042C F5 91 1158 mov exif,a 042E 90 7F AB 1159 mov dptr,#USBIRQ 0431 74 08 1160 mov a,#0x08 0433 F0 1161 movx @dptr,a 1162 ;; handle interrupt 1163 ;; epilogue 0434 D0 86 1164 pop dps 0436 D0 D0 1165 pop psw 0438 D0 83 1166 pop dph0 043A D0 82 1167 pop dpl0 043C D0 F0 1168 pop b 043E D0 E0 1169 pop acc 0440 32 1170 reti 1171 0441 1172 usb_usbreset_isr: 0441 C0 E0 1173 push acc 0443 C0 F0 1174 push b 0445 C0 82 1175 push dpl0 0447 C0 83 1176 push dph0 0449 C0 D0 1177 push psw 044B 75 D0 00 1178 mov psw,#0x00 044E C0 86 1179 push dps 0450 75 86 00 1180 mov dps,#0 1181 ;; clear interrupt 0453 E5 91 1182 mov a,exif 0455 C2 E4 1183 clr acc.4 0457 F5 91 1184 mov exif,a 0459 90 7F AB 1185 mov dptr,#USBIRQ 045C 74 10 1186 mov a,#0x10 045E F0 1187 movx @dptr,a 1188 ;; handle interrupt 1189 ;; epilogue 045F D0 86 1190 pop dps 0461 D0 D0 1191 pop psw 0463 D0 83 1192 pop dph0 0465 D0 82 1193 pop dpl0 0467 D0 F0 1194 pop b 0469 D0 E0 1195 pop acc 046B 32 1196 reti 1197 046C 1198 usb_ep0in_isr: 046C C0 E0 1199 push acc 046E C0 F0 1200 push b 0470 C0 82 1201 push dpl0 0472 C0 83 1202 push dph0 0474 C0 84 1203 push dpl1 0476 C0 85 1204 push dph1 0478 C0 D0 1205 push psw 047A 75 D0 00 1206 mov psw,#0x00 047D C0 86 1207 push dps 047F 75 86 00 1208 mov dps,#0 0482 C0 00 1209 push ar0 0484 C0 07 1210 push ar7 1211 ;; clear interrupt 0486 E5 91 1212 mov a,exif 0488 C2 E4 1213 clr acc.4 048A F5 91 1214 mov exif,a 048C 90 7F A9 1215 mov dptr,#IN07IRQ 048F 74 01 1216 mov a,#0x01 0491 F0 1217 movx @dptr,a 1218 ;; handle interrupt 0492 E5*06 1219 mov a,ctrlcode 0494 B4 02 05 1220 cjne a,#2,0$ 0497 12s02r11 1221 lcall xmemread 049A 80 11 1222 sjmp ep0inendisr 049C 90 7F B5 1223 0$: mov dptr,#IN0BC 049F E4 1224 clr a 04A0 F0 1225 movx @dptr,a 04A1 80 04 1226 sjmp ep0inack 1227 04A3 1228 ep0install: 04A3 74 03 1229 mov a,#3 04A5 80 02 1230 sjmp ep0incs 04A7 1231 ep0inack: 04A7 74 02 1232 mov a,#2 04A9 1233 ep0incs: 04A9 90 7F B4 1234 mov dptr,#EP0CS 04AC F0 1235 movx @dptr,a 04AD 1236 ep0inendisr: 1237 ;; epilogue 04AD D0 07 1238 pop ar7 04AF D0 00 1239 pop ar0 04B1 D0 86 1240 pop dps 04B3 D0 D0 1241 pop psw 04B5 D0 85 1242 pop dph1 04B7 D0 84 1243 pop dpl1 04B9 D0 83 1244 pop dph0 04BB D0 82 1245 pop dpl0 04BD D0 F0 1246 pop b 04BF D0 E0 1247 pop acc 04C1 32 1248 reti 1249 04C2 1250 usb_ep0out_isr: 04C2 C0 E0 1251 push acc 04C4 C0 F0 1252 push b 04C6 C0 82 1253 push dpl0 04C8 C0 83 1254 push dph0 04CA C0 84 1255 push dpl1 04CC C0 85 1256 push dph1 04CE C0 D0 1257 push psw 04D0 75 D0 00 1258 mov psw,#0x00 04D3 C0 86 1259 push dps 04D5 75 86 00 1260 mov dps,#0 04D8 C0 07 1261 push ar7 1262 ;; clear interrupt 04DA E5 91 1263 mov a,exif 04DC C2 E4 1264 clr acc.4 04DE F5 91 1265 mov exif,a 04E0 90 7F AA 1266 mov dptr,#OUT07IRQ 04E3 74 01 1267 mov a,#0x01 04E5 F0 1268 movx @dptr,a 1269 ;; handle interrupt 04E6 E5*06 1270 mov a,ctrlcode ; check control code 04E8 B4 01 36 1271 cjne a,#0x01,ep0outstall 1272 ;; write to external memory 04EB 90 7F C5 1273 mov dptr,#OUT0BC 04EE E0 1274 movx a,@dptr 04EF 60 28 1275 jz 0$ 04F1 FF 1276 mov r7,a 04F2 C3 1277 clr c 04F3 E5*09 1278 mov a,ctrllen 04F5 9F 1279 subb a,r7 04F6 F5*09 1280 mov ctrllen,a 04F8 E5*0A 1281 mov a,ctrllen+1 04FA 94 00 1282 subb a,#0 04FC F5*0A 1283 mov ctrllen+1,a 04FE 40 21 1284 jc ep0outstall 0500 90 7E C0 1285 mov dptr,#OUT0BUF 0503 85*07 84 1286 mov dpl1,ctrladdr 0506 85*08 85 1287 mov dph1,ctrladdr+1 0509 E0 1288 1$: movx a,@dptr 050A A3 1289 inc dptr 050B 05 86 1290 inc dps 050D F0 1291 movx @dptr,a 050E A3 1292 inc dptr 050F 15 86 1293 dec dps 0511 DF F6 1294 djnz r7,1$ 0513 85 84*07 1295 mov ctrladdr,dpl1 0516 85 85*08 1296 mov ctrladdr+1,dph1 0519 E5*09 1297 0$: mov a,ctrllen 051B 45*0A 1298 orl a,ctrllen+1 051D 60 09 1299 jz ep0outack 051F 80 10 1300 sjmp ep0outendisr 1301 0521 1302 ep0outstall: 0521 75*06 00 1303 mov ctrlcode,#0 0524 74 03 1304 mov a,#3 0526 80 05 1305 sjmp ep0outcs 0528 1306 ep0outack: 0528 75*06 00 1307 mov ctrlcode,#0 052B 74 02 1308 mov a,#2 052D 1309 ep0outcs: 052D 90 7F B4 1310 mov dptr,#EP0CS 0530 F0 1311 movx @dptr,a 0531 1312 ep0outendisr: 1313 ;; epilogue 0531 D0 07 1314 pop ar7 0533 D0 86 1315 pop dps 0535 D0 D0 1316 pop psw 0537 D0 85 1317 pop dph1 0539 D0 84 1318 pop dpl1 053B D0 83 1319 pop dph0 053D D0 82 1320 pop dpl0 053F D0 F0 1321 pop b 0541 D0 E0 1322 pop acc 0543 32 1323 reti 1324 0544 1325 fillusbintr:: 0544 90 7E 80 1326 mov dptr,#IN1BUF 0547 E5*00 1327 mov a,errcode 0549 F0 1328 movx @dptr,a 054A A3 1329 inc dptr 054B E5*01 1330 mov a,errval 054D F0 1331 movx @dptr,a 054E A3 1332 inc dptr 054F E5*02 1333 mov a,cfgcount 0551 F0 1334 movx @dptr,a 0552 A3 1335 inc dptr 0553 E5*03 1336 mov a,cfgcount+1 0555 F0 1337 movx @dptr,a 0556 A3 1338 inc dptr 0557 E5*05 1339 mov a,irqcount 0559 F0 1340 movx @dptr,a 055A 90 7F B7 1341 mov dptr,#IN1BC 055D 74 05 1342 mov a,#5 055F F0 1343 movx @dptr,a 0560 05*05 1344 inc irqcount 0562 22 1345 ret 1346 0563 1347 usb_ep1in_isr: 0563 C0 E0 1348 push acc 0565 C0 F0 1349 push b 0567 C0 82 1350 push dpl0 0569 C0 83 1351 push dph0 056B C0 D0 1352 push psw 056D 75 D0 00 1353 mov psw,#0x00 0570 C0 86 1354 push dps 0572 75 86 00 1355 mov dps,#0 1356 ;; clear interrupt 0575 E5 91 1357 mov a,exif 0577 C2 E4 1358 clr acc.4 0579 F5 91 1359 mov exif,a 057B 90 7F A9 1360 mov dptr,#IN07IRQ 057E 74 02 1361 mov a,#0x02 0580 F0 1362 movx @dptr,a 1363 ;; handle interrupt 0581 12s05r44 1364 lcall fillusbintr 1365 ;; epilogue 0584 D0 86 1366 pop dps 0586 D0 D0 1367 pop psw 0588 D0 83 1368 pop dph0 058A D0 82 1369 pop dpl0 058C D0 F0 1370 pop b 058E D0 E0 1371 pop acc 0590 32 1372 reti 1373 0591 1374 usb_ep1out_isr: 0591 C0 E0 1375 push acc 0593 C0 F0 1376 push b 0595 C0 82 1377 push dpl0 0597 C0 83 1378 push dph0 0599 C0 D0 1379 push psw 059B 75 D0 00 1380 mov psw,#0x00 059E C0 86 1381 push dps 05A0 75 86 00 1382 mov dps,#0 1383 ;; clear interrupt 05A3 E5 91 1384 mov a,exif 05A5 C2 E4 1385 clr acc.4 05A7 F5 91 1386 mov exif,a 05A9 90 7F AA 1387 mov dptr,#OUT07IRQ 05AC 74 02 1388 mov a,#0x02 05AE F0 1389 movx @dptr,a 1390 ;; handle interrupt 1391 ;; epilogue 05AF D0 86 1392 pop dps 05B1 D0 D0 1393 pop psw 05B3 D0 83 1394 pop dph0 05B5 D0 82 1395 pop dpl0 05B7 D0 F0 1396 pop b 05B9 D0 E0 1397 pop acc 05BB 32 1398 reti 1399 05BC 1400 usb_ep2in_isr: 05BC C0 E0 1401 push acc 05BE C0 F0 1402 push b 05C0 C0 82 1403 push dpl0 05C2 C0 83 1404 push dph0 05C4 C0 D0 1405 push psw 05C6 75 D0 00 1406 mov psw,#0x00 05C9 C0 86 1407 push dps 05CB 75 86 00 1408 mov dps,#0 1409 ;; clear interrupt 05CE E5 91 1410 mov a,exif 05D0 C2 E4 1411 clr acc.4 05D2 F5 91 1412 mov exif,a 05D4 90 7F A9 1413 mov dptr,#IN07IRQ 05D7 74 04 1414 mov a,#0x04 05D9 F0 1415 movx @dptr,a 1416 ;; handle interrupt 1417 ;; epilogue 05DA D0 86 1418 pop dps 05DC D0 D0 1419 pop psw 05DE D0 83 1420 pop dph0 05E0 D0 82 1421 pop dpl0 05E2 D0 F0 1422 pop b 05E4 D0 E0 1423 pop acc 05E6 32 1424 reti 1425 05E7 1426 usb_ep2out_isr: 05E7 C0 E0 1427 push acc 05E9 C0 F0 1428 push b 05EB C0 82 1429 push dpl0 05ED C0 83 1430 push dph0 05EF C0 D0 1431 push psw 05F1 75 D0 00 1432 mov psw,#0x00 05F4 C0 86 1433 push dps 05F6 75 86 00 1434 mov dps,#0 1435 ;; clear interrupt 05F9 E5 91 1436 mov a,exif 05FB C2 E4 1437 clr acc.4 05FD F5 91 1438 mov exif,a 05FF 90 7F AA 1439 mov dptr,#OUT07IRQ 0602 74 04 1440 mov a,#0x04 0604 F0 1441 movx @dptr,a 1442 ;; handle interrupt 1443 ;; epilogue 0605 D0 86 1444 pop dps 0607 D0 D0 1445 pop psw 0609 D0 83 1446 pop dph0 060B D0 82 1447 pop dpl0 060D D0 F0 1448 pop b 060F D0 E0 1449 pop acc 0611 32 1450 reti 1451 0612 1452 usb_ep3in_isr: 0612 C0 E0 1453 push acc 0614 C0 F0 1454 push b 0616 C0 82 1455 push dpl0 0618 C0 83 1456 push dph0 061A C0 D0 1457 push psw 061C 75 D0 00 1458 mov psw,#0x00 061F C0 86 1459 push dps 0621 75 86 00 1460 mov dps,#0 1461 ;; clear interrupt 0624 E5 91 1462 mov a,exif 0626 C2 E4 1463 clr acc.4 0628 F5 91 1464 mov exif,a 062A 90 7F A9 1465 mov dptr,#IN07IRQ 062D 74 08 1466 mov a,#0x08 062F F0 1467 movx @dptr,a 1468 ;; handle interrupt 1469 ;; epilogue 0630 D0 86 1470 pop dps 0632 D0 D0 1471 pop psw 0634 D0 83 1472 pop dph0 0636 D0 82 1473 pop dpl0 0638 D0 F0 1474 pop b 063A D0 E0 1475 pop acc 063C 32 1476 reti 1477 063D 1478 usb_ep3out_isr: 063D C0 E0 1479 push acc 063F C0 F0 1480 push b 0641 C0 82 1481 push dpl0 0643 C0 83 1482 push dph0 0645 C0 D0 1483 push psw 0647 75 D0 00 1484 mov psw,#0x00 064A C0 86 1485 push dps 064C 75 86 00 1486 mov dps,#0 1487 ;; clear interrupt 064F E5 91 1488 mov a,exif 0651 C2 E4 1489 clr acc.4 0653 F5 91 1490 mov exif,a 0655 90 7F AA 1491 mov dptr,#OUT07IRQ 0658 74 08 1492 mov a,#0x08 065A F0 1493 movx @dptr,a 1494 ;; handle interrupt 1495 ;; epilogue 065B D0 86 1496 pop dps 065D D0 D0 1497 pop psw 065F D0 83 1498 pop dph0 0661 D0 82 1499 pop dpl0 0663 D0 F0 1500 pop b 0665 D0 E0 1501 pop acc 0667 32 1502 reti 1503 0668 1504 usb_ep4in_isr: 0668 C0 E0 1505 push acc 066A C0 F0 1506 push b 066C C0 82 1507 push dpl0 066E C0 83 1508 push dph0 0670 C0 D0 1509 push psw 0672 75 D0 00 1510 mov psw,#0x00 0675 C0 86 1511 push dps 0677 75 86 00 1512 mov dps,#0 1513 ;; clear interrupt 067A E5 91 1514 mov a,exif 067C C2 E4 1515 clr acc.4 067E F5 91 1516 mov exif,a 0680 90 7F A9 1517 mov dptr,#IN07IRQ 0683 74 10 1518 mov a,#0x10 0685 F0 1519 movx @dptr,a 1520 ;; handle interrupt 1521 ;; epilogue 0686 D0 86 1522 pop dps 0688 D0 D0 1523 pop psw 068A D0 83 1524 pop dph0 068C D0 82 1525 pop dpl0 068E D0 F0 1526 pop b 0690 D0 E0 1527 pop acc 0692 32 1528 reti 1529 0693 1530 usb_ep4out_isr: 0693 C0 E0 1531 push acc 0695 C0 F0 1532 push b 0697 C0 82 1533 push dpl0 0699 C0 83 1534 push dph0 069B C0 D0 1535 push psw 069D 75 D0 00 1536 mov psw,#0x00 06A0 C0 86 1537 push dps 06A2 75 86 00 1538 mov dps,#0 1539 ;; clear interrupt 06A5 E5 91 1540 mov a,exif 06A7 C2 E4 1541 clr acc.4 06A9 F5 91 1542 mov exif,a 06AB 90 7F AA 1543 mov dptr,#OUT07IRQ 06AE 74 10 1544 mov a,#0x10 06B0 F0 1545 movx @dptr,a 1546 ;; handle interrupt 1547 ;; epilogue 06B1 D0 86 1548 pop dps 06B3 D0 D0 1549 pop psw 06B5 D0 83 1550 pop dph0 06B7 D0 82 1551 pop dpl0 06B9 D0 F0 1552 pop b 06BB D0 E0 1553 pop acc 06BD 32 1554 reti 1555 06BE 1556 usb_ep5in_isr: 06BE C0 E0 1557 push acc 06C0 C0 F0 1558 push b 06C2 C0 82 1559 push dpl0 06C4 C0 83 1560 push dph0 06C6 C0 D0 1561 push psw 06C8 75 D0 00 1562 mov psw,#0x00 06CB C0 86 1563 push dps 06CD 75 86 00 1564 mov dps,#0 1565 ;; clear interrupt 06D0 E5 91 1566 mov a,exif 06D2 C2 E4 1567 clr acc.4 06D4 F5 91 1568 mov exif,a 06D6 90 7F A9 1569 mov dptr,#IN07IRQ 06D9 74 20 1570 mov a,#0x20 06DB F0 1571 movx @dptr,a 1572 ;; handle interrupt 1573 ;; epilogue 06DC D0 86 1574 pop dps 06DE D0 D0 1575 pop psw 06E0 D0 83 1576 pop dph0 06E2 D0 82 1577 pop dpl0 06E4 D0 F0 1578 pop b 06E6 D0 E0 1579 pop acc 06E8 32 1580 reti 1581 06E9 1582 usb_ep5out_isr: 06E9 C0 E0 1583 push acc 06EB C0 F0 1584 push b 06ED C0 82 1585 push dpl0 06EF C0 83 1586 push dph0 06F1 C0 D0 1587 push psw 06F3 75 D0 00 1588 mov psw,#0x00 06F6 C0 86 1589 push dps 06F8 75 86 00 1590 mov dps,#0 1591 ;; clear interrupt 06FB E5 91 1592 mov a,exif 06FD C2 E4 1593 clr acc.4 06FF F5 91 1594 mov exif,a 0701 90 7F AA 1595 mov dptr,#OUT07IRQ 0704 74 20 1596 mov a,#0x20 0706 F0 1597 movx @dptr,a 1598 ;; handle interrupt 1599 ;; epilogue 0707 D0 86 1600 pop dps 0709 D0 D0 1601 pop psw 070B D0 83 1602 pop dph0 070D D0 82 1603 pop dpl0 070F D0 F0 1604 pop b 0711 D0 E0 1605 pop acc 0713 32 1606 reti 1607 0714 1608 usb_ep6in_isr: 0714 C0 E0 1609 push acc 0716 C0 F0 1610 push b 0718 C0 82 1611 push dpl0 071A C0 83 1612 push dph0 071C C0 D0 1613 push psw 071E 75 D0 00 1614 mov psw,#0x00 0721 C0 86 1615 push dps 0723 75 86 00 1616 mov dps,#0 1617 ;; clear interrupt 0726 E5 91 1618 mov a,exif 0728 C2 E4 1619 clr acc.4 072A F5 91 1620 mov exif,a 072C 90 7F A9 1621 mov dptr,#IN07IRQ 072F 74 40 1622 mov a,#0x40 0731 F0 1623 movx @dptr,a 1624 ;; handle interrupt 1625 ;; epilogue 0732 D0 86 1626 pop dps 0734 D0 D0 1627 pop psw 0736 D0 83 1628 pop dph0 0738 D0 82 1629 pop dpl0 073A D0 F0 1630 pop b 073C D0 E0 1631 pop acc 073E 32 1632 reti 1633 073F 1634 usb_ep6out_isr: 073F C0 E0 1635 push acc 0741 C0 F0 1636 push b 0743 C0 82 1637 push dpl0 0745 C0 83 1638 push dph0 0747 C0 D0 1639 push psw 0749 75 D0 00 1640 mov psw,#0x00 074C C0 86 1641 push dps 074E 75 86 00 1642 mov dps,#0 1643 ;; clear interrupt 0751 E5 91 1644 mov a,exif 0753 C2 E4 1645 clr acc.4 0755 F5 91 1646 mov exif,a 0757 90 7F AA 1647 mov dptr,#OUT07IRQ 075A 74 40 1648 mov a,#0x40 075C F0 1649 movx @dptr,a 1650 ;; handle interrupt 1651 ;; epilogue 075D D0 86 1652 pop dps 075F D0 D0 1653 pop psw 0761 D0 83 1654 pop dph0 0763 D0 82 1655 pop dpl0 0765 D0 F0 1656 pop b 0767 D0 E0 1657 pop acc 0769 32 1658 reti 1659 076A 1660 usb_ep7in_isr: 076A C0 E0 1661 push acc 076C C0 F0 1662 push b 076E C0 82 1663 push dpl0 0770 C0 83 1664 push dph0 0772 C0 D0 1665 push psw 0774 75 D0 00 1666 mov psw,#0x00 0777 C0 86 1667 push dps 0779 75 86 00 1668 mov dps,#0 1669 ;; clear interrupt 077C E5 91 1670 mov a,exif 077E C2 E4 1671 clr acc.4 0780 F5 91 1672 mov exif,a 0782 90 7F A9 1673 mov dptr,#IN07IRQ 0785 74 80 1674 mov a,#0x80 0787 F0 1675 movx @dptr,a 1676 ;; handle interrupt 1677 ;; epilogue 0788 D0 86 1678 pop dps 078A D0 D0 1679 pop psw 078C D0 83 1680 pop dph0 078E D0 82 1681 pop dpl0 0790 D0 F0 1682 pop b 0792 D0 E0 1683 pop acc 0794 32 1684 reti 1685 0795 1686 usb_ep7out_isr: 0795 C0 E0 1687 push acc 0797 C0 F0 1688 push b 0799 C0 82 1689 push dpl0 079B C0 83 1690 push dph0 079D C0 D0 1691 push psw 079F 75 D0 00 1692 mov psw,#0x00 07A2 C0 86 1693 push dps 07A4 75 86 00 1694 mov dps,#0 1695 ;; clear interrupt 07A7 E5 91 1696 mov a,exif 07A9 C2 E4 1697 clr acc.4 07AB F5 91 1698 mov exif,a 07AD 90 7F AA 1699 mov dptr,#OUT07IRQ 07B0 74 80 1700 mov a,#0x80 07B2 F0 1701 movx @dptr,a 1702 ;; handle interrupt 1703 ;; epilogue 07B3 D0 86 1704 pop dps 07B5 D0 D0 1705 pop psw 07B7 D0 83 1706 pop dph0 07B9 D0 82 1707 pop dpl0 07BB D0 F0 1708 pop b 07BD D0 E0 1709 pop acc 07BF 32 1710 reti 1711 1712 1713 ;; ----------------------------------------------------- 1714 ;; USB descriptors 1715 ;; ----------------------------------------------------- 1716 1717 ;; Device and/or Interface Class codes 0000 1718 USB_CLASS_PER_INTERFACE = 0 0001 1719 USB_CLASS_AUDIO = 1 0002 1720 USB_CLASS_COMM = 2 0003 1721 USB_CLASS_HID = 3 0007 1722 USB_CLASS_PRINTER = 7 0008 1723 USB_CLASS_MASS_STORAGE = 8 0009 1724 USB_CLASS_HUB = 9 00FF 1725 USB_CLASS_VENDOR_SPEC = 0xff 1726 0001 1727 USB_SUBCLASS_AUDIOCONTROL = 1 0002 1728 USB_SUBCLASS_AUDIOSTREAMING = 2 1729 1730 ;; Descriptor types 0001 1731 USB_DT_DEVICE = 0x01 0002 1732 USB_DT_CONFIG = 0x02 0003 1733 USB_DT_STRING = 0x03 0004 1734 USB_DT_INTERFACE = 0x04 0005 1735 USB_DT_ENDPOINT = 0x05 1736 1737 ;; Audio Class descriptor types 0020 1738 USB_DT_AUDIO_UNDEFINED = 0x20 0021 1739 USB_DT_AUDIO_DEVICE = 0x21 0022 1740 USB_DT_AUDIO_CONFIG = 0x22 0023 1741 USB_DT_AUDIO_STRING = 0x23 0024 1742 USB_DT_AUDIO_INTERFACE = 0x24 0025 1743 USB_DT_AUDIO_ENDPOINT = 0x25 1744 0000 1745 USB_SDT_AUDIO_UNDEFINED = 0x00 0001 1746 USB_SDT_AUDIO_HEADER = 0x01 0002 1747 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 0003 1748 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 0004 1749 USB_SDT_AUDIO_MIXER_UNIT = 0x04 0005 1750 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 0006 1751 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 0007 1752 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 0008 1753 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 1754 1755 ;; Standard requests 0000 1756 USB_REQ_GET_STATUS = 0x00 0001 1757 USB_REQ_CLEAR_FEATURE = 0x01 0003 1758 USB_REQ_SET_FEATURE = 0x03 0005 1759 USB_REQ_SET_ADDRESS = 0x05 0006 1760 USB_REQ_GET_DESCRIPTOR = 0x06 0007 1761 USB_REQ_SET_DESCRIPTOR = 0x07 0008 1762 USB_REQ_GET_CONFIGURATION = 0x08 0009 1763 USB_REQ_SET_CONFIGURATION = 0x09 000A 1764 USB_REQ_GET_INTERFACE = 0x0A 000B 1765 USB_REQ_SET_INTERFACE = 0x0B 000C 1766 USB_REQ_SYNCH_FRAME = 0x0C 1767 1768 ;; Audio Class Requests 0001 1769 USB_REQ_AUDIO_SET_CUR = 0x01 0081 1770 USB_REQ_AUDIO_GET_CUR = 0x81 0002 1771 USB_REQ_AUDIO_SET_MIN = 0x02 0082 1772 USB_REQ_AUDIO_GET_MIN = 0x82 0003 1773 USB_REQ_AUDIO_SET_MAX = 0x03 0083 1774 USB_REQ_AUDIO_GET_MAX = 0x83 0004 1775 USB_REQ_AUDIO_SET_RES = 0x04 0084 1776 USB_REQ_AUDIO_GET_RES = 0x84 0005 1777 USB_REQ_AUDIO_SET_MEM = 0x05 0085 1778 USB_REQ_AUDIO_GET_MEM = 0x85 00FF 1779 USB_REQ_AUDIO_GET_STAT = 0xff 1780 1781 ;; USB Request Type and Endpoint Directions 0000 1782 USB_DIR_OUT = 0 0080 1783 USB_DIR_IN = 0x80 1784 0000 1785 USB_TYPE_STANDARD = (0x00 << 5) 0020 1786 USB_TYPE_CLASS = (0x01 << 5) 0040 1787 USB_TYPE_VENDOR = (0x02 << 5) 0060 1788 USB_TYPE_RESERVED = (0x03 << 5) 1789 0000 1790 USB_RECIP_DEVICE = 0x00 0001 1791 USB_RECIP_INTERFACE = 0x01 0002 1792 USB_RECIP_ENDPOINT = 0x02 0003 1793 USB_RECIP_OTHER = 0x03 1794 1795 ;; Request target types. 0000 1796 USB_RT_DEVICE = 0x00 0001 1797 USB_RT_INTERFACE = 0x01 0002 1798 USB_RT_ENDPOINT = 0x02 1799 BAC0 1800 VENDID = 0xbac0 6134 1801 PRODID = 0x6134 1802 baycomusb-0.10.orig/firmware/bscanfirmware/main.rst0100644000175100017510000024501207325134422020533 0ustar abaaba 1 .module main 2 3 ;; define code segments link order 4 .area CODE (CODE) 5 .area CSEG (CODE) 6 .area GSINIT (CODE) 7 .area GSINIT2 (CODE) 8 9 ;; ----------------------------------------------------- 10 11 ;; special function registers (which are not predefined) 0082 12 dpl0 = 0x82 0083 13 dph0 = 0x83 0084 14 dpl1 = 0x84 0085 15 dph1 = 0x85 0086 16 dps = 0x86 008E 17 ckcon = 0x8E 008F 18 spc_fnc = 0x8F 0091 19 exif = 0x91 0092 20 mpage = 0x92 0098 21 scon0 = 0x98 0099 22 sbuf0 = 0x99 00C0 23 scon1 = 0xC0 00C1 24 sbuf1 = 0xC1 00D8 25 eicon = 0xD8 00E8 26 eie = 0xE8 00F8 27 eip = 0xF8 28 29 ;; anchor xdata registers 7F00 30 IN0BUF = 0x7F00 7EC0 31 OUT0BUF = 0x7EC0 7E80 32 IN1BUF = 0x7E80 7E40 33 OUT1BUF = 0x7E40 7E00 34 IN2BUF = 0x7E00 7DC0 35 OUT2BUF = 0x7DC0 7D80 36 IN3BUF = 0x7D80 7D40 37 OUT3BUF = 0x7D40 7D00 38 IN4BUF = 0x7D00 7CC0 39 OUT4BUF = 0x7CC0 7C80 40 IN5BUF = 0x7C80 7C40 41 OUT5BUF = 0x7C40 7C00 42 IN6BUF = 0x7C00 7BC0 43 OUT6BUF = 0x7BC0 7B80 44 IN7BUF = 0x7B80 7B40 45 OUT7BUF = 0x7B40 7FE8 46 SETUPBUF = 0x7FE8 7FE8 47 SETUPDAT = 0x7FE8 48 7FB4 49 EP0CS = 0x7FB4 7FB5 50 IN0BC = 0x7FB5 7FB6 51 IN1CS = 0x7FB6 7FB7 52 IN1BC = 0x7FB7 7FB8 53 IN2CS = 0x7FB8 7FB9 54 IN2BC = 0x7FB9 7FBA 55 IN3CS = 0x7FBA 7FBB 56 IN3BC = 0x7FBB 7FBC 57 IN4CS = 0x7FBC 7FBD 58 IN4BC = 0x7FBD 7FBE 59 IN5CS = 0x7FBE 7FBF 60 IN5BC = 0x7FBF 7FC0 61 IN6CS = 0x7FC0 7FC1 62 IN6BC = 0x7FC1 7FC2 63 IN7CS = 0x7FC2 7FC3 64 IN7BC = 0x7FC3 7FC5 65 OUT0BC = 0x7FC5 7FC6 66 OUT1CS = 0x7FC6 7FC7 67 OUT1BC = 0x7FC7 7FC8 68 OUT2CS = 0x7FC8 7FC9 69 OUT2BC = 0x7FC9 7FCA 70 OUT3CS = 0x7FCA 7FCB 71 OUT3BC = 0x7FCB 7FCC 72 OUT4CS = 0x7FCC 7FCD 73 OUT4BC = 0x7FCD 7FCE 74 OUT5CS = 0x7FCE 7FCF 75 OUT5BC = 0x7FCF 7FD0 76 OUT6CS = 0x7FD0 7FD1 77 OUT6BC = 0x7FD1 7FD2 78 OUT7CS = 0x7FD2 7FD3 79 OUT7BC = 0x7FD3 80 7FA8 81 IVEC = 0x7FA8 7FA9 82 IN07IRQ = 0x7FA9 7FAA 83 OUT07IRQ = 0x7FAA 7FAB 84 USBIRQ = 0x7FAB 7FAC 85 IN07IEN = 0x7FAC 7FAD 86 OUT07IEN = 0x7FAD 7FAE 87 USBIEN = 0x7FAE 7FAF 88 USBBAV = 0x7FAF 7FB2 89 BPADDRH = 0x7FB2 7FB3 90 BPADDRL = 0x7FB3 91 7FD4 92 SUDPTRH = 0x7FD4 7FD5 93 SUDPTRL = 0x7FD5 7FD6 94 USBCS = 0x7FD6 7FD7 95 TOGCTL = 0x7FD7 7FD8 96 USBFRAMEL = 0x7FD8 7FD9 97 USBFRAMEH = 0x7FD9 7FDB 98 FNADDR = 0x7FDB 7FDD 99 USBPAIR = 0x7FDD 7FDE 100 IN07VAL = 0x7FDE 7FDF 101 OUT07VAL = 0x7FDF 7FE3 102 AUTOPTRH = 0x7FE3 7FE4 103 AUTOPTRL = 0x7FE4 7FE5 104 AUTODATA = 0x7FE5 105 106 ;; isochronous endpoints. only available if ISODISAB=0 107 7F60 108 OUT8DATA = 0x7F60 7F61 109 OUT9DATA = 0x7F61 7F62 110 OUT10DATA = 0x7F62 7F63 111 OUT11DATA = 0x7F63 7F64 112 OUT12DATA = 0x7F64 7F65 113 OUT13DATA = 0x7F65 7F66 114 OUT14DATA = 0x7F66 7F67 115 OUT15DATA = 0x7F67 116 7F68 117 IN8DATA = 0x7F68 7F69 118 IN9DATA = 0x7F69 7F6A 119 IN10DATA = 0x7F6A 7F6B 120 IN11DATA = 0x7F6B 7F6C 121 IN12DATA = 0x7F6C 7F6D 122 IN13DATA = 0x7F6D 7F6E 123 IN14DATA = 0x7F6E 7F6F 124 IN15DATA = 0x7F6F 125 7F70 126 OUT8BCH = 0x7F70 7F71 127 OUT8BCL = 0x7F71 7F72 128 OUT9BCH = 0x7F72 7F73 129 OUT9BCL = 0x7F73 7F74 130 OUT10BCH = 0x7F74 7F75 131 OUT10BCL = 0x7F75 7F76 132 OUT11BCH = 0x7F76 7F77 133 OUT11BCL = 0x7F77 7F78 134 OUT12BCH = 0x7F78 7F79 135 OUT12BCL = 0x7F79 7F7A 136 OUT13BCH = 0x7F7A 7F7B 137 OUT13BCL = 0x7F7B 7F7C 138 OUT14BCH = 0x7F7C 7F7D 139 OUT14BCL = 0x7F7D 7F7E 140 OUT15BCH = 0x7F7E 7F7F 141 OUT15BCL = 0x7F7F 142 7FF0 143 OUT8ADDR = 0x7FF0 7FF1 144 OUT9ADDR = 0x7FF1 7FF2 145 OUT10ADDR = 0x7FF2 7FF3 146 OUT11ADDR = 0x7FF3 7FF4 147 OUT12ADDR = 0x7FF4 7FF5 148 OUT13ADDR = 0x7FF5 7FF6 149 OUT14ADDR = 0x7FF6 7FF7 150 OUT15ADDR = 0x7FF7 7FF8 151 IN8ADDR = 0x7FF8 7FF9 152 IN9ADDR = 0x7FF9 7FFA 153 IN10ADDR = 0x7FFA 7FFB 154 IN11ADDR = 0x7FFB 7FFC 155 IN12ADDR = 0x7FFC 7FFD 156 IN13ADDR = 0x7FFD 7FFE 157 IN14ADDR = 0x7FFE 7FFF 158 IN15ADDR = 0x7FFF 159 7FA0 160 ISOERR = 0x7FA0 7FA1 161 ISOCTL = 0x7FA1 7FA2 162 ZBCOUNT = 0x7FA2 7FE0 163 INISOVAL = 0x7FE0 7FE1 164 OUTISOVAL = 0x7FE1 7FE2 165 FASTXFR = 0x7FE2 166 167 ;; CPU control registers 168 7F92 169 CPUCS = 0x7F92 170 171 ;; IO port control registers 172 7F93 173 PORTACFG = 0x7F93 7F94 174 PORTBCFG = 0x7F94 7F95 175 PORTCCFG = 0x7F95 7F96 176 OUTA = 0x7F96 7F97 177 OUTB = 0x7F97 7F98 178 OUTC = 0x7F98 7F99 179 PINSA = 0x7F99 7F9A 180 PINSB = 0x7F9A 7F9B 181 PINSC = 0x7F9B 7F9C 182 OEA = 0x7F9C 7F9D 183 OEB = 0x7F9D 7F9E 184 OEC = 0x7F9E 185 186 ;; I2C controller registers 187 7FA5 188 I2CS = 0x7FA5 7FA6 189 I2DAT = 0x7FA6 190 191 ;; FPGA defines 0003 192 XC4K_IRLENGTH = 3 0000 193 XC4K_EXTEST = 0 0001 194 XC4K_PRELOAD = 1 0005 195 XC4K_CONFIGURE = 5 0007 196 XC4K_BYPASS = 7 197 2E64 198 FPGA_CONFIGSIZE = 11876 0158 199 FPGA_BOUND = 344 ; in bits 002A 200 FPGA_BOUND_BYTES = ((FPGA_BOUND-1)/8) 0008 201 FPGA_BOUND_RESIDUE = (FPGA_BOUND-8*FPGA_BOUND_BYTES) 002B 202 FPGA_BOUND_BSIZE = ((FPGA_BOUND+7)/8) 203 204 205 ;; ----------------------------------------------------- 206 207 .area CODE (CODE) 0000 02 09 17 208 ljmp startup 0003 02 01 BD 209 ljmp int0_isr 0006 210 .ds 5 000B 02 01 DE 211 ljmp timer0_isr 000E 212 .ds 5 0013 02 02 0E 213 ljmp int1_isr 0016 214 .ds 5 001B 02 02 2F 215 ljmp timer1_isr 001E 216 .ds 5 0023 02 02 50 217 ljmp ser0_isr 0026 218 .ds 5 002B 02 02 73 219 ljmp timer2_isr 002E 220 .ds 5 0033 02 02 94 221 ljmp resume_isr 0036 222 .ds 5 003B 02 02 B5 223 ljmp ser1_isr 003E 224 .ds 5 0043 02 01 00 225 ljmp usb_isr 0046 226 .ds 5 004B 02 02 D8 227 ljmp i2c_isr 004E 228 .ds 5 0053 02 02 FD 229 ljmp int4_isr 0056 230 .ds 5 005B 02 03 22 231 ljmp int5_isr 005E 232 .ds 5 0063 02 03 47 233 ljmp int6_isr 0066 234 .ds 0x8a 235 00F0 236 stringserial: 00F0 0E 237 .db stringserialsz ; bLength 00F1 03 238 .db USB_DT_STRING ; bDescriptorType 00F2 30 00 30 00 30 00 239 .db '0,0,'0,0,'0,0,'0,0,'0,0,'1,0 30 00 30 00 31 00 000E 240 stringserialsz = . - stringserial 00FE 241 .ds 0x10-stringserialsz 242 0100 243 usb_isr: 0100 02 03 B9 244 ljmp usb_sudav_isr 0103 245 .ds 1 0104 02 05 17 246 ljmp usb_sof_isr 0107 247 .ds 1 0108 02 05 42 248 ljmp usb_sutok_isr 010B 249 .ds 1 010C 02 05 6D 250 ljmp usb_suspend_isr 010F 251 .ds 1 0110 02 05 98 252 ljmp usb_usbreset_isr 0113 253 .ds 1 0114 32 254 reti 0115 255 .ds 3 0118 02 05 C3 256 ljmp usb_ep0in_isr 011B 257 .ds 1 011C 02 06 19 258 ljmp usb_ep0out_isr 011F 259 .ds 1 0120 02 06 BA 260 ljmp usb_ep1in_isr 0123 261 .ds 1 0124 02 06 E8 262 ljmp usb_ep1out_isr 0127 263 .ds 1 0128 02 07 13 264 ljmp usb_ep2in_isr 012B 265 .ds 1 012C 02 07 3E 266 ljmp usb_ep2out_isr 012F 267 .ds 1 0130 02 07 69 268 ljmp usb_ep3in_isr 0133 269 .ds 1 0134 02 07 94 270 ljmp usb_ep3out_isr 0137 271 .ds 1 0138 02 07 BF 272 ljmp usb_ep4in_isr 013B 273 .ds 1 013C 02 07 EA 274 ljmp usb_ep4out_isr 013F 275 .ds 1 0140 02 08 15 276 ljmp usb_ep5in_isr 0143 277 .ds 1 0144 02 08 40 278 ljmp usb_ep5out_isr 0147 279 .ds 1 0148 02 08 6B 280 ljmp usb_ep6in_isr 014B 281 .ds 1 014C 02 08 96 282 ljmp usb_ep6out_isr 014F 283 .ds 1 0150 02 08 C1 284 ljmp usb_ep7in_isr 0153 285 .ds 1 0154 02 08 EC 286 ljmp usb_ep7out_isr 287 288 ;; ----------------------------------------------------- 289 290 .area OSEG (OVR,DATA) 291 .area BSEG (BIT) 292 293 294 .area ISEG (DATA) 0080 295 stack: .ds 0x80 296 297 .area DSEG (DATA) 0040 298 errcode: .ds 1 0041 299 errval: .ds 1 0042 300 cfgcount: .ds 2 0044 301 leddiv: .ds 1 0045 302 irqcount: .ds 1 0046 303 ctrlcode: .ds 1 0047 304 ctrladdr: .ds 2 0049 305 ctrllen: .ds 2 306 307 .area XSEG (DATA) 1000 FF FF FF FF FF FF 308 fpgabound: .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff FF FF 1008 FF FF FF FF FF FF 309 .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff FF FF 1010 FF CF FF FF FF FF 310 .db 0xff,0xcf,0xff,0xff,0xff,0xff,0xff,0xff FF FF 1018 FF FF 7F FF FF FF 311 .db 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff FF FF 1020 FF FF FF FF FF FF 312 .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff FF FF 1028 FF FF FF FF 313 .db 0xff,0xff,0xff,0xff 314 315 .area GSINIT (CODE) 0917 316 startup: 0917 75 81 80 317 mov sp,#stack ; -1 091A E4 318 clr a 091B F5 D0 319 mov psw,a 091D F5 86 320 mov dps,a 321 ;lcall __sdcc_external_startup 322 ;mov a,dpl0 323 ;jz __sdcc_init_data 324 ;ljmp __sdcc_program_startup 091F 325 __sdcc_init_data: 326 327 .area GSINIT2 (CODE) 328 0002 329 ar2 = 0x02 0003 330 ar3 = 0x03 0004 331 ar4 = 0x04 0005 332 ar5 = 0x05 0006 333 ar6 = 0x06 0007 334 ar7 = 0x07 0000 335 ar0 = 0x00 0001 336 ar1 = 0x01 337 091F 338 __sdcc_program_startup: 339 ;; assembler code startup 091F E4 340 clr a 0920 F5 40 341 mov errcode,a 0922 F5 41 342 mov errval,a 0924 F5 42 343 mov cfgcount,a 0926 F5 43 344 mov cfgcount+1,a 0928 F5 45 345 mov irqcount,a 092A F5 46 346 mov ctrlcode,a 347 ;; some indirect register setup 092C 75 8E 31 348 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 349 ;; Timer setup: 350 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 351 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 092F 75 89 21 352 mov tmod,#0x21 0932 75 88 55 353 mov tcon,#0x55 ; INT0/INT1 edge 0935 75 8D 64 354 mov th1,#256-156 ; 1200 bauds 0938 75 87 00 355 mov pcon,#0 ; SMOD0=0 356 ;; init USB subsystem 093B 90 7F A1 357 mov dptr,#ISOCTL 093E 74 01 358 mov a,#1 ; disable ISO endpoints 0940 F0 359 movx @dptr,a 0941 90 7F AF 360 mov dptr,#USBBAV 0944 74 01 361 mov a,#1 ; enable autovector, disable breakpoint logic 0946 F0 362 movx @dptr,a 0947 E4 363 clr a 0948 90 7F E0 364 mov dptr,#INISOVAL 094B F0 365 movx @dptr,a 094C 90 7F E1 366 mov dptr,#OUTISOVAL 094F F0 367 movx @dptr,a 0950 90 7F DD 368 mov dptr,#USBPAIR 0953 74 09 369 mov a,#0x9 ; pair EP 2&3 for input & output 0955 F0 370 movx @dptr,a 0956 90 7F DE 371 mov dptr,#IN07VAL 0959 74 03 372 mov a,#0x3 ; enable EP0+EP1 095B F0 373 movx @dptr,a 095C 90 7F DF 374 mov dptr,#OUT07VAL 095F 74 05 375 mov a,#0x5 ; enable EP0+EP2 0961 F0 376 movx @dptr,a 377 ;; USB: init endpoint toggles 0962 90 7F D7 378 mov dptr,#TOGCTL 0965 74 12 379 mov a,#0x12 0967 F0 380 movx @dptr,a 0968 74 32 381 mov a,#0x32 ; clear EP 2 in toggle 096A F0 382 movx @dptr,a 096B 74 02 383 mov a,#0x02 096D F0 384 movx @dptr,a 096E 74 22 385 mov a,#0x22 ; clear EP 2 out toggle 0970 F0 386 movx @dptr,a 387 ;; configure IO ports 0971 90 7F 93 388 mov dptr,#PORTACFG 0974 74 00 389 mov a,#0 0976 F0 390 movx @dptr,a 0977 90 7F 96 391 mov dptr,#OUTA 097A 74 80 392 mov a,#0x80 ; set PROG lo 097C F0 393 movx @dptr,a 097D 90 7F 9C 394 mov dptr,#OEA 0980 74 C2 395 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0982 F0 396 movx @dptr,a 0983 90 7F 94 397 mov dptr,#PORTBCFG 0986 74 00 398 mov a,#0 0988 F0 399 movx @dptr,a 0989 90 7F 9D 400 mov dptr,#OEB 098C 74 00 401 mov a,#0 098E F0 402 movx @dptr,a 098F 90 7F 95 403 mov dptr,#PORTCCFG 0992 74 00 404 mov a,#0 0994 F0 405 movx @dptr,a 0995 90 7F 98 406 mov dptr,#OUTC 0998 74 20 407 mov a,#0x20 099A F0 408 movx @dptr,a 099B 90 7F 9E 409 mov dptr,#OEC 099E 74 2E 410 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 09A0 F0 411 movx @dptr,a 412 ;; enable interrupts 09A1 75 A8 82 413 mov ie,#0x82 ; enable timer 0 int 09A4 75 E8 01 414 mov eie,#0x01 ; enable USB interrupts 09A7 90 7F AE 415 mov dptr,#USBIEN 09AA 74 01 416 mov a,#1 ; enable SUDAV interrupt 09AC F0 417 movx @dptr,a 09AD 90 7F AC 418 mov dptr,#IN07IEN 09B0 74 01 419 mov a,#1 ; enable EP0 interrupt 09B2 F0 420 movx @dptr,a 09B3 90 7F AD 421 mov dptr,#OUT07IEN 09B6 74 03 422 mov a,#3 ; enable EP0+EP1 interrupt 09B8 F0 423 movx @dptr,a 424 ;; initialize UART 0 for config loading 09B9 75 98 20 425 mov scon0,#0x20 ; mode 0, CLK24/4 09BC 75 99 FF 426 mov sbuf0,#0xff 427 ;; initialize EP1 IN (irq) 09BF 12 06 9B 428 lcall fillusbintr 429 430 ;; some short delay 09C2 90 7F 96 431 mov dptr,#OUTA 09C5 74 82 432 mov a,#0x82 ; set PROG hi 09C7 F0 433 movx @dptr,a 09C8 90 7F 99 434 mov dptr,#PINSA 09CB E0 435 movx a,@dptr 09CC 30 E2 06 436 jnb acc.2,1$ 437 ;; DONE stuck high 09CF 75 40 80 438 mov errcode,#0x80 09D2 02 0A 3D 439 ljmp fpgaerr 09D5 12 01 57 440 1$: lcall jtag_reset_tap 09D8 7A 05 441 mov r2,#5 09DA 7B 00 442 mov r3,#0 09DC 7C 06 443 mov r4,#6 09DE 12 01 5D 444 lcall jtag_shiftout ; enter SHIFT-IR state 09E1 7A 08 445 mov r2,#8 09E3 7B 00 446 mov r3,#0 09E5 7C 00 447 mov r4,#0 09E7 12 01 5D 448 lcall jtag_shiftout ; assume max. 8bit IR 09EA 7A 08 449 mov r2,#8 09EC 7B 01 450 mov r3,#1 09EE 7C 00 451 mov r4,#0 09F0 12 01 5D 452 lcall jtag_shift ; shift in a single bit 09F3 74 F8 453 mov a,#-(1<>8,setupstallb2 0469 75 47 00 998 mov ctrladdr,#fpgabound 046C 75 48 10 999 mov ctrladdr+1,#fpgabound>>8 046F 75 49 2B 1000 mov ctrllen,#FPGA_BOUND_BSIZE 0472 75 4A 00 1001 mov ctrllen+1,#FPGA_BOUND_BSIZE>>8 0475 90 7F E8 1002 mov dptr,#SETUPDAT ; bRequestType == 0x40 0478 E0 1003 movx a,@dptr 0479 B4 40 0A 1004 cjne a,#0x40,1$ 047C 75 46 01 1005 mov ctrlcode,#1 047F 90 7F C5 1006 mov dptr,#OUT0BC 0482 F0 1007 movx @dptr,a 0483 02 05 02 1008 ljmp endusbisr 0486 B4 C0 09 1009 1$: cjne a,#0xc0,setupstallb8 ; bRequestType == 0xc0 0489 75 46 02 1010 mov ctrlcode,#2 048C 12 03 68 1011 lcall xmemread 048F 02 05 02 1012 ljmp endusbisr 0492 1013 setupstallb8: 0492 02 04 F8 1014 ljmp setupstall 0495 1015 cmdnotb8: 1016 ;; 0xb9 0495 B4 B9 17 1017 cjne a,#0xb9,cmdnotb9 0498 90 7F E8 1018 mov dptr,#SETUPDAT ; bRequestType == 0xc0 049B E0 1019 movx a,@dptr 049C B4 C0 F3 1020 cjne a,#0xc0,setupstallb8 049F E5 40 1021 mov a,errcode 04A1 B4 20 EE 1022 cjne a,#0x20,setupstallb8 04A4 75 40 21 1023 mov errcode,#0x21 04A7 90 7F B5 1024 mov dptr,#IN0BC 04AA E4 1025 clr a 04AB F0 1026 movx @dptr,a 04AC 02 04 FC 1027 ljmp setupack 04AF 1028 cmdnotb9: 1029 ;; 0xc8 04AF B4 C8 19 1030 cjne a,#0xc8,cmdnotc8 04B2 90 7F E8 1031 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04B5 E0 1032 movx a,@dptr 04B6 B4 C0 0F 1033 cjne a,#0xc0,setupstallc8 04B9 74 05 1034 mov a,#5 04BB 90 7F 00 1035 mov dptr,#IN0BUF 04BE F0 1036 movx @dptr,a 04BF 90 7F B5 1037 mov dptr,#IN0BC 04C2 74 01 1038 mov a,#1 04C4 F0 1039 movx @dptr,a 04C5 02 04 FC 1040 ljmp setupack 04C8 1041 setupstallc8: 04C8 02 04 F8 1042 ljmp setupstall 04CB 1043 cmdnotc8: 1044 ;; 0xc9 04CB B4 C9 2A 1045 cjne a,#0xc9,cmdnotc9 04CE 90 7F E8 1046 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04D1 E0 1047 movx a,@dptr 04D2 B4 C0 20 1048 cjne a,#0xc0,setupstallc9 04D5 90 7F 00 1049 mov dptr,#IN0BUF 04D8 05 86 1050 inc dps 04DA 90 00 F2 1051 mov dptr,#stringserial+2 04DD 7F 06 1052 mov r7,#(stringserialsz-2)/2 04DF E0 1053 0$: movx a,@dptr 04E0 A3 1054 inc dptr 04E1 A3 1055 inc dptr 04E2 15 86 1056 dec dps 04E4 F0 1057 movx @dptr,a 04E5 A3 1058 inc dptr 04E6 05 86 1059 inc dps 04E8 DF F5 1060 djnz r7,0$ 04EA 15 86 1061 dec dps 04EC 74 06 1062 mov a,#(stringserialsz-2)/2 04EE 90 7F B5 1063 mov dptr,#IN0BC 04F1 F0 1064 movx @dptr,a 04F2 02 04 FC 1065 ljmp setupack 04F5 1066 setupstallc9: 04F5 02 04 F8 1067 ljmp setupstall 04F8 1068 cmdnotc9: 1069 ;; unknown commands fall through to setupstall 1070 04F8 1071 setupstall: 04F8 74 03 1072 mov a,#3 04FA 80 02 1073 sjmp endsetup 04FC 1074 setupack: 04FC 74 02 1075 mov a,#2 04FE 1076 endsetup: 04FE 90 7F B4 1077 mov dptr,#EP0CS 0501 F0 1078 movx @dptr,a 0502 1079 endusbisr: 1080 ;; epilogue 0502 D0 07 1081 pop ar7 0504 D0 00 1082 pop ar0 0506 D0 86 1083 pop dps 0508 D0 D0 1084 pop psw 050A D0 85 1085 pop dph1 050C D0 84 1086 pop dpl1 050E D0 83 1087 pop dph0 0510 D0 82 1088 pop dpl0 0512 D0 F0 1089 pop b 0514 D0 E0 1090 pop acc 0516 32 1091 reti 1092 0517 1093 usb_sof_isr: 0517 C0 E0 1094 push acc 0519 C0 F0 1095 push b 051B C0 82 1096 push dpl0 051D C0 83 1097 push dph0 051F C0 D0 1098 push psw 0521 75 D0 00 1099 mov psw,#0x00 0524 C0 86 1100 push dps 0526 75 86 00 1101 mov dps,#0 1102 ;; clear interrupt 0529 E5 91 1103 mov a,exif 052B C2 E4 1104 clr acc.4 052D F5 91 1105 mov exif,a 052F 90 7F AB 1106 mov dptr,#USBIRQ 0532 74 02 1107 mov a,#0x02 0534 F0 1108 movx @dptr,a 1109 ;; handle interrupt 1110 ;; epilogue 0535 D0 86 1111 pop dps 0537 D0 D0 1112 pop psw 0539 D0 83 1113 pop dph0 053B D0 82 1114 pop dpl0 053D D0 F0 1115 pop b 053F D0 E0 1116 pop acc 0541 32 1117 reti 1118 1119 0542 1120 usb_sutok_isr: 0542 C0 E0 1121 push acc 0544 C0 F0 1122 push b 0546 C0 82 1123 push dpl0 0548 C0 83 1124 push dph0 054A C0 D0 1125 push psw 054C 75 D0 00 1126 mov psw,#0x00 054F C0 86 1127 push dps 0551 75 86 00 1128 mov dps,#0 1129 ;; clear interrupt 0554 E5 91 1130 mov a,exif 0556 C2 E4 1131 clr acc.4 0558 F5 91 1132 mov exif,a 055A 90 7F AB 1133 mov dptr,#USBIRQ 055D 74 04 1134 mov a,#0x04 055F F0 1135 movx @dptr,a 1136 ;; handle interrupt 1137 ;; epilogue 0560 D0 86 1138 pop dps 0562 D0 D0 1139 pop psw 0564 D0 83 1140 pop dph0 0566 D0 82 1141 pop dpl0 0568 D0 F0 1142 pop b 056A D0 E0 1143 pop acc 056C 32 1144 reti 1145 056D 1146 usb_suspend_isr: 056D C0 E0 1147 push acc 056F C0 F0 1148 push b 0571 C0 82 1149 push dpl0 0573 C0 83 1150 push dph0 0575 C0 D0 1151 push psw 0577 75 D0 00 1152 mov psw,#0x00 057A C0 86 1153 push dps 057C 75 86 00 1154 mov dps,#0 1155 ;; clear interrupt 057F E5 91 1156 mov a,exif 0581 C2 E4 1157 clr acc.4 0583 F5 91 1158 mov exif,a 0585 90 7F AB 1159 mov dptr,#USBIRQ 0588 74 08 1160 mov a,#0x08 058A F0 1161 movx @dptr,a 1162 ;; handle interrupt 1163 ;; epilogue 058B D0 86 1164 pop dps 058D D0 D0 1165 pop psw 058F D0 83 1166 pop dph0 0591 D0 82 1167 pop dpl0 0593 D0 F0 1168 pop b 0595 D0 E0 1169 pop acc 0597 32 1170 reti 1171 0598 1172 usb_usbreset_isr: 0598 C0 E0 1173 push acc 059A C0 F0 1174 push b 059C C0 82 1175 push dpl0 059E C0 83 1176 push dph0 05A0 C0 D0 1177 push psw 05A2 75 D0 00 1178 mov psw,#0x00 05A5 C0 86 1179 push dps 05A7 75 86 00 1180 mov dps,#0 1181 ;; clear interrupt 05AA E5 91 1182 mov a,exif 05AC C2 E4 1183 clr acc.4 05AE F5 91 1184 mov exif,a 05B0 90 7F AB 1185 mov dptr,#USBIRQ 05B3 74 10 1186 mov a,#0x10 05B5 F0 1187 movx @dptr,a 1188 ;; handle interrupt 1189 ;; epilogue 05B6 D0 86 1190 pop dps 05B8 D0 D0 1191 pop psw 05BA D0 83 1192 pop dph0 05BC D0 82 1193 pop dpl0 05BE D0 F0 1194 pop b 05C0 D0 E0 1195 pop acc 05C2 32 1196 reti 1197 05C3 1198 usb_ep0in_isr: 05C3 C0 E0 1199 push acc 05C5 C0 F0 1200 push b 05C7 C0 82 1201 push dpl0 05C9 C0 83 1202 push dph0 05CB C0 84 1203 push dpl1 05CD C0 85 1204 push dph1 05CF C0 D0 1205 push psw 05D1 75 D0 00 1206 mov psw,#0x00 05D4 C0 86 1207 push dps 05D6 75 86 00 1208 mov dps,#0 05D9 C0 00 1209 push ar0 05DB C0 07 1210 push ar7 1211 ;; clear interrupt 05DD E5 91 1212 mov a,exif 05DF C2 E4 1213 clr acc.4 05E1 F5 91 1214 mov exif,a 05E3 90 7F A9 1215 mov dptr,#IN07IRQ 05E6 74 01 1216 mov a,#0x01 05E8 F0 1217 movx @dptr,a 1218 ;; handle interrupt 05E9 E5 46 1219 mov a,ctrlcode 05EB B4 02 05 1220 cjne a,#2,0$ 05EE 12 03 68 1221 lcall xmemread 05F1 80 11 1222 sjmp ep0inendisr 05F3 90 7F B5 1223 0$: mov dptr,#IN0BC 05F6 E4 1224 clr a 05F7 F0 1225 movx @dptr,a 05F8 80 04 1226 sjmp ep0inack 1227 05FA 1228 ep0install: 05FA 74 03 1229 mov a,#3 05FC 80 02 1230 sjmp ep0incs 05FE 1231 ep0inack: 05FE 74 02 1232 mov a,#2 0600 1233 ep0incs: 0600 90 7F B4 1234 mov dptr,#EP0CS 0603 F0 1235 movx @dptr,a 0604 1236 ep0inendisr: 1237 ;; epilogue 0604 D0 07 1238 pop ar7 0606 D0 00 1239 pop ar0 0608 D0 86 1240 pop dps 060A D0 D0 1241 pop psw 060C D0 85 1242 pop dph1 060E D0 84 1243 pop dpl1 0610 D0 83 1244 pop dph0 0612 D0 82 1245 pop dpl0 0614 D0 F0 1246 pop b 0616 D0 E0 1247 pop acc 0618 32 1248 reti 1249 0619 1250 usb_ep0out_isr: 0619 C0 E0 1251 push acc 061B C0 F0 1252 push b 061D C0 82 1253 push dpl0 061F C0 83 1254 push dph0 0621 C0 84 1255 push dpl1 0623 C0 85 1256 push dph1 0625 C0 D0 1257 push psw 0627 75 D0 00 1258 mov psw,#0x00 062A C0 86 1259 push dps 062C 75 86 00 1260 mov dps,#0 062F C0 07 1261 push ar7 1262 ;; clear interrupt 0631 E5 91 1263 mov a,exif 0633 C2 E4 1264 clr acc.4 0635 F5 91 1265 mov exif,a 0637 90 7F AA 1266 mov dptr,#OUT07IRQ 063A 74 01 1267 mov a,#0x01 063C F0 1268 movx @dptr,a 1269 ;; handle interrupt 063D E5 46 1270 mov a,ctrlcode ; check control code 063F B4 01 36 1271 cjne a,#0x01,ep0outstall 1272 ;; write to external memory 0642 90 7F C5 1273 mov dptr,#OUT0BC 0645 E0 1274 movx a,@dptr 0646 60 28 1275 jz 0$ 0648 FF 1276 mov r7,a 0649 C3 1277 clr c 064A E5 49 1278 mov a,ctrllen 064C 9F 1279 subb a,r7 064D F5 49 1280 mov ctrllen,a 064F E5 4A 1281 mov a,ctrllen+1 0651 94 00 1282 subb a,#0 0653 F5 4A 1283 mov ctrllen+1,a 0655 40 21 1284 jc ep0outstall 0657 90 7E C0 1285 mov dptr,#OUT0BUF 065A 85 47 84 1286 mov dpl1,ctrladdr 065D 85 48 85 1287 mov dph1,ctrladdr+1 0660 E0 1288 1$: movx a,@dptr 0661 A3 1289 inc dptr 0662 05 86 1290 inc dps 0664 F0 1291 movx @dptr,a 0665 A3 1292 inc dptr 0666 15 86 1293 dec dps 0668 DF F6 1294 djnz r7,1$ 066A 85 84 47 1295 mov ctrladdr,dpl1 066D 85 85 48 1296 mov ctrladdr+1,dph1 0670 E5 49 1297 0$: mov a,ctrllen 0672 45 4A 1298 orl a,ctrllen+1 0674 60 09 1299 jz ep0outack 0676 80 10 1300 sjmp ep0outendisr 1301 0678 1302 ep0outstall: 0678 75 46 00 1303 mov ctrlcode,#0 067B 74 03 1304 mov a,#3 067D 80 05 1305 sjmp ep0outcs 067F 1306 ep0outack: 067F 75 46 00 1307 mov ctrlcode,#0 0682 74 02 1308 mov a,#2 0684 1309 ep0outcs: 0684 90 7F B4 1310 mov dptr,#EP0CS 0687 F0 1311 movx @dptr,a 0688 1312 ep0outendisr: 1313 ;; epilogue 0688 D0 07 1314 pop ar7 068A D0 86 1315 pop dps 068C D0 D0 1316 pop psw 068E D0 85 1317 pop dph1 0690 D0 84 1318 pop dpl1 0692 D0 83 1319 pop dph0 0694 D0 82 1320 pop dpl0 0696 D0 F0 1321 pop b 0698 D0 E0 1322 pop acc 069A 32 1323 reti 1324 069B 1325 fillusbintr:: 069B 90 7E 80 1326 mov dptr,#IN1BUF 069E E5 40 1327 mov a,errcode 06A0 F0 1328 movx @dptr,a 06A1 A3 1329 inc dptr 06A2 E5 41 1330 mov a,errval 06A4 F0 1331 movx @dptr,a 06A5 A3 1332 inc dptr 06A6 E5 42 1333 mov a,cfgcount 06A8 F0 1334 movx @dptr,a 06A9 A3 1335 inc dptr 06AA E5 43 1336 mov a,cfgcount+1 06AC F0 1337 movx @dptr,a 06AD A3 1338 inc dptr 06AE E5 45 1339 mov a,irqcount 06B0 F0 1340 movx @dptr,a 06B1 90 7F B7 1341 mov dptr,#IN1BC 06B4 74 05 1342 mov a,#5 06B6 F0 1343 movx @dptr,a 06B7 05 45 1344 inc irqcount 06B9 22 1345 ret 1346 06BA 1347 usb_ep1in_isr: 06BA C0 E0 1348 push acc 06BC C0 F0 1349 push b 06BE C0 82 1350 push dpl0 06C0 C0 83 1351 push dph0 06C2 C0 D0 1352 push psw 06C4 75 D0 00 1353 mov psw,#0x00 06C7 C0 86 1354 push dps 06C9 75 86 00 1355 mov dps,#0 1356 ;; clear interrupt 06CC E5 91 1357 mov a,exif 06CE C2 E4 1358 clr acc.4 06D0 F5 91 1359 mov exif,a 06D2 90 7F A9 1360 mov dptr,#IN07IRQ 06D5 74 02 1361 mov a,#0x02 06D7 F0 1362 movx @dptr,a 1363 ;; handle interrupt 06D8 12 06 9B 1364 lcall fillusbintr 1365 ;; epilogue 06DB D0 86 1366 pop dps 06DD D0 D0 1367 pop psw 06DF D0 83 1368 pop dph0 06E1 D0 82 1369 pop dpl0 06E3 D0 F0 1370 pop b 06E5 D0 E0 1371 pop acc 06E7 32 1372 reti 1373 06E8 1374 usb_ep1out_isr: 06E8 C0 E0 1375 push acc 06EA C0 F0 1376 push b 06EC C0 82 1377 push dpl0 06EE C0 83 1378 push dph0 06F0 C0 D0 1379 push psw 06F2 75 D0 00 1380 mov psw,#0x00 06F5 C0 86 1381 push dps 06F7 75 86 00 1382 mov dps,#0 1383 ;; clear interrupt 06FA E5 91 1384 mov a,exif 06FC C2 E4 1385 clr acc.4 06FE F5 91 1386 mov exif,a 0700 90 7F AA 1387 mov dptr,#OUT07IRQ 0703 74 02 1388 mov a,#0x02 0705 F0 1389 movx @dptr,a 1390 ;; handle interrupt 1391 ;; epilogue 0706 D0 86 1392 pop dps 0708 D0 D0 1393 pop psw 070A D0 83 1394 pop dph0 070C D0 82 1395 pop dpl0 070E D0 F0 1396 pop b 0710 D0 E0 1397 pop acc 0712 32 1398 reti 1399 0713 1400 usb_ep2in_isr: 0713 C0 E0 1401 push acc 0715 C0 F0 1402 push b 0717 C0 82 1403 push dpl0 0719 C0 83 1404 push dph0 071B C0 D0 1405 push psw 071D 75 D0 00 1406 mov psw,#0x00 0720 C0 86 1407 push dps 0722 75 86 00 1408 mov dps,#0 1409 ;; clear interrupt 0725 E5 91 1410 mov a,exif 0727 C2 E4 1411 clr acc.4 0729 F5 91 1412 mov exif,a 072B 90 7F A9 1413 mov dptr,#IN07IRQ 072E 74 04 1414 mov a,#0x04 0730 F0 1415 movx @dptr,a 1416 ;; handle interrupt 1417 ;; epilogue 0731 D0 86 1418 pop dps 0733 D0 D0 1419 pop psw 0735 D0 83 1420 pop dph0 0737 D0 82 1421 pop dpl0 0739 D0 F0 1422 pop b 073B D0 E0 1423 pop acc 073D 32 1424 reti 1425 073E 1426 usb_ep2out_isr: 073E C0 E0 1427 push acc 0740 C0 F0 1428 push b 0742 C0 82 1429 push dpl0 0744 C0 83 1430 push dph0 0746 C0 D0 1431 push psw 0748 75 D0 00 1432 mov psw,#0x00 074B C0 86 1433 push dps 074D 75 86 00 1434 mov dps,#0 1435 ;; clear interrupt 0750 E5 91 1436 mov a,exif 0752 C2 E4 1437 clr acc.4 0754 F5 91 1438 mov exif,a 0756 90 7F AA 1439 mov dptr,#OUT07IRQ 0759 74 04 1440 mov a,#0x04 075B F0 1441 movx @dptr,a 1442 ;; handle interrupt 1443 ;; epilogue 075C D0 86 1444 pop dps 075E D0 D0 1445 pop psw 0760 D0 83 1446 pop dph0 0762 D0 82 1447 pop dpl0 0764 D0 F0 1448 pop b 0766 D0 E0 1449 pop acc 0768 32 1450 reti 1451 0769 1452 usb_ep3in_isr: 0769 C0 E0 1453 push acc 076B C0 F0 1454 push b 076D C0 82 1455 push dpl0 076F C0 83 1456 push dph0 0771 C0 D0 1457 push psw 0773 75 D0 00 1458 mov psw,#0x00 0776 C0 86 1459 push dps 0778 75 86 00 1460 mov dps,#0 1461 ;; clear interrupt 077B E5 91 1462 mov a,exif 077D C2 E4 1463 clr acc.4 077F F5 91 1464 mov exif,a 0781 90 7F A9 1465 mov dptr,#IN07IRQ 0784 74 08 1466 mov a,#0x08 0786 F0 1467 movx @dptr,a 1468 ;; handle interrupt 1469 ;; epilogue 0787 D0 86 1470 pop dps 0789 D0 D0 1471 pop psw 078B D0 83 1472 pop dph0 078D D0 82 1473 pop dpl0 078F D0 F0 1474 pop b 0791 D0 E0 1475 pop acc 0793 32 1476 reti 1477 0794 1478 usb_ep3out_isr: 0794 C0 E0 1479 push acc 0796 C0 F0 1480 push b 0798 C0 82 1481 push dpl0 079A C0 83 1482 push dph0 079C C0 D0 1483 push psw 079E 75 D0 00 1484 mov psw,#0x00 07A1 C0 86 1485 push dps 07A3 75 86 00 1486 mov dps,#0 1487 ;; clear interrupt 07A6 E5 91 1488 mov a,exif 07A8 C2 E4 1489 clr acc.4 07AA F5 91 1490 mov exif,a 07AC 90 7F AA 1491 mov dptr,#OUT07IRQ 07AF 74 08 1492 mov a,#0x08 07B1 F0 1493 movx @dptr,a 1494 ;; handle interrupt 1495 ;; epilogue 07B2 D0 86 1496 pop dps 07B4 D0 D0 1497 pop psw 07B6 D0 83 1498 pop dph0 07B8 D0 82 1499 pop dpl0 07BA D0 F0 1500 pop b 07BC D0 E0 1501 pop acc 07BE 32 1502 reti 1503 07BF 1504 usb_ep4in_isr: 07BF C0 E0 1505 push acc 07C1 C0 F0 1506 push b 07C3 C0 82 1507 push dpl0 07C5 C0 83 1508 push dph0 07C7 C0 D0 1509 push psw 07C9 75 D0 00 1510 mov psw,#0x00 07CC C0 86 1511 push dps 07CE 75 86 00 1512 mov dps,#0 1513 ;; clear interrupt 07D1 E5 91 1514 mov a,exif 07D3 C2 E4 1515 clr acc.4 07D5 F5 91 1516 mov exif,a 07D7 90 7F A9 1517 mov dptr,#IN07IRQ 07DA 74 10 1518 mov a,#0x10 07DC F0 1519 movx @dptr,a 1520 ;; handle interrupt 1521 ;; epilogue 07DD D0 86 1522 pop dps 07DF D0 D0 1523 pop psw 07E1 D0 83 1524 pop dph0 07E3 D0 82 1525 pop dpl0 07E5 D0 F0 1526 pop b 07E7 D0 E0 1527 pop acc 07E9 32 1528 reti 1529 07EA 1530 usb_ep4out_isr: 07EA C0 E0 1531 push acc 07EC C0 F0 1532 push b 07EE C0 82 1533 push dpl0 07F0 C0 83 1534 push dph0 07F2 C0 D0 1535 push psw 07F4 75 D0 00 1536 mov psw,#0x00 07F7 C0 86 1537 push dps 07F9 75 86 00 1538 mov dps,#0 1539 ;; clear interrupt 07FC E5 91 1540 mov a,exif 07FE C2 E4 1541 clr acc.4 0800 F5 91 1542 mov exif,a 0802 90 7F AA 1543 mov dptr,#OUT07IRQ 0805 74 10 1544 mov a,#0x10 0807 F0 1545 movx @dptr,a 1546 ;; handle interrupt 1547 ;; epilogue 0808 D0 86 1548 pop dps 080A D0 D0 1549 pop psw 080C D0 83 1550 pop dph0 080E D0 82 1551 pop dpl0 0810 D0 F0 1552 pop b 0812 D0 E0 1553 pop acc 0814 32 1554 reti 1555 0815 1556 usb_ep5in_isr: 0815 C0 E0 1557 push acc 0817 C0 F0 1558 push b 0819 C0 82 1559 push dpl0 081B C0 83 1560 push dph0 081D C0 D0 1561 push psw 081F 75 D0 00 1562 mov psw,#0x00 0822 C0 86 1563 push dps 0824 75 86 00 1564 mov dps,#0 1565 ;; clear interrupt 0827 E5 91 1566 mov a,exif 0829 C2 E4 1567 clr acc.4 082B F5 91 1568 mov exif,a 082D 90 7F A9 1569 mov dptr,#IN07IRQ 0830 74 20 1570 mov a,#0x20 0832 F0 1571 movx @dptr,a 1572 ;; handle interrupt 1573 ;; epilogue 0833 D0 86 1574 pop dps 0835 D0 D0 1575 pop psw 0837 D0 83 1576 pop dph0 0839 D0 82 1577 pop dpl0 083B D0 F0 1578 pop b 083D D0 E0 1579 pop acc 083F 32 1580 reti 1581 0840 1582 usb_ep5out_isr: 0840 C0 E0 1583 push acc 0842 C0 F0 1584 push b 0844 C0 82 1585 push dpl0 0846 C0 83 1586 push dph0 0848 C0 D0 1587 push psw 084A 75 D0 00 1588 mov psw,#0x00 084D C0 86 1589 push dps 084F 75 86 00 1590 mov dps,#0 1591 ;; clear interrupt 0852 E5 91 1592 mov a,exif 0854 C2 E4 1593 clr acc.4 0856 F5 91 1594 mov exif,a 0858 90 7F AA 1595 mov dptr,#OUT07IRQ 085B 74 20 1596 mov a,#0x20 085D F0 1597 movx @dptr,a 1598 ;; handle interrupt 1599 ;; epilogue 085E D0 86 1600 pop dps 0860 D0 D0 1601 pop psw 0862 D0 83 1602 pop dph0 0864 D0 82 1603 pop dpl0 0866 D0 F0 1604 pop b 0868 D0 E0 1605 pop acc 086A 32 1606 reti 1607 086B 1608 usb_ep6in_isr: 086B C0 E0 1609 push acc 086D C0 F0 1610 push b 086F C0 82 1611 push dpl0 0871 C0 83 1612 push dph0 0873 C0 D0 1613 push psw 0875 75 D0 00 1614 mov psw,#0x00 0878 C0 86 1615 push dps 087A 75 86 00 1616 mov dps,#0 1617 ;; clear interrupt 087D E5 91 1618 mov a,exif 087F C2 E4 1619 clr acc.4 0881 F5 91 1620 mov exif,a 0883 90 7F A9 1621 mov dptr,#IN07IRQ 0886 74 40 1622 mov a,#0x40 0888 F0 1623 movx @dptr,a 1624 ;; handle interrupt 1625 ;; epilogue 0889 D0 86 1626 pop dps 088B D0 D0 1627 pop psw 088D D0 83 1628 pop dph0 088F D0 82 1629 pop dpl0 0891 D0 F0 1630 pop b 0893 D0 E0 1631 pop acc 0895 32 1632 reti 1633 0896 1634 usb_ep6out_isr: 0896 C0 E0 1635 push acc 0898 C0 F0 1636 push b 089A C0 82 1637 push dpl0 089C C0 83 1638 push dph0 089E C0 D0 1639 push psw 08A0 75 D0 00 1640 mov psw,#0x00 08A3 C0 86 1641 push dps 08A5 75 86 00 1642 mov dps,#0 1643 ;; clear interrupt 08A8 E5 91 1644 mov a,exif 08AA C2 E4 1645 clr acc.4 08AC F5 91 1646 mov exif,a 08AE 90 7F AA 1647 mov dptr,#OUT07IRQ 08B1 74 40 1648 mov a,#0x40 08B3 F0 1649 movx @dptr,a 1650 ;; handle interrupt 1651 ;; epilogue 08B4 D0 86 1652 pop dps 08B6 D0 D0 1653 pop psw 08B8 D0 83 1654 pop dph0 08BA D0 82 1655 pop dpl0 08BC D0 F0 1656 pop b 08BE D0 E0 1657 pop acc 08C0 32 1658 reti 1659 08C1 1660 usb_ep7in_isr: 08C1 C0 E0 1661 push acc 08C3 C0 F0 1662 push b 08C5 C0 82 1663 push dpl0 08C7 C0 83 1664 push dph0 08C9 C0 D0 1665 push psw 08CB 75 D0 00 1666 mov psw,#0x00 08CE C0 86 1667 push dps 08D0 75 86 00 1668 mov dps,#0 1669 ;; clear interrupt 08D3 E5 91 1670 mov a,exif 08D5 C2 E4 1671 clr acc.4 08D7 F5 91 1672 mov exif,a 08D9 90 7F A9 1673 mov dptr,#IN07IRQ 08DC 74 80 1674 mov a,#0x80 08DE F0 1675 movx @dptr,a 1676 ;; handle interrupt 1677 ;; epilogue 08DF D0 86 1678 pop dps 08E1 D0 D0 1679 pop psw 08E3 D0 83 1680 pop dph0 08E5 D0 82 1681 pop dpl0 08E7 D0 F0 1682 pop b 08E9 D0 E0 1683 pop acc 08EB 32 1684 reti 1685 08EC 1686 usb_ep7out_isr: 08EC C0 E0 1687 push acc 08EE C0 F0 1688 push b 08F0 C0 82 1689 push dpl0 08F2 C0 83 1690 push dph0 08F4 C0 D0 1691 push psw 08F6 75 D0 00 1692 mov psw,#0x00 08F9 C0 86 1693 push dps 08FB 75 86 00 1694 mov dps,#0 1695 ;; clear interrupt 08FE E5 91 1696 mov a,exif 0900 C2 E4 1697 clr acc.4 0902 F5 91 1698 mov exif,a 0904 90 7F AA 1699 mov dptr,#OUT07IRQ 0907 74 80 1700 mov a,#0x80 0909 F0 1701 movx @dptr,a 1702 ;; handle interrupt 1703 ;; epilogue 090A D0 86 1704 pop dps 090C D0 D0 1705 pop psw 090E D0 83 1706 pop dph0 0910 D0 82 1707 pop dpl0 0912 D0 F0 1708 pop b 0914 D0 E0 1709 pop acc 0916 32 1710 reti 1711 1712 1713 ;; ----------------------------------------------------- 1714 ;; USB descriptors 1715 ;; ----------------------------------------------------- 1716 1717 ;; Device and/or Interface Class codes 0000 1718 USB_CLASS_PER_INTERFACE = 0 0001 1719 USB_CLASS_AUDIO = 1 0002 1720 USB_CLASS_COMM = 2 0003 1721 USB_CLASS_HID = 3 0007 1722 USB_CLASS_PRINTER = 7 0008 1723 USB_CLASS_MASS_STORAGE = 8 0009 1724 USB_CLASS_HUB = 9 00FF 1725 USB_CLASS_VENDOR_SPEC = 0xff 1726 0001 1727 USB_SUBCLASS_AUDIOCONTROL = 1 0002 1728 USB_SUBCLASS_AUDIOSTREAMING = 2 1729 1730 ;; Descriptor types 0001 1731 USB_DT_DEVICE = 0x01 0002 1732 USB_DT_CONFIG = 0x02 0003 1733 USB_DT_STRING = 0x03 0004 1734 USB_DT_INTERFACE = 0x04 0005 1735 USB_DT_ENDPOINT = 0x05 1736 1737 ;; Audio Class descriptor types 0020 1738 USB_DT_AUDIO_UNDEFINED = 0x20 0021 1739 USB_DT_AUDIO_DEVICE = 0x21 0022 1740 USB_DT_AUDIO_CONFIG = 0x22 0023 1741 USB_DT_AUDIO_STRING = 0x23 0024 1742 USB_DT_AUDIO_INTERFACE = 0x24 0025 1743 USB_DT_AUDIO_ENDPOINT = 0x25 1744 0000 1745 USB_SDT_AUDIO_UNDEFINED = 0x00 0001 1746 USB_SDT_AUDIO_HEADER = 0x01 0002 1747 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 0003 1748 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 0004 1749 USB_SDT_AUDIO_MIXER_UNIT = 0x04 0005 1750 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 0006 1751 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 0007 1752 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 0008 1753 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 1754 1755 ;; Standard requests 0000 1756 USB_REQ_GET_STATUS = 0x00 0001 1757 USB_REQ_CLEAR_FEATURE = 0x01 0003 1758 USB_REQ_SET_FEATURE = 0x03 0005 1759 USB_REQ_SET_ADDRESS = 0x05 0006 1760 USB_REQ_GET_DESCRIPTOR = 0x06 0007 1761 USB_REQ_SET_DESCRIPTOR = 0x07 0008 1762 USB_REQ_GET_CONFIGURATION = 0x08 0009 1763 USB_REQ_SET_CONFIGURATION = 0x09 000A 1764 USB_REQ_GET_INTERFACE = 0x0A 000B 1765 USB_REQ_SET_INTERFACE = 0x0B 000C 1766 USB_REQ_SYNCH_FRAME = 0x0C 1767 1768 ;; Audio Class Requests 0001 1769 USB_REQ_AUDIO_SET_CUR = 0x01 0081 1770 USB_REQ_AUDIO_GET_CUR = 0x81 0002 1771 USB_REQ_AUDIO_SET_MIN = 0x02 0082 1772 USB_REQ_AUDIO_GET_MIN = 0x82 0003 1773 USB_REQ_AUDIO_SET_MAX = 0x03 0083 1774 USB_REQ_AUDIO_GET_MAX = 0x83 0004 1775 USB_REQ_AUDIO_SET_RES = 0x04 0084 1776 USB_REQ_AUDIO_GET_RES = 0x84 0005 1777 USB_REQ_AUDIO_SET_MEM = 0x05 0085 1778 USB_REQ_AUDIO_GET_MEM = 0x85 00FF 1779 USB_REQ_AUDIO_GET_STAT = 0xff 1780 1781 ;; USB Request Type and Endpoint Directions 0000 1782 USB_DIR_OUT = 0 0080 1783 USB_DIR_IN = 0x80 1784 0000 1785 USB_TYPE_STANDARD = (0x00 << 5) 0020 1786 USB_TYPE_CLASS = (0x01 << 5) 0040 1787 USB_TYPE_VENDOR = (0x02 << 5) 0060 1788 USB_TYPE_RESERVED = (0x03 << 5) 1789 0000 1790 USB_RECIP_DEVICE = 0x00 0001 1791 USB_RECIP_INTERFACE = 0x01 0002 1792 USB_RECIP_ENDPOINT = 0x02 0003 1793 USB_RECIP_OTHER = 0x03 1794 1795 ;; Request target types. 0000 1796 USB_RT_DEVICE = 0x00 0001 1797 USB_RT_INTERFACE = 0x01 0002 1798 USB_RT_ENDPOINT = 0x02 1799 BAC0 1800 VENDID = 0xbac0 6134 1801 PRODID = 0x6134 1802 baycomusb-0.10.orig/firmware/bscanfirmware/main.map0100644000175100017510000000670307325134422020502 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 s_OSEG 0000 l__CODE 0000 s__CODE 0000 l_BSEG 0000 s_CODE 0000 s_BSEG 0000 l_OSEG 0008 l_GSINIT 000B l_DSEG 002C l_XSEG 0040 s_DSEG 0080 l_ISEG 0080 s_ISEG 0120 l_GSINIT2 0157 l_CODE 0157 s_CSEG 07C0 l_CSEG 0917 s_GSINIT 091F s_GSINIT2 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 0157 = 343. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 0157 07C0 = 1984. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:0368 xmemread 0C:069B fillusbintr Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT 0917 0008 = 8. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT2 091F 0120 = 288. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ OSEG 0000 0000 = 0. bytes (REL,OVR) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 0000 = 0. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0080 = 128. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 000B = 11. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 002C = 44. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/bscanfirmware/main.asm0100644000175100017510000006415207325134422020507 0ustar abaaba .module main ;; define code segments link order .area CODE (CODE) .area CSEG (CODE) .area GSINIT (CODE) .area GSINIT2 (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; FPGA defines XC4K_IRLENGTH = 3 XC4K_EXTEST = 0 XC4K_PRELOAD = 1 XC4K_CONFIGURE = 5 XC4K_BYPASS = 7 FPGA_CONFIGSIZE = 11876 FPGA_BOUND = 344 ; in bits FPGA_BOUND_BYTES = ((FPGA_BOUND-1)/8) FPGA_BOUND_RESIDUE = (FPGA_BOUND-8*FPGA_BOUND_BYTES) FPGA_BOUND_BSIZE = ((FPGA_BOUND+7)/8) ;; ----------------------------------------------------- .area CODE (CODE) ljmp startup ljmp int0_isr .ds 5 ljmp timer0_isr .ds 5 ljmp int1_isr .ds 5 ljmp timer1_isr .ds 5 ljmp ser0_isr .ds 5 ljmp timer2_isr .ds 5 ljmp resume_isr .ds 5 ljmp ser1_isr .ds 5 ljmp usb_isr .ds 5 ljmp i2c_isr .ds 5 ljmp int4_isr .ds 5 ljmp int5_isr .ds 5 ljmp int6_isr .ds 0x8a stringserial: .db stringserialsz ; bLength .db USB_DT_STRING ; bDescriptorType .db '0,0,'0,0,'0,0,'0,0,'0,0,'1,0 stringserialsz = . - stringserial .ds 0x10-stringserialsz usb_isr: ljmp usb_sudav_isr .ds 1 ljmp usb_sof_isr .ds 1 ljmp usb_sutok_isr .ds 1 ljmp usb_suspend_isr .ds 1 ljmp usb_usbreset_isr .ds 1 reti .ds 3 ljmp usb_ep0in_isr .ds 1 ljmp usb_ep0out_isr .ds 1 ljmp usb_ep1in_isr .ds 1 ljmp usb_ep1out_isr .ds 1 ljmp usb_ep2in_isr .ds 1 ljmp usb_ep2out_isr .ds 1 ljmp usb_ep3in_isr .ds 1 ljmp usb_ep3out_isr .ds 1 ljmp usb_ep4in_isr .ds 1 ljmp usb_ep4out_isr .ds 1 ljmp usb_ep5in_isr .ds 1 ljmp usb_ep5out_isr .ds 1 ljmp usb_ep6in_isr .ds 1 ljmp usb_ep6out_isr .ds 1 ljmp usb_ep7in_isr .ds 1 ljmp usb_ep7out_isr ;; ----------------------------------------------------- .area OSEG (OVR,DATA) .area BSEG (BIT) .area ISEG (DATA) stack: .ds 0x80 .area DSEG (DATA) errcode: .ds 1 errval: .ds 1 cfgcount: .ds 2 leddiv: .ds 1 irqcount: .ds 1 ctrlcode: .ds 1 ctrladdr: .ds 2 ctrllen: .ds 2 .area XSEG (DATA) fpgabound: .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff .db 0xff,0xcf,0xff,0xff,0xff,0xff,0xff,0xff .db 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff .db 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff .db 0xff,0xff,0xff,0xff .area GSINIT (CODE) startup: mov sp,#stack ; -1 clr a mov psw,a mov dps,a ;lcall __sdcc_external_startup ;mov a,dpl0 ;jz __sdcc_init_data ;ljmp __sdcc_program_startup __sdcc_init_data: .area GSINIT2 (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 __sdcc_program_startup: ;; assembler code startup clr a mov errcode,a mov errval,a mov cfgcount,a mov cfgcount+1,a mov irqcount,a mov ctrlcode,a ;; some indirect register setup mov ckcon,#0x31 ; one external wait state, to avoid chip bugs ;; Timer setup: ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 mov tmod,#0x21 mov tcon,#0x55 ; INT0/INT1 edge mov th1,#256-156 ; 1200 bauds mov pcon,#0 ; SMOD0=0 ;; init USB subsystem mov dptr,#ISOCTL mov a,#1 ; disable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a clr a mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR mov a,#0x9 ; pair EP 2&3 for input & output movx @dptr,a mov dptr,#IN07VAL mov a,#0x3 ; enable EP0+EP1 movx @dptr,a mov dptr,#OUT07VAL mov a,#0x5 ; enable EP0+EP2 movx @dptr,a ;; USB: init endpoint toggles mov dptr,#TOGCTL mov a,#0x12 movx @dptr,a mov a,#0x32 ; clear EP 2 in toggle movx @dptr,a mov a,#0x02 movx @dptr,a mov a,#0x22 ; clear EP 2 out toggle movx @dptr,a ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x80 ; set PROG lo movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0 movx @dptr,a mov dptr,#OUTC mov a,#0x20 movx @dptr,a mov dptr,#OEC mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO movx @dptr,a ;; enable interrupts mov ie,#0x82 ; enable timer 0 int mov eie,#0x01 ; enable USB interrupts mov dptr,#USBIEN mov a,#1 ; enable SUDAV interrupt movx @dptr,a mov dptr,#IN07IEN mov a,#1 ; enable EP0 interrupt movx @dptr,a mov dptr,#OUT07IEN mov a,#3 ; enable EP0+EP1 interrupt movx @dptr,a ;; initialize UART 0 for config loading mov scon0,#0x20 ; mode 0, CLK24/4 mov sbuf0,#0xff ;; initialize EP1 IN (irq) lcall fillusbintr ;; some short delay mov dptr,#OUTA mov a,#0x82 ; set PROG hi movx @dptr,a mov dptr,#PINSA movx a,@dptr jnb acc.2,1$ ;; DONE stuck high mov errcode,#0x80 ljmp fpgaerr 1$: lcall jtag_reset_tap mov r2,#5 mov r3,#0 mov r4,#6 lcall jtag_shiftout ; enter SHIFT-IR state mov r2,#8 mov r3,#0 mov r4,#0 lcall jtag_shiftout ; assume max. 8bit IR mov r2,#8 mov r3,#1 mov r4,#0 lcall jtag_shift ; shift in a single bit mov a,#-(1<>8,setupstallb2 mov ctrladdr,#fpgabound mov ctrladdr+1,#fpgabound>>8 mov ctrllen,#FPGA_BOUND_BSIZE mov ctrllen+1,#FPGA_BOUND_BSIZE>>8 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,1$ mov ctrlcode,#1 mov dptr,#OUT0BC movx @dptr,a ljmp endusbisr 1$: cjne a,#0xc0,setupstallb8 ; bRequestType == 0xc0 mov ctrlcode,#2 lcall xmemread ljmp endusbisr setupstallb8: ljmp setupstall cmdnotb8: ;; 0xb9 cjne a,#0xb9,cmdnotb9 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb8 mov a,errcode cjne a,#0x20,setupstallb8 mov errcode,#0x21 mov dptr,#IN0BC clr a movx @dptr,a ljmp setupack cmdnotb9: ;; 0xc8 cjne a,#0xc8,cmdnotc8 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc8 mov a,#5 mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a ljmp setupack setupstallc8: ljmp setupstall cmdnotc8: ;; 0xc9 cjne a,#0xc9,cmdnotc9 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc9 mov dptr,#IN0BUF inc dps mov dptr,#stringserial+2 mov r7,#(stringserialsz-2)/2 0$: movx a,@dptr inc dptr inc dptr dec dps movx @dptr,a inc dptr inc dps djnz r7,0$ dec dps mov a,#(stringserialsz-2)/2 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallc9: ljmp setupstall cmdnotc9: ;; unknown commands fall through to setupstall setupstall: mov a,#3 sjmp endsetup setupack: mov a,#2 endsetup: mov dptr,#EP0CS movx @dptr,a endusbisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sof_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sutok_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_suspend_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_usbreset_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep0in_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov a,ctrlcode cjne a,#2,0$ lcall xmemread sjmp ep0inendisr 0$: mov dptr,#IN0BC clr a movx @dptr,a sjmp ep0inack ep0install: mov a,#3 sjmp ep0incs ep0inack: mov a,#2 ep0incs: mov dptr,#EP0CS movx @dptr,a ep0inendisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_ep0out_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov a,ctrlcode ; check control code cjne a,#0x01,ep0outstall ;; write to external memory mov dptr,#OUT0BC movx a,@dptr jz 0$ mov r7,a clr c mov a,ctrllen subb a,r7 mov ctrllen,a mov a,ctrllen+1 subb a,#0 mov ctrllen+1,a jc ep0outstall mov dptr,#OUT0BUF mov dpl1,ctrladdr mov dph1,ctrladdr+1 1$: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r7,1$ mov ctrladdr,dpl1 mov ctrladdr+1,dph1 0$: mov a,ctrllen orl a,ctrllen+1 jz ep0outack sjmp ep0outendisr ep0outstall: mov ctrlcode,#0 mov a,#3 sjmp ep0outcs ep0outack: mov ctrlcode,#0 mov a,#2 ep0outcs: mov dptr,#EP0CS movx @dptr,a ep0outendisr: ;; epilogue pop ar7 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti fillusbintr:: mov dptr,#IN1BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,cfgcount movx @dptr,a inc dptr mov a,cfgcount+1 movx @dptr,a inc dptr mov a,irqcount movx @dptr,a mov dptr,#IN1BC mov a,#5 movx @dptr,a inc irqcount ret usb_ep1in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt lcall fillusbintr ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep1out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ;; ----------------------------------------------------- ;; USB descriptors ;; ----------------------------------------------------- ;; Device and/or Interface Class codes USB_CLASS_PER_INTERFACE = 0 USB_CLASS_AUDIO = 1 USB_CLASS_COMM = 2 USB_CLASS_HID = 3 USB_CLASS_PRINTER = 7 USB_CLASS_MASS_STORAGE = 8 USB_CLASS_HUB = 9 USB_CLASS_VENDOR_SPEC = 0xff USB_SUBCLASS_AUDIOCONTROL = 1 USB_SUBCLASS_AUDIOSTREAMING = 2 ;; Descriptor types USB_DT_DEVICE = 0x01 USB_DT_CONFIG = 0x02 USB_DT_STRING = 0x03 USB_DT_INTERFACE = 0x04 USB_DT_ENDPOINT = 0x05 ;; Audio Class descriptor types USB_DT_AUDIO_UNDEFINED = 0x20 USB_DT_AUDIO_DEVICE = 0x21 USB_DT_AUDIO_CONFIG = 0x22 USB_DT_AUDIO_STRING = 0x23 USB_DT_AUDIO_INTERFACE = 0x24 USB_DT_AUDIO_ENDPOINT = 0x25 USB_SDT_AUDIO_UNDEFINED = 0x00 USB_SDT_AUDIO_HEADER = 0x01 USB_SDT_AUDIO_INPUT_TERMINAL = 0x02 USB_SDT_AUDIO_OUTPUT_TERMINAL = 0x03 USB_SDT_AUDIO_MIXER_UNIT = 0x04 USB_SDT_AUDIO_SELECTOR_UNIT = 0x05 USB_SDT_AUDIO_FEATURE_UNIT = 0x06 USB_SDT_AUDIO_PROCESSING_UNIT = 0x07 USB_SDT_AUDIO_EXTENSION_UNIT = 0x08 ;; Standard requests USB_REQ_GET_STATUS = 0x00 USB_REQ_CLEAR_FEATURE = 0x01 USB_REQ_SET_FEATURE = 0x03 USB_REQ_SET_ADDRESS = 0x05 USB_REQ_GET_DESCRIPTOR = 0x06 USB_REQ_SET_DESCRIPTOR = 0x07 USB_REQ_GET_CONFIGURATION = 0x08 USB_REQ_SET_CONFIGURATION = 0x09 USB_REQ_GET_INTERFACE = 0x0A USB_REQ_SET_INTERFACE = 0x0B USB_REQ_SYNCH_FRAME = 0x0C ;; Audio Class Requests USB_REQ_AUDIO_SET_CUR = 0x01 USB_REQ_AUDIO_GET_CUR = 0x81 USB_REQ_AUDIO_SET_MIN = 0x02 USB_REQ_AUDIO_GET_MIN = 0x82 USB_REQ_AUDIO_SET_MAX = 0x03 USB_REQ_AUDIO_GET_MAX = 0x83 USB_REQ_AUDIO_SET_RES = 0x04 USB_REQ_AUDIO_GET_RES = 0x84 USB_REQ_AUDIO_SET_MEM = 0x05 USB_REQ_AUDIO_GET_MEM = 0x85 USB_REQ_AUDIO_GET_STAT = 0xff ;; USB Request Type and Endpoint Directions USB_DIR_OUT = 0 USB_DIR_IN = 0x80 USB_TYPE_STANDARD = (0x00 << 5) USB_TYPE_CLASS = (0x01 << 5) USB_TYPE_VENDOR = (0x02 << 5) USB_TYPE_RESERVED = (0x03 << 5) USB_RECIP_DEVICE = 0x00 USB_RECIP_INTERFACE = 0x01 USB_RECIP_ENDPOINT = 0x02 USB_RECIP_OTHER = 0x03 ;; Request target types. USB_RT_DEVICE = 0x00 USB_RT_INTERFACE = 0x01 USB_RT_ENDPOINT = 0x02 VENDID = 0xbac0 PRODID = 0x6134 baycomusb-0.10.orig/firmware/bscanfirmware/main.lnk0100644000175100017510000000014707325134422020505 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/firmware/dlfirmware/0042755000175100017510000000000007340500003016354 5ustar abaababaycomusb-0.10.orig/firmware/dlfirmware/Makefile.in0100644000175100017510000001376507340500003020430 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/dlfirmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/dlfirmware/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 = firmware/dlfirmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/dlfirmware/main.rel: $(top_srcdir)/firmware/dlfirmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/dlfirmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/dlfirmware/main.ihx: $(top_srcdir)/firmware/dlfirmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/dlfirmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/dlfirmware/Makefile.am0100644000175100017510000000075407325134422020424 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/dlfirmware/main.rel: $(top_srcdir)/firmware/dlfirmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/dlfirmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/dlfirmware/main.ihx $(top_srcdir)/firmware/dlfirmware/main.ihx: $(top_srcdir)/firmware/dlfirmware/main.rel cd $(top_srcdir)/firmware/dlfirmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk baycomusb-0.10.orig/firmware/dlfirmware/main.ihx0100644000175100017510000002121607325134422020022 0ustar abaaba:060000000209AB0202360A :03000B0002025797 :030013000202875F :03001B000202A836 :030023000202C90D :03002B000202ECE2 :0300330002030DB8 :03003B0002032E8F :03004300020100B7 :03004B000203515C :030053000203762F :03005B0002039B02 :030063000203C0D5 :03010000020429CD :030104000205945D :030108000205BF2E :03010C000205EAFF :03011000020615CF :0101140032B8 :030118000206409C :03011C0002069642 :0301200002074E85 :0301240002077C53 :030128000207A724 :03012C000207D2F5 :030130000207FDC6 :0301340002082896 :0301380002085367 :03013C0002087E38 :030140000208A909 :030144000208D4DA :030148000208FFAB :03014C0002092A7B :030150000209554C :030154000209801D :0809AB007581B0E4F5D0F5867A :0609B300E4F540F541F5FA :0409B90042F543F5CB :0C09BD0045F546758E3175892175885509 :0E09C900758D6475870090F448A3E582458320 :0E09D70070F9907FA17401F0907FAF7401F071 :0E09E500E4907FE0F0907FE1F0907FDD7409F8 :0E09F300F0907FDE7403F0907FDF7405F090CB :0E0A01007FD77412F07432F07402F07422F099 :0D0A0F00907F937400F0907F967480F090BB :0E0A1C007F9C74C2F0907F947400F0907F9DD8 :0E0A2A007400F0907F957400F0907F98742017 :0E0A3800F0907F9E742EF075A88275E80190F4 :0E0A46007FAE7401F0907FAC7403F0907FAD32 :0D0A54007401F07598207599FF12072F901E :0D0A61007F967482F0907F99E030E2067578 :060A6E004080020B9C1207 :0E0A740001577A057B007C0612015D7A087B33 :0D0A8200007C0012015D7A087B017C0012EF :0B0A8F00015D74F82F60087540818F36 :0B0A9A0041020B9C7A057B057C0C12CE :0C0AA500015D907F9E742AF07540019066 :0D0AB1007F9BE030E2FC7A037BFF7C0112AA :0E0ABE00015D907F967442F0907F937440F03B :0D0ACC00907F957402F0754010907FC8E493 :050AD900F0907FC9F060 :0E0ADE00907FC9F0907FC8E020E1F9907FC9B9 :0E0AEC00E024FE50ED907DC0E0B4FFE6A3E0F4 :080AFA00B404E1754011800B0A :0B0B0200907FC9F0907FC8E020E1F96F :0C0B0D00907FC9E060EFFF2542F542E454 :0C0B19003543F543907DC0E08004E030DF :0E0B250099FDC299F599A3DFF5907F9BE02022 :0C0B3300E20C907FC87401F07540900245 :020B3F000B9C0D :0B0B4100749C254274D1354350B790DE :0D0B4C007F947400F0907F957400F07FFAA4 :0E0B5900907F99E020E21F907F9BE020E20653 :0D0B6700754090020B9C907F98E0D2E1F069 :0B0B7400C2E1F0DFE0754091020B9C35 :0E0B7F007F10907F98E0D2E1F0C2E1F0DFF845 :0D0B8D00907F9574C0F075402090C00874F2 :020B9A00C7F0A2 :020B9C0080FED9 :060157007A057B007CFF2D :0E015D007E017F007402CB13CB92E6CC13CC54 :0E016B0092E7907F96F0907F9BE030E003EEED :0E0179004207907F98E0D2E1F0C2E1F0EE2361 :04018700FEDAD722A3 :01018B001063 :0E018C000586907FA5C2F07480F0907FA6E5F6 :0E019A00F0F0907FA5E020E22030E0F930E1A7 :0E01A8000F907FA61586E0A30586F0907FA538 :0E01B600DFE77440F0E020E6FC1586EF227FC4 :0301C400FF80F1C8 :0E01C7000586907FA5D2F07480F0907FA6E5AB :0E01D500F0F0907FA5E020E24C30E0F930E140 :0E01E30003EF700B7440F0E020E6FC1586E49C :0E01F10022B401037420F0907FA6E0907FA559 :0E01FF00E020E22730E0F9EFB402037420F0B4 :0E020D00B401037440F0907FA6E01586F0A3C4 :0E021B000586907FA5DFDDE020E6FC1586E479 :0D022900227440F0E020E6FC74FF158622F0 :0E023600C0E0C0F0C082C083C0D075D000C050 :0E02440086758600C289D086D0D0D083D08245 :05025200D0F0D0E03205 :0E025700C0E0C0F0C082C083C0D075D000C02F :0C02650086758600C28D0544E5445407F0 :090271007007907F98E06408F02A :0D027A00D086D0D0D083D082D0F0D0E0323A :0E028700C0E0C0F0C082C083C0D075D000C0FF :0E02950086758600C28BD086D0D0D083D082F2 :0502A300D0F0D0E032B4 :0E02A800C0E0C0F0C082C083C0D075D000C0DE :0E02B60086758600C28FD086D0D0D083D082CD :0502C400D0F0D0E03293 :0E02C900C0E0C0F0C082C083C0D075D000C0BD :0E02D70086758600C298C299D086D0D0D0839A :0702E500D082D0F0D0E0321E :0E02EC00C0E0C0F0C082C083C0D075D000C09A :0E02FA0086758600C2CFD086D0D0D083D08249 :05030800D0F0D0E0324E :0E030D00C0E0C0F0C082C083C0D075D000C078 :0E031B0086758600C2DCD086D0D0D083D0821A :05032900D0F0D0E0322D :0E032E00C0E0C0F0C082C083C0D075D000C057 :0E033C0086758600C2C0C2C1D086D0D0D083E4 :07034A00D082D0F0D0E032B8 :0E035100C0E0C0F0C082C083C0D075D000C034 :0E035F0086758600E591C2E5F591D086D0D076 :09036D00D083D082D0F0D0E03240 :0E037600C0E0C0F0C082C083C0D075D000C00F :0E03840086758600E591C2E6F591D086D0D050 :09039200D083D082D0F0D0E0321B :0E039B00C0E0C0F0C082C083C0D075D000C0EA :0E03A90086758600E591C2E7F591D086D0D02A :0903B700D083D082D0F0D0E032F6 :0E03C000C0E0C0F0C082C083C0D075D000C0C5 :0E03CE0086758600C2DBD086D0D0D083D08268 :0503DC00D0F0D0E0327A :0803E100E549FF24C0F549E5E0 :0903E9004A34005012E4F549F514 :0C03F2004AF5467402907FB4F0EF6025DD :0C03FE008004F54A7F408F00854782850F :0D040A0048830586907F001586E0A30586D7 :0C041700F0A31586D8F68582478583483F :06042300EF907FB5F0220E :0E042900C0E0C0F0C082C083C084C085C0D0D7 :0E04370075D000C086758600C000C007E59134 :0D044500C2E4F591907FAB7401F0754600A4 :0D045200907FE9E0B4A33E907FEAE0F5471B :0D045F00A3E0F5482450502D907FEEE0F50D :06046C00492547A3E0F55D :0C0472004A3548401D907FE8E0B4400A85 :0D047E00754601907FC5F002057FB4C009EE :07048B007546021203E102B5 :02049200057FE4 :03049400020575E9 :0E049700B4B13E907FE8E0B4C034907F00E541 :0C04A50040F0A3E541F0A3E581C082C057 :0E04B10083907FDFE0D083D082F0A37400C080 :0E04BF0082C083907FC8E0D083D082F0A390EB :0804CD007FB57404F00205790B :0304D500020575A8 :0E04D800B4B22B907FE8E0B4C021907F00E525 :0804E60040F0A3E541F0A3E59D :0804EE0042F0A3E543F0A3E591 :0B04F60045F0907FB57405F00545024D :0205010005797A :0305030002057579 :0E050600B4B32A907FE8E0B4C02075F0A09056 :0E051400018B7F0112018C7013907F007F0617 :0E0522001201C770097406907FB5F0020579CA :030530000205754C :0E053300B4B43F907FEFE07036907FEEE0F8BA :0D054100FF24C0402C907FECE0F5F0F54762 :0D054E00907FE8E0B4400A754602907FC53A :0E055B00F002057FB4C010907F001201C7703F :0905690008E8907FB5F002057965 :030572000205750A :040575007403800289 :0205790074020A :04057B00907FB4F0C9 :0E057F00D007D000D086D0D0D085D084D083D5 :07058D00D082D0F0D0E03273 :0E059400C0E0C0F0C082C083C0D075D000C0EF :0E05A20086758600E591C2E4F591907FAB74FA :0E05B00002F0D086D0D0D083D082D0F0D0E040 :0105BE00320A :0E05BF00C0E0C0F0C082C083C0D075D000C0C4 :0E05CD0086758600E591C2E4F591907FAB74CF :0E05DB0004F0D086D0D0D083D082D0F0D0E013 :0105E90032DF :0E05EA00C0E0C0F0C082C083C0D075D000C099 :0E05F80086758600E591C2E4F591907FAB74A4 :0E06060008F0D086D0D0D083D082D0F0D0E0E3 :0106140032B3 :0E061500C0E0C0F0C082C083C0D075D000C06D :0E06230086758600E591C2E4F591907FAB7478 :0E06310010F0D086D0D0D083D082D0F0D0E0B0 :01063F003288 :0E064000C0E0C0F0C082C083C084C085C0D0BE :0E064E0075D000C086758600C000C007E5911B :0D065C00C2E4F591907FA97401F0E546B469 :0E06690002051203E18011907FB5E4F08004D9 :040677007403800286 :02067B00740207 :04067D00907FB4F0C6 :0E068100D007D000D086D0D0D085D084D083D2 :07068F00D082D0F0D0E03270 :0E069600C0E0C0F0C082C083C084C085C0D068 :0E06A40075D000C086758600C007E591C2E4DF :0D06B200F591907FAA7401F0E546B4013681 :0C06BF00907FC5E06028FFC3E5499FF56F :0606CB0049E54A9400F528 :0A06D1004A4038907EC085478485BA :0D06DB004885E0A30586F0A31586DFF685AF :0606E8008447858548E50A :0B06EE0049454A60208027B4021490A8 :0D06F9007FC5E06015FF8547F0907EC012C0 :06070600018C7002800767 :07070C00754600740380052F :050713007546007402B0 :04071800907FB4F02A :0E071C00D007D086D0D0D085D084D083D082B4 :05072A00D0F0D0E03228 :0C072F00907E80E540F0A3E541F0A3E5DA :08073B0042F0A3E543F0A3E541 :0B07430045F0907FB77405F0054522DB :0E074E00C0E0C0F0C082C083C0D075D000C033 :0E075C0086758600E591C2E4F591907FA97440 :0E076A0002F012072FD086D0D0D083D082D0DC :04077800F0D0E032AB :0E077C00C0E0C0F0C082C083C0D075D000C005 :0E078A0086758600E591C2E4F591907FAA7411 :0E07980002F0D086D0D0D083D082D0F0D0E056 :0107A6003220 :0E07A700C0E0C0F0C082C083C0D075D000C0DA :0E07B50086758600E591C2E4F591907FA974E7 :0E07C30004F0D086D0D0D083D082D0F0D0E029 :0107D10032F5 :0E07D200C0E0C0F0C082C083C0D075D000C0AF :0E07E00086758600E591C2E4F591907FAA74BB :0E07EE0004F0D086D0D0D083D082D0F0D0E0FE :0107FC0032CA :0E07FD00C0E0C0F0C082C083C0D075D000C084 :0E080B0086758600E591C2E4F591907FA97490 :0E08190008F0D086D0D0D083D082D0F0D0E0CE :01082700329E :0E082800C0E0C0F0C082C083C0D075D000C058 :0E08360086758600E591C2E4F591907FAA7464 :0E08440008F0D086D0D0D083D082D0F0D0E0A3 :010852003273 :0E085300C0E0C0F0C082C083C0D075D000C02D :0E08610086758600E591C2E4F591907FA9743A :0E086F0010F0D086D0D0D083D082D0F0D0E070 :01087D003248 :0E087E00C0E0C0F0C082C083C0D075D000C002 :0E088C0086758600E591C2E4F591907FAA740E :0E089A0010F0D086D0D0D083D082D0F0D0E045 :0108A800321D :0E08A900C0E0C0F0C082C083C0D075D000C0D7 :0E08B70086758600E591C2E4F591907FA974E4 :0E08C50020F0D086D0D0D083D082D0F0D0E00A :0108D30032F2 :0E08D400C0E0C0F0C082C083C0D075D000C0AC :0E08E20086758600E591C2E4F591907FAA74B8 :0E08F00020F0D086D0D0D083D082D0F0D0E0DF :0108FE0032C7 :0E08FF00C0E0C0F0C082C083C0D075D000C081 :0E090D0086758600E591C2E4F591907FA9748D :0E091B0040F0D086D0D0D083D082D0F0D0E093 :01092900329B :0E092A00C0E0C0F0C082C083C0D075D000C055 :0E09380086758600E591C2E4F591907FAA7461 :0E09460040F0D086D0D0D083D082D0F0D0E068 :010954003270 :0E095500C0E0C0F0C082C083C0D075D000C02A :0E09630086758600E591C2E4F591907FA97437 :0E09710080F0D086D0D0D083D082D0F0D0E0FD :01097F003245 :0E098000C0E0C0F0C082C083C0D075D000C0FF :0E098E0086758600E591C2E4F591907FAA740B :0E099C0080F0D086D0D0D083D082D0F0D0E0D2 :0109AA00321A :00000001FF baycomusb-0.10.orig/firmware/dlfirmware/main.rel0100644000175100017510000004550707325134422020025 0ustar abaabaXH H A areas 2 global symbols M main A _CODE size 0 flags 0 A CODE size 157 flags 20 A CSEG size 854 flags 20 S xmemread Def028A S fillusbintr Def05D8 A GSINIT size 8 flags 20 A GSINIT2 size 1EB flags 20 A OSEG size 0 flags 4 A BSEG size 0 flags 80 A ISEG size 80 flags 0 A DSEG size B flags 0 A XSEG size 0 flags 0 T 00 00 02 00 00 02 00 DF R 00 00 00 01 00 03 00 03 00 06 00 02 T 00 06 R 00 00 00 01 T 00 0B 02 01 00 R 00 00 00 01 00 03 00 02 T 00 0E R 00 00 00 01 T 00 13 02 01 30 R 00 00 00 01 00 03 00 02 T 00 16 R 00 00 00 01 T 00 1B 02 01 51 R 00 00 00 01 00 03 00 02 T 00 1E R 00 00 00 01 T 00 23 02 01 72 R 00 00 00 01 00 03 00 02 T 00 26 R 00 00 00 01 T 00 2B 02 01 95 R 00 00 00 01 00 03 00 02 T 00 2E R 00 00 00 01 T 00 33 02 01 B6 R 00 00 00 01 00 03 00 02 T 00 36 R 00 00 00 01 T 00 3B 02 01 D7 R 00 00 00 01 00 03 00 02 T 00 3E R 00 00 00 01 T 00 43 02 01 00 R 00 00 00 01 00 03 00 01 T 00 46 R 00 00 00 01 T 00 4B 02 01 FA R 00 00 00 01 00 03 00 02 T 00 4E R 00 00 00 01 T 00 53 02 02 1F R 00 00 00 01 00 03 00 02 T 00 56 R 00 00 00 01 T 00 5B 02 02 44 R 00 00 00 01 00 03 00 02 T 00 5E R 00 00 00 01 T 00 63 02 02 69 R 00 00 00 01 00 03 00 02 T 00 66 R 00 00 00 01 T 01 00 R 00 00 00 01 T 01 00 02 02 D2 R 00 00 00 01 00 03 00 02 T 01 03 R 00 00 00 01 T 01 04 02 04 3D R 00 00 00 01 00 03 00 02 T 01 07 R 00 00 00 01 T 01 08 02 04 68 R 00 00 00 01 00 03 00 02 T 01 0B R 00 00 00 01 T 01 0C 02 04 93 R 00 00 00 01 00 03 00 02 T 01 0F R 00 00 00 01 T 01 10 02 04 BE R 00 00 00 01 00 03 00 02 T 01 13 R 00 00 00 01 T 01 14 32 R 00 00 00 01 T 01 15 R 00 00 00 01 T 01 18 02 04 E9 R 00 00 00 01 00 03 00 02 T 01 1B R 00 00 00 01 T 01 1C 02 05 3F R 00 00 00 01 00 03 00 02 T 01 1F R 00 00 00 01 T 01 20 02 05 F7 R 00 00 00 01 00 03 00 02 T 01 23 R 00 00 00 01 T 01 24 02 06 25 R 00 00 00 01 00 03 00 02 T 01 27 R 00 00 00 01 T 01 28 02 06 50 R 00 00 00 01 00 03 00 02 T 01 2B R 00 00 00 01 T 01 2C 02 06 7B R 00 00 00 01 00 03 00 02 T 01 2F R 00 00 00 01 T 01 30 02 06 A6 R 00 00 00 01 00 03 00 02 T 01 33 R 00 00 00 01 T 01 34 02 06 D1 R 00 00 00 01 00 03 00 02 T 01 37 R 00 00 00 01 T 01 38 02 06 FC R 00 00 00 01 00 03 00 02 T 01 3B R 00 00 00 01 T 01 3C 02 07 27 R 00 00 00 01 00 03 00 02 T 01 3F R 00 00 00 01 T 01 40 02 07 52 R 00 00 00 01 00 03 00 02 T 01 43 R 00 00 00 01 T 01 44 02 07 7D R 00 00 00 01 00 03 00 02 T 01 47 R 00 00 00 01 T 01 48 02 07 A8 R 00 00 00 01 00 03 00 02 T 01 4B R 00 00 00 01 T 01 4C 02 07 D3 R 00 00 00 01 00 03 00 02 T 01 4F R 00 00 00 01 T 01 50 02 07 FE R 00 00 00 01 00 03 00 02 T 01 53 R 00 00 00 01 T 01 54 02 08 29 R 00 00 00 01 00 03 00 02 T 00 00 R 00 00 00 07 T 00 10 R 00 00 00 07 T 00 30 R 00 00 00 07 T 00 00 R 00 00 00 08 T 00 01 R 00 00 00 08 T 00 02 R 00 00 00 08 T 00 04 R 00 00 00 08 T 00 05 R 00 00 00 08 T 00 06 R 00 00 00 08 T 00 07 R 00 00 00 08 T 00 09 R 00 00 00 08 T 00 00 R 00 00 00 03 T 00 00 75 81 00 30 E4 F5 D0 F5 86 R 00 00 00 03 09 04 00 07 T 00 08 R 00 00 00 03 T 00 00 R 00 00 00 04 T 00 00 E4 F5 00 00 F5 00 01 F5 R 00 00 00 04 29 04 00 08 29 07 00 08 T 00 06 00 02 F5 00 03 F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 0A 00 05 F5 00 06 75 8E 31 75 89 21 75 88 55 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 16 75 8D 64 75 87 00 90 F4 48 A3 E5 82 45 83 R 00 00 00 04 T 00 24 70 F9 90 7F A1 74 01 F0 90 7F AF 74 01 F0 R 00 00 00 04 T 00 32 E4 90 7F E0 F0 90 7F E1 F0 90 7F DD 74 09 R 00 00 00 04 T 00 40 F0 90 7F DE 74 03 F0 90 7F DF 74 05 F0 90 R 00 00 00 04 T 00 4E 7F D7 74 12 F0 74 32 F0 74 02 F0 74 22 F0 R 00 00 00 04 T 00 5C 90 7F 93 74 00 F0 90 7F 96 74 80 F0 90 R 00 00 00 04 T 00 69 7F 9C 74 C2 F0 90 7F 94 74 00 F0 90 7F 9D R 00 00 00 04 T 00 77 74 00 F0 90 7F 95 74 00 F0 90 7F 98 74 20 R 00 00 00 04 T 00 85 F0 90 7F 9E 74 2E F0 75 A8 82 75 E8 01 90 R 00 00 00 04 T 00 93 7F AE 74 01 F0 90 7F AC 74 03 F0 90 7F AD R 00 00 00 04 T 00 A1 74 01 F0 75 98 20 75 99 FF 12 05 D8 90 R 00 00 00 04 00 0C 00 02 T 00 AE 7F 96 74 82 F0 90 7F 99 E0 30 E2 06 75 R 00 00 00 04 T 00 BB 00 00 80 02 01 E9 12 R 00 00 00 04 29 02 00 08 00 06 00 04 T 00 C1 00 00 7A 05 7B 00 7C 06 12 00 06 7A 08 7B R 00 00 00 04 00 02 00 02 00 0B 00 02 T 00 CF 00 7C 00 12 00 06 7A 08 7B 01 7C 00 12 R 00 00 00 04 00 06 00 02 T 00 DC 00 06 74 F8 2F 60 08 75 00 00 81 8F R 00 00 00 04 00 02 00 02 29 0A 00 08 T 00 E7 00 01 02 01 E9 7A 05 7B 05 7C 0C 12 R 00 00 00 04 29 02 00 08 00 05 00 04 T 00 F2 00 06 90 7F 9E 74 2A F0 75 00 00 01 90 R 00 00 00 04 00 02 00 02 29 0B 00 08 T 00 FE 7F 9B E0 30 E2 FC 7A 03 7B FF 7C 01 12 R 00 00 00 04 T 01 0B 00 06 90 7F 96 74 42 F0 90 7F 93 74 40 F0 R 00 00 00 04 00 02 00 02 T 01 19 90 7F 95 74 02 F0 75 00 00 10 90 7F C8 E4 R 00 00 00 04 29 09 00 08 T 01 26 F0 90 7F C9 F0 R 00 00 00 04 T 01 2B R 00 00 00 04 T 01 2B 90 7F C9 F0 90 7F C8 E0 20 E1 F9 90 7F C9 R 00 00 00 04 T 01 39 E0 24 FE 50 ED 90 7D C0 E0 B4 FF E6 A3 E0 R 00 00 00 04 T 01 47 B4 04 E1 75 00 00 11 80 0B R 00 00 00 04 29 06 00 08 T 01 4F R 00 00 00 04 T 01 4F 90 7F C9 F0 90 7F C8 E0 20 E1 F9 R 00 00 00 04 T 01 5A R 00 00 00 04 T 01 5A 90 7F C9 E0 60 EF FF 25 00 02 F5 00 02 E4 R 00 00 00 04 29 0A 00 08 29 0D 00 08 T 01 66 35 00 03 F5 00 03 90 7D C0 E0 80 04 E0 30 R 00 00 00 04 29 03 00 08 29 06 00 08 T 01 72 99 FD C2 99 F5 99 A3 DF F5 90 7F 9B E0 20 R 00 00 00 04 T 01 80 E2 0C 90 7F C8 74 01 F0 75 00 00 90 02 R 00 00 00 04 29 0B 00 08 T 01 8C 01 E9 R 00 00 00 04 00 02 00 04 T 01 8E R 00 00 00 04 T 01 8E 74 9C 25 00 02 74 D1 35 00 03 50 B7 90 R 00 00 00 04 29 05 00 08 29 0A 00 08 T 01 99 7F 94 74 00 F0 90 7F 95 74 00 F0 7F FA R 00 00 00 04 T 01 A6 R 00 00 00 04 T 01 A6 90 7F 99 E0 20 E2 1F 90 7F 9B E0 20 E2 06 R 00 00 00 04 T 01 B4 75 00 00 90 02 01 E9 90 7F 98 E0 D2 E1 F0 R 00 00 00 04 29 03 00 08 00 07 00 04 T 01 C1 C2 E1 F0 DF E0 75 00 00 91 02 01 E9 R 00 00 00 04 29 08 00 08 00 0C 00 04 T 01 CC R 00 00 00 04 T 01 CC 7F 10 90 7F 98 E0 D2 E1 F0 C2 E1 F0 DF F8 R 00 00 00 04 T 01 DA 90 7F 95 74 C0 F0 75 00 00 20 90 C0 08 74 R 00 00 00 04 29 09 00 08 T 01 E7 C7 F0 R 00 00 00 04 T 01 E9 R 00 00 00 04 T 01 E9 80 FE R 00 00 00 04 T 00 00 R 00 00 00 02 T 00 00 7A 05 7B 00 7C FF R 00 00 00 02 T 00 06 R 00 00 00 02 T 00 06 R 00 00 00 02 T 00 06 7E 01 7F 00 74 02 CB 13 CB 92 E6 CC 13 CC R 00 00 00 02 T 00 14 92 E7 90 7F 96 F0 90 7F 9B E0 30 E0 03 EE R 00 00 00 02 T 00 22 42 07 90 7F 98 E0 D2 E1 F0 C2 E1 F0 EE 23 R 00 00 00 02 T 00 30 FE DA D7 22 R 00 00 00 02 T 00 34 R 00 00 00 02 T 00 34 10 R 00 00 00 02 T 00 35 R 00 00 00 02 T 00 35 05 86 90 7F A5 C2 F0 74 80 F0 90 7F A6 E5 R 00 00 00 02 T 00 43 F0 F0 90 7F A5 E0 20 E2 20 30 E0 F9 30 E1 R 00 00 00 02 T 00 51 0F 90 7F A6 15 86 E0 A3 05 86 F0 90 7F A5 R 00 00 00 02 T 00 5F DF E7 74 40 F0 E0 20 E6 FC 15 86 EF 22 7F R 00 00 00 02 T 00 6D FF 80 F1 R 00 00 00 02 T 00 70 R 00 00 00 02 T 00 70 05 86 90 7F A5 D2 F0 74 80 F0 90 7F A6 E5 R 00 00 00 02 T 00 7E F0 F0 90 7F A5 E0 20 E2 4C 30 E0 F9 30 E1 R 00 00 00 02 T 00 8C 03 EF 70 0B 74 40 F0 E0 20 E6 FC 15 86 E4 R 00 00 00 02 T 00 9A 22 B4 01 03 74 20 F0 90 7F A6 E0 90 7F A5 R 00 00 00 02 T 00 A8 E0 20 E2 27 30 E0 F9 EF B4 02 03 74 20 F0 R 00 00 00 02 T 00 B6 B4 01 03 74 40 F0 90 7F A6 E0 15 86 F0 A3 R 00 00 00 02 T 00 C4 05 86 90 7F A5 DF DD E0 20 E6 FC 15 86 E4 R 00 00 00 02 T 00 D2 22 74 40 F0 E0 20 E6 FC 74 FF 15 86 22 R 00 00 00 02 T 00 DF R 00 00 00 02 T 00 DF C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 ED 86 75 86 00 C2 89 D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 FB D0 F0 D0 E0 32 R 00 00 00 02 T 01 00 R 00 00 00 02 T 01 00 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 0E 86 75 86 00 C2 8D 05 00 04 E5 00 04 54 07 R 00 00 00 02 29 09 00 08 29 0C 00 08 T 01 1A 70 07 90 7F 98 E0 64 08 F0 R 00 00 00 02 T 01 23 R 00 00 00 02 T 01 23 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 30 R 00 00 00 02 T 01 30 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 3E 86 75 86 00 C2 8B D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 4C D0 F0 D0 E0 32 R 00 00 00 02 T 01 51 R 00 00 00 02 T 01 51 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 5F 86 75 86 00 C2 8F D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 6D D0 F0 D0 E0 32 R 00 00 00 02 T 01 72 R 00 00 00 02 T 01 72 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 80 86 75 86 00 C2 98 C2 99 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 8E D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 95 R 00 00 00 02 T 01 95 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 A3 86 75 86 00 C2 CF D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 B1 D0 F0 D0 E0 32 R 00 00 00 02 T 01 B6 R 00 00 00 02 T 01 B6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 C4 86 75 86 00 C2 DC D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 D2 D0 F0 D0 E0 32 R 00 00 00 02 T 01 D7 R 00 00 00 02 T 01 D7 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 E5 86 75 86 00 C2 C0 C2 C1 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 F3 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 FA R 00 00 00 02 T 01 FA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 08 86 75 86 00 E5 91 C2 E5 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 16 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 1F R 00 00 00 02 T 02 1F C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 2D 86 75 86 00 E5 91 C2 E6 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 3B D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 44 R 00 00 00 02 T 02 44 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 52 86 75 86 00 E5 91 C2 E7 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 60 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 69 R 00 00 00 02 T 02 69 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 77 86 75 86 00 C2 DB D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 02 85 D0 F0 D0 E0 32 R 00 00 00 02 T 02 8A R 00 00 00 02 T 02 8A E5 00 09 FF 24 C0 F5 00 09 E5 R 00 00 00 02 29 03 00 08 29 09 00 08 T 02 92 00 0A 34 00 50 12 E4 F5 00 09 F5 R 00 00 00 02 29 02 00 08 29 0A 00 08 T 02 9B 00 0A F5 00 06 74 02 90 7F B4 F0 EF 60 25 R 00 00 00 02 29 02 00 08 29 05 00 08 T 02 A7 80 04 F5 00 0A 7F 40 8F 00 85 00 07 82 85 R 00 00 00 02 29 05 00 08 29 0C 00 08 T 02 B3 00 08 83 05 86 90 7F 00 15 86 E0 A3 05 86 R 00 00 00 02 29 02 00 08 T 02 C0 F0 A3 15 86 D8 F6 85 82 00 07 85 83 00 08 R 00 00 00 02 29 0A 00 08 29 0E 00 08 T 02 CC EF 90 7F B5 F0 22 R 00 00 00 02 T 02 D2 R 00 00 00 02 T 02 D2 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 02 E0 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 02 EE C2 E4 F5 91 90 7F AB 74 01 F0 75 00 06 00 R 00 00 00 02 29 0D 00 08 T 02 FB 90 7F E9 E0 B4 A3 3E 90 7F EA E0 F5 00 07 R 00 00 00 02 29 0E 00 08 T 03 08 A3 E0 F5 00 08 24 50 50 2D 90 7F EE E0 F5 R 00 00 00 02 29 05 00 08 T 03 15 00 09 25 00 07 A3 E0 F5 R 00 00 00 02 29 02 00 08 29 05 00 08 T 03 1B 00 0A 35 00 08 40 1D 90 7F E8 E0 B4 40 0A R 00 00 00 02 29 02 00 08 29 05 00 08 T 03 27 75 00 06 01 90 7F C5 F0 02 04 28 B4 C0 09 R 00 00 00 02 29 03 00 08 00 0B 00 02 T 03 34 75 00 06 02 12 02 8A 02 R 00 00 00 02 29 03 00 08 00 07 00 02 T 03 3B 04 28 R 00 00 00 02 00 02 00 02 T 03 3D R 00 00 00 02 T 03 3D 02 04 1E R 00 00 00 02 00 03 00 02 T 03 40 R 00 00 00 02 T 03 40 B4 B1 3E 90 7F E8 E0 B4 C0 34 90 7F 00 E5 R 00 00 00 02 T 03 4E 00 00 F0 A3 E5 00 01 F0 A3 E5 81 C0 82 C0 R 00 00 00 02 29 02 00 08 29 07 00 08 T 03 5A 83 90 7F DF E0 D0 83 D0 82 F0 A3 74 00 C0 R 00 00 00 02 T 03 68 82 C0 83 90 7F C8 E0 D0 83 D0 82 F0 A3 90 R 00 00 00 02 T 03 76 7F B5 74 04 F0 02 04 22 R 00 00 00 02 00 08 00 02 T 03 7E R 00 00 00 02 T 03 7E 02 04 1E R 00 00 00 02 00 03 00 02 T 03 81 R 00 00 00 02 T 03 81 B4 B2 2B 90 7F E8 E0 B4 C0 21 90 7F 00 E5 R 00 00 00 02 T 03 8F 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 03 97 00 02 F0 A3 E5 00 03 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 03 9F 00 05 F0 90 7F B5 74 05 F0 05 00 05 02 R 00 00 00 02 29 02 00 08 29 0C 00 08 T 03 AA 04 22 R 00 00 00 02 00 02 00 02 T 03 AC R 00 00 00 02 T 03 AC 02 04 1E R 00 00 00 02 00 03 00 02 T 03 AF R 00 00 00 02 T 03 AF B4 B3 2A 90 7F E8 E0 B4 C0 20 75 F0 A0 90 R 00 00 00 02 T 03 BD 00 34 7F 01 12 00 35 70 13 90 7F 00 7F 06 R 00 00 00 02 00 02 00 02 00 07 00 02 T 03 CB 12 00 70 70 09 74 06 90 7F B5 F0 02 04 22 R 00 00 00 02 00 03 00 02 00 0E 00 02 T 03 D9 R 00 00 00 02 T 03 D9 02 04 1E R 00 00 00 02 00 03 00 02 T 03 DC R 00 00 00 02 T 03 DC B4 B4 3F 90 7F EF E0 70 36 90 7F EE E0 F8 R 00 00 00 02 T 03 EA FF 24 C0 40 2C 90 7F EC E0 F5 F0 F5 00 07 R 00 00 00 02 29 0E 00 08 T 03 F7 90 7F E8 E0 B4 40 0A 75 00 06 02 90 7F C5 R 00 00 00 02 29 0A 00 08 T 04 04 F0 02 04 28 B4 C0 10 90 7F 00 12 00 70 70 R 00 00 00 02 00 04 00 02 00 0D 00 02 T 04 12 08 E8 90 7F B5 F0 02 04 22 R 00 00 00 02 00 09 00 02 T 04 1B R 00 00 00 02 T 04 1B 02 04 1E R 00 00 00 02 00 03 00 02 T 04 1E R 00 00 00 02 T 04 1E R 00 00 00 02 T 04 1E 74 03 80 02 R 00 00 00 02 T 04 22 R 00 00 00 02 T 04 22 74 02 R 00 00 00 02 T 04 24 R 00 00 00 02 T 04 24 90 7F B4 F0 R 00 00 00 02 T 04 28 R 00 00 00 02 T 04 28 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 04 36 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 04 3D R 00 00 00 02 T 04 3D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 4B 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 04 59 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 04 67 32 R 00 00 00 02 T 04 68 R 00 00 00 02 T 04 68 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 76 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 04 84 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 04 92 32 R 00 00 00 02 T 04 93 R 00 00 00 02 T 04 93 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 A1 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 04 AF 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 04 BD 32 R 00 00 00 02 T 04 BE R 00 00 00 02 T 04 BE C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 CC 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 04 DA 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 04 E8 32 R 00 00 00 02 T 04 E9 R 00 00 00 02 T 04 E9 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 04 F7 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 05 05 C2 E4 F5 91 90 7F A9 74 01 F0 E5 00 06 B4 R 00 00 00 02 29 0D 00 08 T 05 12 02 05 12 02 8A 80 11 90 7F B5 E4 F0 80 04 R 00 00 00 02 00 05 00 02 T 05 20 R 00 00 00 02 T 05 20 74 03 80 02 R 00 00 00 02 T 05 24 R 00 00 00 02 T 05 24 74 02 R 00 00 00 02 T 05 26 R 00 00 00 02 T 05 26 90 7F B4 F0 R 00 00 00 02 T 05 2A R 00 00 00 02 T 05 2A D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 05 38 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 05 3F R 00 00 00 02 T 05 3F C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 05 4D 75 D0 00 C0 86 75 86 00 C0 07 E5 91 C2 E4 R 00 00 00 02 T 05 5B F5 91 90 7F AA 74 01 F0 E5 00 06 B4 01 36 R 00 00 00 02 29 0B 00 08 T 05 68 90 7F C5 E0 60 28 FF C3 E5 00 09 9F F5 R 00 00 00 02 29 0B 00 08 T 05 74 00 09 E5 00 0A 94 00 F5 R 00 00 00 02 29 02 00 08 29 05 00 08 T 05 7A 00 0A 40 38 90 7E C0 85 00 07 84 85 R 00 00 00 02 29 02 00 08 29 0A 00 08 T 05 84 00 08 85 E0 A3 05 86 F0 A3 15 86 DF F6 85 R 00 00 00 02 29 02 00 08 T 05 91 84 00 07 85 85 00 08 E5 R 00 00 00 02 29 03 00 08 29 07 00 08 T 05 97 00 09 45 00 0A 60 20 80 27 B4 02 14 90 R 00 00 00 02 29 02 00 08 29 05 00 08 T 05 A2 7F C5 E0 60 15 FF 85 00 07 F0 90 7E C0 12 R 00 00 00 02 29 09 00 08 T 05 AF 00 35 70 02 80 07 R 00 00 00 02 00 02 00 02 T 05 B5 R 00 00 00 02 T 05 B5 75 00 06 00 74 03 80 05 R 00 00 00 02 29 03 00 08 T 05 BC R 00 00 00 02 T 05 BC 75 00 06 00 74 02 R 00 00 00 02 29 03 00 08 T 05 C1 R 00 00 00 02 T 05 C1 90 7F B4 F0 R 00 00 00 02 T 05 C5 R 00 00 00 02 T 05 C5 D0 07 D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 R 00 00 00 02 T 05 D3 D0 F0 D0 E0 32 R 00 00 00 02 T 05 D8 R 00 00 00 02 T 05 D8 90 7E 80 E5 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 06 00 08 29 0B 00 08 T 05 E4 00 02 F0 A3 E5 00 03 F0 A3 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 05 EC 00 05 F0 90 7F B7 74 05 F0 05 00 05 22 R 00 00 00 02 29 02 00 08 29 0C 00 08 T 05 F7 R 00 00 00 02 T 05 F7 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 05 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 06 13 02 F0 12 05 D8 D0 86 D0 D0 D0 83 D0 82 D0 R 00 00 00 02 00 05 00 02 T 06 21 F0 D0 E0 32 R 00 00 00 02 T 06 25 R 00 00 00 02 T 06 25 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 33 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 06 41 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 4F 32 R 00 00 00 02 T 06 50 R 00 00 00 02 T 06 50 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 5E 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 06 6C 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 7A 32 R 00 00 00 02 T 06 7B R 00 00 00 02 T 06 7B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 89 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 06 97 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 A5 32 R 00 00 00 02 T 06 A6 R 00 00 00 02 T 06 A6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 B4 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 06 C2 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 D0 32 R 00 00 00 02 T 06 D1 R 00 00 00 02 T 06 D1 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 DF 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 06 ED 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 FB 32 R 00 00 00 02 T 06 FC R 00 00 00 02 T 06 FC C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 0A 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 18 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 26 32 R 00 00 00 02 T 07 27 R 00 00 00 02 T 07 27 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 35 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 07 43 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 51 32 R 00 00 00 02 T 07 52 R 00 00 00 02 T 07 52 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 60 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 6E 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 7C 32 R 00 00 00 02 T 07 7D R 00 00 00 02 T 07 7D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 8B 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 07 99 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 A7 32 R 00 00 00 02 T 07 A8 R 00 00 00 02 T 07 A8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 B6 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 C4 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 D2 32 R 00 00 00 02 T 07 D3 R 00 00 00 02 T 07 D3 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 E1 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 07 EF 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 FD 32 R 00 00 00 02 T 07 FE R 00 00 00 02 T 07 FE C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 0C 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 08 1A 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 28 32 R 00 00 00 02 T 08 29 R 00 00 00 02 T 08 29 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 37 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 08 45 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 53 32 R 00 00 00 02 baycomusb-0.10.orig/firmware/dlfirmware/main.lst0100644000175100017510000026021307325134422020036 0ustar abaaba 1 .module main 2 3 ;; ENDPOINTS 4 ;; EP0 in/out Control 5 ;; COMMAND LIST 6 ;; C0 B4 read I2C eeprom 7 ;; 40 B4 write I2C eeprom 8 9 ;; define code segments link order 10 .area CODE (CODE) 11 .area CSEG (CODE) 12 .area GSINIT (CODE) 13 .area GSINIT2 (CODE) 14 15 ;; ----------------------------------------------------- 16 17 ;; special function registers (which are not predefined) 0082 18 dpl0 = 0x82 0083 19 dph0 = 0x83 0084 20 dpl1 = 0x84 0085 21 dph1 = 0x85 0086 22 dps = 0x86 008E 23 ckcon = 0x8E 008F 24 spc_fnc = 0x8F 0091 25 exif = 0x91 0092 26 mpage = 0x92 0098 27 scon0 = 0x98 0099 28 sbuf0 = 0x99 00C0 29 scon1 = 0xC0 00C1 30 sbuf1 = 0xC1 00D8 31 eicon = 0xD8 00E8 32 eie = 0xE8 00F8 33 eip = 0xF8 34 35 ;; anchor xdata registers 7F00 36 IN0BUF = 0x7F00 7EC0 37 OUT0BUF = 0x7EC0 7E80 38 IN1BUF = 0x7E80 7E40 39 OUT1BUF = 0x7E40 7E00 40 IN2BUF = 0x7E00 7DC0 41 OUT2BUF = 0x7DC0 7D80 42 IN3BUF = 0x7D80 7D40 43 OUT3BUF = 0x7D40 7D00 44 IN4BUF = 0x7D00 7CC0 45 OUT4BUF = 0x7CC0 7C80 46 IN5BUF = 0x7C80 7C40 47 OUT5BUF = 0x7C40 7C00 48 IN6BUF = 0x7C00 7BC0 49 OUT6BUF = 0x7BC0 7B80 50 IN7BUF = 0x7B80 7B40 51 OUT7BUF = 0x7B40 7FE8 52 SETUPBUF = 0x7FE8 7FE8 53 SETUPDAT = 0x7FE8 54 7FB4 55 EP0CS = 0x7FB4 7FB5 56 IN0BC = 0x7FB5 7FB6 57 IN1CS = 0x7FB6 7FB7 58 IN1BC = 0x7FB7 7FB8 59 IN2CS = 0x7FB8 7FB9 60 IN2BC = 0x7FB9 7FBA 61 IN3CS = 0x7FBA 7FBB 62 IN3BC = 0x7FBB 7FBC 63 IN4CS = 0x7FBC 7FBD 64 IN4BC = 0x7FBD 7FBE 65 IN5CS = 0x7FBE 7FBF 66 IN5BC = 0x7FBF 7FC0 67 IN6CS = 0x7FC0 7FC1 68 IN6BC = 0x7FC1 7FC2 69 IN7CS = 0x7FC2 7FC3 70 IN7BC = 0x7FC3 7FC5 71 OUT0BC = 0x7FC5 7FC6 72 OUT1CS = 0x7FC6 7FC7 73 OUT1BC = 0x7FC7 7FC8 74 OUT2CS = 0x7FC8 7FC9 75 OUT2BC = 0x7FC9 7FCA 76 OUT3CS = 0x7FCA 7FCB 77 OUT3BC = 0x7FCB 7FCC 78 OUT4CS = 0x7FCC 7FCD 79 OUT4BC = 0x7FCD 7FCE 80 OUT5CS = 0x7FCE 7FCF 81 OUT5BC = 0x7FCF 7FD0 82 OUT6CS = 0x7FD0 7FD1 83 OUT6BC = 0x7FD1 7FD2 84 OUT7CS = 0x7FD2 7FD3 85 OUT7BC = 0x7FD3 86 7FA8 87 IVEC = 0x7FA8 7FA9 88 IN07IRQ = 0x7FA9 7FAA 89 OUT07IRQ = 0x7FAA 7FAB 90 USBIRQ = 0x7FAB 7FAC 91 IN07IEN = 0x7FAC 7FAD 92 OUT07IEN = 0x7FAD 7FAE 93 USBIEN = 0x7FAE 7FAF 94 USBBAV = 0x7FAF 7FB2 95 BPADDRH = 0x7FB2 7FB3 96 BPADDRL = 0x7FB3 97 7FD4 98 SUDPTRH = 0x7FD4 7FD5 99 SUDPTRL = 0x7FD5 7FD6 100 USBCS = 0x7FD6 7FD7 101 TOGCTL = 0x7FD7 7FD8 102 USBFRAMEL = 0x7FD8 7FD9 103 USBFRAMEH = 0x7FD9 7FDB 104 FNADDR = 0x7FDB 7FDD 105 USBPAIR = 0x7FDD 7FDE 106 IN07VAL = 0x7FDE 7FDF 107 OUT07VAL = 0x7FDF 7FE3 108 AUTOPTRH = 0x7FE3 7FE4 109 AUTOPTRL = 0x7FE4 7FE5 110 AUTODATA = 0x7FE5 111 112 ;; isochronous endpoints. only available if ISODISAB=0 113 7F60 114 OUT8DATA = 0x7F60 7F61 115 OUT9DATA = 0x7F61 7F62 116 OUT10DATA = 0x7F62 7F63 117 OUT11DATA = 0x7F63 7F64 118 OUT12DATA = 0x7F64 7F65 119 OUT13DATA = 0x7F65 7F66 120 OUT14DATA = 0x7F66 7F67 121 OUT15DATA = 0x7F67 122 7F68 123 IN8DATA = 0x7F68 7F69 124 IN9DATA = 0x7F69 7F6A 125 IN10DATA = 0x7F6A 7F6B 126 IN11DATA = 0x7F6B 7F6C 127 IN12DATA = 0x7F6C 7F6D 128 IN13DATA = 0x7F6D 7F6E 129 IN14DATA = 0x7F6E 7F6F 130 IN15DATA = 0x7F6F 131 7F70 132 OUT8BCH = 0x7F70 7F71 133 OUT8BCL = 0x7F71 7F72 134 OUT9BCH = 0x7F72 7F73 135 OUT9BCL = 0x7F73 7F74 136 OUT10BCH = 0x7F74 7F75 137 OUT10BCL = 0x7F75 7F76 138 OUT11BCH = 0x7F76 7F77 139 OUT11BCL = 0x7F77 7F78 140 OUT12BCH = 0x7F78 7F79 141 OUT12BCL = 0x7F79 7F7A 142 OUT13BCH = 0x7F7A 7F7B 143 OUT13BCL = 0x7F7B 7F7C 144 OUT14BCH = 0x7F7C 7F7D 145 OUT14BCL = 0x7F7D 7F7E 146 OUT15BCH = 0x7F7E 7F7F 147 OUT15BCL = 0x7F7F 148 7FF0 149 OUT8ADDR = 0x7FF0 7FF1 150 OUT9ADDR = 0x7FF1 7FF2 151 OUT10ADDR = 0x7FF2 7FF3 152 OUT11ADDR = 0x7FF3 7FF4 153 OUT12ADDR = 0x7FF4 7FF5 154 OUT13ADDR = 0x7FF5 7FF6 155 OUT14ADDR = 0x7FF6 7FF7 156 OUT15ADDR = 0x7FF7 7FF8 157 IN8ADDR = 0x7FF8 7FF9 158 IN9ADDR = 0x7FF9 7FFA 159 IN10ADDR = 0x7FFA 7FFB 160 IN11ADDR = 0x7FFB 7FFC 161 IN12ADDR = 0x7FFC 7FFD 162 IN13ADDR = 0x7FFD 7FFE 163 IN14ADDR = 0x7FFE 7FFF 164 IN15ADDR = 0x7FFF 165 7FA0 166 ISOERR = 0x7FA0 7FA1 167 ISOCTL = 0x7FA1 7FA2 168 ZBCOUNT = 0x7FA2 7FE0 169 INISOVAL = 0x7FE0 7FE1 170 OUTISOVAL = 0x7FE1 7FE2 171 FASTXFR = 0x7FE2 172 173 ;; CPU control registers 174 7F92 175 CPUCS = 0x7F92 176 177 ;; IO port control registers 178 7F93 179 PORTACFG = 0x7F93 7F94 180 PORTBCFG = 0x7F94 7F95 181 PORTCCFG = 0x7F95 7F96 182 OUTA = 0x7F96 7F97 183 OUTB = 0x7F97 7F98 184 OUTC = 0x7F98 7F99 185 PINSA = 0x7F99 7F9A 186 PINSB = 0x7F9A 7F9B 187 PINSC = 0x7F9B 7F9C 188 OEA = 0x7F9C 7F9D 189 OEB = 0x7F9D 7F9E 190 OEC = 0x7F9E 191 192 ;; I2C controller registers 193 7FA5 194 I2CS = 0x7FA5 7FA6 195 I2DAT = 0x7FA6 196 197 ;; FPGA defines 0003 198 XC4K_IRLENGTH = 3 0000 199 XC4K_EXTEST = 0 0001 200 XC4K_PRELOAD = 1 0005 201 XC4K_CONFIGURE = 5 0007 202 XC4K_BYPASS = 7 203 2E64 204 FPGA_CONFIGSIZE = 11876 0158 205 FPGA_BOUND = 344 206 0000 207 SOFTWARECONFIG = 0 208 209 ;; ----------------------------------------------------- 210 211 .area CODE (CODE) 0000 02s00r00 212 ljmp startup 0003 02s00rDF 213 ljmp int0_isr 0006 214 .ds 5 000B 02s01r00 215 ljmp timer0_isr 000E 216 .ds 5 0013 02s01r30 217 ljmp int1_isr 0016 218 .ds 5 001B 02s01r51 219 ljmp timer1_isr 001E 220 .ds 5 0023 02s01r72 221 ljmp ser0_isr 0026 222 .ds 5 002B 02s01r95 223 ljmp timer2_isr 002E 224 .ds 5 0033 02s01rB6 225 ljmp resume_isr 0036 226 .ds 5 003B 02s01rD7 227 ljmp ser1_isr 003E 228 .ds 5 0043 02s01r00 229 ljmp usb_isr 0046 230 .ds 5 004B 02s01rFA 231 ljmp i2c_isr 004E 232 .ds 5 0053 02s02r1F 233 ljmp int4_isr 0056 234 .ds 5 005B 02s02r44 235 ljmp int5_isr 005E 236 .ds 5 0063 02s02r69 237 ljmp int6_isr 0066 238 .ds 0x9a 239 0100 240 usb_isr: 0100 02s02rD2 241 ljmp usb_sudav_isr 0103 242 .ds 1 0104 02s04r3D 243 ljmp usb_sof_isr 0107 244 .ds 1 0108 02s04r68 245 ljmp usb_sutok_isr 010B 246 .ds 1 010C 02s04r93 247 ljmp usb_suspend_isr 010F 248 .ds 1 0110 02s04rBE 249 ljmp usb_usbreset_isr 0113 250 .ds 1 0114 32 251 reti 0115 252 .ds 3 0118 02s04rE9 253 ljmp usb_ep0in_isr 011B 254 .ds 1 011C 02s05r3F 255 ljmp usb_ep0out_isr 011F 256 .ds 1 0120 02s05rF7 257 ljmp usb_ep1in_isr 0123 258 .ds 1 0124 02s06r25 259 ljmp usb_ep1out_isr 0127 260 .ds 1 0128 02s06r50 261 ljmp usb_ep2in_isr 012B 262 .ds 1 012C 02s06r7B 263 ljmp usb_ep2out_isr 012F 264 .ds 1 0130 02s06rA6 265 ljmp usb_ep3in_isr 0133 266 .ds 1 0134 02s06rD1 267 ljmp usb_ep3out_isr 0137 268 .ds 1 0138 02s06rFC 269 ljmp usb_ep4in_isr 013B 270 .ds 1 013C 02s07r27 271 ljmp usb_ep4out_isr 013F 272 .ds 1 0140 02s07r52 273 ljmp usb_ep5in_isr 0143 274 .ds 1 0144 02s07r7D 275 ljmp usb_ep5out_isr 0147 276 .ds 1 0148 02s07rA8 277 ljmp usb_ep6in_isr 014B 278 .ds 1 014C 02s07rD3 279 ljmp usb_ep6out_isr 014F 280 .ds 1 0150 02s07rFE 281 ljmp usb_ep7in_isr 0153 282 .ds 1 0154 02s08r29 283 ljmp usb_ep7out_isr 284 285 ;; ----------------------------------------------------- 286 0020 287 RXCHUNKS = 32 0010 288 TXCHUNKS = 16 289 0000 290 DEBUGIOCOPY = 0 0000 291 DEBUGRECEIVER = 0 292 293 .area OSEG (OVR,DATA) 294 .area BSEG (BIT) 295 296 297 .area ISEG (DATA) 0000 298 txbcnt: .ds TXCHUNKS 0010 299 rxbcnt: .ds RXCHUNKS 0030 300 stack: .ds 0x80-RXCHUNKS-TXCHUNKS 301 302 .area DSEG (DATA) 0000 303 errcode: .ds 1 0001 304 errval: .ds 1 0002 305 cfgcount: .ds 2 0004 306 leddiv: .ds 1 0005 307 irqcount: .ds 1 0006 308 ctrlcode: .ds 1 0007 309 ctrladdr: .ds 2 0009 310 ctrllen: .ds 2 311 312 .area XSEG (DATA) 313 314 315 .area GSINIT (CODE) 0000 316 startup: 0000 75 81r30 317 mov sp,#stack ; -1 0003 E4 318 clr a 0004 F5 D0 319 mov psw,a 0006 F5 86 320 mov dps,a 321 ;lcall __sdcc_external_startup 322 ;mov a,dpl0 323 ;jz __sdcc_init_data 324 ;ljmp __sdcc_program_startup 0008 325 __sdcc_init_data: 326 327 .area GSINIT2 (CODE) 328 0002 329 ar2 = 0x02 0003 330 ar3 = 0x03 0004 331 ar4 = 0x04 0005 332 ar5 = 0x05 0006 333 ar6 = 0x06 0007 334 ar7 = 0x07 0000 335 ar0 = 0x00 0001 336 ar1 = 0x01 337 0000 338 __sdcc_program_startup: 339 ;; assembler code startup 0000 E4 340 clr a 0001 F5*00 341 mov errcode,a 0003 F5*01 342 mov errval,a 0005 F5*02 343 mov cfgcount,a 0007 F5*03 344 mov cfgcount+1,a 0009 F5*05 345 mov irqcount,a 000B F5*06 346 mov ctrlcode,a 347 ;; some indirect register setup 000D 75 8E 31 348 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 349 ;; Timer setup: 350 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 351 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0010 75 89 21 352 mov tmod,#0x21 0013 75 88 55 353 mov tcon,#0x55 ; INT0/INT1 edge 0016 75 8D 64 354 mov th1,#256-156 ; 1200 bauds 0019 75 87 00 355 mov pcon,#0 ; SMOD0=0 356 ;; give Windows a chance to finish the writecpucs control transfer 357 ;; 5ms delay loop 001C 90 F4 48 358 mov dptr,#(-3000)&0xffff 001F A3 359 0$: inc dptr ; 3 cycles 0020 E5 82 360 mov a,dpl0 ; 2 cycles 0022 45 83 361 orl a,dph0 ; 2 cycles 0024 70 F9 362 jnz 0$ ; 3 cycles 363 ;; init USB subsystem 0026 90 7F A1 364 mov dptr,#ISOCTL 0029 74 01 365 mov a,#1 ; disable ISO endpoints 002B F0 366 movx @dptr,a 002C 90 7F AF 367 mov dptr,#USBBAV 002F 74 01 368 mov a,#1 ; enable autovector, disable breakpoint logic 0031 F0 369 movx @dptr,a 0032 E4 370 clr a 0033 90 7F E0 371 mov dptr,#INISOVAL 0036 F0 372 movx @dptr,a 0037 90 7F E1 373 mov dptr,#OUTISOVAL 003A F0 374 movx @dptr,a 003B 90 7F DD 375 mov dptr,#USBPAIR 003E 74 09 376 mov a,#0x9 ; pair EP 2&3 for input & output 0040 F0 377 movx @dptr,a 0041 90 7F DE 378 mov dptr,#IN07VAL 0044 74 03 379 mov a,#0x3 ; enable EP0+EP1 0046 F0 380 movx @dptr,a 0047 90 7F DF 381 mov dptr,#OUT07VAL 004A 74 05 382 mov a,#0x5 ; enable EP0+EP2 004C F0 383 movx @dptr,a 384 ;; USB: init endpoint toggles 004D 90 7F D7 385 mov dptr,#TOGCTL 0050 74 12 386 mov a,#0x12 0052 F0 387 movx @dptr,a 0053 74 32 388 mov a,#0x32 ; clear EP 2 in toggle 0055 F0 389 movx @dptr,a 0056 74 02 390 mov a,#0x02 0058 F0 391 movx @dptr,a 0059 74 22 392 mov a,#0x22 ; clear EP 2 out toggle 005B F0 393 movx @dptr,a 394 ;; configure IO ports 005C 90 7F 93 395 mov dptr,#PORTACFG 005F 74 00 396 mov a,#0 0061 F0 397 movx @dptr,a 0062 90 7F 96 398 mov dptr,#OUTA 0065 74 80 399 mov a,#0x80 ; set PROG lo 0067 F0 400 movx @dptr,a 0068 90 7F 9C 401 mov dptr,#OEA 006B 74 C2 402 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 006D F0 403 movx @dptr,a 006E 90 7F 94 404 mov dptr,#PORTBCFG 0071 74 00 405 mov a,#0 0073 F0 406 movx @dptr,a 0074 90 7F 9D 407 mov dptr,#OEB 0077 74 00 408 mov a,#0 0079 F0 409 movx @dptr,a 007A 90 7F 95 410 mov dptr,#PORTCCFG 007D 74 00 411 mov a,#0 007F F0 412 movx @dptr,a 0080 90 7F 98 413 mov dptr,#OUTC 0083 74 20 414 mov a,#0x20 0085 F0 415 movx @dptr,a 0086 90 7F 9E 416 mov dptr,#OEC 0089 74 2E 417 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 008B F0 418 movx @dptr,a 419 ;; enable interrupts 008C 75 A8 82 420 mov ie,#0x82 ; enable timer 0 int 008F 75 E8 01 421 mov eie,#0x01 ; enable USB interrupts 0092 90 7F AE 422 mov dptr,#USBIEN 0095 74 01 423 mov a,#1 ; enable SUDAV interrupt 0097 F0 424 movx @dptr,a 0098 90 7F AC 425 mov dptr,#IN07IEN 009B 74 03 426 mov a,#3 ; enable EP0+EP1 interrupt 009D F0 427 movx @dptr,a 009E 90 7F AD 428 mov dptr,#OUT07IEN 00A1 74 01 429 mov a,#1 ; enable EP0 interrupt 00A3 F0 430 movx @dptr,a 431 ;; initialize UART 0 for config loading 00A4 75 98 20 432 mov scon0,#0x20 ; mode 0, CLK24/4 00A7 75 99 FF 433 mov sbuf0,#0xff 434 ;; initialize EP1 IN (irq) 00AA 12s05rD8 435 lcall fillusbintr 436 437 ;; some short delay 00AD 90 7F 96 438 mov dptr,#OUTA 00B0 74 82 439 mov a,#0x82 ; set PROG hi 00B2 F0 440 movx @dptr,a 00B3 90 7F 99 441 mov dptr,#PINSA 00B6 E0 442 movx a,@dptr 00B7 30 E2 06 443 jnb acc.2,1$ 444 ;; DONE stuck high 00BA 75*00 80 445 mov errcode,#0x80 00BD 02s01rE9 446 ljmp fpgaerr 00C0 12s00r00 447 1$: lcall jtag_reset_tap 00C3 7A 05 448 mov r2,#5 00C5 7B 00 449 mov r3,#0 00C7 7C 06 450 mov r4,#6 00C9 12s00r06 451 lcall jtag_shiftout ; enter SHIFT-IR state 00CC 7A 08 452 mov r2,#8 00CE 7B 00 453 mov r3,#0 00D0 7C 00 454 mov r4,#0 00D2 12s00r06 455 lcall jtag_shiftout ; assume max. 8bit IR 00D5 7A 08 456 mov r2,#8 00D7 7B 01 457 mov r3,#1 00D9 7C 00 458 mov r4,#0 00DB 12s00r06 459 lcall jtag_shift ; shift in a single bit 00DE 74 F8 460 mov a,#-(1<(-FPGA_CONFIGSIZE) 0194 35*03 587 addc a,cfgcount+1 0196 50 B7 588 jnc loadloop 589 ;; configuration download complete, start FPGA 0198 90 7F 94 590 mov dptr,#PORTBCFG 019B 74 00 591 mov a,#0 ; TDI no longer special function pin 019D F0 592 movx @dptr,a 019E 90 7F 95 593 mov dptr,#PORTCCFG 01A1 74 00 594 mov a,#0 ; TCK no longer special function pin 01A3 F0 595 movx @dptr,a 596 ;; wait for done loop 01A4 7F FA 597 mov r7,#250 01A6 598 doneloop: 01A6 90 7F 99 599 mov dptr,#PINSA 01A9 E0 600 movx a,@dptr 01AA 20 E2 1F 601 jb acc.2,doneactive 01AD 90 7F 9B 602 mov dptr,#PINSC 01B0 E0 603 movx a,@dptr 01B1 20 E2 06 604 jb acc.2,1$ 605 ;; INIT low 01B4 75*00 90 606 mov errcode,#0x90 01B7 02s01rE9 607 ljmp fpgaerr 01BA 90 7F 98 608 1$: mov dptr,#OUTC 01BD E0 609 movx a,@dptr 01BE D2 E1 610 setb acc.1 01C0 F0 611 movx @dptr,a 01C1 C2 E1 612 clr acc.1 01C3 F0 613 movx @dptr,a 01C4 DF E0 614 djnz r7,doneloop 615 ;; DONE stuck low 01C6 75*00 91 616 mov errcode,#0x91 01C9 02s01rE9 617 ljmp fpgaerr 618 01CC 619 doneactive: 620 ;; generate 16 clock pulses to start up FPGA 01CC 7F 10 621 mov r7,#16 01CE 90 7F 98 622 mov dptr,#OUTC 01D1 E0 623 movx a,@dptr 01D2 D2 E1 624 0$: setb acc.1 01D4 F0 625 movx @dptr,a 01D5 C2 E1 626 clr acc.1 01D7 F0 627 movx @dptr,a 01D8 DF F8 628 djnz r7,0$ 01DA 90 7F 95 629 mov dptr,#PORTCCFG 01DD 74 C0 630 mov a,#0xc0 ; RD/WR is special function pin 01DF F0 631 movx @dptr,a 01E0 75*00 20 632 mov errcode,#0x20 633 01E3 90 C0 08 634 mov dptr,#0xc008 01E6 74 C7 635 mov a,#0xc7 01E8 F0 636 movx @dptr,a 637 01E9 638 fpgaerr: 01E9 80 FE 639 sjmp fpgaerr 640 641 .area CSEG (CODE) 0002 642 ar2 = 0x02 0003 643 ar3 = 0x03 0004 644 ar4 = 0x04 0005 645 ar5 = 0x05 0006 646 ar6 = 0x06 0007 647 ar7 = 0x07 0000 648 ar0 = 0x00 0001 649 ar1 = 0x01 650 651 ;; jtag_shift 652 ;; r2 = num 653 ;; r3 = tdi 654 ;; r4 = tms 655 ;; return: r7 = tdo 0000 656 jtag_reset_tap: 0000 7A 05 657 mov r2,#5 0002 7B 00 658 mov r3,#0 0004 7C FF 659 mov r4,#0xff 0006 660 jtag_shiftout: 0006 661 jtag_shift: 0006 7E 01 662 mov r6,#1 0008 7F 00 663 mov r7,#0 000A 74 02 664 1$: mov a,#2 000C CB 665 xch a,r3 000D 13 666 rrc a 000E CB 667 xch a,r3 000F 92 E6 668 mov acc.6,c 0011 CC 669 xch a,r4 0012 13 670 rrc a 0013 CC 671 xch a,r4 0014 92 E7 672 mov acc.7,c 0016 90 7F 96 673 mov dptr,#OUTA 0019 F0 674 movx @dptr,a 001A 90 7F 9B 675 mov dptr,#PINSC 001D E0 676 movx a,@dptr 001E 30 E0 03 677 jnb acc.0,2$ 0021 EE 678 mov a,r6 0022 42 07 679 orl ar7,a 0024 90 7F 98 680 2$: mov dptr,#OUTC 0027 E0 681 movx a,@dptr 0028 D2 E1 682 setb acc.1 002A F0 683 movx @dptr,a 002B C2 E1 684 clr acc.1 002D F0 685 movx @dptr,a 002E EE 686 mov a,r6 002F 23 687 rl a 0030 FE 688 mov r6,a 0031 DA D7 689 djnz r2,1$ 0033 22 690 ret 691 692 ;; EEPROM address where the serial number is located 693 0034 694 eepromstraddr: 0034 10 695 .db 0x10 696 697 ;; I2C Routines 698 ;; note: ckcon should be set to #0x31 to avoid chip bugs 699 0035 700 writei2c: 701 ;; dptr: data to be sent 702 ;; b: device address 703 ;; r7: transfer length 704 ;; return: a: status (bytes remaining, 0xff bus error) 0035 05 86 705 inc dps 0037 90 7F A5 706 mov dptr,#I2CS 003A C2 F0 707 clr b.0 ; r/w = 0 003C 74 80 708 mov a,#0x80 ; start condition 003E F0 709 movx @dptr,a 003F 90 7F A6 710 mov dptr,#I2DAT 0042 E5 F0 711 mov a,b 0044 F0 712 movx @dptr,a 0045 90 7F A5 713 mov dptr,#I2CS 0048 E0 714 0$: movx a,@dptr 0049 20 E2 20 715 jb acc.2,3$ ; BERR 004C 30 E0 F9 716 jnb acc.0,0$ ; DONE 004F 30 E1 0F 717 jnb acc.1,1$ ; ACK 0052 90 7F A6 718 mov dptr,#I2DAT 0055 15 86 719 dec dps 0057 E0 720 movx a,@dptr 0058 A3 721 inc dptr 0059 05 86 722 inc dps 005B F0 723 movx @dptr,a 005C 90 7F A5 724 mov dptr,#I2CS 005F DF E7 725 djnz r7,0$ 0061 74 40 726 1$: mov a,#0x40 ; stop condition 0063 F0 727 movx @dptr,a 0064 E0 728 2$: movx a,@dptr 0065 20 E6 FC 729 jb acc.6,2$ 0068 15 86 730 dec dps 006A EF 731 mov a,r7 006B 22 732 ret 006C 7F FF 733 3$: mov r7,#255 006E 80 F1 734 sjmp 1$ 735 0070 736 readi2c: 737 ;; dptr: data to be sent 738 ;; b: device address 739 ;; r7: transfer length 740 ;; return: a: status (bytes remaining, 0xff bus error) 0070 05 86 741 inc dps 0072 90 7F A5 742 mov dptr,#I2CS 0075 D2 F0 743 setb b.0 ; r/w = 1 0077 74 80 744 mov a,#0x80 ; start condition 0079 F0 745 movx @dptr,a 007A 90 7F A6 746 mov dptr,#I2DAT 007D E5 F0 747 mov a,b 007F F0 748 movx @dptr,a 0080 90 7F A5 749 mov dptr,#I2CS 0083 E0 750 0$: movx a,@dptr 0084 20 E2 4C 751 jb acc.2,9$ ; BERR 0087 30 E0 F9 752 jnb acc.0,0$ ; DONE 008A 30 E1 03 753 jnb acc.1,5$ ; ACK 008D EF 754 mov a,r7 008E 70 0B 755 jnz 1$ 0090 74 40 756 5$: mov a,#0x40 ; stop condition 0092 F0 757 movx @dptr,a 0093 E0 758 2$: movx a,@dptr 0094 20 E6 FC 759 jb acc.6,2$ 0097 15 86 760 dec dps 0099 E4 761 clr a 009A 22 762 ret 009B B4 01 03 763 1$: cjne a,#1,3$ 009E 74 20 764 mov a,#0x20 ; LASTRD = 1 00A0 F0 765 movx @dptr,a 00A1 90 7F A6 766 3$: mov dptr,#I2DAT 00A4 E0 767 movx a,@dptr ; initiate first read 00A5 90 7F A5 768 mov dptr,#I2CS 00A8 E0 769 4$: movx a,@dptr 00A9 20 E2 27 770 jb acc.2,9$ ; BERR 00AC 30 E0 F9 771 jnb acc.0,4$ ; DONE 00AF EF 772 mov a,r7 00B0 B4 02 03 773 cjne a,#2,6$ 00B3 74 20 774 mov a,#0x20 ; LASTRD = 1 00B5 F0 775 movx @dptr,a 00B6 B4 01 03 776 6$: cjne a,#1,7$ 00B9 74 40 777 mov a,#0x40 ; stop condition 00BB F0 778 movx @dptr,a 00BC 90 7F A6 779 7$: mov dptr,#I2DAT 00BF E0 780 movx a,@dptr ; read data 00C0 15 86 781 dec dps 00C2 F0 782 movx @dptr,a 00C3 A3 783 inc dptr 00C4 05 86 784 inc dps 00C6 90 7F A5 785 mov dptr,#I2CS 00C9 DF DD 786 djnz r7,4$ 00CB E0 787 8$: movx a,@dptr 00CC 20 E6 FC 788 jb acc.6,8$ 00CF 15 86 789 dec dps 00D1 E4 790 clr a 00D2 22 791 ret 00D3 74 40 792 9$: mov a,#0x40 ; stop condition 00D5 F0 793 movx @dptr,a 00D6 E0 794 10$: movx a,@dptr 00D7 20 E6 FC 795 jb acc.6,10$ 00DA 74 FF 796 mov a,#255 00DC 15 86 797 dec dps 00DE 22 798 ret 799 800 ;; ------------------ interrupt handlers ------------------------ 801 00DF 802 int0_isr: 00DF C0 E0 803 push acc 00E1 C0 F0 804 push b 00E3 C0 82 805 push dpl0 00E5 C0 83 806 push dph0 00E7 C0 D0 807 push psw 00E9 75 D0 00 808 mov psw,#0x00 00EC C0 86 809 push dps 00EE 75 86 00 810 mov dps,#0 811 ;; clear interrupt 00F1 C2 89 812 clr tcon+1 813 ;; handle interrupt 814 ;; epilogue 00F3 D0 86 815 pop dps 00F5 D0 D0 816 pop psw 00F7 D0 83 817 pop dph0 00F9 D0 82 818 pop dpl0 00FB D0 F0 819 pop b 00FD D0 E0 820 pop acc 00FF 32 821 reti 822 0100 823 timer0_isr: 0100 C0 E0 824 push acc 0102 C0 F0 825 push b 0104 C0 82 826 push dpl0 0106 C0 83 827 push dph0 0108 C0 D0 828 push psw 010A 75 D0 00 829 mov psw,#0x00 010D C0 86 830 push dps 010F 75 86 00 831 mov dps,#0 832 ;; clear interrupt 0112 C2 8D 833 clr tcon+5 834 ;; handle interrupt 0114 05*04 835 inc leddiv 0116 E5*04 836 mov a,leddiv 0118 54 07 837 anl a,#7 011A 70 07 838 jnz 0$ 011C 90 7F 98 839 mov dptr,#OUTC 011F E0 840 movx a,@dptr 0120 64 08 841 xrl a,#0x08 0122 F0 842 movx @dptr,a 0123 843 0$: 844 ;; epilogue 0123 D0 86 845 pop dps 0125 D0 D0 846 pop psw 0127 D0 83 847 pop dph0 0129 D0 82 848 pop dpl0 012B D0 F0 849 pop b 012D D0 E0 850 pop acc 012F 32 851 reti 852 0130 853 int1_isr: 0130 C0 E0 854 push acc 0132 C0 F0 855 push b 0134 C0 82 856 push dpl0 0136 C0 83 857 push dph0 0138 C0 D0 858 push psw 013A 75 D0 00 859 mov psw,#0x00 013D C0 86 860 push dps 013F 75 86 00 861 mov dps,#0 862 ;; clear interrupt 0142 C2 8B 863 clr tcon+3 864 ;; handle interrupt 865 ;; epilogue 0144 D0 86 866 pop dps 0146 D0 D0 867 pop psw 0148 D0 83 868 pop dph0 014A D0 82 869 pop dpl0 014C D0 F0 870 pop b 014E D0 E0 871 pop acc 0150 32 872 reti 873 0151 874 timer1_isr: 0151 C0 E0 875 push acc 0153 C0 F0 876 push b 0155 C0 82 877 push dpl0 0157 C0 83 878 push dph0 0159 C0 D0 879 push psw 015B 75 D0 00 880 mov psw,#0x00 015E C0 86 881 push dps 0160 75 86 00 882 mov dps,#0 883 ;; clear interrupt 0163 C2 8F 884 clr tcon+7 885 ;; handle interrupt 886 ;; epilogue 0165 D0 86 887 pop dps 0167 D0 D0 888 pop psw 0169 D0 83 889 pop dph0 016B D0 82 890 pop dpl0 016D D0 F0 891 pop b 016F D0 E0 892 pop acc 0171 32 893 reti 894 0172 895 ser0_isr: 0172 C0 E0 896 push acc 0174 C0 F0 897 push b 0176 C0 82 898 push dpl0 0178 C0 83 899 push dph0 017A C0 D0 900 push psw 017C 75 D0 00 901 mov psw,#0x00 017F C0 86 902 push dps 0181 75 86 00 903 mov dps,#0 904 ;; clear interrupt 0184 C2 98 905 clr scon0+0 0186 C2 99 906 clr scon0+1 907 ;; handle interrupt 908 ;; epilogue 0188 D0 86 909 pop dps 018A D0 D0 910 pop psw 018C D0 83 911 pop dph0 018E D0 82 912 pop dpl0 0190 D0 F0 913 pop b 0192 D0 E0 914 pop acc 0194 32 915 reti 916 0195 917 timer2_isr: 0195 C0 E0 918 push acc 0197 C0 F0 919 push b 0199 C0 82 920 push dpl0 019B C0 83 921 push dph0 019D C0 D0 922 push psw 019F 75 D0 00 923 mov psw,#0x00 01A2 C0 86 924 push dps 01A4 75 86 00 925 mov dps,#0 926 ;; clear interrupt 01A7 C2 CF 927 clr t2con+7 928 ;; handle interrupt 929 ;; epilogue 01A9 D0 86 930 pop dps 01AB D0 D0 931 pop psw 01AD D0 83 932 pop dph0 01AF D0 82 933 pop dpl0 01B1 D0 F0 934 pop b 01B3 D0 E0 935 pop acc 01B5 32 936 reti 937 01B6 938 resume_isr: 01B6 C0 E0 939 push acc 01B8 C0 F0 940 push b 01BA C0 82 941 push dpl0 01BC C0 83 942 push dph0 01BE C0 D0 943 push psw 01C0 75 D0 00 944 mov psw,#0x00 01C3 C0 86 945 push dps 01C5 75 86 00 946 mov dps,#0 947 ;; clear interrupt 01C8 C2 DC 948 clr eicon+4 949 ;; handle interrupt 950 ;; epilogue 01CA D0 86 951 pop dps 01CC D0 D0 952 pop psw 01CE D0 83 953 pop dph0 01D0 D0 82 954 pop dpl0 01D2 D0 F0 955 pop b 01D4 D0 E0 956 pop acc 01D6 32 957 reti 958 01D7 959 ser1_isr: 01D7 C0 E0 960 push acc 01D9 C0 F0 961 push b 01DB C0 82 962 push dpl0 01DD C0 83 963 push dph0 01DF C0 D0 964 push psw 01E1 75 D0 00 965 mov psw,#0x00 01E4 C0 86 966 push dps 01E6 75 86 00 967 mov dps,#0 968 ;; clear interrupt 01E9 C2 C0 969 clr scon1+0 01EB C2 C1 970 clr scon1+1 971 ;; handle interrupt 972 ;; epilogue 01ED D0 86 973 pop dps 01EF D0 D0 974 pop psw 01F1 D0 83 975 pop dph0 01F3 D0 82 976 pop dpl0 01F5 D0 F0 977 pop b 01F7 D0 E0 978 pop acc 01F9 32 979 reti 980 01FA 981 i2c_isr: 01FA C0 E0 982 push acc 01FC C0 F0 983 push b 01FE C0 82 984 push dpl0 0200 C0 83 985 push dph0 0202 C0 D0 986 push psw 0204 75 D0 00 987 mov psw,#0x00 0207 C0 86 988 push dps 0209 75 86 00 989 mov dps,#0 990 ;; clear interrupt 020C E5 91 991 mov a,exif 020E C2 E5 992 clr acc.5 0210 F5 91 993 mov exif,a 994 ;; handle interrupt 995 ;; epilogue 0212 D0 86 996 pop dps 0214 D0 D0 997 pop psw 0216 D0 83 998 pop dph0 0218 D0 82 999 pop dpl0 021A D0 F0 1000 pop b 021C D0 E0 1001 pop acc 021E 32 1002 reti 1003 021F 1004 int4_isr: 021F C0 E0 1005 push acc 0221 C0 F0 1006 push b 0223 C0 82 1007 push dpl0 0225 C0 83 1008 push dph0 0227 C0 D0 1009 push psw 0229 75 D0 00 1010 mov psw,#0x00 022C C0 86 1011 push dps 022E 75 86 00 1012 mov dps,#0 1013 ;; clear interrupt 0231 E5 91 1014 mov a,exif 0233 C2 E6 1015 clr acc.6 0235 F5 91 1016 mov exif,a 1017 ;; handle interrupt 1018 ;; epilogue 0237 D0 86 1019 pop dps 0239 D0 D0 1020 pop psw 023B D0 83 1021 pop dph0 023D D0 82 1022 pop dpl0 023F D0 F0 1023 pop b 0241 D0 E0 1024 pop acc 0243 32 1025 reti 1026 0244 1027 int5_isr: 0244 C0 E0 1028 push acc 0246 C0 F0 1029 push b 0248 C0 82 1030 push dpl0 024A C0 83 1031 push dph0 024C C0 D0 1032 push psw 024E 75 D0 00 1033 mov psw,#0x00 0251 C0 86 1034 push dps 0253 75 86 00 1035 mov dps,#0 1036 ;; clear interrupt 0256 E5 91 1037 mov a,exif 0258 C2 E7 1038 clr acc.7 025A F5 91 1039 mov exif,a 1040 ;; handle interrupt 1041 ;; epilogue 025C D0 86 1042 pop dps 025E D0 D0 1043 pop psw 0260 D0 83 1044 pop dph0 0262 D0 82 1045 pop dpl0 0264 D0 F0 1046 pop b 0266 D0 E0 1047 pop acc 0268 32 1048 reti 1049 0269 1050 int6_isr: 0269 C0 E0 1051 push acc 026B C0 F0 1052 push b 026D C0 82 1053 push dpl0 026F C0 83 1054 push dph0 0271 C0 D0 1055 push psw 0273 75 D0 00 1056 mov psw,#0x00 0276 C0 86 1057 push dps 0278 75 86 00 1058 mov dps,#0 1059 ;; clear interrupt 027B C2 DB 1060 clr eicon+3 1061 ;; handle interrupt 1062 ;; epilogue 027D D0 86 1063 pop dps 027F D0 D0 1064 pop psw 0281 D0 83 1065 pop dph0 0283 D0 82 1066 pop dpl0 0285 D0 F0 1067 pop b 0287 D0 E0 1068 pop acc 0289 32 1069 reti 1070 028A 1071 xmemread:: 028A E5*09 1072 mov a,ctrllen 028C FF 1073 mov r7,a 028D 24 C0 1074 add a,#-64 028F F5*09 1075 mov ctrllen,a 0291 E5*0A 1076 mov a,ctrllen+1 0293 34 00 1077 addc a,#0 0295 50 12 1078 jnc 0$ 0297 E4 1079 clr a 0298 F5*09 1080 mov ctrllen,a 029A F5*0A 1081 mov ctrllen+1,a 029C F5*06 1082 mov ctrlcode,a 029E 74 02 1083 mov a,#2 ; ack control transfer 02A0 90 7F B4 1084 mov dptr,#EP0CS 02A3 F0 1085 movx @dptr,a 02A4 EF 1086 mov a,r7 02A5 60 25 1087 jz 2$ 02A7 80 04 1088 sjmp 1$ 02A9 F5*0A 1089 0$: mov ctrllen+1,a 02AB 7F 40 1090 mov r7,#64 02AD 8F 00 1091 1$: mov ar0,r7 02AF 85*07 82 1092 mov dpl0,ctrladdr 02B2 85*08 83 1093 mov dph0,ctrladdr+1 02B5 05 86 1094 inc dps 02B7 90 7F 00 1095 mov dptr,#IN0BUF 02BA 15 86 1096 dec dps 02BC E0 1097 3$: movx a,@dptr 02BD A3 1098 inc dptr 02BE 05 86 1099 inc dps 02C0 F0 1100 movx @dptr,a 02C1 A3 1101 inc dptr 02C2 15 86 1102 dec dps 02C4 D8 F6 1103 djnz r0,3$ 02C6 85 82*07 1104 mov ctrladdr,dpl0 02C9 85 83*08 1105 mov ctrladdr+1,dph0 02CC EF 1106 2$: mov a,r7 02CD 90 7F B5 1107 mov dptr,#IN0BC 02D0 F0 1108 movx @dptr,a 02D1 22 1109 ret 1110 02D2 1111 usb_sudav_isr: 02D2 C0 E0 1112 push acc 02D4 C0 F0 1113 push b 02D6 C0 82 1114 push dpl0 02D8 C0 83 1115 push dph0 02DA C0 84 1116 push dpl1 02DC C0 85 1117 push dph1 02DE C0 D0 1118 push psw 02E0 75 D0 00 1119 mov psw,#0x00 02E3 C0 86 1120 push dps 02E5 75 86 00 1121 mov dps,#0 02E8 C0 00 1122 push ar0 02EA C0 07 1123 push ar7 1124 ;; clear interrupt 02EC E5 91 1125 mov a,exif 02EE C2 E4 1126 clr acc.4 02F0 F5 91 1127 mov exif,a 02F2 90 7F AB 1128 mov dptr,#USBIRQ 02F5 74 01 1129 mov a,#0x01 02F7 F0 1130 movx @dptr,a 1131 ;; handle interrupt 02F8 75*06 00 1132 mov ctrlcode,#0 ; reset control out code 02FB 90 7F E9 1133 mov dptr,#SETUPDAT+1 02FE E0 1134 movx a,@dptr ; bRequest field 1135 ;; vendor specific commands 1136 ;; 0xa3 02FF B4 A3 3E 1137 cjne a,#0xa3,cmdnota3 0302 90 7F EA 1138 mov dptr,#SETUPDAT+2 0305 E0 1139 movx a,@dptr 0306 F5*07 1140 mov ctrladdr,a 0308 A3 1141 inc dptr 0309 E0 1142 movx a,@dptr 030A F5*08 1143 mov ctrladdr+1,a 030C 24 50 1144 add a,#80 030E 50 2D 1145 jnc setupstalla3 0310 90 7F EE 1146 mov dptr,#SETUPDAT+6 0313 E0 1147 movx a,@dptr 0314 F5*09 1148 mov ctrllen,a 0316 25*07 1149 add a,ctrladdr 0318 A3 1150 inc dptr 0319 E0 1151 movx a,@dptr 031A F5*0A 1152 mov ctrllen+1,a 031C 35*08 1153 addc a,ctrladdr+1 031E 40 1D 1154 jc setupstalla3 0320 90 7F E8 1155 mov dptr,#SETUPDAT ; bRequestType == 0x40 0323 E0 1156 movx a,@dptr 0324 B4 40 0A 1157 cjne a,#0x40,1$ 0327 75*06 01 1158 mov ctrlcode,#1 032A 90 7F C5 1159 mov dptr,#OUT0BC 032D F0 1160 movx @dptr,a 032E 02s04r28 1161 ljmp endusbisr 0331 B4 C0 09 1162 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 0334 75*06 02 1163 mov ctrlcode,#2 0337 12s02r8A 1164 lcall xmemread 033A 02s04r28 1165 ljmp endusbisr 033D 1166 setupstalla3: 033D 02s04r1E 1167 ljmp setupstall 0340 1168 cmdnota3: 1169 ;; 0xb1 0340 B4 B1 3E 1170 cjne a,#0xb1,cmdnotb1 0343 90 7F E8 1171 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0346 E0 1172 movx a,@dptr 0347 B4 C0 34 1173 cjne a,#0xc0,setupstallb1 034A 90 7F 00 1174 mov dptr,#IN0BUF 034D E5*00 1175 mov a,errcode 034F F0 1176 movx @dptr,a 0350 A3 1177 inc dptr 0351 E5*01 1178 mov a,errval 0353 F0 1179 movx @dptr,a 0354 A3 1180 inc dptr 0355 E5 81 1181 mov a,sp 1182 1183 ;;; xxxx 0357 C0 82 1184 push dpl0 0359 C0 83 1185 push dph0 035B 90 7F DF 1186 mov dptr,#OUT07VAL 035E E0 1187 movx a,@dptr 035F D0 83 1188 pop dph0 0361 D0 82 1189 pop dpl0 1190 ;;; xxxx 1191 0363 F0 1192 movx @dptr,a 0364 A3 1193 inc dptr 0365 74 00 1194 mov a,#0 1195 1196 ;;; xxxx 0367 C0 82 1197 push dpl0 0369 C0 83 1198 push dph0 036B 90 7F C8 1199 mov dptr,#OUT2CS 036E E0 1200 movx a,@dptr 036F D0 83 1201 pop dph0 0371 D0 82 1202 pop dpl0 1203 ;;; xxxx 1204 0373 F0 1205 movx @dptr,a 0374 A3 1206 inc dptr 0375 90 7F B5 1207 mov dptr,#IN0BC 0378 74 04 1208 mov a,#4 037A F0 1209 movx @dptr,a 037B 02s04r22 1210 ljmp setupack 037E 1211 setupstallb1: 037E 02s04r1E 1212 ljmp setupstall 0381 1213 cmdnotb1: 1214 ;; 0xb2 0381 B4 B2 2B 1215 cjne a,#0xb2,cmdnotb2 0384 90 7F E8 1216 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0387 E0 1217 movx a,@dptr 0388 B4 C0 21 1218 cjne a,#0xc0,setupstallb2 038B 90 7F 00 1219 mov dptr,#IN0BUF 038E E5*00 1220 mov a,errcode 0390 F0 1221 movx @dptr,a 0391 A3 1222 inc dptr 0392 E5*01 1223 mov a,errval 0394 F0 1224 movx @dptr,a 0395 A3 1225 inc dptr 0396 E5*02 1226 mov a,cfgcount 0398 F0 1227 movx @dptr,a 0399 A3 1228 inc dptr 039A E5*03 1229 mov a,cfgcount+1 039C F0 1230 movx @dptr,a 039D A3 1231 inc dptr 039E E5*05 1232 mov a,irqcount 03A0 F0 1233 movx @dptr,a 03A1 90 7F B5 1234 mov dptr,#IN0BC 03A4 74 05 1235 mov a,#5 03A6 F0 1236 movx @dptr,a 03A7 05*05 1237 inc irqcount 03A9 02s04r22 1238 ljmp setupack 03AC 1239 setupstallb2: 03AC 02s04r1E 1240 ljmp setupstall 03AF 1241 cmdnotb2: 1242 ;; 0xb3 03AF B4 B3 2A 1243 cjne a,#0xb3,cmdnotb3 03B2 90 7F E8 1244 mov dptr,#SETUPDAT ; bRequestType == 0xc0 03B5 E0 1245 movx a,@dptr 03B6 B4 C0 20 1246 cjne a,#0xc0,setupstallb3 1247 ;; read EEPROM 0006 1248 serstrlen = 6 03B9 75 F0 A0 1249 mov b,#0xa0 ; EEPROM address 03BC 90s00r34 1250 mov dptr,#eepromstraddr 03BF 7F 01 1251 mov r7,#1 03C1 12s00r35 1252 lcall writei2c 03C4 70 13 1253 jnz setupstallb3 03C6 90 7F 00 1254 mov dptr,#IN0BUF 03C9 7F 06 1255 mov r7,#serstrlen 03CB 12s00r70 1256 lcall readi2c 03CE 70 09 1257 jnz setupstallb3 03D0 74 06 1258 mov a,#serstrlen 03D2 90 7F B5 1259 mov dptr,#IN0BC 03D5 F0 1260 movx @dptr,a 03D6 02s04r22 1261 ljmp setupack 03D9 1262 setupstallb3: 03D9 02s04r1E 1263 ljmp setupstall 03DC 1264 cmdnotb3: 1265 ;; 0xb4 03DC B4 B4 3F 1266 cjne a,#0xb4,cmdnotb4 03DF 90 7F EF 1267 mov dptr,#SETUPDAT+7 03E2 E0 1268 movx a,@dptr 03E3 70 36 1269 jnz setupstallb4 03E5 90 7F EE 1270 mov dptr,#SETUPDAT+6 03E8 E0 1271 movx a,@dptr 03E9 F8 1272 mov r0,a 03EA FF 1273 mov r7,a 03EB 24 C0 1274 add a,#-64 03ED 40 2C 1275 jc setupstallb4 03EF 90 7F EC 1276 mov dptr,#SETUPDAT+4 ; wIndex 03F2 E0 1277 movx a,@dptr 03F3 F5 F0 1278 mov b,a 03F5 F5*07 1279 mov ctrladdr,a 03F7 90 7F E8 1280 mov dptr,#SETUPDAT 03FA E0 1281 movx a,@dptr 03FB B4 40 0A 1282 cjne a,#0x40,0$ ; bRequestType == 0x40 03FE 75*06 02 1283 mov ctrlcode,#2 0401 90 7F C5 1284 mov dptr,#OUT0BC 0404 F0 1285 movx @dptr,a 0405 02s04r28 1286 ljmp endusbisr 0408 B4 C0 10 1287 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 040B 90 7F 00 1288 mov dptr,#IN0BUF 040E 12s00r70 1289 lcall readi2c 0411 70 08 1290 jnz setupstallb4 0413 E8 1291 mov a,r0 0414 90 7F B5 1292 mov dptr,#IN0BC 0417 F0 1293 movx @dptr,a 0418 02s04r22 1294 ljmp setupack 041B 1295 setupstallb4: 041B 02s04r1E 1296 ljmp setupstall 041E 1297 cmdnotb4: 1298 ;; unknown commands fall through to setupstall 1299 041E 1300 setupstall: 041E 74 03 1301 mov a,#3 0420 80 02 1302 sjmp endsetup 0422 1303 setupack: 0422 74 02 1304 mov a,#2 0424 1305 endsetup: 0424 90 7F B4 1306 mov dptr,#EP0CS 0427 F0 1307 movx @dptr,a 0428 1308 endusbisr: 1309 ;; epilogue 0428 D0 07 1310 pop ar7 042A D0 00 1311 pop ar0 042C D0 86 1312 pop dps 042E D0 D0 1313 pop psw 0430 D0 85 1314 pop dph1 0432 D0 84 1315 pop dpl1 0434 D0 83 1316 pop dph0 0436 D0 82 1317 pop dpl0 0438 D0 F0 1318 pop b 043A D0 E0 1319 pop acc 043C 32 1320 reti 1321 043D 1322 usb_sof_isr: 043D C0 E0 1323 push acc 043F C0 F0 1324 push b 0441 C0 82 1325 push dpl0 0443 C0 83 1326 push dph0 0445 C0 D0 1327 push psw 0447 75 D0 00 1328 mov psw,#0x00 044A C0 86 1329 push dps 044C 75 86 00 1330 mov dps,#0 1331 ;; clear interrupt 044F E5 91 1332 mov a,exif 0451 C2 E4 1333 clr acc.4 0453 F5 91 1334 mov exif,a 0455 90 7F AB 1335 mov dptr,#USBIRQ 0458 74 02 1336 mov a,#0x02 045A F0 1337 movx @dptr,a 1338 ;; handle interrupt 1339 ;; epilogue 045B D0 86 1340 pop dps 045D D0 D0 1341 pop psw 045F D0 83 1342 pop dph0 0461 D0 82 1343 pop dpl0 0463 D0 F0 1344 pop b 0465 D0 E0 1345 pop acc 0467 32 1346 reti 1347 1348 0468 1349 usb_sutok_isr: 0468 C0 E0 1350 push acc 046A C0 F0 1351 push b 046C C0 82 1352 push dpl0 046E C0 83 1353 push dph0 0470 C0 D0 1354 push psw 0472 75 D0 00 1355 mov psw,#0x00 0475 C0 86 1356 push dps 0477 75 86 00 1357 mov dps,#0 1358 ;; clear interrupt 047A E5 91 1359 mov a,exif 047C C2 E4 1360 clr acc.4 047E F5 91 1361 mov exif,a 0480 90 7F AB 1362 mov dptr,#USBIRQ 0483 74 04 1363 mov a,#0x04 0485 F0 1364 movx @dptr,a 1365 ;; handle interrupt 1366 ;; epilogue 0486 D0 86 1367 pop dps 0488 D0 D0 1368 pop psw 048A D0 83 1369 pop dph0 048C D0 82 1370 pop dpl0 048E D0 F0 1371 pop b 0490 D0 E0 1372 pop acc 0492 32 1373 reti 1374 0493 1375 usb_suspend_isr: 0493 C0 E0 1376 push acc 0495 C0 F0 1377 push b 0497 C0 82 1378 push dpl0 0499 C0 83 1379 push dph0 049B C0 D0 1380 push psw 049D 75 D0 00 1381 mov psw,#0x00 04A0 C0 86 1382 push dps 04A2 75 86 00 1383 mov dps,#0 1384 ;; clear interrupt 04A5 E5 91 1385 mov a,exif 04A7 C2 E4 1386 clr acc.4 04A9 F5 91 1387 mov exif,a 04AB 90 7F AB 1388 mov dptr,#USBIRQ 04AE 74 08 1389 mov a,#0x08 04B0 F0 1390 movx @dptr,a 1391 ;; handle interrupt 1392 ;; epilogue 04B1 D0 86 1393 pop dps 04B3 D0 D0 1394 pop psw 04B5 D0 83 1395 pop dph0 04B7 D0 82 1396 pop dpl0 04B9 D0 F0 1397 pop b 04BB D0 E0 1398 pop acc 04BD 32 1399 reti 1400 04BE 1401 usb_usbreset_isr: 04BE C0 E0 1402 push acc 04C0 C0 F0 1403 push b 04C2 C0 82 1404 push dpl0 04C4 C0 83 1405 push dph0 04C6 C0 D0 1406 push psw 04C8 75 D0 00 1407 mov psw,#0x00 04CB C0 86 1408 push dps 04CD 75 86 00 1409 mov dps,#0 1410 ;; clear interrupt 04D0 E5 91 1411 mov a,exif 04D2 C2 E4 1412 clr acc.4 04D4 F5 91 1413 mov exif,a 04D6 90 7F AB 1414 mov dptr,#USBIRQ 04D9 74 10 1415 mov a,#0x10 04DB F0 1416 movx @dptr,a 1417 ;; handle interrupt 1418 ;; epilogue 04DC D0 86 1419 pop dps 04DE D0 D0 1420 pop psw 04E0 D0 83 1421 pop dph0 04E2 D0 82 1422 pop dpl0 04E4 D0 F0 1423 pop b 04E6 D0 E0 1424 pop acc 04E8 32 1425 reti 1426 04E9 1427 usb_ep0in_isr: 04E9 C0 E0 1428 push acc 04EB C0 F0 1429 push b 04ED C0 82 1430 push dpl0 04EF C0 83 1431 push dph0 04F1 C0 84 1432 push dpl1 04F3 C0 85 1433 push dph1 04F5 C0 D0 1434 push psw 04F7 75 D0 00 1435 mov psw,#0x00 04FA C0 86 1436 push dps 04FC 75 86 00 1437 mov dps,#0 04FF C0 00 1438 push ar0 0501 C0 07 1439 push ar7 1440 ;; clear interrupt 0503 E5 91 1441 mov a,exif 0505 C2 E4 1442 clr acc.4 0507 F5 91 1443 mov exif,a 0509 90 7F A9 1444 mov dptr,#IN07IRQ 050C 74 01 1445 mov a,#0x01 050E F0 1446 movx @dptr,a 1447 ;; handle interrupt 050F E5*06 1448 mov a,ctrlcode 0511 B4 02 05 1449 cjne a,#2,0$ 0514 12s02r8A 1450 lcall xmemread 0517 80 11 1451 sjmp ep0inendisr 0519 90 7F B5 1452 0$: mov dptr,#IN0BC 051C E4 1453 clr a 051D F0 1454 movx @dptr,a 051E 80 04 1455 sjmp ep0inack 1456 0520 1457 ep0install: 0520 74 03 1458 mov a,#3 0522 80 02 1459 sjmp ep0incs 0524 1460 ep0inack: 0524 74 02 1461 mov a,#2 0526 1462 ep0incs: 0526 90 7F B4 1463 mov dptr,#EP0CS 0529 F0 1464 movx @dptr,a 052A 1465 ep0inendisr: 1466 ;; epilogue 052A D0 07 1467 pop ar7 052C D0 00 1468 pop ar0 052E D0 86 1469 pop dps 0530 D0 D0 1470 pop psw 0532 D0 85 1471 pop dph1 0534 D0 84 1472 pop dpl1 0536 D0 83 1473 pop dph0 0538 D0 82 1474 pop dpl0 053A D0 F0 1475 pop b 053C D0 E0 1476 pop acc 053E 32 1477 reti 1478 053F 1479 usb_ep0out_isr: 053F C0 E0 1480 push acc 0541 C0 F0 1481 push b 0543 C0 82 1482 push dpl0 0545 C0 83 1483 push dph0 0547 C0 84 1484 push dpl1 0549 C0 85 1485 push dph1 054B C0 D0 1486 push psw 054D 75 D0 00 1487 mov psw,#0x00 0550 C0 86 1488 push dps 0552 75 86 00 1489 mov dps,#0 0555 C0 07 1490 push ar7 1491 ;; clear interrupt 0557 E5 91 1492 mov a,exif 0559 C2 E4 1493 clr acc.4 055B F5 91 1494 mov exif,a 055D 90 7F AA 1495 mov dptr,#OUT07IRQ 0560 74 01 1496 mov a,#0x01 0562 F0 1497 movx @dptr,a 1498 ;; handle interrupt 0563 E5*06 1499 mov a,ctrlcode ; check control code 0565 B4 01 36 1500 cjne a,#0x01,i2cwr 1501 ;; write to external memory 0568 90 7F C5 1502 mov dptr,#OUT0BC 056B E0 1503 movx a,@dptr 056C 60 28 1504 jz 0$ 056E FF 1505 mov r7,a 056F C3 1506 clr c 0570 E5*09 1507 mov a,ctrllen 0572 9F 1508 subb a,r7 0573 F5*09 1509 mov ctrllen,a 0575 E5*0A 1510 mov a,ctrllen+1 0577 94 00 1511 subb a,#0 0579 F5*0A 1512 mov ctrllen+1,a 057B 40 38 1513 jc ep0outstall 057D 90 7E C0 1514 mov dptr,#OUT0BUF 0580 85*07 84 1515 mov dpl1,ctrladdr 0583 85*08 85 1516 mov dph1,ctrladdr+1 0586 E0 1517 1$: movx a,@dptr 0587 A3 1518 inc dptr 0588 05 86 1519 inc dps 058A F0 1520 movx @dptr,a 058B A3 1521 inc dptr 058C 15 86 1522 dec dps 058E DF F6 1523 djnz r7,1$ 0590 85 84*07 1524 mov ctrladdr,dpl1 0593 85 85*08 1525 mov ctrladdr+1,dph1 0596 E5*09 1526 0$: mov a,ctrllen 0598 45*0A 1527 orl a,ctrllen+1 059A 60 20 1528 jz ep0outack 059C 80 27 1529 sjmp ep0outendisr 1530 1531 ;; write I2C eeprom 059E B4 02 14 1532 i2cwr: cjne a,#0x02,ep0outstall 05A1 90 7F C5 1533 mov dptr,#OUT0BC 05A4 E0 1534 movx a,@dptr 05A5 60 15 1535 jz ep0outack 05A7 FF 1536 mov r7,a 05A8 85*07 F0 1537 mov b,ctrladdr 05AB 90 7E C0 1538 mov dptr,#OUT0BUF 05AE 12s00r35 1539 lcall writei2c 05B1 70 02 1540 jnz ep0outstall 05B3 80 07 1541 sjmp ep0outack 1542 05B5 1543 ep0outstall: 05B5 75*06 00 1544 mov ctrlcode,#0 05B8 74 03 1545 mov a,#3 05BA 80 05 1546 sjmp ep0outcs 05BC 1547 ep0outack: 05BC 75*06 00 1548 mov ctrlcode,#0 05BF 74 02 1549 mov a,#2 05C1 1550 ep0outcs: 05C1 90 7F B4 1551 mov dptr,#EP0CS 05C4 F0 1552 movx @dptr,a 05C5 1553 ep0outendisr: 1554 ;; epilogue 05C5 D0 07 1555 pop ar7 05C7 D0 86 1556 pop dps 05C9 D0 D0 1557 pop psw 05CB D0 85 1558 pop dph1 05CD D0 84 1559 pop dpl1 05CF D0 83 1560 pop dph0 05D1 D0 82 1561 pop dpl0 05D3 D0 F0 1562 pop b 05D5 D0 E0 1563 pop acc 05D7 32 1564 reti 1565 05D8 1566 fillusbintr:: 05D8 90 7E 80 1567 mov dptr,#IN1BUF 05DB E5*00 1568 mov a,errcode 05DD F0 1569 movx @dptr,a 05DE A3 1570 inc dptr 05DF E5*01 1571 mov a,errval 05E1 F0 1572 movx @dptr,a 05E2 A3 1573 inc dptr 05E3 E5*02 1574 mov a,cfgcount 05E5 F0 1575 movx @dptr,a 05E6 A3 1576 inc dptr 05E7 E5*03 1577 mov a,cfgcount+1 05E9 F0 1578 movx @dptr,a 05EA A3 1579 inc dptr 05EB E5*05 1580 mov a,irqcount 05ED F0 1581 movx @dptr,a 05EE 90 7F B7 1582 mov dptr,#IN1BC 05F1 74 05 1583 mov a,#5 05F3 F0 1584 movx @dptr,a 05F4 05*05 1585 inc irqcount 05F6 22 1586 ret 1587 05F7 1588 usb_ep1in_isr: 05F7 C0 E0 1589 push acc 05F9 C0 F0 1590 push b 05FB C0 82 1591 push dpl0 05FD C0 83 1592 push dph0 05FF C0 D0 1593 push psw 0601 75 D0 00 1594 mov psw,#0x00 0604 C0 86 1595 push dps 0606 75 86 00 1596 mov dps,#0 1597 ;; clear interrupt 0609 E5 91 1598 mov a,exif 060B C2 E4 1599 clr acc.4 060D F5 91 1600 mov exif,a 060F 90 7F A9 1601 mov dptr,#IN07IRQ 0612 74 02 1602 mov a,#0x02 0614 F0 1603 movx @dptr,a 1604 ;; handle interrupt 0615 12s05rD8 1605 lcall fillusbintr 1606 ;; epilogue 0618 D0 86 1607 pop dps 061A D0 D0 1608 pop psw 061C D0 83 1609 pop dph0 061E D0 82 1610 pop dpl0 0620 D0 F0 1611 pop b 0622 D0 E0 1612 pop acc 0624 32 1613 reti 1614 0625 1615 usb_ep1out_isr: 0625 C0 E0 1616 push acc 0627 C0 F0 1617 push b 0629 C0 82 1618 push dpl0 062B C0 83 1619 push dph0 062D C0 D0 1620 push psw 062F 75 D0 00 1621 mov psw,#0x00 0632 C0 86 1622 push dps 0634 75 86 00 1623 mov dps,#0 1624 ;; clear interrupt 0637 E5 91 1625 mov a,exif 0639 C2 E4 1626 clr acc.4 063B F5 91 1627 mov exif,a 063D 90 7F AA 1628 mov dptr,#OUT07IRQ 0640 74 02 1629 mov a,#0x02 0642 F0 1630 movx @dptr,a 1631 ;; handle interrupt 1632 ;; epilogue 0643 D0 86 1633 pop dps 0645 D0 D0 1634 pop psw 0647 D0 83 1635 pop dph0 0649 D0 82 1636 pop dpl0 064B D0 F0 1637 pop b 064D D0 E0 1638 pop acc 064F 32 1639 reti 1640 0650 1641 usb_ep2in_isr: 0650 C0 E0 1642 push acc 0652 C0 F0 1643 push b 0654 C0 82 1644 push dpl0 0656 C0 83 1645 push dph0 0658 C0 D0 1646 push psw 065A 75 D0 00 1647 mov psw,#0x00 065D C0 86 1648 push dps 065F 75 86 00 1649 mov dps,#0 1650 ;; clear interrupt 0662 E5 91 1651 mov a,exif 0664 C2 E4 1652 clr acc.4 0666 F5 91 1653 mov exif,a 0668 90 7F A9 1654 mov dptr,#IN07IRQ 066B 74 04 1655 mov a,#0x04 066D F0 1656 movx @dptr,a 1657 ;; handle interrupt 1658 ;; epilogue 066E D0 86 1659 pop dps 0670 D0 D0 1660 pop psw 0672 D0 83 1661 pop dph0 0674 D0 82 1662 pop dpl0 0676 D0 F0 1663 pop b 0678 D0 E0 1664 pop acc 067A 32 1665 reti 1666 067B 1667 usb_ep2out_isr: 067B C0 E0 1668 push acc 067D C0 F0 1669 push b 067F C0 82 1670 push dpl0 0681 C0 83 1671 push dph0 0683 C0 D0 1672 push psw 0685 75 D0 00 1673 mov psw,#0x00 0688 C0 86 1674 push dps 068A 75 86 00 1675 mov dps,#0 1676 ;; clear interrupt 068D E5 91 1677 mov a,exif 068F C2 E4 1678 clr acc.4 0691 F5 91 1679 mov exif,a 0693 90 7F AA 1680 mov dptr,#OUT07IRQ 0696 74 04 1681 mov a,#0x04 0698 F0 1682 movx @dptr,a 1683 ;; handle interrupt 1684 ;; epilogue 0699 D0 86 1685 pop dps 069B D0 D0 1686 pop psw 069D D0 83 1687 pop dph0 069F D0 82 1688 pop dpl0 06A1 D0 F0 1689 pop b 06A3 D0 E0 1690 pop acc 06A5 32 1691 reti 1692 06A6 1693 usb_ep3in_isr: 06A6 C0 E0 1694 push acc 06A8 C0 F0 1695 push b 06AA C0 82 1696 push dpl0 06AC C0 83 1697 push dph0 06AE C0 D0 1698 push psw 06B0 75 D0 00 1699 mov psw,#0x00 06B3 C0 86 1700 push dps 06B5 75 86 00 1701 mov dps,#0 1702 ;; clear interrupt 06B8 E5 91 1703 mov a,exif 06BA C2 E4 1704 clr acc.4 06BC F5 91 1705 mov exif,a 06BE 90 7F A9 1706 mov dptr,#IN07IRQ 06C1 74 08 1707 mov a,#0x08 06C3 F0 1708 movx @dptr,a 1709 ;; handle interrupt 1710 ;; epilogue 06C4 D0 86 1711 pop dps 06C6 D0 D0 1712 pop psw 06C8 D0 83 1713 pop dph0 06CA D0 82 1714 pop dpl0 06CC D0 F0 1715 pop b 06CE D0 E0 1716 pop acc 06D0 32 1717 reti 1718 06D1 1719 usb_ep3out_isr: 06D1 C0 E0 1720 push acc 06D3 C0 F0 1721 push b 06D5 C0 82 1722 push dpl0 06D7 C0 83 1723 push dph0 06D9 C0 D0 1724 push psw 06DB 75 D0 00 1725 mov psw,#0x00 06DE C0 86 1726 push dps 06E0 75 86 00 1727 mov dps,#0 1728 ;; clear interrupt 06E3 E5 91 1729 mov a,exif 06E5 C2 E4 1730 clr acc.4 06E7 F5 91 1731 mov exif,a 06E9 90 7F AA 1732 mov dptr,#OUT07IRQ 06EC 74 08 1733 mov a,#0x08 06EE F0 1734 movx @dptr,a 1735 ;; handle interrupt 1736 ;; epilogue 06EF D0 86 1737 pop dps 06F1 D0 D0 1738 pop psw 06F3 D0 83 1739 pop dph0 06F5 D0 82 1740 pop dpl0 06F7 D0 F0 1741 pop b 06F9 D0 E0 1742 pop acc 06FB 32 1743 reti 1744 06FC 1745 usb_ep4in_isr: 06FC C0 E0 1746 push acc 06FE C0 F0 1747 push b 0700 C0 82 1748 push dpl0 0702 C0 83 1749 push dph0 0704 C0 D0 1750 push psw 0706 75 D0 00 1751 mov psw,#0x00 0709 C0 86 1752 push dps 070B 75 86 00 1753 mov dps,#0 1754 ;; clear interrupt 070E E5 91 1755 mov a,exif 0710 C2 E4 1756 clr acc.4 0712 F5 91 1757 mov exif,a 0714 90 7F A9 1758 mov dptr,#IN07IRQ 0717 74 10 1759 mov a,#0x10 0719 F0 1760 movx @dptr,a 1761 ;; handle interrupt 1762 ;; epilogue 071A D0 86 1763 pop dps 071C D0 D0 1764 pop psw 071E D0 83 1765 pop dph0 0720 D0 82 1766 pop dpl0 0722 D0 F0 1767 pop b 0724 D0 E0 1768 pop acc 0726 32 1769 reti 1770 0727 1771 usb_ep4out_isr: 0727 C0 E0 1772 push acc 0729 C0 F0 1773 push b 072B C0 82 1774 push dpl0 072D C0 83 1775 push dph0 072F C0 D0 1776 push psw 0731 75 D0 00 1777 mov psw,#0x00 0734 C0 86 1778 push dps 0736 75 86 00 1779 mov dps,#0 1780 ;; clear interrupt 0739 E5 91 1781 mov a,exif 073B C2 E4 1782 clr acc.4 073D F5 91 1783 mov exif,a 073F 90 7F AA 1784 mov dptr,#OUT07IRQ 0742 74 10 1785 mov a,#0x10 0744 F0 1786 movx @dptr,a 1787 ;; handle interrupt 1788 ;; epilogue 0745 D0 86 1789 pop dps 0747 D0 D0 1790 pop psw 0749 D0 83 1791 pop dph0 074B D0 82 1792 pop dpl0 074D D0 F0 1793 pop b 074F D0 E0 1794 pop acc 0751 32 1795 reti 1796 0752 1797 usb_ep5in_isr: 0752 C0 E0 1798 push acc 0754 C0 F0 1799 push b 0756 C0 82 1800 push dpl0 0758 C0 83 1801 push dph0 075A C0 D0 1802 push psw 075C 75 D0 00 1803 mov psw,#0x00 075F C0 86 1804 push dps 0761 75 86 00 1805 mov dps,#0 1806 ;; clear interrupt 0764 E5 91 1807 mov a,exif 0766 C2 E4 1808 clr acc.4 0768 F5 91 1809 mov exif,a 076A 90 7F A9 1810 mov dptr,#IN07IRQ 076D 74 20 1811 mov a,#0x20 076F F0 1812 movx @dptr,a 1813 ;; handle interrupt 1814 ;; epilogue 0770 D0 86 1815 pop dps 0772 D0 D0 1816 pop psw 0774 D0 83 1817 pop dph0 0776 D0 82 1818 pop dpl0 0778 D0 F0 1819 pop b 077A D0 E0 1820 pop acc 077C 32 1821 reti 1822 077D 1823 usb_ep5out_isr: 077D C0 E0 1824 push acc 077F C0 F0 1825 push b 0781 C0 82 1826 push dpl0 0783 C0 83 1827 push dph0 0785 C0 D0 1828 push psw 0787 75 D0 00 1829 mov psw,#0x00 078A C0 86 1830 push dps 078C 75 86 00 1831 mov dps,#0 1832 ;; clear interrupt 078F E5 91 1833 mov a,exif 0791 C2 E4 1834 clr acc.4 0793 F5 91 1835 mov exif,a 0795 90 7F AA 1836 mov dptr,#OUT07IRQ 0798 74 20 1837 mov a,#0x20 079A F0 1838 movx @dptr,a 1839 ;; handle interrupt 1840 ;; epilogue 079B D0 86 1841 pop dps 079D D0 D0 1842 pop psw 079F D0 83 1843 pop dph0 07A1 D0 82 1844 pop dpl0 07A3 D0 F0 1845 pop b 07A5 D0 E0 1846 pop acc 07A7 32 1847 reti 1848 07A8 1849 usb_ep6in_isr: 07A8 C0 E0 1850 push acc 07AA C0 F0 1851 push b 07AC C0 82 1852 push dpl0 07AE C0 83 1853 push dph0 07B0 C0 D0 1854 push psw 07B2 75 D0 00 1855 mov psw,#0x00 07B5 C0 86 1856 push dps 07B7 75 86 00 1857 mov dps,#0 1858 ;; clear interrupt 07BA E5 91 1859 mov a,exif 07BC C2 E4 1860 clr acc.4 07BE F5 91 1861 mov exif,a 07C0 90 7F A9 1862 mov dptr,#IN07IRQ 07C3 74 40 1863 mov a,#0x40 07C5 F0 1864 movx @dptr,a 1865 ;; handle interrupt 1866 ;; epilogue 07C6 D0 86 1867 pop dps 07C8 D0 D0 1868 pop psw 07CA D0 83 1869 pop dph0 07CC D0 82 1870 pop dpl0 07CE D0 F0 1871 pop b 07D0 D0 E0 1872 pop acc 07D2 32 1873 reti 1874 07D3 1875 usb_ep6out_isr: 07D3 C0 E0 1876 push acc 07D5 C0 F0 1877 push b 07D7 C0 82 1878 push dpl0 07D9 C0 83 1879 push dph0 07DB C0 D0 1880 push psw 07DD 75 D0 00 1881 mov psw,#0x00 07E0 C0 86 1882 push dps 07E2 75 86 00 1883 mov dps,#0 1884 ;; clear interrupt 07E5 E5 91 1885 mov a,exif 07E7 C2 E4 1886 clr acc.4 07E9 F5 91 1887 mov exif,a 07EB 90 7F AA 1888 mov dptr,#OUT07IRQ 07EE 74 40 1889 mov a,#0x40 07F0 F0 1890 movx @dptr,a 1891 ;; handle interrupt 1892 ;; epilogue 07F1 D0 86 1893 pop dps 07F3 D0 D0 1894 pop psw 07F5 D0 83 1895 pop dph0 07F7 D0 82 1896 pop dpl0 07F9 D0 F0 1897 pop b 07FB D0 E0 1898 pop acc 07FD 32 1899 reti 1900 07FE 1901 usb_ep7in_isr: 07FE C0 E0 1902 push acc 0800 C0 F0 1903 push b 0802 C0 82 1904 push dpl0 0804 C0 83 1905 push dph0 0806 C0 D0 1906 push psw 0808 75 D0 00 1907 mov psw,#0x00 080B C0 86 1908 push dps 080D 75 86 00 1909 mov dps,#0 1910 ;; clear interrupt 0810 E5 91 1911 mov a,exif 0812 C2 E4 1912 clr acc.4 0814 F5 91 1913 mov exif,a 0816 90 7F A9 1914 mov dptr,#IN07IRQ 0819 74 80 1915 mov a,#0x80 081B F0 1916 movx @dptr,a 1917 ;; handle interrupt 1918 ;; epilogue 081C D0 86 1919 pop dps 081E D0 D0 1920 pop psw 0820 D0 83 1921 pop dph0 0822 D0 82 1922 pop dpl0 0824 D0 F0 1923 pop b 0826 D0 E0 1924 pop acc 0828 32 1925 reti 1926 0829 1927 usb_ep7out_isr: 0829 C0 E0 1928 push acc 082B C0 F0 1929 push b 082D C0 82 1930 push dpl0 082F C0 83 1931 push dph0 0831 C0 D0 1932 push psw 0833 75 D0 00 1933 mov psw,#0x00 0836 C0 86 1934 push dps 0838 75 86 00 1935 mov dps,#0 1936 ;; clear interrupt 083B E5 91 1937 mov a,exif 083D C2 E4 1938 clr acc.4 083F F5 91 1939 mov exif,a 0841 90 7F AA 1940 mov dptr,#OUT07IRQ 0844 74 80 1941 mov a,#0x80 0846 F0 1942 movx @dptr,a 1943 ;; handle interrupt 1944 ;; epilogue 0847 D0 86 1945 pop dps 0849 D0 D0 1946 pop psw 084B D0 83 1947 pop dph0 084D D0 82 1948 pop dpl0 084F D0 F0 1949 pop b 0851 D0 E0 1950 pop acc 0853 32 1951 reti baycomusb-0.10.orig/firmware/dlfirmware/main.rst0100644000175100017510000026021307325134422020044 0ustar abaaba 1 .module main 2 3 ;; ENDPOINTS 4 ;; EP0 in/out Control 5 ;; COMMAND LIST 6 ;; C0 B4 read I2C eeprom 7 ;; 40 B4 write I2C eeprom 8 9 ;; define code segments link order 10 .area CODE (CODE) 11 .area CSEG (CODE) 12 .area GSINIT (CODE) 13 .area GSINIT2 (CODE) 14 15 ;; ----------------------------------------------------- 16 17 ;; special function registers (which are not predefined) 0082 18 dpl0 = 0x82 0083 19 dph0 = 0x83 0084 20 dpl1 = 0x84 0085 21 dph1 = 0x85 0086 22 dps = 0x86 008E 23 ckcon = 0x8E 008F 24 spc_fnc = 0x8F 0091 25 exif = 0x91 0092 26 mpage = 0x92 0098 27 scon0 = 0x98 0099 28 sbuf0 = 0x99 00C0 29 scon1 = 0xC0 00C1 30 sbuf1 = 0xC1 00D8 31 eicon = 0xD8 00E8 32 eie = 0xE8 00F8 33 eip = 0xF8 34 35 ;; anchor xdata registers 7F00 36 IN0BUF = 0x7F00 7EC0 37 OUT0BUF = 0x7EC0 7E80 38 IN1BUF = 0x7E80 7E40 39 OUT1BUF = 0x7E40 7E00 40 IN2BUF = 0x7E00 7DC0 41 OUT2BUF = 0x7DC0 7D80 42 IN3BUF = 0x7D80 7D40 43 OUT3BUF = 0x7D40 7D00 44 IN4BUF = 0x7D00 7CC0 45 OUT4BUF = 0x7CC0 7C80 46 IN5BUF = 0x7C80 7C40 47 OUT5BUF = 0x7C40 7C00 48 IN6BUF = 0x7C00 7BC0 49 OUT6BUF = 0x7BC0 7B80 50 IN7BUF = 0x7B80 7B40 51 OUT7BUF = 0x7B40 7FE8 52 SETUPBUF = 0x7FE8 7FE8 53 SETUPDAT = 0x7FE8 54 7FB4 55 EP0CS = 0x7FB4 7FB5 56 IN0BC = 0x7FB5 7FB6 57 IN1CS = 0x7FB6 7FB7 58 IN1BC = 0x7FB7 7FB8 59 IN2CS = 0x7FB8 7FB9 60 IN2BC = 0x7FB9 7FBA 61 IN3CS = 0x7FBA 7FBB 62 IN3BC = 0x7FBB 7FBC 63 IN4CS = 0x7FBC 7FBD 64 IN4BC = 0x7FBD 7FBE 65 IN5CS = 0x7FBE 7FBF 66 IN5BC = 0x7FBF 7FC0 67 IN6CS = 0x7FC0 7FC1 68 IN6BC = 0x7FC1 7FC2 69 IN7CS = 0x7FC2 7FC3 70 IN7BC = 0x7FC3 7FC5 71 OUT0BC = 0x7FC5 7FC6 72 OUT1CS = 0x7FC6 7FC7 73 OUT1BC = 0x7FC7 7FC8 74 OUT2CS = 0x7FC8 7FC9 75 OUT2BC = 0x7FC9 7FCA 76 OUT3CS = 0x7FCA 7FCB 77 OUT3BC = 0x7FCB 7FCC 78 OUT4CS = 0x7FCC 7FCD 79 OUT4BC = 0x7FCD 7FCE 80 OUT5CS = 0x7FCE 7FCF 81 OUT5BC = 0x7FCF 7FD0 82 OUT6CS = 0x7FD0 7FD1 83 OUT6BC = 0x7FD1 7FD2 84 OUT7CS = 0x7FD2 7FD3 85 OUT7BC = 0x7FD3 86 7FA8 87 IVEC = 0x7FA8 7FA9 88 IN07IRQ = 0x7FA9 7FAA 89 OUT07IRQ = 0x7FAA 7FAB 90 USBIRQ = 0x7FAB 7FAC 91 IN07IEN = 0x7FAC 7FAD 92 OUT07IEN = 0x7FAD 7FAE 93 USBIEN = 0x7FAE 7FAF 94 USBBAV = 0x7FAF 7FB2 95 BPADDRH = 0x7FB2 7FB3 96 BPADDRL = 0x7FB3 97 7FD4 98 SUDPTRH = 0x7FD4 7FD5 99 SUDPTRL = 0x7FD5 7FD6 100 USBCS = 0x7FD6 7FD7 101 TOGCTL = 0x7FD7 7FD8 102 USBFRAMEL = 0x7FD8 7FD9 103 USBFRAMEH = 0x7FD9 7FDB 104 FNADDR = 0x7FDB 7FDD 105 USBPAIR = 0x7FDD 7FDE 106 IN07VAL = 0x7FDE 7FDF 107 OUT07VAL = 0x7FDF 7FE3 108 AUTOPTRH = 0x7FE3 7FE4 109 AUTOPTRL = 0x7FE4 7FE5 110 AUTODATA = 0x7FE5 111 112 ;; isochronous endpoints. only available if ISODISAB=0 113 7F60 114 OUT8DATA = 0x7F60 7F61 115 OUT9DATA = 0x7F61 7F62 116 OUT10DATA = 0x7F62 7F63 117 OUT11DATA = 0x7F63 7F64 118 OUT12DATA = 0x7F64 7F65 119 OUT13DATA = 0x7F65 7F66 120 OUT14DATA = 0x7F66 7F67 121 OUT15DATA = 0x7F67 122 7F68 123 IN8DATA = 0x7F68 7F69 124 IN9DATA = 0x7F69 7F6A 125 IN10DATA = 0x7F6A 7F6B 126 IN11DATA = 0x7F6B 7F6C 127 IN12DATA = 0x7F6C 7F6D 128 IN13DATA = 0x7F6D 7F6E 129 IN14DATA = 0x7F6E 7F6F 130 IN15DATA = 0x7F6F 131 7F70 132 OUT8BCH = 0x7F70 7F71 133 OUT8BCL = 0x7F71 7F72 134 OUT9BCH = 0x7F72 7F73 135 OUT9BCL = 0x7F73 7F74 136 OUT10BCH = 0x7F74 7F75 137 OUT10BCL = 0x7F75 7F76 138 OUT11BCH = 0x7F76 7F77 139 OUT11BCL = 0x7F77 7F78 140 OUT12BCH = 0x7F78 7F79 141 OUT12BCL = 0x7F79 7F7A 142 OUT13BCH = 0x7F7A 7F7B 143 OUT13BCL = 0x7F7B 7F7C 144 OUT14BCH = 0x7F7C 7F7D 145 OUT14BCL = 0x7F7D 7F7E 146 OUT15BCH = 0x7F7E 7F7F 147 OUT15BCL = 0x7F7F 148 7FF0 149 OUT8ADDR = 0x7FF0 7FF1 150 OUT9ADDR = 0x7FF1 7FF2 151 OUT10ADDR = 0x7FF2 7FF3 152 OUT11ADDR = 0x7FF3 7FF4 153 OUT12ADDR = 0x7FF4 7FF5 154 OUT13ADDR = 0x7FF5 7FF6 155 OUT14ADDR = 0x7FF6 7FF7 156 OUT15ADDR = 0x7FF7 7FF8 157 IN8ADDR = 0x7FF8 7FF9 158 IN9ADDR = 0x7FF9 7FFA 159 IN10ADDR = 0x7FFA 7FFB 160 IN11ADDR = 0x7FFB 7FFC 161 IN12ADDR = 0x7FFC 7FFD 162 IN13ADDR = 0x7FFD 7FFE 163 IN14ADDR = 0x7FFE 7FFF 164 IN15ADDR = 0x7FFF 165 7FA0 166 ISOERR = 0x7FA0 7FA1 167 ISOCTL = 0x7FA1 7FA2 168 ZBCOUNT = 0x7FA2 7FE0 169 INISOVAL = 0x7FE0 7FE1 170 OUTISOVAL = 0x7FE1 7FE2 171 FASTXFR = 0x7FE2 172 173 ;; CPU control registers 174 7F92 175 CPUCS = 0x7F92 176 177 ;; IO port control registers 178 7F93 179 PORTACFG = 0x7F93 7F94 180 PORTBCFG = 0x7F94 7F95 181 PORTCCFG = 0x7F95 7F96 182 OUTA = 0x7F96 7F97 183 OUTB = 0x7F97 7F98 184 OUTC = 0x7F98 7F99 185 PINSA = 0x7F99 7F9A 186 PINSB = 0x7F9A 7F9B 187 PINSC = 0x7F9B 7F9C 188 OEA = 0x7F9C 7F9D 189 OEB = 0x7F9D 7F9E 190 OEC = 0x7F9E 191 192 ;; I2C controller registers 193 7FA5 194 I2CS = 0x7FA5 7FA6 195 I2DAT = 0x7FA6 196 197 ;; FPGA defines 0003 198 XC4K_IRLENGTH = 3 0000 199 XC4K_EXTEST = 0 0001 200 XC4K_PRELOAD = 1 0005 201 XC4K_CONFIGURE = 5 0007 202 XC4K_BYPASS = 7 203 2E64 204 FPGA_CONFIGSIZE = 11876 0158 205 FPGA_BOUND = 344 206 0000 207 SOFTWARECONFIG = 0 208 209 ;; ----------------------------------------------------- 210 211 .area CODE (CODE) 0000 02 09 AB 212 ljmp startup 0003 02 02 36 213 ljmp int0_isr 0006 214 .ds 5 000B 02 02 57 215 ljmp timer0_isr 000E 216 .ds 5 0013 02 02 87 217 ljmp int1_isr 0016 218 .ds 5 001B 02 02 A8 219 ljmp timer1_isr 001E 220 .ds 5 0023 02 02 C9 221 ljmp ser0_isr 0026 222 .ds 5 002B 02 02 EC 223 ljmp timer2_isr 002E 224 .ds 5 0033 02 03 0D 225 ljmp resume_isr 0036 226 .ds 5 003B 02 03 2E 227 ljmp ser1_isr 003E 228 .ds 5 0043 02 01 00 229 ljmp usb_isr 0046 230 .ds 5 004B 02 03 51 231 ljmp i2c_isr 004E 232 .ds 5 0053 02 03 76 233 ljmp int4_isr 0056 234 .ds 5 005B 02 03 9B 235 ljmp int5_isr 005E 236 .ds 5 0063 02 03 C0 237 ljmp int6_isr 0066 238 .ds 0x9a 239 0100 240 usb_isr: 0100 02 04 29 241 ljmp usb_sudav_isr 0103 242 .ds 1 0104 02 05 94 243 ljmp usb_sof_isr 0107 244 .ds 1 0108 02 05 BF 245 ljmp usb_sutok_isr 010B 246 .ds 1 010C 02 05 EA 247 ljmp usb_suspend_isr 010F 248 .ds 1 0110 02 06 15 249 ljmp usb_usbreset_isr 0113 250 .ds 1 0114 32 251 reti 0115 252 .ds 3 0118 02 06 40 253 ljmp usb_ep0in_isr 011B 254 .ds 1 011C 02 06 96 255 ljmp usb_ep0out_isr 011F 256 .ds 1 0120 02 07 4E 257 ljmp usb_ep1in_isr 0123 258 .ds 1 0124 02 07 7C 259 ljmp usb_ep1out_isr 0127 260 .ds 1 0128 02 07 A7 261 ljmp usb_ep2in_isr 012B 262 .ds 1 012C 02 07 D2 263 ljmp usb_ep2out_isr 012F 264 .ds 1 0130 02 07 FD 265 ljmp usb_ep3in_isr 0133 266 .ds 1 0134 02 08 28 267 ljmp usb_ep3out_isr 0137 268 .ds 1 0138 02 08 53 269 ljmp usb_ep4in_isr 013B 270 .ds 1 013C 02 08 7E 271 ljmp usb_ep4out_isr 013F 272 .ds 1 0140 02 08 A9 273 ljmp usb_ep5in_isr 0143 274 .ds 1 0144 02 08 D4 275 ljmp usb_ep5out_isr 0147 276 .ds 1 0148 02 08 FF 277 ljmp usb_ep6in_isr 014B 278 .ds 1 014C 02 09 2A 279 ljmp usb_ep6out_isr 014F 280 .ds 1 0150 02 09 55 281 ljmp usb_ep7in_isr 0153 282 .ds 1 0154 02 09 80 283 ljmp usb_ep7out_isr 284 285 ;; ----------------------------------------------------- 286 0020 287 RXCHUNKS = 32 0010 288 TXCHUNKS = 16 289 0000 290 DEBUGIOCOPY = 0 0000 291 DEBUGRECEIVER = 0 292 293 .area OSEG (OVR,DATA) 294 .area BSEG (BIT) 295 296 297 .area ISEG (DATA) 0080 298 txbcnt: .ds TXCHUNKS 0090 299 rxbcnt: .ds RXCHUNKS 00B0 300 stack: .ds 0x80-RXCHUNKS-TXCHUNKS 301 302 .area DSEG (DATA) 0040 303 errcode: .ds 1 0041 304 errval: .ds 1 0042 305 cfgcount: .ds 2 0044 306 leddiv: .ds 1 0045 307 irqcount: .ds 1 0046 308 ctrlcode: .ds 1 0047 309 ctrladdr: .ds 2 0049 310 ctrllen: .ds 2 311 312 .area XSEG (DATA) 313 314 315 .area GSINIT (CODE) 09AB 316 startup: 09AB 75 81 B0 317 mov sp,#stack ; -1 09AE E4 318 clr a 09AF F5 D0 319 mov psw,a 09B1 F5 86 320 mov dps,a 321 ;lcall __sdcc_external_startup 322 ;mov a,dpl0 323 ;jz __sdcc_init_data 324 ;ljmp __sdcc_program_startup 09B3 325 __sdcc_init_data: 326 327 .area GSINIT2 (CODE) 328 0002 329 ar2 = 0x02 0003 330 ar3 = 0x03 0004 331 ar4 = 0x04 0005 332 ar5 = 0x05 0006 333 ar6 = 0x06 0007 334 ar7 = 0x07 0000 335 ar0 = 0x00 0001 336 ar1 = 0x01 337 09B3 338 __sdcc_program_startup: 339 ;; assembler code startup 09B3 E4 340 clr a 09B4 F5 40 341 mov errcode,a 09B6 F5 41 342 mov errval,a 09B8 F5 42 343 mov cfgcount,a 09BA F5 43 344 mov cfgcount+1,a 09BC F5 45 345 mov irqcount,a 09BE F5 46 346 mov ctrlcode,a 347 ;; some indirect register setup 09C0 75 8E 31 348 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 349 ;; Timer setup: 350 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 351 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 09C3 75 89 21 352 mov tmod,#0x21 09C6 75 88 55 353 mov tcon,#0x55 ; INT0/INT1 edge 09C9 75 8D 64 354 mov th1,#256-156 ; 1200 bauds 09CC 75 87 00 355 mov pcon,#0 ; SMOD0=0 356 ;; give Windows a chance to finish the writecpucs control transfer 357 ;; 5ms delay loop 09CF 90 F4 48 358 mov dptr,#(-3000)&0xffff 09D2 A3 359 0$: inc dptr ; 3 cycles 09D3 E5 82 360 mov a,dpl0 ; 2 cycles 09D5 45 83 361 orl a,dph0 ; 2 cycles 09D7 70 F9 362 jnz 0$ ; 3 cycles 363 ;; init USB subsystem 09D9 90 7F A1 364 mov dptr,#ISOCTL 09DC 74 01 365 mov a,#1 ; disable ISO endpoints 09DE F0 366 movx @dptr,a 09DF 90 7F AF 367 mov dptr,#USBBAV 09E2 74 01 368 mov a,#1 ; enable autovector, disable breakpoint logic 09E4 F0 369 movx @dptr,a 09E5 E4 370 clr a 09E6 90 7F E0 371 mov dptr,#INISOVAL 09E9 F0 372 movx @dptr,a 09EA 90 7F E1 373 mov dptr,#OUTISOVAL 09ED F0 374 movx @dptr,a 09EE 90 7F DD 375 mov dptr,#USBPAIR 09F1 74 09 376 mov a,#0x9 ; pair EP 2&3 for input & output 09F3 F0 377 movx @dptr,a 09F4 90 7F DE 378 mov dptr,#IN07VAL 09F7 74 03 379 mov a,#0x3 ; enable EP0+EP1 09F9 F0 380 movx @dptr,a 09FA 90 7F DF 381 mov dptr,#OUT07VAL 09FD 74 05 382 mov a,#0x5 ; enable EP0+EP2 09FF F0 383 movx @dptr,a 384 ;; USB: init endpoint toggles 0A00 90 7F D7 385 mov dptr,#TOGCTL 0A03 74 12 386 mov a,#0x12 0A05 F0 387 movx @dptr,a 0A06 74 32 388 mov a,#0x32 ; clear EP 2 in toggle 0A08 F0 389 movx @dptr,a 0A09 74 02 390 mov a,#0x02 0A0B F0 391 movx @dptr,a 0A0C 74 22 392 mov a,#0x22 ; clear EP 2 out toggle 0A0E F0 393 movx @dptr,a 394 ;; configure IO ports 0A0F 90 7F 93 395 mov dptr,#PORTACFG 0A12 74 00 396 mov a,#0 0A14 F0 397 movx @dptr,a 0A15 90 7F 96 398 mov dptr,#OUTA 0A18 74 80 399 mov a,#0x80 ; set PROG lo 0A1A F0 400 movx @dptr,a 0A1B 90 7F 9C 401 mov dptr,#OEA 0A1E 74 C2 402 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0A20 F0 403 movx @dptr,a 0A21 90 7F 94 404 mov dptr,#PORTBCFG 0A24 74 00 405 mov a,#0 0A26 F0 406 movx @dptr,a 0A27 90 7F 9D 407 mov dptr,#OEB 0A2A 74 00 408 mov a,#0 0A2C F0 409 movx @dptr,a 0A2D 90 7F 95 410 mov dptr,#PORTCCFG 0A30 74 00 411 mov a,#0 0A32 F0 412 movx @dptr,a 0A33 90 7F 98 413 mov dptr,#OUTC 0A36 74 20 414 mov a,#0x20 0A38 F0 415 movx @dptr,a 0A39 90 7F 9E 416 mov dptr,#OEC 0A3C 74 2E 417 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 0A3E F0 418 movx @dptr,a 419 ;; enable interrupts 0A3F 75 A8 82 420 mov ie,#0x82 ; enable timer 0 int 0A42 75 E8 01 421 mov eie,#0x01 ; enable USB interrupts 0A45 90 7F AE 422 mov dptr,#USBIEN 0A48 74 01 423 mov a,#1 ; enable SUDAV interrupt 0A4A F0 424 movx @dptr,a 0A4B 90 7F AC 425 mov dptr,#IN07IEN 0A4E 74 03 426 mov a,#3 ; enable EP0+EP1 interrupt 0A50 F0 427 movx @dptr,a 0A51 90 7F AD 428 mov dptr,#OUT07IEN 0A54 74 01 429 mov a,#1 ; enable EP0 interrupt 0A56 F0 430 movx @dptr,a 431 ;; initialize UART 0 for config loading 0A57 75 98 20 432 mov scon0,#0x20 ; mode 0, CLK24/4 0A5A 75 99 FF 433 mov sbuf0,#0xff 434 ;; initialize EP1 IN (irq) 0A5D 12 07 2F 435 lcall fillusbintr 436 437 ;; some short delay 0A60 90 7F 96 438 mov dptr,#OUTA 0A63 74 82 439 mov a,#0x82 ; set PROG hi 0A65 F0 440 movx @dptr,a 0A66 90 7F 99 441 mov dptr,#PINSA 0A69 E0 442 movx a,@dptr 0A6A 30 E2 06 443 jnb acc.2,1$ 444 ;; DONE stuck high 0A6D 75 40 80 445 mov errcode,#0x80 0A70 02 0B 9C 446 ljmp fpgaerr 0A73 12 01 57 447 1$: lcall jtag_reset_tap 0A76 7A 05 448 mov r2,#5 0A78 7B 00 449 mov r3,#0 0A7A 7C 06 450 mov r4,#6 0A7C 12 01 5D 451 lcall jtag_shiftout ; enter SHIFT-IR state 0A7F 7A 08 452 mov r2,#8 0A81 7B 00 453 mov r3,#0 0A83 7C 00 454 mov r4,#0 0A85 12 01 5D 455 lcall jtag_shiftout ; assume max. 8bit IR 0A88 7A 08 456 mov r2,#8 0A8A 7B 01 457 mov r3,#1 0A8C 7C 00 458 mov r4,#0 0A8E 12 01 5D 459 lcall jtag_shift ; shift in a single bit 0A91 74 F8 460 mov a,#-(1<(-FPGA_CONFIGSIZE) 0B47 35 43 587 addc a,cfgcount+1 0B49 50 B7 588 jnc loadloop 589 ;; configuration download complete, start FPGA 0B4B 90 7F 94 590 mov dptr,#PORTBCFG 0B4E 74 00 591 mov a,#0 ; TDI no longer special function pin 0B50 F0 592 movx @dptr,a 0B51 90 7F 95 593 mov dptr,#PORTCCFG 0B54 74 00 594 mov a,#0 ; TCK no longer special function pin 0B56 F0 595 movx @dptr,a 596 ;; wait for done loop 0B57 7F FA 597 mov r7,#250 0B59 598 doneloop: 0B59 90 7F 99 599 mov dptr,#PINSA 0B5C E0 600 movx a,@dptr 0B5D 20 E2 1F 601 jb acc.2,doneactive 0B60 90 7F 9B 602 mov dptr,#PINSC 0B63 E0 603 movx a,@dptr 0B64 20 E2 06 604 jb acc.2,1$ 605 ;; INIT low 0B67 75 40 90 606 mov errcode,#0x90 0B6A 02 0B 9C 607 ljmp fpgaerr 0B6D 90 7F 98 608 1$: mov dptr,#OUTC 0B70 E0 609 movx a,@dptr 0B71 D2 E1 610 setb acc.1 0B73 F0 611 movx @dptr,a 0B74 C2 E1 612 clr acc.1 0B76 F0 613 movx @dptr,a 0B77 DF E0 614 djnz r7,doneloop 615 ;; DONE stuck low 0B79 75 40 91 616 mov errcode,#0x91 0B7C 02 0B 9C 617 ljmp fpgaerr 618 0B7F 619 doneactive: 620 ;; generate 16 clock pulses to start up FPGA 0B7F 7F 10 621 mov r7,#16 0B81 90 7F 98 622 mov dptr,#OUTC 0B84 E0 623 movx a,@dptr 0B85 D2 E1 624 0$: setb acc.1 0B87 F0 625 movx @dptr,a 0B88 C2 E1 626 clr acc.1 0B8A F0 627 movx @dptr,a 0B8B DF F8 628 djnz r7,0$ 0B8D 90 7F 95 629 mov dptr,#PORTCCFG 0B90 74 C0 630 mov a,#0xc0 ; RD/WR is special function pin 0B92 F0 631 movx @dptr,a 0B93 75 40 20 632 mov errcode,#0x20 633 0B96 90 C0 08 634 mov dptr,#0xc008 0B99 74 C7 635 mov a,#0xc7 0B9B F0 636 movx @dptr,a 637 0B9C 638 fpgaerr: 0B9C 80 FE 639 sjmp fpgaerr 640 641 .area CSEG (CODE) 0002 642 ar2 = 0x02 0003 643 ar3 = 0x03 0004 644 ar4 = 0x04 0005 645 ar5 = 0x05 0006 646 ar6 = 0x06 0007 647 ar7 = 0x07 0000 648 ar0 = 0x00 0001 649 ar1 = 0x01 650 651 ;; jtag_shift 652 ;; r2 = num 653 ;; r3 = tdi 654 ;; r4 = tms 655 ;; return: r7 = tdo 0157 656 jtag_reset_tap: 0157 7A 05 657 mov r2,#5 0159 7B 00 658 mov r3,#0 015B 7C FF 659 mov r4,#0xff 015D 660 jtag_shiftout: 015D 661 jtag_shift: 015D 7E 01 662 mov r6,#1 015F 7F 00 663 mov r7,#0 0161 74 02 664 1$: mov a,#2 0163 CB 665 xch a,r3 0164 13 666 rrc a 0165 CB 667 xch a,r3 0166 92 E6 668 mov acc.6,c 0168 CC 669 xch a,r4 0169 13 670 rrc a 016A CC 671 xch a,r4 016B 92 E7 672 mov acc.7,c 016D 90 7F 96 673 mov dptr,#OUTA 0170 F0 674 movx @dptr,a 0171 90 7F 9B 675 mov dptr,#PINSC 0174 E0 676 movx a,@dptr 0175 30 E0 03 677 jnb acc.0,2$ 0178 EE 678 mov a,r6 0179 42 07 679 orl ar7,a 017B 90 7F 98 680 2$: mov dptr,#OUTC 017E E0 681 movx a,@dptr 017F D2 E1 682 setb acc.1 0181 F0 683 movx @dptr,a 0182 C2 E1 684 clr acc.1 0184 F0 685 movx @dptr,a 0185 EE 686 mov a,r6 0186 23 687 rl a 0187 FE 688 mov r6,a 0188 DA D7 689 djnz r2,1$ 018A 22 690 ret 691 692 ;; EEPROM address where the serial number is located 693 018B 694 eepromstraddr: 018B 10 695 .db 0x10 696 697 ;; I2C Routines 698 ;; note: ckcon should be set to #0x31 to avoid chip bugs 699 018C 700 writei2c: 701 ;; dptr: data to be sent 702 ;; b: device address 703 ;; r7: transfer length 704 ;; return: a: status (bytes remaining, 0xff bus error) 018C 05 86 705 inc dps 018E 90 7F A5 706 mov dptr,#I2CS 0191 C2 F0 707 clr b.0 ; r/w = 0 0193 74 80 708 mov a,#0x80 ; start condition 0195 F0 709 movx @dptr,a 0196 90 7F A6 710 mov dptr,#I2DAT 0199 E5 F0 711 mov a,b 019B F0 712 movx @dptr,a 019C 90 7F A5 713 mov dptr,#I2CS 019F E0 714 0$: movx a,@dptr 01A0 20 E2 20 715 jb acc.2,3$ ; BERR 01A3 30 E0 F9 716 jnb acc.0,0$ ; DONE 01A6 30 E1 0F 717 jnb acc.1,1$ ; ACK 01A9 90 7F A6 718 mov dptr,#I2DAT 01AC 15 86 719 dec dps 01AE E0 720 movx a,@dptr 01AF A3 721 inc dptr 01B0 05 86 722 inc dps 01B2 F0 723 movx @dptr,a 01B3 90 7F A5 724 mov dptr,#I2CS 01B6 DF E7 725 djnz r7,0$ 01B8 74 40 726 1$: mov a,#0x40 ; stop condition 01BA F0 727 movx @dptr,a 01BB E0 728 2$: movx a,@dptr 01BC 20 E6 FC 729 jb acc.6,2$ 01BF 15 86 730 dec dps 01C1 EF 731 mov a,r7 01C2 22 732 ret 01C3 7F FF 733 3$: mov r7,#255 01C5 80 F1 734 sjmp 1$ 735 01C7 736 readi2c: 737 ;; dptr: data to be sent 738 ;; b: device address 739 ;; r7: transfer length 740 ;; return: a: status (bytes remaining, 0xff bus error) 01C7 05 86 741 inc dps 01C9 90 7F A5 742 mov dptr,#I2CS 01CC D2 F0 743 setb b.0 ; r/w = 1 01CE 74 80 744 mov a,#0x80 ; start condition 01D0 F0 745 movx @dptr,a 01D1 90 7F A6 746 mov dptr,#I2DAT 01D4 E5 F0 747 mov a,b 01D6 F0 748 movx @dptr,a 01D7 90 7F A5 749 mov dptr,#I2CS 01DA E0 750 0$: movx a,@dptr 01DB 20 E2 4C 751 jb acc.2,9$ ; BERR 01DE 30 E0 F9 752 jnb acc.0,0$ ; DONE 01E1 30 E1 03 753 jnb acc.1,5$ ; ACK 01E4 EF 754 mov a,r7 01E5 70 0B 755 jnz 1$ 01E7 74 40 756 5$: mov a,#0x40 ; stop condition 01E9 F0 757 movx @dptr,a 01EA E0 758 2$: movx a,@dptr 01EB 20 E6 FC 759 jb acc.6,2$ 01EE 15 86 760 dec dps 01F0 E4 761 clr a 01F1 22 762 ret 01F2 B4 01 03 763 1$: cjne a,#1,3$ 01F5 74 20 764 mov a,#0x20 ; LASTRD = 1 01F7 F0 765 movx @dptr,a 01F8 90 7F A6 766 3$: mov dptr,#I2DAT 01FB E0 767 movx a,@dptr ; initiate first read 01FC 90 7F A5 768 mov dptr,#I2CS 01FF E0 769 4$: movx a,@dptr 0200 20 E2 27 770 jb acc.2,9$ ; BERR 0203 30 E0 F9 771 jnb acc.0,4$ ; DONE 0206 EF 772 mov a,r7 0207 B4 02 03 773 cjne a,#2,6$ 020A 74 20 774 mov a,#0x20 ; LASTRD = 1 020C F0 775 movx @dptr,a 020D B4 01 03 776 6$: cjne a,#1,7$ 0210 74 40 777 mov a,#0x40 ; stop condition 0212 F0 778 movx @dptr,a 0213 90 7F A6 779 7$: mov dptr,#I2DAT 0216 E0 780 movx a,@dptr ; read data 0217 15 86 781 dec dps 0219 F0 782 movx @dptr,a 021A A3 783 inc dptr 021B 05 86 784 inc dps 021D 90 7F A5 785 mov dptr,#I2CS 0220 DF DD 786 djnz r7,4$ 0222 E0 787 8$: movx a,@dptr 0223 20 E6 FC 788 jb acc.6,8$ 0226 15 86 789 dec dps 0228 E4 790 clr a 0229 22 791 ret 022A 74 40 792 9$: mov a,#0x40 ; stop condition 022C F0 793 movx @dptr,a 022D E0 794 10$: movx a,@dptr 022E 20 E6 FC 795 jb acc.6,10$ 0231 74 FF 796 mov a,#255 0233 15 86 797 dec dps 0235 22 798 ret 799 800 ;; ------------------ interrupt handlers ------------------------ 801 0236 802 int0_isr: 0236 C0 E0 803 push acc 0238 C0 F0 804 push b 023A C0 82 805 push dpl0 023C C0 83 806 push dph0 023E C0 D0 807 push psw 0240 75 D0 00 808 mov psw,#0x00 0243 C0 86 809 push dps 0245 75 86 00 810 mov dps,#0 811 ;; clear interrupt 0248 C2 89 812 clr tcon+1 813 ;; handle interrupt 814 ;; epilogue 024A D0 86 815 pop dps 024C D0 D0 816 pop psw 024E D0 83 817 pop dph0 0250 D0 82 818 pop dpl0 0252 D0 F0 819 pop b 0254 D0 E0 820 pop acc 0256 32 821 reti 822 0257 823 timer0_isr: 0257 C0 E0 824 push acc 0259 C0 F0 825 push b 025B C0 82 826 push dpl0 025D C0 83 827 push dph0 025F C0 D0 828 push psw 0261 75 D0 00 829 mov psw,#0x00 0264 C0 86 830 push dps 0266 75 86 00 831 mov dps,#0 832 ;; clear interrupt 0269 C2 8D 833 clr tcon+5 834 ;; handle interrupt 026B 05 44 835 inc leddiv 026D E5 44 836 mov a,leddiv 026F 54 07 837 anl a,#7 0271 70 07 838 jnz 0$ 0273 90 7F 98 839 mov dptr,#OUTC 0276 E0 840 movx a,@dptr 0277 64 08 841 xrl a,#0x08 0279 F0 842 movx @dptr,a 027A 843 0$: 844 ;; epilogue 027A D0 86 845 pop dps 027C D0 D0 846 pop psw 027E D0 83 847 pop dph0 0280 D0 82 848 pop dpl0 0282 D0 F0 849 pop b 0284 D0 E0 850 pop acc 0286 32 851 reti 852 0287 853 int1_isr: 0287 C0 E0 854 push acc 0289 C0 F0 855 push b 028B C0 82 856 push dpl0 028D C0 83 857 push dph0 028F C0 D0 858 push psw 0291 75 D0 00 859 mov psw,#0x00 0294 C0 86 860 push dps 0296 75 86 00 861 mov dps,#0 862 ;; clear interrupt 0299 C2 8B 863 clr tcon+3 864 ;; handle interrupt 865 ;; epilogue 029B D0 86 866 pop dps 029D D0 D0 867 pop psw 029F D0 83 868 pop dph0 02A1 D0 82 869 pop dpl0 02A3 D0 F0 870 pop b 02A5 D0 E0 871 pop acc 02A7 32 872 reti 873 02A8 874 timer1_isr: 02A8 C0 E0 875 push acc 02AA C0 F0 876 push b 02AC C0 82 877 push dpl0 02AE C0 83 878 push dph0 02B0 C0 D0 879 push psw 02B2 75 D0 00 880 mov psw,#0x00 02B5 C0 86 881 push dps 02B7 75 86 00 882 mov dps,#0 883 ;; clear interrupt 02BA C2 8F 884 clr tcon+7 885 ;; handle interrupt 886 ;; epilogue 02BC D0 86 887 pop dps 02BE D0 D0 888 pop psw 02C0 D0 83 889 pop dph0 02C2 D0 82 890 pop dpl0 02C4 D0 F0 891 pop b 02C6 D0 E0 892 pop acc 02C8 32 893 reti 894 02C9 895 ser0_isr: 02C9 C0 E0 896 push acc 02CB C0 F0 897 push b 02CD C0 82 898 push dpl0 02CF C0 83 899 push dph0 02D1 C0 D0 900 push psw 02D3 75 D0 00 901 mov psw,#0x00 02D6 C0 86 902 push dps 02D8 75 86 00 903 mov dps,#0 904 ;; clear interrupt 02DB C2 98 905 clr scon0+0 02DD C2 99 906 clr scon0+1 907 ;; handle interrupt 908 ;; epilogue 02DF D0 86 909 pop dps 02E1 D0 D0 910 pop psw 02E3 D0 83 911 pop dph0 02E5 D0 82 912 pop dpl0 02E7 D0 F0 913 pop b 02E9 D0 E0 914 pop acc 02EB 32 915 reti 916 02EC 917 timer2_isr: 02EC C0 E0 918 push acc 02EE C0 F0 919 push b 02F0 C0 82 920 push dpl0 02F2 C0 83 921 push dph0 02F4 C0 D0 922 push psw 02F6 75 D0 00 923 mov psw,#0x00 02F9 C0 86 924 push dps 02FB 75 86 00 925 mov dps,#0 926 ;; clear interrupt 02FE C2 CF 927 clr t2con+7 928 ;; handle interrupt 929 ;; epilogue 0300 D0 86 930 pop dps 0302 D0 D0 931 pop psw 0304 D0 83 932 pop dph0 0306 D0 82 933 pop dpl0 0308 D0 F0 934 pop b 030A D0 E0 935 pop acc 030C 32 936 reti 937 030D 938 resume_isr: 030D C0 E0 939 push acc 030F C0 F0 940 push b 0311 C0 82 941 push dpl0 0313 C0 83 942 push dph0 0315 C0 D0 943 push psw 0317 75 D0 00 944 mov psw,#0x00 031A C0 86 945 push dps 031C 75 86 00 946 mov dps,#0 947 ;; clear interrupt 031F C2 DC 948 clr eicon+4 949 ;; handle interrupt 950 ;; epilogue 0321 D0 86 951 pop dps 0323 D0 D0 952 pop psw 0325 D0 83 953 pop dph0 0327 D0 82 954 pop dpl0 0329 D0 F0 955 pop b 032B D0 E0 956 pop acc 032D 32 957 reti 958 032E 959 ser1_isr: 032E C0 E0 960 push acc 0330 C0 F0 961 push b 0332 C0 82 962 push dpl0 0334 C0 83 963 push dph0 0336 C0 D0 964 push psw 0338 75 D0 00 965 mov psw,#0x00 033B C0 86 966 push dps 033D 75 86 00 967 mov dps,#0 968 ;; clear interrupt 0340 C2 C0 969 clr scon1+0 0342 C2 C1 970 clr scon1+1 971 ;; handle interrupt 972 ;; epilogue 0344 D0 86 973 pop dps 0346 D0 D0 974 pop psw 0348 D0 83 975 pop dph0 034A D0 82 976 pop dpl0 034C D0 F0 977 pop b 034E D0 E0 978 pop acc 0350 32 979 reti 980 0351 981 i2c_isr: 0351 C0 E0 982 push acc 0353 C0 F0 983 push b 0355 C0 82 984 push dpl0 0357 C0 83 985 push dph0 0359 C0 D0 986 push psw 035B 75 D0 00 987 mov psw,#0x00 035E C0 86 988 push dps 0360 75 86 00 989 mov dps,#0 990 ;; clear interrupt 0363 E5 91 991 mov a,exif 0365 C2 E5 992 clr acc.5 0367 F5 91 993 mov exif,a 994 ;; handle interrupt 995 ;; epilogue 0369 D0 86 996 pop dps 036B D0 D0 997 pop psw 036D D0 83 998 pop dph0 036F D0 82 999 pop dpl0 0371 D0 F0 1000 pop b 0373 D0 E0 1001 pop acc 0375 32 1002 reti 1003 0376 1004 int4_isr: 0376 C0 E0 1005 push acc 0378 C0 F0 1006 push b 037A C0 82 1007 push dpl0 037C C0 83 1008 push dph0 037E C0 D0 1009 push psw 0380 75 D0 00 1010 mov psw,#0x00 0383 C0 86 1011 push dps 0385 75 86 00 1012 mov dps,#0 1013 ;; clear interrupt 0388 E5 91 1014 mov a,exif 038A C2 E6 1015 clr acc.6 038C F5 91 1016 mov exif,a 1017 ;; handle interrupt 1018 ;; epilogue 038E D0 86 1019 pop dps 0390 D0 D0 1020 pop psw 0392 D0 83 1021 pop dph0 0394 D0 82 1022 pop dpl0 0396 D0 F0 1023 pop b 0398 D0 E0 1024 pop acc 039A 32 1025 reti 1026 039B 1027 int5_isr: 039B C0 E0 1028 push acc 039D C0 F0 1029 push b 039F C0 82 1030 push dpl0 03A1 C0 83 1031 push dph0 03A3 C0 D0 1032 push psw 03A5 75 D0 00 1033 mov psw,#0x00 03A8 C0 86 1034 push dps 03AA 75 86 00 1035 mov dps,#0 1036 ;; clear interrupt 03AD E5 91 1037 mov a,exif 03AF C2 E7 1038 clr acc.7 03B1 F5 91 1039 mov exif,a 1040 ;; handle interrupt 1041 ;; epilogue 03B3 D0 86 1042 pop dps 03B5 D0 D0 1043 pop psw 03B7 D0 83 1044 pop dph0 03B9 D0 82 1045 pop dpl0 03BB D0 F0 1046 pop b 03BD D0 E0 1047 pop acc 03BF 32 1048 reti 1049 03C0 1050 int6_isr: 03C0 C0 E0 1051 push acc 03C2 C0 F0 1052 push b 03C4 C0 82 1053 push dpl0 03C6 C0 83 1054 push dph0 03C8 C0 D0 1055 push psw 03CA 75 D0 00 1056 mov psw,#0x00 03CD C0 86 1057 push dps 03CF 75 86 00 1058 mov dps,#0 1059 ;; clear interrupt 03D2 C2 DB 1060 clr eicon+3 1061 ;; handle interrupt 1062 ;; epilogue 03D4 D0 86 1063 pop dps 03D6 D0 D0 1064 pop psw 03D8 D0 83 1065 pop dph0 03DA D0 82 1066 pop dpl0 03DC D0 F0 1067 pop b 03DE D0 E0 1068 pop acc 03E0 32 1069 reti 1070 03E1 1071 xmemread:: 03E1 E5 49 1072 mov a,ctrllen 03E3 FF 1073 mov r7,a 03E4 24 C0 1074 add a,#-64 03E6 F5 49 1075 mov ctrllen,a 03E8 E5 4A 1076 mov a,ctrllen+1 03EA 34 00 1077 addc a,#0 03EC 50 12 1078 jnc 0$ 03EE E4 1079 clr a 03EF F5 49 1080 mov ctrllen,a 03F1 F5 4A 1081 mov ctrllen+1,a 03F3 F5 46 1082 mov ctrlcode,a 03F5 74 02 1083 mov a,#2 ; ack control transfer 03F7 90 7F B4 1084 mov dptr,#EP0CS 03FA F0 1085 movx @dptr,a 03FB EF 1086 mov a,r7 03FC 60 25 1087 jz 2$ 03FE 80 04 1088 sjmp 1$ 0400 F5 4A 1089 0$: mov ctrllen+1,a 0402 7F 40 1090 mov r7,#64 0404 8F 00 1091 1$: mov ar0,r7 0406 85 47 82 1092 mov dpl0,ctrladdr 0409 85 48 83 1093 mov dph0,ctrladdr+1 040C 05 86 1094 inc dps 040E 90 7F 00 1095 mov dptr,#IN0BUF 0411 15 86 1096 dec dps 0413 E0 1097 3$: movx a,@dptr 0414 A3 1098 inc dptr 0415 05 86 1099 inc dps 0417 F0 1100 movx @dptr,a 0418 A3 1101 inc dptr 0419 15 86 1102 dec dps 041B D8 F6 1103 djnz r0,3$ 041D 85 82 47 1104 mov ctrladdr,dpl0 0420 85 83 48 1105 mov ctrladdr+1,dph0 0423 EF 1106 2$: mov a,r7 0424 90 7F B5 1107 mov dptr,#IN0BC 0427 F0 1108 movx @dptr,a 0428 22 1109 ret 1110 0429 1111 usb_sudav_isr: 0429 C0 E0 1112 push acc 042B C0 F0 1113 push b 042D C0 82 1114 push dpl0 042F C0 83 1115 push dph0 0431 C0 84 1116 push dpl1 0433 C0 85 1117 push dph1 0435 C0 D0 1118 push psw 0437 75 D0 00 1119 mov psw,#0x00 043A C0 86 1120 push dps 043C 75 86 00 1121 mov dps,#0 043F C0 00 1122 push ar0 0441 C0 07 1123 push ar7 1124 ;; clear interrupt 0443 E5 91 1125 mov a,exif 0445 C2 E4 1126 clr acc.4 0447 F5 91 1127 mov exif,a 0449 90 7F AB 1128 mov dptr,#USBIRQ 044C 74 01 1129 mov a,#0x01 044E F0 1130 movx @dptr,a 1131 ;; handle interrupt 044F 75 46 00 1132 mov ctrlcode,#0 ; reset control out code 0452 90 7F E9 1133 mov dptr,#SETUPDAT+1 0455 E0 1134 movx a,@dptr ; bRequest field 1135 ;; vendor specific commands 1136 ;; 0xa3 0456 B4 A3 3E 1137 cjne a,#0xa3,cmdnota3 0459 90 7F EA 1138 mov dptr,#SETUPDAT+2 045C E0 1139 movx a,@dptr 045D F5 47 1140 mov ctrladdr,a 045F A3 1141 inc dptr 0460 E0 1142 movx a,@dptr 0461 F5 48 1143 mov ctrladdr+1,a 0463 24 50 1144 add a,#80 0465 50 2D 1145 jnc setupstalla3 0467 90 7F EE 1146 mov dptr,#SETUPDAT+6 046A E0 1147 movx a,@dptr 046B F5 49 1148 mov ctrllen,a 046D 25 47 1149 add a,ctrladdr 046F A3 1150 inc dptr 0470 E0 1151 movx a,@dptr 0471 F5 4A 1152 mov ctrllen+1,a 0473 35 48 1153 addc a,ctrladdr+1 0475 40 1D 1154 jc setupstalla3 0477 90 7F E8 1155 mov dptr,#SETUPDAT ; bRequestType == 0x40 047A E0 1156 movx a,@dptr 047B B4 40 0A 1157 cjne a,#0x40,1$ 047E 75 46 01 1158 mov ctrlcode,#1 0481 90 7F C5 1159 mov dptr,#OUT0BC 0484 F0 1160 movx @dptr,a 0485 02 05 7F 1161 ljmp endusbisr 0488 B4 C0 09 1162 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 048B 75 46 02 1163 mov ctrlcode,#2 048E 12 03 E1 1164 lcall xmemread 0491 02 05 7F 1165 ljmp endusbisr 0494 1166 setupstalla3: 0494 02 05 75 1167 ljmp setupstall 0497 1168 cmdnota3: 1169 ;; 0xb1 0497 B4 B1 3E 1170 cjne a,#0xb1,cmdnotb1 049A 90 7F E8 1171 mov dptr,#SETUPDAT ; bRequestType == 0xc0 049D E0 1172 movx a,@dptr 049E B4 C0 34 1173 cjne a,#0xc0,setupstallb1 04A1 90 7F 00 1174 mov dptr,#IN0BUF 04A4 E5 40 1175 mov a,errcode 04A6 F0 1176 movx @dptr,a 04A7 A3 1177 inc dptr 04A8 E5 41 1178 mov a,errval 04AA F0 1179 movx @dptr,a 04AB A3 1180 inc dptr 04AC E5 81 1181 mov a,sp 1182 1183 ;;; xxxx 04AE C0 82 1184 push dpl0 04B0 C0 83 1185 push dph0 04B2 90 7F DF 1186 mov dptr,#OUT07VAL 04B5 E0 1187 movx a,@dptr 04B6 D0 83 1188 pop dph0 04B8 D0 82 1189 pop dpl0 1190 ;;; xxxx 1191 04BA F0 1192 movx @dptr,a 04BB A3 1193 inc dptr 04BC 74 00 1194 mov a,#0 1195 1196 ;;; xxxx 04BE C0 82 1197 push dpl0 04C0 C0 83 1198 push dph0 04C2 90 7F C8 1199 mov dptr,#OUT2CS 04C5 E0 1200 movx a,@dptr 04C6 D0 83 1201 pop dph0 04C8 D0 82 1202 pop dpl0 1203 ;;; xxxx 1204 04CA F0 1205 movx @dptr,a 04CB A3 1206 inc dptr 04CC 90 7F B5 1207 mov dptr,#IN0BC 04CF 74 04 1208 mov a,#4 04D1 F0 1209 movx @dptr,a 04D2 02 05 79 1210 ljmp setupack 04D5 1211 setupstallb1: 04D5 02 05 75 1212 ljmp setupstall 04D8 1213 cmdnotb1: 1214 ;; 0xb2 04D8 B4 B2 2B 1215 cjne a,#0xb2,cmdnotb2 04DB 90 7F E8 1216 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04DE E0 1217 movx a,@dptr 04DF B4 C0 21 1218 cjne a,#0xc0,setupstallb2 04E2 90 7F 00 1219 mov dptr,#IN0BUF 04E5 E5 40 1220 mov a,errcode 04E7 F0 1221 movx @dptr,a 04E8 A3 1222 inc dptr 04E9 E5 41 1223 mov a,errval 04EB F0 1224 movx @dptr,a 04EC A3 1225 inc dptr 04ED E5 42 1226 mov a,cfgcount 04EF F0 1227 movx @dptr,a 04F0 A3 1228 inc dptr 04F1 E5 43 1229 mov a,cfgcount+1 04F3 F0 1230 movx @dptr,a 04F4 A3 1231 inc dptr 04F5 E5 45 1232 mov a,irqcount 04F7 F0 1233 movx @dptr,a 04F8 90 7F B5 1234 mov dptr,#IN0BC 04FB 74 05 1235 mov a,#5 04FD F0 1236 movx @dptr,a 04FE 05 45 1237 inc irqcount 0500 02 05 79 1238 ljmp setupack 0503 1239 setupstallb2: 0503 02 05 75 1240 ljmp setupstall 0506 1241 cmdnotb2: 1242 ;; 0xb3 0506 B4 B3 2A 1243 cjne a,#0xb3,cmdnotb3 0509 90 7F E8 1244 mov dptr,#SETUPDAT ; bRequestType == 0xc0 050C E0 1245 movx a,@dptr 050D B4 C0 20 1246 cjne a,#0xc0,setupstallb3 1247 ;; read EEPROM 0006 1248 serstrlen = 6 0510 75 F0 A0 1249 mov b,#0xa0 ; EEPROM address 0513 90 01 8B 1250 mov dptr,#eepromstraddr 0516 7F 01 1251 mov r7,#1 0518 12 01 8C 1252 lcall writei2c 051B 70 13 1253 jnz setupstallb3 051D 90 7F 00 1254 mov dptr,#IN0BUF 0520 7F 06 1255 mov r7,#serstrlen 0522 12 01 C7 1256 lcall readi2c 0525 70 09 1257 jnz setupstallb3 0527 74 06 1258 mov a,#serstrlen 0529 90 7F B5 1259 mov dptr,#IN0BC 052C F0 1260 movx @dptr,a 052D 02 05 79 1261 ljmp setupack 0530 1262 setupstallb3: 0530 02 05 75 1263 ljmp setupstall 0533 1264 cmdnotb3: 1265 ;; 0xb4 0533 B4 B4 3F 1266 cjne a,#0xb4,cmdnotb4 0536 90 7F EF 1267 mov dptr,#SETUPDAT+7 0539 E0 1268 movx a,@dptr 053A 70 36 1269 jnz setupstallb4 053C 90 7F EE 1270 mov dptr,#SETUPDAT+6 053F E0 1271 movx a,@dptr 0540 F8 1272 mov r0,a 0541 FF 1273 mov r7,a 0542 24 C0 1274 add a,#-64 0544 40 2C 1275 jc setupstallb4 0546 90 7F EC 1276 mov dptr,#SETUPDAT+4 ; wIndex 0549 E0 1277 movx a,@dptr 054A F5 F0 1278 mov b,a 054C F5 47 1279 mov ctrladdr,a 054E 90 7F E8 1280 mov dptr,#SETUPDAT 0551 E0 1281 movx a,@dptr 0552 B4 40 0A 1282 cjne a,#0x40,0$ ; bRequestType == 0x40 0555 75 46 02 1283 mov ctrlcode,#2 0558 90 7F C5 1284 mov dptr,#OUT0BC 055B F0 1285 movx @dptr,a 055C 02 05 7F 1286 ljmp endusbisr 055F B4 C0 10 1287 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 0562 90 7F 00 1288 mov dptr,#IN0BUF 0565 12 01 C7 1289 lcall readi2c 0568 70 08 1290 jnz setupstallb4 056A E8 1291 mov a,r0 056B 90 7F B5 1292 mov dptr,#IN0BC 056E F0 1293 movx @dptr,a 056F 02 05 79 1294 ljmp setupack 0572 1295 setupstallb4: 0572 02 05 75 1296 ljmp setupstall 0575 1297 cmdnotb4: 1298 ;; unknown commands fall through to setupstall 1299 0575 1300 setupstall: 0575 74 03 1301 mov a,#3 0577 80 02 1302 sjmp endsetup 0579 1303 setupack: 0579 74 02 1304 mov a,#2 057B 1305 endsetup: 057B 90 7F B4 1306 mov dptr,#EP0CS 057E F0 1307 movx @dptr,a 057F 1308 endusbisr: 1309 ;; epilogue 057F D0 07 1310 pop ar7 0581 D0 00 1311 pop ar0 0583 D0 86 1312 pop dps 0585 D0 D0 1313 pop psw 0587 D0 85 1314 pop dph1 0589 D0 84 1315 pop dpl1 058B D0 83 1316 pop dph0 058D D0 82 1317 pop dpl0 058F D0 F0 1318 pop b 0591 D0 E0 1319 pop acc 0593 32 1320 reti 1321 0594 1322 usb_sof_isr: 0594 C0 E0 1323 push acc 0596 C0 F0 1324 push b 0598 C0 82 1325 push dpl0 059A C0 83 1326 push dph0 059C C0 D0 1327 push psw 059E 75 D0 00 1328 mov psw,#0x00 05A1 C0 86 1329 push dps 05A3 75 86 00 1330 mov dps,#0 1331 ;; clear interrupt 05A6 E5 91 1332 mov a,exif 05A8 C2 E4 1333 clr acc.4 05AA F5 91 1334 mov exif,a 05AC 90 7F AB 1335 mov dptr,#USBIRQ 05AF 74 02 1336 mov a,#0x02 05B1 F0 1337 movx @dptr,a 1338 ;; handle interrupt 1339 ;; epilogue 05B2 D0 86 1340 pop dps 05B4 D0 D0 1341 pop psw 05B6 D0 83 1342 pop dph0 05B8 D0 82 1343 pop dpl0 05BA D0 F0 1344 pop b 05BC D0 E0 1345 pop acc 05BE 32 1346 reti 1347 1348 05BF 1349 usb_sutok_isr: 05BF C0 E0 1350 push acc 05C1 C0 F0 1351 push b 05C3 C0 82 1352 push dpl0 05C5 C0 83 1353 push dph0 05C7 C0 D0 1354 push psw 05C9 75 D0 00 1355 mov psw,#0x00 05CC C0 86 1356 push dps 05CE 75 86 00 1357 mov dps,#0 1358 ;; clear interrupt 05D1 E5 91 1359 mov a,exif 05D3 C2 E4 1360 clr acc.4 05D5 F5 91 1361 mov exif,a 05D7 90 7F AB 1362 mov dptr,#USBIRQ 05DA 74 04 1363 mov a,#0x04 05DC F0 1364 movx @dptr,a 1365 ;; handle interrupt 1366 ;; epilogue 05DD D0 86 1367 pop dps 05DF D0 D0 1368 pop psw 05E1 D0 83 1369 pop dph0 05E3 D0 82 1370 pop dpl0 05E5 D0 F0 1371 pop b 05E7 D0 E0 1372 pop acc 05E9 32 1373 reti 1374 05EA 1375 usb_suspend_isr: 05EA C0 E0 1376 push acc 05EC C0 F0 1377 push b 05EE C0 82 1378 push dpl0 05F0 C0 83 1379 push dph0 05F2 C0 D0 1380 push psw 05F4 75 D0 00 1381 mov psw,#0x00 05F7 C0 86 1382 push dps 05F9 75 86 00 1383 mov dps,#0 1384 ;; clear interrupt 05FC E5 91 1385 mov a,exif 05FE C2 E4 1386 clr acc.4 0600 F5 91 1387 mov exif,a 0602 90 7F AB 1388 mov dptr,#USBIRQ 0605 74 08 1389 mov a,#0x08 0607 F0 1390 movx @dptr,a 1391 ;; handle interrupt 1392 ;; epilogue 0608 D0 86 1393 pop dps 060A D0 D0 1394 pop psw 060C D0 83 1395 pop dph0 060E D0 82 1396 pop dpl0 0610 D0 F0 1397 pop b 0612 D0 E0 1398 pop acc 0614 32 1399 reti 1400 0615 1401 usb_usbreset_isr: 0615 C0 E0 1402 push acc 0617 C0 F0 1403 push b 0619 C0 82 1404 push dpl0 061B C0 83 1405 push dph0 061D C0 D0 1406 push psw 061F 75 D0 00 1407 mov psw,#0x00 0622 C0 86 1408 push dps 0624 75 86 00 1409 mov dps,#0 1410 ;; clear interrupt 0627 E5 91 1411 mov a,exif 0629 C2 E4 1412 clr acc.4 062B F5 91 1413 mov exif,a 062D 90 7F AB 1414 mov dptr,#USBIRQ 0630 74 10 1415 mov a,#0x10 0632 F0 1416 movx @dptr,a 1417 ;; handle interrupt 1418 ;; epilogue 0633 D0 86 1419 pop dps 0635 D0 D0 1420 pop psw 0637 D0 83 1421 pop dph0 0639 D0 82 1422 pop dpl0 063B D0 F0 1423 pop b 063D D0 E0 1424 pop acc 063F 32 1425 reti 1426 0640 1427 usb_ep0in_isr: 0640 C0 E0 1428 push acc 0642 C0 F0 1429 push b 0644 C0 82 1430 push dpl0 0646 C0 83 1431 push dph0 0648 C0 84 1432 push dpl1 064A C0 85 1433 push dph1 064C C0 D0 1434 push psw 064E 75 D0 00 1435 mov psw,#0x00 0651 C0 86 1436 push dps 0653 75 86 00 1437 mov dps,#0 0656 C0 00 1438 push ar0 0658 C0 07 1439 push ar7 1440 ;; clear interrupt 065A E5 91 1441 mov a,exif 065C C2 E4 1442 clr acc.4 065E F5 91 1443 mov exif,a 0660 90 7F A9 1444 mov dptr,#IN07IRQ 0663 74 01 1445 mov a,#0x01 0665 F0 1446 movx @dptr,a 1447 ;; handle interrupt 0666 E5 46 1448 mov a,ctrlcode 0668 B4 02 05 1449 cjne a,#2,0$ 066B 12 03 E1 1450 lcall xmemread 066E 80 11 1451 sjmp ep0inendisr 0670 90 7F B5 1452 0$: mov dptr,#IN0BC 0673 E4 1453 clr a 0674 F0 1454 movx @dptr,a 0675 80 04 1455 sjmp ep0inack 1456 0677 1457 ep0install: 0677 74 03 1458 mov a,#3 0679 80 02 1459 sjmp ep0incs 067B 1460 ep0inack: 067B 74 02 1461 mov a,#2 067D 1462 ep0incs: 067D 90 7F B4 1463 mov dptr,#EP0CS 0680 F0 1464 movx @dptr,a 0681 1465 ep0inendisr: 1466 ;; epilogue 0681 D0 07 1467 pop ar7 0683 D0 00 1468 pop ar0 0685 D0 86 1469 pop dps 0687 D0 D0 1470 pop psw 0689 D0 85 1471 pop dph1 068B D0 84 1472 pop dpl1 068D D0 83 1473 pop dph0 068F D0 82 1474 pop dpl0 0691 D0 F0 1475 pop b 0693 D0 E0 1476 pop acc 0695 32 1477 reti 1478 0696 1479 usb_ep0out_isr: 0696 C0 E0 1480 push acc 0698 C0 F0 1481 push b 069A C0 82 1482 push dpl0 069C C0 83 1483 push dph0 069E C0 84 1484 push dpl1 06A0 C0 85 1485 push dph1 06A2 C0 D0 1486 push psw 06A4 75 D0 00 1487 mov psw,#0x00 06A7 C0 86 1488 push dps 06A9 75 86 00 1489 mov dps,#0 06AC C0 07 1490 push ar7 1491 ;; clear interrupt 06AE E5 91 1492 mov a,exif 06B0 C2 E4 1493 clr acc.4 06B2 F5 91 1494 mov exif,a 06B4 90 7F AA 1495 mov dptr,#OUT07IRQ 06B7 74 01 1496 mov a,#0x01 06B9 F0 1497 movx @dptr,a 1498 ;; handle interrupt 06BA E5 46 1499 mov a,ctrlcode ; check control code 06BC B4 01 36 1500 cjne a,#0x01,i2cwr 1501 ;; write to external memory 06BF 90 7F C5 1502 mov dptr,#OUT0BC 06C2 E0 1503 movx a,@dptr 06C3 60 28 1504 jz 0$ 06C5 FF 1505 mov r7,a 06C6 C3 1506 clr c 06C7 E5 49 1507 mov a,ctrllen 06C9 9F 1508 subb a,r7 06CA F5 49 1509 mov ctrllen,a 06CC E5 4A 1510 mov a,ctrllen+1 06CE 94 00 1511 subb a,#0 06D0 F5 4A 1512 mov ctrllen+1,a 06D2 40 38 1513 jc ep0outstall 06D4 90 7E C0 1514 mov dptr,#OUT0BUF 06D7 85 47 84 1515 mov dpl1,ctrladdr 06DA 85 48 85 1516 mov dph1,ctrladdr+1 06DD E0 1517 1$: movx a,@dptr 06DE A3 1518 inc dptr 06DF 05 86 1519 inc dps 06E1 F0 1520 movx @dptr,a 06E2 A3 1521 inc dptr 06E3 15 86 1522 dec dps 06E5 DF F6 1523 djnz r7,1$ 06E7 85 84 47 1524 mov ctrladdr,dpl1 06EA 85 85 48 1525 mov ctrladdr+1,dph1 06ED E5 49 1526 0$: mov a,ctrllen 06EF 45 4A 1527 orl a,ctrllen+1 06F1 60 20 1528 jz ep0outack 06F3 80 27 1529 sjmp ep0outendisr 1530 1531 ;; write I2C eeprom 06F5 B4 02 14 1532 i2cwr: cjne a,#0x02,ep0outstall 06F8 90 7F C5 1533 mov dptr,#OUT0BC 06FB E0 1534 movx a,@dptr 06FC 60 15 1535 jz ep0outack 06FE FF 1536 mov r7,a 06FF 85 47 F0 1537 mov b,ctrladdr 0702 90 7E C0 1538 mov dptr,#OUT0BUF 0705 12 01 8C 1539 lcall writei2c 0708 70 02 1540 jnz ep0outstall 070A 80 07 1541 sjmp ep0outack 1542 070C 1543 ep0outstall: 070C 75 46 00 1544 mov ctrlcode,#0 070F 74 03 1545 mov a,#3 0711 80 05 1546 sjmp ep0outcs 0713 1547 ep0outack: 0713 75 46 00 1548 mov ctrlcode,#0 0716 74 02 1549 mov a,#2 0718 1550 ep0outcs: 0718 90 7F B4 1551 mov dptr,#EP0CS 071B F0 1552 movx @dptr,a 071C 1553 ep0outendisr: 1554 ;; epilogue 071C D0 07 1555 pop ar7 071E D0 86 1556 pop dps 0720 D0 D0 1557 pop psw 0722 D0 85 1558 pop dph1 0724 D0 84 1559 pop dpl1 0726 D0 83 1560 pop dph0 0728 D0 82 1561 pop dpl0 072A D0 F0 1562 pop b 072C D0 E0 1563 pop acc 072E 32 1564 reti 1565 072F 1566 fillusbintr:: 072F 90 7E 80 1567 mov dptr,#IN1BUF 0732 E5 40 1568 mov a,errcode 0734 F0 1569 movx @dptr,a 0735 A3 1570 inc dptr 0736 E5 41 1571 mov a,errval 0738 F0 1572 movx @dptr,a 0739 A3 1573 inc dptr 073A E5 42 1574 mov a,cfgcount 073C F0 1575 movx @dptr,a 073D A3 1576 inc dptr 073E E5 43 1577 mov a,cfgcount+1 0740 F0 1578 movx @dptr,a 0741 A3 1579 inc dptr 0742 E5 45 1580 mov a,irqcount 0744 F0 1581 movx @dptr,a 0745 90 7F B7 1582 mov dptr,#IN1BC 0748 74 05 1583 mov a,#5 074A F0 1584 movx @dptr,a 074B 05 45 1585 inc irqcount 074D 22 1586 ret 1587 074E 1588 usb_ep1in_isr: 074E C0 E0 1589 push acc 0750 C0 F0 1590 push b 0752 C0 82 1591 push dpl0 0754 C0 83 1592 push dph0 0756 C0 D0 1593 push psw 0758 75 D0 00 1594 mov psw,#0x00 075B C0 86 1595 push dps 075D 75 86 00 1596 mov dps,#0 1597 ;; clear interrupt 0760 E5 91 1598 mov a,exif 0762 C2 E4 1599 clr acc.4 0764 F5 91 1600 mov exif,a 0766 90 7F A9 1601 mov dptr,#IN07IRQ 0769 74 02 1602 mov a,#0x02 076B F0 1603 movx @dptr,a 1604 ;; handle interrupt 076C 12 07 2F 1605 lcall fillusbintr 1606 ;; epilogue 076F D0 86 1607 pop dps 0771 D0 D0 1608 pop psw 0773 D0 83 1609 pop dph0 0775 D0 82 1610 pop dpl0 0777 D0 F0 1611 pop b 0779 D0 E0 1612 pop acc 077B 32 1613 reti 1614 077C 1615 usb_ep1out_isr: 077C C0 E0 1616 push acc 077E C0 F0 1617 push b 0780 C0 82 1618 push dpl0 0782 C0 83 1619 push dph0 0784 C0 D0 1620 push psw 0786 75 D0 00 1621 mov psw,#0x00 0789 C0 86 1622 push dps 078B 75 86 00 1623 mov dps,#0 1624 ;; clear interrupt 078E E5 91 1625 mov a,exif 0790 C2 E4 1626 clr acc.4 0792 F5 91 1627 mov exif,a 0794 90 7F AA 1628 mov dptr,#OUT07IRQ 0797 74 02 1629 mov a,#0x02 0799 F0 1630 movx @dptr,a 1631 ;; handle interrupt 1632 ;; epilogue 079A D0 86 1633 pop dps 079C D0 D0 1634 pop psw 079E D0 83 1635 pop dph0 07A0 D0 82 1636 pop dpl0 07A2 D0 F0 1637 pop b 07A4 D0 E0 1638 pop acc 07A6 32 1639 reti 1640 07A7 1641 usb_ep2in_isr: 07A7 C0 E0 1642 push acc 07A9 C0 F0 1643 push b 07AB C0 82 1644 push dpl0 07AD C0 83 1645 push dph0 07AF C0 D0 1646 push psw 07B1 75 D0 00 1647 mov psw,#0x00 07B4 C0 86 1648 push dps 07B6 75 86 00 1649 mov dps,#0 1650 ;; clear interrupt 07B9 E5 91 1651 mov a,exif 07BB C2 E4 1652 clr acc.4 07BD F5 91 1653 mov exif,a 07BF 90 7F A9 1654 mov dptr,#IN07IRQ 07C2 74 04 1655 mov a,#0x04 07C4 F0 1656 movx @dptr,a 1657 ;; handle interrupt 1658 ;; epilogue 07C5 D0 86 1659 pop dps 07C7 D0 D0 1660 pop psw 07C9 D0 83 1661 pop dph0 07CB D0 82 1662 pop dpl0 07CD D0 F0 1663 pop b 07CF D0 E0 1664 pop acc 07D1 32 1665 reti 1666 07D2 1667 usb_ep2out_isr: 07D2 C0 E0 1668 push acc 07D4 C0 F0 1669 push b 07D6 C0 82 1670 push dpl0 07D8 C0 83 1671 push dph0 07DA C0 D0 1672 push psw 07DC 75 D0 00 1673 mov psw,#0x00 07DF C0 86 1674 push dps 07E1 75 86 00 1675 mov dps,#0 1676 ;; clear interrupt 07E4 E5 91 1677 mov a,exif 07E6 C2 E4 1678 clr acc.4 07E8 F5 91 1679 mov exif,a 07EA 90 7F AA 1680 mov dptr,#OUT07IRQ 07ED 74 04 1681 mov a,#0x04 07EF F0 1682 movx @dptr,a 1683 ;; handle interrupt 1684 ;; epilogue 07F0 D0 86 1685 pop dps 07F2 D0 D0 1686 pop psw 07F4 D0 83 1687 pop dph0 07F6 D0 82 1688 pop dpl0 07F8 D0 F0 1689 pop b 07FA D0 E0 1690 pop acc 07FC 32 1691 reti 1692 07FD 1693 usb_ep3in_isr: 07FD C0 E0 1694 push acc 07FF C0 F0 1695 push b 0801 C0 82 1696 push dpl0 0803 C0 83 1697 push dph0 0805 C0 D0 1698 push psw 0807 75 D0 00 1699 mov psw,#0x00 080A C0 86 1700 push dps 080C 75 86 00 1701 mov dps,#0 1702 ;; clear interrupt 080F E5 91 1703 mov a,exif 0811 C2 E4 1704 clr acc.4 0813 F5 91 1705 mov exif,a 0815 90 7F A9 1706 mov dptr,#IN07IRQ 0818 74 08 1707 mov a,#0x08 081A F0 1708 movx @dptr,a 1709 ;; handle interrupt 1710 ;; epilogue 081B D0 86 1711 pop dps 081D D0 D0 1712 pop psw 081F D0 83 1713 pop dph0 0821 D0 82 1714 pop dpl0 0823 D0 F0 1715 pop b 0825 D0 E0 1716 pop acc 0827 32 1717 reti 1718 0828 1719 usb_ep3out_isr: 0828 C0 E0 1720 push acc 082A C0 F0 1721 push b 082C C0 82 1722 push dpl0 082E C0 83 1723 push dph0 0830 C0 D0 1724 push psw 0832 75 D0 00 1725 mov psw,#0x00 0835 C0 86 1726 push dps 0837 75 86 00 1727 mov dps,#0 1728 ;; clear interrupt 083A E5 91 1729 mov a,exif 083C C2 E4 1730 clr acc.4 083E F5 91 1731 mov exif,a 0840 90 7F AA 1732 mov dptr,#OUT07IRQ 0843 74 08 1733 mov a,#0x08 0845 F0 1734 movx @dptr,a 1735 ;; handle interrupt 1736 ;; epilogue 0846 D0 86 1737 pop dps 0848 D0 D0 1738 pop psw 084A D0 83 1739 pop dph0 084C D0 82 1740 pop dpl0 084E D0 F0 1741 pop b 0850 D0 E0 1742 pop acc 0852 32 1743 reti 1744 0853 1745 usb_ep4in_isr: 0853 C0 E0 1746 push acc 0855 C0 F0 1747 push b 0857 C0 82 1748 push dpl0 0859 C0 83 1749 push dph0 085B C0 D0 1750 push psw 085D 75 D0 00 1751 mov psw,#0x00 0860 C0 86 1752 push dps 0862 75 86 00 1753 mov dps,#0 1754 ;; clear interrupt 0865 E5 91 1755 mov a,exif 0867 C2 E4 1756 clr acc.4 0869 F5 91 1757 mov exif,a 086B 90 7F A9 1758 mov dptr,#IN07IRQ 086E 74 10 1759 mov a,#0x10 0870 F0 1760 movx @dptr,a 1761 ;; handle interrupt 1762 ;; epilogue 0871 D0 86 1763 pop dps 0873 D0 D0 1764 pop psw 0875 D0 83 1765 pop dph0 0877 D0 82 1766 pop dpl0 0879 D0 F0 1767 pop b 087B D0 E0 1768 pop acc 087D 32 1769 reti 1770 087E 1771 usb_ep4out_isr: 087E C0 E0 1772 push acc 0880 C0 F0 1773 push b 0882 C0 82 1774 push dpl0 0884 C0 83 1775 push dph0 0886 C0 D0 1776 push psw 0888 75 D0 00 1777 mov psw,#0x00 088B C0 86 1778 push dps 088D 75 86 00 1779 mov dps,#0 1780 ;; clear interrupt 0890 E5 91 1781 mov a,exif 0892 C2 E4 1782 clr acc.4 0894 F5 91 1783 mov exif,a 0896 90 7F AA 1784 mov dptr,#OUT07IRQ 0899 74 10 1785 mov a,#0x10 089B F0 1786 movx @dptr,a 1787 ;; handle interrupt 1788 ;; epilogue 089C D0 86 1789 pop dps 089E D0 D0 1790 pop psw 08A0 D0 83 1791 pop dph0 08A2 D0 82 1792 pop dpl0 08A4 D0 F0 1793 pop b 08A6 D0 E0 1794 pop acc 08A8 32 1795 reti 1796 08A9 1797 usb_ep5in_isr: 08A9 C0 E0 1798 push acc 08AB C0 F0 1799 push b 08AD C0 82 1800 push dpl0 08AF C0 83 1801 push dph0 08B1 C0 D0 1802 push psw 08B3 75 D0 00 1803 mov psw,#0x00 08B6 C0 86 1804 push dps 08B8 75 86 00 1805 mov dps,#0 1806 ;; clear interrupt 08BB E5 91 1807 mov a,exif 08BD C2 E4 1808 clr acc.4 08BF F5 91 1809 mov exif,a 08C1 90 7F A9 1810 mov dptr,#IN07IRQ 08C4 74 20 1811 mov a,#0x20 08C6 F0 1812 movx @dptr,a 1813 ;; handle interrupt 1814 ;; epilogue 08C7 D0 86 1815 pop dps 08C9 D0 D0 1816 pop psw 08CB D0 83 1817 pop dph0 08CD D0 82 1818 pop dpl0 08CF D0 F0 1819 pop b 08D1 D0 E0 1820 pop acc 08D3 32 1821 reti 1822 08D4 1823 usb_ep5out_isr: 08D4 C0 E0 1824 push acc 08D6 C0 F0 1825 push b 08D8 C0 82 1826 push dpl0 08DA C0 83 1827 push dph0 08DC C0 D0 1828 push psw 08DE 75 D0 00 1829 mov psw,#0x00 08E1 C0 86 1830 push dps 08E3 75 86 00 1831 mov dps,#0 1832 ;; clear interrupt 08E6 E5 91 1833 mov a,exif 08E8 C2 E4 1834 clr acc.4 08EA F5 91 1835 mov exif,a 08EC 90 7F AA 1836 mov dptr,#OUT07IRQ 08EF 74 20 1837 mov a,#0x20 08F1 F0 1838 movx @dptr,a 1839 ;; handle interrupt 1840 ;; epilogue 08F2 D0 86 1841 pop dps 08F4 D0 D0 1842 pop psw 08F6 D0 83 1843 pop dph0 08F8 D0 82 1844 pop dpl0 08FA D0 F0 1845 pop b 08FC D0 E0 1846 pop acc 08FE 32 1847 reti 1848 08FF 1849 usb_ep6in_isr: 08FF C0 E0 1850 push acc 0901 C0 F0 1851 push b 0903 C0 82 1852 push dpl0 0905 C0 83 1853 push dph0 0907 C0 D0 1854 push psw 0909 75 D0 00 1855 mov psw,#0x00 090C C0 86 1856 push dps 090E 75 86 00 1857 mov dps,#0 1858 ;; clear interrupt 0911 E5 91 1859 mov a,exif 0913 C2 E4 1860 clr acc.4 0915 F5 91 1861 mov exif,a 0917 90 7F A9 1862 mov dptr,#IN07IRQ 091A 74 40 1863 mov a,#0x40 091C F0 1864 movx @dptr,a 1865 ;; handle interrupt 1866 ;; epilogue 091D D0 86 1867 pop dps 091F D0 D0 1868 pop psw 0921 D0 83 1869 pop dph0 0923 D0 82 1870 pop dpl0 0925 D0 F0 1871 pop b 0927 D0 E0 1872 pop acc 0929 32 1873 reti 1874 092A 1875 usb_ep6out_isr: 092A C0 E0 1876 push acc 092C C0 F0 1877 push b 092E C0 82 1878 push dpl0 0930 C0 83 1879 push dph0 0932 C0 D0 1880 push psw 0934 75 D0 00 1881 mov psw,#0x00 0937 C0 86 1882 push dps 0939 75 86 00 1883 mov dps,#0 1884 ;; clear interrupt 093C E5 91 1885 mov a,exif 093E C2 E4 1886 clr acc.4 0940 F5 91 1887 mov exif,a 0942 90 7F AA 1888 mov dptr,#OUT07IRQ 0945 74 40 1889 mov a,#0x40 0947 F0 1890 movx @dptr,a 1891 ;; handle interrupt 1892 ;; epilogue 0948 D0 86 1893 pop dps 094A D0 D0 1894 pop psw 094C D0 83 1895 pop dph0 094E D0 82 1896 pop dpl0 0950 D0 F0 1897 pop b 0952 D0 E0 1898 pop acc 0954 32 1899 reti 1900 0955 1901 usb_ep7in_isr: 0955 C0 E0 1902 push acc 0957 C0 F0 1903 push b 0959 C0 82 1904 push dpl0 095B C0 83 1905 push dph0 095D C0 D0 1906 push psw 095F 75 D0 00 1907 mov psw,#0x00 0962 C0 86 1908 push dps 0964 75 86 00 1909 mov dps,#0 1910 ;; clear interrupt 0967 E5 91 1911 mov a,exif 0969 C2 E4 1912 clr acc.4 096B F5 91 1913 mov exif,a 096D 90 7F A9 1914 mov dptr,#IN07IRQ 0970 74 80 1915 mov a,#0x80 0972 F0 1916 movx @dptr,a 1917 ;; handle interrupt 1918 ;; epilogue 0973 D0 86 1919 pop dps 0975 D0 D0 1920 pop psw 0977 D0 83 1921 pop dph0 0979 D0 82 1922 pop dpl0 097B D0 F0 1923 pop b 097D D0 E0 1924 pop acc 097F 32 1925 reti 1926 0980 1927 usb_ep7out_isr: 0980 C0 E0 1928 push acc 0982 C0 F0 1929 push b 0984 C0 82 1930 push dpl0 0986 C0 83 1931 push dph0 0988 C0 D0 1932 push psw 098A 75 D0 00 1933 mov psw,#0x00 098D C0 86 1934 push dps 098F 75 86 00 1935 mov dps,#0 1936 ;; clear interrupt 0992 E5 91 1937 mov a,exif 0994 C2 E4 1938 clr acc.4 0996 F5 91 1939 mov exif,a 0998 90 7F AA 1940 mov dptr,#OUT07IRQ 099B 74 80 1941 mov a,#0x80 099D F0 1942 movx @dptr,a 1943 ;; handle interrupt 1944 ;; epilogue 099E D0 86 1945 pop dps 09A0 D0 D0 1946 pop psw 09A2 D0 83 1947 pop dph0 09A4 D0 82 1948 pop dpl0 09A6 D0 F0 1949 pop b 09A8 D0 E0 1950 pop acc 09AA 32 1951 reti baycomusb-0.10.orig/firmware/dlfirmware/main.map0100644000175100017510000000670307325134422020013 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 s_OSEG 0000 l_XSEG 0000 l__CODE 0000 s__CODE 0000 l_BSEG 0000 s_CODE 0000 s_BSEG 0000 l_OSEG 0008 l_GSINIT 000B l_DSEG 0040 s_DSEG 0080 l_ISEG 0080 s_ISEG 0157 l_CODE 0157 s_CSEG 01EB l_GSINIT2 0854 l_CSEG 09AB s_GSINIT 09B3 s_GSINIT2 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 0157 = 343. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 0157 0854 = 2132. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:03E1 xmemread 0C:072F fillusbintr Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT 09AB 0008 = 8. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT2 09B3 01EB = 491. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ OSEG 0000 0000 = 0. bytes (REL,OVR) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 0000 = 0. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0080 = 128. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 000B = 11. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 0000 = 0. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/dlfirmware/main.asm0100644000175100017510000006625307325134422020024 0ustar abaaba .module main ;; ENDPOINTS ;; EP0 in/out Control ;; COMMAND LIST ;; C0 B4 read I2C eeprom ;; 40 B4 write I2C eeprom ;; define code segments link order .area CODE (CODE) .area CSEG (CODE) .area GSINIT (CODE) .area GSINIT2 (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; FPGA defines XC4K_IRLENGTH = 3 XC4K_EXTEST = 0 XC4K_PRELOAD = 1 XC4K_CONFIGURE = 5 XC4K_BYPASS = 7 FPGA_CONFIGSIZE = 11876 FPGA_BOUND = 344 SOFTWARECONFIG = 0 ;; ----------------------------------------------------- .area CODE (CODE) ljmp startup ljmp int0_isr .ds 5 ljmp timer0_isr .ds 5 ljmp int1_isr .ds 5 ljmp timer1_isr .ds 5 ljmp ser0_isr .ds 5 ljmp timer2_isr .ds 5 ljmp resume_isr .ds 5 ljmp ser1_isr .ds 5 ljmp usb_isr .ds 5 ljmp i2c_isr .ds 5 ljmp int4_isr .ds 5 ljmp int5_isr .ds 5 ljmp int6_isr .ds 0x9a usb_isr: ljmp usb_sudav_isr .ds 1 ljmp usb_sof_isr .ds 1 ljmp usb_sutok_isr .ds 1 ljmp usb_suspend_isr .ds 1 ljmp usb_usbreset_isr .ds 1 reti .ds 3 ljmp usb_ep0in_isr .ds 1 ljmp usb_ep0out_isr .ds 1 ljmp usb_ep1in_isr .ds 1 ljmp usb_ep1out_isr .ds 1 ljmp usb_ep2in_isr .ds 1 ljmp usb_ep2out_isr .ds 1 ljmp usb_ep3in_isr .ds 1 ljmp usb_ep3out_isr .ds 1 ljmp usb_ep4in_isr .ds 1 ljmp usb_ep4out_isr .ds 1 ljmp usb_ep5in_isr .ds 1 ljmp usb_ep5out_isr .ds 1 ljmp usb_ep6in_isr .ds 1 ljmp usb_ep6out_isr .ds 1 ljmp usb_ep7in_isr .ds 1 ljmp usb_ep7out_isr ;; ----------------------------------------------------- RXCHUNKS = 32 TXCHUNKS = 16 DEBUGIOCOPY = 0 DEBUGRECEIVER = 0 .area OSEG (OVR,DATA) .area BSEG (BIT) .area ISEG (DATA) txbcnt: .ds TXCHUNKS rxbcnt: .ds RXCHUNKS stack: .ds 0x80-RXCHUNKS-TXCHUNKS .area DSEG (DATA) errcode: .ds 1 errval: .ds 1 cfgcount: .ds 2 leddiv: .ds 1 irqcount: .ds 1 ctrlcode: .ds 1 ctrladdr: .ds 2 ctrllen: .ds 2 .area XSEG (DATA) .area GSINIT (CODE) startup: mov sp,#stack ; -1 clr a mov psw,a mov dps,a ;lcall __sdcc_external_startup ;mov a,dpl0 ;jz __sdcc_init_data ;ljmp __sdcc_program_startup __sdcc_init_data: .area GSINIT2 (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 __sdcc_program_startup: ;; assembler code startup clr a mov errcode,a mov errval,a mov cfgcount,a mov cfgcount+1,a mov irqcount,a mov ctrlcode,a ;; some indirect register setup mov ckcon,#0x31 ; one external wait state, to avoid chip bugs ;; Timer setup: ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 mov tmod,#0x21 mov tcon,#0x55 ; INT0/INT1 edge mov th1,#256-156 ; 1200 bauds mov pcon,#0 ; SMOD0=0 ;; give Windows a chance to finish the writecpucs control transfer ;; 5ms delay loop mov dptr,#(-3000)&0xffff 0$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 0$ ; 3 cycles ;; init USB subsystem mov dptr,#ISOCTL mov a,#1 ; disable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a clr a mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR mov a,#0x9 ; pair EP 2&3 for input & output movx @dptr,a mov dptr,#IN07VAL mov a,#0x3 ; enable EP0+EP1 movx @dptr,a mov dptr,#OUT07VAL mov a,#0x5 ; enable EP0+EP2 movx @dptr,a ;; USB: init endpoint toggles mov dptr,#TOGCTL mov a,#0x12 movx @dptr,a mov a,#0x32 ; clear EP 2 in toggle movx @dptr,a mov a,#0x02 movx @dptr,a mov a,#0x22 ; clear EP 2 out toggle movx @dptr,a ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x80 ; set PROG lo movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0 movx @dptr,a mov dptr,#OUTC mov a,#0x20 movx @dptr,a mov dptr,#OEC mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO movx @dptr,a ;; enable interrupts mov ie,#0x82 ; enable timer 0 int mov eie,#0x01 ; enable USB interrupts mov dptr,#USBIEN mov a,#1 ; enable SUDAV interrupt movx @dptr,a mov dptr,#IN07IEN mov a,#3 ; enable EP0+EP1 interrupt movx @dptr,a mov dptr,#OUT07IEN mov a,#1 ; enable EP0 interrupt movx @dptr,a ;; initialize UART 0 for config loading mov scon0,#0x20 ; mode 0, CLK24/4 mov sbuf0,#0xff ;; initialize EP1 IN (irq) lcall fillusbintr ;; some short delay mov dptr,#OUTA mov a,#0x82 ; set PROG hi movx @dptr,a mov dptr,#PINSA movx a,@dptr jnb acc.2,1$ ;; DONE stuck high mov errcode,#0x80 ljmp fpgaerr 1$: lcall jtag_reset_tap mov r2,#5 mov r3,#0 mov r4,#6 lcall jtag_shiftout ; enter SHIFT-IR state mov r2,#8 mov r3,#0 mov r4,#0 lcall jtag_shiftout ; assume max. 8bit IR mov r2,#8 mov r3,#1 mov r4,#0 lcall jtag_shift ; shift in a single bit mov a,#-(1<(-FPGA_CONFIGSIZE) addc a,cfgcount+1 jnc loadloop ;; configuration download complete, start FPGA mov dptr,#PORTBCFG mov a,#0 ; TDI no longer special function pin movx @dptr,a mov dptr,#PORTCCFG mov a,#0 ; TCK no longer special function pin movx @dptr,a ;; wait for done loop mov r7,#250 doneloop: mov dptr,#PINSA movx a,@dptr jb acc.2,doneactive mov dptr,#PINSC movx a,@dptr jb acc.2,1$ ;; INIT low mov errcode,#0x90 ljmp fpgaerr 1$: mov dptr,#OUTC movx a,@dptr setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a djnz r7,doneloop ;; DONE stuck low mov errcode,#0x91 ljmp fpgaerr doneactive: ;; generate 16 clock pulses to start up FPGA mov r7,#16 mov dptr,#OUTC movx a,@dptr 0$: setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a djnz r7,0$ mov dptr,#PORTCCFG mov a,#0xc0 ; RD/WR is special function pin movx @dptr,a mov errcode,#0x20 mov dptr,#0xc008 mov a,#0xc7 movx @dptr,a fpgaerr: sjmp fpgaerr .area CSEG (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 ;; jtag_shift ;; r2 = num ;; r3 = tdi ;; r4 = tms ;; return: r7 = tdo jtag_reset_tap: mov r2,#5 mov r3,#0 mov r4,#0xff jtag_shiftout: jtag_shift: mov r6,#1 mov r7,#0 1$: mov a,#2 xch a,r3 rrc a xch a,r3 mov acc.6,c xch a,r4 rrc a xch a,r4 mov acc.7,c mov dptr,#OUTA movx @dptr,a mov dptr,#PINSC movx a,@dptr jnb acc.0,2$ mov a,r6 orl ar7,a 2$: mov dptr,#OUTC movx a,@dptr setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a mov a,r6 rl a mov r6,a djnz r2,1$ ret ;; EEPROM address where the serial number is located eepromstraddr: .db 0x10 ;; I2C Routines ;; note: ckcon should be set to #0x31 to avoid chip bugs writei2c: ;; dptr: data to be sent ;; b: device address ;; r7: transfer length ;; return: a: status (bytes remaining, 0xff bus error) inc dps mov dptr,#I2CS clr b.0 ; r/w = 0 mov a,#0x80 ; start condition movx @dptr,a mov dptr,#I2DAT mov a,b movx @dptr,a mov dptr,#I2CS 0$: movx a,@dptr jb acc.2,3$ ; BERR jnb acc.0,0$ ; DONE jnb acc.1,1$ ; ACK mov dptr,#I2DAT dec dps movx a,@dptr inc dptr inc dps movx @dptr,a mov dptr,#I2CS djnz r7,0$ 1$: mov a,#0x40 ; stop condition movx @dptr,a 2$: movx a,@dptr jb acc.6,2$ dec dps mov a,r7 ret 3$: mov r7,#255 sjmp 1$ readi2c: ;; dptr: data to be sent ;; b: device address ;; r7: transfer length ;; return: a: status (bytes remaining, 0xff bus error) inc dps mov dptr,#I2CS setb b.0 ; r/w = 1 mov a,#0x80 ; start condition movx @dptr,a mov dptr,#I2DAT mov a,b movx @dptr,a mov dptr,#I2CS 0$: movx a,@dptr jb acc.2,9$ ; BERR jnb acc.0,0$ ; DONE jnb acc.1,5$ ; ACK mov a,r7 jnz 1$ 5$: mov a,#0x40 ; stop condition movx @dptr,a 2$: movx a,@dptr jb acc.6,2$ dec dps clr a ret 1$: cjne a,#1,3$ mov a,#0x20 ; LASTRD = 1 movx @dptr,a 3$: mov dptr,#I2DAT movx a,@dptr ; initiate first read mov dptr,#I2CS 4$: movx a,@dptr jb acc.2,9$ ; BERR jnb acc.0,4$ ; DONE mov a,r7 cjne a,#2,6$ mov a,#0x20 ; LASTRD = 1 movx @dptr,a 6$: cjne a,#1,7$ mov a,#0x40 ; stop condition movx @dptr,a 7$: mov dptr,#I2DAT movx a,@dptr ; read data dec dps movx @dptr,a inc dptr inc dps mov dptr,#I2CS djnz r7,4$ 8$: movx a,@dptr jb acc.6,8$ dec dps clr a ret 9$: mov a,#0x40 ; stop condition movx @dptr,a 10$: movx a,@dptr jb acc.6,10$ mov a,#255 dec dps ret ;; ------------------ interrupt handlers ------------------------ int0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+5 ;; handle interrupt inc leddiv mov a,leddiv anl a,#7 jnz 0$ mov dptr,#OUTC movx a,@dptr xrl a,#0x08 movx @dptr,a 0$: ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon0+0 clr scon0+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer2_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr t2con+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti resume_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+4 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon1+0 clr scon1+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti i2c_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.5 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int4_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.6 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int5_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.7 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int6_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti xmemread:: mov a,ctrllen mov r7,a add a,#-64 mov ctrllen,a mov a,ctrllen+1 addc a,#0 jnc 0$ clr a mov ctrllen,a mov ctrllen+1,a mov ctrlcode,a mov a,#2 ; ack control transfer mov dptr,#EP0CS movx @dptr,a mov a,r7 jz 2$ sjmp 1$ 0$: mov ctrllen+1,a mov r7,#64 1$: mov ar0,r7 mov dpl0,ctrladdr mov dph0,ctrladdr+1 inc dps mov dptr,#IN0BUF dec dps 3$: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r0,3$ mov ctrladdr,dpl0 mov ctrladdr+1,dph0 2$: mov a,r7 mov dptr,#IN0BC movx @dptr,a ret usb_sudav_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov ctrlcode,#0 ; reset control out code mov dptr,#SETUPDAT+1 movx a,@dptr ; bRequest field ;; vendor specific commands ;; 0xa3 cjne a,#0xa3,cmdnota3 mov dptr,#SETUPDAT+2 movx a,@dptr mov ctrladdr,a inc dptr movx a,@dptr mov ctrladdr+1,a add a,#80 jnc setupstalla3 mov dptr,#SETUPDAT+6 movx a,@dptr mov ctrllen,a add a,ctrladdr inc dptr movx a,@dptr mov ctrllen+1,a addc a,ctrladdr+1 jc setupstalla3 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,1$ mov ctrlcode,#1 mov dptr,#OUT0BC movx @dptr,a ljmp endusbisr 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 mov ctrlcode,#2 lcall xmemread ljmp endusbisr setupstalla3: ljmp setupstall cmdnota3: ;; 0xb1 cjne a,#0xb1,cmdnotb1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb1 mov dptr,#IN0BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,sp ;;; xxxx push dpl0 push dph0 mov dptr,#OUT07VAL movx a,@dptr pop dph0 pop dpl0 ;;; xxxx movx @dptr,a inc dptr mov a,#0 ;;; xxxx push dpl0 push dph0 mov dptr,#OUT2CS movx a,@dptr pop dph0 pop dpl0 ;;; xxxx movx @dptr,a inc dptr mov dptr,#IN0BC mov a,#4 movx @dptr,a ljmp setupack setupstallb1: ljmp setupstall cmdnotb1: ;; 0xb2 cjne a,#0xb2,cmdnotb2 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb2 mov dptr,#IN0BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,cfgcount movx @dptr,a inc dptr mov a,cfgcount+1 movx @dptr,a inc dptr mov a,irqcount movx @dptr,a mov dptr,#IN0BC mov a,#5 movx @dptr,a inc irqcount ljmp setupack setupstallb2: ljmp setupstall cmdnotb2: ;; 0xb3 cjne a,#0xb3,cmdnotb3 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb3 ;; read EEPROM serstrlen = 6 mov b,#0xa0 ; EEPROM address mov dptr,#eepromstraddr mov r7,#1 lcall writei2c jnz setupstallb3 mov dptr,#IN0BUF mov r7,#serstrlen lcall readi2c jnz setupstallb3 mov a,#serstrlen mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallb3: ljmp setupstall cmdnotb3: ;; 0xb4 cjne a,#0xb4,cmdnotb4 mov dptr,#SETUPDAT+7 movx a,@dptr jnz setupstallb4 mov dptr,#SETUPDAT+6 movx a,@dptr mov r0,a mov r7,a add a,#-64 jc setupstallb4 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr mov b,a mov ctrladdr,a mov dptr,#SETUPDAT movx a,@dptr cjne a,#0x40,0$ ; bRequestType == 0x40 mov ctrlcode,#2 mov dptr,#OUT0BC movx @dptr,a ljmp endusbisr 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 mov dptr,#IN0BUF lcall readi2c jnz setupstallb4 mov a,r0 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallb4: ljmp setupstall cmdnotb4: ;; unknown commands fall through to setupstall setupstall: mov a,#3 sjmp endsetup setupack: mov a,#2 endsetup: mov dptr,#EP0CS movx @dptr,a endusbisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sof_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sutok_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_suspend_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_usbreset_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep0in_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov a,ctrlcode cjne a,#2,0$ lcall xmemread sjmp ep0inendisr 0$: mov dptr,#IN0BC clr a movx @dptr,a sjmp ep0inack ep0install: mov a,#3 sjmp ep0incs ep0inack: mov a,#2 ep0incs: mov dptr,#EP0CS movx @dptr,a ep0inendisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_ep0out_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov a,ctrlcode ; check control code cjne a,#0x01,i2cwr ;; write to external memory mov dptr,#OUT0BC movx a,@dptr jz 0$ mov r7,a clr c mov a,ctrllen subb a,r7 mov ctrllen,a mov a,ctrllen+1 subb a,#0 mov ctrllen+1,a jc ep0outstall mov dptr,#OUT0BUF mov dpl1,ctrladdr mov dph1,ctrladdr+1 1$: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r7,1$ mov ctrladdr,dpl1 mov ctrladdr+1,dph1 0$: mov a,ctrllen orl a,ctrllen+1 jz ep0outack sjmp ep0outendisr ;; write I2C eeprom i2cwr: cjne a,#0x02,ep0outstall mov dptr,#OUT0BC movx a,@dptr jz ep0outack mov r7,a mov b,ctrladdr mov dptr,#OUT0BUF lcall writei2c jnz ep0outstall sjmp ep0outack ep0outstall: mov ctrlcode,#0 mov a,#3 sjmp ep0outcs ep0outack: mov ctrlcode,#0 mov a,#2 ep0outcs: mov dptr,#EP0CS movx @dptr,a ep0outendisr: ;; epilogue pop ar7 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti fillusbintr:: mov dptr,#IN1BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,cfgcount movx @dptr,a inc dptr mov a,cfgcount+1 movx @dptr,a inc dptr mov a,irqcount movx @dptr,a mov dptr,#IN1BC mov a,#5 movx @dptr,a inc irqcount ret usb_ep1in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt lcall fillusbintr ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep1out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti baycomusb-0.10.orig/firmware/dlfirmware/main.lnk0100644000175100017510000000014707325134422020016 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/firmware/dl2firmware/0042755000175100017510000000000007340500003016436 5ustar abaababaycomusb-0.10.orig/firmware/dl2firmware/Makefile.in0100644000175100017510000001377607340500003020514 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/dl2firmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/dl2firmware/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 = firmware/dl2firmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/dl2firmware/main.rel: $(top_srcdir)/firmware/dl2firmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/dl2firmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/dl2firmware/main.ihx: $(top_srcdir)/firmware/dl2firmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/dl2firmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/dl2firmware/Makefile.am0100644000175100017510000000076307325134422020506 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/dl2firmware/main.rel: $(top_srcdir)/firmware/dl2firmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/dl2firmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/dl2firmware/main.ihx $(top_srcdir)/firmware/dl2firmware/main.ihx: $(top_srcdir)/firmware/dl2firmware/main.rel cd $(top_srcdir)/firmware/dl2firmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk baycomusb-0.10.orig/firmware/dl2firmware/main.ihx0100644000175100017510000002473007325134422020110 0ustar abaaba:06000000020BDF020236D4 :03000B0002025797 :030013000202875F :03001B000202A836 :030023000202C90D :03002B000202ECE2 :0300330002030DB8 :03003B0002032E8F :03004300020100B7 :03004B000203515C :030053000203762F :03005B0002039B02 :030063000203C0D5 :03010000020429CD :03010400020711DE :0301080002073CAF :03010C0002076780 :0301100002079251 :0101140032B8 :030118000207BD1E :03011C00020813C3 :030120000208CF03 :030124000208FDD1 :03012800020928A1 :03012C0002095372 :0301300002097E43 :030134000209A914 :030138000209D4E5 :03013C000209FFB6 :03014000020A2A86 :03014400020A5557 :03014800020A8028 :03014C00020AABF9 :03015000020AD6CA :03015400020B019A :080BDF00758180E4F5D0F58674 :060BE700E4F540F541F5C4 :040BED0042F543F595 :0C0BF10045F546F586F5A8758E3175892E :0E0BFD0021758855758D6475870090E890A36A :0D0C0B00E582458370F9907FA17401F0909F :0E0C18007FAF7401F0E4907FE0F0907FE1F098 :0D0C2600907FDD7409F0907FDE7407F09080 :0E0C33007FDF7405F0907FD77412F07432F0FA :0D0C41007402F07422F0907F937400F09024 :0E0C4E007F967480F0907F9C74C2F0907F942B :0E0C5C007400F0907F9D7400F0907F957400FE :0E0C6A00F0907F987420F0907F9E742EF075AD :0E0C7800A88275E801907FAE7401F0907FAC09 :0E0C86007403F0907FAD7401F075982075999D :0C0C9400FFE4F54BF54C907FD67406F0A1 :0E0CA0001208B0907F967482F0907F99E03039 :090CAE00E206754080020DDF1220 :0E0CB70001577A057B007C0612015D7A087BEE :0D0CC500007C0012015D7A087B017C0012AA :0B0CD200015D74F82F60087540818FF1 :0B0CDD0041020DDF7A057B057C0C1244 :0C0CE800015D907F9E742AF07540019021 :0D0CF4007F9BE030E2FC7A037BFF7C011265 :0E0D0100015D907F967442F0907F937440F0F5 :0D0D0F00907F957402F0754010907FC8E44D :050D1C00F0907FC9F01A :0E0D2100907FC9F0907FC8E020E1F9907FC973 :0E0D2F00E024FE50ED907DC0E0B4FFE6A3E0AE :080D3D00B404E1754011800BC4 :0B0D4500907FC9F0907FC8E020E1F92A :0C0D5000907FC9E060EFFF2542F542E40F :0C0D5C003543F543907DC0E08004E0309A :0E0D680099FDC299F599A3DFF5907F9BE020DD :0C0D7600E20C907FC87401F07540900200 :020D82000DDF83 :0B0D8400749C254274D1354350B79099 :0D0D8F007F947400F0907F957400F07FFA5F :0E0D9C00907F99E020E21F907F9BE020E2060E :0D0DAA00754090020DDF907F98E0D2E1F0DF :0B0DB700C2E1F0DFE0754091020DDFAB :0E0DC2007F10907F98E0D2E1F0C2E1F0DFF800 :0D0DD000907F9574C0F075402090C00874AD :020DDD00C7F05D :020DDF0080FE94 :060157007A057B007CFF2D :0E015D007E017F007402CB13CB92E6CC13CC54 :0E016B0092E7907F96F0907F9BE030E003EEED :0E0179004207907F98E0D2E1F0C2E1F0EE2361 :04018700FEDAD722A3 :01018B001063 :0E018C000586907FA5C2F07480F0907FA6E5F6 :0E019A00F0F0907FA5E020E22030E0F930E1A7 :0E01A8000F907FA61586E0A30586F0907FA538 :0E01B600DFE77440F0E020E6FC1586EF227FC4 :0301C400FF80F1C8 :0E01C7000586907FA5D2F07480F0907FA6E5AB :0E01D500F0F0907FA5E020E24C30E0F930E140 :0E01E30003EF700B7440F0E020E6FC1586E49C :0E01F10022B401037420F0907FA6E0907FA559 :0E01FF00E020E22730E0F9EFB402037420F0B4 :0E020D00B401037440F0907FA6E01586F0A3C4 :0E021B000586907FA5DFDDE020E6FC1586E479 :0D022900227440F0E020E6FC74FF158622F0 :0E023600C0E0C0F0C082C083C0D075D000C050 :0E02440086758600C289D086D0D0D083D08245 :05025200D0F0D0E03205 :0E025700C0E0C0F0C082C083C0D075D000C02F :0C02650086758600C28D0544E5445407F0 :090271007007907F98E06408F02A :0D027A00D086D0D0D083D082D0F0D0E0323A :0E028700C0E0C0F0C082C083C0D075D000C0FF :0E02950086758600C28BD086D0D0D083D082F2 :0502A300D0F0D0E032B4 :0E02A800C0E0C0F0C082C083C0D075D000C0DE :0E02B60086758600C28FD086D0D0D083D082CD :0502C400D0F0D0E03293 :0E02C900C0E0C0F0C082C083C0D075D000C0BD :0E02D70086758600C298C299D086D0D0D0839A :0702E500D082D0F0D0E0321E :0E02EC00C0E0C0F0C082C083C0D075D000C09A :0E02FA0086758600C2CFD086D0D0D083D08249 :05030800D0F0D0E0324E :0E030D00C0E0C0F0C082C083C0D075D000C078 :0E031B0086758600C2DCD086D0D0D083D0821A :05032900D0F0D0E0322D :0E032E00C0E0C0F0C082C083C0D075D000C057 :0E033C0086758600C2C0C2C1D086D0D0D083E4 :07034A00D082D0F0D0E032B8 :0E035100C0E0C0F0C082C083C0D075D000C034 :0E035F0086758600E591C2E5F591D086D0D076 :09036D00D083D082D0F0D0E03240 :0E037600C0E0C0F0C082C083C0D075D000C00F :0E03840086758600E591C2E6F591D086D0D050 :09039200D083D082D0F0D0E0321B :0E039B00C0E0C0F0C082C083C0D075D000C0EA :0E03A90086758600E591C2E7F591D086D0D02A :0903B700D083D082D0F0D0E032F6 :0E03C000C0E0C0F0C082C083C0D075D000C0C5 :0E03CE0086758600C2DBD086D0D0D083D08268 :0503DC00D0F0D0E0327A :0803E100E549FF24C0F549E5E0 :0903E9004A34005012E4F549F514 :0C03F2004AF5467402907FB4F0EF6025DD :0C03FE008004F54A7F408F00854782850F :0D040A0048830586907F001586E0A30586D7 :0C041700F0A31586D8F68582478583483F :06042300EF907FB5F0220E :0E042900C0E0C0F0C082C083C084C085C0D0D7 :0E04370075D000C086758600C000C007E59134 :0D044500C2E4F591907FAB7401F0754600A4 :0E045200907FE9E0B40659907FE8E0B4804F57 :0D046000907FEBE0B4010C907FD4740BF0A2 :06046D00A3742CF080399D :0D047300B40212907FEAE07033907FD474E1 :080480000BF0A3743EF0802490 :0E048800B40324907FEAE024FC401CE025E051 :0C0496002483F582E4340BF583E0F5F0DC :0A04A200A3E0907FD4F0A3E5F0F092 :0304AC000206F64F :0304AF000206F250 :0E04B200B40941907FE8E070F4907FEAE02406 :0604C000FE40ECE0F54BEC :0E04C600907FD77807E84410F04430F0E8F05B :0E04D4004420F0D8F2E4F07402907FB678076E :0E04E200F0A3A3D8FB907FC67807F0A3A3D8A1 :0604F000FB1208B080B60B :0D04F600B40B1A907FE8E0B401AFE54BB401 :0D05030001AA907FECE070A4907FEAE0F583 :030510004C80B369 :0D051300B40A20907FE8E0B48192E54BB47B :0A052000018D907FECE07087E54C40 :0C052A00907F00F0907FB57401F0804ECF :0D053600B4080B907FE8E0B48047E54B80EF :01054300E6D1 :0B0544007044907FE8E0B48011740167 :0E054F00907F00F0A3E4F0907FB57402F0807E :01055D002677 :06055E00B48103E480EB10 :0E056400B48220907FECE0907FC430E70390DB :0E0572007FB4540F600F20E30C25E02582F5C6 :0405800082E080CBCA :030584000206F676 :030587000206F277 :08058A00B4030575F0018006C1 :06059200B4013E75F0000B :0E059800907FE8E0B402E8A3A3E070E3A3E0E4 :0E05A60070DFA3E0907FC430E705907FB4447F :0E05B4001020E3CF541F0586907FD7F044201F :0E05C200F0540FF0158625E02582F582E5F055 :0305D000F080B107 :0C05D300B4A33E907FEAE0F547A3E0F5FA :0C05DF00482450502D907FEEE0F5492597 :0605EB0047A3E0F54A35CC :0C05F10048401D907FE8E0B4400A7546C9 :0D05FD0001907FC5F00206FCB4C0097546F0 :07060A00021203E10206FCED :030611000206F2EC :0E061400B4B13E907FE8E0B4C034907F00E5C2 :0C06220040F0A3E541F0A3E581C082C0D8 :0E062E0083907FDFE0D083D082F0A37400C001 :0E063C0082C083907FC8E0D083D082F0A3906C :08064A007FB57404F00206F60E :030652000206F2AB :0E065500B4B22B907FE8E0B4C021907F00E5A6 :0806630040F0A3E541F0A3E51E :08066B0042F0A3E543F0A3E512 :0B06730045F0907FB57405F0054502CE :02067E0006F67E :030680000206F27D :0E068300B4B32A907FE8E0B4C02075F0A090D8 :0E069100018B7F0112018C7013907F007F0699 :0E069F001201C770097406907FB5F00206F6CE :0306AD000206F250 :0E06B000B4B43F907FEFE07036907FEEE0F83C :0D06BE00FF24C0402C907FECE0F5F0F547E4 :0D06CB00907FE8E0B4400A754602907FC5BC :0E06D800F00206FCB4C010907F001201C77043 :0906E60008E8907FB5F00206F669 :0306EF000206F20E :0406F200740380020B :0206F60074028C :0406F800907FB4F04B :0E06FC00D007D000D086D0D0D085D084D08357 :07070A00D082D0F0D0E032F4 :0E071100C0E0C0F0C082C083C0D075D000C070 :0E071F0086758600E591C2E4F591907FAB747B :0E072D0002F0D086D0D0D083D082D0F0D0E0C1 :01073B00328B :0E073C00C0E0C0F0C082C083C0D075D000C045 :0E074A0086758600E591C2E4F591907FAB7450 :0E07580004F0D086D0D0D083D082D0F0D0E094 :010766003260 :0E076700C0E0C0F0C082C083C0D075D000C01A :0E07750086758600E591C2E4F591907FAB7425 :0E07830008F0D086D0D0D083D082D0F0D0E065 :010791003235 :0E079200C0E0C0F0C082C083C0D075D000C0EF :0E07A00086758600E591C2E4F591907FAB74FA :0E07AE0010F0D086D0D0D083D082D0F0D0E032 :0107BC00320A :0E07BD00C0E0C0F0C082C083C084C085C0D040 :0E07CB0075D000C086758600C000C007E5919D :0D07D900C2E4F591907FA97401F0E546B4EB :0E07E60002051203E18011907FB5E4F080045B :0407F4007403800208 :0207F800740289 :0407FA00907FB4F048 :0E07FE00D007D000D086D0D0D085D084D08354 :07080C00D082D0F0D0E032F1 :0E081300C0E0C0F0C082C083C084C085C0D0E9 :0E08210075D000C086758600C000C006E59147 :0D082F00C2E4F591907FAA7401F0E546B493 :0D083C000136907FC5E06028FFC3E5499FAD :07084900F549E54A9400F5B2 :0A0850004A4038907EC08547848539 :0D085A004885E0A30586F0A31586DFF6852E :060867008447858548E589 :0B086D0049454A60208027B402149027 :0D0878007FC5E06015FF8547F0907EC0123F :06088500018C70028007E7 :07088B0075460074038005AF :05089200754600740230 :04089700907FB4F0AA :0E089B00D006D000D086D0D0D085D084D083B7 :0708A900D082D0F0D0E03254 :0C08B000907E80E540F0A3E541F0A3E558 :0808BC0042F0A3E543F0A3E5BF :0B08C40045F0907FB77405F005452259 :0E08CF00C0E0C0F0C082C083C0D075D000C0B1 :0E08DD0086758600E591C2E4F591907FA974BE :0E08EB0002F01208B0D086D0D0D083D082D0D8 :0408F900F0D0E03229 :0E08FD00C0E0C0F0C082C083C0D075D000C083 :0E090B0086758600E591C2E4F591907FAA748E :0E09190002F0D086D0D0D083D082D0F0D0E0D3 :01092700329D :0E092800C0E0C0F0C082C083C0D075D000C057 :0E09360086758600E591C2E4F591907FA97464 :0E09440004F0D086D0D0D083D082D0F0D0E0A6 :010952003272 :0E095300C0E0C0F0C082C083C0D075D000C02C :0E09610086758600E591C2E4F591907FAA7438 :0E096F0004F0D086D0D0D083D082D0F0D0E07B :01097D003247 :0E097E00C0E0C0F0C082C083C0D075D000C001 :0E098C0086758600E591C2E4F591907FA9740E :0E099A0008F0D086D0D0D083D082D0F0D0E04C :0109A800321C :0E09A900C0E0C0F0C082C083C0D075D000C0D6 :0E09B70086758600E591C2E4F591907FAA74E2 :0E09C50008F0D086D0D0D083D082D0F0D0E021 :0109D30032F1 :0E09D400C0E0C0F0C082C083C0D075D000C0AB :0E09E20086758600E591C2E4F591907FA974B8 :0E09F00010F0D086D0D0D083D082D0F0D0E0EE :0109FE0032C6 :0E09FF00C0E0C0F0C082C083C0D075D000C080 :0E0A0D0086758600E591C2E4F591907FAA748B :0E0A1B0010F0D086D0D0D083D082D0F0D0E0C2 :010A2900329A :0E0A2A00C0E0C0F0C082C083C0D075D000C054 :0E0A380086758600E591C2E4F591907FA97461 :0E0A460020F0D086D0D0D083D082D0F0D0E087 :010A5400326F :0E0A5500C0E0C0F0C082C083C0D075D000C029 :0E0A630086758600E591C2E4F591907FAA7435 :0E0A710020F0D086D0D0D083D082D0F0D0E05C :010A7F003244 :0E0A8000C0E0C0F0C082C083C0D075D000C0FE :0E0A8E0086758600E591C2E4F591907FA9740B :0E0A9C0040F0D086D0D0D083D082D0F0D0E011 :010AAA003219 :0E0AAB00C0E0C0F0C082C083C0D075D000C0D3 :0E0AB90086758600E591C2E4F591907FAA74DF :0E0AC70040F0D086D0D0D083D082D0F0D0E0E6 :010AD50032EE :0E0AD600C0E0C0F0C082C083C0D075D000C0A8 :0E0AE40086758600E591C2E4F591907FA974B5 :0E0AF20080F0D086D0D0D083D082D0F0D0E07B :010B000032C2 :0E0B0100C0E0C0F0C082C083C0D075D000C07C :0E0B0F0086758600E591C2E4F591907FAA7488 :0E0B1D0080F0D086D0D0D083D082D0F0D0E04F :010B2B003297 :0E0B2C0012010001FF00FF40C0BA3561020057 :040B3A0001020301B0 :0E0B3E00090245000101004000090400000307 :0E0B4C00FF00FF000705810240000007058240 :0E0B5A000240000007050202400000090400EE :0E0B68000103FF00FF000705810340000A079C :0D0B76000582024000000705020240000059 :020B83008B0BDA :020B85008F0BD4 :020B87009D0BC4 :020B8900BD0BA2 :040B8B00040300005F :0E0B8F000E0342006100790063006F006D00EC :0E0B9D00200355005300420046004C00450066 :0E0BAB0058002000280062006C0061006E00FF :040BB9006B002900A4 :0E0BBD00020300000000000000000000000025 :0E0BCB0000000000000000000000000000001C :060BD90000000000000016 :00000001FF baycomusb-0.10.orig/firmware/dl2firmware/main.rel0100644000175100017510000005534407325134422020107 0ustar abaabaXH H 9 areas 2 global symbols M main A _CODE size 0 flags 0 A CODE size 157 flags 20 A CSEG size A88 flags 20 S xmemread Def028A S fillusbintr Def0759 A GSINIT size 8 flags 20 A GSINIT2 size 1FA flags 20 A BSEG size 0 flags 80 A ISEG size 80 flags 0 A DSEG size D flags 0 A XSEG size 0 flags 0 T 00 00 02 00 00 02 00 DF R 00 00 00 01 00 03 00 03 00 06 00 02 T 00 06 R 00 00 00 01 T 00 0B 02 01 00 R 00 00 00 01 00 03 00 02 T 00 0E R 00 00 00 01 T 00 13 02 01 30 R 00 00 00 01 00 03 00 02 T 00 16 R 00 00 00 01 T 00 1B 02 01 51 R 00 00 00 01 00 03 00 02 T 00 1E R 00 00 00 01 T 00 23 02 01 72 R 00 00 00 01 00 03 00 02 T 00 26 R 00 00 00 01 T 00 2B 02 01 95 R 00 00 00 01 00 03 00 02 T 00 2E R 00 00 00 01 T 00 33 02 01 B6 R 00 00 00 01 00 03 00 02 T 00 36 R 00 00 00 01 T 00 3B 02 01 D7 R 00 00 00 01 00 03 00 02 T 00 3E R 00 00 00 01 T 00 43 02 01 00 R 00 00 00 01 00 03 00 01 T 00 46 R 00 00 00 01 T 00 4B 02 01 FA R 00 00 00 01 00 03 00 02 T 00 4E R 00 00 00 01 T 00 53 02 02 1F R 00 00 00 01 00 03 00 02 T 00 56 R 00 00 00 01 T 00 5B 02 02 44 R 00 00 00 01 00 03 00 02 T 00 5E R 00 00 00 01 T 00 63 02 02 69 R 00 00 00 01 00 03 00 02 T 00 66 R 00 00 00 01 T 01 00 R 00 00 00 01 T 01 00 02 02 D2 R 00 00 00 01 00 03 00 02 T 01 03 R 00 00 00 01 T 01 04 02 05 BA R 00 00 00 01 00 03 00 02 T 01 07 R 00 00 00 01 T 01 08 02 05 E5 R 00 00 00 01 00 03 00 02 T 01 0B R 00 00 00 01 T 01 0C 02 06 10 R 00 00 00 01 00 03 00 02 T 01 0F R 00 00 00 01 T 01 10 02 06 3B R 00 00 00 01 00 03 00 02 T 01 13 R 00 00 00 01 T 01 14 32 R 00 00 00 01 T 01 15 R 00 00 00 01 T 01 18 02 06 66 R 00 00 00 01 00 03 00 02 T 01 1B R 00 00 00 01 T 01 1C 02 06 BC R 00 00 00 01 00 03 00 02 T 01 1F R 00 00 00 01 T 01 20 02 07 78 R 00 00 00 01 00 03 00 02 T 01 23 R 00 00 00 01 T 01 24 02 07 A6 R 00 00 00 01 00 03 00 02 T 01 27 R 00 00 00 01 T 01 28 02 07 D1 R 00 00 00 01 00 03 00 02 T 01 2B R 00 00 00 01 T 01 2C 02 07 FC R 00 00 00 01 00 03 00 02 T 01 2F R 00 00 00 01 T 01 30 02 08 27 R 00 00 00 01 00 03 00 02 T 01 33 R 00 00 00 01 T 01 34 02 08 52 R 00 00 00 01 00 03 00 02 T 01 37 R 00 00 00 01 T 01 38 02 08 7D R 00 00 00 01 00 03 00 02 T 01 3B R 00 00 00 01 T 01 3C 02 08 A8 R 00 00 00 01 00 03 00 02 T 01 3F R 00 00 00 01 T 01 40 02 08 D3 R 00 00 00 01 00 03 00 02 T 01 43 R 00 00 00 01 T 01 44 02 08 FE R 00 00 00 01 00 03 00 02 T 01 47 R 00 00 00 01 T 01 48 02 09 29 R 00 00 00 01 00 03 00 02 T 01 4B R 00 00 00 01 T 01 4C 02 09 54 R 00 00 00 01 00 03 00 02 T 01 4F R 00 00 00 01 T 01 50 02 09 7F R 00 00 00 01 00 03 00 02 T 01 53 R 00 00 00 01 T 01 54 02 09 AA R 00 00 00 01 00 03 00 02 T 00 00 R 00 00 00 06 T 00 00 R 00 00 00 07 T 00 01 R 00 00 00 07 T 00 02 R 00 00 00 07 T 00 04 R 00 00 00 07 T 00 05 R 00 00 00 07 T 00 06 R 00 00 00 07 T 00 07 R 00 00 00 07 T 00 09 R 00 00 00 07 T 00 0B R 00 00 00 07 T 00 0C R 00 00 00 07 T 00 00 R 00 00 00 03 T 00 00 75 81 00 00 E4 F5 D0 F5 86 R 00 00 00 03 09 04 00 06 T 00 08 R 00 00 00 03 T 00 00 R 00 00 00 04 T 00 00 E4 F5 00 00 F5 00 01 F5 R 00 00 00 04 29 04 00 07 29 07 00 07 T 00 06 00 02 F5 00 03 F5 R 00 00 00 04 29 02 00 07 29 05 00 07 T 00 0A 00 05 F5 00 06 F5 86 F5 A8 75 8E 31 75 89 R 00 00 00 04 29 02 00 07 29 05 00 07 T 00 16 21 75 88 55 75 8D 64 75 87 00 90 E8 90 A3 R 00 00 00 04 T 00 24 E5 82 45 83 70 F9 90 7F A1 74 01 F0 90 R 00 00 00 04 T 00 31 7F AF 74 01 F0 E4 90 7F E0 F0 90 7F E1 F0 R 00 00 00 04 T 00 3F 90 7F DD 74 09 F0 90 7F DE 74 07 F0 90 R 00 00 00 04 T 00 4C 7F DF 74 05 F0 90 7F D7 74 12 F0 74 32 F0 R 00 00 00 04 T 00 5A 74 02 F0 74 22 F0 90 7F 93 74 00 F0 90 R 00 00 00 04 T 00 67 7F 96 74 80 F0 90 7F 9C 74 C2 F0 90 7F 94 R 00 00 00 04 T 00 75 74 00 F0 90 7F 9D 74 00 F0 90 7F 95 74 00 R 00 00 00 04 T 00 83 F0 90 7F 98 74 20 F0 90 7F 9E 74 2E F0 75 R 00 00 00 04 T 00 91 A8 82 75 E8 01 90 7F AE 74 01 F0 90 7F AC R 00 00 00 04 T 00 9F 74 03 F0 90 7F AD 74 01 F0 75 98 20 75 99 R 00 00 00 04 T 00 AD FF E4 F5 00 0B F5 00 0C 90 7F D6 74 06 F0 R 00 00 00 04 29 05 00 07 29 08 00 07 T 00 B9 12 07 59 90 7F 96 74 82 F0 90 7F 99 E0 30 R 00 00 00 04 00 03 00 02 T 00 C7 E2 06 75 00 00 80 02 01 F8 12 R 00 00 00 04 29 05 00 07 00 09 00 04 T 00 D0 00 00 7A 05 7B 00 7C 06 12 00 06 7A 08 7B R 00 00 00 04 00 02 00 02 00 0B 00 02 T 00 DE 00 7C 00 12 00 06 7A 08 7B 01 7C 00 12 R 00 00 00 04 00 06 00 02 T 00 EB 00 06 74 F8 2F 60 08 75 00 00 81 8F R 00 00 00 04 00 02 00 02 29 0A 00 07 T 00 F6 00 01 02 01 F8 7A 05 7B 05 7C 0C 12 R 00 00 00 04 29 02 00 07 00 05 00 04 T 01 01 00 06 90 7F 9E 74 2A F0 75 00 00 01 90 R 00 00 00 04 00 02 00 02 29 0B 00 07 T 01 0D 7F 9B E0 30 E2 FC 7A 03 7B FF 7C 01 12 R 00 00 00 04 T 01 1A 00 06 90 7F 96 74 42 F0 90 7F 93 74 40 F0 R 00 00 00 04 00 02 00 02 T 01 28 90 7F 95 74 02 F0 75 00 00 10 90 7F C8 E4 R 00 00 00 04 29 09 00 07 T 01 35 F0 90 7F C9 F0 R 00 00 00 04 T 01 3A R 00 00 00 04 T 01 3A 90 7F C9 F0 90 7F C8 E0 20 E1 F9 90 7F C9 R 00 00 00 04 T 01 48 E0 24 FE 50 ED 90 7D C0 E0 B4 FF E6 A3 E0 R 00 00 00 04 T 01 56 B4 04 E1 75 00 00 11 80 0B R 00 00 00 04 29 06 00 07 T 01 5E R 00 00 00 04 T 01 5E 90 7F C9 F0 90 7F C8 E0 20 E1 F9 R 00 00 00 04 T 01 69 R 00 00 00 04 T 01 69 90 7F C9 E0 60 EF FF 25 00 02 F5 00 02 E4 R 00 00 00 04 29 0A 00 07 29 0D 00 07 T 01 75 35 00 03 F5 00 03 90 7D C0 E0 80 04 E0 30 R 00 00 00 04 29 03 00 07 29 06 00 07 T 01 81 99 FD C2 99 F5 99 A3 DF F5 90 7F 9B E0 20 R 00 00 00 04 T 01 8F E2 0C 90 7F C8 74 01 F0 75 00 00 90 02 R 00 00 00 04 29 0B 00 07 T 01 9B 01 F8 R 00 00 00 04 00 02 00 04 T 01 9D R 00 00 00 04 T 01 9D 74 9C 25 00 02 74 D1 35 00 03 50 B7 90 R 00 00 00 04 29 05 00 07 29 0A 00 07 T 01 A8 7F 94 74 00 F0 90 7F 95 74 00 F0 7F FA R 00 00 00 04 T 01 B5 R 00 00 00 04 T 01 B5 90 7F 99 E0 20 E2 1F 90 7F 9B E0 20 E2 06 R 00 00 00 04 T 01 C3 75 00 00 90 02 01 F8 90 7F 98 E0 D2 E1 F0 R 00 00 00 04 29 03 00 07 00 07 00 04 T 01 D0 C2 E1 F0 DF E0 75 00 00 91 02 01 F8 R 00 00 00 04 29 08 00 07 00 0C 00 04 T 01 DB R 00 00 00 04 T 01 DB 7F 10 90 7F 98 E0 D2 E1 F0 C2 E1 F0 DF F8 R 00 00 00 04 T 01 E9 90 7F 95 74 C0 F0 75 00 00 20 90 C0 08 74 R 00 00 00 04 29 09 00 07 T 01 F6 C7 F0 R 00 00 00 04 T 01 F8 R 00 00 00 04 T 01 F8 80 FE R 00 00 00 04 T 00 00 R 00 00 00 02 T 00 00 7A 05 7B 00 7C FF R 00 00 00 02 T 00 06 R 00 00 00 02 T 00 06 R 00 00 00 02 T 00 06 7E 01 7F 00 74 02 CB 13 CB 92 E6 CC 13 CC R 00 00 00 02 T 00 14 92 E7 90 7F 96 F0 90 7F 9B E0 30 E0 03 EE R 00 00 00 02 T 00 22 42 07 90 7F 98 E0 D2 E1 F0 C2 E1 F0 EE 23 R 00 00 00 02 T 00 30 FE DA D7 22 R 00 00 00 02 T 00 34 R 00 00 00 02 T 00 34 10 R 00 00 00 02 T 00 35 R 00 00 00 02 T 00 35 05 86 90 7F A5 C2 F0 74 80 F0 90 7F A6 E5 R 00 00 00 02 T 00 43 F0 F0 90 7F A5 E0 20 E2 20 30 E0 F9 30 E1 R 00 00 00 02 T 00 51 0F 90 7F A6 15 86 E0 A3 05 86 F0 90 7F A5 R 00 00 00 02 T 00 5F DF E7 74 40 F0 E0 20 E6 FC 15 86 EF 22 7F R 00 00 00 02 T 00 6D FF 80 F1 R 00 00 00 02 T 00 70 R 00 00 00 02 T 00 70 05 86 90 7F A5 D2 F0 74 80 F0 90 7F A6 E5 R 00 00 00 02 T 00 7E F0 F0 90 7F A5 E0 20 E2 4C 30 E0 F9 30 E1 R 00 00 00 02 T 00 8C 03 EF 70 0B 74 40 F0 E0 20 E6 FC 15 86 E4 R 00 00 00 02 T 00 9A 22 B4 01 03 74 20 F0 90 7F A6 E0 90 7F A5 R 00 00 00 02 T 00 A8 E0 20 E2 27 30 E0 F9 EF B4 02 03 74 20 F0 R 00 00 00 02 T 00 B6 B4 01 03 74 40 F0 90 7F A6 E0 15 86 F0 A3 R 00 00 00 02 T 00 C4 05 86 90 7F A5 DF DD E0 20 E6 FC 15 86 E4 R 00 00 00 02 T 00 D2 22 74 40 F0 E0 20 E6 FC 74 FF 15 86 22 R 00 00 00 02 T 00 DF R 00 00 00 02 T 00 DF C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 ED 86 75 86 00 C2 89 D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 FB D0 F0 D0 E0 32 R 00 00 00 02 T 01 00 R 00 00 00 02 T 01 00 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 0E 86 75 86 00 C2 8D 05 00 04 E5 00 04 54 07 R 00 00 00 02 29 09 00 07 29 0C 00 07 T 01 1A 70 07 90 7F 98 E0 64 08 F0 R 00 00 00 02 T 01 23 R 00 00 00 02 T 01 23 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 30 R 00 00 00 02 T 01 30 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 3E 86 75 86 00 C2 8B D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 4C D0 F0 D0 E0 32 R 00 00 00 02 T 01 51 R 00 00 00 02 T 01 51 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 5F 86 75 86 00 C2 8F D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 6D D0 F0 D0 E0 32 R 00 00 00 02 T 01 72 R 00 00 00 02 T 01 72 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 80 86 75 86 00 C2 98 C2 99 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 8E D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 95 R 00 00 00 02 T 01 95 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 A3 86 75 86 00 C2 CF D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 B1 D0 F0 D0 E0 32 R 00 00 00 02 T 01 B6 R 00 00 00 02 T 01 B6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 C4 86 75 86 00 C2 DC D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 D2 D0 F0 D0 E0 32 R 00 00 00 02 T 01 D7 R 00 00 00 02 T 01 D7 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 E5 86 75 86 00 C2 C0 C2 C1 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 F3 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 FA R 00 00 00 02 T 01 FA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 08 86 75 86 00 E5 91 C2 E5 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 16 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 1F R 00 00 00 02 T 02 1F C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 2D 86 75 86 00 E5 91 C2 E6 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 3B D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 44 R 00 00 00 02 T 02 44 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 52 86 75 86 00 E5 91 C2 E7 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 60 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 69 R 00 00 00 02 T 02 69 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 77 86 75 86 00 C2 DB D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 02 85 D0 F0 D0 E0 32 R 00 00 00 02 T 02 8A R 00 00 00 02 T 02 8A E5 00 09 FF 24 C0 F5 00 09 E5 R 00 00 00 02 29 03 00 07 29 09 00 07 T 02 92 00 0A 34 00 50 12 E4 F5 00 09 F5 R 00 00 00 02 29 02 00 07 29 0A 00 07 T 02 9B 00 0A F5 00 06 74 02 90 7F B4 F0 EF 60 25 R 00 00 00 02 29 02 00 07 29 05 00 07 T 02 A7 80 04 F5 00 0A 7F 40 8F 00 85 00 07 82 85 R 00 00 00 02 29 05 00 07 29 0C 00 07 T 02 B3 00 08 83 05 86 90 7F 00 15 86 E0 A3 05 86 R 00 00 00 02 29 02 00 07 T 02 C0 F0 A3 15 86 D8 F6 85 82 00 07 85 83 00 08 R 00 00 00 02 29 0A 00 07 29 0E 00 07 T 02 CC EF 90 7F B5 F0 22 R 00 00 00 02 T 02 D2 R 00 00 00 02 T 02 D2 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 02 E0 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 02 EE C2 E4 F5 91 90 7F AB 74 01 F0 75 00 06 00 R 00 00 00 02 29 0D 00 07 T 02 FB 90 7F E9 E0 B4 06 59 90 7F E8 E0 B4 80 4F R 00 00 00 02 T 03 09 90 7F EB E0 B4 01 0C 90 7F D4 74 09 D5 F0 R 00 00 00 02 89 0D 00 02 T 03 16 A3 74 09 D5 F0 80 39 R 00 00 00 02 09 04 00 02 T 03 1C R 00 00 00 02 T 03 1C B4 02 12 90 7F EA E0 70 33 90 7F D4 74 R 00 00 00 02 T 03 29 09 E7 F0 A3 74 09 E7 F0 80 24 R 00 00 00 02 89 02 00 02 09 07 00 02 T 03 31 R 00 00 00 02 T 03 31 B4 03 24 90 7F EA E0 24 FC 40 1C E0 25 E0 R 00 00 00 02 T 03 3F 24 0A 2C F5 82 E4 34 0A 2C F5 83 E0 F5 F0 R 00 00 00 02 09 03 00 02 89 09 00 02 T 03 4B A3 E0 90 7F D4 F0 A3 E5 F0 F0 R 00 00 00 02 T 03 55 R 00 00 00 02 T 03 55 02 05 9F R 00 00 00 02 00 03 00 02 T 03 58 R 00 00 00 02 T 03 58 02 05 9B R 00 00 00 02 00 03 00 02 T 03 5B R 00 00 00 02 T 03 5B B4 09 41 90 7F E8 E0 70 F4 90 7F EA E0 24 R 00 00 00 02 T 03 69 FE 40 EC E0 F5 00 0B R 00 00 00 02 29 07 00 07 T 03 6F R 00 00 00 02 T 03 6F 90 7F D7 78 07 E8 44 10 F0 44 30 F0 E8 F0 R 00 00 00 02 T 03 7D 44 20 F0 D8 F2 E4 F0 74 02 90 7F B6 78 07 R 00 00 00 02 T 03 8B F0 A3 A3 D8 FB 90 7F C6 78 07 F0 A3 A3 D8 R 00 00 00 02 T 03 99 FB 12 07 59 80 B6 R 00 00 00 02 00 04 00 02 T 03 9F R 00 00 00 02 T 03 9F B4 0B 1A 90 7F E8 E0 B4 01 AF E5 00 0B B4 R 00 00 00 02 29 0D 00 07 T 03 AC 01 AA 90 7F EC E0 70 A4 90 7F EA E0 F5 R 00 00 00 02 T 03 B9 00 0C 80 B3 R 00 00 00 02 29 02 00 07 T 03 BC R 00 00 00 02 T 03 BC B4 0A 20 90 7F E8 E0 B4 81 92 E5 00 0B B4 R 00 00 00 02 29 0D 00 07 T 03 C9 01 8D 90 7F EC E0 70 87 E5 00 0C R 00 00 00 02 29 0B 00 07 T 03 D3 R 00 00 00 02 T 03 D3 90 7F 00 F0 90 7F B5 74 01 F0 80 4E R 00 00 00 02 T 03 DF R 00 00 00 02 T 03 DF B4 08 0B 90 7F E8 E0 B4 80 47 E5 00 0B 80 R 00 00 00 02 29 0D 00 07 T 03 EC E6 R 00 00 00 02 T 03 ED R 00 00 00 02 T 03 ED 70 44 90 7F E8 E0 B4 80 11 74 01 R 00 00 00 02 T 03 F8 R 00 00 00 02 T 03 F8 90 7F 00 F0 A3 E4 F0 90 7F B5 74 02 F0 80 R 00 00 00 02 T 04 06 26 R 00 00 00 02 T 04 07 R 00 00 00 02 T 04 07 B4 81 03 E4 80 EB R 00 00 00 02 T 04 0D R 00 00 00 02 T 04 0D B4 82 20 90 7F EC E0 90 7F C4 30 E7 03 90 R 00 00 00 02 T 04 1B 7F B4 54 0F 60 0F 20 E3 0C 25 E0 25 82 F5 R 00 00 00 02 T 04 29 82 E0 80 CB R 00 00 00 02 T 04 2D R 00 00 00 02 T 04 2D 02 05 9F R 00 00 00 02 00 03 00 02 T 04 30 R 00 00 00 02 T 04 30 02 05 9B R 00 00 00 02 00 03 00 02 T 04 33 R 00 00 00 02 T 04 33 B4 03 05 75 F0 01 80 06 R 00 00 00 02 T 04 3B R 00 00 00 02 T 04 3B B4 01 3E 75 F0 00 R 00 00 00 02 T 04 41 R 00 00 00 02 T 04 41 90 7F E8 E0 B4 02 E8 A3 A3 E0 70 E3 A3 E0 R 00 00 00 02 T 04 4F 70 DF A3 E0 90 7F C4 30 E7 05 90 7F B4 44 R 00 00 00 02 T 04 5D 10 20 E3 CF 54 1F 05 86 90 7F D7 F0 44 20 R 00 00 00 02 T 04 6B F0 54 0F F0 15 86 25 E0 25 82 F5 82 E5 F0 R 00 00 00 02 T 04 79 F0 80 B1 R 00 00 00 02 T 04 7C R 00 00 00 02 T 04 7C B4 A3 3E 90 7F EA E0 F5 00 07 A3 E0 F5 R 00 00 00 02 29 0A 00 07 T 04 88 00 08 24 50 50 2D 90 7F EE E0 F5 00 09 25 R 00 00 00 02 29 02 00 07 29 0D 00 07 T 04 94 00 07 A3 E0 F5 00 0A 35 R 00 00 00 02 29 02 00 07 29 07 00 07 T 04 9A 00 08 40 1D 90 7F E8 E0 B4 40 0A 75 00 06 R 00 00 00 02 29 02 00 07 29 0E 00 07 T 04 A6 01 90 7F C5 F0 02 05 A5 B4 C0 09 75 00 06 R 00 00 00 02 00 08 00 02 29 0E 00 07 T 04 B3 02 12 02 8A 02 05 A5 R 00 00 00 02 00 04 00 02 00 07 00 02 T 04 BA R 00 00 00 02 T 04 BA 02 05 9B R 00 00 00 02 00 03 00 02 T 04 BD R 00 00 00 02 T 04 BD B4 B1 3E 90 7F E8 E0 B4 C0 34 90 7F 00 E5 R 00 00 00 02 T 04 CB 00 00 F0 A3 E5 00 01 F0 A3 E5 81 C0 82 C0 R 00 00 00 02 29 02 00 07 29 07 00 07 T 04 D7 83 90 7F DF E0 D0 83 D0 82 F0 A3 74 00 C0 R 00 00 00 02 T 04 E5 82 C0 83 90 7F C8 E0 D0 83 D0 82 F0 A3 90 R 00 00 00 02 T 04 F3 7F B5 74 04 F0 02 05 9F R 00 00 00 02 00 08 00 02 T 04 FB R 00 00 00 02 T 04 FB 02 05 9B R 00 00 00 02 00 03 00 02 T 04 FE R 00 00 00 02 T 04 FE B4 B2 2B 90 7F E8 E0 B4 C0 21 90 7F 00 E5 R 00 00 00 02 T 05 0C 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 02 00 07 29 07 00 07 T 05 14 00 02 F0 A3 E5 00 03 F0 A3 E5 R 00 00 00 02 29 02 00 07 29 07 00 07 T 05 1C 00 05 F0 90 7F B5 74 05 F0 05 00 05 02 R 00 00 00 02 29 02 00 07 29 0C 00 07 T 05 27 05 9F R 00 00 00 02 00 02 00 02 T 05 29 R 00 00 00 02 T 05 29 02 05 9B R 00 00 00 02 00 03 00 02 T 05 2C R 00 00 00 02 T 05 2C B4 B3 2A 90 7F E8 E0 B4 C0 20 75 F0 A0 90 R 00 00 00 02 T 05 3A 00 34 7F 01 12 00 35 70 13 90 7F 00 7F 06 R 00 00 00 02 00 02 00 02 00 07 00 02 T 05 48 12 00 70 70 09 74 06 90 7F B5 F0 02 05 9F R 00 00 00 02 00 03 00 02 00 0E 00 02 T 05 56 R 00 00 00 02 T 05 56 02 05 9B R 00 00 00 02 00 03 00 02 T 05 59 R 00 00 00 02 T 05 59 B4 B4 3F 90 7F EF E0 70 36 90 7F EE E0 F8 R 00 00 00 02 T 05 67 FF 24 C0 40 2C 90 7F EC E0 F5 F0 F5 00 07 R 00 00 00 02 29 0E 00 07 T 05 74 90 7F E8 E0 B4 40 0A 75 00 06 02 90 7F C5 R 00 00 00 02 29 0A 00 07 T 05 81 F0 02 05 A5 B4 C0 10 90 7F 00 12 00 70 70 R 00 00 00 02 00 04 00 02 00 0D 00 02 T 05 8F 08 E8 90 7F B5 F0 02 05 9F R 00 00 00 02 00 09 00 02 T 05 98 R 00 00 00 02 T 05 98 02 05 9B R 00 00 00 02 00 03 00 02 T 05 9B R 00 00 00 02 T 05 9B R 00 00 00 02 T 05 9B 74 03 80 02 R 00 00 00 02 T 05 9F R 00 00 00 02 T 05 9F 74 02 R 00 00 00 02 T 05 A1 R 00 00 00 02 T 05 A1 90 7F B4 F0 R 00 00 00 02 T 05 A5 R 00 00 00 02 T 05 A5 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 05 B3 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 05 BA R 00 00 00 02 T 05 BA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 05 C8 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 05 D6 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 05 E4 32 R 00 00 00 02 T 05 E5 R 00 00 00 02 T 05 E5 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 05 F3 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 06 01 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 0F 32 R 00 00 00 02 T 06 10 R 00 00 00 02 T 06 10 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 1E 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 06 2C 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 3A 32 R 00 00 00 02 T 06 3B R 00 00 00 02 T 06 3B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 49 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 06 57 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 65 32 R 00 00 00 02 T 06 66 R 00 00 00 02 T 06 66 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 06 74 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 06 82 C2 E4 F5 91 90 7F A9 74 01 F0 E5 00 06 B4 R 00 00 00 02 29 0D 00 07 T 06 8F 02 05 12 02 8A 80 11 90 7F B5 E4 F0 80 04 R 00 00 00 02 00 05 00 02 T 06 9D R 00 00 00 02 T 06 9D 74 03 80 02 R 00 00 00 02 T 06 A1 R 00 00 00 02 T 06 A1 74 02 R 00 00 00 02 T 06 A3 R 00 00 00 02 T 06 A3 90 7F B4 F0 R 00 00 00 02 T 06 A7 R 00 00 00 02 T 06 A7 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 06 B5 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 06 BC R 00 00 00 02 T 06 BC C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 06 CA 75 D0 00 C0 86 75 86 00 C0 00 C0 06 E5 91 R 00 00 00 02 T 06 D8 C2 E4 F5 91 90 7F AA 74 01 F0 E5 00 06 B4 R 00 00 00 02 29 0D 00 07 T 06 E5 01 36 90 7F C5 E0 60 28 FF C3 E5 00 09 9F R 00 00 00 02 29 0D 00 07 T 06 F2 F5 00 09 E5 00 0A 94 00 F5 R 00 00 00 02 29 03 00 07 29 06 00 07 T 06 F9 00 0A 40 38 90 7E C0 85 00 07 84 85 R 00 00 00 02 29 02 00 07 29 0A 00 07 T 07 03 00 08 85 E0 A3 05 86 F0 A3 15 86 DF F6 85 R 00 00 00 02 29 02 00 07 T 07 10 84 00 07 85 85 00 08 E5 R 00 00 00 02 29 03 00 07 29 07 00 07 T 07 16 00 09 45 00 0A 60 20 80 27 B4 02 14 90 R 00 00 00 02 29 02 00 07 29 05 00 07 T 07 21 7F C5 E0 60 15 FF 85 00 07 F0 90 7E C0 12 R 00 00 00 02 29 09 00 07 T 07 2E 00 35 70 02 80 07 R 00 00 00 02 00 02 00 02 T 07 34 R 00 00 00 02 T 07 34 75 00 06 00 74 03 80 05 R 00 00 00 02 29 03 00 07 T 07 3B R 00 00 00 02 T 07 3B 75 00 06 00 74 02 R 00 00 00 02 29 03 00 07 T 07 40 R 00 00 00 02 T 07 40 90 7F B4 F0 R 00 00 00 02 T 07 44 R 00 00 00 02 T 07 44 D0 06 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 07 52 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 07 59 R 00 00 00 02 T 07 59 90 7E 80 E5 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 06 00 07 29 0B 00 07 T 07 65 00 02 F0 A3 E5 00 03 F0 A3 E5 R 00 00 00 02 29 02 00 07 29 07 00 07 T 07 6D 00 05 F0 90 7F B7 74 05 F0 05 00 05 22 R 00 00 00 02 29 02 00 07 29 0C 00 07 T 07 78 R 00 00 00 02 T 07 78 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 86 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 94 02 F0 12 07 59 D0 86 D0 D0 D0 83 D0 82 D0 R 00 00 00 02 00 05 00 02 T 07 A2 F0 D0 E0 32 R 00 00 00 02 T 07 A6 R 00 00 00 02 T 07 A6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 B4 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 07 C2 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 D0 32 R 00 00 00 02 T 07 D1 R 00 00 00 02 T 07 D1 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 DF 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 ED 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 FB 32 R 00 00 00 02 T 07 FC R 00 00 00 02 T 07 FC C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 0A 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 08 18 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 26 32 R 00 00 00 02 T 08 27 R 00 00 00 02 T 08 27 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 35 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 08 43 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 51 32 R 00 00 00 02 T 08 52 R 00 00 00 02 T 08 52 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 60 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 08 6E 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 7C 32 R 00 00 00 02 T 08 7D R 00 00 00 02 T 08 7D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 8B 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 08 99 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 A7 32 R 00 00 00 02 T 08 A8 R 00 00 00 02 T 08 A8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 B6 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 08 C4 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 D2 32 R 00 00 00 02 T 08 D3 R 00 00 00 02 T 08 D3 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 E1 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 08 EF 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 FD 32 R 00 00 00 02 T 08 FE R 00 00 00 02 T 08 FE C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 0C 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 1A 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 28 32 R 00 00 00 02 T 09 29 R 00 00 00 02 T 09 29 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 37 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 45 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 53 32 R 00 00 00 02 T 09 54 R 00 00 00 02 T 09 54 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 62 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 70 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 7E 32 R 00 00 00 02 T 09 7F R 00 00 00 02 T 09 7F C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 8D 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 9B 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 A9 32 R 00 00 00 02 T 09 AA R 00 00 00 02 T 09 AA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 B8 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 C6 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 D4 32 R 00 00 00 02 T 09 D5 R 00 00 00 02 T 09 D5 12 01 00 01 FF 00 FF 40 C0 BA 35 61 02 00 R 00 00 00 02 T 09 E3 01 02 03 01 R 00 00 00 02 T 09 E7 R 00 00 00 02 T 09 E7 09 02 45 00 01 01 00 40 00 09 04 00 00 03 R 00 00 00 02 T 09 F5 FF 00 FF 00 07 05 81 02 40 00 00 07 05 82 R 00 00 00 02 T 0A 03 02 40 00 00 07 05 02 02 40 00 00 09 04 00 R 00 00 00 02 T 0A 11 01 03 FF 00 FF 00 07 05 81 03 40 00 0A 07 R 00 00 00 02 T 0A 1F 05 82 02 40 00 00 07 05 02 02 40 00 00 R 00 00 00 02 T 0A 2C R 00 00 00 02 T 0A 2C 0A 34 0A 34 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0A 2E 0A 38 0A 38 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0A 30 0A 46 0A 46 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0A 32 0A 66 0A 66 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0A 34 R 00 00 00 02 T 0A 34 04 03 00 00 R 00 00 00 02 T 0A 38 R 00 00 00 02 T 0A 38 0E 03 42 00 61 00 79 00 63 00 6F 00 6D 00 R 00 00 00 02 T 0A 46 R 00 00 00 02 T 0A 46 20 03 55 00 53 00 42 00 46 00 4C 00 45 00 R 00 00 00 02 T 0A 54 58 00 20 00 28 00 62 00 6C 00 61 00 6E 00 R 00 00 00 02 T 0A 62 6B 00 29 00 R 00 00 00 02 T 0A 66 R 00 00 00 02 T 0A 66 02 03 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0A 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0A 82 00 00 00 00 00 00 R 00 00 00 02 baycomusb-0.10.orig/firmware/dl2firmware/main.lst0100644000175100017510000033616707325134422020134 0ustar abaaba 1 .module main 2 3 ;; define code segments link order 4 .area CODE (CODE) 5 .area CSEG (CODE) 6 .area GSINIT (CODE) 7 .area GSINIT2 (CODE) 8 9 ;; ----------------------------------------------------- 10 11 ;; special function registers (which are not predefined) 0082 12 dpl0 = 0x82 0083 13 dph0 = 0x83 0084 14 dpl1 = 0x84 0085 15 dph1 = 0x85 0086 16 dps = 0x86 008E 17 ckcon = 0x8E 008F 18 spc_fnc = 0x8F 0091 19 exif = 0x91 0092 20 mpage = 0x92 0098 21 scon0 = 0x98 0099 22 sbuf0 = 0x99 00C0 23 scon1 = 0xC0 00C1 24 sbuf1 = 0xC1 00D8 25 eicon = 0xD8 00E8 26 eie = 0xE8 00F8 27 eip = 0xF8 28 29 ;; anchor xdata registers 7F00 30 IN0BUF = 0x7F00 7EC0 31 OUT0BUF = 0x7EC0 7E80 32 IN1BUF = 0x7E80 7E40 33 OUT1BUF = 0x7E40 7E00 34 IN2BUF = 0x7E00 7DC0 35 OUT2BUF = 0x7DC0 7D80 36 IN3BUF = 0x7D80 7D40 37 OUT3BUF = 0x7D40 7D00 38 IN4BUF = 0x7D00 7CC0 39 OUT4BUF = 0x7CC0 7C80 40 IN5BUF = 0x7C80 7C40 41 OUT5BUF = 0x7C40 7C00 42 IN6BUF = 0x7C00 7BC0 43 OUT6BUF = 0x7BC0 7B80 44 IN7BUF = 0x7B80 7B40 45 OUT7BUF = 0x7B40 7FE8 46 SETUPBUF = 0x7FE8 7FE8 47 SETUPDAT = 0x7FE8 48 7FB4 49 EP0CS = 0x7FB4 7FB5 50 IN0BC = 0x7FB5 7FB6 51 IN1CS = 0x7FB6 7FB7 52 IN1BC = 0x7FB7 7FB8 53 IN2CS = 0x7FB8 7FB9 54 IN2BC = 0x7FB9 7FBA 55 IN3CS = 0x7FBA 7FBB 56 IN3BC = 0x7FBB 7FBC 57 IN4CS = 0x7FBC 7FBD 58 IN4BC = 0x7FBD 7FBE 59 IN5CS = 0x7FBE 7FBF 60 IN5BC = 0x7FBF 7FC0 61 IN6CS = 0x7FC0 7FC1 62 IN6BC = 0x7FC1 7FC2 63 IN7CS = 0x7FC2 7FC3 64 IN7BC = 0x7FC3 7FC5 65 OUT0BC = 0x7FC5 7FC6 66 OUT1CS = 0x7FC6 7FC7 67 OUT1BC = 0x7FC7 7FC8 68 OUT2CS = 0x7FC8 7FC9 69 OUT2BC = 0x7FC9 7FCA 70 OUT3CS = 0x7FCA 7FCB 71 OUT3BC = 0x7FCB 7FCC 72 OUT4CS = 0x7FCC 7FCD 73 OUT4BC = 0x7FCD 7FCE 74 OUT5CS = 0x7FCE 7FCF 75 OUT5BC = 0x7FCF 7FD0 76 OUT6CS = 0x7FD0 7FD1 77 OUT6BC = 0x7FD1 7FD2 78 OUT7CS = 0x7FD2 7FD3 79 OUT7BC = 0x7FD3 80 7FA8 81 IVEC = 0x7FA8 7FA9 82 IN07IRQ = 0x7FA9 7FAA 83 OUT07IRQ = 0x7FAA 7FAB 84 USBIRQ = 0x7FAB 7FAC 85 IN07IEN = 0x7FAC 7FAD 86 OUT07IEN = 0x7FAD 7FAE 87 USBIEN = 0x7FAE 7FAF 88 USBBAV = 0x7FAF 7FB2 89 BPADDRH = 0x7FB2 7FB3 90 BPADDRL = 0x7FB3 91 7FD4 92 SUDPTRH = 0x7FD4 7FD5 93 SUDPTRL = 0x7FD5 7FD6 94 USBCS = 0x7FD6 7FD7 95 TOGCTL = 0x7FD7 7FD8 96 USBFRAMEL = 0x7FD8 7FD9 97 USBFRAMEH = 0x7FD9 7FDB 98 FNADDR = 0x7FDB 7FDD 99 USBPAIR = 0x7FDD 7FDE 100 IN07VAL = 0x7FDE 7FDF 101 OUT07VAL = 0x7FDF 7FE3 102 AUTOPTRH = 0x7FE3 7FE4 103 AUTOPTRL = 0x7FE4 7FE5 104 AUTODATA = 0x7FE5 105 106 ;; isochronous endpoints. only available if ISODISAB=0 107 7F60 108 OUT8DATA = 0x7F60 7F61 109 OUT9DATA = 0x7F61 7F62 110 OUT10DATA = 0x7F62 7F63 111 OUT11DATA = 0x7F63 7F64 112 OUT12DATA = 0x7F64 7F65 113 OUT13DATA = 0x7F65 7F66 114 OUT14DATA = 0x7F66 7F67 115 OUT15DATA = 0x7F67 116 7F68 117 IN8DATA = 0x7F68 7F69 118 IN9DATA = 0x7F69 7F6A 119 IN10DATA = 0x7F6A 7F6B 120 IN11DATA = 0x7F6B 7F6C 121 IN12DATA = 0x7F6C 7F6D 122 IN13DATA = 0x7F6D 7F6E 123 IN14DATA = 0x7F6E 7F6F 124 IN15DATA = 0x7F6F 125 7F70 126 OUT8BCH = 0x7F70 7F71 127 OUT8BCL = 0x7F71 7F72 128 OUT9BCH = 0x7F72 7F73 129 OUT9BCL = 0x7F73 7F74 130 OUT10BCH = 0x7F74 7F75 131 OUT10BCL = 0x7F75 7F76 132 OUT11BCH = 0x7F76 7F77 133 OUT11BCL = 0x7F77 7F78 134 OUT12BCH = 0x7F78 7F79 135 OUT12BCL = 0x7F79 7F7A 136 OUT13BCH = 0x7F7A 7F7B 137 OUT13BCL = 0x7F7B 7F7C 138 OUT14BCH = 0x7F7C 7F7D 139 OUT14BCL = 0x7F7D 7F7E 140 OUT15BCH = 0x7F7E 7F7F 141 OUT15BCL = 0x7F7F 142 7FF0 143 OUT8ADDR = 0x7FF0 7FF1 144 OUT9ADDR = 0x7FF1 7FF2 145 OUT10ADDR = 0x7FF2 7FF3 146 OUT11ADDR = 0x7FF3 7FF4 147 OUT12ADDR = 0x7FF4 7FF5 148 OUT13ADDR = 0x7FF5 7FF6 149 OUT14ADDR = 0x7FF6 7FF7 150 OUT15ADDR = 0x7FF7 7FF8 151 IN8ADDR = 0x7FF8 7FF9 152 IN9ADDR = 0x7FF9 7FFA 153 IN10ADDR = 0x7FFA 7FFB 154 IN11ADDR = 0x7FFB 7FFC 155 IN12ADDR = 0x7FFC 7FFD 156 IN13ADDR = 0x7FFD 7FFE 157 IN14ADDR = 0x7FFE 7FFF 158 IN15ADDR = 0x7FFF 159 7FA0 160 ISOERR = 0x7FA0 7FA1 161 ISOCTL = 0x7FA1 7FA2 162 ZBCOUNT = 0x7FA2 7FE0 163 INISOVAL = 0x7FE0 7FE1 164 OUTISOVAL = 0x7FE1 7FE2 165 FASTXFR = 0x7FE2 166 167 ;; CPU control registers 168 7F92 169 CPUCS = 0x7F92 170 171 ;; IO port control registers 172 7F93 173 PORTACFG = 0x7F93 7F94 174 PORTBCFG = 0x7F94 7F95 175 PORTCCFG = 0x7F95 7F96 176 OUTA = 0x7F96 7F97 177 OUTB = 0x7F97 7F98 178 OUTC = 0x7F98 7F99 179 PINSA = 0x7F99 7F9A 180 PINSB = 0x7F9A 7F9B 181 PINSC = 0x7F9B 7F9C 182 OEA = 0x7F9C 7F9D 183 OEB = 0x7F9D 7F9E 184 OEC = 0x7F9E 185 186 ;; I2C controller registers 187 7FA5 188 I2CS = 0x7FA5 7FA6 189 I2DAT = 0x7FA6 190 191 ;; FPGA defines 0003 192 XC4K_IRLENGTH = 3 0000 193 XC4K_EXTEST = 0 0001 194 XC4K_PRELOAD = 1 0005 195 XC4K_CONFIGURE = 5 0007 196 XC4K_BYPASS = 7 197 2E64 198 FPGA_CONFIGSIZE = 11876 0158 199 FPGA_BOUND = 344 200 0000 201 SOFTWARECONFIG = 0 202 203 ;; ----------------------------------------------------- 204 205 .area CODE (CODE) 0000 02s00r00 206 ljmp startup 0003 02s00rDF 207 ljmp int0_isr 0006 208 .ds 5 000B 02s01r00 209 ljmp timer0_isr 000E 210 .ds 5 0013 02s01r30 211 ljmp int1_isr 0016 212 .ds 5 001B 02s01r51 213 ljmp timer1_isr 001E 214 .ds 5 0023 02s01r72 215 ljmp ser0_isr 0026 216 .ds 5 002B 02s01r95 217 ljmp timer2_isr 002E 218 .ds 5 0033 02s01rB6 219 ljmp resume_isr 0036 220 .ds 5 003B 02s01rD7 221 ljmp ser1_isr 003E 222 .ds 5 0043 02s01r00 223 ljmp usb_isr 0046 224 .ds 5 004B 02s01rFA 225 ljmp i2c_isr 004E 226 .ds 5 0053 02s02r1F 227 ljmp int4_isr 0056 228 .ds 5 005B 02s02r44 229 ljmp int5_isr 005E 230 .ds 5 0063 02s02r69 231 ljmp int6_isr 232 0066 233 .ds 0x9a 234 ;; USB interrupt dispatch table 0100 235 usb_isr: 0100 02s02rD2 236 ljmp usb_sudav_isr 0103 237 .ds 1 0104 02s05rBA 238 ljmp usb_sof_isr 0107 239 .ds 1 0108 02s05rE5 240 ljmp usb_sutok_isr 010B 241 .ds 1 010C 02s06r10 242 ljmp usb_suspend_isr 010F 243 .ds 1 0110 02s06r3B 244 ljmp usb_usbreset_isr 0113 245 .ds 1 0114 32 246 reti 0115 247 .ds 3 0118 02s06r66 248 ljmp usb_ep0in_isr 011B 249 .ds 1 011C 02s06rBC 250 ljmp usb_ep0out_isr 011F 251 .ds 1 0120 02s07r78 252 ljmp usb_ep1in_isr 0123 253 .ds 1 0124 02s07rA6 254 ljmp usb_ep1out_isr 0127 255 .ds 1 0128 02s07rD1 256 ljmp usb_ep2in_isr 012B 257 .ds 1 012C 02s07rFC 258 ljmp usb_ep2out_isr 012F 259 .ds 1 0130 02s08r27 260 ljmp usb_ep3in_isr 0133 261 .ds 1 0134 02s08r52 262 ljmp usb_ep3out_isr 0137 263 .ds 1 0138 02s08r7D 264 ljmp usb_ep4in_isr 013B 265 .ds 1 013C 02s08rA8 266 ljmp usb_ep4out_isr 013F 267 .ds 1 0140 02s08rD3 268 ljmp usb_ep5in_isr 0143 269 .ds 1 0144 02s08rFE 270 ljmp usb_ep5out_isr 0147 271 .ds 1 0148 02s09r29 272 ljmp usb_ep6in_isr 014B 273 .ds 1 014C 02s09r54 274 ljmp usb_ep6out_isr 014F 275 .ds 1 0150 02s09r7F 276 ljmp usb_ep7in_isr 0153 277 .ds 1 0154 02s09rAA 278 ljmp usb_ep7out_isr 279 280 ;; ----------------------------------------------------- 281 282 .area BSEG (BIT) 283 284 .area ISEG (DATA) 0000 285 stack: .ds 0x80 286 287 .area DSEG (DATA) 0000 288 errcode: .ds 1 0001 289 errval: .ds 1 0002 290 cfgcount: .ds 2 0004 291 leddiv: .ds 1 0005 292 irqcount: .ds 1 0006 293 ctrlcode: .ds 1 0007 294 ctrladdr: .ds 2 0009 295 ctrllen: .ds 2 296 297 ;; USB state 000B 298 numconfig: .ds 1 000C 299 altsetting: .ds 1 300 301 .area XSEG (DATA) 302 303 304 .area GSINIT (CODE) 0000 305 startup: 0000 75 81r00 306 mov sp,#stack ; -1 0003 E4 307 clr a 0004 F5 D0 308 mov psw,a 0006 F5 86 309 mov dps,a 310 ;lcall __sdcc_external_startup 311 ;mov a,dpl0 312 ;jz __sdcc_init_data 313 ;ljmp __sdcc_program_startup 0008 314 __sdcc_init_data: 315 316 .area GSINIT2 (CODE) 0000 317 __sdcc_program_startup: 318 ;; assembler code startup 0000 E4 319 clr a 0001 F5*00 320 mov errcode,a 0003 F5*01 321 mov errval,a 0005 F5*02 322 mov cfgcount,a 0007 F5*03 323 mov cfgcount+1,a 0009 F5*05 324 mov irqcount,a 000B F5*06 325 mov ctrlcode,a 000D F5 86 326 mov dps,a 000F F5 A8 327 mov ie,a 328 ;; some indirect register setup 0011 75 8E 31 329 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 330 ;; Timer setup: 331 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 332 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0014 75 89 21 333 mov tmod,#0x21 0017 75 88 55 334 mov tcon,#0x55 ; INT0/INT1 edge 001A 75 8D 64 335 mov th1,#256-156 ; 1200 bauds 001D 75 87 00 336 mov pcon,#0 ; SMOD0=0 337 ;; give Windows a chance to finish the writecpucs control transfer 338 ;; 10ms delay loop 0020 90 E8 90 339 mov dptr,#(-6000)&0xffff 0023 A3 340 9$: inc dptr ; 3 cycles 0024 E5 82 341 mov a,dpl0 ; 2 cycles 0026 45 83 342 orl a,dph0 ; 2 cycles 0028 70 F9 343 jnz 9$ ; 3 cycles 344 ;; init USB subsystem 002A 90 7F A1 345 mov dptr,#ISOCTL 002D 74 01 346 mov a,#1 ; disable ISO endpoints 002F F0 347 movx @dptr,a 0030 90 7F AF 348 mov dptr,#USBBAV 0033 74 01 349 mov a,#1 ; enable autovector, disable breakpoint logic 0035 F0 350 movx @dptr,a 0036 E4 351 clr a 0037 90 7F E0 352 mov dptr,#INISOVAL 003A F0 353 movx @dptr,a 003B 90 7F E1 354 mov dptr,#OUTISOVAL 003E F0 355 movx @dptr,a 003F 90 7F DD 356 mov dptr,#USBPAIR 0042 74 09 357 mov a,#0x9 ; pair EP 2&3 for input & output 0044 F0 358 movx @dptr,a 0045 90 7F DE 359 mov dptr,#IN07VAL 0048 74 07 360 mov a,#0x7 ; enable EP0+EP1+EP2 004A F0 361 movx @dptr,a 004B 90 7F DF 362 mov dptr,#OUT07VAL 004E 74 05 363 mov a,#0x5 ; enable EP0+EP2 0050 F0 364 movx @dptr,a 365 ;; USB: init endpoint toggles 0051 90 7F D7 366 mov dptr,#TOGCTL 0054 74 12 367 mov a,#0x12 0056 F0 368 movx @dptr,a 0057 74 32 369 mov a,#0x32 ; clear EP 2 in toggle 0059 F0 370 movx @dptr,a 005A 74 02 371 mov a,#0x02 005C F0 372 movx @dptr,a 005D 74 22 373 mov a,#0x22 ; clear EP 2 out toggle 005F F0 374 movx @dptr,a 375 ;; configure IO ports 0060 90 7F 93 376 mov dptr,#PORTACFG 0063 74 00 377 mov a,#0 0065 F0 378 movx @dptr,a 0066 90 7F 96 379 mov dptr,#OUTA 0069 74 80 380 mov a,#0x80 ; set PROG lo 006B F0 381 movx @dptr,a 006C 90 7F 9C 382 mov dptr,#OEA 006F 74 C2 383 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0071 F0 384 movx @dptr,a 0072 90 7F 94 385 mov dptr,#PORTBCFG 0075 74 00 386 mov a,#0 0077 F0 387 movx @dptr,a 0078 90 7F 9D 388 mov dptr,#OEB 007B 74 00 389 mov a,#0 007D F0 390 movx @dptr,a 007E 90 7F 95 391 mov dptr,#PORTCCFG 0081 74 00 392 mov a,#0 0083 F0 393 movx @dptr,a 0084 90 7F 98 394 mov dptr,#OUTC 0087 74 20 395 mov a,#0x20 0089 F0 396 movx @dptr,a 008A 90 7F 9E 397 mov dptr,#OEC 008D 74 2E 398 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 008F F0 399 movx @dptr,a 400 ;; enable interrupts 0090 75 A8 82 401 mov ie,#0x82 ; enable timer 0 0093 75 E8 01 402 mov eie,#0x01 ; enable USB interrupts 0096 90 7F AE 403 mov dptr,#USBIEN 0099 74 01 404 mov a,#1 ; enable SUDAV interrupt 009B F0 405 movx @dptr,a 009C 90 7F AC 406 mov dptr,#IN07IEN 009F 74 03 407 mov a,#3 ; enable EP0+EP1 interrupt 00A1 F0 408 movx @dptr,a 00A2 90 7F AD 409 mov dptr,#OUT07IEN 00A5 74 01 410 mov a,#1 ; enable EP0 interrupt 00A7 F0 411 movx @dptr,a 412 ;; initialize UART 0 for config loading 00A8 75 98 20 413 mov scon0,#0x20 ; mode 0, CLK24/4 00AB 75 99 FF 414 mov sbuf0,#0xff 415 ;; initialize USB state 00AE E4 416 clr a 00AF F5*0B 417 mov numconfig,a 00B1 F5*0C 418 mov altsetting,a 0000 419 .if 0 420 ;; disconnect from USB bus 421 mov dptr,#USBCS 422 mov a,#10 423 movx @dptr,a 424 ;; wait 0.3 sec 425 mov r2,#30 426 ;; 10ms delay loop 427 0$: mov dptr,#(-6000)&0xffff 428 1$: inc dptr ; 3 cycles 429 mov a,dpl0 ; 2 cycles 430 orl a,dph0 ; 2 cycles 431 jnz 1$ ; 3 cycles 432 djnz r2,0$ 433 ;; reconnect to USB bus 434 mov dptr,#USBCS 435 mov a,#2 ; 8051 handles control 436 movx @dptr,a 437 mov a,#6 ; reconnect, 8051 handles control 438 movx @dptr,a 439 .else 00B3 90 7F D6 440 mov dptr,#USBCS 00B6 74 06 441 mov a,#6 ; reconnect, 8051 handles control 00B8 F0 442 movx @dptr,a 443 .endif 444 445 ;; final 00B9 12s07r59 446 lcall fillusbintr 447 ;; kludge; first OUT2 packet seems to be bogus 448 ;; wait for packet with length 1 and contents 0x55 449 450 ;; some short delay 00BC 90 7F 96 451 mov dptr,#OUTA 00BF 74 82 452 mov a,#0x82 ; set PROG hi 00C1 F0 453 movx @dptr,a 00C2 90 7F 99 454 mov dptr,#PINSA 00C5 E0 455 movx a,@dptr 00C6 30 E2 06 456 jnb acc.2,8$ 457 ;; DONE stuck high 00C9 75*00 80 458 mov errcode,#0x80 00CC 02s01rF8 459 ljmp fpgaerr 00CF 12s00r00 460 8$: lcall jtag_reset_tap 00D2 7A 05 461 mov r2,#5 00D4 7B 00 462 mov r3,#0 00D6 7C 06 463 mov r4,#6 00D8 12s00r06 464 lcall jtag_shiftout ; enter SHIFT-IR state 00DB 7A 08 465 mov r2,#8 00DD 7B 00 466 mov r3,#0 00DF 7C 00 467 mov r4,#0 00E1 12s00r06 468 lcall jtag_shiftout ; assume max. 8bit IR 00E4 7A 08 469 mov r2,#8 00E6 7B 01 470 mov r3,#1 00E8 7C 00 471 mov r4,#0 00EA 12s00r06 472 lcall jtag_shift ; shift in a single bit 00ED 74 F8 473 mov a,#-(1<(-FPGA_CONFIGSIZE) 01A3 35*03 600 addc a,cfgcount+1 01A5 50 B7 601 jnc loadloop 602 ;; configuration download complete, start FPGA 01A7 90 7F 94 603 mov dptr,#PORTBCFG 01AA 74 00 604 mov a,#0 ; TDI no longer special function pin 01AC F0 605 movx @dptr,a 01AD 90 7F 95 606 mov dptr,#PORTCCFG 01B0 74 00 607 mov a,#0 ; TCK no longer special function pin 01B2 F0 608 movx @dptr,a 609 ;; wait for done loop 01B3 7F FA 610 mov r7,#250 01B5 611 doneloop: 01B5 90 7F 99 612 mov dptr,#PINSA 01B8 E0 613 movx a,@dptr 01B9 20 E2 1F 614 jb acc.2,doneactive 01BC 90 7F 9B 615 mov dptr,#PINSC 01BF E0 616 movx a,@dptr 01C0 20 E2 06 617 jb acc.2,1$ 618 ;; INIT low 01C3 75*00 90 619 mov errcode,#0x90 01C6 02s01rF8 620 ljmp fpgaerr 01C9 90 7F 98 621 1$: mov dptr,#OUTC 01CC E0 622 movx a,@dptr 01CD D2 E1 623 setb acc.1 01CF F0 624 movx @dptr,a 01D0 C2 E1 625 clr acc.1 01D2 F0 626 movx @dptr,a 01D3 DF E0 627 djnz r7,doneloop 628 ;; DONE stuck low 01D5 75*00 91 629 mov errcode,#0x91 01D8 02s01rF8 630 ljmp fpgaerr 631 01DB 632 doneactive: 633 ;; generate 16 clock pulses to start up FPGA 01DB 7F 10 634 mov r7,#16 01DD 90 7F 98 635 mov dptr,#OUTC 01E0 E0 636 movx a,@dptr 01E1 D2 E1 637 0$: setb acc.1 01E3 F0 638 movx @dptr,a 01E4 C2 E1 639 clr acc.1 01E6 F0 640 movx @dptr,a 01E7 DF F8 641 djnz r7,0$ 01E9 90 7F 95 642 mov dptr,#PORTCCFG 01EC 74 C0 643 mov a,#0xc0 ; RD/WR is special function pin 01EE F0 644 movx @dptr,a 01EF 75*00 20 645 mov errcode,#0x20 646 01F2 90 C0 08 647 mov dptr,#0xc008 01F5 74 C7 648 mov a,#0xc7 01F7 F0 649 movx @dptr,a 650 01F8 651 fpgaerr: 01F8 80 FE 652 sjmp fpgaerr 653 654 .area CSEG (CODE) 0002 655 ar2 = 0x02 0003 656 ar3 = 0x03 0004 657 ar4 = 0x04 0005 658 ar5 = 0x05 0006 659 ar6 = 0x06 0007 660 ar7 = 0x07 0000 661 ar0 = 0x00 0001 662 ar1 = 0x01 663 664 ;; jtag_shift 665 ;; r2 = num 666 ;; r3 = tdi 667 ;; r4 = tms 668 ;; return: r7 = tdo 0000 669 jtag_reset_tap: 0000 7A 05 670 mov r2,#5 0002 7B 00 671 mov r3,#0 0004 7C FF 672 mov r4,#0xff 0006 673 jtag_shiftout: 0006 674 jtag_shift: 0006 7E 01 675 mov r6,#1 0008 7F 00 676 mov r7,#0 000A 74 02 677 1$: mov a,#2 000C CB 678 xch a,r3 000D 13 679 rrc a 000E CB 680 xch a,r3 000F 92 E6 681 mov acc.6,c 0011 CC 682 xch a,r4 0012 13 683 rrc a 0013 CC 684 xch a,r4 0014 92 E7 685 mov acc.7,c 0016 90 7F 96 686 mov dptr,#OUTA 0019 F0 687 movx @dptr,a 001A 90 7F 9B 688 mov dptr,#PINSC 001D E0 689 movx a,@dptr 001E 30 E0 03 690 jnb acc.0,2$ 0021 EE 691 mov a,r6 0022 42 07 692 orl ar7,a 0024 90 7F 98 693 2$: mov dptr,#OUTC 0027 E0 694 movx a,@dptr 0028 D2 E1 695 setb acc.1 002A F0 696 movx @dptr,a 002B C2 E1 697 clr acc.1 002D F0 698 movx @dptr,a 002E EE 699 mov a,r6 002F 23 700 rl a 0030 FE 701 mov r6,a 0031 DA D7 702 djnz r2,1$ 0033 22 703 ret 704 705 ;; EEPROM address where the serial number is located 706 0034 707 eepromstraddr: 0034 10 708 .db 0x10 709 710 ;; I2C Routines 711 ;; note: ckcon should be set to #0x31 to avoid chip bugs 712 0035 713 writei2c: 714 ;; dptr: data to be sent 715 ;; b: device address 716 ;; r7: transfer length 717 ;; return: a: status (bytes remaining, 0xff bus error) 0035 05 86 718 inc dps 0037 90 7F A5 719 mov dptr,#I2CS 003A C2 F0 720 clr b.0 ; r/w = 0 003C 74 80 721 mov a,#0x80 ; start condition 003E F0 722 movx @dptr,a 003F 90 7F A6 723 mov dptr,#I2DAT 0042 E5 F0 724 mov a,b 0044 F0 725 movx @dptr,a 0045 90 7F A5 726 mov dptr,#I2CS 0048 E0 727 0$: movx a,@dptr 0049 20 E2 20 728 jb acc.2,3$ ; BERR 004C 30 E0 F9 729 jnb acc.0,0$ ; DONE 004F 30 E1 0F 730 jnb acc.1,1$ ; ACK 0052 90 7F A6 731 mov dptr,#I2DAT 0055 15 86 732 dec dps 0057 E0 733 movx a,@dptr 0058 A3 734 inc dptr 0059 05 86 735 inc dps 005B F0 736 movx @dptr,a 005C 90 7F A5 737 mov dptr,#I2CS 005F DF E7 738 djnz r7,0$ 0061 74 40 739 1$: mov a,#0x40 ; stop condition 0063 F0 740 movx @dptr,a 0064 E0 741 2$: movx a,@dptr 0065 20 E6 FC 742 jb acc.6,2$ 0068 15 86 743 dec dps 006A EF 744 mov a,r7 006B 22 745 ret 006C 7F FF 746 3$: mov r7,#255 006E 80 F1 747 sjmp 1$ 748 0070 749 readi2c: 750 ;; dptr: data to be sent 751 ;; b: device address 752 ;; r7: transfer length 753 ;; return: a: status (bytes remaining, 0xff bus error) 0070 05 86 754 inc dps 0072 90 7F A5 755 mov dptr,#I2CS 0075 D2 F0 756 setb b.0 ; r/w = 1 0077 74 80 757 mov a,#0x80 ; start condition 0079 F0 758 movx @dptr,a 007A 90 7F A6 759 mov dptr,#I2DAT 007D E5 F0 760 mov a,b 007F F0 761 movx @dptr,a 0080 90 7F A5 762 mov dptr,#I2CS 0083 E0 763 0$: movx a,@dptr 0084 20 E2 4C 764 jb acc.2,9$ ; BERR 0087 30 E0 F9 765 jnb acc.0,0$ ; DONE 008A 30 E1 03 766 jnb acc.1,5$ ; ACK 008D EF 767 mov a,r7 008E 70 0B 768 jnz 1$ 0090 74 40 769 5$: mov a,#0x40 ; stop condition 0092 F0 770 movx @dptr,a 0093 E0 771 2$: movx a,@dptr 0094 20 E6 FC 772 jb acc.6,2$ 0097 15 86 773 dec dps 0099 E4 774 clr a 009A 22 775 ret 009B B4 01 03 776 1$: cjne a,#1,3$ 009E 74 20 777 mov a,#0x20 ; LASTRD = 1 00A0 F0 778 movx @dptr,a 00A1 90 7F A6 779 3$: mov dptr,#I2DAT 00A4 E0 780 movx a,@dptr ; initiate first read 00A5 90 7F A5 781 mov dptr,#I2CS 00A8 E0 782 4$: movx a,@dptr 00A9 20 E2 27 783 jb acc.2,9$ ; BERR 00AC 30 E0 F9 784 jnb acc.0,4$ ; DONE 00AF EF 785 mov a,r7 00B0 B4 02 03 786 cjne a,#2,6$ 00B3 74 20 787 mov a,#0x20 ; LASTRD = 1 00B5 F0 788 movx @dptr,a 00B6 B4 01 03 789 6$: cjne a,#1,7$ 00B9 74 40 790 mov a,#0x40 ; stop condition 00BB F0 791 movx @dptr,a 00BC 90 7F A6 792 7$: mov dptr,#I2DAT 00BF E0 793 movx a,@dptr ; read data 00C0 15 86 794 dec dps 00C2 F0 795 movx @dptr,a 00C3 A3 796 inc dptr 00C4 05 86 797 inc dps 00C6 90 7F A5 798 mov dptr,#I2CS 00C9 DF DD 799 djnz r7,4$ 00CB E0 800 8$: movx a,@dptr 00CC 20 E6 FC 801 jb acc.6,8$ 00CF 15 86 802 dec dps 00D1 E4 803 clr a 00D2 22 804 ret 00D3 74 40 805 9$: mov a,#0x40 ; stop condition 00D5 F0 806 movx @dptr,a 00D6 E0 807 10$: movx a,@dptr 00D7 20 E6 FC 808 jb acc.6,10$ 00DA 74 FF 809 mov a,#255 00DC 15 86 810 dec dps 00DE 22 811 ret 812 813 ;; ------------------ interrupt handlers ------------------------ 814 00DF 815 int0_isr: 00DF C0 E0 816 push acc 00E1 C0 F0 817 push b 00E3 C0 82 818 push dpl0 00E5 C0 83 819 push dph0 00E7 C0 D0 820 push psw 00E9 75 D0 00 821 mov psw,#0x00 00EC C0 86 822 push dps 00EE 75 86 00 823 mov dps,#0 824 ;; clear interrupt 00F1 C2 89 825 clr tcon+1 826 ;; handle interrupt 827 ;; epilogue 00F3 D0 86 828 pop dps 00F5 D0 D0 829 pop psw 00F7 D0 83 830 pop dph0 00F9 D0 82 831 pop dpl0 00FB D0 F0 832 pop b 00FD D0 E0 833 pop acc 00FF 32 834 reti 835 0100 836 timer0_isr: 0100 C0 E0 837 push acc 0102 C0 F0 838 push b 0104 C0 82 839 push dpl0 0106 C0 83 840 push dph0 0108 C0 D0 841 push psw 010A 75 D0 00 842 mov psw,#0x00 010D C0 86 843 push dps 010F 75 86 00 844 mov dps,#0 845 ;; clear interrupt 0112 C2 8D 846 clr tcon+5 847 ;; handle interrupt 0114 05*04 848 inc leddiv 0116 E5*04 849 mov a,leddiv 0118 54 07 850 anl a,#7 011A 70 07 851 jnz 0$ 011C 90 7F 98 852 mov dptr,#OUTC 011F E0 853 movx a,@dptr 0120 64 08 854 xrl a,#0x08 0122 F0 855 movx @dptr,a 0123 856 0$: 857 ;; epilogue 0123 D0 86 858 pop dps 0125 D0 D0 859 pop psw 0127 D0 83 860 pop dph0 0129 D0 82 861 pop dpl0 012B D0 F0 862 pop b 012D D0 E0 863 pop acc 012F 32 864 reti 865 0130 866 int1_isr: 0130 C0 E0 867 push acc 0132 C0 F0 868 push b 0134 C0 82 869 push dpl0 0136 C0 83 870 push dph0 0138 C0 D0 871 push psw 013A 75 D0 00 872 mov psw,#0x00 013D C0 86 873 push dps 013F 75 86 00 874 mov dps,#0 875 ;; clear interrupt 0142 C2 8B 876 clr tcon+3 877 ;; handle interrupt 878 ;; epilogue 0144 D0 86 879 pop dps 0146 D0 D0 880 pop psw 0148 D0 83 881 pop dph0 014A D0 82 882 pop dpl0 014C D0 F0 883 pop b 014E D0 E0 884 pop acc 0150 32 885 reti 886 0151 887 timer1_isr: 0151 C0 E0 888 push acc 0153 C0 F0 889 push b 0155 C0 82 890 push dpl0 0157 C0 83 891 push dph0 0159 C0 D0 892 push psw 015B 75 D0 00 893 mov psw,#0x00 015E C0 86 894 push dps 0160 75 86 00 895 mov dps,#0 896 ;; clear interrupt 0163 C2 8F 897 clr tcon+7 898 ;; handle interrupt 899 ;; epilogue 0165 D0 86 900 pop dps 0167 D0 D0 901 pop psw 0169 D0 83 902 pop dph0 016B D0 82 903 pop dpl0 016D D0 F0 904 pop b 016F D0 E0 905 pop acc 0171 32 906 reti 907 0172 908 ser0_isr: 0172 C0 E0 909 push acc 0174 C0 F0 910 push b 0176 C0 82 911 push dpl0 0178 C0 83 912 push dph0 017A C0 D0 913 push psw 017C 75 D0 00 914 mov psw,#0x00 017F C0 86 915 push dps 0181 75 86 00 916 mov dps,#0 917 ;; clear interrupt 0184 C2 98 918 clr scon0+0 0186 C2 99 919 clr scon0+1 920 ;; handle interrupt 921 ;; epilogue 0188 D0 86 922 pop dps 018A D0 D0 923 pop psw 018C D0 83 924 pop dph0 018E D0 82 925 pop dpl0 0190 D0 F0 926 pop b 0192 D0 E0 927 pop acc 0194 32 928 reti 929 0195 930 timer2_isr: 0195 C0 E0 931 push acc 0197 C0 F0 932 push b 0199 C0 82 933 push dpl0 019B C0 83 934 push dph0 019D C0 D0 935 push psw 019F 75 D0 00 936 mov psw,#0x00 01A2 C0 86 937 push dps 01A4 75 86 00 938 mov dps,#0 939 ;; clear interrupt 01A7 C2 CF 940 clr t2con+7 941 ;; handle interrupt 942 ;; epilogue 01A9 D0 86 943 pop dps 01AB D0 D0 944 pop psw 01AD D0 83 945 pop dph0 01AF D0 82 946 pop dpl0 01B1 D0 F0 947 pop b 01B3 D0 E0 948 pop acc 01B5 32 949 reti 950 01B6 951 resume_isr: 01B6 C0 E0 952 push acc 01B8 C0 F0 953 push b 01BA C0 82 954 push dpl0 01BC C0 83 955 push dph0 01BE C0 D0 956 push psw 01C0 75 D0 00 957 mov psw,#0x00 01C3 C0 86 958 push dps 01C5 75 86 00 959 mov dps,#0 960 ;; clear interrupt 01C8 C2 DC 961 clr eicon+4 962 ;; handle interrupt 963 ;; epilogue 01CA D0 86 964 pop dps 01CC D0 D0 965 pop psw 01CE D0 83 966 pop dph0 01D0 D0 82 967 pop dpl0 01D2 D0 F0 968 pop b 01D4 D0 E0 969 pop acc 01D6 32 970 reti 971 01D7 972 ser1_isr: 01D7 C0 E0 973 push acc 01D9 C0 F0 974 push b 01DB C0 82 975 push dpl0 01DD C0 83 976 push dph0 01DF C0 D0 977 push psw 01E1 75 D0 00 978 mov psw,#0x00 01E4 C0 86 979 push dps 01E6 75 86 00 980 mov dps,#0 981 ;; clear interrupt 01E9 C2 C0 982 clr scon1+0 01EB C2 C1 983 clr scon1+1 984 ;; handle interrupt 985 ;; epilogue 01ED D0 86 986 pop dps 01EF D0 D0 987 pop psw 01F1 D0 83 988 pop dph0 01F3 D0 82 989 pop dpl0 01F5 D0 F0 990 pop b 01F7 D0 E0 991 pop acc 01F9 32 992 reti 993 01FA 994 i2c_isr: 01FA C0 E0 995 push acc 01FC C0 F0 996 push b 01FE C0 82 997 push dpl0 0200 C0 83 998 push dph0 0202 C0 D0 999 push psw 0204 75 D0 00 1000 mov psw,#0x00 0207 C0 86 1001 push dps 0209 75 86 00 1002 mov dps,#0 1003 ;; clear interrupt 020C E5 91 1004 mov a,exif 020E C2 E5 1005 clr acc.5 0210 F5 91 1006 mov exif,a 1007 ;; handle interrupt 1008 ;; epilogue 0212 D0 86 1009 pop dps 0214 D0 D0 1010 pop psw 0216 D0 83 1011 pop dph0 0218 D0 82 1012 pop dpl0 021A D0 F0 1013 pop b 021C D0 E0 1014 pop acc 021E 32 1015 reti 1016 021F 1017 int4_isr: 021F C0 E0 1018 push acc 0221 C0 F0 1019 push b 0223 C0 82 1020 push dpl0 0225 C0 83 1021 push dph0 0227 C0 D0 1022 push psw 0229 75 D0 00 1023 mov psw,#0x00 022C C0 86 1024 push dps 022E 75 86 00 1025 mov dps,#0 1026 ;; clear interrupt 0231 E5 91 1027 mov a,exif 0233 C2 E6 1028 clr acc.6 0235 F5 91 1029 mov exif,a 1030 ;; handle interrupt 1031 ;; epilogue 0237 D0 86 1032 pop dps 0239 D0 D0 1033 pop psw 023B D0 83 1034 pop dph0 023D D0 82 1035 pop dpl0 023F D0 F0 1036 pop b 0241 D0 E0 1037 pop acc 0243 32 1038 reti 1039 0244 1040 int5_isr: 0244 C0 E0 1041 push acc 0246 C0 F0 1042 push b 0248 C0 82 1043 push dpl0 024A C0 83 1044 push dph0 024C C0 D0 1045 push psw 024E 75 D0 00 1046 mov psw,#0x00 0251 C0 86 1047 push dps 0253 75 86 00 1048 mov dps,#0 1049 ;; clear interrupt 0256 E5 91 1050 mov a,exif 0258 C2 E7 1051 clr acc.7 025A F5 91 1052 mov exif,a 1053 ;; handle interrupt 1054 ;; epilogue 025C D0 86 1055 pop dps 025E D0 D0 1056 pop psw 0260 D0 83 1057 pop dph0 0262 D0 82 1058 pop dpl0 0264 D0 F0 1059 pop b 0266 D0 E0 1060 pop acc 0268 32 1061 reti 1062 0269 1063 int6_isr: 0269 C0 E0 1064 push acc 026B C0 F0 1065 push b 026D C0 82 1066 push dpl0 026F C0 83 1067 push dph0 0271 C0 D0 1068 push psw 0273 75 D0 00 1069 mov psw,#0x00 0276 C0 86 1070 push dps 0278 75 86 00 1071 mov dps,#0 1072 ;; clear interrupt 027B C2 DB 1073 clr eicon+3 1074 ;; handle interrupt 1075 ;; epilogue 027D D0 86 1076 pop dps 027F D0 D0 1077 pop psw 0281 D0 83 1078 pop dph0 0283 D0 82 1079 pop dpl0 0285 D0 F0 1080 pop b 0287 D0 E0 1081 pop acc 0289 32 1082 reti 1083 028A 1084 xmemread:: 028A E5*09 1085 mov a,ctrllen 028C FF 1086 mov r7,a 028D 24 C0 1087 add a,#-64 028F F5*09 1088 mov ctrllen,a 0291 E5*0A 1089 mov a,ctrllen+1 0293 34 00 1090 addc a,#0 0295 50 12 1091 jnc 0$ 0297 E4 1092 clr a 0298 F5*09 1093 mov ctrllen,a 029A F5*0A 1094 mov ctrllen+1,a 029C F5*06 1095 mov ctrlcode,a 029E 74 02 1096 mov a,#2 ; ack control transfer 02A0 90 7F B4 1097 mov dptr,#EP0CS 02A3 F0 1098 movx @dptr,a 02A4 EF 1099 mov a,r7 02A5 60 25 1100 jz 2$ 02A7 80 04 1101 sjmp 1$ 02A9 F5*0A 1102 0$: mov ctrllen+1,a 02AB 7F 40 1103 mov r7,#64 02AD 8F 00 1104 1$: mov ar0,r7 02AF 85*07 82 1105 mov dpl0,ctrladdr 02B2 85*08 83 1106 mov dph0,ctrladdr+1 02B5 05 86 1107 inc dps 02B7 90 7F 00 1108 mov dptr,#IN0BUF 02BA 15 86 1109 dec dps 02BC E0 1110 3$: movx a,@dptr 02BD A3 1111 inc dptr 02BE 05 86 1112 inc dps 02C0 F0 1113 movx @dptr,a 02C1 A3 1114 inc dptr 02C2 15 86 1115 dec dps 02C4 D8 F6 1116 djnz r0,3$ 02C6 85 82*07 1117 mov ctrladdr,dpl0 02C9 85 83*08 1118 mov ctrladdr+1,dph0 02CC EF 1119 2$: mov a,r7 02CD 90 7F B5 1120 mov dptr,#IN0BC 02D0 F0 1121 movx @dptr,a 02D1 22 1122 ret 1123 02D2 1124 usb_sudav_isr: 02D2 C0 E0 1125 push acc 02D4 C0 F0 1126 push b 02D6 C0 82 1127 push dpl0 02D8 C0 83 1128 push dph0 02DA C0 84 1129 push dpl1 02DC C0 85 1130 push dph1 02DE C0 D0 1131 push psw 02E0 75 D0 00 1132 mov psw,#0x00 02E3 C0 86 1133 push dps 02E5 75 86 00 1134 mov dps,#0 02E8 C0 00 1135 push ar0 02EA C0 07 1136 push ar7 1137 ;; clear interrupt 02EC E5 91 1138 mov a,exif 02EE C2 E4 1139 clr acc.4 02F0 F5 91 1140 mov exif,a 02F2 90 7F AB 1141 mov dptr,#USBIRQ 02F5 74 01 1142 mov a,#0x01 02F7 F0 1143 movx @dptr,a 1144 ;; handle interrupt 02F8 75*06 00 1145 mov ctrlcode,#0 ; reset control out code 02FB 90 7F E9 1146 mov dptr,#SETUPDAT+1 02FE E0 1147 movx a,@dptr ; bRequest field 1148 ;; standard commands 1149 ;; USB_REQ_GET_DESCRIPTOR 02FF B4 06 59 1150 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 0302 90 7F E8 1151 mov dptr,#SETUPDAT ; bRequestType == 0x80 0305 E0 1152 movx a,@dptr 0306 B4 80 4F 1153 cjne a,#USB_DIR_IN,setupstallstd 0309 90 7F EB 1154 mov dptr,#SETUPDAT+3 030C E0 1155 movx a,@dptr 030D B4 01 0C 1156 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 0310 90 7F D4 1157 mov dptr,#SUDPTRH 0313 74s09 1158 mov a,#>devicedescr 0315 F0 1159 movx @dptr,a 0316 A3 1160 inc dptr 0317 74rD5 1161 mov a,#config0descr 032A F0 1171 movx @dptr,a 032B A3 1172 inc dptr 032C 74rE7 1173 mov a,#stringdescr 0346 F5 83 1188 mov dph0,a 0348 E0 1189 movx a,@dptr 0349 F5 F0 1190 mov b,a 034B A3 1191 inc dptr 034C E0 1192 movx a,@dptr 034D 90 7F D4 1193 mov dptr,#SUDPTRH 0350 F0 1194 movx @dptr,a 0351 A3 1195 inc dptr 0352 E5 F0 1196 mov a,b 0354 F0 1197 movx @dptr,a 1198 ; sjmp setupackstd 0355 1199 setupackstd: 0355 02s05r9F 1200 ljmp setupack 0358 1201 setupstallstd: 0358 02s05r9B 1202 ljmp setupstall 035B 1203 cmdnotgetdesc: 1204 ;; USB_REQ_SET_CONFIGURATION 035B B4 09 41 1205 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 035E 90 7F E8 1206 mov dptr,#SETUPDAT 0361 E0 1207 movx a,@dptr 0362 70 F4 1208 jnz setupstallstd 0364 90 7F EA 1209 mov dptr,#SETUPDAT+2 0367 E0 1210 movx a,@dptr 0368 24 FE 1211 add a,#-2 036A 40 EC 1212 jc setupstallstd 036C E0 1213 movx a,@dptr 036D F5*0B 1214 mov numconfig,a 036F 1215 cmdresettoggleshalt: 036F 90 7F D7 1216 mov dptr,#TOGCTL 0372 78 07 1217 mov r0,#7 0374 E8 1218 0$: mov a,r0 0375 44 10 1219 orl a,#0x10 0377 F0 1220 movx @dptr,a 0378 44 30 1221 orl a,#0x30 037A F0 1222 movx @dptr,a 037B E8 1223 mov a,r0 037C F0 1224 movx @dptr,a 037D 44 20 1225 orl a,#0x20 037F F0 1226 movx @dptr,a 0380 D8 F2 1227 djnz r0,0$ 0382 E4 1228 clr a 0383 F0 1229 movx @dptr,a 0384 74 02 1230 mov a,#2 0386 90 7F B6 1231 mov dptr,#IN1CS 0389 78 07 1232 mov r0,#7 038B F0 1233 1$: movx @dptr,a 038C A3 1234 inc dptr 038D A3 1235 inc dptr 038E D8 FB 1236 djnz r0,1$ 0390 90 7F C6 1237 mov dptr,#OUT1CS 0393 78 07 1238 mov r0,#7 0395 F0 1239 2$: movx @dptr,a 0396 A3 1240 inc dptr 0397 A3 1241 inc dptr 0398 D8 FB 1242 djnz r0,2$ 039A 12s07r59 1243 lcall fillusbintr 039D 80 B6 1244 sjmp setupackstd 039F 1245 cmdnotsetconf: 1246 ;; USB_REQ_SET_INTERFACE 039F B4 0B 1A 1247 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 03A2 90 7F E8 1248 mov dptr,#SETUPDAT 03A5 E0 1249 movx a,@dptr 03A6 B4 01 AF 1250 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 03A9 E5*0B 1251 mov a,numconfig 03AB B4 01 AA 1252 cjne a,#1,setupstallstd 03AE 90 7F EC 1253 mov dptr,#SETUPDAT+4 03B1 E0 1254 movx a,@dptr 03B2 70 A4 1255 jnz setupstallstd 03B4 90 7F EA 1256 mov dptr,#SETUPDAT+2 03B7 E0 1257 movx a,@dptr 03B8 F5*0C 1258 mov altsetting,a 03BA 80 B3 1259 sjmp cmdresettoggleshalt 03BC 1260 cmdnotsetint: 1261 ;; USB_REQ_GET_INTERFACE 03BC B4 0A 20 1262 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 03BF 90 7F E8 1263 mov dptr,#SETUPDAT 03C2 E0 1264 movx a,@dptr 03C3 B4 81 92 1265 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 03C6 E5*0B 1266 mov a,numconfig 03C8 B4 01 8D 1267 cjne a,#1,setupstallstd 03CB 90 7F EC 1268 mov dptr,#SETUPDAT+4 03CE E0 1269 movx a,@dptr 03CF 70 87 1270 jnz setupstallstd 03D1 E5*0C 1271 mov a,altsetting 03D3 1272 cmdrespondonebyte: 03D3 90 7F 00 1273 mov dptr,#IN0BUF 03D6 F0 1274 movx @dptr,a 03D7 90 7F B5 1275 mov dptr,#IN0BC 03DA 74 01 1276 mov a,#1 03DC F0 1277 movx @dptr,a 03DD 80 4E 1278 sjmp setupackstd2 03DF 1279 cmdnotgetint: 1280 ;; USB_REQ_GET_CONFIGURATION 03DF B4 08 0B 1281 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 03E2 90 7F E8 1282 mov dptr,#SETUPDAT 03E5 E0 1283 movx a,@dptr 03E6 B4 80 47 1284 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 03E9 E5*0B 1285 mov a,numconfig 03EB 80 E6 1286 sjmp cmdrespondonebyte 03ED 1287 cmdnotgetconf: 1288 ;; USB_REQ_GET_STATUS (0) 03ED 70 44 1289 jnz cmdnotgetstat 03EF 90 7F E8 1290 mov dptr,#SETUPDAT 03F2 E0 1291 movx a,@dptr 03F3 B4 80 11 1292 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 03F6 74 01 1293 mov a,#1 03F8 1294 cmdrespondstat: 03F8 90 7F 00 1295 mov dptr,#IN0BUF 03FB F0 1296 movx @dptr,a 03FC A3 1297 inc dptr 03FD E4 1298 clr a 03FE F0 1299 movx @dptr,a 03FF 90 7F B5 1300 mov dptr,#IN0BC 0402 74 02 1301 mov a,#2 0404 F0 1302 movx @dptr,a 0405 80 26 1303 sjmp setupackstd2 0407 1304 cmdnotgetstatdev: 0407 B4 81 03 1305 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 040A E4 1306 clr a 040B 80 EB 1307 sjmp cmdrespondstat 040D 1308 cmdnotgetstatintf: 040D B4 82 20 1309 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 0410 90 7F EC 1310 mov dptr,#SETUPDAT+4 0413 E0 1311 movx a,@dptr 0414 90 7F C4 1312 mov dptr,#OUT1CS-2 0417 30 E7 03 1313 jnb acc.7,0$ 041A 90 7F B4 1314 mov dptr,#IN1CS-2 041D 54 0F 1315 0$: anl a,#15 041F 60 0F 1316 jz setupstallstd2 0421 20 E3 0C 1317 jb acc.3,setupstallstd2 0424 25 E0 1318 add a,acc 0426 25 82 1319 add a,dpl0 0428 F5 82 1320 mov dpl0,a 042A E0 1321 movx a,@dptr 042B 80 CB 1322 sjmp cmdrespondstat 042D 1323 setupackstd2: 042D 02s05r9F 1324 ljmp setupack 0430 1325 setupstallstd2: 0430 02s05r9B 1326 ljmp setupstall 0433 1327 cmdnotgetstat: 1328 ;; USB_REQ_SET_FEATURE 0433 B4 03 05 1329 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 0436 75 F0 01 1330 mov b,#1 0439 80 06 1331 sjmp handleftr 043B 1332 cmdnotsetftr: 1333 ;; USB_REQ_CLEAR_FEATURE 043B B4 01 3E 1334 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 043E 75 F0 00 1335 mov b,#0 0441 1336 handleftr: 0441 90 7F E8 1337 mov dptr,#SETUPDAT 0444 E0 1338 movx a,@dptr 0445 B4 02 E8 1339 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 0448 A3 1340 inc dptr 0449 A3 1341 inc dptr 044A E0 1342 movx a,@dptr 044B 70 E3 1343 jnz setupstallstd2 ; not ENDPOINT_HALT feature 044D A3 1344 inc dptr 044E E0 1345 movx a,@dptr 044F 70 DF 1346 jnz setupstallstd2 0451 A3 1347 inc dptr 0452 E0 1348 movx a,@dptr 0453 90 7F C4 1349 mov dptr,#OUT1CS-2 0456 30 E7 05 1350 jnb acc.7,0$ 0459 90 7F B4 1351 mov dptr,#IN1CS-2 045C 44 10 1352 orl a,#0x10 045E 20 E3 CF 1353 0$: jb acc.3,setupstallstd2 1354 ;; clear data toggle 0461 54 1F 1355 anl a,#0x1f 0463 05 86 1356 inc dps 0465 90 7F D7 1357 mov dptr,#TOGCTL 0468 F0 1358 movx @dptr,a 0469 44 20 1359 orl a,#0x20 046B F0 1360 movx @dptr,a 046C 54 0F 1361 anl a,#15 046E F0 1362 movx @dptr,a 046F 15 86 1363 dec dps 1364 ;; clear/set ep halt feature 0471 25 E0 1365 add a,acc 0473 25 82 1366 add a,dpl0 0475 F5 82 1367 mov dpl0,a 0477 E5 F0 1368 mov a,b 0479 F0 1369 movx @dptr,a 047A 80 B1 1370 sjmp setupackstd2 047C 1371 cmdnotclrftr: 1372 ;; vendor specific commands 1373 ;; 0xa3 047C B4 A3 3E 1374 cjne a,#0xa3,cmdnota3 047F 90 7F EA 1375 mov dptr,#SETUPDAT+2 0482 E0 1376 movx a,@dptr 0483 F5*07 1377 mov ctrladdr,a 0485 A3 1378 inc dptr 0486 E0 1379 movx a,@dptr 0487 F5*08 1380 mov ctrladdr+1,a 0489 24 50 1381 add a,#80 048B 50 2D 1382 jnc setupstalla3 048D 90 7F EE 1383 mov dptr,#SETUPDAT+6 0490 E0 1384 movx a,@dptr 0491 F5*09 1385 mov ctrllen,a 0493 25*07 1386 add a,ctrladdr 0495 A3 1387 inc dptr 0496 E0 1388 movx a,@dptr 0497 F5*0A 1389 mov ctrllen+1,a 0499 35*08 1390 addc a,ctrladdr+1 049B 40 1D 1391 jc setupstalla3 049D 90 7F E8 1392 mov dptr,#SETUPDAT ; bRequestType == 0x40 04A0 E0 1393 movx a,@dptr 04A1 B4 40 0A 1394 cjne a,#0x40,1$ 04A4 75*06 01 1395 mov ctrlcode,#1 04A7 90 7F C5 1396 mov dptr,#OUT0BC 04AA F0 1397 movx @dptr,a 04AB 02s05rA5 1398 ljmp endusbisr 04AE B4 C0 09 1399 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 04B1 75*06 02 1400 mov ctrlcode,#2 04B4 12s02r8A 1401 lcall xmemread 04B7 02s05rA5 1402 ljmp endusbisr 04BA 1403 setupstalla3: 04BA 02s05r9B 1404 ljmp setupstall 04BD 1405 cmdnota3: 1406 ;; 0xb1 04BD B4 B1 3E 1407 cjne a,#0xb1,cmdnotb1 04C0 90 7F E8 1408 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04C3 E0 1409 movx a,@dptr 04C4 B4 C0 34 1410 cjne a,#0xc0,setupstallb1 04C7 90 7F 00 1411 mov dptr,#IN0BUF 04CA E5*00 1412 mov a,errcode 04CC F0 1413 movx @dptr,a 04CD A3 1414 inc dptr 04CE E5*01 1415 mov a,errval 04D0 F0 1416 movx @dptr,a 04D1 A3 1417 inc dptr 04D2 E5 81 1418 mov a,sp 1419 1420 ;;; xxxx 04D4 C0 82 1421 push dpl0 04D6 C0 83 1422 push dph0 04D8 90 7F DF 1423 mov dptr,#OUT07VAL 04DB E0 1424 movx a,@dptr 04DC D0 83 1425 pop dph0 04DE D0 82 1426 pop dpl0 1427 ;;; xxxx 1428 04E0 F0 1429 movx @dptr,a 04E1 A3 1430 inc dptr 04E2 74 00 1431 mov a,#0 1432 1433 ;;; xxxx 04E4 C0 82 1434 push dpl0 04E6 C0 83 1435 push dph0 04E8 90 7F C8 1436 mov dptr,#OUT2CS 04EB E0 1437 movx a,@dptr 04EC D0 83 1438 pop dph0 04EE D0 82 1439 pop dpl0 1440 ;;; xxxx 1441 04F0 F0 1442 movx @dptr,a 04F1 A3 1443 inc dptr 04F2 90 7F B5 1444 mov dptr,#IN0BC 04F5 74 04 1445 mov a,#4 04F7 F0 1446 movx @dptr,a 04F8 02s05r9F 1447 ljmp setupack 04FB 1448 setupstallb1: 04FB 02s05r9B 1449 ljmp setupstall 04FE 1450 cmdnotb1: 1451 ;; 0xb2 04FE B4 B2 2B 1452 cjne a,#0xb2,cmdnotb2 0501 90 7F E8 1453 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0504 E0 1454 movx a,@dptr 0505 B4 C0 21 1455 cjne a,#0xc0,setupstallb2 0508 90 7F 00 1456 mov dptr,#IN0BUF 050B E5*00 1457 mov a,errcode 050D F0 1458 movx @dptr,a 050E A3 1459 inc dptr 050F E5*01 1460 mov a,errval 0511 F0 1461 movx @dptr,a 0512 A3 1462 inc dptr 0513 E5*02 1463 mov a,cfgcount 0515 F0 1464 movx @dptr,a 0516 A3 1465 inc dptr 0517 E5*03 1466 mov a,cfgcount+1 0519 F0 1467 movx @dptr,a 051A A3 1468 inc dptr 051B E5*05 1469 mov a,irqcount 051D F0 1470 movx @dptr,a 051E 90 7F B5 1471 mov dptr,#IN0BC 0521 74 05 1472 mov a,#5 0523 F0 1473 movx @dptr,a 0524 05*05 1474 inc irqcount 0526 02s05r9F 1475 ljmp setupack 0529 1476 setupstallb2: 0529 02s05r9B 1477 ljmp setupstall 052C 1478 cmdnotb2: 1479 ;; 0xb3 052C B4 B3 2A 1480 cjne a,#0xb3,cmdnotb3 052F 90 7F E8 1481 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0532 E0 1482 movx a,@dptr 0533 B4 C0 20 1483 cjne a,#0xc0,setupstallb3 1484 ;; read EEPROM 0006 1485 serstrlen = 6 0536 75 F0 A0 1486 mov b,#0xa0 ; EEPROM address 0539 90s00r34 1487 mov dptr,#eepromstraddr 053C 7F 01 1488 mov r7,#1 053E 12s00r35 1489 lcall writei2c 0541 70 13 1490 jnz setupstallb3 0543 90 7F 00 1491 mov dptr,#IN0BUF 0546 7F 06 1492 mov r7,#serstrlen 0548 12s00r70 1493 lcall readi2c 054B 70 09 1494 jnz setupstallb3 054D 74 06 1495 mov a,#serstrlen 054F 90 7F B5 1496 mov dptr,#IN0BC 0552 F0 1497 movx @dptr,a 0553 02s05r9F 1498 ljmp setupack 0556 1499 setupstallb3: 0556 02s05r9B 1500 ljmp setupstall 0559 1501 cmdnotb3: 1502 ;; 0xb4 0559 B4 B4 3F 1503 cjne a,#0xb4,cmdnotb4 055C 90 7F EF 1504 mov dptr,#SETUPDAT+7 055F E0 1505 movx a,@dptr 0560 70 36 1506 jnz setupstallb4 0562 90 7F EE 1507 mov dptr,#SETUPDAT+6 0565 E0 1508 movx a,@dptr 0566 F8 1509 mov r0,a 0567 FF 1510 mov r7,a 0568 24 C0 1511 add a,#-64 056A 40 2C 1512 jc setupstallb4 056C 90 7F EC 1513 mov dptr,#SETUPDAT+4 ; wIndex 056F E0 1514 movx a,@dptr 0570 F5 F0 1515 mov b,a 0572 F5*07 1516 mov ctrladdr,a 0574 90 7F E8 1517 mov dptr,#SETUPDAT 0577 E0 1518 movx a,@dptr 0578 B4 40 0A 1519 cjne a,#0x40,0$ ; bRequestType == 0x40 057B 75*06 02 1520 mov ctrlcode,#2 057E 90 7F C5 1521 mov dptr,#OUT0BC 0581 F0 1522 movx @dptr,a 0582 02s05rA5 1523 ljmp endusbisr 0585 B4 C0 10 1524 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 0588 90 7F 00 1525 mov dptr,#IN0BUF 058B 12s00r70 1526 lcall readi2c 058E 70 08 1527 jnz setupstallb4 0590 E8 1528 mov a,r0 0591 90 7F B5 1529 mov dptr,#IN0BC 0594 F0 1530 movx @dptr,a 0595 02s05r9F 1531 ljmp setupack 0598 1532 setupstallb4: 0598 02s05r9B 1533 ljmp setupstall 059B 1534 cmdnotb4: 1535 ;; unknown commands fall through to setupstall 1536 059B 1537 setupstall: 059B 74 03 1538 mov a,#3 059D 80 02 1539 sjmp endsetup 059F 1540 setupack: 059F 74 02 1541 mov a,#2 05A1 1542 endsetup: 05A1 90 7F B4 1543 mov dptr,#EP0CS 05A4 F0 1544 movx @dptr,a 05A5 1545 endusbisr: 1546 ;; epilogue 05A5 D0 07 1547 pop ar7 05A7 D0 00 1548 pop ar0 05A9 D0 86 1549 pop dps 05AB D0 D0 1550 pop psw 05AD D0 85 1551 pop dph1 05AF D0 84 1552 pop dpl1 05B1 D0 83 1553 pop dph0 05B3 D0 82 1554 pop dpl0 05B5 D0 F0 1555 pop b 05B7 D0 E0 1556 pop acc 05B9 32 1557 reti 1558 05BA 1559 usb_sof_isr: 05BA C0 E0 1560 push acc 05BC C0 F0 1561 push b 05BE C0 82 1562 push dpl0 05C0 C0 83 1563 push dph0 05C2 C0 D0 1564 push psw 05C4 75 D0 00 1565 mov psw,#0x00 05C7 C0 86 1566 push dps 05C9 75 86 00 1567 mov dps,#0 1568 ;; clear interrupt 05CC E5 91 1569 mov a,exif 05CE C2 E4 1570 clr acc.4 05D0 F5 91 1571 mov exif,a 05D2 90 7F AB 1572 mov dptr,#USBIRQ 05D5 74 02 1573 mov a,#0x02 05D7 F0 1574 movx @dptr,a 1575 ;; handle interrupt 1576 ;; epilogue 05D8 D0 86 1577 pop dps 05DA D0 D0 1578 pop psw 05DC D0 83 1579 pop dph0 05DE D0 82 1580 pop dpl0 05E0 D0 F0 1581 pop b 05E2 D0 E0 1582 pop acc 05E4 32 1583 reti 1584 1585 05E5 1586 usb_sutok_isr: 05E5 C0 E0 1587 push acc 05E7 C0 F0 1588 push b 05E9 C0 82 1589 push dpl0 05EB C0 83 1590 push dph0 05ED C0 D0 1591 push psw 05EF 75 D0 00 1592 mov psw,#0x00 05F2 C0 86 1593 push dps 05F4 75 86 00 1594 mov dps,#0 1595 ;; clear interrupt 05F7 E5 91 1596 mov a,exif 05F9 C2 E4 1597 clr acc.4 05FB F5 91 1598 mov exif,a 05FD 90 7F AB 1599 mov dptr,#USBIRQ 0600 74 04 1600 mov a,#0x04 0602 F0 1601 movx @dptr,a 1602 ;; handle interrupt 1603 ;; epilogue 0603 D0 86 1604 pop dps 0605 D0 D0 1605 pop psw 0607 D0 83 1606 pop dph0 0609 D0 82 1607 pop dpl0 060B D0 F0 1608 pop b 060D D0 E0 1609 pop acc 060F 32 1610 reti 1611 0610 1612 usb_suspend_isr: 0610 C0 E0 1613 push acc 0612 C0 F0 1614 push b 0614 C0 82 1615 push dpl0 0616 C0 83 1616 push dph0 0618 C0 D0 1617 push psw 061A 75 D0 00 1618 mov psw,#0x00 061D C0 86 1619 push dps 061F 75 86 00 1620 mov dps,#0 1621 ;; clear interrupt 0622 E5 91 1622 mov a,exif 0624 C2 E4 1623 clr acc.4 0626 F5 91 1624 mov exif,a 0628 90 7F AB 1625 mov dptr,#USBIRQ 062B 74 08 1626 mov a,#0x08 062D F0 1627 movx @dptr,a 1628 ;; handle interrupt 1629 ;; epilogue 062E D0 86 1630 pop dps 0630 D0 D0 1631 pop psw 0632 D0 83 1632 pop dph0 0634 D0 82 1633 pop dpl0 0636 D0 F0 1634 pop b 0638 D0 E0 1635 pop acc 063A 32 1636 reti 1637 063B 1638 usb_usbreset_isr: 063B C0 E0 1639 push acc 063D C0 F0 1640 push b 063F C0 82 1641 push dpl0 0641 C0 83 1642 push dph0 0643 C0 D0 1643 push psw 0645 75 D0 00 1644 mov psw,#0x00 0648 C0 86 1645 push dps 064A 75 86 00 1646 mov dps,#0 1647 ;; clear interrupt 064D E5 91 1648 mov a,exif 064F C2 E4 1649 clr acc.4 0651 F5 91 1650 mov exif,a 0653 90 7F AB 1651 mov dptr,#USBIRQ 0656 74 10 1652 mov a,#0x10 0658 F0 1653 movx @dptr,a 1654 ;; handle interrupt 1655 ;; epilogue 0659 D0 86 1656 pop dps 065B D0 D0 1657 pop psw 065D D0 83 1658 pop dph0 065F D0 82 1659 pop dpl0 0661 D0 F0 1660 pop b 0663 D0 E0 1661 pop acc 0665 32 1662 reti 1663 0666 1664 usb_ep0in_isr: 0666 C0 E0 1665 push acc 0668 C0 F0 1666 push b 066A C0 82 1667 push dpl0 066C C0 83 1668 push dph0 066E C0 84 1669 push dpl1 0670 C0 85 1670 push dph1 0672 C0 D0 1671 push psw 0674 75 D0 00 1672 mov psw,#0x00 0677 C0 86 1673 push dps 0679 75 86 00 1674 mov dps,#0 067C C0 00 1675 push ar0 067E C0 07 1676 push ar7 1677 ;; clear interrupt 0680 E5 91 1678 mov a,exif 0682 C2 E4 1679 clr acc.4 0684 F5 91 1680 mov exif,a 0686 90 7F A9 1681 mov dptr,#IN07IRQ 0689 74 01 1682 mov a,#0x01 068B F0 1683 movx @dptr,a 1684 ;; handle interrupt 068C E5*06 1685 mov a,ctrlcode 068E B4 02 05 1686 cjne a,#2,0$ 0691 12s02r8A 1687 lcall xmemread 0694 80 11 1688 sjmp ep0inendisr 0696 90 7F B5 1689 0$: mov dptr,#IN0BC 0699 E4 1690 clr a 069A F0 1691 movx @dptr,a 069B 80 04 1692 sjmp ep0inack 1693 069D 1694 ep0install: 069D 74 03 1695 mov a,#3 069F 80 02 1696 sjmp ep0incs 06A1 1697 ep0inack: 06A1 74 02 1698 mov a,#2 06A3 1699 ep0incs: 06A3 90 7F B4 1700 mov dptr,#EP0CS 06A6 F0 1701 movx @dptr,a 06A7 1702 ep0inendisr: 1703 ;; epilogue 06A7 D0 07 1704 pop ar7 06A9 D0 00 1705 pop ar0 06AB D0 86 1706 pop dps 06AD D0 D0 1707 pop psw 06AF D0 85 1708 pop dph1 06B1 D0 84 1709 pop dpl1 06B3 D0 83 1710 pop dph0 06B5 D0 82 1711 pop dpl0 06B7 D0 F0 1712 pop b 06B9 D0 E0 1713 pop acc 06BB 32 1714 reti 1715 06BC 1716 usb_ep0out_isr: 06BC C0 E0 1717 push acc 06BE C0 F0 1718 push b 06C0 C0 82 1719 push dpl0 06C2 C0 83 1720 push dph0 06C4 C0 84 1721 push dpl1 06C6 C0 85 1722 push dph1 06C8 C0 D0 1723 push psw 06CA 75 D0 00 1724 mov psw,#0x00 06CD C0 86 1725 push dps 06CF 75 86 00 1726 mov dps,#0 06D2 C0 00 1727 push ar0 06D4 C0 06 1728 push ar6 1729 ;; clear interrupt 06D6 E5 91 1730 mov a,exif 06D8 C2 E4 1731 clr acc.4 06DA F5 91 1732 mov exif,a 06DC 90 7F AA 1733 mov dptr,#OUT07IRQ 06DF 74 01 1734 mov a,#0x01 06E1 F0 1735 movx @dptr,a 1736 ;; handle interrupt 06E2 E5*06 1737 mov a,ctrlcode ; check control code 06E4 B4 01 36 1738 cjne a,#0x01,i2cwr 1739 ;; write to external memory 06E7 90 7F C5 1740 mov dptr,#OUT0BC 06EA E0 1741 movx a,@dptr 06EB 60 28 1742 jz 0$ 06ED FF 1743 mov r7,a 06EE C3 1744 clr c 06EF E5*09 1745 mov a,ctrllen 06F1 9F 1746 subb a,r7 06F2 F5*09 1747 mov ctrllen,a 06F4 E5*0A 1748 mov a,ctrllen+1 06F6 94 00 1749 subb a,#0 06F8 F5*0A 1750 mov ctrllen+1,a 06FA 40 38 1751 jc ep0outstall 06FC 90 7E C0 1752 mov dptr,#OUT0BUF 06FF 85*07 84 1753 mov dpl1,ctrladdr 0702 85*08 85 1754 mov dph1,ctrladdr+1 0705 E0 1755 1$: movx a,@dptr 0706 A3 1756 inc dptr 0707 05 86 1757 inc dps 0709 F0 1758 movx @dptr,a 070A A3 1759 inc dptr 070B 15 86 1760 dec dps 070D DF F6 1761 djnz r7,1$ 070F 85 84*07 1762 mov ctrladdr,dpl1 0712 85 85*08 1763 mov ctrladdr+1,dph1 0715 E5*09 1764 0$: mov a,ctrllen 0717 45*0A 1765 orl a,ctrllen+1 0719 60 20 1766 jz ep0outack 071B 80 27 1767 sjmp ep0outendisr 1768 1769 ;; write I2C eeprom 071D B4 02 14 1770 i2cwr: cjne a,#0x02,ep0outstall 0720 90 7F C5 1771 mov dptr,#OUT0BC 0723 E0 1772 movx a,@dptr 0724 60 15 1773 jz ep0outack 0726 FF 1774 mov r7,a 0727 85*07 F0 1775 mov b,ctrladdr 072A 90 7E C0 1776 mov dptr,#OUT0BUF 072D 12s00r35 1777 lcall writei2c 0730 70 02 1778 jnz ep0outstall 0732 80 07 1779 sjmp ep0outack 1780 0734 1781 ep0outstall: 0734 75*06 00 1782 mov ctrlcode,#0 0737 74 03 1783 mov a,#3 0739 80 05 1784 sjmp ep0outcs 073B 1785 ep0outack: 073B 75*06 00 1786 mov ctrlcode,#0 073E 74 02 1787 mov a,#2 0740 1788 ep0outcs: 0740 90 7F B4 1789 mov dptr,#EP0CS 0743 F0 1790 movx @dptr,a 0744 1791 ep0outendisr: 1792 ;; epilogue 0744 D0 06 1793 pop ar6 0746 D0 00 1794 pop ar0 0748 D0 86 1795 pop dps 074A D0 D0 1796 pop psw 074C D0 85 1797 pop dph1 074E D0 84 1798 pop dpl1 0750 D0 83 1799 pop dph0 0752 D0 82 1800 pop dpl0 0754 D0 F0 1801 pop b 0756 D0 E0 1802 pop acc 0758 32 1803 reti 1804 0759 1805 fillusbintr:: 0759 90 7E 80 1806 mov dptr,#IN1BUF 075C E5*00 1807 mov a,errcode 075E F0 1808 movx @dptr,a 075F A3 1809 inc dptr 0760 E5*01 1810 mov a,errval 0762 F0 1811 movx @dptr,a 0763 A3 1812 inc dptr 0764 E5*02 1813 mov a,cfgcount 0766 F0 1814 movx @dptr,a 0767 A3 1815 inc dptr 0768 E5*03 1816 mov a,cfgcount+1 076A F0 1817 movx @dptr,a 076B A3 1818 inc dptr 076C E5*05 1819 mov a,irqcount 076E F0 1820 movx @dptr,a 076F 90 7F B7 1821 mov dptr,#IN1BC 0772 74 05 1822 mov a,#5 0774 F0 1823 movx @dptr,a 0775 05*05 1824 inc irqcount 0777 22 1825 ret 1826 0778 1827 usb_ep1in_isr: 0778 C0 E0 1828 push acc 077A C0 F0 1829 push b 077C C0 82 1830 push dpl0 077E C0 83 1831 push dph0 0780 C0 D0 1832 push psw 0782 75 D0 00 1833 mov psw,#0x00 0785 C0 86 1834 push dps 0787 75 86 00 1835 mov dps,#0 1836 ;; clear interrupt 078A E5 91 1837 mov a,exif 078C C2 E4 1838 clr acc.4 078E F5 91 1839 mov exif,a 0790 90 7F A9 1840 mov dptr,#IN07IRQ 0793 74 02 1841 mov a,#0x02 0795 F0 1842 movx @dptr,a 1843 ;; handle interrupt 0796 12s07r59 1844 lcall fillusbintr 1845 ;; epilogue 0799 D0 86 1846 pop dps 079B D0 D0 1847 pop psw 079D D0 83 1848 pop dph0 079F D0 82 1849 pop dpl0 07A1 D0 F0 1850 pop b 07A3 D0 E0 1851 pop acc 07A5 32 1852 reti 1853 07A6 1854 usb_ep1out_isr: 07A6 C0 E0 1855 push acc 07A8 C0 F0 1856 push b 07AA C0 82 1857 push dpl0 07AC C0 83 1858 push dph0 07AE C0 D0 1859 push psw 07B0 75 D0 00 1860 mov psw,#0x00 07B3 C0 86 1861 push dps 07B5 75 86 00 1862 mov dps,#0 1863 ;; clear interrupt 07B8 E5 91 1864 mov a,exif 07BA C2 E4 1865 clr acc.4 07BC F5 91 1866 mov exif,a 07BE 90 7F AA 1867 mov dptr,#OUT07IRQ 07C1 74 02 1868 mov a,#0x02 07C3 F0 1869 movx @dptr,a 1870 ;; handle interrupt 1871 ;; epilogue 07C4 D0 86 1872 pop dps 07C6 D0 D0 1873 pop psw 07C8 D0 83 1874 pop dph0 07CA D0 82 1875 pop dpl0 07CC D0 F0 1876 pop b 07CE D0 E0 1877 pop acc 07D0 32 1878 reti 1879 07D1 1880 usb_ep2in_isr: 07D1 C0 E0 1881 push acc 07D3 C0 F0 1882 push b 07D5 C0 82 1883 push dpl0 07D7 C0 83 1884 push dph0 07D9 C0 D0 1885 push psw 07DB 75 D0 00 1886 mov psw,#0x00 07DE C0 86 1887 push dps 07E0 75 86 00 1888 mov dps,#0 1889 ;; clear interrupt 07E3 E5 91 1890 mov a,exif 07E5 C2 E4 1891 clr acc.4 07E7 F5 91 1892 mov exif,a 07E9 90 7F A9 1893 mov dptr,#IN07IRQ 07EC 74 04 1894 mov a,#0x04 07EE F0 1895 movx @dptr,a 1896 ;; handle interrupt 1897 ;; epilogue 07EF D0 86 1898 pop dps 07F1 D0 D0 1899 pop psw 07F3 D0 83 1900 pop dph0 07F5 D0 82 1901 pop dpl0 07F7 D0 F0 1902 pop b 07F9 D0 E0 1903 pop acc 07FB 32 1904 reti 1905 07FC 1906 usb_ep2out_isr: 07FC C0 E0 1907 push acc 07FE C0 F0 1908 push b 0800 C0 82 1909 push dpl0 0802 C0 83 1910 push dph0 0804 C0 D0 1911 push psw 0806 75 D0 00 1912 mov psw,#0x00 0809 C0 86 1913 push dps 080B 75 86 00 1914 mov dps,#0 1915 ;; clear interrupt 080E E5 91 1916 mov a,exif 0810 C2 E4 1917 clr acc.4 0812 F5 91 1918 mov exif,a 0814 90 7F AA 1919 mov dptr,#OUT07IRQ 0817 74 04 1920 mov a,#0x04 0819 F0 1921 movx @dptr,a 1922 ;; handle interrupt 1923 ;; epilogue 081A D0 86 1924 pop dps 081C D0 D0 1925 pop psw 081E D0 83 1926 pop dph0 0820 D0 82 1927 pop dpl0 0822 D0 F0 1928 pop b 0824 D0 E0 1929 pop acc 0826 32 1930 reti 1931 0827 1932 usb_ep3in_isr: 0827 C0 E0 1933 push acc 0829 C0 F0 1934 push b 082B C0 82 1935 push dpl0 082D C0 83 1936 push dph0 082F C0 D0 1937 push psw 0831 75 D0 00 1938 mov psw,#0x00 0834 C0 86 1939 push dps 0836 75 86 00 1940 mov dps,#0 1941 ;; clear interrupt 0839 E5 91 1942 mov a,exif 083B C2 E4 1943 clr acc.4 083D F5 91 1944 mov exif,a 083F 90 7F A9 1945 mov dptr,#IN07IRQ 0842 74 08 1946 mov a,#0x08 0844 F0 1947 movx @dptr,a 1948 ;; handle interrupt 1949 ;; epilogue 0845 D0 86 1950 pop dps 0847 D0 D0 1951 pop psw 0849 D0 83 1952 pop dph0 084B D0 82 1953 pop dpl0 084D D0 F0 1954 pop b 084F D0 E0 1955 pop acc 0851 32 1956 reti 1957 0852 1958 usb_ep3out_isr: 0852 C0 E0 1959 push acc 0854 C0 F0 1960 push b 0856 C0 82 1961 push dpl0 0858 C0 83 1962 push dph0 085A C0 D0 1963 push psw 085C 75 D0 00 1964 mov psw,#0x00 085F C0 86 1965 push dps 0861 75 86 00 1966 mov dps,#0 1967 ;; clear interrupt 0864 E5 91 1968 mov a,exif 0866 C2 E4 1969 clr acc.4 0868 F5 91 1970 mov exif,a 086A 90 7F AA 1971 mov dptr,#OUT07IRQ 086D 74 08 1972 mov a,#0x08 086F F0 1973 movx @dptr,a 1974 ;; handle interrupt 1975 ;; epilogue 0870 D0 86 1976 pop dps 0872 D0 D0 1977 pop psw 0874 D0 83 1978 pop dph0 0876 D0 82 1979 pop dpl0 0878 D0 F0 1980 pop b 087A D0 E0 1981 pop acc 087C 32 1982 reti 1983 087D 1984 usb_ep4in_isr: 087D C0 E0 1985 push acc 087F C0 F0 1986 push b 0881 C0 82 1987 push dpl0 0883 C0 83 1988 push dph0 0885 C0 D0 1989 push psw 0887 75 D0 00 1990 mov psw,#0x00 088A C0 86 1991 push dps 088C 75 86 00 1992 mov dps,#0 1993 ;; clear interrupt 088F E5 91 1994 mov a,exif 0891 C2 E4 1995 clr acc.4 0893 F5 91 1996 mov exif,a 0895 90 7F A9 1997 mov dptr,#IN07IRQ 0898 74 10 1998 mov a,#0x10 089A F0 1999 movx @dptr,a 2000 ;; handle interrupt 2001 ;; epilogue 089B D0 86 2002 pop dps 089D D0 D0 2003 pop psw 089F D0 83 2004 pop dph0 08A1 D0 82 2005 pop dpl0 08A3 D0 F0 2006 pop b 08A5 D0 E0 2007 pop acc 08A7 32 2008 reti 2009 08A8 2010 usb_ep4out_isr: 08A8 C0 E0 2011 push acc 08AA C0 F0 2012 push b 08AC C0 82 2013 push dpl0 08AE C0 83 2014 push dph0 08B0 C0 D0 2015 push psw 08B2 75 D0 00 2016 mov psw,#0x00 08B5 C0 86 2017 push dps 08B7 75 86 00 2018 mov dps,#0 2019 ;; clear interrupt 08BA E5 91 2020 mov a,exif 08BC C2 E4 2021 clr acc.4 08BE F5 91 2022 mov exif,a 08C0 90 7F AA 2023 mov dptr,#OUT07IRQ 08C3 74 10 2024 mov a,#0x10 08C5 F0 2025 movx @dptr,a 2026 ;; handle interrupt 2027 ;; epilogue 08C6 D0 86 2028 pop dps 08C8 D0 D0 2029 pop psw 08CA D0 83 2030 pop dph0 08CC D0 82 2031 pop dpl0 08CE D0 F0 2032 pop b 08D0 D0 E0 2033 pop acc 08D2 32 2034 reti 2035 08D3 2036 usb_ep5in_isr: 08D3 C0 E0 2037 push acc 08D5 C0 F0 2038 push b 08D7 C0 82 2039 push dpl0 08D9 C0 83 2040 push dph0 08DB C0 D0 2041 push psw 08DD 75 D0 00 2042 mov psw,#0x00 08E0 C0 86 2043 push dps 08E2 75 86 00 2044 mov dps,#0 2045 ;; clear interrupt 08E5 E5 91 2046 mov a,exif 08E7 C2 E4 2047 clr acc.4 08E9 F5 91 2048 mov exif,a 08EB 90 7F A9 2049 mov dptr,#IN07IRQ 08EE 74 20 2050 mov a,#0x20 08F0 F0 2051 movx @dptr,a 2052 ;; handle interrupt 2053 ;; epilogue 08F1 D0 86 2054 pop dps 08F3 D0 D0 2055 pop psw 08F5 D0 83 2056 pop dph0 08F7 D0 82 2057 pop dpl0 08F9 D0 F0 2058 pop b 08FB D0 E0 2059 pop acc 08FD 32 2060 reti 2061 08FE 2062 usb_ep5out_isr: 08FE C0 E0 2063 push acc 0900 C0 F0 2064 push b 0902 C0 82 2065 push dpl0 0904 C0 83 2066 push dph0 0906 C0 D0 2067 push psw 0908 75 D0 00 2068 mov psw,#0x00 090B C0 86 2069 push dps 090D 75 86 00 2070 mov dps,#0 2071 ;; clear interrupt 0910 E5 91 2072 mov a,exif 0912 C2 E4 2073 clr acc.4 0914 F5 91 2074 mov exif,a 0916 90 7F AA 2075 mov dptr,#OUT07IRQ 0919 74 20 2076 mov a,#0x20 091B F0 2077 movx @dptr,a 2078 ;; handle interrupt 2079 ;; epilogue 091C D0 86 2080 pop dps 091E D0 D0 2081 pop psw 0920 D0 83 2082 pop dph0 0922 D0 82 2083 pop dpl0 0924 D0 F0 2084 pop b 0926 D0 E0 2085 pop acc 0928 32 2086 reti 2087 0929 2088 usb_ep6in_isr: 0929 C0 E0 2089 push acc 092B C0 F0 2090 push b 092D C0 82 2091 push dpl0 092F C0 83 2092 push dph0 0931 C0 D0 2093 push psw 0933 75 D0 00 2094 mov psw,#0x00 0936 C0 86 2095 push dps 0938 75 86 00 2096 mov dps,#0 2097 ;; clear interrupt 093B E5 91 2098 mov a,exif 093D C2 E4 2099 clr acc.4 093F F5 91 2100 mov exif,a 0941 90 7F A9 2101 mov dptr,#IN07IRQ 0944 74 40 2102 mov a,#0x40 0946 F0 2103 movx @dptr,a 2104 ;; handle interrupt 2105 ;; epilogue 0947 D0 86 2106 pop dps 0949 D0 D0 2107 pop psw 094B D0 83 2108 pop dph0 094D D0 82 2109 pop dpl0 094F D0 F0 2110 pop b 0951 D0 E0 2111 pop acc 0953 32 2112 reti 2113 0954 2114 usb_ep6out_isr: 0954 C0 E0 2115 push acc 0956 C0 F0 2116 push b 0958 C0 82 2117 push dpl0 095A C0 83 2118 push dph0 095C C0 D0 2119 push psw 095E 75 D0 00 2120 mov psw,#0x00 0961 C0 86 2121 push dps 0963 75 86 00 2122 mov dps,#0 2123 ;; clear interrupt 0966 E5 91 2124 mov a,exif 0968 C2 E4 2125 clr acc.4 096A F5 91 2126 mov exif,a 096C 90 7F AA 2127 mov dptr,#OUT07IRQ 096F 74 40 2128 mov a,#0x40 0971 F0 2129 movx @dptr,a 2130 ;; handle interrupt 2131 ;; epilogue 0972 D0 86 2132 pop dps 0974 D0 D0 2133 pop psw 0976 D0 83 2134 pop dph0 0978 D0 82 2135 pop dpl0 097A D0 F0 2136 pop b 097C D0 E0 2137 pop acc 097E 32 2138 reti 2139 097F 2140 usb_ep7in_isr: 097F C0 E0 2141 push acc 0981 C0 F0 2142 push b 0983 C0 82 2143 push dpl0 0985 C0 83 2144 push dph0 0987 C0 D0 2145 push psw 0989 75 D0 00 2146 mov psw,#0x00 098C C0 86 2147 push dps 098E 75 86 00 2148 mov dps,#0 2149 ;; clear interrupt 0991 E5 91 2150 mov a,exif 0993 C2 E4 2151 clr acc.4 0995 F5 91 2152 mov exif,a 0997 90 7F A9 2153 mov dptr,#IN07IRQ 099A 74 80 2154 mov a,#0x80 099C F0 2155 movx @dptr,a 2156 ;; handle interrupt 2157 ;; epilogue 099D D0 86 2158 pop dps 099F D0 D0 2159 pop psw 09A1 D0 83 2160 pop dph0 09A3 D0 82 2161 pop dpl0 09A5 D0 F0 2162 pop b 09A7 D0 E0 2163 pop acc 09A9 32 2164 reti 2165 09AA 2166 usb_ep7out_isr: 09AA C0 E0 2167 push acc 09AC C0 F0 2168 push b 09AE C0 82 2169 push dpl0 09B0 C0 83 2170 push dph0 09B2 C0 D0 2171 push psw 09B4 75 D0 00 2172 mov psw,#0x00 09B7 C0 86 2173 push dps 09B9 75 86 00 2174 mov dps,#0 2175 ;; clear interrupt 09BC E5 91 2176 mov a,exif 09BE C2 E4 2177 clr acc.4 09C0 F5 91 2178 mov exif,a 09C2 90 7F AA 2179 mov dptr,#OUT07IRQ 09C5 74 80 2180 mov a,#0x80 09C7 F0 2181 movx @dptr,a 2182 ;; handle interrupt 2183 ;; epilogue 09C8 D0 86 2184 pop dps 09CA D0 D0 2185 pop psw 09CC D0 83 2186 pop dph0 09CE D0 82 2187 pop dpl0 09D0 D0 F0 2188 pop b 09D2 D0 E0 2189 pop acc 09D4 32 2190 reti 2191 2192 ;; ----------------------------------------------------- 2193 ;; USB descriptors 2194 ;; ----------------------------------------------------- 2195 2196 ;; Device and/or Interface Class codes 0000 2197 USB_CLASS_PER_INTERFACE = 0 0001 2198 USB_CLASS_AUDIO = 1 0002 2199 USB_CLASS_COMM = 2 0003 2200 USB_CLASS_HID = 3 0007 2201 USB_CLASS_PRINTER = 7 0008 2202 USB_CLASS_MASS_STORAGE = 8 0009 2203 USB_CLASS_HUB = 9 00FF 2204 USB_CLASS_VENDOR_SPEC = 0xff 2205 2206 ;; Descriptor types 0001 2207 USB_DT_DEVICE = 0x01 0002 2208 USB_DT_CONFIG = 0x02 0003 2209 USB_DT_STRING = 0x03 0004 2210 USB_DT_INTERFACE = 0x04 0005 2211 USB_DT_ENDPOINT = 0x05 2212 2213 ;; Standard requests 0000 2214 USB_REQ_GET_STATUS = 0x00 0001 2215 USB_REQ_CLEAR_FEATURE = 0x01 0003 2216 USB_REQ_SET_FEATURE = 0x03 0005 2217 USB_REQ_SET_ADDRESS = 0x05 0006 2218 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2219 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2220 USB_REQ_GET_CONFIGURATION = 0x08 0009 2221 USB_REQ_SET_CONFIGURATION = 0x09 000A 2222 USB_REQ_GET_INTERFACE = 0x0A 000B 2223 USB_REQ_SET_INTERFACE = 0x0B 000C 2224 USB_REQ_SYNCH_FRAME = 0x0C 2225 2226 ;; USB Request Type and Endpoint Directions 0000 2227 USB_DIR_OUT = 0 0080 2228 USB_DIR_IN = 0x80 2229 0000 2230 USB_TYPE_STANDARD = (0x00 << 5) 0020 2231 USB_TYPE_CLASS = (0x01 << 5) 0040 2232 USB_TYPE_VENDOR = (0x02 << 5) 0060 2233 USB_TYPE_RESERVED = (0x03 << 5) 2234 0000 2235 USB_RECIP_DEVICE = 0x00 0001 2236 USB_RECIP_INTERFACE = 0x01 0002 2237 USB_RECIP_ENDPOINT = 0x02 0003 2238 USB_RECIP_OTHER = 0x03 2239 2240 ;; Request target types. 0000 2241 USB_RT_DEVICE = 0x00 0001 2242 USB_RT_INTERFACE = 0x01 0002 2243 USB_RT_ENDPOINT = 0x02 2244 BAC0 2245 VENDID = 0xbac0 6135 2246 PRODID = 0x6135 2247 09D5 2248 devicedescr: 09D5 12 2249 .db 18 ; bLength 09D6 01 2250 .db USB_DT_DEVICE ; bDescriptorType 09D7 00 01 2251 .db 0x00, 0x01 ; bcdUSB 09D9 FF 2252 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 09DA 00 2253 .db 0 ; bDeviceSubClass 09DB FF 2254 .db 0xff ; bDeviceProtocol 09DC 40 2255 .db 0x40 ; bMaxPacketSize0 09DD C0 BA 2256 .db VENDID ; idVendor 09DF 35 61 2257 .db PRODID ; idProduct 09E1 02 00 2258 .db 0x02,0x00 ; bcdDevice 09E3 01 2259 .db 1 ; iManufacturer 09E4 02 2260 .db 2 ; iProduct 09E5 03 2261 .db 3 ; iSerialNumber 09E6 01 2262 .db 1 ; bNumConfigurations 2263 09E7 2264 config0descr: 09E7 09 2265 .db 9 ; bLength 09E8 02 2266 .db USB_DT_CONFIG ; bDescriptorType 09E9 45 00 2267 .db config0sz ; wTotalLength 09EB 01 2268 .db 1 ; bNumInterfaces 09EC 01 2269 .db 1 ; bConfigurationValue 09ED 00 2270 .db 0 ; iConfiguration 09EE 40 2271 .db 0b01000000 ; bmAttributs (self powered) 09EF 00 2272 .db 0 ; MaxPower (mA/2) (self powered so 0) 2273 ;; interface descriptor I0:A0 09F0 09 2274 .db 9 ; bLength 09F1 04 2275 .db USB_DT_INTERFACE ; bDescriptorType 09F2 00 2276 .db 0 ; bInterfaceNumber 09F3 00 2277 .db 0 ; bAlternateSetting 09F4 03 2278 .db 3 ; bNumEndpoints 09F5 FF 2279 .db 0xff ; bInterfaceClass (vendor specific) 09F6 00 2280 .db 0x00 ; bInterfaceSubClass 09F7 FF 2281 .db 0xff ; bInterfaceProtocol (vendor specific) 09F8 00 2282 .db 0 ; iInterface 2283 ;; endpoint descriptor I0:A0:E0 09F9 07 2284 .db 7 ; bLength 09FA 05 2285 .db USB_DT_ENDPOINT ; bDescriptorType 09FB 81 2286 .db (USB_DIR_IN | 1) ; bEndpointAddress 09FC 02 2287 .db 0x02 ; bmAttributes (bulk) 09FD 40 00 2288 .db 0x40,0x00 ; wMaxPacketSize 09FF 00 2289 .db 0 ; bInterval 2290 ;; endpoint descriptor I0:A0:E1 0A00 07 2291 .db 7 ; bLength 0A01 05 2292 .db USB_DT_ENDPOINT ; bDescriptorType 0A02 82 2293 .db (USB_DIR_IN | 2) ; bEndpointAddress 0A03 02 2294 .db 0x02 ; bmAttributes (bulk) 0A04 40 00 2295 .db 0x40,0x00 ; wMaxPacketSize 0A06 00 2296 .db 0 ; bInterval 2297 ;; endpoint descriptor I0:A0:E2 0A07 07 2298 .db 7 ; bLength 0A08 05 2299 .db USB_DT_ENDPOINT ; bDescriptorType 0A09 02 2300 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0A0A 02 2301 .db 0x02 ; bmAttributes (bulk) 0A0B 40 00 2302 .db 0x40,0x00 ; wMaxPacketSize 0A0D 00 2303 .db 0 ; bInterval 2304 ;; interface descriptor I0:A1 0A0E 09 2305 .db 9 ; bLength 0A0F 04 2306 .db USB_DT_INTERFACE ; bDescriptorType 0A10 00 2307 .db 0 ; bInterfaceNumber 0A11 01 2308 .db 1 ; bAlternateSetting 0A12 03 2309 .db 3 ; bNumEndpoints 0A13 FF 2310 .db 0xff ; bInterfaceClass (vendor specific) 0A14 00 2311 .db 0x00 ; bInterfaceSubClass 0A15 FF 2312 .db 0xff ; bInterfaceProtocol (vendor specific) 0A16 00 2313 .db 0 ; iInterface 2314 ;; endpoint descriptor I0:A1:E0 0A17 07 2315 .db 7 ; bLength 0A18 05 2316 .db USB_DT_ENDPOINT ; bDescriptorType 0A19 81 2317 .db (USB_DIR_IN | 1) ; bEndpointAddress 0A1A 03 2318 .db 0x03 ; bmAttributes (interrupt) 0A1B 40 00 2319 .db 0x40,0x00 ; wMaxPacketSize 0A1D 0A 2320 .db 10 ; bInterval 2321 ;; endpoint descriptor I0:A1:E1 0A1E 07 2322 .db 7 ; bLength 0A1F 05 2323 .db USB_DT_ENDPOINT ; bDescriptorType 0A20 82 2324 .db (USB_DIR_IN | 2) ; bEndpointAddress 0A21 02 2325 .db 0x02 ; bmAttributes (bulk) 0A22 40 00 2326 .db 0x40,0x00 ; wMaxPacketSize 0A24 00 2327 .db 0 ; bInterval 2328 ;; endpoint descriptor I0:A1:E2 0A25 07 2329 .db 7 ; bLength 0A26 05 2330 .db USB_DT_ENDPOINT ; bDescriptorType 0A27 02 2331 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0A28 02 2332 .db 0x02 ; bmAttributes (bulk) 0A29 40 00 2333 .db 0x40,0x00 ; wMaxPacketSize 0A2B 00 2334 .db 0 ; bInterval 2335 0045 2336 config0sz = . - config0descr 2337 0A2C 2338 stringdescr: 0A2Cr34s0A 2339 .db string0 0A2Er38s0A 2340 .db string1 0A30r46s0A 2341 .db string2 0A32r66s0A 2342 .db stringserial 2343 0004 2344 numstrings = (. - stringdescr)/2 2345 0A34 2346 string0: 0A34 04 2347 .db string0sz ; bLength 0A35 03 2348 .db USB_DT_STRING ; bDescriptorType 0A36 00 00 2349 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2350 string0sz = . - string0 2351 0A38 2352 string1: 0A38 0E 2353 .db string1sz ; bLength 0A39 03 2354 .db USB_DT_STRING ; bDescriptorType 0A3A 42 00 61 00 79 00 2355 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2356 string1sz = . - string1 2357 0A46 2358 string2: 0A46 20 2359 .db string2sz ; bLength 0A47 03 2360 .db USB_DT_STRING ; bDescriptorType 0A48 55 00 53 00 42 00 2361 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0A58 28 00 62 00 6C 00 2362 .db '(,0,'b,0,'l,0,'a,0,'n,0,'k,0,'),0 61 00 6E 00 6B 00 29 00 0020 2363 string2sz = . - string2 2364 0A66 2365 stringserial: 0A66 02 2366 .db 2 ; bLength 0A67 03 2367 .db USB_DT_STRING ; bDescriptorType 0A68 00 00 00 00 00 00 2368 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0A78 00 00 00 00 00 00 2369 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2370 baycomusb-0.10.orig/firmware/dl2firmware/main.rst0100644000175100017510000033616707325134422020142 0ustar abaaba 1 .module main 2 3 ;; define code segments link order 4 .area CODE (CODE) 5 .area CSEG (CODE) 6 .area GSINIT (CODE) 7 .area GSINIT2 (CODE) 8 9 ;; ----------------------------------------------------- 10 11 ;; special function registers (which are not predefined) 0082 12 dpl0 = 0x82 0083 13 dph0 = 0x83 0084 14 dpl1 = 0x84 0085 15 dph1 = 0x85 0086 16 dps = 0x86 008E 17 ckcon = 0x8E 008F 18 spc_fnc = 0x8F 0091 19 exif = 0x91 0092 20 mpage = 0x92 0098 21 scon0 = 0x98 0099 22 sbuf0 = 0x99 00C0 23 scon1 = 0xC0 00C1 24 sbuf1 = 0xC1 00D8 25 eicon = 0xD8 00E8 26 eie = 0xE8 00F8 27 eip = 0xF8 28 29 ;; anchor xdata registers 7F00 30 IN0BUF = 0x7F00 7EC0 31 OUT0BUF = 0x7EC0 7E80 32 IN1BUF = 0x7E80 7E40 33 OUT1BUF = 0x7E40 7E00 34 IN2BUF = 0x7E00 7DC0 35 OUT2BUF = 0x7DC0 7D80 36 IN3BUF = 0x7D80 7D40 37 OUT3BUF = 0x7D40 7D00 38 IN4BUF = 0x7D00 7CC0 39 OUT4BUF = 0x7CC0 7C80 40 IN5BUF = 0x7C80 7C40 41 OUT5BUF = 0x7C40 7C00 42 IN6BUF = 0x7C00 7BC0 43 OUT6BUF = 0x7BC0 7B80 44 IN7BUF = 0x7B80 7B40 45 OUT7BUF = 0x7B40 7FE8 46 SETUPBUF = 0x7FE8 7FE8 47 SETUPDAT = 0x7FE8 48 7FB4 49 EP0CS = 0x7FB4 7FB5 50 IN0BC = 0x7FB5 7FB6 51 IN1CS = 0x7FB6 7FB7 52 IN1BC = 0x7FB7 7FB8 53 IN2CS = 0x7FB8 7FB9 54 IN2BC = 0x7FB9 7FBA 55 IN3CS = 0x7FBA 7FBB 56 IN3BC = 0x7FBB 7FBC 57 IN4CS = 0x7FBC 7FBD 58 IN4BC = 0x7FBD 7FBE 59 IN5CS = 0x7FBE 7FBF 60 IN5BC = 0x7FBF 7FC0 61 IN6CS = 0x7FC0 7FC1 62 IN6BC = 0x7FC1 7FC2 63 IN7CS = 0x7FC2 7FC3 64 IN7BC = 0x7FC3 7FC5 65 OUT0BC = 0x7FC5 7FC6 66 OUT1CS = 0x7FC6 7FC7 67 OUT1BC = 0x7FC7 7FC8 68 OUT2CS = 0x7FC8 7FC9 69 OUT2BC = 0x7FC9 7FCA 70 OUT3CS = 0x7FCA 7FCB 71 OUT3BC = 0x7FCB 7FCC 72 OUT4CS = 0x7FCC 7FCD 73 OUT4BC = 0x7FCD 7FCE 74 OUT5CS = 0x7FCE 7FCF 75 OUT5BC = 0x7FCF 7FD0 76 OUT6CS = 0x7FD0 7FD1 77 OUT6BC = 0x7FD1 7FD2 78 OUT7CS = 0x7FD2 7FD3 79 OUT7BC = 0x7FD3 80 7FA8 81 IVEC = 0x7FA8 7FA9 82 IN07IRQ = 0x7FA9 7FAA 83 OUT07IRQ = 0x7FAA 7FAB 84 USBIRQ = 0x7FAB 7FAC 85 IN07IEN = 0x7FAC 7FAD 86 OUT07IEN = 0x7FAD 7FAE 87 USBIEN = 0x7FAE 7FAF 88 USBBAV = 0x7FAF 7FB2 89 BPADDRH = 0x7FB2 7FB3 90 BPADDRL = 0x7FB3 91 7FD4 92 SUDPTRH = 0x7FD4 7FD5 93 SUDPTRL = 0x7FD5 7FD6 94 USBCS = 0x7FD6 7FD7 95 TOGCTL = 0x7FD7 7FD8 96 USBFRAMEL = 0x7FD8 7FD9 97 USBFRAMEH = 0x7FD9 7FDB 98 FNADDR = 0x7FDB 7FDD 99 USBPAIR = 0x7FDD 7FDE 100 IN07VAL = 0x7FDE 7FDF 101 OUT07VAL = 0x7FDF 7FE3 102 AUTOPTRH = 0x7FE3 7FE4 103 AUTOPTRL = 0x7FE4 7FE5 104 AUTODATA = 0x7FE5 105 106 ;; isochronous endpoints. only available if ISODISAB=0 107 7F60 108 OUT8DATA = 0x7F60 7F61 109 OUT9DATA = 0x7F61 7F62 110 OUT10DATA = 0x7F62 7F63 111 OUT11DATA = 0x7F63 7F64 112 OUT12DATA = 0x7F64 7F65 113 OUT13DATA = 0x7F65 7F66 114 OUT14DATA = 0x7F66 7F67 115 OUT15DATA = 0x7F67 116 7F68 117 IN8DATA = 0x7F68 7F69 118 IN9DATA = 0x7F69 7F6A 119 IN10DATA = 0x7F6A 7F6B 120 IN11DATA = 0x7F6B 7F6C 121 IN12DATA = 0x7F6C 7F6D 122 IN13DATA = 0x7F6D 7F6E 123 IN14DATA = 0x7F6E 7F6F 124 IN15DATA = 0x7F6F 125 7F70 126 OUT8BCH = 0x7F70 7F71 127 OUT8BCL = 0x7F71 7F72 128 OUT9BCH = 0x7F72 7F73 129 OUT9BCL = 0x7F73 7F74 130 OUT10BCH = 0x7F74 7F75 131 OUT10BCL = 0x7F75 7F76 132 OUT11BCH = 0x7F76 7F77 133 OUT11BCL = 0x7F77 7F78 134 OUT12BCH = 0x7F78 7F79 135 OUT12BCL = 0x7F79 7F7A 136 OUT13BCH = 0x7F7A 7F7B 137 OUT13BCL = 0x7F7B 7F7C 138 OUT14BCH = 0x7F7C 7F7D 139 OUT14BCL = 0x7F7D 7F7E 140 OUT15BCH = 0x7F7E 7F7F 141 OUT15BCL = 0x7F7F 142 7FF0 143 OUT8ADDR = 0x7FF0 7FF1 144 OUT9ADDR = 0x7FF1 7FF2 145 OUT10ADDR = 0x7FF2 7FF3 146 OUT11ADDR = 0x7FF3 7FF4 147 OUT12ADDR = 0x7FF4 7FF5 148 OUT13ADDR = 0x7FF5 7FF6 149 OUT14ADDR = 0x7FF6 7FF7 150 OUT15ADDR = 0x7FF7 7FF8 151 IN8ADDR = 0x7FF8 7FF9 152 IN9ADDR = 0x7FF9 7FFA 153 IN10ADDR = 0x7FFA 7FFB 154 IN11ADDR = 0x7FFB 7FFC 155 IN12ADDR = 0x7FFC 7FFD 156 IN13ADDR = 0x7FFD 7FFE 157 IN14ADDR = 0x7FFE 7FFF 158 IN15ADDR = 0x7FFF 159 7FA0 160 ISOERR = 0x7FA0 7FA1 161 ISOCTL = 0x7FA1 7FA2 162 ZBCOUNT = 0x7FA2 7FE0 163 INISOVAL = 0x7FE0 7FE1 164 OUTISOVAL = 0x7FE1 7FE2 165 FASTXFR = 0x7FE2 166 167 ;; CPU control registers 168 7F92 169 CPUCS = 0x7F92 170 171 ;; IO port control registers 172 7F93 173 PORTACFG = 0x7F93 7F94 174 PORTBCFG = 0x7F94 7F95 175 PORTCCFG = 0x7F95 7F96 176 OUTA = 0x7F96 7F97 177 OUTB = 0x7F97 7F98 178 OUTC = 0x7F98 7F99 179 PINSA = 0x7F99 7F9A 180 PINSB = 0x7F9A 7F9B 181 PINSC = 0x7F9B 7F9C 182 OEA = 0x7F9C 7F9D 183 OEB = 0x7F9D 7F9E 184 OEC = 0x7F9E 185 186 ;; I2C controller registers 187 7FA5 188 I2CS = 0x7FA5 7FA6 189 I2DAT = 0x7FA6 190 191 ;; FPGA defines 0003 192 XC4K_IRLENGTH = 3 0000 193 XC4K_EXTEST = 0 0001 194 XC4K_PRELOAD = 1 0005 195 XC4K_CONFIGURE = 5 0007 196 XC4K_BYPASS = 7 197 2E64 198 FPGA_CONFIGSIZE = 11876 0158 199 FPGA_BOUND = 344 200 0000 201 SOFTWARECONFIG = 0 202 203 ;; ----------------------------------------------------- 204 205 .area CODE (CODE) 0000 02 0B DF 206 ljmp startup 0003 02 02 36 207 ljmp int0_isr 0006 208 .ds 5 000B 02 02 57 209 ljmp timer0_isr 000E 210 .ds 5 0013 02 02 87 211 ljmp int1_isr 0016 212 .ds 5 001B 02 02 A8 213 ljmp timer1_isr 001E 214 .ds 5 0023 02 02 C9 215 ljmp ser0_isr 0026 216 .ds 5 002B 02 02 EC 217 ljmp timer2_isr 002E 218 .ds 5 0033 02 03 0D 219 ljmp resume_isr 0036 220 .ds 5 003B 02 03 2E 221 ljmp ser1_isr 003E 222 .ds 5 0043 02 01 00 223 ljmp usb_isr 0046 224 .ds 5 004B 02 03 51 225 ljmp i2c_isr 004E 226 .ds 5 0053 02 03 76 227 ljmp int4_isr 0056 228 .ds 5 005B 02 03 9B 229 ljmp int5_isr 005E 230 .ds 5 0063 02 03 C0 231 ljmp int6_isr 232 0066 233 .ds 0x9a 234 ;; USB interrupt dispatch table 0100 235 usb_isr: 0100 02 04 29 236 ljmp usb_sudav_isr 0103 237 .ds 1 0104 02 07 11 238 ljmp usb_sof_isr 0107 239 .ds 1 0108 02 07 3C 240 ljmp usb_sutok_isr 010B 241 .ds 1 010C 02 07 67 242 ljmp usb_suspend_isr 010F 243 .ds 1 0110 02 07 92 244 ljmp usb_usbreset_isr 0113 245 .ds 1 0114 32 246 reti 0115 247 .ds 3 0118 02 07 BD 248 ljmp usb_ep0in_isr 011B 249 .ds 1 011C 02 08 13 250 ljmp usb_ep0out_isr 011F 251 .ds 1 0120 02 08 CF 252 ljmp usb_ep1in_isr 0123 253 .ds 1 0124 02 08 FD 254 ljmp usb_ep1out_isr 0127 255 .ds 1 0128 02 09 28 256 ljmp usb_ep2in_isr 012B 257 .ds 1 012C 02 09 53 258 ljmp usb_ep2out_isr 012F 259 .ds 1 0130 02 09 7E 260 ljmp usb_ep3in_isr 0133 261 .ds 1 0134 02 09 A9 262 ljmp usb_ep3out_isr 0137 263 .ds 1 0138 02 09 D4 264 ljmp usb_ep4in_isr 013B 265 .ds 1 013C 02 09 FF 266 ljmp usb_ep4out_isr 013F 267 .ds 1 0140 02 0A 2A 268 ljmp usb_ep5in_isr 0143 269 .ds 1 0144 02 0A 55 270 ljmp usb_ep5out_isr 0147 271 .ds 1 0148 02 0A 80 272 ljmp usb_ep6in_isr 014B 273 .ds 1 014C 02 0A AB 274 ljmp usb_ep6out_isr 014F 275 .ds 1 0150 02 0A D6 276 ljmp usb_ep7in_isr 0153 277 .ds 1 0154 02 0B 01 278 ljmp usb_ep7out_isr 279 280 ;; ----------------------------------------------------- 281 282 .area BSEG (BIT) 283 284 .area ISEG (DATA) 0080 285 stack: .ds 0x80 286 287 .area DSEG (DATA) 0040 288 errcode: .ds 1 0041 289 errval: .ds 1 0042 290 cfgcount: .ds 2 0044 291 leddiv: .ds 1 0045 292 irqcount: .ds 1 0046 293 ctrlcode: .ds 1 0047 294 ctrladdr: .ds 2 0049 295 ctrllen: .ds 2 296 297 ;; USB state 004B 298 numconfig: .ds 1 004C 299 altsetting: .ds 1 300 301 .area XSEG (DATA) 302 303 304 .area GSINIT (CODE) 0BDF 305 startup: 0BDF 75 81 80 306 mov sp,#stack ; -1 0BE2 E4 307 clr a 0BE3 F5 D0 308 mov psw,a 0BE5 F5 86 309 mov dps,a 310 ;lcall __sdcc_external_startup 311 ;mov a,dpl0 312 ;jz __sdcc_init_data 313 ;ljmp __sdcc_program_startup 0BE7 314 __sdcc_init_data: 315 316 .area GSINIT2 (CODE) 0BE7 317 __sdcc_program_startup: 318 ;; assembler code startup 0BE7 E4 319 clr a 0BE8 F5 40 320 mov errcode,a 0BEA F5 41 321 mov errval,a 0BEC F5 42 322 mov cfgcount,a 0BEE F5 43 323 mov cfgcount+1,a 0BF0 F5 45 324 mov irqcount,a 0BF2 F5 46 325 mov ctrlcode,a 0BF4 F5 86 326 mov dps,a 0BF6 F5 A8 327 mov ie,a 328 ;; some indirect register setup 0BF8 75 8E 31 329 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 330 ;; Timer setup: 331 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 332 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0BFB 75 89 21 333 mov tmod,#0x21 0BFE 75 88 55 334 mov tcon,#0x55 ; INT0/INT1 edge 0C01 75 8D 64 335 mov th1,#256-156 ; 1200 bauds 0C04 75 87 00 336 mov pcon,#0 ; SMOD0=0 337 ;; give Windows a chance to finish the writecpucs control transfer 338 ;; 10ms delay loop 0C07 90 E8 90 339 mov dptr,#(-6000)&0xffff 0C0A A3 340 9$: inc dptr ; 3 cycles 0C0B E5 82 341 mov a,dpl0 ; 2 cycles 0C0D 45 83 342 orl a,dph0 ; 2 cycles 0C0F 70 F9 343 jnz 9$ ; 3 cycles 344 ;; init USB subsystem 0C11 90 7F A1 345 mov dptr,#ISOCTL 0C14 74 01 346 mov a,#1 ; disable ISO endpoints 0C16 F0 347 movx @dptr,a 0C17 90 7F AF 348 mov dptr,#USBBAV 0C1A 74 01 349 mov a,#1 ; enable autovector, disable breakpoint logic 0C1C F0 350 movx @dptr,a 0C1D E4 351 clr a 0C1E 90 7F E0 352 mov dptr,#INISOVAL 0C21 F0 353 movx @dptr,a 0C22 90 7F E1 354 mov dptr,#OUTISOVAL 0C25 F0 355 movx @dptr,a 0C26 90 7F DD 356 mov dptr,#USBPAIR 0C29 74 09 357 mov a,#0x9 ; pair EP 2&3 for input & output 0C2B F0 358 movx @dptr,a 0C2C 90 7F DE 359 mov dptr,#IN07VAL 0C2F 74 07 360 mov a,#0x7 ; enable EP0+EP1+EP2 0C31 F0 361 movx @dptr,a 0C32 90 7F DF 362 mov dptr,#OUT07VAL 0C35 74 05 363 mov a,#0x5 ; enable EP0+EP2 0C37 F0 364 movx @dptr,a 365 ;; USB: init endpoint toggles 0C38 90 7F D7 366 mov dptr,#TOGCTL 0C3B 74 12 367 mov a,#0x12 0C3D F0 368 movx @dptr,a 0C3E 74 32 369 mov a,#0x32 ; clear EP 2 in toggle 0C40 F0 370 movx @dptr,a 0C41 74 02 371 mov a,#0x02 0C43 F0 372 movx @dptr,a 0C44 74 22 373 mov a,#0x22 ; clear EP 2 out toggle 0C46 F0 374 movx @dptr,a 375 ;; configure IO ports 0C47 90 7F 93 376 mov dptr,#PORTACFG 0C4A 74 00 377 mov a,#0 0C4C F0 378 movx @dptr,a 0C4D 90 7F 96 379 mov dptr,#OUTA 0C50 74 80 380 mov a,#0x80 ; set PROG lo 0C52 F0 381 movx @dptr,a 0C53 90 7F 9C 382 mov dptr,#OEA 0C56 74 C2 383 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0C58 F0 384 movx @dptr,a 0C59 90 7F 94 385 mov dptr,#PORTBCFG 0C5C 74 00 386 mov a,#0 0C5E F0 387 movx @dptr,a 0C5F 90 7F 9D 388 mov dptr,#OEB 0C62 74 00 389 mov a,#0 0C64 F0 390 movx @dptr,a 0C65 90 7F 95 391 mov dptr,#PORTCCFG 0C68 74 00 392 mov a,#0 0C6A F0 393 movx @dptr,a 0C6B 90 7F 98 394 mov dptr,#OUTC 0C6E 74 20 395 mov a,#0x20 0C70 F0 396 movx @dptr,a 0C71 90 7F 9E 397 mov dptr,#OEC 0C74 74 2E 398 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 0C76 F0 399 movx @dptr,a 400 ;; enable interrupts 0C77 75 A8 82 401 mov ie,#0x82 ; enable timer 0 0C7A 75 E8 01 402 mov eie,#0x01 ; enable USB interrupts 0C7D 90 7F AE 403 mov dptr,#USBIEN 0C80 74 01 404 mov a,#1 ; enable SUDAV interrupt 0C82 F0 405 movx @dptr,a 0C83 90 7F AC 406 mov dptr,#IN07IEN 0C86 74 03 407 mov a,#3 ; enable EP0+EP1 interrupt 0C88 F0 408 movx @dptr,a 0C89 90 7F AD 409 mov dptr,#OUT07IEN 0C8C 74 01 410 mov a,#1 ; enable EP0 interrupt 0C8E F0 411 movx @dptr,a 412 ;; initialize UART 0 for config loading 0C8F 75 98 20 413 mov scon0,#0x20 ; mode 0, CLK24/4 0C92 75 99 FF 414 mov sbuf0,#0xff 415 ;; initialize USB state 0C95 E4 416 clr a 0C96 F5 4B 417 mov numconfig,a 0C98 F5 4C 418 mov altsetting,a 0000 419 .if 0 420 ;; disconnect from USB bus 421 mov dptr,#USBCS 422 mov a,#10 423 movx @dptr,a 424 ;; wait 0.3 sec 425 mov r2,#30 426 ;; 10ms delay loop 427 0$: mov dptr,#(-6000)&0xffff 428 1$: inc dptr ; 3 cycles 429 mov a,dpl0 ; 2 cycles 430 orl a,dph0 ; 2 cycles 431 jnz 1$ ; 3 cycles 432 djnz r2,0$ 433 ;; reconnect to USB bus 434 mov dptr,#USBCS 435 mov a,#2 ; 8051 handles control 436 movx @dptr,a 437 mov a,#6 ; reconnect, 8051 handles control 438 movx @dptr,a 439 .else 0C9A 90 7F D6 440 mov dptr,#USBCS 0C9D 74 06 441 mov a,#6 ; reconnect, 8051 handles control 0C9F F0 442 movx @dptr,a 443 .endif 444 445 ;; final 0CA0 12 08 B0 446 lcall fillusbintr 447 ;; kludge; first OUT2 packet seems to be bogus 448 ;; wait for packet with length 1 and contents 0x55 449 450 ;; some short delay 0CA3 90 7F 96 451 mov dptr,#OUTA 0CA6 74 82 452 mov a,#0x82 ; set PROG hi 0CA8 F0 453 movx @dptr,a 0CA9 90 7F 99 454 mov dptr,#PINSA 0CAC E0 455 movx a,@dptr 0CAD 30 E2 06 456 jnb acc.2,8$ 457 ;; DONE stuck high 0CB0 75 40 80 458 mov errcode,#0x80 0CB3 02 0D DF 459 ljmp fpgaerr 0CB6 12 01 57 460 8$: lcall jtag_reset_tap 0CB9 7A 05 461 mov r2,#5 0CBB 7B 00 462 mov r3,#0 0CBD 7C 06 463 mov r4,#6 0CBF 12 01 5D 464 lcall jtag_shiftout ; enter SHIFT-IR state 0CC2 7A 08 465 mov r2,#8 0CC4 7B 00 466 mov r3,#0 0CC6 7C 00 467 mov r4,#0 0CC8 12 01 5D 468 lcall jtag_shiftout ; assume max. 8bit IR 0CCB 7A 08 469 mov r2,#8 0CCD 7B 01 470 mov r3,#1 0CCF 7C 00 471 mov r4,#0 0CD1 12 01 5D 472 lcall jtag_shift ; shift in a single bit 0CD4 74 F8 473 mov a,#-(1<(-FPGA_CONFIGSIZE) 0D8A 35 43 600 addc a,cfgcount+1 0D8C 50 B7 601 jnc loadloop 602 ;; configuration download complete, start FPGA 0D8E 90 7F 94 603 mov dptr,#PORTBCFG 0D91 74 00 604 mov a,#0 ; TDI no longer special function pin 0D93 F0 605 movx @dptr,a 0D94 90 7F 95 606 mov dptr,#PORTCCFG 0D97 74 00 607 mov a,#0 ; TCK no longer special function pin 0D99 F0 608 movx @dptr,a 609 ;; wait for done loop 0D9A 7F FA 610 mov r7,#250 0D9C 611 doneloop: 0D9C 90 7F 99 612 mov dptr,#PINSA 0D9F E0 613 movx a,@dptr 0DA0 20 E2 1F 614 jb acc.2,doneactive 0DA3 90 7F 9B 615 mov dptr,#PINSC 0DA6 E0 616 movx a,@dptr 0DA7 20 E2 06 617 jb acc.2,1$ 618 ;; INIT low 0DAA 75 40 90 619 mov errcode,#0x90 0DAD 02 0D DF 620 ljmp fpgaerr 0DB0 90 7F 98 621 1$: mov dptr,#OUTC 0DB3 E0 622 movx a,@dptr 0DB4 D2 E1 623 setb acc.1 0DB6 F0 624 movx @dptr,a 0DB7 C2 E1 625 clr acc.1 0DB9 F0 626 movx @dptr,a 0DBA DF E0 627 djnz r7,doneloop 628 ;; DONE stuck low 0DBC 75 40 91 629 mov errcode,#0x91 0DBF 02 0D DF 630 ljmp fpgaerr 631 0DC2 632 doneactive: 633 ;; generate 16 clock pulses to start up FPGA 0DC2 7F 10 634 mov r7,#16 0DC4 90 7F 98 635 mov dptr,#OUTC 0DC7 E0 636 movx a,@dptr 0DC8 D2 E1 637 0$: setb acc.1 0DCA F0 638 movx @dptr,a 0DCB C2 E1 639 clr acc.1 0DCD F0 640 movx @dptr,a 0DCE DF F8 641 djnz r7,0$ 0DD0 90 7F 95 642 mov dptr,#PORTCCFG 0DD3 74 C0 643 mov a,#0xc0 ; RD/WR is special function pin 0DD5 F0 644 movx @dptr,a 0DD6 75 40 20 645 mov errcode,#0x20 646 0DD9 90 C0 08 647 mov dptr,#0xc008 0DDC 74 C7 648 mov a,#0xc7 0DDE F0 649 movx @dptr,a 650 0DDF 651 fpgaerr: 0DDF 80 FE 652 sjmp fpgaerr 653 654 .area CSEG (CODE) 0002 655 ar2 = 0x02 0003 656 ar3 = 0x03 0004 657 ar4 = 0x04 0005 658 ar5 = 0x05 0006 659 ar6 = 0x06 0007 660 ar7 = 0x07 0000 661 ar0 = 0x00 0001 662 ar1 = 0x01 663 664 ;; jtag_shift 665 ;; r2 = num 666 ;; r3 = tdi 667 ;; r4 = tms 668 ;; return: r7 = tdo 0157 669 jtag_reset_tap: 0157 7A 05 670 mov r2,#5 0159 7B 00 671 mov r3,#0 015B 7C FF 672 mov r4,#0xff 015D 673 jtag_shiftout: 015D 674 jtag_shift: 015D 7E 01 675 mov r6,#1 015F 7F 00 676 mov r7,#0 0161 74 02 677 1$: mov a,#2 0163 CB 678 xch a,r3 0164 13 679 rrc a 0165 CB 680 xch a,r3 0166 92 E6 681 mov acc.6,c 0168 CC 682 xch a,r4 0169 13 683 rrc a 016A CC 684 xch a,r4 016B 92 E7 685 mov acc.7,c 016D 90 7F 96 686 mov dptr,#OUTA 0170 F0 687 movx @dptr,a 0171 90 7F 9B 688 mov dptr,#PINSC 0174 E0 689 movx a,@dptr 0175 30 E0 03 690 jnb acc.0,2$ 0178 EE 691 mov a,r6 0179 42 07 692 orl ar7,a 017B 90 7F 98 693 2$: mov dptr,#OUTC 017E E0 694 movx a,@dptr 017F D2 E1 695 setb acc.1 0181 F0 696 movx @dptr,a 0182 C2 E1 697 clr acc.1 0184 F0 698 movx @dptr,a 0185 EE 699 mov a,r6 0186 23 700 rl a 0187 FE 701 mov r6,a 0188 DA D7 702 djnz r2,1$ 018A 22 703 ret 704 705 ;; EEPROM address where the serial number is located 706 018B 707 eepromstraddr: 018B 10 708 .db 0x10 709 710 ;; I2C Routines 711 ;; note: ckcon should be set to #0x31 to avoid chip bugs 712 018C 713 writei2c: 714 ;; dptr: data to be sent 715 ;; b: device address 716 ;; r7: transfer length 717 ;; return: a: status (bytes remaining, 0xff bus error) 018C 05 86 718 inc dps 018E 90 7F A5 719 mov dptr,#I2CS 0191 C2 F0 720 clr b.0 ; r/w = 0 0193 74 80 721 mov a,#0x80 ; start condition 0195 F0 722 movx @dptr,a 0196 90 7F A6 723 mov dptr,#I2DAT 0199 E5 F0 724 mov a,b 019B F0 725 movx @dptr,a 019C 90 7F A5 726 mov dptr,#I2CS 019F E0 727 0$: movx a,@dptr 01A0 20 E2 20 728 jb acc.2,3$ ; BERR 01A3 30 E0 F9 729 jnb acc.0,0$ ; DONE 01A6 30 E1 0F 730 jnb acc.1,1$ ; ACK 01A9 90 7F A6 731 mov dptr,#I2DAT 01AC 15 86 732 dec dps 01AE E0 733 movx a,@dptr 01AF A3 734 inc dptr 01B0 05 86 735 inc dps 01B2 F0 736 movx @dptr,a 01B3 90 7F A5 737 mov dptr,#I2CS 01B6 DF E7 738 djnz r7,0$ 01B8 74 40 739 1$: mov a,#0x40 ; stop condition 01BA F0 740 movx @dptr,a 01BB E0 741 2$: movx a,@dptr 01BC 20 E6 FC 742 jb acc.6,2$ 01BF 15 86 743 dec dps 01C1 EF 744 mov a,r7 01C2 22 745 ret 01C3 7F FF 746 3$: mov r7,#255 01C5 80 F1 747 sjmp 1$ 748 01C7 749 readi2c: 750 ;; dptr: data to be sent 751 ;; b: device address 752 ;; r7: transfer length 753 ;; return: a: status (bytes remaining, 0xff bus error) 01C7 05 86 754 inc dps 01C9 90 7F A5 755 mov dptr,#I2CS 01CC D2 F0 756 setb b.0 ; r/w = 1 01CE 74 80 757 mov a,#0x80 ; start condition 01D0 F0 758 movx @dptr,a 01D1 90 7F A6 759 mov dptr,#I2DAT 01D4 E5 F0 760 mov a,b 01D6 F0 761 movx @dptr,a 01D7 90 7F A5 762 mov dptr,#I2CS 01DA E0 763 0$: movx a,@dptr 01DB 20 E2 4C 764 jb acc.2,9$ ; BERR 01DE 30 E0 F9 765 jnb acc.0,0$ ; DONE 01E1 30 E1 03 766 jnb acc.1,5$ ; ACK 01E4 EF 767 mov a,r7 01E5 70 0B 768 jnz 1$ 01E7 74 40 769 5$: mov a,#0x40 ; stop condition 01E9 F0 770 movx @dptr,a 01EA E0 771 2$: movx a,@dptr 01EB 20 E6 FC 772 jb acc.6,2$ 01EE 15 86 773 dec dps 01F0 E4 774 clr a 01F1 22 775 ret 01F2 B4 01 03 776 1$: cjne a,#1,3$ 01F5 74 20 777 mov a,#0x20 ; LASTRD = 1 01F7 F0 778 movx @dptr,a 01F8 90 7F A6 779 3$: mov dptr,#I2DAT 01FB E0 780 movx a,@dptr ; initiate first read 01FC 90 7F A5 781 mov dptr,#I2CS 01FF E0 782 4$: movx a,@dptr 0200 20 E2 27 783 jb acc.2,9$ ; BERR 0203 30 E0 F9 784 jnb acc.0,4$ ; DONE 0206 EF 785 mov a,r7 0207 B4 02 03 786 cjne a,#2,6$ 020A 74 20 787 mov a,#0x20 ; LASTRD = 1 020C F0 788 movx @dptr,a 020D B4 01 03 789 6$: cjne a,#1,7$ 0210 74 40 790 mov a,#0x40 ; stop condition 0212 F0 791 movx @dptr,a 0213 90 7F A6 792 7$: mov dptr,#I2DAT 0216 E0 793 movx a,@dptr ; read data 0217 15 86 794 dec dps 0219 F0 795 movx @dptr,a 021A A3 796 inc dptr 021B 05 86 797 inc dps 021D 90 7F A5 798 mov dptr,#I2CS 0220 DF DD 799 djnz r7,4$ 0222 E0 800 8$: movx a,@dptr 0223 20 E6 FC 801 jb acc.6,8$ 0226 15 86 802 dec dps 0228 E4 803 clr a 0229 22 804 ret 022A 74 40 805 9$: mov a,#0x40 ; stop condition 022C F0 806 movx @dptr,a 022D E0 807 10$: movx a,@dptr 022E 20 E6 FC 808 jb acc.6,10$ 0231 74 FF 809 mov a,#255 0233 15 86 810 dec dps 0235 22 811 ret 812 813 ;; ------------------ interrupt handlers ------------------------ 814 0236 815 int0_isr: 0236 C0 E0 816 push acc 0238 C0 F0 817 push b 023A C0 82 818 push dpl0 023C C0 83 819 push dph0 023E C0 D0 820 push psw 0240 75 D0 00 821 mov psw,#0x00 0243 C0 86 822 push dps 0245 75 86 00 823 mov dps,#0 824 ;; clear interrupt 0248 C2 89 825 clr tcon+1 826 ;; handle interrupt 827 ;; epilogue 024A D0 86 828 pop dps 024C D0 D0 829 pop psw 024E D0 83 830 pop dph0 0250 D0 82 831 pop dpl0 0252 D0 F0 832 pop b 0254 D0 E0 833 pop acc 0256 32 834 reti 835 0257 836 timer0_isr: 0257 C0 E0 837 push acc 0259 C0 F0 838 push b 025B C0 82 839 push dpl0 025D C0 83 840 push dph0 025F C0 D0 841 push psw 0261 75 D0 00 842 mov psw,#0x00 0264 C0 86 843 push dps 0266 75 86 00 844 mov dps,#0 845 ;; clear interrupt 0269 C2 8D 846 clr tcon+5 847 ;; handle interrupt 026B 05 44 848 inc leddiv 026D E5 44 849 mov a,leddiv 026F 54 07 850 anl a,#7 0271 70 07 851 jnz 0$ 0273 90 7F 98 852 mov dptr,#OUTC 0276 E0 853 movx a,@dptr 0277 64 08 854 xrl a,#0x08 0279 F0 855 movx @dptr,a 027A 856 0$: 857 ;; epilogue 027A D0 86 858 pop dps 027C D0 D0 859 pop psw 027E D0 83 860 pop dph0 0280 D0 82 861 pop dpl0 0282 D0 F0 862 pop b 0284 D0 E0 863 pop acc 0286 32 864 reti 865 0287 866 int1_isr: 0287 C0 E0 867 push acc 0289 C0 F0 868 push b 028B C0 82 869 push dpl0 028D C0 83 870 push dph0 028F C0 D0 871 push psw 0291 75 D0 00 872 mov psw,#0x00 0294 C0 86 873 push dps 0296 75 86 00 874 mov dps,#0 875 ;; clear interrupt 0299 C2 8B 876 clr tcon+3 877 ;; handle interrupt 878 ;; epilogue 029B D0 86 879 pop dps 029D D0 D0 880 pop psw 029F D0 83 881 pop dph0 02A1 D0 82 882 pop dpl0 02A3 D0 F0 883 pop b 02A5 D0 E0 884 pop acc 02A7 32 885 reti 886 02A8 887 timer1_isr: 02A8 C0 E0 888 push acc 02AA C0 F0 889 push b 02AC C0 82 890 push dpl0 02AE C0 83 891 push dph0 02B0 C0 D0 892 push psw 02B2 75 D0 00 893 mov psw,#0x00 02B5 C0 86 894 push dps 02B7 75 86 00 895 mov dps,#0 896 ;; clear interrupt 02BA C2 8F 897 clr tcon+7 898 ;; handle interrupt 899 ;; epilogue 02BC D0 86 900 pop dps 02BE D0 D0 901 pop psw 02C0 D0 83 902 pop dph0 02C2 D0 82 903 pop dpl0 02C4 D0 F0 904 pop b 02C6 D0 E0 905 pop acc 02C8 32 906 reti 907 02C9 908 ser0_isr: 02C9 C0 E0 909 push acc 02CB C0 F0 910 push b 02CD C0 82 911 push dpl0 02CF C0 83 912 push dph0 02D1 C0 D0 913 push psw 02D3 75 D0 00 914 mov psw,#0x00 02D6 C0 86 915 push dps 02D8 75 86 00 916 mov dps,#0 917 ;; clear interrupt 02DB C2 98 918 clr scon0+0 02DD C2 99 919 clr scon0+1 920 ;; handle interrupt 921 ;; epilogue 02DF D0 86 922 pop dps 02E1 D0 D0 923 pop psw 02E3 D0 83 924 pop dph0 02E5 D0 82 925 pop dpl0 02E7 D0 F0 926 pop b 02E9 D0 E0 927 pop acc 02EB 32 928 reti 929 02EC 930 timer2_isr: 02EC C0 E0 931 push acc 02EE C0 F0 932 push b 02F0 C0 82 933 push dpl0 02F2 C0 83 934 push dph0 02F4 C0 D0 935 push psw 02F6 75 D0 00 936 mov psw,#0x00 02F9 C0 86 937 push dps 02FB 75 86 00 938 mov dps,#0 939 ;; clear interrupt 02FE C2 CF 940 clr t2con+7 941 ;; handle interrupt 942 ;; epilogue 0300 D0 86 943 pop dps 0302 D0 D0 944 pop psw 0304 D0 83 945 pop dph0 0306 D0 82 946 pop dpl0 0308 D0 F0 947 pop b 030A D0 E0 948 pop acc 030C 32 949 reti 950 030D 951 resume_isr: 030D C0 E0 952 push acc 030F C0 F0 953 push b 0311 C0 82 954 push dpl0 0313 C0 83 955 push dph0 0315 C0 D0 956 push psw 0317 75 D0 00 957 mov psw,#0x00 031A C0 86 958 push dps 031C 75 86 00 959 mov dps,#0 960 ;; clear interrupt 031F C2 DC 961 clr eicon+4 962 ;; handle interrupt 963 ;; epilogue 0321 D0 86 964 pop dps 0323 D0 D0 965 pop psw 0325 D0 83 966 pop dph0 0327 D0 82 967 pop dpl0 0329 D0 F0 968 pop b 032B D0 E0 969 pop acc 032D 32 970 reti 971 032E 972 ser1_isr: 032E C0 E0 973 push acc 0330 C0 F0 974 push b 0332 C0 82 975 push dpl0 0334 C0 83 976 push dph0 0336 C0 D0 977 push psw 0338 75 D0 00 978 mov psw,#0x00 033B C0 86 979 push dps 033D 75 86 00 980 mov dps,#0 981 ;; clear interrupt 0340 C2 C0 982 clr scon1+0 0342 C2 C1 983 clr scon1+1 984 ;; handle interrupt 985 ;; epilogue 0344 D0 86 986 pop dps 0346 D0 D0 987 pop psw 0348 D0 83 988 pop dph0 034A D0 82 989 pop dpl0 034C D0 F0 990 pop b 034E D0 E0 991 pop acc 0350 32 992 reti 993 0351 994 i2c_isr: 0351 C0 E0 995 push acc 0353 C0 F0 996 push b 0355 C0 82 997 push dpl0 0357 C0 83 998 push dph0 0359 C0 D0 999 push psw 035B 75 D0 00 1000 mov psw,#0x00 035E C0 86 1001 push dps 0360 75 86 00 1002 mov dps,#0 1003 ;; clear interrupt 0363 E5 91 1004 mov a,exif 0365 C2 E5 1005 clr acc.5 0367 F5 91 1006 mov exif,a 1007 ;; handle interrupt 1008 ;; epilogue 0369 D0 86 1009 pop dps 036B D0 D0 1010 pop psw 036D D0 83 1011 pop dph0 036F D0 82 1012 pop dpl0 0371 D0 F0 1013 pop b 0373 D0 E0 1014 pop acc 0375 32 1015 reti 1016 0376 1017 int4_isr: 0376 C0 E0 1018 push acc 0378 C0 F0 1019 push b 037A C0 82 1020 push dpl0 037C C0 83 1021 push dph0 037E C0 D0 1022 push psw 0380 75 D0 00 1023 mov psw,#0x00 0383 C0 86 1024 push dps 0385 75 86 00 1025 mov dps,#0 1026 ;; clear interrupt 0388 E5 91 1027 mov a,exif 038A C2 E6 1028 clr acc.6 038C F5 91 1029 mov exif,a 1030 ;; handle interrupt 1031 ;; epilogue 038E D0 86 1032 pop dps 0390 D0 D0 1033 pop psw 0392 D0 83 1034 pop dph0 0394 D0 82 1035 pop dpl0 0396 D0 F0 1036 pop b 0398 D0 E0 1037 pop acc 039A 32 1038 reti 1039 039B 1040 int5_isr: 039B C0 E0 1041 push acc 039D C0 F0 1042 push b 039F C0 82 1043 push dpl0 03A1 C0 83 1044 push dph0 03A3 C0 D0 1045 push psw 03A5 75 D0 00 1046 mov psw,#0x00 03A8 C0 86 1047 push dps 03AA 75 86 00 1048 mov dps,#0 1049 ;; clear interrupt 03AD E5 91 1050 mov a,exif 03AF C2 E7 1051 clr acc.7 03B1 F5 91 1052 mov exif,a 1053 ;; handle interrupt 1054 ;; epilogue 03B3 D0 86 1055 pop dps 03B5 D0 D0 1056 pop psw 03B7 D0 83 1057 pop dph0 03B9 D0 82 1058 pop dpl0 03BB D0 F0 1059 pop b 03BD D0 E0 1060 pop acc 03BF 32 1061 reti 1062 03C0 1063 int6_isr: 03C0 C0 E0 1064 push acc 03C2 C0 F0 1065 push b 03C4 C0 82 1066 push dpl0 03C6 C0 83 1067 push dph0 03C8 C0 D0 1068 push psw 03CA 75 D0 00 1069 mov psw,#0x00 03CD C0 86 1070 push dps 03CF 75 86 00 1071 mov dps,#0 1072 ;; clear interrupt 03D2 C2 DB 1073 clr eicon+3 1074 ;; handle interrupt 1075 ;; epilogue 03D4 D0 86 1076 pop dps 03D6 D0 D0 1077 pop psw 03D8 D0 83 1078 pop dph0 03DA D0 82 1079 pop dpl0 03DC D0 F0 1080 pop b 03DE D0 E0 1081 pop acc 03E0 32 1082 reti 1083 03E1 1084 xmemread:: 03E1 E5 49 1085 mov a,ctrllen 03E3 FF 1086 mov r7,a 03E4 24 C0 1087 add a,#-64 03E6 F5 49 1088 mov ctrllen,a 03E8 E5 4A 1089 mov a,ctrllen+1 03EA 34 00 1090 addc a,#0 03EC 50 12 1091 jnc 0$ 03EE E4 1092 clr a 03EF F5 49 1093 mov ctrllen,a 03F1 F5 4A 1094 mov ctrllen+1,a 03F3 F5 46 1095 mov ctrlcode,a 03F5 74 02 1096 mov a,#2 ; ack control transfer 03F7 90 7F B4 1097 mov dptr,#EP0CS 03FA F0 1098 movx @dptr,a 03FB EF 1099 mov a,r7 03FC 60 25 1100 jz 2$ 03FE 80 04 1101 sjmp 1$ 0400 F5 4A 1102 0$: mov ctrllen+1,a 0402 7F 40 1103 mov r7,#64 0404 8F 00 1104 1$: mov ar0,r7 0406 85 47 82 1105 mov dpl0,ctrladdr 0409 85 48 83 1106 mov dph0,ctrladdr+1 040C 05 86 1107 inc dps 040E 90 7F 00 1108 mov dptr,#IN0BUF 0411 15 86 1109 dec dps 0413 E0 1110 3$: movx a,@dptr 0414 A3 1111 inc dptr 0415 05 86 1112 inc dps 0417 F0 1113 movx @dptr,a 0418 A3 1114 inc dptr 0419 15 86 1115 dec dps 041B D8 F6 1116 djnz r0,3$ 041D 85 82 47 1117 mov ctrladdr,dpl0 0420 85 83 48 1118 mov ctrladdr+1,dph0 0423 EF 1119 2$: mov a,r7 0424 90 7F B5 1120 mov dptr,#IN0BC 0427 F0 1121 movx @dptr,a 0428 22 1122 ret 1123 0429 1124 usb_sudav_isr: 0429 C0 E0 1125 push acc 042B C0 F0 1126 push b 042D C0 82 1127 push dpl0 042F C0 83 1128 push dph0 0431 C0 84 1129 push dpl1 0433 C0 85 1130 push dph1 0435 C0 D0 1131 push psw 0437 75 D0 00 1132 mov psw,#0x00 043A C0 86 1133 push dps 043C 75 86 00 1134 mov dps,#0 043F C0 00 1135 push ar0 0441 C0 07 1136 push ar7 1137 ;; clear interrupt 0443 E5 91 1138 mov a,exif 0445 C2 E4 1139 clr acc.4 0447 F5 91 1140 mov exif,a 0449 90 7F AB 1141 mov dptr,#USBIRQ 044C 74 01 1142 mov a,#0x01 044E F0 1143 movx @dptr,a 1144 ;; handle interrupt 044F 75 46 00 1145 mov ctrlcode,#0 ; reset control out code 0452 90 7F E9 1146 mov dptr,#SETUPDAT+1 0455 E0 1147 movx a,@dptr ; bRequest field 1148 ;; standard commands 1149 ;; USB_REQ_GET_DESCRIPTOR 0456 B4 06 59 1150 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 0459 90 7F E8 1151 mov dptr,#SETUPDAT ; bRequestType == 0x80 045C E0 1152 movx a,@dptr 045D B4 80 4F 1153 cjne a,#USB_DIR_IN,setupstallstd 0460 90 7F EB 1154 mov dptr,#SETUPDAT+3 0463 E0 1155 movx a,@dptr 0464 B4 01 0C 1156 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 0467 90 7F D4 1157 mov dptr,#SUDPTRH 046A 74 0B 1158 mov a,#>devicedescr 046C F0 1159 movx @dptr,a 046D A3 1160 inc dptr 046E 74 2C 1161 mov a,#config0descr 0481 F0 1171 movx @dptr,a 0482 A3 1172 inc dptr 0483 74 3E 1173 mov a,#stringdescr 049D F5 83 1188 mov dph0,a 049F E0 1189 movx a,@dptr 04A0 F5 F0 1190 mov b,a 04A2 A3 1191 inc dptr 04A3 E0 1192 movx a,@dptr 04A4 90 7F D4 1193 mov dptr,#SUDPTRH 04A7 F0 1194 movx @dptr,a 04A8 A3 1195 inc dptr 04A9 E5 F0 1196 mov a,b 04AB F0 1197 movx @dptr,a 1198 ; sjmp setupackstd 04AC 1199 setupackstd: 04AC 02 06 F6 1200 ljmp setupack 04AF 1201 setupstallstd: 04AF 02 06 F2 1202 ljmp setupstall 04B2 1203 cmdnotgetdesc: 1204 ;; USB_REQ_SET_CONFIGURATION 04B2 B4 09 41 1205 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 04B5 90 7F E8 1206 mov dptr,#SETUPDAT 04B8 E0 1207 movx a,@dptr 04B9 70 F4 1208 jnz setupstallstd 04BB 90 7F EA 1209 mov dptr,#SETUPDAT+2 04BE E0 1210 movx a,@dptr 04BF 24 FE 1211 add a,#-2 04C1 40 EC 1212 jc setupstallstd 04C3 E0 1213 movx a,@dptr 04C4 F5 4B 1214 mov numconfig,a 04C6 1215 cmdresettoggleshalt: 04C6 90 7F D7 1216 mov dptr,#TOGCTL 04C9 78 07 1217 mov r0,#7 04CB E8 1218 0$: mov a,r0 04CC 44 10 1219 orl a,#0x10 04CE F0 1220 movx @dptr,a 04CF 44 30 1221 orl a,#0x30 04D1 F0 1222 movx @dptr,a 04D2 E8 1223 mov a,r0 04D3 F0 1224 movx @dptr,a 04D4 44 20 1225 orl a,#0x20 04D6 F0 1226 movx @dptr,a 04D7 D8 F2 1227 djnz r0,0$ 04D9 E4 1228 clr a 04DA F0 1229 movx @dptr,a 04DB 74 02 1230 mov a,#2 04DD 90 7F B6 1231 mov dptr,#IN1CS 04E0 78 07 1232 mov r0,#7 04E2 F0 1233 1$: movx @dptr,a 04E3 A3 1234 inc dptr 04E4 A3 1235 inc dptr 04E5 D8 FB 1236 djnz r0,1$ 04E7 90 7F C6 1237 mov dptr,#OUT1CS 04EA 78 07 1238 mov r0,#7 04EC F0 1239 2$: movx @dptr,a 04ED A3 1240 inc dptr 04EE A3 1241 inc dptr 04EF D8 FB 1242 djnz r0,2$ 04F1 12 08 B0 1243 lcall fillusbintr 04F4 80 B6 1244 sjmp setupackstd 04F6 1245 cmdnotsetconf: 1246 ;; USB_REQ_SET_INTERFACE 04F6 B4 0B 1A 1247 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 04F9 90 7F E8 1248 mov dptr,#SETUPDAT 04FC E0 1249 movx a,@dptr 04FD B4 01 AF 1250 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 0500 E5 4B 1251 mov a,numconfig 0502 B4 01 AA 1252 cjne a,#1,setupstallstd 0505 90 7F EC 1253 mov dptr,#SETUPDAT+4 0508 E0 1254 movx a,@dptr 0509 70 A4 1255 jnz setupstallstd 050B 90 7F EA 1256 mov dptr,#SETUPDAT+2 050E E0 1257 movx a,@dptr 050F F5 4C 1258 mov altsetting,a 0511 80 B3 1259 sjmp cmdresettoggleshalt 0513 1260 cmdnotsetint: 1261 ;; USB_REQ_GET_INTERFACE 0513 B4 0A 20 1262 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 0516 90 7F E8 1263 mov dptr,#SETUPDAT 0519 E0 1264 movx a,@dptr 051A B4 81 92 1265 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 051D E5 4B 1266 mov a,numconfig 051F B4 01 8D 1267 cjne a,#1,setupstallstd 0522 90 7F EC 1268 mov dptr,#SETUPDAT+4 0525 E0 1269 movx a,@dptr 0526 70 87 1270 jnz setupstallstd 0528 E5 4C 1271 mov a,altsetting 052A 1272 cmdrespondonebyte: 052A 90 7F 00 1273 mov dptr,#IN0BUF 052D F0 1274 movx @dptr,a 052E 90 7F B5 1275 mov dptr,#IN0BC 0531 74 01 1276 mov a,#1 0533 F0 1277 movx @dptr,a 0534 80 4E 1278 sjmp setupackstd2 0536 1279 cmdnotgetint: 1280 ;; USB_REQ_GET_CONFIGURATION 0536 B4 08 0B 1281 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 0539 90 7F E8 1282 mov dptr,#SETUPDAT 053C E0 1283 movx a,@dptr 053D B4 80 47 1284 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 0540 E5 4B 1285 mov a,numconfig 0542 80 E6 1286 sjmp cmdrespondonebyte 0544 1287 cmdnotgetconf: 1288 ;; USB_REQ_GET_STATUS (0) 0544 70 44 1289 jnz cmdnotgetstat 0546 90 7F E8 1290 mov dptr,#SETUPDAT 0549 E0 1291 movx a,@dptr 054A B4 80 11 1292 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 054D 74 01 1293 mov a,#1 054F 1294 cmdrespondstat: 054F 90 7F 00 1295 mov dptr,#IN0BUF 0552 F0 1296 movx @dptr,a 0553 A3 1297 inc dptr 0554 E4 1298 clr a 0555 F0 1299 movx @dptr,a 0556 90 7F B5 1300 mov dptr,#IN0BC 0559 74 02 1301 mov a,#2 055B F0 1302 movx @dptr,a 055C 80 26 1303 sjmp setupackstd2 055E 1304 cmdnotgetstatdev: 055E B4 81 03 1305 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 0561 E4 1306 clr a 0562 80 EB 1307 sjmp cmdrespondstat 0564 1308 cmdnotgetstatintf: 0564 B4 82 20 1309 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 0567 90 7F EC 1310 mov dptr,#SETUPDAT+4 056A E0 1311 movx a,@dptr 056B 90 7F C4 1312 mov dptr,#OUT1CS-2 056E 30 E7 03 1313 jnb acc.7,0$ 0571 90 7F B4 1314 mov dptr,#IN1CS-2 0574 54 0F 1315 0$: anl a,#15 0576 60 0F 1316 jz setupstallstd2 0578 20 E3 0C 1317 jb acc.3,setupstallstd2 057B 25 E0 1318 add a,acc 057D 25 82 1319 add a,dpl0 057F F5 82 1320 mov dpl0,a 0581 E0 1321 movx a,@dptr 0582 80 CB 1322 sjmp cmdrespondstat 0584 1323 setupackstd2: 0584 02 06 F6 1324 ljmp setupack 0587 1325 setupstallstd2: 0587 02 06 F2 1326 ljmp setupstall 058A 1327 cmdnotgetstat: 1328 ;; USB_REQ_SET_FEATURE 058A B4 03 05 1329 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 058D 75 F0 01 1330 mov b,#1 0590 80 06 1331 sjmp handleftr 0592 1332 cmdnotsetftr: 1333 ;; USB_REQ_CLEAR_FEATURE 0592 B4 01 3E 1334 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 0595 75 F0 00 1335 mov b,#0 0598 1336 handleftr: 0598 90 7F E8 1337 mov dptr,#SETUPDAT 059B E0 1338 movx a,@dptr 059C B4 02 E8 1339 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 059F A3 1340 inc dptr 05A0 A3 1341 inc dptr 05A1 E0 1342 movx a,@dptr 05A2 70 E3 1343 jnz setupstallstd2 ; not ENDPOINT_HALT feature 05A4 A3 1344 inc dptr 05A5 E0 1345 movx a,@dptr 05A6 70 DF 1346 jnz setupstallstd2 05A8 A3 1347 inc dptr 05A9 E0 1348 movx a,@dptr 05AA 90 7F C4 1349 mov dptr,#OUT1CS-2 05AD 30 E7 05 1350 jnb acc.7,0$ 05B0 90 7F B4 1351 mov dptr,#IN1CS-2 05B3 44 10 1352 orl a,#0x10 05B5 20 E3 CF 1353 0$: jb acc.3,setupstallstd2 1354 ;; clear data toggle 05B8 54 1F 1355 anl a,#0x1f 05BA 05 86 1356 inc dps 05BC 90 7F D7 1357 mov dptr,#TOGCTL 05BF F0 1358 movx @dptr,a 05C0 44 20 1359 orl a,#0x20 05C2 F0 1360 movx @dptr,a 05C3 54 0F 1361 anl a,#15 05C5 F0 1362 movx @dptr,a 05C6 15 86 1363 dec dps 1364 ;; clear/set ep halt feature 05C8 25 E0 1365 add a,acc 05CA 25 82 1366 add a,dpl0 05CC F5 82 1367 mov dpl0,a 05CE E5 F0 1368 mov a,b 05D0 F0 1369 movx @dptr,a 05D1 80 B1 1370 sjmp setupackstd2 05D3 1371 cmdnotclrftr: 1372 ;; vendor specific commands 1373 ;; 0xa3 05D3 B4 A3 3E 1374 cjne a,#0xa3,cmdnota3 05D6 90 7F EA 1375 mov dptr,#SETUPDAT+2 05D9 E0 1376 movx a,@dptr 05DA F5 47 1377 mov ctrladdr,a 05DC A3 1378 inc dptr 05DD E0 1379 movx a,@dptr 05DE F5 48 1380 mov ctrladdr+1,a 05E0 24 50 1381 add a,#80 05E2 50 2D 1382 jnc setupstalla3 05E4 90 7F EE 1383 mov dptr,#SETUPDAT+6 05E7 E0 1384 movx a,@dptr 05E8 F5 49 1385 mov ctrllen,a 05EA 25 47 1386 add a,ctrladdr 05EC A3 1387 inc dptr 05ED E0 1388 movx a,@dptr 05EE F5 4A 1389 mov ctrllen+1,a 05F0 35 48 1390 addc a,ctrladdr+1 05F2 40 1D 1391 jc setupstalla3 05F4 90 7F E8 1392 mov dptr,#SETUPDAT ; bRequestType == 0x40 05F7 E0 1393 movx a,@dptr 05F8 B4 40 0A 1394 cjne a,#0x40,1$ 05FB 75 46 01 1395 mov ctrlcode,#1 05FE 90 7F C5 1396 mov dptr,#OUT0BC 0601 F0 1397 movx @dptr,a 0602 02 06 FC 1398 ljmp endusbisr 0605 B4 C0 09 1399 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 0608 75 46 02 1400 mov ctrlcode,#2 060B 12 03 E1 1401 lcall xmemread 060E 02 06 FC 1402 ljmp endusbisr 0611 1403 setupstalla3: 0611 02 06 F2 1404 ljmp setupstall 0614 1405 cmdnota3: 1406 ;; 0xb1 0614 B4 B1 3E 1407 cjne a,#0xb1,cmdnotb1 0617 90 7F E8 1408 mov dptr,#SETUPDAT ; bRequestType == 0xc0 061A E0 1409 movx a,@dptr 061B B4 C0 34 1410 cjne a,#0xc0,setupstallb1 061E 90 7F 00 1411 mov dptr,#IN0BUF 0621 E5 40 1412 mov a,errcode 0623 F0 1413 movx @dptr,a 0624 A3 1414 inc dptr 0625 E5 41 1415 mov a,errval 0627 F0 1416 movx @dptr,a 0628 A3 1417 inc dptr 0629 E5 81 1418 mov a,sp 1419 1420 ;;; xxxx 062B C0 82 1421 push dpl0 062D C0 83 1422 push dph0 062F 90 7F DF 1423 mov dptr,#OUT07VAL 0632 E0 1424 movx a,@dptr 0633 D0 83 1425 pop dph0 0635 D0 82 1426 pop dpl0 1427 ;;; xxxx 1428 0637 F0 1429 movx @dptr,a 0638 A3 1430 inc dptr 0639 74 00 1431 mov a,#0 1432 1433 ;;; xxxx 063B C0 82 1434 push dpl0 063D C0 83 1435 push dph0 063F 90 7F C8 1436 mov dptr,#OUT2CS 0642 E0 1437 movx a,@dptr 0643 D0 83 1438 pop dph0 0645 D0 82 1439 pop dpl0 1440 ;;; xxxx 1441 0647 F0 1442 movx @dptr,a 0648 A3 1443 inc dptr 0649 90 7F B5 1444 mov dptr,#IN0BC 064C 74 04 1445 mov a,#4 064E F0 1446 movx @dptr,a 064F 02 06 F6 1447 ljmp setupack 0652 1448 setupstallb1: 0652 02 06 F2 1449 ljmp setupstall 0655 1450 cmdnotb1: 1451 ;; 0xb2 0655 B4 B2 2B 1452 cjne a,#0xb2,cmdnotb2 0658 90 7F E8 1453 mov dptr,#SETUPDAT ; bRequestType == 0xc0 065B E0 1454 movx a,@dptr 065C B4 C0 21 1455 cjne a,#0xc0,setupstallb2 065F 90 7F 00 1456 mov dptr,#IN0BUF 0662 E5 40 1457 mov a,errcode 0664 F0 1458 movx @dptr,a 0665 A3 1459 inc dptr 0666 E5 41 1460 mov a,errval 0668 F0 1461 movx @dptr,a 0669 A3 1462 inc dptr 066A E5 42 1463 mov a,cfgcount 066C F0 1464 movx @dptr,a 066D A3 1465 inc dptr 066E E5 43 1466 mov a,cfgcount+1 0670 F0 1467 movx @dptr,a 0671 A3 1468 inc dptr 0672 E5 45 1469 mov a,irqcount 0674 F0 1470 movx @dptr,a 0675 90 7F B5 1471 mov dptr,#IN0BC 0678 74 05 1472 mov a,#5 067A F0 1473 movx @dptr,a 067B 05 45 1474 inc irqcount 067D 02 06 F6 1475 ljmp setupack 0680 1476 setupstallb2: 0680 02 06 F2 1477 ljmp setupstall 0683 1478 cmdnotb2: 1479 ;; 0xb3 0683 B4 B3 2A 1480 cjne a,#0xb3,cmdnotb3 0686 90 7F E8 1481 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0689 E0 1482 movx a,@dptr 068A B4 C0 20 1483 cjne a,#0xc0,setupstallb3 1484 ;; read EEPROM 0006 1485 serstrlen = 6 068D 75 F0 A0 1486 mov b,#0xa0 ; EEPROM address 0690 90 01 8B 1487 mov dptr,#eepromstraddr 0693 7F 01 1488 mov r7,#1 0695 12 01 8C 1489 lcall writei2c 0698 70 13 1490 jnz setupstallb3 069A 90 7F 00 1491 mov dptr,#IN0BUF 069D 7F 06 1492 mov r7,#serstrlen 069F 12 01 C7 1493 lcall readi2c 06A2 70 09 1494 jnz setupstallb3 06A4 74 06 1495 mov a,#serstrlen 06A6 90 7F B5 1496 mov dptr,#IN0BC 06A9 F0 1497 movx @dptr,a 06AA 02 06 F6 1498 ljmp setupack 06AD 1499 setupstallb3: 06AD 02 06 F2 1500 ljmp setupstall 06B0 1501 cmdnotb3: 1502 ;; 0xb4 06B0 B4 B4 3F 1503 cjne a,#0xb4,cmdnotb4 06B3 90 7F EF 1504 mov dptr,#SETUPDAT+7 06B6 E0 1505 movx a,@dptr 06B7 70 36 1506 jnz setupstallb4 06B9 90 7F EE 1507 mov dptr,#SETUPDAT+6 06BC E0 1508 movx a,@dptr 06BD F8 1509 mov r0,a 06BE FF 1510 mov r7,a 06BF 24 C0 1511 add a,#-64 06C1 40 2C 1512 jc setupstallb4 06C3 90 7F EC 1513 mov dptr,#SETUPDAT+4 ; wIndex 06C6 E0 1514 movx a,@dptr 06C7 F5 F0 1515 mov b,a 06C9 F5 47 1516 mov ctrladdr,a 06CB 90 7F E8 1517 mov dptr,#SETUPDAT 06CE E0 1518 movx a,@dptr 06CF B4 40 0A 1519 cjne a,#0x40,0$ ; bRequestType == 0x40 06D2 75 46 02 1520 mov ctrlcode,#2 06D5 90 7F C5 1521 mov dptr,#OUT0BC 06D8 F0 1522 movx @dptr,a 06D9 02 06 FC 1523 ljmp endusbisr 06DC B4 C0 10 1524 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 06DF 90 7F 00 1525 mov dptr,#IN0BUF 06E2 12 01 C7 1526 lcall readi2c 06E5 70 08 1527 jnz setupstallb4 06E7 E8 1528 mov a,r0 06E8 90 7F B5 1529 mov dptr,#IN0BC 06EB F0 1530 movx @dptr,a 06EC 02 06 F6 1531 ljmp setupack 06EF 1532 setupstallb4: 06EF 02 06 F2 1533 ljmp setupstall 06F2 1534 cmdnotb4: 1535 ;; unknown commands fall through to setupstall 1536 06F2 1537 setupstall: 06F2 74 03 1538 mov a,#3 06F4 80 02 1539 sjmp endsetup 06F6 1540 setupack: 06F6 74 02 1541 mov a,#2 06F8 1542 endsetup: 06F8 90 7F B4 1543 mov dptr,#EP0CS 06FB F0 1544 movx @dptr,a 06FC 1545 endusbisr: 1546 ;; epilogue 06FC D0 07 1547 pop ar7 06FE D0 00 1548 pop ar0 0700 D0 86 1549 pop dps 0702 D0 D0 1550 pop psw 0704 D0 85 1551 pop dph1 0706 D0 84 1552 pop dpl1 0708 D0 83 1553 pop dph0 070A D0 82 1554 pop dpl0 070C D0 F0 1555 pop b 070E D0 E0 1556 pop acc 0710 32 1557 reti 1558 0711 1559 usb_sof_isr: 0711 C0 E0 1560 push acc 0713 C0 F0 1561 push b 0715 C0 82 1562 push dpl0 0717 C0 83 1563 push dph0 0719 C0 D0 1564 push psw 071B 75 D0 00 1565 mov psw,#0x00 071E C0 86 1566 push dps 0720 75 86 00 1567 mov dps,#0 1568 ;; clear interrupt 0723 E5 91 1569 mov a,exif 0725 C2 E4 1570 clr acc.4 0727 F5 91 1571 mov exif,a 0729 90 7F AB 1572 mov dptr,#USBIRQ 072C 74 02 1573 mov a,#0x02 072E F0 1574 movx @dptr,a 1575 ;; handle interrupt 1576 ;; epilogue 072F D0 86 1577 pop dps 0731 D0 D0 1578 pop psw 0733 D0 83 1579 pop dph0 0735 D0 82 1580 pop dpl0 0737 D0 F0 1581 pop b 0739 D0 E0 1582 pop acc 073B 32 1583 reti 1584 1585 073C 1586 usb_sutok_isr: 073C C0 E0 1587 push acc 073E C0 F0 1588 push b 0740 C0 82 1589 push dpl0 0742 C0 83 1590 push dph0 0744 C0 D0 1591 push psw 0746 75 D0 00 1592 mov psw,#0x00 0749 C0 86 1593 push dps 074B 75 86 00 1594 mov dps,#0 1595 ;; clear interrupt 074E E5 91 1596 mov a,exif 0750 C2 E4 1597 clr acc.4 0752 F5 91 1598 mov exif,a 0754 90 7F AB 1599 mov dptr,#USBIRQ 0757 74 04 1600 mov a,#0x04 0759 F0 1601 movx @dptr,a 1602 ;; handle interrupt 1603 ;; epilogue 075A D0 86 1604 pop dps 075C D0 D0 1605 pop psw 075E D0 83 1606 pop dph0 0760 D0 82 1607 pop dpl0 0762 D0 F0 1608 pop b 0764 D0 E0 1609 pop acc 0766 32 1610 reti 1611 0767 1612 usb_suspend_isr: 0767 C0 E0 1613 push acc 0769 C0 F0 1614 push b 076B C0 82 1615 push dpl0 076D C0 83 1616 push dph0 076F C0 D0 1617 push psw 0771 75 D0 00 1618 mov psw,#0x00 0774 C0 86 1619 push dps 0776 75 86 00 1620 mov dps,#0 1621 ;; clear interrupt 0779 E5 91 1622 mov a,exif 077B C2 E4 1623 clr acc.4 077D F5 91 1624 mov exif,a 077F 90 7F AB 1625 mov dptr,#USBIRQ 0782 74 08 1626 mov a,#0x08 0784 F0 1627 movx @dptr,a 1628 ;; handle interrupt 1629 ;; epilogue 0785 D0 86 1630 pop dps 0787 D0 D0 1631 pop psw 0789 D0 83 1632 pop dph0 078B D0 82 1633 pop dpl0 078D D0 F0 1634 pop b 078F D0 E0 1635 pop acc 0791 32 1636 reti 1637 0792 1638 usb_usbreset_isr: 0792 C0 E0 1639 push acc 0794 C0 F0 1640 push b 0796 C0 82 1641 push dpl0 0798 C0 83 1642 push dph0 079A C0 D0 1643 push psw 079C 75 D0 00 1644 mov psw,#0x00 079F C0 86 1645 push dps 07A1 75 86 00 1646 mov dps,#0 1647 ;; clear interrupt 07A4 E5 91 1648 mov a,exif 07A6 C2 E4 1649 clr acc.4 07A8 F5 91 1650 mov exif,a 07AA 90 7F AB 1651 mov dptr,#USBIRQ 07AD 74 10 1652 mov a,#0x10 07AF F0 1653 movx @dptr,a 1654 ;; handle interrupt 1655 ;; epilogue 07B0 D0 86 1656 pop dps 07B2 D0 D0 1657 pop psw 07B4 D0 83 1658 pop dph0 07B6 D0 82 1659 pop dpl0 07B8 D0 F0 1660 pop b 07BA D0 E0 1661 pop acc 07BC 32 1662 reti 1663 07BD 1664 usb_ep0in_isr: 07BD C0 E0 1665 push acc 07BF C0 F0 1666 push b 07C1 C0 82 1667 push dpl0 07C3 C0 83 1668 push dph0 07C5 C0 84 1669 push dpl1 07C7 C0 85 1670 push dph1 07C9 C0 D0 1671 push psw 07CB 75 D0 00 1672 mov psw,#0x00 07CE C0 86 1673 push dps 07D0 75 86 00 1674 mov dps,#0 07D3 C0 00 1675 push ar0 07D5 C0 07 1676 push ar7 1677 ;; clear interrupt 07D7 E5 91 1678 mov a,exif 07D9 C2 E4 1679 clr acc.4 07DB F5 91 1680 mov exif,a 07DD 90 7F A9 1681 mov dptr,#IN07IRQ 07E0 74 01 1682 mov a,#0x01 07E2 F0 1683 movx @dptr,a 1684 ;; handle interrupt 07E3 E5 46 1685 mov a,ctrlcode 07E5 B4 02 05 1686 cjne a,#2,0$ 07E8 12 03 E1 1687 lcall xmemread 07EB 80 11 1688 sjmp ep0inendisr 07ED 90 7F B5 1689 0$: mov dptr,#IN0BC 07F0 E4 1690 clr a 07F1 F0 1691 movx @dptr,a 07F2 80 04 1692 sjmp ep0inack 1693 07F4 1694 ep0install: 07F4 74 03 1695 mov a,#3 07F6 80 02 1696 sjmp ep0incs 07F8 1697 ep0inack: 07F8 74 02 1698 mov a,#2 07FA 1699 ep0incs: 07FA 90 7F B4 1700 mov dptr,#EP0CS 07FD F0 1701 movx @dptr,a 07FE 1702 ep0inendisr: 1703 ;; epilogue 07FE D0 07 1704 pop ar7 0800 D0 00 1705 pop ar0 0802 D0 86 1706 pop dps 0804 D0 D0 1707 pop psw 0806 D0 85 1708 pop dph1 0808 D0 84 1709 pop dpl1 080A D0 83 1710 pop dph0 080C D0 82 1711 pop dpl0 080E D0 F0 1712 pop b 0810 D0 E0 1713 pop acc 0812 32 1714 reti 1715 0813 1716 usb_ep0out_isr: 0813 C0 E0 1717 push acc 0815 C0 F0 1718 push b 0817 C0 82 1719 push dpl0 0819 C0 83 1720 push dph0 081B C0 84 1721 push dpl1 081D C0 85 1722 push dph1 081F C0 D0 1723 push psw 0821 75 D0 00 1724 mov psw,#0x00 0824 C0 86 1725 push dps 0826 75 86 00 1726 mov dps,#0 0829 C0 00 1727 push ar0 082B C0 06 1728 push ar6 1729 ;; clear interrupt 082D E5 91 1730 mov a,exif 082F C2 E4 1731 clr acc.4 0831 F5 91 1732 mov exif,a 0833 90 7F AA 1733 mov dptr,#OUT07IRQ 0836 74 01 1734 mov a,#0x01 0838 F0 1735 movx @dptr,a 1736 ;; handle interrupt 0839 E5 46 1737 mov a,ctrlcode ; check control code 083B B4 01 36 1738 cjne a,#0x01,i2cwr 1739 ;; write to external memory 083E 90 7F C5 1740 mov dptr,#OUT0BC 0841 E0 1741 movx a,@dptr 0842 60 28 1742 jz 0$ 0844 FF 1743 mov r7,a 0845 C3 1744 clr c 0846 E5 49 1745 mov a,ctrllen 0848 9F 1746 subb a,r7 0849 F5 49 1747 mov ctrllen,a 084B E5 4A 1748 mov a,ctrllen+1 084D 94 00 1749 subb a,#0 084F F5 4A 1750 mov ctrllen+1,a 0851 40 38 1751 jc ep0outstall 0853 90 7E C0 1752 mov dptr,#OUT0BUF 0856 85 47 84 1753 mov dpl1,ctrladdr 0859 85 48 85 1754 mov dph1,ctrladdr+1 085C E0 1755 1$: movx a,@dptr 085D A3 1756 inc dptr 085E 05 86 1757 inc dps 0860 F0 1758 movx @dptr,a 0861 A3 1759 inc dptr 0862 15 86 1760 dec dps 0864 DF F6 1761 djnz r7,1$ 0866 85 84 47 1762 mov ctrladdr,dpl1 0869 85 85 48 1763 mov ctrladdr+1,dph1 086C E5 49 1764 0$: mov a,ctrllen 086E 45 4A 1765 orl a,ctrllen+1 0870 60 20 1766 jz ep0outack 0872 80 27 1767 sjmp ep0outendisr 1768 1769 ;; write I2C eeprom 0874 B4 02 14 1770 i2cwr: cjne a,#0x02,ep0outstall 0877 90 7F C5 1771 mov dptr,#OUT0BC 087A E0 1772 movx a,@dptr 087B 60 15 1773 jz ep0outack 087D FF 1774 mov r7,a 087E 85 47 F0 1775 mov b,ctrladdr 0881 90 7E C0 1776 mov dptr,#OUT0BUF 0884 12 01 8C 1777 lcall writei2c 0887 70 02 1778 jnz ep0outstall 0889 80 07 1779 sjmp ep0outack 1780 088B 1781 ep0outstall: 088B 75 46 00 1782 mov ctrlcode,#0 088E 74 03 1783 mov a,#3 0890 80 05 1784 sjmp ep0outcs 0892 1785 ep0outack: 0892 75 46 00 1786 mov ctrlcode,#0 0895 74 02 1787 mov a,#2 0897 1788 ep0outcs: 0897 90 7F B4 1789 mov dptr,#EP0CS 089A F0 1790 movx @dptr,a 089B 1791 ep0outendisr: 1792 ;; epilogue 089B D0 06 1793 pop ar6 089D D0 00 1794 pop ar0 089F D0 86 1795 pop dps 08A1 D0 D0 1796 pop psw 08A3 D0 85 1797 pop dph1 08A5 D0 84 1798 pop dpl1 08A7 D0 83 1799 pop dph0 08A9 D0 82 1800 pop dpl0 08AB D0 F0 1801 pop b 08AD D0 E0 1802 pop acc 08AF 32 1803 reti 1804 08B0 1805 fillusbintr:: 08B0 90 7E 80 1806 mov dptr,#IN1BUF 08B3 E5 40 1807 mov a,errcode 08B5 F0 1808 movx @dptr,a 08B6 A3 1809 inc dptr 08B7 E5 41 1810 mov a,errval 08B9 F0 1811 movx @dptr,a 08BA A3 1812 inc dptr 08BB E5 42 1813 mov a,cfgcount 08BD F0 1814 movx @dptr,a 08BE A3 1815 inc dptr 08BF E5 43 1816 mov a,cfgcount+1 08C1 F0 1817 movx @dptr,a 08C2 A3 1818 inc dptr 08C3 E5 45 1819 mov a,irqcount 08C5 F0 1820 movx @dptr,a 08C6 90 7F B7 1821 mov dptr,#IN1BC 08C9 74 05 1822 mov a,#5 08CB F0 1823 movx @dptr,a 08CC 05 45 1824 inc irqcount 08CE 22 1825 ret 1826 08CF 1827 usb_ep1in_isr: 08CF C0 E0 1828 push acc 08D1 C0 F0 1829 push b 08D3 C0 82 1830 push dpl0 08D5 C0 83 1831 push dph0 08D7 C0 D0 1832 push psw 08D9 75 D0 00 1833 mov psw,#0x00 08DC C0 86 1834 push dps 08DE 75 86 00 1835 mov dps,#0 1836 ;; clear interrupt 08E1 E5 91 1837 mov a,exif 08E3 C2 E4 1838 clr acc.4 08E5 F5 91 1839 mov exif,a 08E7 90 7F A9 1840 mov dptr,#IN07IRQ 08EA 74 02 1841 mov a,#0x02 08EC F0 1842 movx @dptr,a 1843 ;; handle interrupt 08ED 12 08 B0 1844 lcall fillusbintr 1845 ;; epilogue 08F0 D0 86 1846 pop dps 08F2 D0 D0 1847 pop psw 08F4 D0 83 1848 pop dph0 08F6 D0 82 1849 pop dpl0 08F8 D0 F0 1850 pop b 08FA D0 E0 1851 pop acc 08FC 32 1852 reti 1853 08FD 1854 usb_ep1out_isr: 08FD C0 E0 1855 push acc 08FF C0 F0 1856 push b 0901 C0 82 1857 push dpl0 0903 C0 83 1858 push dph0 0905 C0 D0 1859 push psw 0907 75 D0 00 1860 mov psw,#0x00 090A C0 86 1861 push dps 090C 75 86 00 1862 mov dps,#0 1863 ;; clear interrupt 090F E5 91 1864 mov a,exif 0911 C2 E4 1865 clr acc.4 0913 F5 91 1866 mov exif,a 0915 90 7F AA 1867 mov dptr,#OUT07IRQ 0918 74 02 1868 mov a,#0x02 091A F0 1869 movx @dptr,a 1870 ;; handle interrupt 1871 ;; epilogue 091B D0 86 1872 pop dps 091D D0 D0 1873 pop psw 091F D0 83 1874 pop dph0 0921 D0 82 1875 pop dpl0 0923 D0 F0 1876 pop b 0925 D0 E0 1877 pop acc 0927 32 1878 reti 1879 0928 1880 usb_ep2in_isr: 0928 C0 E0 1881 push acc 092A C0 F0 1882 push b 092C C0 82 1883 push dpl0 092E C0 83 1884 push dph0 0930 C0 D0 1885 push psw 0932 75 D0 00 1886 mov psw,#0x00 0935 C0 86 1887 push dps 0937 75 86 00 1888 mov dps,#0 1889 ;; clear interrupt 093A E5 91 1890 mov a,exif 093C C2 E4 1891 clr acc.4 093E F5 91 1892 mov exif,a 0940 90 7F A9 1893 mov dptr,#IN07IRQ 0943 74 04 1894 mov a,#0x04 0945 F0 1895 movx @dptr,a 1896 ;; handle interrupt 1897 ;; epilogue 0946 D0 86 1898 pop dps 0948 D0 D0 1899 pop psw 094A D0 83 1900 pop dph0 094C D0 82 1901 pop dpl0 094E D0 F0 1902 pop b 0950 D0 E0 1903 pop acc 0952 32 1904 reti 1905 0953 1906 usb_ep2out_isr: 0953 C0 E0 1907 push acc 0955 C0 F0 1908 push b 0957 C0 82 1909 push dpl0 0959 C0 83 1910 push dph0 095B C0 D0 1911 push psw 095D 75 D0 00 1912 mov psw,#0x00 0960 C0 86 1913 push dps 0962 75 86 00 1914 mov dps,#0 1915 ;; clear interrupt 0965 E5 91 1916 mov a,exif 0967 C2 E4 1917 clr acc.4 0969 F5 91 1918 mov exif,a 096B 90 7F AA 1919 mov dptr,#OUT07IRQ 096E 74 04 1920 mov a,#0x04 0970 F0 1921 movx @dptr,a 1922 ;; handle interrupt 1923 ;; epilogue 0971 D0 86 1924 pop dps 0973 D0 D0 1925 pop psw 0975 D0 83 1926 pop dph0 0977 D0 82 1927 pop dpl0 0979 D0 F0 1928 pop b 097B D0 E0 1929 pop acc 097D 32 1930 reti 1931 097E 1932 usb_ep3in_isr: 097E C0 E0 1933 push acc 0980 C0 F0 1934 push b 0982 C0 82 1935 push dpl0 0984 C0 83 1936 push dph0 0986 C0 D0 1937 push psw 0988 75 D0 00 1938 mov psw,#0x00 098B C0 86 1939 push dps 098D 75 86 00 1940 mov dps,#0 1941 ;; clear interrupt 0990 E5 91 1942 mov a,exif 0992 C2 E4 1943 clr acc.4 0994 F5 91 1944 mov exif,a 0996 90 7F A9 1945 mov dptr,#IN07IRQ 0999 74 08 1946 mov a,#0x08 099B F0 1947 movx @dptr,a 1948 ;; handle interrupt 1949 ;; epilogue 099C D0 86 1950 pop dps 099E D0 D0 1951 pop psw 09A0 D0 83 1952 pop dph0 09A2 D0 82 1953 pop dpl0 09A4 D0 F0 1954 pop b 09A6 D0 E0 1955 pop acc 09A8 32 1956 reti 1957 09A9 1958 usb_ep3out_isr: 09A9 C0 E0 1959 push acc 09AB C0 F0 1960 push b 09AD C0 82 1961 push dpl0 09AF C0 83 1962 push dph0 09B1 C0 D0 1963 push psw 09B3 75 D0 00 1964 mov psw,#0x00 09B6 C0 86 1965 push dps 09B8 75 86 00 1966 mov dps,#0 1967 ;; clear interrupt 09BB E5 91 1968 mov a,exif 09BD C2 E4 1969 clr acc.4 09BF F5 91 1970 mov exif,a 09C1 90 7F AA 1971 mov dptr,#OUT07IRQ 09C4 74 08 1972 mov a,#0x08 09C6 F0 1973 movx @dptr,a 1974 ;; handle interrupt 1975 ;; epilogue 09C7 D0 86 1976 pop dps 09C9 D0 D0 1977 pop psw 09CB D0 83 1978 pop dph0 09CD D0 82 1979 pop dpl0 09CF D0 F0 1980 pop b 09D1 D0 E0 1981 pop acc 09D3 32 1982 reti 1983 09D4 1984 usb_ep4in_isr: 09D4 C0 E0 1985 push acc 09D6 C0 F0 1986 push b 09D8 C0 82 1987 push dpl0 09DA C0 83 1988 push dph0 09DC C0 D0 1989 push psw 09DE 75 D0 00 1990 mov psw,#0x00 09E1 C0 86 1991 push dps 09E3 75 86 00 1992 mov dps,#0 1993 ;; clear interrupt 09E6 E5 91 1994 mov a,exif 09E8 C2 E4 1995 clr acc.4 09EA F5 91 1996 mov exif,a 09EC 90 7F A9 1997 mov dptr,#IN07IRQ 09EF 74 10 1998 mov a,#0x10 09F1 F0 1999 movx @dptr,a 2000 ;; handle interrupt 2001 ;; epilogue 09F2 D0 86 2002 pop dps 09F4 D0 D0 2003 pop psw 09F6 D0 83 2004 pop dph0 09F8 D0 82 2005 pop dpl0 09FA D0 F0 2006 pop b 09FC D0 E0 2007 pop acc 09FE 32 2008 reti 2009 09FF 2010 usb_ep4out_isr: 09FF C0 E0 2011 push acc 0A01 C0 F0 2012 push b 0A03 C0 82 2013 push dpl0 0A05 C0 83 2014 push dph0 0A07 C0 D0 2015 push psw 0A09 75 D0 00 2016 mov psw,#0x00 0A0C C0 86 2017 push dps 0A0E 75 86 00 2018 mov dps,#0 2019 ;; clear interrupt 0A11 E5 91 2020 mov a,exif 0A13 C2 E4 2021 clr acc.4 0A15 F5 91 2022 mov exif,a 0A17 90 7F AA 2023 mov dptr,#OUT07IRQ 0A1A 74 10 2024 mov a,#0x10 0A1C F0 2025 movx @dptr,a 2026 ;; handle interrupt 2027 ;; epilogue 0A1D D0 86 2028 pop dps 0A1F D0 D0 2029 pop psw 0A21 D0 83 2030 pop dph0 0A23 D0 82 2031 pop dpl0 0A25 D0 F0 2032 pop b 0A27 D0 E0 2033 pop acc 0A29 32 2034 reti 2035 0A2A 2036 usb_ep5in_isr: 0A2A C0 E0 2037 push acc 0A2C C0 F0 2038 push b 0A2E C0 82 2039 push dpl0 0A30 C0 83 2040 push dph0 0A32 C0 D0 2041 push psw 0A34 75 D0 00 2042 mov psw,#0x00 0A37 C0 86 2043 push dps 0A39 75 86 00 2044 mov dps,#0 2045 ;; clear interrupt 0A3C E5 91 2046 mov a,exif 0A3E C2 E4 2047 clr acc.4 0A40 F5 91 2048 mov exif,a 0A42 90 7F A9 2049 mov dptr,#IN07IRQ 0A45 74 20 2050 mov a,#0x20 0A47 F0 2051 movx @dptr,a 2052 ;; handle interrupt 2053 ;; epilogue 0A48 D0 86 2054 pop dps 0A4A D0 D0 2055 pop psw 0A4C D0 83 2056 pop dph0 0A4E D0 82 2057 pop dpl0 0A50 D0 F0 2058 pop b 0A52 D0 E0 2059 pop acc 0A54 32 2060 reti 2061 0A55 2062 usb_ep5out_isr: 0A55 C0 E0 2063 push acc 0A57 C0 F0 2064 push b 0A59 C0 82 2065 push dpl0 0A5B C0 83 2066 push dph0 0A5D C0 D0 2067 push psw 0A5F 75 D0 00 2068 mov psw,#0x00 0A62 C0 86 2069 push dps 0A64 75 86 00 2070 mov dps,#0 2071 ;; clear interrupt 0A67 E5 91 2072 mov a,exif 0A69 C2 E4 2073 clr acc.4 0A6B F5 91 2074 mov exif,a 0A6D 90 7F AA 2075 mov dptr,#OUT07IRQ 0A70 74 20 2076 mov a,#0x20 0A72 F0 2077 movx @dptr,a 2078 ;; handle interrupt 2079 ;; epilogue 0A73 D0 86 2080 pop dps 0A75 D0 D0 2081 pop psw 0A77 D0 83 2082 pop dph0 0A79 D0 82 2083 pop dpl0 0A7B D0 F0 2084 pop b 0A7D D0 E0 2085 pop acc 0A7F 32 2086 reti 2087 0A80 2088 usb_ep6in_isr: 0A80 C0 E0 2089 push acc 0A82 C0 F0 2090 push b 0A84 C0 82 2091 push dpl0 0A86 C0 83 2092 push dph0 0A88 C0 D0 2093 push psw 0A8A 75 D0 00 2094 mov psw,#0x00 0A8D C0 86 2095 push dps 0A8F 75 86 00 2096 mov dps,#0 2097 ;; clear interrupt 0A92 E5 91 2098 mov a,exif 0A94 C2 E4 2099 clr acc.4 0A96 F5 91 2100 mov exif,a 0A98 90 7F A9 2101 mov dptr,#IN07IRQ 0A9B 74 40 2102 mov a,#0x40 0A9D F0 2103 movx @dptr,a 2104 ;; handle interrupt 2105 ;; epilogue 0A9E D0 86 2106 pop dps 0AA0 D0 D0 2107 pop psw 0AA2 D0 83 2108 pop dph0 0AA4 D0 82 2109 pop dpl0 0AA6 D0 F0 2110 pop b 0AA8 D0 E0 2111 pop acc 0AAA 32 2112 reti 2113 0AAB 2114 usb_ep6out_isr: 0AAB C0 E0 2115 push acc 0AAD C0 F0 2116 push b 0AAF C0 82 2117 push dpl0 0AB1 C0 83 2118 push dph0 0AB3 C0 D0 2119 push psw 0AB5 75 D0 00 2120 mov psw,#0x00 0AB8 C0 86 2121 push dps 0ABA 75 86 00 2122 mov dps,#0 2123 ;; clear interrupt 0ABD E5 91 2124 mov a,exif 0ABF C2 E4 2125 clr acc.4 0AC1 F5 91 2126 mov exif,a 0AC3 90 7F AA 2127 mov dptr,#OUT07IRQ 0AC6 74 40 2128 mov a,#0x40 0AC8 F0 2129 movx @dptr,a 2130 ;; handle interrupt 2131 ;; epilogue 0AC9 D0 86 2132 pop dps 0ACB D0 D0 2133 pop psw 0ACD D0 83 2134 pop dph0 0ACF D0 82 2135 pop dpl0 0AD1 D0 F0 2136 pop b 0AD3 D0 E0 2137 pop acc 0AD5 32 2138 reti 2139 0AD6 2140 usb_ep7in_isr: 0AD6 C0 E0 2141 push acc 0AD8 C0 F0 2142 push b 0ADA C0 82 2143 push dpl0 0ADC C0 83 2144 push dph0 0ADE C0 D0 2145 push psw 0AE0 75 D0 00 2146 mov psw,#0x00 0AE3 C0 86 2147 push dps 0AE5 75 86 00 2148 mov dps,#0 2149 ;; clear interrupt 0AE8 E5 91 2150 mov a,exif 0AEA C2 E4 2151 clr acc.4 0AEC F5 91 2152 mov exif,a 0AEE 90 7F A9 2153 mov dptr,#IN07IRQ 0AF1 74 80 2154 mov a,#0x80 0AF3 F0 2155 movx @dptr,a 2156 ;; handle interrupt 2157 ;; epilogue 0AF4 D0 86 2158 pop dps 0AF6 D0 D0 2159 pop psw 0AF8 D0 83 2160 pop dph0 0AFA D0 82 2161 pop dpl0 0AFC D0 F0 2162 pop b 0AFE D0 E0 2163 pop acc 0B00 32 2164 reti 2165 0B01 2166 usb_ep7out_isr: 0B01 C0 E0 2167 push acc 0B03 C0 F0 2168 push b 0B05 C0 82 2169 push dpl0 0B07 C0 83 2170 push dph0 0B09 C0 D0 2171 push psw 0B0B 75 D0 00 2172 mov psw,#0x00 0B0E C0 86 2173 push dps 0B10 75 86 00 2174 mov dps,#0 2175 ;; clear interrupt 0B13 E5 91 2176 mov a,exif 0B15 C2 E4 2177 clr acc.4 0B17 F5 91 2178 mov exif,a 0B19 90 7F AA 2179 mov dptr,#OUT07IRQ 0B1C 74 80 2180 mov a,#0x80 0B1E F0 2181 movx @dptr,a 2182 ;; handle interrupt 2183 ;; epilogue 0B1F D0 86 2184 pop dps 0B21 D0 D0 2185 pop psw 0B23 D0 83 2186 pop dph0 0B25 D0 82 2187 pop dpl0 0B27 D0 F0 2188 pop b 0B29 D0 E0 2189 pop acc 0B2B 32 2190 reti 2191 2192 ;; ----------------------------------------------------- 2193 ;; USB descriptors 2194 ;; ----------------------------------------------------- 2195 2196 ;; Device and/or Interface Class codes 0000 2197 USB_CLASS_PER_INTERFACE = 0 0001 2198 USB_CLASS_AUDIO = 1 0002 2199 USB_CLASS_COMM = 2 0003 2200 USB_CLASS_HID = 3 0007 2201 USB_CLASS_PRINTER = 7 0008 2202 USB_CLASS_MASS_STORAGE = 8 0009 2203 USB_CLASS_HUB = 9 00FF 2204 USB_CLASS_VENDOR_SPEC = 0xff 2205 2206 ;; Descriptor types 0001 2207 USB_DT_DEVICE = 0x01 0002 2208 USB_DT_CONFIG = 0x02 0003 2209 USB_DT_STRING = 0x03 0004 2210 USB_DT_INTERFACE = 0x04 0005 2211 USB_DT_ENDPOINT = 0x05 2212 2213 ;; Standard requests 0000 2214 USB_REQ_GET_STATUS = 0x00 0001 2215 USB_REQ_CLEAR_FEATURE = 0x01 0003 2216 USB_REQ_SET_FEATURE = 0x03 0005 2217 USB_REQ_SET_ADDRESS = 0x05 0006 2218 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2219 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2220 USB_REQ_GET_CONFIGURATION = 0x08 0009 2221 USB_REQ_SET_CONFIGURATION = 0x09 000A 2222 USB_REQ_GET_INTERFACE = 0x0A 000B 2223 USB_REQ_SET_INTERFACE = 0x0B 000C 2224 USB_REQ_SYNCH_FRAME = 0x0C 2225 2226 ;; USB Request Type and Endpoint Directions 0000 2227 USB_DIR_OUT = 0 0080 2228 USB_DIR_IN = 0x80 2229 0000 2230 USB_TYPE_STANDARD = (0x00 << 5) 0020 2231 USB_TYPE_CLASS = (0x01 << 5) 0040 2232 USB_TYPE_VENDOR = (0x02 << 5) 0060 2233 USB_TYPE_RESERVED = (0x03 << 5) 2234 0000 2235 USB_RECIP_DEVICE = 0x00 0001 2236 USB_RECIP_INTERFACE = 0x01 0002 2237 USB_RECIP_ENDPOINT = 0x02 0003 2238 USB_RECIP_OTHER = 0x03 2239 2240 ;; Request target types. 0000 2241 USB_RT_DEVICE = 0x00 0001 2242 USB_RT_INTERFACE = 0x01 0002 2243 USB_RT_ENDPOINT = 0x02 2244 BAC0 2245 VENDID = 0xbac0 6135 2246 PRODID = 0x6135 2247 0B2C 2248 devicedescr: 0B2C 12 2249 .db 18 ; bLength 0B2D 01 2250 .db USB_DT_DEVICE ; bDescriptorType 0B2E 00 01 2251 .db 0x00, 0x01 ; bcdUSB 0B30 FF 2252 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 0B31 00 2253 .db 0 ; bDeviceSubClass 0B32 FF 2254 .db 0xff ; bDeviceProtocol 0B33 40 2255 .db 0x40 ; bMaxPacketSize0 0B34 C0 BA 2256 .db VENDID ; idVendor 0B36 35 61 2257 .db PRODID ; idProduct 0B38 02 00 2258 .db 0x02,0x00 ; bcdDevice 0B3A 01 2259 .db 1 ; iManufacturer 0B3B 02 2260 .db 2 ; iProduct 0B3C 03 2261 .db 3 ; iSerialNumber 0B3D 01 2262 .db 1 ; bNumConfigurations 2263 0B3E 2264 config0descr: 0B3E 09 2265 .db 9 ; bLength 0B3F 02 2266 .db USB_DT_CONFIG ; bDescriptorType 0B40 45 00 2267 .db config0sz ; wTotalLength 0B42 01 2268 .db 1 ; bNumInterfaces 0B43 01 2269 .db 1 ; bConfigurationValue 0B44 00 2270 .db 0 ; iConfiguration 0B45 40 2271 .db 0b01000000 ; bmAttributs (self powered) 0B46 00 2272 .db 0 ; MaxPower (mA/2) (self powered so 0) 2273 ;; interface descriptor I0:A0 0B47 09 2274 .db 9 ; bLength 0B48 04 2275 .db USB_DT_INTERFACE ; bDescriptorType 0B49 00 2276 .db 0 ; bInterfaceNumber 0B4A 00 2277 .db 0 ; bAlternateSetting 0B4B 03 2278 .db 3 ; bNumEndpoints 0B4C FF 2279 .db 0xff ; bInterfaceClass (vendor specific) 0B4D 00 2280 .db 0x00 ; bInterfaceSubClass 0B4E FF 2281 .db 0xff ; bInterfaceProtocol (vendor specific) 0B4F 00 2282 .db 0 ; iInterface 2283 ;; endpoint descriptor I0:A0:E0 0B50 07 2284 .db 7 ; bLength 0B51 05 2285 .db USB_DT_ENDPOINT ; bDescriptorType 0B52 81 2286 .db (USB_DIR_IN | 1) ; bEndpointAddress 0B53 02 2287 .db 0x02 ; bmAttributes (bulk) 0B54 40 00 2288 .db 0x40,0x00 ; wMaxPacketSize 0B56 00 2289 .db 0 ; bInterval 2290 ;; endpoint descriptor I0:A0:E1 0B57 07 2291 .db 7 ; bLength 0B58 05 2292 .db USB_DT_ENDPOINT ; bDescriptorType 0B59 82 2293 .db (USB_DIR_IN | 2) ; bEndpointAddress 0B5A 02 2294 .db 0x02 ; bmAttributes (bulk) 0B5B 40 00 2295 .db 0x40,0x00 ; wMaxPacketSize 0B5D 00 2296 .db 0 ; bInterval 2297 ;; endpoint descriptor I0:A0:E2 0B5E 07 2298 .db 7 ; bLength 0B5F 05 2299 .db USB_DT_ENDPOINT ; bDescriptorType 0B60 02 2300 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0B61 02 2301 .db 0x02 ; bmAttributes (bulk) 0B62 40 00 2302 .db 0x40,0x00 ; wMaxPacketSize 0B64 00 2303 .db 0 ; bInterval 2304 ;; interface descriptor I0:A1 0B65 09 2305 .db 9 ; bLength 0B66 04 2306 .db USB_DT_INTERFACE ; bDescriptorType 0B67 00 2307 .db 0 ; bInterfaceNumber 0B68 01 2308 .db 1 ; bAlternateSetting 0B69 03 2309 .db 3 ; bNumEndpoints 0B6A FF 2310 .db 0xff ; bInterfaceClass (vendor specific) 0B6B 00 2311 .db 0x00 ; bInterfaceSubClass 0B6C FF 2312 .db 0xff ; bInterfaceProtocol (vendor specific) 0B6D 00 2313 .db 0 ; iInterface 2314 ;; endpoint descriptor I0:A1:E0 0B6E 07 2315 .db 7 ; bLength 0B6F 05 2316 .db USB_DT_ENDPOINT ; bDescriptorType 0B70 81 2317 .db (USB_DIR_IN | 1) ; bEndpointAddress 0B71 03 2318 .db 0x03 ; bmAttributes (interrupt) 0B72 40 00 2319 .db 0x40,0x00 ; wMaxPacketSize 0B74 0A 2320 .db 10 ; bInterval 2321 ;; endpoint descriptor I0:A1:E1 0B75 07 2322 .db 7 ; bLength 0B76 05 2323 .db USB_DT_ENDPOINT ; bDescriptorType 0B77 82 2324 .db (USB_DIR_IN | 2) ; bEndpointAddress 0B78 02 2325 .db 0x02 ; bmAttributes (bulk) 0B79 40 00 2326 .db 0x40,0x00 ; wMaxPacketSize 0B7B 00 2327 .db 0 ; bInterval 2328 ;; endpoint descriptor I0:A1:E2 0B7C 07 2329 .db 7 ; bLength 0B7D 05 2330 .db USB_DT_ENDPOINT ; bDescriptorType 0B7E 02 2331 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0B7F 02 2332 .db 0x02 ; bmAttributes (bulk) 0B80 40 00 2333 .db 0x40,0x00 ; wMaxPacketSize 0B82 00 2334 .db 0 ; bInterval 2335 0045 2336 config0sz = . - config0descr 2337 0B83 2338 stringdescr: 0B83 8B 0B 2339 .db string0 0B85 8F 0B 2340 .db string1 0B87 9D 0B 2341 .db string2 0B89 BD 0B 2342 .db stringserial 2343 0004 2344 numstrings = (. - stringdescr)/2 2345 0B8B 2346 string0: 0B8B 04 2347 .db string0sz ; bLength 0B8C 03 2348 .db USB_DT_STRING ; bDescriptorType 0B8D 00 00 2349 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2350 string0sz = . - string0 2351 0B8F 2352 string1: 0B8F 0E 2353 .db string1sz ; bLength 0B90 03 2354 .db USB_DT_STRING ; bDescriptorType 0B91 42 00 61 00 79 00 2355 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2356 string1sz = . - string1 2357 0B9D 2358 string2: 0B9D 20 2359 .db string2sz ; bLength 0B9E 03 2360 .db USB_DT_STRING ; bDescriptorType 0B9F 55 00 53 00 42 00 2361 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0BAF 28 00 62 00 6C 00 2362 .db '(,0,'b,0,'l,0,'a,0,'n,0,'k,0,'),0 61 00 6E 00 6B 00 29 00 0020 2363 string2sz = . - string2 2364 0BBD 2365 stringserial: 0BBD 02 2366 .db 2 ; bLength 0BBE 03 2367 .db USB_DT_STRING ; bDescriptorType 0BBF 00 00 00 00 00 00 2368 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0BCF 00 00 00 00 00 00 2369 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2370 baycomusb-0.10.orig/firmware/dl2firmware/main.map0100644000175100017510000000625407325134422020076 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 l_XSEG 0000 l__CODE 0000 s__CODE 0000 l_BSEG 0000 s_CODE 0000 s_BSEG 0008 l_GSINIT 000D l_DSEG 0040 s_DSEG 0080 l_ISEG 0080 s_ISEG 0157 l_CODE 0157 s_CSEG 01FA l_GSINIT2 0A88 l_CSEG 0BDF s_GSINIT 0BE7 s_GSINIT2 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 0157 = 343. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 0157 0A88 = 2696. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:03E1 xmemread 0C:08B0 fillusbintr Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT 0BDF 0008 = 8. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT2 0BE7 01FA = 506. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 0000 = 0. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0080 = 128. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 000D = 13. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 0000 = 0. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/dl2firmware/main.asm0100644000175100017510000011155307325134422020100 0ustar abaaba .module main ;; define code segments link order .area CODE (CODE) .area CSEG (CODE) .area GSINIT (CODE) .area GSINIT2 (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; FPGA defines XC4K_IRLENGTH = 3 XC4K_EXTEST = 0 XC4K_PRELOAD = 1 XC4K_CONFIGURE = 5 XC4K_BYPASS = 7 FPGA_CONFIGSIZE = 11876 FPGA_BOUND = 344 SOFTWARECONFIG = 0 ;; ----------------------------------------------------- .area CODE (CODE) ljmp startup ljmp int0_isr .ds 5 ljmp timer0_isr .ds 5 ljmp int1_isr .ds 5 ljmp timer1_isr .ds 5 ljmp ser0_isr .ds 5 ljmp timer2_isr .ds 5 ljmp resume_isr .ds 5 ljmp ser1_isr .ds 5 ljmp usb_isr .ds 5 ljmp i2c_isr .ds 5 ljmp int4_isr .ds 5 ljmp int5_isr .ds 5 ljmp int6_isr .ds 0x9a ;; USB interrupt dispatch table usb_isr: ljmp usb_sudav_isr .ds 1 ljmp usb_sof_isr .ds 1 ljmp usb_sutok_isr .ds 1 ljmp usb_suspend_isr .ds 1 ljmp usb_usbreset_isr .ds 1 reti .ds 3 ljmp usb_ep0in_isr .ds 1 ljmp usb_ep0out_isr .ds 1 ljmp usb_ep1in_isr .ds 1 ljmp usb_ep1out_isr .ds 1 ljmp usb_ep2in_isr .ds 1 ljmp usb_ep2out_isr .ds 1 ljmp usb_ep3in_isr .ds 1 ljmp usb_ep3out_isr .ds 1 ljmp usb_ep4in_isr .ds 1 ljmp usb_ep4out_isr .ds 1 ljmp usb_ep5in_isr .ds 1 ljmp usb_ep5out_isr .ds 1 ljmp usb_ep6in_isr .ds 1 ljmp usb_ep6out_isr .ds 1 ljmp usb_ep7in_isr .ds 1 ljmp usb_ep7out_isr ;; ----------------------------------------------------- .area BSEG (BIT) .area ISEG (DATA) stack: .ds 0x80 .area DSEG (DATA) errcode: .ds 1 errval: .ds 1 cfgcount: .ds 2 leddiv: .ds 1 irqcount: .ds 1 ctrlcode: .ds 1 ctrladdr: .ds 2 ctrllen: .ds 2 ;; USB state numconfig: .ds 1 altsetting: .ds 1 .area XSEG (DATA) .area GSINIT (CODE) startup: mov sp,#stack ; -1 clr a mov psw,a mov dps,a ;lcall __sdcc_external_startup ;mov a,dpl0 ;jz __sdcc_init_data ;ljmp __sdcc_program_startup __sdcc_init_data: .area GSINIT2 (CODE) __sdcc_program_startup: ;; assembler code startup clr a mov errcode,a mov errval,a mov cfgcount,a mov cfgcount+1,a mov irqcount,a mov ctrlcode,a mov dps,a mov ie,a ;; some indirect register setup mov ckcon,#0x31 ; one external wait state, to avoid chip bugs ;; Timer setup: ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 mov tmod,#0x21 mov tcon,#0x55 ; INT0/INT1 edge mov th1,#256-156 ; 1200 bauds mov pcon,#0 ; SMOD0=0 ;; give Windows a chance to finish the writecpucs control transfer ;; 10ms delay loop mov dptr,#(-6000)&0xffff 9$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 9$ ; 3 cycles ;; init USB subsystem mov dptr,#ISOCTL mov a,#1 ; disable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a clr a mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR mov a,#0x9 ; pair EP 2&3 for input & output movx @dptr,a mov dptr,#IN07VAL mov a,#0x7 ; enable EP0+EP1+EP2 movx @dptr,a mov dptr,#OUT07VAL mov a,#0x5 ; enable EP0+EP2 movx @dptr,a ;; USB: init endpoint toggles mov dptr,#TOGCTL mov a,#0x12 movx @dptr,a mov a,#0x32 ; clear EP 2 in toggle movx @dptr,a mov a,#0x02 movx @dptr,a mov a,#0x22 ; clear EP 2 out toggle movx @dptr,a ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x80 ; set PROG lo movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0 movx @dptr,a mov dptr,#OUTC mov a,#0x20 movx @dptr,a mov dptr,#OEC mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO movx @dptr,a ;; enable interrupts mov ie,#0x82 ; enable timer 0 mov eie,#0x01 ; enable USB interrupts mov dptr,#USBIEN mov a,#1 ; enable SUDAV interrupt movx @dptr,a mov dptr,#IN07IEN mov a,#3 ; enable EP0+EP1 interrupt movx @dptr,a mov dptr,#OUT07IEN mov a,#1 ; enable EP0 interrupt movx @dptr,a ;; initialize UART 0 for config loading mov scon0,#0x20 ; mode 0, CLK24/4 mov sbuf0,#0xff ;; initialize USB state clr a mov numconfig,a mov altsetting,a .if 0 ;; disconnect from USB bus mov dptr,#USBCS mov a,#10 movx @dptr,a ;; wait 0.3 sec mov r2,#30 ;; 10ms delay loop 0$: mov dptr,#(-6000)&0xffff 1$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 1$ ; 3 cycles djnz r2,0$ ;; reconnect to USB bus mov dptr,#USBCS mov a,#2 ; 8051 handles control movx @dptr,a mov a,#6 ; reconnect, 8051 handles control movx @dptr,a .else mov dptr,#USBCS mov a,#6 ; reconnect, 8051 handles control movx @dptr,a .endif ;; final lcall fillusbintr ;; kludge; first OUT2 packet seems to be bogus ;; wait for packet with length 1 and contents 0x55 ;; some short delay mov dptr,#OUTA mov a,#0x82 ; set PROG hi movx @dptr,a mov dptr,#PINSA movx a,@dptr jnb acc.2,8$ ;; DONE stuck high mov errcode,#0x80 ljmp fpgaerr 8$: lcall jtag_reset_tap mov r2,#5 mov r3,#0 mov r4,#6 lcall jtag_shiftout ; enter SHIFT-IR state mov r2,#8 mov r3,#0 mov r4,#0 lcall jtag_shiftout ; assume max. 8bit IR mov r2,#8 mov r3,#1 mov r4,#0 lcall jtag_shift ; shift in a single bit mov a,#-(1<(-FPGA_CONFIGSIZE) addc a,cfgcount+1 jnc loadloop ;; configuration download complete, start FPGA mov dptr,#PORTBCFG mov a,#0 ; TDI no longer special function pin movx @dptr,a mov dptr,#PORTCCFG mov a,#0 ; TCK no longer special function pin movx @dptr,a ;; wait for done loop mov r7,#250 doneloop: mov dptr,#PINSA movx a,@dptr jb acc.2,doneactive mov dptr,#PINSC movx a,@dptr jb acc.2,1$ ;; INIT low mov errcode,#0x90 ljmp fpgaerr 1$: mov dptr,#OUTC movx a,@dptr setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a djnz r7,doneloop ;; DONE stuck low mov errcode,#0x91 ljmp fpgaerr doneactive: ;; generate 16 clock pulses to start up FPGA mov r7,#16 mov dptr,#OUTC movx a,@dptr 0$: setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a djnz r7,0$ mov dptr,#PORTCCFG mov a,#0xc0 ; RD/WR is special function pin movx @dptr,a mov errcode,#0x20 mov dptr,#0xc008 mov a,#0xc7 movx @dptr,a fpgaerr: sjmp fpgaerr .area CSEG (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 ;; jtag_shift ;; r2 = num ;; r3 = tdi ;; r4 = tms ;; return: r7 = tdo jtag_reset_tap: mov r2,#5 mov r3,#0 mov r4,#0xff jtag_shiftout: jtag_shift: mov r6,#1 mov r7,#0 1$: mov a,#2 xch a,r3 rrc a xch a,r3 mov acc.6,c xch a,r4 rrc a xch a,r4 mov acc.7,c mov dptr,#OUTA movx @dptr,a mov dptr,#PINSC movx a,@dptr jnb acc.0,2$ mov a,r6 orl ar7,a 2$: mov dptr,#OUTC movx a,@dptr setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a mov a,r6 rl a mov r6,a djnz r2,1$ ret ;; EEPROM address where the serial number is located eepromstraddr: .db 0x10 ;; I2C Routines ;; note: ckcon should be set to #0x31 to avoid chip bugs writei2c: ;; dptr: data to be sent ;; b: device address ;; r7: transfer length ;; return: a: status (bytes remaining, 0xff bus error) inc dps mov dptr,#I2CS clr b.0 ; r/w = 0 mov a,#0x80 ; start condition movx @dptr,a mov dptr,#I2DAT mov a,b movx @dptr,a mov dptr,#I2CS 0$: movx a,@dptr jb acc.2,3$ ; BERR jnb acc.0,0$ ; DONE jnb acc.1,1$ ; ACK mov dptr,#I2DAT dec dps movx a,@dptr inc dptr inc dps movx @dptr,a mov dptr,#I2CS djnz r7,0$ 1$: mov a,#0x40 ; stop condition movx @dptr,a 2$: movx a,@dptr jb acc.6,2$ dec dps mov a,r7 ret 3$: mov r7,#255 sjmp 1$ readi2c: ;; dptr: data to be sent ;; b: device address ;; r7: transfer length ;; return: a: status (bytes remaining, 0xff bus error) inc dps mov dptr,#I2CS setb b.0 ; r/w = 1 mov a,#0x80 ; start condition movx @dptr,a mov dptr,#I2DAT mov a,b movx @dptr,a mov dptr,#I2CS 0$: movx a,@dptr jb acc.2,9$ ; BERR jnb acc.0,0$ ; DONE jnb acc.1,5$ ; ACK mov a,r7 jnz 1$ 5$: mov a,#0x40 ; stop condition movx @dptr,a 2$: movx a,@dptr jb acc.6,2$ dec dps clr a ret 1$: cjne a,#1,3$ mov a,#0x20 ; LASTRD = 1 movx @dptr,a 3$: mov dptr,#I2DAT movx a,@dptr ; initiate first read mov dptr,#I2CS 4$: movx a,@dptr jb acc.2,9$ ; BERR jnb acc.0,4$ ; DONE mov a,r7 cjne a,#2,6$ mov a,#0x20 ; LASTRD = 1 movx @dptr,a 6$: cjne a,#1,7$ mov a,#0x40 ; stop condition movx @dptr,a 7$: mov dptr,#I2DAT movx a,@dptr ; read data dec dps movx @dptr,a inc dptr inc dps mov dptr,#I2CS djnz r7,4$ 8$: movx a,@dptr jb acc.6,8$ dec dps clr a ret 9$: mov a,#0x40 ; stop condition movx @dptr,a 10$: movx a,@dptr jb acc.6,10$ mov a,#255 dec dps ret ;; ------------------ interrupt handlers ------------------------ int0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+5 ;; handle interrupt inc leddiv mov a,leddiv anl a,#7 jnz 0$ mov dptr,#OUTC movx a,@dptr xrl a,#0x08 movx @dptr,a 0$: ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon0+0 clr scon0+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer2_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr t2con+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti resume_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+4 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon1+0 clr scon1+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti i2c_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.5 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int4_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.6 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int5_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.7 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int6_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti xmemread:: mov a,ctrllen mov r7,a add a,#-64 mov ctrllen,a mov a,ctrllen+1 addc a,#0 jnc 0$ clr a mov ctrllen,a mov ctrllen+1,a mov ctrlcode,a mov a,#2 ; ack control transfer mov dptr,#EP0CS movx @dptr,a mov a,r7 jz 2$ sjmp 1$ 0$: mov ctrllen+1,a mov r7,#64 1$: mov ar0,r7 mov dpl0,ctrladdr mov dph0,ctrladdr+1 inc dps mov dptr,#IN0BUF dec dps 3$: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r0,3$ mov ctrladdr,dpl0 mov ctrladdr+1,dph0 2$: mov a,r7 mov dptr,#IN0BC movx @dptr,a ret usb_sudav_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov ctrlcode,#0 ; reset control out code mov dptr,#SETUPDAT+1 movx a,@dptr ; bRequest field ;; standard commands ;; USB_REQ_GET_DESCRIPTOR cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc mov dptr,#SETUPDAT ; bRequestType == 0x80 movx a,@dptr cjne a,#USB_DIR_IN,setupstallstd mov dptr,#SETUPDAT+3 movx a,@dptr cjne a,#USB_DT_DEVICE,cmdnotgetdescdev mov dptr,#SUDPTRH mov a,#>devicedescr movx @dptr,a inc dptr mov a,#config0descr movx @dptr,a inc dptr mov a,#stringdescr mov dph0,a movx a,@dptr mov b,a inc dptr movx a,@dptr mov dptr,#SUDPTRH movx @dptr,a inc dptr mov a,b movx @dptr,a ; sjmp setupackstd setupackstd: ljmp setupack setupstallstd: ljmp setupstall cmdnotgetdesc: ;; USB_REQ_SET_CONFIGURATION cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf mov dptr,#SETUPDAT movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr add a,#-2 jc setupstallstd movx a,@dptr mov numconfig,a cmdresettoggleshalt: mov dptr,#TOGCTL mov r0,#7 0$: mov a,r0 orl a,#0x10 movx @dptr,a orl a,#0x30 movx @dptr,a mov a,r0 movx @dptr,a orl a,#0x20 movx @dptr,a djnz r0,0$ clr a movx @dptr,a mov a,#2 mov dptr,#IN1CS mov r0,#7 1$: movx @dptr,a inc dptr inc dptr djnz r0,1$ mov dptr,#OUT1CS mov r0,#7 2$: movx @dptr,a inc dptr inc dptr djnz r0,2$ lcall fillusbintr sjmp setupackstd cmdnotsetconf: ;; USB_REQ_SET_INTERFACE cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr mov altsetting,a sjmp cmdresettoggleshalt cmdnotsetint: ;; USB_REQ_GET_INTERFACE cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr jnz setupstallstd mov a,altsetting cmdrespondonebyte: mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a sjmp setupackstd2 cmdnotgetint: ;; USB_REQ_GET_CONFIGURATION cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 mov a,numconfig sjmp cmdrespondonebyte cmdnotgetconf: ;; USB_REQ_GET_STATUS (0) jnz cmdnotgetstat mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev mov a,#1 cmdrespondstat: mov dptr,#IN0BUF movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#IN0BC mov a,#2 movx @dptr,a sjmp setupackstd2 cmdnotgetstatdev: cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf clr a sjmp cmdrespondstat cmdnotgetstatintf: cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 mov dptr,#SETUPDAT+4 movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 0$: anl a,#15 jz setupstallstd2 jb acc.3,setupstallstd2 add a,acc add a,dpl0 mov dpl0,a movx a,@dptr sjmp cmdrespondstat setupackstd2: ljmp setupack setupstallstd2: ljmp setupstall cmdnotgetstat: ;; USB_REQ_SET_FEATURE cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr mov b,#1 sjmp handleftr cmdnotsetftr: ;; USB_REQ_CLEAR_FEATURE cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr mov b,#0 handleftr: mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 inc dptr inc dptr movx a,@dptr jnz setupstallstd2 ; not ENDPOINT_HALT feature inc dptr movx a,@dptr jnz setupstallstd2 inc dptr movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 orl a,#0x10 0$: jb acc.3,setupstallstd2 ;; clear data toggle anl a,#0x1f inc dps mov dptr,#TOGCTL movx @dptr,a orl a,#0x20 movx @dptr,a anl a,#15 movx @dptr,a dec dps ;; clear/set ep halt feature add a,acc add a,dpl0 mov dpl0,a mov a,b movx @dptr,a sjmp setupackstd2 cmdnotclrftr: ;; vendor specific commands ;; 0xa3 cjne a,#0xa3,cmdnota3 mov dptr,#SETUPDAT+2 movx a,@dptr mov ctrladdr,a inc dptr movx a,@dptr mov ctrladdr+1,a add a,#80 jnc setupstalla3 mov dptr,#SETUPDAT+6 movx a,@dptr mov ctrllen,a add a,ctrladdr inc dptr movx a,@dptr mov ctrllen+1,a addc a,ctrladdr+1 jc setupstalla3 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,1$ mov ctrlcode,#1 mov dptr,#OUT0BC movx @dptr,a ljmp endusbisr 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 mov ctrlcode,#2 lcall xmemread ljmp endusbisr setupstalla3: ljmp setupstall cmdnota3: ;; 0xb1 cjne a,#0xb1,cmdnotb1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb1 mov dptr,#IN0BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,sp ;;; xxxx push dpl0 push dph0 mov dptr,#OUT07VAL movx a,@dptr pop dph0 pop dpl0 ;;; xxxx movx @dptr,a inc dptr mov a,#0 ;;; xxxx push dpl0 push dph0 mov dptr,#OUT2CS movx a,@dptr pop dph0 pop dpl0 ;;; xxxx movx @dptr,a inc dptr mov dptr,#IN0BC mov a,#4 movx @dptr,a ljmp setupack setupstallb1: ljmp setupstall cmdnotb1: ;; 0xb2 cjne a,#0xb2,cmdnotb2 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb2 mov dptr,#IN0BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,cfgcount movx @dptr,a inc dptr mov a,cfgcount+1 movx @dptr,a inc dptr mov a,irqcount movx @dptr,a mov dptr,#IN0BC mov a,#5 movx @dptr,a inc irqcount ljmp setupack setupstallb2: ljmp setupstall cmdnotb2: ;; 0xb3 cjne a,#0xb3,cmdnotb3 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb3 ;; read EEPROM serstrlen = 6 mov b,#0xa0 ; EEPROM address mov dptr,#eepromstraddr mov r7,#1 lcall writei2c jnz setupstallb3 mov dptr,#IN0BUF mov r7,#serstrlen lcall readi2c jnz setupstallb3 mov a,#serstrlen mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallb3: ljmp setupstall cmdnotb3: ;; 0xb4 cjne a,#0xb4,cmdnotb4 mov dptr,#SETUPDAT+7 movx a,@dptr jnz setupstallb4 mov dptr,#SETUPDAT+6 movx a,@dptr mov r0,a mov r7,a add a,#-64 jc setupstallb4 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr mov b,a mov ctrladdr,a mov dptr,#SETUPDAT movx a,@dptr cjne a,#0x40,0$ ; bRequestType == 0x40 mov ctrlcode,#2 mov dptr,#OUT0BC movx @dptr,a ljmp endusbisr 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 mov dptr,#IN0BUF lcall readi2c jnz setupstallb4 mov a,r0 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallb4: ljmp setupstall cmdnotb4: ;; unknown commands fall through to setupstall setupstall: mov a,#3 sjmp endsetup setupack: mov a,#2 endsetup: mov dptr,#EP0CS movx @dptr,a endusbisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sof_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sutok_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_suspend_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_usbreset_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep0in_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov a,ctrlcode cjne a,#2,0$ lcall xmemread sjmp ep0inendisr 0$: mov dptr,#IN0BC clr a movx @dptr,a sjmp ep0inack ep0install: mov a,#3 sjmp ep0incs ep0inack: mov a,#2 ep0incs: mov dptr,#EP0CS movx @dptr,a ep0inendisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_ep0out_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar6 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov a,ctrlcode ; check control code cjne a,#0x01,i2cwr ;; write to external memory mov dptr,#OUT0BC movx a,@dptr jz 0$ mov r7,a clr c mov a,ctrllen subb a,r7 mov ctrllen,a mov a,ctrllen+1 subb a,#0 mov ctrllen+1,a jc ep0outstall mov dptr,#OUT0BUF mov dpl1,ctrladdr mov dph1,ctrladdr+1 1$: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r7,1$ mov ctrladdr,dpl1 mov ctrladdr+1,dph1 0$: mov a,ctrllen orl a,ctrllen+1 jz ep0outack sjmp ep0outendisr ;; write I2C eeprom i2cwr: cjne a,#0x02,ep0outstall mov dptr,#OUT0BC movx a,@dptr jz ep0outack mov r7,a mov b,ctrladdr mov dptr,#OUT0BUF lcall writei2c jnz ep0outstall sjmp ep0outack ep0outstall: mov ctrlcode,#0 mov a,#3 sjmp ep0outcs ep0outack: mov ctrlcode,#0 mov a,#2 ep0outcs: mov dptr,#EP0CS movx @dptr,a ep0outendisr: ;; epilogue pop ar6 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti fillusbintr:: mov dptr,#IN1BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,cfgcount movx @dptr,a inc dptr mov a,cfgcount+1 movx @dptr,a inc dptr mov a,irqcount movx @dptr,a mov dptr,#IN1BC mov a,#5 movx @dptr,a inc irqcount ret usb_ep1in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt lcall fillusbintr ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep1out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ;; ----------------------------------------------------- ;; USB descriptors ;; ----------------------------------------------------- ;; Device and/or Interface Class codes USB_CLASS_PER_INTERFACE = 0 USB_CLASS_AUDIO = 1 USB_CLASS_COMM = 2 USB_CLASS_HID = 3 USB_CLASS_PRINTER = 7 USB_CLASS_MASS_STORAGE = 8 USB_CLASS_HUB = 9 USB_CLASS_VENDOR_SPEC = 0xff ;; Descriptor types USB_DT_DEVICE = 0x01 USB_DT_CONFIG = 0x02 USB_DT_STRING = 0x03 USB_DT_INTERFACE = 0x04 USB_DT_ENDPOINT = 0x05 ;; Standard requests USB_REQ_GET_STATUS = 0x00 USB_REQ_CLEAR_FEATURE = 0x01 USB_REQ_SET_FEATURE = 0x03 USB_REQ_SET_ADDRESS = 0x05 USB_REQ_GET_DESCRIPTOR = 0x06 USB_REQ_SET_DESCRIPTOR = 0x07 USB_REQ_GET_CONFIGURATION = 0x08 USB_REQ_SET_CONFIGURATION = 0x09 USB_REQ_GET_INTERFACE = 0x0A USB_REQ_SET_INTERFACE = 0x0B USB_REQ_SYNCH_FRAME = 0x0C ;; USB Request Type and Endpoint Directions USB_DIR_OUT = 0 USB_DIR_IN = 0x80 USB_TYPE_STANDARD = (0x00 << 5) USB_TYPE_CLASS = (0x01 << 5) USB_TYPE_VENDOR = (0x02 << 5) USB_TYPE_RESERVED = (0x03 << 5) USB_RECIP_DEVICE = 0x00 USB_RECIP_INTERFACE = 0x01 USB_RECIP_ENDPOINT = 0x02 USB_RECIP_OTHER = 0x03 ;; Request target types. USB_RT_DEVICE = 0x00 USB_RT_INTERFACE = 0x01 USB_RT_ENDPOINT = 0x02 VENDID = 0xbac0 PRODID = 0x6135 devicedescr: .db 18 ; bLength .db USB_DT_DEVICE ; bDescriptorType .db 0x00, 0x01 ; bcdUSB .db USB_CLASS_VENDOR_SPEC ; bDeviceClass .db 0 ; bDeviceSubClass .db 0xff ; bDeviceProtocol .db 0x40 ; bMaxPacketSize0 .db VENDID ; idVendor .db PRODID ; idProduct .db 0x02,0x00 ; bcdDevice .db 1 ; iManufacturer .db 2 ; iProduct .db 3 ; iSerialNumber .db 1 ; bNumConfigurations config0descr: .db 9 ; bLength .db USB_DT_CONFIG ; bDescriptorType .db config0sz ; wTotalLength .db 1 ; bNumInterfaces .db 1 ; bConfigurationValue .db 0 ; iConfiguration .db 0b01000000 ; bmAttributs (self powered) .db 0 ; MaxPower (mA/2) (self powered so 0) ;; interface descriptor I0:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A0:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A0:E1 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A0:E2 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; interface descriptor I0:A1 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 1 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A1:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x03 ; bmAttributes (interrupt) .db 0x40,0x00 ; wMaxPacketSize .db 10 ; bInterval ;; endpoint descriptor I0:A1:E1 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A1:E2 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval config0sz = . - config0descr stringdescr: .db string0 .db string1 .db string2 .db stringserial numstrings = (. - stringdescr)/2 string0: .db string0sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 0,0 ; LANGID[0]: Lang Neutral string0sz = . - string0 string1: .db string1sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 string1sz = . - string1 string2: .db string2sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 .db '(,0,'b,0,'l,0,'a,0,'n,0,'k,0,'),0 string2sz = . - string2 stringserial: .db 2 ; bLength .db USB_DT_STRING ; bDescriptorType .dw 0,0,0,0,0,0,0,0 .dw 0,0,0,0,0,0,0,0 baycomusb-0.10.orig/firmware/dl2firmware/main.lnk0100644000175100017510000000014707325134422020100 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/firmware/fskfirmware/0042755000175100017510000000000007340500004016541 5ustar abaababaycomusb-0.10.orig/firmware/fskfirmware/Makefile.in0100644000175100017510000001403307340500003020601 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/fskfirmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk fsk.c regezusb.h ezregs.inc mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/fskfirmware/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 = firmware/fskfirmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/fskfirmware/main.rel: $(top_srcdir)/firmware/fskfirmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/fskfirmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/fskfirmware/main.ihx: $(top_srcdir)/firmware/fskfirmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/fskfirmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/fskfirmware/Makefile.am0100644000175100017510000000102207325134422020575 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/fskfirmware/main.rel: $(top_srcdir)/firmware/fskfirmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/fskfirmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/fskfirmware/main.ihx $(top_srcdir)/firmware/fskfirmware/main.ihx: $(top_srcdir)/firmware/fskfirmware/main.rel cd $(top_srcdir)/firmware/fskfirmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk \ fsk.c regezusb.h ezregs.inc baycomusb-0.10.orig/firmware/fskfirmware/main.ihx0100644000175100017510000003074607340435154020221 0ustar abaaba:06000000020E830203EA78 :03000B0002040BE1 :0300130002042CB8 :03001B0002044D8F :0300230002046E66 :03002B000204AC20 :030033000204CDF7 :03003B000204EECE :03004300020100B7 :03004B000205119A :030053000205366D :03005B0002055B40 :0300630002058013 :0800E000000000000000000117 :0900F00030303030303030300087 :030100000205A154 :030104000209CF1E :030108000209FAEF :03010C00020A25BF :03011000020A5090 :0101140032B8 :03011800020A7B5D :03011C00020AB61E :03012000020B7758 :03012400020BA526 :03012800020BD0F7 :03012C00020BFBC8 :03013000020C2698 :03013400020C5169 :03013800020C7C3A :03013C00020CA70B :03014000020CD2DC :03014400020CFDAD :03014800020D287D :03014C00020D534E :03015000020D7E1F :03015400020DA9F0 :080E83007581B0E4F5D0F5869D :060E8B00E4F545F548F511 :040E910049F54AF5E0 :040E950050F551F5CE :040E990052F553F5C6 :040E9D0054F544F5CF :060EA1006BF56AF586D234 :0D0EA7000B758E30758921758855758D6429 :0E0EB400758700907FA17401F0907FAF7401EC :0E0EC200F0E4907FE0F0907FE1F0907FDD742F :0E0ED00009F0907FDE7407F0907FDF7405F06C :0E0EDE00907FD77412F07432F07402F0742218 :0E0EEC00F0907F937400F0907F967482F090E7 :0E0EFA007F9C74C2F0907F947400F0907F9DF6 :0E0F08007400F0907F9574C3F0907F98742869 :0E0F1600F0907F9E742AF075A89275E8019005 :0E0F24007FAE7401F0907FAC7403F0907FAD4F :0D0F32007401F075985278F0900E63E26043 :0D0F3F0006F0A3A30880F7E8241125E09038 :030F4C000E61F043 :0B0F4F0075204278E6E2A2E0920892D2 :040F5A00079203787F :070F5E00E7E2A2E092099214 :0D0F650001E52090C008F090C00C74FFF072 :0C0F7200F56D3008097467F090C00D7434 :020F7E007FF002 :0C0F800090C00A741FF0F56CE4F56FF5EA :0C0F8C007090D120A3E582458370F9909D :0E0F98007FD6740AF07A1E90E890A3E5824599 :0D0FA6008370F9DAF4907FD67406F03008FD :090FB3000890C00D74FFF0F56E0A :030FBC00120AF125 :0E0FBF00907FC8E020E1F9907FC9E0B4010DF9 :0E0FCD00907DC0E0B45506907FC9F08006907C :050FDB007FC9F080DF7A :0B0FE00090C0037F40E0DFFD02018EA7 :06015700E545455060186B :0C015D00A208500690C00D74EFF0920153 :0C016900B39200D202E52090C008F02202 :0C017500C200A208500690C00D74FFF0FC :0501810072099201C2A9 :0801860002E52090C008F02200 :0A018E00E5456006B4025202024F7C :06019800E548B5490C101A :02019E000A0352 :0301A0000202B3A5 :0601A3001201570202B335 :0B01A900E5492480F8E624FC40030236 :0201B4000298AF :0C01B600E5490303F58254C02400C58213 :0C01C200543F3410F583E0F546A3E0F54F :0401CE004705457527 :0801D2004F0278E2E2700B78A5 :0901DA00E1E2C395475003E2F590 :0101E30047D4 :0301E40012015DA8 :0E01E70090C000E060B3FF90C00EE090C00337 :0B01F500A2E582084028E546FE9FF5C9 :0602000046E5479400F5FD :0C02060047501AEE6005747EF0DEFDE546 :0902120045045403F54570061281 :06021B0001570202B302CC :02022100022BAE :05022300747EF0DFFD18 :030228000202B31C :05022B00E5492480F507 :0A0230004EF8E6F404254F405FF598 :06023A004BE5490303F54A :060240004C54C0254F24C0 :0602460000C54C543F34DA :03024C0010F54D5D :0D024F0090C000E060D3FFE54B60252FC597 :0C025C004B5006F404FF754B0090C000EE :0C026800854C84854D850586E0A3158635 :0B027400F0DFF785844C85854D80D0BD :0C027F00754F00A84EE620E613EF24FDAA :0D028B00509B90C001F0F090C003747EF015 :03029800754F029D :08029B00E54904540FF549B5D3 :0502A3004886054575C9 :0602A80046287547000224 :0202AE0001E766 :0302B000020355F1 :0D02B30090C002E55170328001E0E020E5CE :0402C000EF30E7F83C :0702C400755600755101E5BC :0302CB0052F55495 :0902CE00E5540303F55754C02464 :0602D70000C557543F343E :0402DD0014F5587547 :0502E10055400202B3CC :0602E6007551000202B395 :0602EC00AF558557848523 :0D02F2005885E020E621E00586F0A3158682 :0A02FF00DFF3E5542490F87640E5A3 :080309005404541FB553030214 :0503110002E6F55405B1 :070316005680B58F55858468 :0C031D005785855820E58C20E4BF540F64 :0C032900B40E98E5542490F87440C39F73 :0D033500F6E556700774FC26501380042472 :0C034200F8400DE55404541FB5530302AD :05034E0002C4F552029B :0203530002C4E2 :05035500E553B5524F15 :0C035A00907FC8E020E146E54A2480F8CE :09036600E54A04540FB5490302F5 :02036F0003E7A2 :0D037100FF907FC9E0F6FD6020FEE54A0325 :0C037E0003F58454C02400C584543F34AF :06038A0010F585907DC016 :0A039000E0A30586F0A31586DEF653 :09039A008F4AED24C060028F4877 :0403A300907FC9F08E :0203A700803E96 :0C03A900907FB8E020E1AAE5532490F812 :0D03B500E66020FEE5530303F58454C024E8 :0C03C20000C584543F3414F585907E0083 :0A03CE000586E0A31586F0A3DEF615 :0C03D800E6907FB9F0E55304541FF55384 :0303E40002035AB7 :0303E70002018E82 :0E03EA00C0E0C0F0C082C083C0D075D000C09B :0E03F80086758600C289D086D0D0D083D08290 :05040600D0F0D0E0324F :0E040B00C0E0C0F0C082C083C0D075D000C079 :0E04190086758600C28DD086D0D0D083D0826A :05042700D0F0D0E0322E :0E042C00C0E0C0F0C082C083C0D075D000C058 :0E043A0086758600C28BD086D0D0D083D0824B :05044800D0F0D0E0320D :0E044D00C0E0C0F0C082C083C0D075D000C037 :0E045B0086758600C28FD086D0D0D083D08226 :05046900D0F0D0E032EC :0E046E00C0E0C0F0C082C083C0D075D000C016 :0E047C0086758600C00010981610990FD000EB :0E048A00D086D0D0D083D082D0F0D0E032D255 :060498000B80EAE56A2476 :0B049E005AF8E599F6E56A04540FF5E2 :0304A9006A80DC8A :0E04AC00C0E0C0F0C082C083C0D075D000C0D8 :0E04BA0086758600C2CFD086D0D0D083D08287 :0504C800D0F0D0E0328D :0E04CD00C0E0C0F0C082C083C0D075D000C0B7 :0E04DB0086758600C2DCD086D0D0D083D08259 :0504E900D0F0D0E0326C :0E04EE00C0E0C0F0C082C083C0D075D000C096 :0E04FC0086758600C2C0C2C1D086D0D0D08323 :07050A00D082D0F0D0E032F6 :0E051100C0E0C0F0C082C083C0D075D000C072 :0E051F0086758600E591C2E5F591D086D0D0B4 :09052D00D083D082D0F0D0E0327E :0E053600C0E0C0F0C082C083C0D075D000C04D :0E05440086758600E591C2E6F591D086D0D08E :09055200D083D082D0F0D0E03259 :0E055B00C0E0C0F0C082C083C0D075D000C028 :0E05690086758600E591C2E7F591D086D0D068 :09057700D083D082D0F0D0E03234 :0E058000C0E0C0F0C082C083C0D075D000C003 :0E058E0086758600C2DBD086D0D0D083D082A6 :05059C00D0F0D0E032B8 :0E05A100C0E0C0F0C082C083C084C085C0D05E :0E05AF0075D000C086758600C000C007E591BB :0D05BD00C2E4F591907FAB7401F075400031 :0E05CA00907FE9E0B40659907FE8E0B4804FDE :0D05D800907FEBE0B4010C907FD4740DF027 :0605E500A374D4F080397C :0D05EB00B40212907FEAE07033907FD47468 :0805F8000DF0A374E6F080246D :0E060000B40324907FEAE024FC401CE025E0D7 :0C060E00242BF582E4340EF583E0F5F0B7 :0A061A00A3E0907FD4F0A3E5F0F018 :030624000209B414 :030627000209B015 :0E062A00B40941907FE8E070F4907FEAE0248C :06063800FE40ECE0F56F4E :0E063E00907FD77807E84410F04430F0E8F0E1 :0E064C004420F0D8F2E4F07402907FB67807F4 :0E065A00F0A3A3D8FB907FC67807F0A3A3D827 :06066800FB120AF180B64E :0D066E00B40B1A907FE8E0B401AFE56FB463 :0D067B0001AA907FECE070A4907FEAE0F50A :030688007080B3CC :0D068B00B40A20907FE8E0B48192E56FB4DE :0A069800018D907FECE07087E570A3 :0C06A200907F00F0907FB57401F0804E56 :0D06AE00B4080B907FE8E0B48047E56F8052 :0106BB00E658 :0B06BC007044907FE8E0B480117401EE :0E06C700907F00F0A3E4F0907FB57402F08005 :0106D50026FE :0606D600B48103E480EB97 :0E06DC00B48220907FECE0907FC430E7039062 :0E06EA007FB4540F600F20E30C25E02582F54D :0406F80082E080CB51 :0306FC000209B43C :0306FF000209B03D :08070200B4030575F001800647 :06070A00B4014475F0008B :0E071000907FE8E0B402E8A3A3E070E3A3E06A :0E071E0070DFA3E0907FC430E705907FB44405 :0E072C001020E3CF541F0586907FD7F04420A5 :0E073A00F0540FF0158625E02582F582E5F0DB :03074800F080B18D :03074B0002081988 :03074E000209B0ED :0D075100B4C0F7907FE8E0B4C0F3E545F5D3 :0D075E00F0D2F24550B40002C2F290C00E7D :0D076B00E0A2E6B3820892F390C009E0A27C :0C077800E0B00872F392F3A20B92F5E4DB :0D078400907F04F0907F00E5F0F0E548F470 :0C0791002549540F907F01F0E553F4253A :0D079D005204541F907F02F090C004E090C1 :0C07AA007F03F00544E544907F05F0E576 :0807B60045A3F0E549A3F0E5BD :0807BE0048A3F0E54AA3F0E5B1 :0807C6004BA3F0E546A3F0E5AA :0807CE0047A3F0E551A3F0E59B :0807D60053A3F0E552A3F0E586 :0807DE0054A3F0E555A3F0E57A :0D07E60059907F12F090C000E0907F13F05A :0D07F300A3E520F090C009E0907F15F09084 :0E0800007FC8E0907F16F0907FEEE024E95074 :0B080E0001E42417907FB5F00209B44C :0D081900B4C81D907FE8E0B4C01374013036 :0D082600080104907F00F0907FB57401F090 :030833000209B403 :030836000209B004 :0E083900B4C921907FE8E0B4C017907F00782A :0D084700F0E26005F008A380F8E8241090AE :060854007FB5F00209B4BB :03085A000209B0E0 :0E085D00B4D05D907FE8E0B4C053907FECE033 :0C086B00B4010A907FEAE05401F550D27D :010877000A76 :0C087800907F00E545455060027401F0DF :0D08840090C00EE0A2E6A00892F090C0091E :0C089100E0A2E0720882F0B3E492E09074 :0E089D007F01F090C004E0907F02F0907FEEAB :0D08AB00E024FD5001E42403907FB5F0022D :0208B80009B481 :0308BA000209B080 :0E08BD00B4D129907FE8E0B4C01F907F00788E :0D08CB00E07F06E2F0A308DFFA907FEEE088 :0E08D80024FA5001E42406907FB5F00209B422 :0308E6000209B054 :0E08E900B4D220907FE8E0B44016907FEAE0A1 :0E08F700F5F0907F98E0A2F092E3A2F192E576 :04090500F00209B43F :030909000209B030 :0E090C00B4D316907FE8E0B44007907FEAE095 :03091A00100B03BC :03091D000209B01C :05092000F5990209B485 :0D092500B4D44C907FE8E0B4C04220083FFD :0E093200907FECE0907FEAB40109E090C00DE8 :0D094000F0F56E800AB40207E090C00CF0E4 :0C094D00F56D90C00EE0907F00F0E56EAC :0D095900A3F0E56DA3F0907FEEE024FD50CB :0B09660001E42403907FB5F00209B407 :030971000209B0C8 :0E097400B4D539907FE8E0B4C02F907FECE05E :0D098200B4010A907FEAE090C00AF0F56C25 :0D098F0090C00BE0907F00F0E56CA3F090AD :0E099C007FEEE024FE5001E42402907FB5F0CF :0309AA000209B48B :0309AD000209B08C :0409B000740380024A :0209B4007402CB :0409B600907FB4F08A :0E09BA00D007D000D086D0D0D085D084D08396 :0709C800D082D0F0D0E03234 :0E09CF00C0E0C0F0C082C083C0D075D000C0B0 :0E09DD0086758600E591C2E4F591907FAB74BB :0E09EB0002F0D086D0D0D083D082D0F0D0E001 :0109F90032CB :0E09FA00C0E0C0F0C082C083C0D075D000C085 :0E0A080086758600E591C2E4F591907FAB748F :0E0A160004F0D086D0D0D083D082D0F0D0E0D3 :010A2400329F :0E0A2500C0E0C0F0C082C083C0D075D000C059 :0E0A330086758600E591C2E4F591907FAB7464 :0E0A410008F0D086D0D0D083D082D0F0D0E0A4 :010A4F003274 :0E0A5000C0E0C0F0C082C083C0D075D000C02E :0E0A5E0086758600E591C2E4F591907FAB7439 :0E0A6C0010F0D086D0D0D083D082D0F0D0E071 :010A7A003249 :0E0A7B00C0E0C0F0C082C083C084C085C0D07F :0E0A890075D000C086758600C000C007E591DC :0E0A9700C2E4F591907FA97401F0D007D00061 :0E0AA500D086D0D0D085D084D083D082D0F03F :030AB300D0E0325E :0E0AB600C0E0C0F0C082C083C084C085C0D044 :0E0AC40075D000C086758600C000C006E591A2 :0E0AD200C2E4F591907FAA7401F0D006D00026 :0E0AE000D086D0D0D085D084D083D082D0F004 :030AEE00D0E03223 :0C0AF100E545F5F0D2F24550B40002C219 :0D0AFD00F290C00EE0A2E6B3820892F390E2 :0C0B0A00C009E0A2E0B00872F392F3A270 :070B16000B92F5D3E553B586 :0D0B1D005206907FB8E0A2E192F4907E8035 :0B0B2A00E5F0F0E548F42549540F9079 :0C0B35007E81F0E553F4255204541F901B :0D0B41007E82F090C004E0907E83F00544B9 :0D0B4E00E544907E84F075F005907E85E50D :0C0B5B006BB56A07907FB7E5F0F022242C :0C0B67005AF8E6F0A305F0E56B04540F0B :040B7300F56B80E3BB :0E0B7700C0E0C0F0C082C083C0D075D000C006 :0E0B850086758600E591C2E4F591907FA97413 :0E0B930002F0120AF1D086D0D0D083D082D0EA :040BA100F0D0E0327E :0E0BA500C0E0C0F0C082C083C0D075D000C0D8 :0E0BB30086758600E591C2E4F591907FAA74E4 :0E0BC10002F0D086D0D0D083D082D0F0D0E029 :010BCF0032F3 :0E0BD000C0E0C0F0C082C083C0D075D000C0AD :0E0BDE0086758600E591C2E4F591907FA974BA :0E0BEC0004F0D086D0D0D083D082D0F0D0E0FC :010BFA0032C8 :0E0BFB00C0E0C0F0C082C083C0D075D000C082 :0E0C090086758600E591C2E4F591907FAA748D :0E0C170004F0D086D0D0D083D082D0F0D0E0D0 :010C2500329C :0E0C2600C0E0C0F0C082C083C0D075D000C056 :0E0C340086758600E591C2E4F591907FA97463 :0E0C420008F0D086D0D0D083D082D0F0D0E0A1 :010C50003271 :0E0C5100C0E0C0F0C082C083C0D075D000C02B :0E0C5F0086758600E591C2E4F591907FAA7437 :0E0C6D0008F0D086D0D0D083D082D0F0D0E076 :010C7B003246 :0E0C7C00C0E0C0F0C082C083C0D075D000C000 :0E0C8A0086758600E591C2E4F591907FA9740D :0E0C980010F0D086D0D0D083D082D0F0D0E043 :010CA600321B :0E0CA700C0E0C0F0C082C083C0D075D000C0D5 :0E0CB50086758600E591C2E4F591907FAA74E1 :0E0CC30010F0D086D0D0D083D082D0F0D0E018 :010CD10032F0 :0E0CD200C0E0C0F0C082C083C0D075D000C0AA :0E0CE00086758600E591C2E4F591907FA974B7 :0E0CEE0020F0D086D0D0D083D082D0F0D0E0DD :010CFC0032C5 :0E0CFD00C0E0C0F0C082C083C0D075D000C07F :0E0D0B0086758600E591C2E4F591907FAA748A :0E0D190020F0D086D0D0D083D082D0F0D0E0B1 :010D27003299 :0E0D2800C0E0C0F0C082C083C0D075D000C053 :0E0D360086758600E591C2E4F591907FA97460 :0E0D440040F0D086D0D0D083D082D0F0D0E066 :010D5200326E :0E0D5300C0E0C0F0C082C083C0D075D000C028 :0E0D610086758600E591C2E4F591907FAA7434 :0E0D6F0040F0D086D0D0D083D082D0F0D0E03B :010D7D003243 :0E0D7E00C0E0C0F0C082C083C0D075D000C0FD :0E0D8C0086758600E591C2E4F591907FA9740A :0E0D9A0080F0D086D0D0D083D082D0F0D0E0D0 :010DA8003218 :0E0DA900C0E0C0F0C082C083C0D075D000C0D2 :0E0DB70086758600E591C2E4F591907FAA74DE :0E0DC50080F0D086D0D0D083D082D0F0D0E0A5 :010DD30032ED :0E0DD40012010001FF00FF40C0BA36610200AC :040DE2000102030106 :0E0DE60009024500010100400009040000035D :0E0DF400FF00FF000705810240000007058296 :0E0E0200024000000705020240000009040043 :0E0E10000103FF00FF000705810340000A07F1 :0D0E1E0005820240000007050202400000AE :020E2B00330E84 :020E2D00370E7E :020E2F00450E6E :020E3100610E50 :040E330004030000B4 :0E0E37000E0342006100790063006F006D0041 :0E0E45001C0355005300420046004C004500BF :0E0E5300580020002800460053004B002900E4 :0E0E610002030000000000000000000000007E :0E0E6F00000000000000000000000000000075 :060E7D000000000000006F :00000001FF baycomusb-0.10.orig/firmware/fskfirmware/main.rel0100644000175100017510000007305707340435154020215 0ustar abaabaXH H A areas 1 global symbols M main A _CODE size 0 flags 0 A CODE size 157 flags 20 A CSEG size D2C flags 20 S fillusbintr Def099A A GSINIT size 8 flags 20 A GSINIT2 size 160 flags 20 A OSEG size 0 flags 4 A BSEG size C flags 80 A ISEG size 80 flags 0 A DSEG size 31 flags 0 A XSEG size C00 flags 0 T 00 00 02 00 00 02 02 93 R 00 00 00 01 00 03 00 03 00 06 00 02 T 00 06 R 00 00 00 01 T 00 0B 02 02 B4 R 00 00 00 01 00 03 00 02 T 00 0E R 00 00 00 01 T 00 13 02 02 D5 R 00 00 00 01 00 03 00 02 T 00 16 R 00 00 00 01 T 00 1B 02 02 F6 R 00 00 00 01 00 03 00 02 T 00 1E R 00 00 00 01 T 00 23 02 03 17 R 00 00 00 01 00 03 00 02 T 00 26 R 00 00 00 01 T 00 2B 02 03 55 R 00 00 00 01 00 03 00 02 T 00 2E R 00 00 00 01 T 00 33 02 03 76 R 00 00 00 01 00 03 00 02 T 00 36 R 00 00 00 01 T 00 3B 02 03 97 R 00 00 00 01 00 03 00 02 T 00 3E R 00 00 00 01 T 00 43 02 01 00 R 00 00 00 01 00 03 00 01 T 00 46 R 00 00 00 01 T 00 4B 02 03 BA R 00 00 00 01 00 03 00 02 T 00 4E R 00 00 00 01 T 00 53 02 03 DF R 00 00 00 01 00 03 00 02 T 00 56 R 00 00 00 01 T 00 5B 02 04 04 R 00 00 00 01 00 03 00 02 T 00 5E R 00 00 00 01 T 00 63 02 04 29 R 00 00 00 01 00 03 00 02 T 00 66 R 00 00 00 01 T 00 E0 00 00 00 00 00 00 00 01 R 00 00 00 01 T 00 E8 R 00 00 00 01 T 00 F0 R 00 00 00 01 T 00 F0 30 30 30 30 30 30 30 30 00 R 00 00 00 01 T 00 F9 R 00 00 00 01 T 01 00 R 00 00 00 01 T 01 00 02 04 4A R 00 00 00 01 00 03 00 02 T 01 03 R 00 00 00 01 T 01 04 02 08 78 R 00 00 00 01 00 03 00 02 T 01 07 R 00 00 00 01 T 01 08 02 08 A3 R 00 00 00 01 00 03 00 02 T 01 0B R 00 00 00 01 T 01 0C 02 08 CE R 00 00 00 01 00 03 00 02 T 01 0F R 00 00 00 01 T 01 10 02 08 F9 R 00 00 00 01 00 03 00 02 T 01 13 R 00 00 00 01 T 01 14 32 R 00 00 00 01 T 01 15 R 00 00 00 01 T 01 18 02 09 24 R 00 00 00 01 00 03 00 02 T 01 1B R 00 00 00 01 T 01 1C 02 09 5F R 00 00 00 01 00 03 00 02 T 01 1F R 00 00 00 01 T 01 20 02 0A 20 R 00 00 00 01 00 03 00 02 T 01 23 R 00 00 00 01 T 01 24 02 0A 4E R 00 00 00 01 00 03 00 02 T 01 27 R 00 00 00 01 T 01 28 02 0A 79 R 00 00 00 01 00 03 00 02 T 01 2B R 00 00 00 01 T 01 2C 02 0A A4 R 00 00 00 01 00 03 00 02 T 01 2F R 00 00 00 01 T 01 30 02 0A CF R 00 00 00 01 00 03 00 02 T 01 33 R 00 00 00 01 T 01 34 02 0A FA R 00 00 00 01 00 03 00 02 T 01 37 R 00 00 00 01 T 01 38 02 0B 25 R 00 00 00 01 00 03 00 02 T 01 3B R 00 00 00 01 T 01 3C 02 0B 50 R 00 00 00 01 00 03 00 02 T 01 3F R 00 00 00 01 T 01 40 02 0B 7B R 00 00 00 01 00 03 00 02 T 01 43 R 00 00 00 01 T 01 44 02 0B A6 R 00 00 00 01 00 03 00 02 T 01 47 R 00 00 00 01 T 01 48 02 0B D1 R 00 00 00 01 00 03 00 02 T 01 4B R 00 00 00 01 T 01 4C 02 0B FC R 00 00 00 01 00 03 00 02 T 01 4F R 00 00 00 01 T 01 50 02 0C 27 R 00 00 00 01 00 03 00 02 T 01 53 R 00 00 00 01 T 01 54 02 0C 52 R 00 00 00 01 00 03 00 02 T 00 00 R 00 00 00 06 T 00 01 R 00 00 00 06 T 00 02 R 00 00 00 06 T 00 03 R 00 00 00 06 T 00 04 R 00 00 00 06 T 00 05 R 00 00 00 06 T 00 06 R 00 00 00 06 T 00 07 R 00 00 00 06 T 00 08 R 00 00 00 06 T 00 09 R 00 00 00 06 T 00 0A R 00 00 00 06 T 00 0B R 00 00 00 06 T 00 00 R 00 00 00 07 T 00 10 R 00 00 00 07 T 00 30 R 00 00 00 07 T 00 00 R 00 00 00 08 T 00 01 R 00 00 00 08 T 00 03 R 00 00 00 08 T 00 04 R 00 00 00 08 T 00 05 R 00 00 00 08 T 00 06 R 00 00 00 08 T 00 08 R 00 00 00 08 T 00 09 R 00 00 00 08 T 00 0A R 00 00 00 08 T 00 0B R 00 00 00 08 T 00 0C R 00 00 00 08 T 00 0E R 00 00 00 08 T 00 0F R 00 00 00 08 T 00 10 R 00 00 00 08 T 00 11 R 00 00 00 08 T 00 12 R 00 00 00 08 T 00 13 R 00 00 00 08 T 00 14 R 00 00 00 08 T 00 15 R 00 00 00 08 T 00 16 R 00 00 00 08 T 00 17 R 00 00 00 08 T 00 19 R 00 00 00 08 T 00 1A R 00 00 00 08 T 00 2A R 00 00 00 08 T 00 2B R 00 00 00 08 T 00 2C R 00 00 00 08 T 00 2D R 00 00 00 08 T 00 2E R 00 00 00 08 T 00 2F R 00 00 00 08 T 00 30 R 00 00 00 08 T 00 00 R 00 00 00 09 T 04 00 R 00 00 00 09 T 00 00 R 00 00 00 03 T 00 00 75 81 00 30 E4 F5 D0 F5 86 R 00 00 00 03 09 04 00 07 T 00 08 R 00 00 00 03 T 00 00 R 00 00 00 04 T 00 00 E4 F5 00 05 F5 00 08 F5 R 00 00 00 04 29 04 00 08 29 07 00 08 T 00 06 00 09 F5 00 0A F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 0A 00 10 F5 00 11 F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 0E 00 12 F5 00 13 F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 12 00 14 F5 00 04 F5 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 16 00 2B F5 00 2A F5 86 D2 R 00 00 00 04 29 02 00 08 29 05 00 08 T 00 1C 00 0B 75 8E 30 75 89 21 75 88 55 75 8D 64 R 00 00 00 04 29 02 00 06 T 00 29 75 87 00 90 7F A1 74 01 F0 90 7F AF 74 01 R 00 00 00 04 T 00 37 F0 E4 90 7F E0 F0 90 7F E1 F0 90 7F DD 74 R 00 00 00 04 T 00 45 09 F0 90 7F DE 74 07 F0 90 7F DF 74 05 F0 R 00 00 00 04 T 00 53 90 7F D7 74 12 F0 74 32 F0 74 02 F0 74 22 R 00 00 00 04 T 00 61 F0 90 7F 93 74 00 F0 90 7F 96 74 82 F0 90 R 00 00 00 04 T 00 6F 7F 9C 74 C2 F0 90 7F 94 74 00 F0 90 7F 9D R 00 00 00 04 T 00 7D 74 00 F0 90 7F 95 74 C3 F0 90 7F 98 74 28 R 00 00 00 04 T 00 8B F0 90 7F 9E 74 2A F0 75 A8 92 75 E8 01 90 R 00 00 00 04 T 00 99 7F AE 74 01 F0 90 7F AC 74 03 F0 90 7F AD R 00 00 00 04 T 00 A7 74 01 F0 75 98 52 78 00 F0 90 0D 0C E2 60 R 00 00 00 04 09 09 00 01 00 0C 00 02 T 00 B4 06 F0 A3 A3 08 80 F7 E8 24 11 25 E0 90 R 00 00 00 04 T 00 C1 0D 0A F0 R 00 00 00 04 00 02 00 02 T 00 C4 R 00 00 00 04 T 00 C4 75 20 42 78 00 E6 E2 A2 E0 92 00 08 92 R 00 00 00 04 09 06 00 01 29 0C 00 06 T 00 CF 00 07 92 00 03 78 R 00 00 00 04 29 02 00 06 29 05 00 06 T 00 D3 00 E7 E2 A2 E0 92 00 09 92 R 00 00 00 04 09 02 00 01 29 08 00 06 T 00 DA 00 01 E5 20 90 C0 08 F0 90 C0 0C 74 FF F0 R 00 00 00 04 29 02 00 06 T 00 E7 F5 00 2D 30 00 08 09 74 67 F0 90 C0 0D 74 R 00 00 00 04 29 03 00 08 29 06 00 06 T 00 F3 7F F0 R 00 00 00 04 T 00 F5 R 00 00 00 04 T 00 F5 90 C0 0A 74 1F F0 F5 00 2C E4 F5 00 2F F5 R 00 00 00 04 29 09 00 08 29 0D 00 08 T 01 01 00 30 90 D1 20 A3 E5 82 45 83 70 F9 90 R 00 00 00 04 29 02 00 08 T 01 0D 7F D6 74 0A F0 7A 1E 90 E8 90 A3 E5 82 45 R 00 00 00 04 T 01 1B 83 70 F9 DA F4 90 7F D6 74 06 F0 30 00 08 R 00 00 00 04 29 0E 00 06 T 01 28 08 90 C0 0D 74 FF F0 F5 00 2E R 00 00 00 04 29 0A 00 08 T 01 31 R 00 00 00 04 T 01 31 12 09 9A R 00 00 00 04 00 03 00 02 T 01 34 R 00 00 00 04 T 01 34 90 7F C8 E0 20 E1 F9 90 7F C9 E0 B4 01 0D R 00 00 00 04 T 01 42 90 7D C0 E0 B4 55 06 90 7F C9 F0 80 06 90 R 00 00 00 04 T 01 50 7F C9 F0 80 DF R 00 00 00 04 T 01 55 R 00 00 00 04 T 01 55 90 C0 03 7F 40 E0 DF FD 02 00 37 R 00 00 00 04 00 0B 00 02 T 00 00 R 00 00 00 02 T 00 00 E5 00 05 45 00 10 60 18 R 00 00 00 02 29 03 00 08 29 06 00 08 T 00 06 R 00 00 00 02 T 00 06 A2 00 08 50 06 90 C0 0D 74 EF F0 92 00 01 R 00 00 00 02 29 03 00 06 29 0E 00 06 T 00 12 B3 92 00 00 D2 00 02 E5 20 90 C0 08 F0 22 R 00 00 00 02 29 04 00 06 29 07 00 06 T 00 1E R 00 00 00 02 T 00 1E C2 00 00 A2 00 08 50 06 90 C0 0D 74 FF F0 R 00 00 00 02 29 03 00 06 29 06 00 06 T 00 2A 72 00 09 92 00 01 C2 R 00 00 00 02 29 03 00 06 29 06 00 06 T 00 2F 00 02 E5 20 90 C0 08 F0 22 R 00 00 00 02 29 02 00 06 T 00 37 R 00 00 00 02 T 00 37 R 00 00 00 02 T 00 37 E5 00 05 60 06 B4 02 52 02 00 F8 R 00 00 00 02 29 03 00 08 00 0B 00 02 T 00 41 R 00 00 00 02 T 00 41 E5 00 08 B5 00 09 0C 10 R 00 00 00 02 29 03 00 08 29 06 00 08 T 00 47 00 0A 03 R 00 00 00 02 29 02 00 06 T 00 49 R 00 00 00 02 T 00 49 02 01 5C R 00 00 00 02 00 03 00 02 T 00 4C R 00 00 00 02 T 00 4C 12 00 00 02 01 5C R 00 00 00 02 00 03 00 02 00 06 00 02 T 00 52 R 00 00 00 02 T 00 52 E5 00 09 24 00 00 F8 E6 24 FC 40 03 02 R 00 00 00 02 29 03 00 08 09 06 00 07 T 00 5D 01 41 R 00 00 00 02 00 02 00 02 T 00 5F R 00 00 00 02 T 00 5F E5 00 09 03 03 F5 82 54 C0 24 00 00 C5 82 R 00 00 00 02 29 03 00 08 09 0C 00 09 T 00 6B 54 3F 34 00 00 F5 83 E0 F5 00 06 A3 E0 F5 R 00 00 00 02 89 05 00 09 29 0B 00 08 T 00 77 00 07 05 00 05 75 R 00 00 00 02 29 02 00 08 29 05 00 08 T 00 7B 00 0F 02 78 00 E2 E2 70 0B 78 R 00 00 00 02 29 02 00 08 09 06 00 01 T 00 83 00 E1 E2 C3 95 00 07 50 03 E2 F5 R 00 00 00 02 09 02 00 01 29 07 00 08 T 00 8C 00 07 R 00 00 00 02 29 02 00 08 T 00 8D R 00 00 00 02 T 00 8D 12 00 06 R 00 00 00 02 00 03 00 02 T 00 90 R 00 00 00 02 T 00 90 90 C0 00 E0 60 B3 FF 90 C0 0E E0 90 C0 03 R 00 00 00 02 T 00 9E A2 E5 82 00 08 40 28 E5 00 06 FE 9F F5 R 00 00 00 02 29 05 00 06 29 0A 00 08 T 00 A9 00 06 E5 00 07 94 00 F5 R 00 00 00 02 29 02 00 08 29 05 00 08 T 00 AF 00 07 50 1A EE 60 05 74 7E F0 DE FD E5 R 00 00 00 02 29 02 00 08 T 00 BB 00 05 04 54 03 F5 00 05 70 06 12 R 00 00 00 02 29 02 00 08 29 08 00 08 T 00 C4 00 00 02 01 5C 02 R 00 00 00 02 00 02 00 02 00 05 00 02 T 00 CA 00 D4 R 00 00 00 02 00 02 00 02 T 00 CC R 00 00 00 02 T 00 CC 74 7E F0 DF FD R 00 00 00 02 T 00 D1 R 00 00 00 02 T 00 D1 02 01 5C R 00 00 00 02 00 03 00 02 T 00 D4 R 00 00 00 02 T 00 D4 E5 00 09 24 00 00 F5 R 00 00 00 02 29 03 00 08 09 06 00 07 T 00 D9 00 0E F8 E6 F4 04 25 00 0F 40 5F F5 R 00 00 00 02 29 02 00 08 29 09 00 08 T 00 E3 00 0B E5 00 09 03 03 F5 R 00 00 00 02 29 02 00 08 29 05 00 08 T 00 E9 00 0C 54 C0 25 00 0F 24 R 00 00 00 02 29 02 00 08 29 07 00 08 T 00 EF 00 00 C5 00 0C 54 3F 34 R 00 00 00 02 09 02 00 09 29 05 00 08 T 00 F5 00 00 F5 00 0D R 00 00 00 02 89 02 00 09 29 05 00 08 T 00 F8 R 00 00 00 02 T 00 F8 90 C0 00 E0 60 D3 FF E5 00 0B 60 25 2F C5 R 00 00 00 02 29 0A 00 08 T 01 05 00 0B 50 06 F4 04 FF 75 00 0B 00 90 C0 00 R 00 00 00 02 29 02 00 08 29 0A 00 08 T 01 11 85 00 0C 84 85 00 0D 85 05 86 E0 A3 15 86 R 00 00 00 02 29 03 00 08 29 07 00 08 T 01 1D F0 DF F7 85 84 00 0C 85 85 00 0D 80 D0 R 00 00 00 02 29 07 00 08 29 0B 00 08 T 01 28 R 00 00 00 02 T 01 28 75 00 0F 00 A8 00 0E E6 20 E6 13 EF 24 FD R 00 00 00 02 29 03 00 08 29 07 00 08 T 01 34 50 9B 90 C0 01 F0 F0 90 C0 03 74 7E F0 R 00 00 00 02 T 01 41 R 00 00 00 02 T 01 41 75 00 0F 02 R 00 00 00 02 29 03 00 08 T 01 44 R 00 00 00 02 T 01 44 E5 00 09 04 54 0F F5 00 09 B5 R 00 00 00 02 29 03 00 08 29 09 00 08 T 01 4C 00 08 86 05 00 05 75 R 00 00 00 02 29 02 00 08 29 06 00 08 T 01 51 00 06 28 75 00 07 00 02 R 00 00 00 02 29 02 00 08 29 06 00 08 T 01 57 00 90 R 00 00 00 02 00 02 00 02 T 01 59 R 00 00 00 02 T 01 59 02 01 FE R 00 00 00 02 00 03 00 02 T 01 5C R 00 00 00 02 T 01 5C 90 C0 02 E5 00 11 70 32 80 01 E0 E0 20 E5 R 00 00 00 02 29 06 00 08 T 01 69 EF 30 E7 F8 R 00 00 00 02 T 01 6D R 00 00 00 02 T 01 6D 75 00 16 00 75 00 11 01 E5 R 00 00 00 02 29 03 00 08 29 07 00 08 T 01 74 00 12 F5 00 14 R 00 00 00 02 29 02 00 08 29 05 00 08 T 01 77 R 00 00 00 02 T 01 77 E5 00 14 03 03 F5 00 17 54 C0 24 R 00 00 00 02 29 03 00 08 29 08 00 08 T 01 80 04 00 C5 00 17 54 3F 34 R 00 00 00 02 09 02 00 09 29 05 00 08 T 01 86 04 00 F5 00 18 75 R 00 00 00 02 89 02 00 09 29 05 00 08 T 01 8A 00 15 40 02 01 5C R 00 00 00 02 29 02 00 08 00 06 00 02 T 01 8F R 00 00 00 02 T 01 8F 75 00 11 00 02 01 5C R 00 00 00 02 29 03 00 08 00 07 00 02 T 01 95 R 00 00 00 02 T 01 95 AF 00 15 85 00 17 84 85 R 00 00 00 02 29 03 00 08 29 06 00 08 T 01 9B 00 18 85 E0 20 E6 21 E0 05 86 F0 A3 15 86 R 00 00 00 02 29 02 00 08 T 01 A8 DF F3 E5 00 14 24 00 10 F8 76 40 E5 R 00 00 00 02 29 05 00 08 09 08 00 07 T 01 B2 00 14 04 54 1F B5 00 13 03 02 R 00 00 00 02 29 02 00 08 29 08 00 08 T 01 BA 01 8F F5 00 14 05 R 00 00 00 02 00 02 00 02 29 05 00 08 T 01 BF 00 16 80 B5 8F 00 15 85 84 R 00 00 00 02 29 02 00 08 29 07 00 08 T 01 C6 00 17 85 85 00 18 20 E5 8C 20 E4 BF 54 0F R 00 00 00 02 29 02 00 08 29 06 00 08 T 01 D2 B4 0E 98 E5 00 14 24 00 10 F8 74 40 C3 9F R 00 00 00 02 29 06 00 08 09 09 00 07 T 01 DE F6 E5 00 16 70 07 74 FC 26 50 13 80 04 24 R 00 00 00 02 29 04 00 08 T 01 EB F8 40 0D E5 00 14 04 54 1F B5 00 13 03 02 R 00 00 00 02 29 06 00 08 29 0C 00 08 T 01 F7 01 6D F5 00 12 02 R 00 00 00 02 00 02 00 02 29 05 00 08 T 01 FC 01 6D R 00 00 00 02 00 02 00 02 T 01 FE R 00 00 00 02 T 01 FE E5 00 13 B5 00 12 4F R 00 00 00 02 29 03 00 08 29 06 00 08 T 02 03 R 00 00 00 02 T 02 03 90 7F C8 E0 20 E1 46 E5 00 0A 24 00 00 F8 R 00 00 00 02 29 0A 00 08 09 0D 00 07 T 02 0F E5 00 0A 04 54 0F B5 00 09 03 02 R 00 00 00 02 29 03 00 08 29 09 00 08 T 02 18 02 90 R 00 00 00 02 00 02 00 02 T 02 1A R 00 00 00 02 T 02 1A FF 90 7F C9 E0 F6 FD 60 20 FE E5 00 0A 03 R 00 00 00 02 29 0D 00 08 T 02 27 03 F5 84 54 C0 24 00 00 C5 84 54 3F 34 R 00 00 00 02 09 08 00 09 T 02 33 00 00 F5 85 90 7D C0 R 00 00 00 02 89 02 00 09 T 02 39 R 00 00 00 02 T 02 39 E0 A3 05 86 F0 A3 15 86 DE F6 R 00 00 00 02 T 02 43 R 00 00 00 02 T 02 43 8F 00 0A ED 24 C0 60 02 8F 00 08 R 00 00 00 02 29 03 00 08 29 0B 00 08 T 02 4C R 00 00 00 02 T 02 4C 90 7F C9 F0 R 00 00 00 02 T 02 50 R 00 00 00 02 T 02 50 80 3E R 00 00 00 02 T 02 52 R 00 00 00 02 T 02 52 90 7F B8 E0 20 E1 AA E5 00 13 24 00 10 F8 R 00 00 00 02 29 0A 00 08 09 0D 00 07 T 02 5E E6 60 20 FE E5 00 13 03 03 F5 84 54 C0 24 R 00 00 00 02 29 07 00 08 T 02 6B 04 00 C5 84 54 3F 34 04 00 F5 85 90 7E 00 R 00 00 00 02 09 02 00 09 89 09 00 09 T 02 77 R 00 00 00 02 T 02 77 05 86 E0 A3 15 86 F0 A3 DE F6 R 00 00 00 02 T 02 81 R 00 00 00 02 T 02 81 E6 90 7F B9 F0 E5 00 13 04 54 1F F5 00 13 R 00 00 00 02 29 08 00 08 29 0E 00 08 T 02 8D 02 02 03 R 00 00 00 02 00 03 00 02 T 02 90 R 00 00 00 02 T 02 90 02 00 37 R 00 00 00 02 00 03 00 02 T 02 93 R 00 00 00 02 T 02 93 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 A1 86 75 86 00 C2 89 D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 02 AF D0 F0 D0 E0 32 R 00 00 00 02 T 02 B4 R 00 00 00 02 T 02 B4 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 C2 86 75 86 00 C2 8D D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 02 D0 D0 F0 D0 E0 32 R 00 00 00 02 T 02 D5 R 00 00 00 02 T 02 D5 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 E3 86 75 86 00 C2 8B D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 02 F1 D0 F0 D0 E0 32 R 00 00 00 02 T 02 F6 R 00 00 00 02 T 02 F6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 04 86 75 86 00 C2 8F D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 12 D0 F0 D0 E0 32 R 00 00 00 02 T 03 17 R 00 00 00 02 T 03 17 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 25 86 75 86 00 C0 00 10 98 16 10 99 0F D0 00 R 00 00 00 02 T 03 33 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 32 D2 R 00 00 00 02 T 03 41 00 0B 80 EA E5 00 2A 24 R 00 00 00 02 29 02 00 06 29 07 00 08 T 03 47 00 1A F8 E5 99 F6 E5 00 2A 04 54 0F F5 R 00 00 00 02 09 02 00 08 29 09 00 08 T 03 52 00 2A 80 DC R 00 00 00 02 29 02 00 08 T 03 55 R 00 00 00 02 T 03 55 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 63 86 75 86 00 C2 CF D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 71 D0 F0 D0 E0 32 R 00 00 00 02 T 03 76 R 00 00 00 02 T 03 76 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 84 86 75 86 00 C2 DC D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 03 92 D0 F0 D0 E0 32 R 00 00 00 02 T 03 97 R 00 00 00 02 T 03 97 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 A5 86 75 86 00 C2 C0 C2 C1 D0 86 D0 D0 D0 83 R 00 00 00 02 T 03 B3 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 03 BA R 00 00 00 02 T 03 BA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 C8 86 75 86 00 E5 91 C2 E5 F5 91 D0 86 D0 D0 R 00 00 00 02 T 03 D6 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 03 DF R 00 00 00 02 T 03 DF C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 03 ED 86 75 86 00 E5 91 C2 E6 F5 91 D0 86 D0 D0 R 00 00 00 02 T 03 FB D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 04 04 R 00 00 00 02 T 04 04 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 12 86 75 86 00 E5 91 C2 E7 F5 91 D0 86 D0 D0 R 00 00 00 02 T 04 20 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 04 29 R 00 00 00 02 T 04 29 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 04 37 86 75 86 00 C2 DB D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 04 45 D0 F0 D0 E0 32 R 00 00 00 02 T 04 4A R 00 00 00 02 T 04 4A C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 04 58 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 04 66 C2 E4 F5 91 90 7F AB 74 01 F0 75 00 00 00 R 00 00 00 02 29 0D 00 08 T 04 73 90 7F E9 E0 B4 06 59 90 7F E8 E0 B4 80 4F R 00 00 00 02 T 04 81 90 7F EB E0 B4 01 0C 90 7F D4 74 0C 7D F0 R 00 00 00 02 89 0D 00 02 T 04 8E A3 74 0C 7D F0 80 39 R 00 00 00 02 09 04 00 02 T 04 94 R 00 00 00 02 T 04 94 B4 02 12 90 7F EA E0 70 33 90 7F D4 74 R 00 00 00 02 T 04 A1 0C 8F F0 A3 74 0C 8F F0 80 24 R 00 00 00 02 89 02 00 02 09 07 00 02 T 04 A9 R 00 00 00 02 T 04 A9 B4 03 24 90 7F EA E0 24 FC 40 1C E0 25 E0 R 00 00 00 02 T 04 B7 24 0C D4 F5 82 E4 34 0C D4 F5 83 E0 F5 F0 R 00 00 00 02 09 03 00 02 89 09 00 02 T 04 C3 A3 E0 90 7F D4 F0 A3 E5 F0 F0 R 00 00 00 02 T 04 CD R 00 00 00 02 T 04 CD 02 08 5D R 00 00 00 02 00 03 00 02 T 04 D0 R 00 00 00 02 T 04 D0 02 08 59 R 00 00 00 02 00 03 00 02 T 04 D3 R 00 00 00 02 T 04 D3 B4 09 41 90 7F E8 E0 70 F4 90 7F EA E0 24 R 00 00 00 02 T 04 E1 FE 40 EC E0 F5 00 2F R 00 00 00 02 29 07 00 08 T 04 E7 R 00 00 00 02 T 04 E7 90 7F D7 78 07 E8 44 10 F0 44 30 F0 E8 F0 R 00 00 00 02 T 04 F5 44 20 F0 D8 F2 E4 F0 74 02 90 7F B6 78 07 R 00 00 00 02 T 05 03 F0 A3 A3 D8 FB 90 7F C6 78 07 F0 A3 A3 D8 R 00 00 00 02 T 05 11 FB 12 09 9A 80 B6 R 00 00 00 02 00 04 00 02 T 05 17 R 00 00 00 02 T 05 17 B4 0B 1A 90 7F E8 E0 B4 01 AF E5 00 2F B4 R 00 00 00 02 29 0D 00 08 T 05 24 01 AA 90 7F EC E0 70 A4 90 7F EA E0 F5 R 00 00 00 02 T 05 31 00 30 80 B3 R 00 00 00 02 29 02 00 08 T 05 34 R 00 00 00 02 T 05 34 B4 0A 20 90 7F E8 E0 B4 81 92 E5 00 2F B4 R 00 00 00 02 29 0D 00 08 T 05 41 01 8D 90 7F EC E0 70 87 E5 00 30 R 00 00 00 02 29 0B 00 08 T 05 4B R 00 00 00 02 T 05 4B 90 7F 00 F0 90 7F B5 74 01 F0 80 4E R 00 00 00 02 T 05 57 R 00 00 00 02 T 05 57 B4 08 0B 90 7F E8 E0 B4 80 47 E5 00 2F 80 R 00 00 00 02 29 0D 00 08 T 05 64 E6 R 00 00 00 02 T 05 65 R 00 00 00 02 T 05 65 70 44 90 7F E8 E0 B4 80 11 74 01 R 00 00 00 02 T 05 70 R 00 00 00 02 T 05 70 90 7F 00 F0 A3 E4 F0 90 7F B5 74 02 F0 80 R 00 00 00 02 T 05 7E 26 R 00 00 00 02 T 05 7F R 00 00 00 02 T 05 7F B4 81 03 E4 80 EB R 00 00 00 02 T 05 85 R 00 00 00 02 T 05 85 B4 82 20 90 7F EC E0 90 7F C4 30 E7 03 90 R 00 00 00 02 T 05 93 7F B4 54 0F 60 0F 20 E3 0C 25 E0 25 82 F5 R 00 00 00 02 T 05 A1 82 E0 80 CB R 00 00 00 02 T 05 A5 R 00 00 00 02 T 05 A5 02 08 5D R 00 00 00 02 00 03 00 02 T 05 A8 R 00 00 00 02 T 05 A8 02 08 59 R 00 00 00 02 00 03 00 02 T 05 AB R 00 00 00 02 T 05 AB B4 03 05 75 F0 01 80 06 R 00 00 00 02 T 05 B3 R 00 00 00 02 T 05 B3 B4 01 44 75 F0 00 R 00 00 00 02 T 05 B9 R 00 00 00 02 T 05 B9 90 7F E8 E0 B4 02 E8 A3 A3 E0 70 E3 A3 E0 R 00 00 00 02 T 05 C7 70 DF A3 E0 90 7F C4 30 E7 05 90 7F B4 44 R 00 00 00 02 T 05 D5 10 20 E3 CF 54 1F 05 86 90 7F D7 F0 44 20 R 00 00 00 02 T 05 E3 F0 54 0F F0 15 86 25 E0 25 82 F5 82 E5 F0 R 00 00 00 02 T 05 F1 F0 80 B1 R 00 00 00 02 T 05 F4 R 00 00 00 02 T 05 F4 02 06 C2 R 00 00 00 02 00 03 00 02 T 05 F7 R 00 00 00 02 T 05 F7 02 08 59 R 00 00 00 02 00 03 00 02 T 05 FA R 00 00 00 02 T 05 FA B4 C0 F7 90 7F E8 E0 B4 C0 F3 E5 00 05 F5 R 00 00 00 02 29 0D 00 08 T 06 07 F0 D2 F2 45 00 10 B4 00 02 C2 F2 90 C0 0E R 00 00 00 02 29 06 00 08 T 06 14 E0 A2 E6 B3 82 00 08 92 F3 90 C0 09 E0 A2 R 00 00 00 02 29 07 00 06 T 06 21 E0 B0 00 08 72 F3 92 F3 A2 00 0B 92 F5 E4 R 00 00 00 02 09 04 00 06 29 0B 00 06 T 06 2D 90 7F 04 F0 90 7F 00 E5 F0 F0 E5 00 08 F4 R 00 00 00 02 29 0D 00 08 T 06 3A 25 00 09 54 0F 90 7F 01 F0 E5 00 13 F4 25 R 00 00 00 02 29 03 00 08 29 0C 00 08 T 06 46 00 12 04 54 1F 90 7F 02 F0 90 C0 04 E0 90 R 00 00 00 02 29 02 00 08 T 06 53 7F 03 F0 05 00 04 E5 00 04 90 7F 05 F0 E5 R 00 00 00 02 29 06 00 08 29 09 00 08 T 06 5F 00 05 A3 F0 E5 00 09 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 67 00 08 A3 F0 E5 00 0A A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 6F 00 0B A3 F0 E5 00 06 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 77 00 07 A3 F0 E5 00 11 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 7F 00 13 A3 F0 E5 00 12 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 87 00 14 A3 F0 E5 00 15 A3 F0 E5 R 00 00 00 02 29 02 00 08 29 07 00 08 T 06 8F 00 19 90 7F 12 F0 90 C0 00 E0 90 7F 13 F0 R 00 00 00 02 29 02 00 08 T 06 9C A3 E5 20 F0 90 C0 09 E0 90 7F 15 F0 90 R 00 00 00 02 T 06 A9 7F C8 E0 90 7F 16 F0 90 7F EE E0 24 E9 50 R 00 00 00 02 T 06 B7 01 E4 24 17 90 7F B5 F0 02 08 5D R 00 00 00 02 00 0B 00 02 T 06 C2 R 00 00 00 02 T 06 C2 B4 C8 1D 90 7F E8 E0 B4 C0 13 74 01 30 R 00 00 00 02 T 06 CF 00 08 01 04 90 7F 00 F0 90 7F B5 74 01 F0 R 00 00 00 02 29 02 00 06 T 06 DC 02 08 5D R 00 00 00 02 00 03 00 02 T 06 DF R 00 00 00 02 T 06 DF 02 08 59 R 00 00 00 02 00 03 00 02 T 06 E2 R 00 00 00 02 T 06 E2 B4 C9 21 90 7F E8 E0 B4 C0 17 90 7F 00 78 R 00 00 00 02 T 06 F0 00 F0 E2 60 05 F0 08 A3 80 F8 E8 24 10 90 R 00 00 00 02 09 02 00 01 T 06 FD 7F B5 F0 02 08 5D R 00 00 00 02 00 06 00 02 T 07 03 R 00 00 00 02 T 07 03 02 08 59 R 00 00 00 02 00 03 00 02 T 07 06 R 00 00 00 02 T 07 06 B4 D0 5D 90 7F E8 E0 B4 C0 53 90 7F EC E0 R 00 00 00 02 T 07 14 B4 01 0A 90 7F EA E0 54 01 F5 00 10 D2 R 00 00 00 02 29 0C 00 08 T 07 20 00 0A R 00 00 00 02 29 02 00 06 T 07 21 R 00 00 00 02 T 07 21 90 7F 00 E5 00 05 45 00 10 60 02 74 01 F0 R 00 00 00 02 29 06 00 08 29 09 00 08 T 07 2D 90 C0 0E E0 A2 E6 A0 00 08 92 F0 90 C0 09 R 00 00 00 02 09 09 00 06 T 07 3A E0 A2 E0 72 00 08 82 F0 B3 E4 92 E0 90 R 00 00 00 02 29 06 00 06 T 07 46 7F 01 F0 90 C0 04 E0 90 7F 02 F0 90 7F EE R 00 00 00 02 T 07 54 E0 24 FD 50 01 E4 24 03 90 7F B5 F0 02 R 00 00 00 02 T 07 61 08 5D R 00 00 00 02 00 02 00 02 T 07 63 R 00 00 00 02 T 07 63 02 08 59 R 00 00 00 02 00 03 00 02 T 07 66 R 00 00 00 02 T 07 66 B4 D1 29 90 7F E8 E0 B4 C0 1F 90 7F 00 78 R 00 00 00 02 T 07 74 00 E0 7F 06 E2 F0 A3 08 DF FA 90 7F EE E0 R 00 00 00 02 09 02 00 01 T 07 81 24 FA 50 01 E4 24 06 90 7F B5 F0 02 08 5D R 00 00 00 02 00 0E 00 02 T 07 8F R 00 00 00 02 T 07 8F 02 08 59 R 00 00 00 02 00 03 00 02 T 07 92 R 00 00 00 02 T 07 92 B4 D2 20 90 7F E8 E0 B4 40 16 90 7F EA E0 R 00 00 00 02 T 07 A0 F5 F0 90 7F 98 E0 A2 F0 92 E3 A2 F1 92 E5 R 00 00 00 02 T 07 AE F0 02 08 5D R 00 00 00 02 00 04 00 02 T 07 B2 R 00 00 00 02 T 07 B2 02 08 59 R 00 00 00 02 00 03 00 02 T 07 B5 R 00 00 00 02 T 07 B5 B4 D3 16 90 7F E8 E0 B4 40 07 90 7F EA E0 R 00 00 00 02 T 07 C3 10 00 0B 03 R 00 00 00 02 29 03 00 06 T 07 C6 R 00 00 00 02 T 07 C6 02 08 59 R 00 00 00 02 00 03 00 02 T 07 C9 R 00 00 00 02 T 07 C9 F5 99 02 08 5D R 00 00 00 02 00 05 00 02 T 07 CE R 00 00 00 02 T 07 CE B4 D4 4C 90 7F E8 E0 B4 C0 42 20 00 08 3F R 00 00 00 02 29 0D 00 06 T 07 DB 90 7F EC E0 90 7F EA B4 01 09 E0 90 C0 0D R 00 00 00 02 T 07 E9 F0 F5 00 2E 80 0A B4 02 07 E0 90 C0 0C F0 R 00 00 00 02 29 04 00 08 T 07 F6 F5 00 2D 90 C0 0E E0 90 7F 00 F0 E5 00 2E R 00 00 00 02 29 03 00 08 29 0E 00 08 T 08 02 A3 F0 E5 00 2D A3 F0 90 7F EE E0 24 FD 50 R 00 00 00 02 29 05 00 08 T 08 0F 01 E4 24 03 90 7F B5 F0 02 08 5D R 00 00 00 02 00 0B 00 02 T 08 1A R 00 00 00 02 T 08 1A 02 08 59 R 00 00 00 02 00 03 00 02 T 08 1D R 00 00 00 02 T 08 1D B4 D5 39 90 7F E8 E0 B4 C0 2F 90 7F EC E0 R 00 00 00 02 T 08 2B B4 01 0A 90 7F EA E0 90 C0 0A F0 F5 00 2C R 00 00 00 02 29 0E 00 08 T 08 38 90 C0 0B E0 90 7F 00 F0 E5 00 2C A3 F0 90 R 00 00 00 02 29 0B 00 08 T 08 45 7F EE E0 24 FE 50 01 E4 24 02 90 7F B5 F0 R 00 00 00 02 T 08 53 02 08 5D R 00 00 00 02 00 03 00 02 T 08 56 R 00 00 00 02 T 08 56 02 08 59 R 00 00 00 02 00 03 00 02 T 08 59 R 00 00 00 02 T 08 59 R 00 00 00 02 T 08 59 74 03 80 02 R 00 00 00 02 T 08 5D R 00 00 00 02 T 08 5D 74 02 R 00 00 00 02 T 08 5F R 00 00 00 02 T 08 5F 90 7F B4 F0 R 00 00 00 02 T 08 63 R 00 00 00 02 T 08 63 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 08 71 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 08 78 R 00 00 00 02 T 08 78 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 86 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 94 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 A2 32 R 00 00 00 02 T 08 A3 R 00 00 00 02 T 08 A3 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 B1 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 BF 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 CD 32 R 00 00 00 02 T 08 CE R 00 00 00 02 T 08 CE C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 DC 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 08 EA 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 F8 32 R 00 00 00 02 T 08 F9 R 00 00 00 02 T 08 F9 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 07 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 09 15 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 23 32 R 00 00 00 02 T 09 24 R 00 00 00 02 T 09 24 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 09 32 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 09 40 C2 E4 F5 91 90 7F A9 74 01 F0 D0 07 D0 00 R 00 00 00 02 T 09 4E D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 D0 F0 R 00 00 00 02 T 09 5C D0 E0 32 R 00 00 00 02 T 09 5F R 00 00 00 02 T 09 5F C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 09 6D 75 D0 00 C0 86 75 86 00 C0 00 C0 06 E5 91 R 00 00 00 02 T 09 7B C2 E4 F5 91 90 7F AA 74 01 F0 D0 06 D0 00 R 00 00 00 02 T 09 89 D0 86 D0 D0 D0 85 D0 84 D0 83 D0 82 D0 F0 R 00 00 00 02 T 09 97 D0 E0 32 R 00 00 00 02 T 09 9A R 00 00 00 02 T 09 9A E5 00 05 F5 F0 D2 F2 45 00 10 B4 00 02 C2 R 00 00 00 02 29 03 00 08 29 0A 00 08 T 09 A6 F2 90 C0 0E E0 A2 E6 B3 82 00 08 92 F3 90 R 00 00 00 02 29 0B 00 06 T 09 B3 C0 09 E0 A2 E0 B0 00 08 72 F3 92 F3 A2 R 00 00 00 02 09 08 00 06 T 09 BF 00 0B 92 F5 D3 E5 00 13 B5 R 00 00 00 02 29 02 00 06 29 08 00 08 T 09 C6 00 12 06 90 7F B8 E0 A2 E1 92 F4 90 7E 80 R 00 00 00 02 29 02 00 08 T 09 D3 E5 F0 F0 E5 00 08 F4 25 00 09 54 0F 90 R 00 00 00 02 29 06 00 08 29 0A 00 08 T 09 DE 7E 81 F0 E5 00 13 F4 25 00 12 04 54 1F 90 R 00 00 00 02 29 06 00 08 29 0A 00 08 T 09 EA 7E 82 F0 90 C0 04 E0 90 7E 83 F0 05 00 04 R 00 00 00 02 29 0E 00 08 T 09 F7 E5 00 04 90 7E 84 F0 75 F0 05 90 7E 85 E5 R 00 00 00 02 29 03 00 08 T 0A 04 00 2B B5 00 2A 07 90 7F B7 E5 F0 F0 22 24 R 00 00 00 02 29 02 00 08 29 05 00 08 T 0A 10 00 1A F8 E6 F0 A3 05 F0 E5 00 2B 04 54 0F R 00 00 00 02 09 02 00 08 29 0B 00 08 T 0A 1C F5 00 2B 80 E3 R 00 00 00 02 29 03 00 08 T 0A 20 R 00 00 00 02 T 0A 20 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 2E 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A 3C 02 F0 12 09 9A D0 86 D0 D0 D0 83 D0 82 D0 R 00 00 00 02 00 05 00 02 T 0A 4A F0 D0 E0 32 R 00 00 00 02 T 0A 4E R 00 00 00 02 T 0A 4E C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 5C 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A 6A 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A 78 32 R 00 00 00 02 T 0A 79 R 00 00 00 02 T 0A 79 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A 87 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A 95 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A A3 32 R 00 00 00 02 T 0A A4 R 00 00 00 02 T 0A A4 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A B2 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0A C0 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A CE 32 R 00 00 00 02 T 0A CF R 00 00 00 02 T 0A CF C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0A DD 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0A EB 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0A F9 32 R 00 00 00 02 T 0A FA R 00 00 00 02 T 0A FA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 08 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B 16 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 24 32 R 00 00 00 02 T 0B 25 R 00 00 00 02 T 0B 25 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 33 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0B 41 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 4F 32 R 00 00 00 02 T 0B 50 R 00 00 00 02 T 0B 50 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 5E 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B 6C 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B 7A 32 R 00 00 00 02 T 0B 7B R 00 00 00 02 T 0B 7B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B 89 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0B 97 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B A5 32 R 00 00 00 02 T 0B A6 R 00 00 00 02 T 0B A6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B B4 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0B C2 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B D0 32 R 00 00 00 02 T 0B D1 R 00 00 00 02 T 0B D1 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0B DF 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0B ED 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0B FB 32 R 00 00 00 02 T 0B FC R 00 00 00 02 T 0B FC C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0C 0A 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0C 18 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0C 26 32 R 00 00 00 02 T 0C 27 R 00 00 00 02 T 0C 27 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0C 35 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 0C 43 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0C 51 32 R 00 00 00 02 T 0C 52 R 00 00 00 02 T 0C 52 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 0C 60 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 0C 6E 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 0C 7C 32 R 00 00 00 02 T 0C 7D R 00 00 00 02 T 0C 7D 12 01 00 01 FF 00 FF 40 C0 BA 36 61 02 00 R 00 00 00 02 T 0C 8B 01 02 03 01 R 00 00 00 02 T 0C 8F R 00 00 00 02 T 0C 8F 09 02 45 00 01 01 00 40 00 09 04 00 00 03 R 00 00 00 02 T 0C 9D FF 00 FF 00 07 05 81 02 40 00 00 07 05 82 R 00 00 00 02 T 0C AB 02 40 00 00 07 05 02 02 40 00 00 09 04 00 R 00 00 00 02 T 0C B9 01 03 FF 00 FF 00 07 05 81 03 40 00 0A 07 R 00 00 00 02 T 0C C7 05 82 02 40 00 00 07 05 02 02 40 00 00 R 00 00 00 02 T 0C D4 R 00 00 00 02 T 0C D4 0C DC 0C DC R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C D6 0C E0 0C E0 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C D8 0C EE 0C EE R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C DA 0D 0A 0D 0A R 00 00 00 02 09 02 00 02 89 04 00 02 T 0C DC R 00 00 00 02 T 0C DC 04 03 00 00 R 00 00 00 02 T 0C E0 R 00 00 00 02 T 0C E0 0E 03 42 00 61 00 79 00 63 00 6F 00 6D 00 R 00 00 00 02 T 0C EE R 00 00 00 02 T 0C EE 1C 03 55 00 53 00 42 00 46 00 4C 00 45 00 R 00 00 00 02 T 0C FC 58 00 20 00 28 00 46 00 53 00 4B 00 29 00 R 00 00 00 02 T 0D 0A R 00 00 00 02 T 0D 0A 02 03 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0D 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0D 26 00 00 00 00 00 00 R 00 00 00 02 baycomusb-0.10.orig/firmware/fskfirmware/main.lst0100644000175100017510000043477607340435154020246 0ustar abaaba 1 .module main 2 3 ;; ENDPOINTS 4 ;; EP0 in/out Control 5 ;; EP1 in Interrupt: Status 6 ;; Byte 0: Modem Status 7 ;; Bit 0-1: Transmitter status 8 ;; 0: idle (off) 9 ;; 1: keyup 10 ;; 2: transmitting packets 11 ;; 3: tail 12 ;; Bit 2: PTT status (1=on) 13 ;; Bit 3: DCD 14 ;; Bit 4: RXB (Rx Packet Ready) 15 ;; Bit 5: UART transmitter empty 16 ;; Bit 6-7: unused 17 ;; Byte 1: Number of empty 64 byte chunks in TX fifo 18 ;; Byte 2: Number of full 64 byte chunks in RX fifo 19 ;; Byte 3: RSSI value 20 ;; Byte 4: IRQ count 21 ;; Byte 5-20: (as needed) UART receiver chars 22 ;; EP2 out Packets to be transmitted 23 ;; EP2 in Received packets; note they have the CRC appended 24 25 ;; COMMAND LIST 26 ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) 27 ;; C0 C8 read mode 28 ;; Return: 29 ;; Byte 0: 1 (MODE_FSK) or 2 (MODE_EXTERNAL) 30 ;; C0 C9 return serial number string 31 ;; C0 D0 get/set PTT/DCD/RSSI 32 ;; wIndex = 1: set forced ptt to wValue 33 ;; Return: 34 ;; Byte 0: PTT status 35 ;; Byte 1: DCD status 36 ;; Byte 2: RSSI status 37 ;; C0 D1 get Bitrate 38 ;; Return: 39 ;; Byte 0-2: TX Bitrate 40 ;; Byte 3-5: RX Bitrate 41 ;; 40 D2 set CON/STA led 42 ;; Bits 0-1 of wValue 43 ;; 40 D3 send byte to UART 44 ;; Byte in wValue 45 ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) 46 ;; wIndex = 1: write wValue to output register 47 ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) 48 ;; Return: 49 ;; Byte 0: Modem Disconnect Input 50 ;; Byte 1: Modem Disconnect Output register 51 ;; Byte 2: Modem Disconnect Tristate register 52 ;; C0 D5 get/set T7F port 53 ;; wIndex = 1: write wValue to T7F output register 54 ;; Return: 55 ;; Byte 0: T7F Input 56 ;; Byte 1: T7F Output register 57 58 ;; define code segments link order 59 .area CODE (CODE) 60 .area CSEG (CODE) 61 .area GSINIT (CODE) 62 .area GSINIT2 (CODE) 63 64 ;; ----------------------------------------------------- 65 66 ;; special function registers (which are not predefined) 0082 67 dpl0 = 0x82 0083 68 dph0 = 0x83 0084 69 dpl1 = 0x84 0085 70 dph1 = 0x85 0086 71 dps = 0x86 008E 72 ckcon = 0x8E 008F 73 spc_fnc = 0x8F 0091 74 exif = 0x91 0092 75 mpage = 0x92 0098 76 scon0 = 0x98 0099 77 sbuf0 = 0x99 00C0 78 scon1 = 0xC0 00C1 79 sbuf1 = 0xC1 00D8 80 eicon = 0xD8 00E8 81 eie = 0xE8 00F8 82 eip = 0xF8 83 84 ;; anchor xdata registers 7F00 85 IN0BUF = 0x7F00 7EC0 86 OUT0BUF = 0x7EC0 7E80 87 IN1BUF = 0x7E80 7E40 88 OUT1BUF = 0x7E40 7E00 89 IN2BUF = 0x7E00 7DC0 90 OUT2BUF = 0x7DC0 7D80 91 IN3BUF = 0x7D80 7D40 92 OUT3BUF = 0x7D40 7D00 93 IN4BUF = 0x7D00 7CC0 94 OUT4BUF = 0x7CC0 7C80 95 IN5BUF = 0x7C80 7C40 96 OUT5BUF = 0x7C40 7C00 97 IN6BUF = 0x7C00 7BC0 98 OUT6BUF = 0x7BC0 7B80 99 IN7BUF = 0x7B80 7B40 100 OUT7BUF = 0x7B40 7FE8 101 SETUPBUF = 0x7FE8 7FE8 102 SETUPDAT = 0x7FE8 103 7FB4 104 EP0CS = 0x7FB4 7FB5 105 IN0BC = 0x7FB5 7FB6 106 IN1CS = 0x7FB6 7FB7 107 IN1BC = 0x7FB7 7FB8 108 IN2CS = 0x7FB8 7FB9 109 IN2BC = 0x7FB9 7FBA 110 IN3CS = 0x7FBA 7FBB 111 IN3BC = 0x7FBB 7FBC 112 IN4CS = 0x7FBC 7FBD 113 IN4BC = 0x7FBD 7FBE 114 IN5CS = 0x7FBE 7FBF 115 IN5BC = 0x7FBF 7FC0 116 IN6CS = 0x7FC0 7FC1 117 IN6BC = 0x7FC1 7FC2 118 IN7CS = 0x7FC2 7FC3 119 IN7BC = 0x7FC3 7FC5 120 OUT0BC = 0x7FC5 7FC6 121 OUT1CS = 0x7FC6 7FC7 122 OUT1BC = 0x7FC7 7FC8 123 OUT2CS = 0x7FC8 7FC9 124 OUT2BC = 0x7FC9 7FCA 125 OUT3CS = 0x7FCA 7FCB 126 OUT3BC = 0x7FCB 7FCC 127 OUT4CS = 0x7FCC 7FCD 128 OUT4BC = 0x7FCD 7FCE 129 OUT5CS = 0x7FCE 7FCF 130 OUT5BC = 0x7FCF 7FD0 131 OUT6CS = 0x7FD0 7FD1 132 OUT6BC = 0x7FD1 7FD2 133 OUT7CS = 0x7FD2 7FD3 134 OUT7BC = 0x7FD3 135 7FA8 136 IVEC = 0x7FA8 7FA9 137 IN07IRQ = 0x7FA9 7FAA 138 OUT07IRQ = 0x7FAA 7FAB 139 USBIRQ = 0x7FAB 7FAC 140 IN07IEN = 0x7FAC 7FAD 141 OUT07IEN = 0x7FAD 7FAE 142 USBIEN = 0x7FAE 7FAF 143 USBBAV = 0x7FAF 7FB2 144 BPADDRH = 0x7FB2 7FB3 145 BPADDRL = 0x7FB3 146 7FD4 147 SUDPTRH = 0x7FD4 7FD5 148 SUDPTRL = 0x7FD5 7FD6 149 USBCS = 0x7FD6 7FD7 150 TOGCTL = 0x7FD7 7FD8 151 USBFRAMEL = 0x7FD8 7FD9 152 USBFRAMEH = 0x7FD9 7FDB 153 FNADDR = 0x7FDB 7FDD 154 USBPAIR = 0x7FDD 7FDE 155 IN07VAL = 0x7FDE 7FDF 156 OUT07VAL = 0x7FDF 7FE3 157 AUTOPTRH = 0x7FE3 7FE4 158 AUTOPTRL = 0x7FE4 7FE5 159 AUTODATA = 0x7FE5 160 161 ;; isochronous endpoints. only available if ISODISAB=0 162 7F60 163 OUT8DATA = 0x7F60 7F61 164 OUT9DATA = 0x7F61 7F62 165 OUT10DATA = 0x7F62 7F63 166 OUT11DATA = 0x7F63 7F64 167 OUT12DATA = 0x7F64 7F65 168 OUT13DATA = 0x7F65 7F66 169 OUT14DATA = 0x7F66 7F67 170 OUT15DATA = 0x7F67 171 7F68 172 IN8DATA = 0x7F68 7F69 173 IN9DATA = 0x7F69 7F6A 174 IN10DATA = 0x7F6A 7F6B 175 IN11DATA = 0x7F6B 7F6C 176 IN12DATA = 0x7F6C 7F6D 177 IN13DATA = 0x7F6D 7F6E 178 IN14DATA = 0x7F6E 7F6F 179 IN15DATA = 0x7F6F 180 7F70 181 OUT8BCH = 0x7F70 7F71 182 OUT8BCL = 0x7F71 7F72 183 OUT9BCH = 0x7F72 7F73 184 OUT9BCL = 0x7F73 7F74 185 OUT10BCH = 0x7F74 7F75 186 OUT10BCL = 0x7F75 7F76 187 OUT11BCH = 0x7F76 7F77 188 OUT11BCL = 0x7F77 7F78 189 OUT12BCH = 0x7F78 7F79 190 OUT12BCL = 0x7F79 7F7A 191 OUT13BCH = 0x7F7A 7F7B 192 OUT13BCL = 0x7F7B 7F7C 193 OUT14BCH = 0x7F7C 7F7D 194 OUT14BCL = 0x7F7D 7F7E 195 OUT15BCH = 0x7F7E 7F7F 196 OUT15BCL = 0x7F7F 197 7FF0 198 OUT8ADDR = 0x7FF0 7FF1 199 OUT9ADDR = 0x7FF1 7FF2 200 OUT10ADDR = 0x7FF2 7FF3 201 OUT11ADDR = 0x7FF3 7FF4 202 OUT12ADDR = 0x7FF4 7FF5 203 OUT13ADDR = 0x7FF5 7FF6 204 OUT14ADDR = 0x7FF6 7FF7 205 OUT15ADDR = 0x7FF7 7FF8 206 IN8ADDR = 0x7FF8 7FF9 207 IN9ADDR = 0x7FF9 7FFA 208 IN10ADDR = 0x7FFA 7FFB 209 IN11ADDR = 0x7FFB 7FFC 210 IN12ADDR = 0x7FFC 7FFD 211 IN13ADDR = 0x7FFD 7FFE 212 IN14ADDR = 0x7FFE 7FFF 213 IN15ADDR = 0x7FFF 214 7FA0 215 ISOERR = 0x7FA0 7FA1 216 ISOCTL = 0x7FA1 7FA2 217 ZBCOUNT = 0x7FA2 7FE0 218 INISOVAL = 0x7FE0 7FE1 219 OUTISOVAL = 0x7FE1 7FE2 220 FASTXFR = 0x7FE2 221 222 ;; CPU control registers 223 7F92 224 CPUCS = 0x7F92 225 226 ;; IO port control registers 227 7F93 228 PORTACFG = 0x7F93 7F94 229 PORTBCFG = 0x7F94 7F95 230 PORTCCFG = 0x7F95 7F96 231 OUTA = 0x7F96 7F97 232 OUTB = 0x7F97 7F98 233 OUTC = 0x7F98 7F99 234 PINSA = 0x7F99 7F9A 235 PINSB = 0x7F9A 7F9B 236 PINSC = 0x7F9B 7F9C 237 OEA = 0x7F9C 7F9D 238 OEB = 0x7F9D 7F9E 239 OEC = 0x7F9E 240 241 ;; I2C controller registers 242 7FA5 243 I2CS = 0x7FA5 7FA6 244 I2DAT = 0x7FA6 245 246 ;; Xilinx FPGA registers C001 247 FSKRXCNT = 0xc001 C002 248 FSKRXDATA = 0xc002 C003 249 FSKRXFLAG = 0xc003 C000 250 FSKTXCNT = 0xc000 C000 251 FSKTXDATA = 0xc000 C001 252 FSKTXCRC = 0xc001 C002 253 FSKTXRAW = 0xc002 C003 254 FSKTXRAWCLR = 0xc003 C004 255 FSKRSSI = 0xc004 C008 256 FSKCTRL = 0xc008 C009 257 FSKSTAT = 0xc009 C00A 258 FSKT7FOUT = 0xc00a C00B 259 FSKT7FIN = 0xc00b C00C 260 FSKMDISCTRIS = 0xc00c C00D 261 FSKMDISCOUT = 0xc00d C00E 262 FSKMDISCIN = 0xc00e 263 264 ;; ----------------------------------------------------- 265 266 .area CODE (CODE) 0000 02s00r00 267 ljmp startup 0003 02s02r93 268 ljmp int0_isr 0006 269 .ds 5 000B 02s02rB4 270 ljmp timer0_isr 000E 271 .ds 5 0013 02s02rD5 272 ljmp int1_isr 0016 273 .ds 5 001B 02s02rF6 274 ljmp timer1_isr 001E 275 .ds 5 0023 02s03r17 276 ljmp ser0_isr 0026 277 .ds 5 002B 02s03r55 278 ljmp timer2_isr 002E 279 .ds 5 0033 02s03r76 280 ljmp resume_isr 0036 281 .ds 5 003B 02s03r97 282 ljmp ser1_isr 003E 283 .ds 5 0043 02s01r00 284 ljmp usb_isr 0046 285 .ds 5 004B 02s03rBA 286 ljmp i2c_isr 004E 287 .ds 5 0053 02s03rDF 288 ljmp int4_isr 0056 289 .ds 5 005B 02s04r04 290 ljmp int5_isr 005E 291 .ds 5 0063 02s04r29 292 ljmp int6_isr 293 294 ;; Parameter block at 0xe0 0066 295 .ds 0x7a 00E0 00 00 00 296 parbitratetx: .db 0,0,0 00E3 00 00 00 297 parbitraterx: .db 0,0,0 00E6 00 298 parextmodem: .db 0 00E7 01 299 parpttmute: .db 1 300 301 ;; Serial# string at 0xf0 00E8 302 .ds 8 00F0 303 parserial: 00F0 30 30 30 30 30 30 304 .db '0,'0,'0,'0,'0,'0,'0,'0,0 30 30 00 00F9 305 .ds 7 306 307 ;; USB interrupt dispatch table 0100 308 usb_isr: 0100 02s04r4A 309 ljmp usb_sudav_isr 0103 310 .ds 1 0104 02s08r78 311 ljmp usb_sof_isr 0107 312 .ds 1 0108 02s08rA3 313 ljmp usb_sutok_isr 010B 314 .ds 1 010C 02s08rCE 315 ljmp usb_suspend_isr 010F 316 .ds 1 0110 02s08rF9 317 ljmp usb_usbreset_isr 0113 318 .ds 1 0114 32 319 reti 0115 320 .ds 3 0118 02s09r24 321 ljmp usb_ep0in_isr 011B 322 .ds 1 011C 02s09r5F 323 ljmp usb_ep0out_isr 011F 324 .ds 1 0120 02s0Ar20 325 ljmp usb_ep1in_isr 0123 326 .ds 1 0124 02s0Ar4E 327 ljmp usb_ep1out_isr 0127 328 .ds 1 0128 02s0Ar79 329 ljmp usb_ep2in_isr 012B 330 .ds 1 012C 02s0ArA4 331 ljmp usb_ep2out_isr 012F 332 .ds 1 0130 02s0ArCF 333 ljmp usb_ep3in_isr 0133 334 .ds 1 0134 02s0ArFA 335 ljmp usb_ep3out_isr 0137 336 .ds 1 0138 02s0Br25 337 ljmp usb_ep4in_isr 013B 338 .ds 1 013C 02s0Br50 339 ljmp usb_ep4out_isr 013F 340 .ds 1 0140 02s0Br7B 341 ljmp usb_ep5in_isr 0143 342 .ds 1 0144 02s0BrA6 343 ljmp usb_ep5out_isr 0147 344 .ds 1 0148 02s0BrD1 345 ljmp usb_ep6in_isr 014B 346 .ds 1 014C 02s0BrFC 347 ljmp usb_ep6out_isr 014F 348 .ds 1 0150 02s0Cr27 349 ljmp usb_ep7in_isr 0153 350 .ds 1 0154 02s0Cr52 351 ljmp usb_ep7out_isr 352 353 ;; ----------------------------------------------------- 354 0020 355 RXCHUNKS = 32 0010 356 TXCHUNKS = 16 357 0000 358 DEBUGIOCOPY = 0 0000 359 DEBUGRECEIVER = 0 360 361 .area OSEG (OVR,DATA) 362 .area BSEG (BIT) 0000 363 ctrl_ptt: .ds 1 0001 364 ctrl_pttmute: .ds 1 0002 365 ctrl_ledptt: .ds 1 0003 366 ctrl_leddcdsrc: .ds 1 0004 367 ctrl_clksel: .ds 1 ; not implemented 0005 368 ctrl_indacd: .ds 1 0006 369 ctrl_indacz: .ds 1 0007 370 ctrl_txdsrc: .ds 1 0020 371 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) 372 0008 373 extmodem: .ds 1 0009 374 pttmute: .ds 1 000A 375 pttforcechg: .ds 1 000B 376 uartempty: .ds 1 377 378 .area ISEG (DATA) 0000 379 txbcnt: .ds TXCHUNKS 0010 380 rxbcnt: .ds RXCHUNKS 0030 381 stack: .ds 0x80-RXCHUNKS-TXCHUNKS 382 383 .area DSEG (DATA) 0000 384 ctrlcode: .ds 1 0001 385 ctrlcount: .ds 2 0003 386 leddiv: .ds 1 0004 387 irqcount: .ds 1 388 ;; transmitter variables 0005 389 txstate: .ds 1 0006 390 flagcnt: .ds 2 0008 391 txwr: .ds 1 0009 392 txrd: .ds 1 000A 393 txtwr: .ds 1 000B 394 txcnt: .ds 1 000C 395 txaddr: .ds 2 000E 396 txbptr: .ds 1 000F 397 txskip: .ds 1 0010 398 pttforce: .ds 1 399 ;; receiver variables 0011 400 rxstate: .ds 1 0012 401 rxwr: .ds 1 0013 402 rxrd: .ds 1 0014 403 rxtwr: .ds 1 0015 404 rxcnt: .ds 1 0016 405 rxcntc: .ds 1 0017 406 rxaddr: .ds 2 407 0019 408 tmprxcnt: .ds 1 409 410 ;; UART receiver 001A 411 uartbuf: .ds 16 002A 412 uartwr: .ds 1 002B 413 uartrd: .ds 1 414 415 ;; Port state 002C 416 t7fout: .ds 1 002D 417 mdisctris: .ds 1 002E 418 mdiscout: .ds 1 419 420 ;; USB state 002F 421 numconfig: .ds 1 0030 422 altsetting: .ds 1 423 424 .area XSEG (DATA) 0000 425 txbuf: .ds TXCHUNKS*64 0400 426 rxbuf: .ds RXCHUNKS*64 427 428 429 .area GSINIT (CODE) 0000 430 startup: 0000 75 81r30 431 mov sp,#stack ; -1 0003 E4 432 clr a 0004 F5 D0 433 mov psw,a 0006 F5 86 434 mov dps,a 435 ;lcall __sdcc_external_startup 436 ;mov a,dpl0 437 ;jz __sdcc_init_data 438 ;ljmp __sdcc_program_startup 0008 439 __sdcc_init_data: 440 441 .area GSINIT2 (CODE) 0000 442 __sdcc_program_startup: 443 ;; assembler code startup 0000 E4 444 clr a 0001 F5*05 445 mov txstate,a 0003 F5*08 446 mov txwr,a 0005 F5*09 447 mov txrd,a 0007 F5*0A 448 mov txtwr,a 0009 F5*10 449 mov pttforce,a 000B F5*11 450 mov rxstate,a 000D F5*12 451 mov rxwr,a 000F F5*13 452 mov rxrd,a 0011 F5*14 453 mov rxtwr,a 0013 F5*04 454 mov irqcount,a 0015 F5*2B 455 mov uartrd,a 0017 F5*2A 456 mov uartwr,a 0019 F5 86 457 mov dps,a 001B D2*0B 458 setb uartempty 459 ;; some indirect register setup 001D 75 8E 30 460 mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs 461 ;; Timer setup: 462 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 463 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0020 75 89 21 464 mov tmod,#0x21 0023 75 88 55 465 mov tcon,#0x55 ; INT0/INT1 edge 0026 75 8D 64 466 mov th1,#256-156 ; 1200 bauds 0029 75 87 00 467 mov pcon,#0 ; SMOD0=0 468 ;; init USB subsystem 002C 90 7F A1 469 mov dptr,#ISOCTL 002F 74 01 470 mov a,#1 ; disable ISO endpoints 0031 F0 471 movx @dptr,a 0032 90 7F AF 472 mov dptr,#USBBAV 0035 74 01 473 mov a,#1 ; enable autovector, disable breakpoint logic 0037 F0 474 movx @dptr,a 0038 E4 475 clr a 0039 90 7F E0 476 mov dptr,#INISOVAL 003C F0 477 movx @dptr,a 003D 90 7F E1 478 mov dptr,#OUTISOVAL 0040 F0 479 movx @dptr,a 0041 90 7F DD 480 mov dptr,#USBPAIR 0044 74 09 481 mov a,#0x9 ; pair EP 2&3 for input & output 0046 F0 482 movx @dptr,a 0047 90 7F DE 483 mov dptr,#IN07VAL 004A 74 07 484 mov a,#0x7 ; enable EP0+EP1+EP2 004C F0 485 movx @dptr,a 004D 90 7F DF 486 mov dptr,#OUT07VAL 0050 74 05 487 mov a,#0x5 ; enable EP0+EP2 0052 F0 488 movx @dptr,a 489 ;; USB: init endpoint toggles 0053 90 7F D7 490 mov dptr,#TOGCTL 0056 74 12 491 mov a,#0x12 0058 F0 492 movx @dptr,a 0059 74 32 493 mov a,#0x32 ; clear EP 2 in toggle 005B F0 494 movx @dptr,a 005C 74 02 495 mov a,#0x02 005E F0 496 movx @dptr,a 005F 74 22 497 mov a,#0x22 ; clear EP 2 out toggle 0061 F0 498 movx @dptr,a 499 ;; configure IO ports 0062 90 7F 93 500 mov dptr,#PORTACFG 0065 74 00 501 mov a,#0 0067 F0 502 movx @dptr,a 0068 90 7F 96 503 mov dptr,#OUTA 006B 74 82 504 mov a,#0x82 ; set PROG hi 006D F0 505 movx @dptr,a 006E 90 7F 9C 506 mov dptr,#OEA 0071 74 C2 507 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0073 F0 508 movx @dptr,a 0074 90 7F 94 509 mov dptr,#PORTBCFG 0077 74 00 510 mov a,#0 0079 F0 511 movx @dptr,a 007A 90 7F 9D 512 mov dptr,#OEB 007D 74 00 513 mov a,#0 007F F0 514 movx @dptr,a 0080 90 7F 95 515 mov dptr,#PORTCCFG 0083 74 C3 516 mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins 0085 F0 517 movx @dptr,a 0086 90 7F 98 518 mov dptr,#OUTC 0089 74 28 519 mov a,#0x28 008B F0 520 movx @dptr,a 008C 90 7F 9E 521 mov dptr,#OEC 008F 74 2A 522 mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT 0091 F0 523 movx @dptr,a 524 ;; enable interrupts 0092 75 A8 92 525 mov ie,#0x92 ; enable timer 0 and ser 0 int 0095 75 E8 01 526 mov eie,#0x01 ; enable USB interrupts 0098 90 7F AE 527 mov dptr,#USBIEN 009B 74 01 528 mov a,#1 ; enable SUDAV interrupt 009D F0 529 movx @dptr,a 009E 90 7F AC 530 mov dptr,#IN07IEN 00A1 74 03 531 mov a,#3 ; enable EP0+EP1 interrupt 00A3 F0 532 movx @dptr,a 00A4 90 7F AD 533 mov dptr,#OUT07IEN 00A7 74 01 534 mov a,#1 ; enable EP0 interrupt 00A9 F0 535 movx @dptr,a 536 ;; initialize UART 0 for T7F communication 00AA 75 98 52 537 mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable 538 ;; Copy serial number 00AD 78rF0 539 mov r0,#parserial 00AF 90s0Dr0C 540 mov dptr,#stringserial+2 00B2 E2 541 1$: movx a,@r0 00B3 60 06 542 jz 2$ 00B5 F0 543 movx @dptr,a 00B6 A3 544 inc dptr 00B7 A3 545 inc dptr 00B8 08 546 inc r0 00B9 80 F7 547 sjmp 1$ 00BB E8 548 2$: mov a,r0 00BC 24 11 549 add a,#1-0xf0 ; 1-parserial 00BE 25 E0 550 add a,acc 00C0 90s0Dr0A 551 mov dptr,#stringserial 00C3 F0 552 movx @dptr,a 553 ;; copy configuration to bit addressable variables 00C4 554 cpyconfig: 00C4 75 20 42 555 mov ctrlreg,#0x42 00C7 78rE6 556 mov r0,#parextmodem 00C9 E2 557 movx a,@r0 00CA A2 E0 558 mov c,acc.0 00CC 92*08 559 mov extmodem,c 00CE 92*07 560 mov ctrl_txdsrc,c 00D0 92*03 561 mov ctrl_leddcdsrc,c 00D2 78rE7 562 mov r0,#parpttmute 00D4 E2 563 movx a,@r0 00D5 A2 E0 564 mov c,acc.0 00D7 92*09 565 mov pttmute,c 00D9 92*01 566 mov ctrl_pttmute,c 567 ;; turn off transmitter 00DB E5 20 568 mov a,ctrlreg 00DD 90 C0 08 569 mov dptr,#FSKCTRL 00E0 F0 570 movx @dptr,a 571 ;; send reset pulse to external modem if selected 00E1 90 C0 0C 572 mov dptr,#FSKMDISCTRIS 00E4 74 FF 573 mov a,#0xff 00E6 F0 574 movx @dptr,a 00E7 F5*2D 575 mov mdisctris,a 00E9 30*08 09 576 jnb extmodem,3$ 00EC 74 67 577 mov a,#0x67 ; RESET, RTS and TxD are outputs 00EE F0 578 movx @dptr,a 00EF 90 C0 0D 579 mov dptr,#FSKMDISCOUT 00F2 74 7F 580 mov a,#0x7f ; activate RESET 00F4 F0 581 movx @dptr,a 00F5 582 3$: 00F5 90 C0 0A 583 mov dptr,#FSKT7FOUT 00F8 74 1F 584 mov a,#0x1f 00FA F0 585 movx @dptr,a 00FB F5*2C 586 mov t7fout,a 587 ;; initialize USB state 00FD E4 588 clr a 00FE F5*2F 589 mov numconfig,a 0100 F5*30 590 mov altsetting,a 591 ;; give Windows a chance to finish the writecpucs control transfer 592 ;; 20ms delay loop 0102 90 D1 20 593 mov dptr,#(-12000)&0xffff 0105 A3 594 2$: inc dptr ; 3 cycles 0106 E5 82 595 mov a,dpl0 ; 2 cycles 0108 45 83 596 orl a,dph0 ; 2 cycles 010A 70 F9 597 jnz 2$ ; 3 cycles 0001 598 .if 1 599 ;; disconnect from USB bus 010C 90 7F D6 600 mov dptr,#USBCS 010F 74 0A 601 mov a,#10 0111 F0 602 movx @dptr,a 603 ;; wait 0.3 sec 0112 7A 1E 604 mov r2,#30 605 ;; 10ms delay loop 0114 90 E8 90 606 0$: mov dptr,#(-6000)&0xffff 0117 A3 607 1$: inc dptr ; 3 cycles 0118 E5 82 608 mov a,dpl0 ; 2 cycles 011A 45 83 609 orl a,dph0 ; 2 cycles 011C 70 F9 610 jnz 1$ ; 3 cycles 011E DA F4 611 djnz r2,0$ 612 ;; reconnect to USB bus 0120 90 7F D6 613 mov dptr,#USBCS 614 ;mov a,#2 ; 8051 handles control 615 ;movx @dptr,a 0123 74 06 616 mov a,#6 ; reconnect, 8051 handles control 0125 F0 617 movx @dptr,a 618 .endif 619 ;; terminate reset pulse to external modem if selected 0126 30*08 08 620 jnb extmodem,4$ 0129 90 C0 0D 621 mov dptr,#FSKMDISCOUT 012C 74 FF 622 mov a,#0xff ; deactivate RESET 012E F0 623 movx @dptr,a 012F F5*2E 624 mov mdiscout,a 0131 625 4$: 626 ;; preinit RAM for debugging purposes (optional) 0000 627 .if 0 628 inittxbuf: 629 mov r7,#TXCHUNKS 630 mov dptr,#txbuf 631 mov a,#0x55+1 632 0$: mov r6,#64 633 1$: movx @dptr,a 634 inc dptr 635 djnz r6,1$ 636 djnz r7,0$ 637 .endif 0000 638 .if 0 639 initrxbuf: 640 mov r7,#RXCHUNKS 641 mov dptr,#rxbuf 642 mov a,#0xaa 643 0$: mov r6,#64 644 1$: movx @dptr,a 645 inc dptr 646 djnz r6,1$ 647 djnz r7,0$ 648 .endif 649 650 ;; final 0131 12s09r9A 651 lcall fillusbintr 652 ;; kludge; first OUT2 packet seems to be bogus 653 ;; wait for packet with length 1 and contents 0x55 0134 654 waitpkt1: 0134 90 7F C8 655 mov dptr,#OUT2CS 0137 E0 656 movx a,@dptr 0138 20 E1 F9 657 jb acc.1,waitpkt1 013B 90 7F C9 658 mov dptr,#OUT2BC 013E E0 659 movx a,@dptr 013F B4 01 0D 660 cjne a,#1,0$ 0142 90 7D C0 661 mov dptr,#OUT2BUF 0145 E0 662 movx a,@dptr 0146 B4 55 06 663 cjne a,#0x55,0$ 0149 90 7F C9 664 mov dptr,#OUT2BC 014C F0 665 movx @dptr,a 014D 80 06 666 sjmp pkt1received 014F 90 7F C9 667 0$: mov dptr,#OUT2BC 0152 F0 668 movx @dptr,a 0153 80 DF 669 sjmp waitpkt1 670 ;; clear RX FIFO 0155 671 pkt1received: 0155 90 C0 03 672 mov dptr,#FSKRXFLAG 0158 7F 40 673 mov r7,#64 015A E0 674 1$: movx a,@dptr 015B DF FD 675 djnz r7,1$ 676 ;; start normal operation 015D 02s00r37 677 ljmp mainloop 678 679 .area CSEG (CODE) 0002 680 ar2 = 0x02 0003 681 ar3 = 0x03 0004 682 ar4 = 0x04 0005 683 ar5 = 0x05 0006 684 ar6 = 0x06 0007 685 ar7 = 0x07 0000 686 ar0 = 0x00 0001 687 ar1 = 0x01 688 689 ;; WARNING! The assembler doesn't check for 690 ;; out of range short jump labels!! Double check 691 ;; that the jump labels are within the range! 692 0000 693 setptt: 0000 E5*05 694 mov a,txstate 0002 45*10 695 orl a,pttforce 0004 60 18 696 jz pttoff 697 0006 698 ptton: 0006 A2*08 699 mov c,extmodem 0008 50 06 700 jnc 0$ 000A 90 C0 0D 701 mov dptr,#FSKMDISCOUT 000D 74 EF 702 mov a,#0xef 000F F0 703 movx @dptr,a 0010 92*01 704 0$: mov ctrl_pttmute,c 0012 B3 705 cpl c 0013 92*00 706 mov ctrl_ptt,c 0015 D2*02 707 setb ctrl_ledptt 0017 E5 20 708 mov a,ctrlreg 0019 90 C0 08 709 mov dptr,#FSKCTRL 001C F0 710 movx @dptr,a 001D 22 711 ret 712 001E 713 pttoff: 001E C2*00 714 clr ctrl_ptt 0020 A2*08 715 mov c,extmodem 0022 50 06 716 jnc 3$ 0024 90 C0 0D 717 mov dptr,#FSKMDISCOUT 0027 74 FF 718 mov a,#0xff 0029 F0 719 movx @dptr,a 002A 72*09 720 3$: orl c,pttmute 002C 92*01 721 mov ctrl_pttmute,c 002E C2*02 722 clr ctrl_ledptt 0030 E5 20 723 mov a,ctrlreg 0032 90 C0 08 724 mov dptr,#FSKCTRL 0035 F0 725 movx @dptr,a 0036 22 726 ret 727 0037 728 mainloop: 729 ;; debug: copyloop 0000 730 .if DEBUGIOCOPY 731 iocopyloop: 732 mov a,txrd 733 cjne a,txwr,0$ 734 ljmp iocopyloop 735 1$: mov a,@r0 736 mov @r1,a 737 jz 3$ 738 mov r7,a 739 4$: inc dps 740 movx a,@dptr 741 inc dptr 742 dec dps 743 movx @dptr,a 744 inc dptr 745 djnz r7,4$ 746 3$: mov a,txrd 747 inc a 748 anl a,#(TXCHUNKS-1) 749 mov txrd,a 750 mov a,@r0 751 add a,#-0x40 752 jc 5$ 753 mov rxwr,rxtwr 754 5$: ljmp iocopyloop 755 0$: ;; txpointers 756 add a,#txbcnt 757 mov r0,a 0001 758 .if 1 759 mov a,txrd 760 rr a 761 rr a 762 mov dpl1,a 763 anl a,#0xc0 764 add a,#txbuf 768 mov dph1,a 769 .else 770 mov a,txrd 771 rr a 772 rr a 773 mov dpl1,a 774 anl a,#0xc0 775 xch a,dpl1 776 anl a,#0x3f 777 add a,#>txbuf 778 mov dph1,a 779 .endif 780 ;; rxpointers 781 mov a,rxtwr 782 add a,#rxbcnt 783 mov r1,a 0001 784 .if 1 785 mov a,rxtwr 786 rr a 787 rr a 788 mov dpl0,a 789 anl a,#0xc0 790 add a,#rxbuf 794 mov dph0,a 795 .else 796 mov a,rxtwr 797 rr a 798 rr a 799 mov dpl0,a 800 anl a,#0xc0 801 xch a,dpl0 802 anl a,#0x3f 803 add a,#>rxbuf 804 mov dph0,a 805 .endif 806 ;; update rxpointer 807 mov a,rxtwr 808 inc a 809 anl a,#(RXCHUNKS-1) 810 mov rxtwr,a 811 cjne a,rxrd,1$ 812 ljmp iocopyloop 813 .endif 814 ;; first do TX 0037 815 txstartloop: 816 ;; check if idle or new packet 0037 E5*05 817 mov a,txstate 0039 60 06 818 jz txchknewpkt 003B B4 02 52 819 cjne a,#2,txflagprepare 003E 02s00rF8 820 ljmp txchunkstart 0041 821 txchknewpkt: 0041 E5*08 822 mov a,txwr 0043 B5*09 0C 823 cjne a,txrd,txbufnempty 0046 10*0A 03 824 jbc pttforcechg,txidlepttforce 0049 825 rxstartloop1: 0049 02s01r5C 826 ljmp rxstartloop 004C 827 txidlepttforce: 004C 12s00r00 828 lcall setptt 004F 02s01r5C 829 ljmp rxstartloop 0052 830 txbufnempty: 831 ;; start txdelay 832 ;; check length of first packet 0052 E5*09 833 mov a,txrd 0054 24r00 834 add a,#txbcnt 0056 F8 835 mov r0,a 0057 E6 836 mov a,@r0 0058 24 FC 837 add a,#-4 005A 40 03 838 jc 1$ 005C 02s01r41 839 ljmp txnextpacket 005F 840 1$: 841 ;; read the number of flags to send from the first two bytes of the first packet 0001 842 .if 1 005F E5*09 843 mov a,txrd 0061 03 844 rr a 0062 03 845 rr a 0063 F5 82 846 mov dpl0,a 0065 54 C0 847 anl a,#0xc0 0067 24r00 848 add a,#txbuf 006F F5 83 852 mov dph0,a 853 .else 854 mov a,txrd 855 rr a 856 rr a 857 mov dpl0,a 858 anl a,#0xc0 859 xch a,dpl0 860 anl a,#0x3f 861 add a,#>txbuf 862 mov dph0,a 863 .endif 0071 E0 864 movx a,@dptr 0072 F5*06 865 mov flagcnt,a 0074 A3 866 inc dptr 0075 E0 867 movx a,@dptr 0076 F5*07 868 mov flagcnt+1,a 0078 05*05 869 inc txstate 007A 75*0F 02 870 mov txskip,#2 871 ;; sanity check (limit txdelay to about 8s) 007D 78rE2 872 mov r0,#parbitratetx+2 007F E2 873 movx a,@r0 0080 70 0B 874 jnz 2$ 0082 78rE1 875 mov r0,#parbitratetx+1 0084 E2 876 movx a,@r0 0085 C3 877 clr c 0086 95*07 878 subb a,flagcnt+1 0088 50 03 879 jnc 2$ 008A E2 880 movx a,@r0 008B F5*07 881 mov flagcnt+1,a 008D 882 2$: 883 ;; turn on PTT 008D 12s00r06 884 lcall ptton 885 ;; flag send routine 0090 886 txflagprepare: 0090 90 C0 00 887 mov dptr,#FSKTXCNT 0093 E0 888 movx a,@dptr 0094 60 B3 889 jz rxstartloop1 0096 FF 890 mov r7,a 891 ;; check if tx ready if external modem 0097 90 C0 0E 892 mov dptr,#FSKMDISCIN 009A E0 893 movx a,@dptr 009B 90 C0 03 894 mov dptr,#FSKTXRAWCLR 009E A2 E5 895 mov c,acc.5 00A0 82*08 896 anl c,extmodem 00A2 40 28 897 jc txflgcntbig 898 ;clr c 00A4 E5*06 899 mov a,flagcnt 00A6 FE 900 mov r6,a 00A7 9F 901 subb a,r7 00A8 F5*06 902 mov flagcnt,a 00AA E5*07 903 mov a,flagcnt+1 00AC 94 00 904 subb a,#0 00AE F5*07 905 mov flagcnt+1,a 00B0 50 1A 906 jnc txflgcntbig 907 ;; send final flags, update state 00B2 EE 908 mov a,r6 00B3 60 05 909 jz 1$ 00B5 74 7E 910 mov a,#0x7e 00B7 F0 911 0$: movx @dptr,a 00B8 DE FD 912 djnz r6,0$ 00BA E5*05 913 1$: mov a,txstate 00BC 04 914 inc a 00BD 54 03 915 anl a,#3 00BF F5*05 916 mov txstate,a 00C1 70 06 917 jnz 2$ 918 ;; turn off PTT 00C3 12s00r00 919 lcall setptt 00C6 02s01r5C 920 ljmp rxstartloop 00C9 02s00rD4 921 2$: ljmp txnewchunk 922 ;; send txdelay flags 00CC 923 txflgcntbig: 00CC 74 7E 924 mov a,#0x7e 00CE F0 925 0$: movx @dptr,a 00CF DF FD 926 djnz r7,0$ 00D1 927 rxstartloop2: 00D1 02s01r5C 928 ljmp rxstartloop 929 00D4 930 txnewchunk: 00D4 E5*09 931 mov a,txrd 00D6 24r00 932 add a,#txbcnt 00D8 F5*0E 933 mov txbptr,a 00DA F8 934 mov r0,a 00DB E6 935 mov a,@r0 00DC F4 936 cpl a 00DD 04 937 inc a 00DE 25*0F 938 add a,txskip 00E0 40 5F 939 jc txnextpacket 00E2 F5*0B 940 mov txcnt,a 0001 941 .if 1 00E4 E5*09 942 mov a,txrd 00E6 03 943 rr a 00E7 03 944 rr a 00E8 F5*0C 945 mov txaddr,a 00EA 54 C0 946 anl a,#0xc0 00EC 25*0F 947 add a,txskip 00EE 24r00 948 add a,#txbuf 00F6 F5*0D 952 mov txaddr+1,a 953 .else 954 mov a,txrd 955 rr a 956 rr a 957 mov txaddr,a 958 anl a,#0xc0 959 add a,txskip 960 xch a,txaddr 961 anl a,#0x3f 962 add a,#>txbuf 963 mov txaddr+1,a 964 .endif 00F8 965 txchunkstart: 00F8 90 C0 00 966 mov dptr,#FSKTXCNT 00FB E0 967 movx a,@dptr 00FC 60 D3 968 jz rxstartloop2 00FE FF 969 mov r7,a 00FF E5*0B 970 mov a,txcnt 0101 60 25 971 jz txchunkend 0103 2F 972 add a,r7 0104 C5*0B 973 xch a,txcnt 0106 50 06 974 jnc 0$ 0108 F4 975 cpl a 0109 04 976 inc a 010A FF 977 mov r7,a 010B 75*0B 00 978 mov txcnt,#0 010E 90 C0 00 979 0$: mov dptr,#FSKTXDATA 0111 85*0C 84 980 mov dpl1,txaddr 0114 85*0D 85 981 mov dph1,txaddr+1 0117 05 86 982 1$: inc dps 0119 E0 983 movx a,@dptr 011A A3 984 inc dptr 011B 15 86 985 dec dps 011D F0 986 movx @dptr,a 011E DF F7 987 djnz r7,1$ 0120 85 84*0C 988 mov txaddr,dpl1 0123 85 85*0D 989 mov txaddr+1,dph1 0126 80 D0 990 sjmp txchunkstart 0128 991 txchunkend: 0128 75*0F 00 992 mov txskip,#0 012B A8*0E 993 mov r0,txbptr 012D E6 994 mov a,@r0 012E 20 E6 13 995 jb acc.6,txnonewframe 0131 EF 996 mov a,r7 0132 24 FD 997 add a,#-3 0134 50 9B 998 jnc rxstartloop2 0136 90 C0 01 999 mov dptr,#FSKTXCRC 0139 F0 1000 movx @dptr,a 013A F0 1001 movx @dptr,a 013B 90 C0 03 1002 mov dptr,#FSKTXRAWCLR 013E 74 7E 1003 mov a,#0x7e 0140 F0 1004 movx @dptr,a 0141 1005 txnextpacket: 0141 75*0F 02 1006 mov txskip,#2 0144 1007 txnonewframe: 0144 E5*09 1008 mov a,txrd 0146 04 1009 inc a 0147 54 0F 1010 anl a,#TXCHUNKS-1 0149 F5*09 1011 mov txrd,a 014B B5*08 86 1012 cjne a,txwr,txnewchunk 014E 05*05 1013 inc txstate 1014 ;; note: we need to stuff in more than 32 flags, to fill the buffer 1015 ;; (so we don't turn off PTT too early) 0150 75*06 28 1016 mov flagcnt,#40 0153 75*07 00 1017 mov flagcnt+1,#0 0156 02s00r90 1018 ljmp txflagprepare 1019 0000 1020 .if DEBUGRECEIVER 1021 rxstartloop: 1022 mov dptr,#FSKRXCNT 1023 movx a,@dptr 1024 mov tmprxcnt,a 1025 inc dpl0 1026 add a,#-16 1027 jnc 2$ 0001 1028 .if 1 1029 mov a,rxwr 1030 rr a 1031 rr a 1032 mov dpl1,a 1033 anl a,#0xc0 1034 add a,#rxbuf 1038 mov dph1,a 1039 .else 1040 mov a,rxwr 1041 rr a 1042 rr a 1043 mov dpl1,a 1044 anl a,#0xc0 1045 xch a,dpl1 1046 anl a,#0x3f 1047 add a,#>rxbuf 1048 mov dph1,a 1049 .endif 1050 mov a,rxwr 1051 add a,#rxbcnt 1052 mov r0,a 1053 mov r7,#0 1054 0$: movx a,@dptr 1055 jb acc.5,1$ 1056 inc dps 1057 movx @dptr,a 1058 inc dptr 1059 dec dps 1060 inc r7 1061 jb acc.7,0$ 1062 movx a,@dptr 1063 inc dps 1064 movx @dptr,a 1065 inc dptr 1066 dec dps 1067 inc r7 1068 sjmp 0$ 1069 1$: mov @r0,ar7 1070 mov a,rxwr 1071 inc a 1072 anl a,#RXCHUNKS-1 1073 mov rxwr,a 1074 mov rxtwr,a 1075 2$: ljmp txstartloop 1076 1077 .else 1078 0159 1079 usbiostart1: 0159 02s01rFE 1080 ljmp usbiostart 1081 ;; real receiver starts here 015C 1082 rxstartloop: 015C 90 C0 02 1083 mov dptr,#FSKRXDATA 015F E5*11 1084 mov a,rxstate 0161 70 32 1085 jnz rxdataloopstart 1086 ;; hunt for flags 0163 80 01 1087 sjmp $1 0165 E0 1088 $0: movx a,@dptr ; read data value 0166 E0 1089 $1: movx a,@dptr ; read control value 0167 20 E5 EF 1090 jb acc.5,usbiostart1 016A 30 E7 F8 1091 jnb acc.7,$0 016D 1092 rxpreparepkt: 016D 75*16 00 1093 mov rxcntc,#0 0170 75*11 01 1094 mov rxstate,#1 0173 E5*12 1095 mov a,rxwr 0175 F5*14 1096 mov rxtwr,a 0177 1097 rxnewchunk: 0001 1098 .if 1 0177 E5*14 1099 mov a,rxtwr 0179 03 1100 rr a 017A 03 1101 rr a 017B F5*17 1102 mov rxaddr,a 017D 54 C0 1103 anl a,#0xc0 017F 24r00 1104 add a,#rxbuf 0187 F5*18 1108 mov rxaddr+1,a 1109 .else 1110 mov a,rxtwr 1111 rr a 1112 rr a 1113 mov rxaddr,a 1114 anl a,#0xc0 1115 xch a,rxaddr 1116 anl a,#0x3f 1117 add a,#>rxbuf 1118 mov rxaddr+1,a 1119 .endif 0189 75*15 40 1120 mov rxcnt,#64 018C 02s01r5C 1121 ljmp rxstartloop ; sjmp would be enough 1122 018F 1123 rxabortframe: 018F 75*11 00 1124 mov rxstate,#0 0192 02s01r5C 1125 ljmp rxstartloop 1126 0195 1127 rxdataloopstart: 0195 AF*15 1128 mov r7,rxcnt 0197 85*17 84 1129 mov dpl1,rxaddr 019A 85*18 85 1130 mov dph1,rxaddr+1 019D E0 1131 0$: movx a,@dptr ; read command 019E 20 E6 21 1132 jb acc.6,1$ 01A1 E0 1133 movx a,@dptr 01A2 05 86 1134 inc dps 01A4 F0 1135 movx @dptr,a 01A5 A3 1136 inc dptr 01A6 15 86 1137 dec dps 01A8 DF F3 1138 djnz r7,0$ 01AA E5*14 1139 mov a,rxtwr 01AC 24r10 1140 add a,#rxbcnt 01AE F8 1141 mov r0,a 01AF 76 40 1142 mov @r0,#64 01B1 E5*14 1143 mov a,rxtwr 01B3 04 1144 inc a 01B4 54 1F 1145 anl a,#RXCHUNKS-1 01B6 B5*13 03 1146 cjne a,rxrd,2$ 01B9 02s01r8F 1147 ljmp rxabortframe 01BC F5*14 1148 2$: mov rxtwr,a 01BE 05*16 1149 inc rxcntc 01C0 80 B5 1150 sjmp rxnewchunk 01C2 8F*15 1151 1$: mov rxcnt,r7 01C4 85 84*17 1152 mov rxaddr,dpl1 01C7 85 85*18 1153 mov rxaddr+1,dph1 01CA 20 E5 8C 1154 jb acc.5,usbiostart1 ; empty 01CD 20 E4 BF 1155 jb acc.4,rxabortframe ; abort received 01D0 54 0F 1156 anl a,#0xf 01D2 B4 0E 98 1157 cjne a,#0xe,rxpreparepkt ; CRC not ok or residue error 01D5 E5*14 1158 mov a,rxtwr 01D7 24r10 1159 add a,#rxbcnt 01D9 F8 1160 mov r0,a 01DA 74 40 1161 mov a,#64 01DC C3 1162 clr c 01DD 9F 1163 subb a,r7 01DE F6 1164 mov @r0,a 01DF E5*16 1165 mov a,rxcntc 01E1 70 07 1166 jnz 3$ 01E3 74 FC 1167 mov a,#-4 01E5 26 1168 add a,@r0 01E6 50 13 1169 jnc 6$ ; frame too short 01E8 80 04 1170 sjmp 4$ 01EA 24 F8 1171 3$: add a,#-8 01EC 40 0D 1172 jc 6$ ; frame too long 01EE E5*14 1173 4$: mov a,rxtwr 01F0 04 1174 inc a 01F1 54 1F 1175 anl a,#RXCHUNKS-1 01F3 B5*13 03 1176 cjne a,rxrd,5$ 01F6 02s01r6D 1177 ljmp rxpreparepkt 01F9 F5*12 1178 5$: mov rxwr,a 01FB 02s01r6D 1179 6$: ljmp rxpreparepkt 1180 .endif 1181 01FE 1182 usbiostart: 1183 ;; check for USB modem->host 01FE E5*13 1184 mov a,rxrd 0200 B5*12 4F 1185 cjne a,rxwr,usbcheckin 1186 ;; check for USB host->modem 0203 1187 usbcheckout: 0203 90 7F C8 1188 mov dptr,#OUT2CS 0206 E0 1189 movx a,@dptr 0207 20 E1 46 1190 jb acc.1,endusb2 020A E5*0A 1191 mov a,txtwr 020C 24r00 1192 add a,#txbcnt 020E F8 1193 mov r0,a 020F E5*0A 1194 mov a,txtwr 0211 04 1195 inc a 0212 54 0F 1196 anl a,#(TXCHUNKS-1) 0214 B5*09 03 1197 cjne a,txrd,usbout2 0217 02s02r90 1198 ljmp endusb 021A 1199 usbout2: 021A FF 1200 mov r7,a 021B 90 7F C9 1201 mov dptr,#OUT2BC 021E E0 1202 movx a,@dptr 021F F6 1203 mov @r0,a 0220 FD 1204 mov r5,a 0221 60 20 1205 jz usbout3 0223 FE 1206 mov r6,a 0001 1207 .if 1 0224 E5*0A 1208 mov a,txtwr 0226 03 1209 rr a 0227 03 1210 rr a 0228 F5 84 1211 mov dpl1,a 022A 54 C0 1212 anl a,#0xc0 022C 24r00 1213 add a,#txbuf 0234 F5 85 1217 mov dph1,a 1218 .else 1219 mov a,txtwr 1220 rr a 1221 rr a 1222 mov dpl1,a 1223 anl a,#0xc0 1224 xch a,dpl1 1225 anl a,#0x3f 1226 add a,#>txbuf 1227 mov dph1,a 1228 .endif 0236 90 7D C0 1229 mov dptr,#OUT2BUF 0239 1230 usboutloop: 0239 E0 1231 movx a,@dptr 023A A3 1232 inc dptr 023B 05 86 1233 inc dps 023D F0 1234 movx @dptr,a 023E A3 1235 inc dptr 023F 15 86 1236 dec dps 0241 DE F6 1237 djnz r6,usboutloop 0243 1238 usbout3: 0243 8F*0A 1239 mov txtwr,r7 0245 ED 1240 mov a,r5 0246 24 C0 1241 add a,#-64 0248 60 02 1242 jz usbout4 024A 8F*08 1243 mov txwr,r7 024C 1244 usbout4: 024C 90 7F C9 1245 mov dptr,#OUT2BC 024F F0 1246 movx @dptr,a ; rearm OUT2 0250 1247 endusb2: 0250 80 3E 1248 sjmp endusb 1249 0252 1250 usbcheckin: 0252 90 7F B8 1251 mov dptr,#IN2CS 0255 E0 1252 movx a,@dptr 0256 20 E1 AA 1253 jb acc.1,usbcheckout 1254 1255 ;ljmp xxinbuf 1256 0259 E5*13 1257 mov a,rxrd 025B 24r10 1258 add a,#rxbcnt 025D F8 1259 mov r0,a 025E E6 1260 mov a,@r0 025F 60 20 1261 jz usbin1 0261 FE 1262 mov r6,a 0001 1263 .if 1 0262 E5*13 1264 mov a,rxrd 0264 03 1265 rr a 0265 03 1266 rr a 0266 F5 84 1267 mov dpl1,a 0268 54 C0 1268 anl a,#0xc0 026A 24r00 1269 add a,#rxbuf 0272 F5 85 1273 mov dph1,a 1274 .else 1275 mov a,rxrd 1276 rr a 1277 rr a 1278 mov dpl1,a 1279 anl a,#0xc0 1280 xch a,dpl1 1281 anl a,#0x3f 1282 addc a,#>rxbuf 1283 mov dph1,a 1284 .endif 0274 90 7E 00 1285 mov dptr,#IN2BUF 0277 1286 usbinloop: 0277 05 86 1287 inc dps 0279 E0 1288 movx a,@dptr 027A A3 1289 inc dptr 027B 15 86 1290 dec dps 027D F0 1291 movx @dptr,a 027E A3 1292 inc dptr 027F DE F6 1293 djnz r6,usbinloop 0281 1294 usbin1: 0281 E6 1295 mov a,@r0 0282 90 7F B9 1296 mov dptr,#IN2BC 0285 F0 1297 movx @dptr,a 0286 E5*13 1298 mov a,rxrd 0288 04 1299 inc a 0289 54 1F 1300 anl a,#(RXCHUNKS-1) 028B F5*13 1301 mov rxrd,a 028D 02s02r03 1302 ljmp usbcheckout 1303 0290 1304 endusb: 0290 02s00r37 1305 ljmp txstartloop 1306 1307 1308 ;; ------------------ interrupt handlers ------------------------ 1309 0293 1310 int0_isr: 0293 C0 E0 1311 push acc 0295 C0 F0 1312 push b 0297 C0 82 1313 push dpl0 0299 C0 83 1314 push dph0 029B C0 D0 1315 push psw 029D 75 D0 00 1316 mov psw,#0x00 02A0 C0 86 1317 push dps 02A2 75 86 00 1318 mov dps,#0 1319 ;; clear interrupt 02A5 C2 89 1320 clr tcon+1 1321 ;; handle interrupt 1322 ;; epilogue 02A7 D0 86 1323 pop dps 02A9 D0 D0 1324 pop psw 02AB D0 83 1325 pop dph0 02AD D0 82 1326 pop dpl0 02AF D0 F0 1327 pop b 02B1 D0 E0 1328 pop acc 02B3 32 1329 reti 1330 02B4 1331 timer0_isr: 02B4 C0 E0 1332 push acc 02B6 C0 F0 1333 push b 02B8 C0 82 1334 push dpl0 02BA C0 83 1335 push dph0 02BC C0 D0 1336 push psw 02BE 75 D0 00 1337 mov psw,#0x00 02C1 C0 86 1338 push dps 02C3 75 86 00 1339 mov dps,#0 1340 ;; clear interrupt 02C6 C2 8D 1341 clr tcon+5 1342 ;; handle interrupt 0000 1343 .if 0 1344 inc leddiv 1345 mov a,leddiv 1346 anl a,#7 1347 jnz 0$ 1348 mov dptr,#OUTC 1349 movx a,@dptr 1350 xrl a,#0x08 1351 movx @dptr,a 1352 0$: 1353 .endif 1354 ;; epilogue 02C8 D0 86 1355 pop dps 02CA D0 D0 1356 pop psw 02CC D0 83 1357 pop dph0 02CE D0 82 1358 pop dpl0 02D0 D0 F0 1359 pop b 02D2 D0 E0 1360 pop acc 02D4 32 1361 reti 1362 02D5 1363 int1_isr: 02D5 C0 E0 1364 push acc 02D7 C0 F0 1365 push b 02D9 C0 82 1366 push dpl0 02DB C0 83 1367 push dph0 02DD C0 D0 1368 push psw 02DF 75 D0 00 1369 mov psw,#0x00 02E2 C0 86 1370 push dps 02E4 75 86 00 1371 mov dps,#0 1372 ;; clear interrupt 02E7 C2 8B 1373 clr tcon+3 1374 ;; handle interrupt 1375 ;; epilogue 02E9 D0 86 1376 pop dps 02EB D0 D0 1377 pop psw 02ED D0 83 1378 pop dph0 02EF D0 82 1379 pop dpl0 02F1 D0 F0 1380 pop b 02F3 D0 E0 1381 pop acc 02F5 32 1382 reti 1383 02F6 1384 timer1_isr: 02F6 C0 E0 1385 push acc 02F8 C0 F0 1386 push b 02FA C0 82 1387 push dpl0 02FC C0 83 1388 push dph0 02FE C0 D0 1389 push psw 0300 75 D0 00 1390 mov psw,#0x00 0303 C0 86 1391 push dps 0305 75 86 00 1392 mov dps,#0 1393 ;; clear interrupt 0308 C2 8F 1394 clr tcon+7 1395 ;; handle interrupt 1396 ;; epilogue 030A D0 86 1397 pop dps 030C D0 D0 1398 pop psw 030E D0 83 1399 pop dph0 0310 D0 82 1400 pop dpl0 0312 D0 F0 1401 pop b 0314 D0 E0 1402 pop acc 0316 32 1403 reti 1404 0317 1405 ser0_isr: 0317 C0 E0 1406 push acc 0319 C0 F0 1407 push b 031B C0 82 1408 push dpl0 031D C0 83 1409 push dph0 031F C0 D0 1410 push psw 0321 75 D0 00 1411 mov psw,#0x00 0324 C0 86 1412 push dps 0326 75 86 00 1413 mov dps,#0 0329 C0 00 1414 push ar0 1415 ;; clear interrupt 032B 10 98 16 1416 jbc scon0+0,1$ ; RI 032E 10 99 0F 1417 0$: jbc scon0+1,2$ ; TI 1418 ;; handle interrupt 1419 ;; epilogue 0331 D0 00 1420 3$: pop ar0 0333 D0 86 1421 pop dps 0335 D0 D0 1422 pop psw 0337 D0 83 1423 pop dph0 0339 D0 82 1424 pop dpl0 033B D0 F0 1425 pop b 033D D0 E0 1426 pop acc 033F 32 1427 reti 1428 0340 D2*0B 1429 2$: setb uartempty 0342 80 EA 1430 sjmp 0$ 1431 0344 E5*2A 1432 1$: mov a,uartwr 0346 24r1A 1433 add a,#uartbuf 0348 F8 1434 mov r0,a 0349 E5 99 1435 mov a,sbuf0 034B F6 1436 mov @r0,a 034C E5*2A 1437 mov a,uartwr 034E 04 1438 inc a 034F 54 0F 1439 anl a,#0xf 0351 F5*2A 1440 mov uartwr,a 0353 80 DC 1441 sjmp 3$ 1442 0355 1443 timer2_isr: 0355 C0 E0 1444 push acc 0357 C0 F0 1445 push b 0359 C0 82 1446 push dpl0 035B C0 83 1447 push dph0 035D C0 D0 1448 push psw 035F 75 D0 00 1449 mov psw,#0x00 0362 C0 86 1450 push dps 0364 75 86 00 1451 mov dps,#0 1452 ;; clear interrupt 0367 C2 CF 1453 clr t2con+7 1454 ;; handle interrupt 1455 ;; epilogue 0369 D0 86 1456 pop dps 036B D0 D0 1457 pop psw 036D D0 83 1458 pop dph0 036F D0 82 1459 pop dpl0 0371 D0 F0 1460 pop b 0373 D0 E0 1461 pop acc 0375 32 1462 reti 1463 0376 1464 resume_isr: 0376 C0 E0 1465 push acc 0378 C0 F0 1466 push b 037A C0 82 1467 push dpl0 037C C0 83 1468 push dph0 037E C0 D0 1469 push psw 0380 75 D0 00 1470 mov psw,#0x00 0383 C0 86 1471 push dps 0385 75 86 00 1472 mov dps,#0 1473 ;; clear interrupt 0388 C2 DC 1474 clr eicon+4 1475 ;; handle interrupt 1476 ;; epilogue 038A D0 86 1477 pop dps 038C D0 D0 1478 pop psw 038E D0 83 1479 pop dph0 0390 D0 82 1480 pop dpl0 0392 D0 F0 1481 pop b 0394 D0 E0 1482 pop acc 0396 32 1483 reti 1484 0397 1485 ser1_isr: 0397 C0 E0 1486 push acc 0399 C0 F0 1487 push b 039B C0 82 1488 push dpl0 039D C0 83 1489 push dph0 039F C0 D0 1490 push psw 03A1 75 D0 00 1491 mov psw,#0x00 03A4 C0 86 1492 push dps 03A6 75 86 00 1493 mov dps,#0 1494 ;; clear interrupt 03A9 C2 C0 1495 clr scon1+0 03AB C2 C1 1496 clr scon1+1 1497 ;; handle interrupt 1498 ;; epilogue 03AD D0 86 1499 pop dps 03AF D0 D0 1500 pop psw 03B1 D0 83 1501 pop dph0 03B3 D0 82 1502 pop dpl0 03B5 D0 F0 1503 pop b 03B7 D0 E0 1504 pop acc 03B9 32 1505 reti 1506 03BA 1507 i2c_isr: 03BA C0 E0 1508 push acc 03BC C0 F0 1509 push b 03BE C0 82 1510 push dpl0 03C0 C0 83 1511 push dph0 03C2 C0 D0 1512 push psw 03C4 75 D0 00 1513 mov psw,#0x00 03C7 C0 86 1514 push dps 03C9 75 86 00 1515 mov dps,#0 1516 ;; clear interrupt 03CC E5 91 1517 mov a,exif 03CE C2 E5 1518 clr acc.5 03D0 F5 91 1519 mov exif,a 1520 ;; handle interrupt 1521 ;; epilogue 03D2 D0 86 1522 pop dps 03D4 D0 D0 1523 pop psw 03D6 D0 83 1524 pop dph0 03D8 D0 82 1525 pop dpl0 03DA D0 F0 1526 pop b 03DC D0 E0 1527 pop acc 03DE 32 1528 reti 1529 03DF 1530 int4_isr: 03DF C0 E0 1531 push acc 03E1 C0 F0 1532 push b 03E3 C0 82 1533 push dpl0 03E5 C0 83 1534 push dph0 03E7 C0 D0 1535 push psw 03E9 75 D0 00 1536 mov psw,#0x00 03EC C0 86 1537 push dps 03EE 75 86 00 1538 mov dps,#0 1539 ;; clear interrupt 03F1 E5 91 1540 mov a,exif 03F3 C2 E6 1541 clr acc.6 03F5 F5 91 1542 mov exif,a 1543 ;; handle interrupt 1544 ;; epilogue 03F7 D0 86 1545 pop dps 03F9 D0 D0 1546 pop psw 03FB D0 83 1547 pop dph0 03FD D0 82 1548 pop dpl0 03FF D0 F0 1549 pop b 0401 D0 E0 1550 pop acc 0403 32 1551 reti 1552 0404 1553 int5_isr: 0404 C0 E0 1554 push acc 0406 C0 F0 1555 push b 0408 C0 82 1556 push dpl0 040A C0 83 1557 push dph0 040C C0 D0 1558 push psw 040E 75 D0 00 1559 mov psw,#0x00 0411 C0 86 1560 push dps 0413 75 86 00 1561 mov dps,#0 1562 ;; clear interrupt 0416 E5 91 1563 mov a,exif 0418 C2 E7 1564 clr acc.7 041A F5 91 1565 mov exif,a 1566 ;; handle interrupt 1567 ;; epilogue 041C D0 86 1568 pop dps 041E D0 D0 1569 pop psw 0420 D0 83 1570 pop dph0 0422 D0 82 1571 pop dpl0 0424 D0 F0 1572 pop b 0426 D0 E0 1573 pop acc 0428 32 1574 reti 1575 0429 1576 int6_isr: 0429 C0 E0 1577 push acc 042B C0 F0 1578 push b 042D C0 82 1579 push dpl0 042F C0 83 1580 push dph0 0431 C0 D0 1581 push psw 0433 75 D0 00 1582 mov psw,#0x00 0436 C0 86 1583 push dps 0438 75 86 00 1584 mov dps,#0 1585 ;; clear interrupt 043B C2 DB 1586 clr eicon+3 1587 ;; handle interrupt 1588 ;; epilogue 043D D0 86 1589 pop dps 043F D0 D0 1590 pop psw 0441 D0 83 1591 pop dph0 0443 D0 82 1592 pop dpl0 0445 D0 F0 1593 pop b 0447 D0 E0 1594 pop acc 0449 32 1595 reti 1596 044A 1597 usb_sudav_isr: 044A C0 E0 1598 push acc 044C C0 F0 1599 push b 044E C0 82 1600 push dpl0 0450 C0 83 1601 push dph0 0452 C0 84 1602 push dpl1 0454 C0 85 1603 push dph1 0456 C0 D0 1604 push psw 0458 75 D0 00 1605 mov psw,#0x00 045B C0 86 1606 push dps 045D 75 86 00 1607 mov dps,#0 0460 C0 00 1608 push ar0 0462 C0 07 1609 push ar7 1610 ;; clear interrupt 0464 E5 91 1611 mov a,exif 0466 C2 E4 1612 clr acc.4 0468 F5 91 1613 mov exif,a 046A 90 7F AB 1614 mov dptr,#USBIRQ 046D 74 01 1615 mov a,#0x01 046F F0 1616 movx @dptr,a 1617 ;; handle interrupt 0470 75*00 00 1618 mov ctrlcode,#0 ; reset control out code 0473 90 7F E9 1619 mov dptr,#SETUPDAT+1 0476 E0 1620 movx a,@dptr ; bRequest field 1621 ;; standard commands 1622 ;; USB_REQ_GET_DESCRIPTOR 0477 B4 06 59 1623 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 047A 90 7F E8 1624 mov dptr,#SETUPDAT ; bRequestType == 0x80 047D E0 1625 movx a,@dptr 047E B4 80 4F 1626 cjne a,#USB_DIR_IN,setupstallstd 0481 90 7F EB 1627 mov dptr,#SETUPDAT+3 0484 E0 1628 movx a,@dptr 0485 B4 01 0C 1629 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 0488 90 7F D4 1630 mov dptr,#SUDPTRH 048B 74s0C 1631 mov a,#>devicedescr 048D F0 1632 movx @dptr,a 048E A3 1633 inc dptr 048F 74r7D 1634 mov a,#config0descr 04A2 F0 1644 movx @dptr,a 04A3 A3 1645 inc dptr 04A4 74r8F 1646 mov a,#stringdescr 04BE F5 83 1661 mov dph0,a 04C0 E0 1662 movx a,@dptr 04C1 F5 F0 1663 mov b,a 04C3 A3 1664 inc dptr 04C4 E0 1665 movx a,@dptr 04C5 90 7F D4 1666 mov dptr,#SUDPTRH 04C8 F0 1667 movx @dptr,a 04C9 A3 1668 inc dptr 04CA E5 F0 1669 mov a,b 04CC F0 1670 movx @dptr,a 1671 ; sjmp setupackstd 04CD 1672 setupackstd: 04CD 02s08r5D 1673 ljmp setupack 04D0 1674 setupstallstd: 04D0 02s08r59 1675 ljmp setupstall 04D3 1676 cmdnotgetdesc: 1677 ;; USB_REQ_SET_CONFIGURATION 04D3 B4 09 41 1678 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 04D6 90 7F E8 1679 mov dptr,#SETUPDAT 04D9 E0 1680 movx a,@dptr 04DA 70 F4 1681 jnz setupstallstd 04DC 90 7F EA 1682 mov dptr,#SETUPDAT+2 04DF E0 1683 movx a,@dptr 04E0 24 FE 1684 add a,#-2 04E2 40 EC 1685 jc setupstallstd 04E4 E0 1686 movx a,@dptr 04E5 F5*2F 1687 mov numconfig,a 04E7 1688 cmdresettoggleshalt: 04E7 90 7F D7 1689 mov dptr,#TOGCTL 04EA 78 07 1690 mov r0,#7 04EC E8 1691 0$: mov a,r0 04ED 44 10 1692 orl a,#0x10 04EF F0 1693 movx @dptr,a 04F0 44 30 1694 orl a,#0x30 04F2 F0 1695 movx @dptr,a 04F3 E8 1696 mov a,r0 04F4 F0 1697 movx @dptr,a 04F5 44 20 1698 orl a,#0x20 04F7 F0 1699 movx @dptr,a 04F8 D8 F2 1700 djnz r0,0$ 04FA E4 1701 clr a 04FB F0 1702 movx @dptr,a 04FC 74 02 1703 mov a,#2 04FE 90 7F B6 1704 mov dptr,#IN1CS 0501 78 07 1705 mov r0,#7 0503 F0 1706 1$: movx @dptr,a 0504 A3 1707 inc dptr 0505 A3 1708 inc dptr 0506 D8 FB 1709 djnz r0,1$ 0508 90 7F C6 1710 mov dptr,#OUT1CS 050B 78 07 1711 mov r0,#7 050D F0 1712 2$: movx @dptr,a 050E A3 1713 inc dptr 050F A3 1714 inc dptr 0510 D8 FB 1715 djnz r0,2$ 0512 12s09r9A 1716 lcall fillusbintr 0515 80 B6 1717 sjmp setupackstd 0517 1718 cmdnotsetconf: 1719 ;; USB_REQ_SET_INTERFACE 0517 B4 0B 1A 1720 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 051A 90 7F E8 1721 mov dptr,#SETUPDAT 051D E0 1722 movx a,@dptr 051E B4 01 AF 1723 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 0521 E5*2F 1724 mov a,numconfig 0523 B4 01 AA 1725 cjne a,#1,setupstallstd 0526 90 7F EC 1726 mov dptr,#SETUPDAT+4 0529 E0 1727 movx a,@dptr 052A 70 A4 1728 jnz setupstallstd 052C 90 7F EA 1729 mov dptr,#SETUPDAT+2 052F E0 1730 movx a,@dptr 0530 F5*30 1731 mov altsetting,a 0532 80 B3 1732 sjmp cmdresettoggleshalt 0534 1733 cmdnotsetint: 1734 ;; USB_REQ_GET_INTERFACE 0534 B4 0A 20 1735 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 0537 90 7F E8 1736 mov dptr,#SETUPDAT 053A E0 1737 movx a,@dptr 053B B4 81 92 1738 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 053E E5*2F 1739 mov a,numconfig 0540 B4 01 8D 1740 cjne a,#1,setupstallstd 0543 90 7F EC 1741 mov dptr,#SETUPDAT+4 0546 E0 1742 movx a,@dptr 0547 70 87 1743 jnz setupstallstd 0549 E5*30 1744 mov a,altsetting 054B 1745 cmdrespondonebyte: 054B 90 7F 00 1746 mov dptr,#IN0BUF 054E F0 1747 movx @dptr,a 054F 90 7F B5 1748 mov dptr,#IN0BC 0552 74 01 1749 mov a,#1 0554 F0 1750 movx @dptr,a 0555 80 4E 1751 sjmp setupackstd2 0557 1752 cmdnotgetint: 1753 ;; USB_REQ_GET_CONFIGURATION 0557 B4 08 0B 1754 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 055A 90 7F E8 1755 mov dptr,#SETUPDAT 055D E0 1756 movx a,@dptr 055E B4 80 47 1757 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 0561 E5*2F 1758 mov a,numconfig 0563 80 E6 1759 sjmp cmdrespondonebyte 0565 1760 cmdnotgetconf: 1761 ;; USB_REQ_GET_STATUS (0) 0565 70 44 1762 jnz cmdnotgetstat 0567 90 7F E8 1763 mov dptr,#SETUPDAT 056A E0 1764 movx a,@dptr 056B B4 80 11 1765 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 056E 74 01 1766 mov a,#1 0570 1767 cmdrespondstat: 0570 90 7F 00 1768 mov dptr,#IN0BUF 0573 F0 1769 movx @dptr,a 0574 A3 1770 inc dptr 0575 E4 1771 clr a 0576 F0 1772 movx @dptr,a 0577 90 7F B5 1773 mov dptr,#IN0BC 057A 74 02 1774 mov a,#2 057C F0 1775 movx @dptr,a 057D 80 26 1776 sjmp setupackstd2 057F 1777 cmdnotgetstatdev: 057F B4 81 03 1778 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 0582 E4 1779 clr a 0583 80 EB 1780 sjmp cmdrespondstat 0585 1781 cmdnotgetstatintf: 0585 B4 82 20 1782 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 0588 90 7F EC 1783 mov dptr,#SETUPDAT+4 058B E0 1784 movx a,@dptr 058C 90 7F C4 1785 mov dptr,#OUT1CS-2 058F 30 E7 03 1786 jnb acc.7,0$ 0592 90 7F B4 1787 mov dptr,#IN1CS-2 0595 54 0F 1788 0$: anl a,#15 0597 60 0F 1789 jz setupstallstd2 0599 20 E3 0C 1790 jb acc.3,setupstallstd2 059C 25 E0 1791 add a,acc 059E 25 82 1792 add a,dpl0 05A0 F5 82 1793 mov dpl0,a 05A2 E0 1794 movx a,@dptr 05A3 80 CB 1795 sjmp cmdrespondstat 05A5 1796 setupackstd2: 05A5 02s08r5D 1797 ljmp setupack 05A8 1798 setupstallstd2: 05A8 02s08r59 1799 ljmp setupstall 05AB 1800 cmdnotgetstat: 1801 ;; USB_REQ_SET_FEATURE 05AB B4 03 05 1802 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 05AE 75 F0 01 1803 mov b,#1 05B1 80 06 1804 sjmp handleftr 05B3 1805 cmdnotsetftr: 1806 ;; USB_REQ_CLEAR_FEATURE 05B3 B4 01 44 1807 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 05B6 75 F0 00 1808 mov b,#0 05B9 1809 handleftr: 05B9 90 7F E8 1810 mov dptr,#SETUPDAT 05BC E0 1811 movx a,@dptr 05BD B4 02 E8 1812 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 05C0 A3 1813 inc dptr 05C1 A3 1814 inc dptr 05C2 E0 1815 movx a,@dptr 05C3 70 E3 1816 jnz setupstallstd2 ; not ENDPOINT_HALT feature 05C5 A3 1817 inc dptr 05C6 E0 1818 movx a,@dptr 05C7 70 DF 1819 jnz setupstallstd2 05C9 A3 1820 inc dptr 05CA E0 1821 movx a,@dptr 05CB 90 7F C4 1822 mov dptr,#OUT1CS-2 05CE 30 E7 05 1823 jnb acc.7,0$ 05D1 90 7F B4 1824 mov dptr,#IN1CS-2 05D4 44 10 1825 orl a,#0x10 05D6 20 E3 CF 1826 0$: jb acc.3,setupstallstd2 1827 ;; clear data toggle 05D9 54 1F 1828 anl a,#0x1f 05DB 05 86 1829 inc dps 05DD 90 7F D7 1830 mov dptr,#TOGCTL 05E0 F0 1831 movx @dptr,a 05E1 44 20 1832 orl a,#0x20 05E3 F0 1833 movx @dptr,a 05E4 54 0F 1834 anl a,#15 05E6 F0 1835 movx @dptr,a 05E7 15 86 1836 dec dps 1837 ;; clear/set ep halt feature 05E9 25 E0 1838 add a,acc 05EB 25 82 1839 add a,dpl0 05ED F5 82 1840 mov dpl0,a 05EF E5 F0 1841 mov a,b 05F1 F0 1842 movx @dptr,a 05F2 80 B1 1843 sjmp setupackstd2 1844 05F4 1845 cmdnotc0_1: 05F4 02s06rC2 1846 ljmp cmdnotc0 05F7 1847 setupstallc0_1: 05F7 02s08r59 1848 ljmp setupstall 1849 05FA 1850 cmdnotclrftr: 1851 ;; vendor specific commands 1852 ;; 0xc0 05FA B4 C0 F7 1853 cjne a,#0xc0,cmdnotc0_1 05FD 90 7F E8 1854 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0600 E0 1855 movx a,@dptr 0601 B4 C0 F3 1856 cjne a,#0xc0,setupstallc0_1 1857 ;; fill status buffer 0604 E5*05 1858 mov a,txstate 0606 F5 F0 1859 mov b,a 0608 D2 F2 1860 setb b.2 060A 45*10 1861 orl a,pttforce 060C B4 00 02 1862 cjne a,#0,0$ 060F C2 F2 1863 clr b.2 0611 90 C0 0E 1864 0$: mov dptr,#FSKMDISCIN 0614 E0 1865 movx a,@dptr 0615 A2 E6 1866 mov c,acc.6 0617 B3 1867 cpl c 0618 82*08 1868 anl c,extmodem 061A 92 F3 1869 mov b.3,c 061C 90 C0 09 1870 mov dptr,#FSKSTAT 061F E0 1871 movx a,@dptr 0620 A2 E0 1872 mov c,acc.0 0622 B0r08 1873 anl c,/extmodem 0624 72 F3 1874 orl c,b.3 0626 92 F3 1875 mov b.3,c 0628 A2*0B 1876 mov c,uartempty 062A 92 F5 1877 mov b.5,c 062C E4 1878 clr a 062D 90 7F 04 1879 mov dptr,#(IN0BUF+4) 0630 F0 1880 movx @dptr,a 1881 ;; bytewide elements 0631 90 7F 00 1882 mov dptr,#(IN0BUF) 0634 E5 F0 1883 mov a,b 0636 F0 1884 movx @dptr,a 0637 E5*08 1885 mov a,txwr 0639 F4 1886 cpl a 063A 25*09 1887 add a,txrd 063C 54 0F 1888 anl a,#(TXCHUNKS-1) 063E 90 7F 01 1889 mov dptr,#(IN0BUF+1) 0641 F0 1890 movx @dptr,a 0642 E5*13 1891 mov a,rxrd 0644 F4 1892 cpl a 0645 25*12 1893 add a,rxwr 0647 04 1894 inc a 0648 54 1F 1895 anl a,#(RXCHUNKS-1) 064A 90 7F 02 1896 mov dptr,#(IN0BUF+2) 064D F0 1897 movx @dptr,a 064E 90 C0 04 1898 mov dptr,#FSKRSSI 0651 E0 1899 movx a,@dptr 0652 90 7F 03 1900 mov dptr,#(IN0BUF+3) 0655 F0 1901 movx @dptr,a 1902 ;; counter 0656 05*04 1903 inc irqcount 0658 E5*04 1904 mov a,irqcount 065A 90 7F 05 1905 mov dptr,#(IN0BUF+5) 065D F0 1906 movx @dptr,a 1907 ;; additional fields (HDLC state mach) 065E E5*05 1908 mov a,txstate 0660 A3 1909 inc dptr 0661 F0 1910 movx @dptr,a 0662 E5*09 1911 mov a,txrd 0664 A3 1912 inc dptr 0665 F0 1913 movx @dptr,a 0666 E5*08 1914 mov a,txwr 0668 A3 1915 inc dptr 0669 F0 1916 movx @dptr,a 066A E5*0A 1917 mov a,txtwr 066C A3 1918 inc dptr 066D F0 1919 movx @dptr,a 066E E5*0B 1920 mov a,txcnt 0670 A3 1921 inc dptr 0671 F0 1922 movx @dptr,a 0672 E5*06 1923 mov a,flagcnt 0674 A3 1924 inc dptr 0675 F0 1925 movx @dptr,a 0676 E5*07 1926 mov a,flagcnt+1 0678 A3 1927 inc dptr 0679 F0 1928 movx @dptr,a 067A E5*11 1929 mov a,rxstate 067C A3 1930 inc dptr 067D F0 1931 movx @dptr,a 067E E5*13 1932 mov a,rxrd 0680 A3 1933 inc dptr 0681 F0 1934 movx @dptr,a 0682 E5*12 1935 mov a,rxwr 0684 A3 1936 inc dptr 0685 F0 1937 movx @dptr,a 0686 E5*14 1938 mov a,rxtwr 0688 A3 1939 inc dptr 0689 F0 1940 movx @dptr,a 068A E5*15 1941 mov a,rxcnt 068C A3 1942 inc dptr 068D F0 1943 movx @dptr,a 1944 ;; FPGA registers 068E E5*19 1945 mov a,tmprxcnt 0690 90 7F 12 1946 mov dptr,#(IN0BUF+18) 0693 F0 1947 movx @dptr,a 0694 90 C0 00 1948 mov dptr,#FSKTXCNT 0697 E0 1949 movx a,@dptr 0698 90 7F 13 1950 mov dptr,#(IN0BUF+19) 069B F0 1951 movx @dptr,a 069C A3 1952 inc dptr 069D E5 20 1953 mov a,ctrlreg 069F F0 1954 movx @dptr,a 06A0 90 C0 09 1955 mov dptr,#FSKSTAT 06A3 E0 1956 movx a,@dptr 06A4 90 7F 15 1957 mov dptr,#(IN0BUF+21) 06A7 F0 1958 movx @dptr,a 1959 ;; Anchor Registers 06A8 90 7F C8 1960 mov dptr,#OUT2CS 06AB E0 1961 movx a,@dptr 06AC 90 7F 16 1962 mov dptr,#(IN0BUF+22) 06AF F0 1963 movx @dptr,a 1964 ;; set length 06B0 90 7F EE 1965 mov dptr,#SETUPDAT+6 ; wLength 06B3 E0 1966 movx a,@dptr 06B4 24 E9 1967 add a,#-(6+12+4+1) 06B6 50 01 1968 jnc 4$ 06B8 E4 1969 clr a 06B9 24 17 1970 4$: add a,#(6+12+4+1) 06BB 90 7F B5 1971 mov dptr,#IN0BC 06BE F0 1972 movx @dptr,a 06BF 02s08r5D 1973 ljmp setupack 06C2 1974 cmdnotc0: 1975 ;; 0xc8 06C2 B4 C8 1D 1976 cjne a,#0xc8,cmdnotc8 06C5 90 7F E8 1977 mov dptr,#SETUPDAT ; bRequestType == 0xc0 06C8 E0 1978 movx a,@dptr 06C9 B4 C0 13 1979 cjne a,#0xc0,setupstallc8 06CC 74 01 1980 mov a,#1 06CE 30*08 01 1981 jnb extmodem,1$ 06D1 04 1982 inc a 06D2 90 7F 00 1983 1$: mov dptr,#IN0BUF 06D5 F0 1984 movx @dptr,a 06D6 90 7F B5 1985 mov dptr,#IN0BC 06D9 74 01 1986 mov a,#1 06DB F0 1987 movx @dptr,a 06DC 02s08r5D 1988 ljmp setupack 06DF 1989 setupstallc8: 06DF 02s08r59 1990 ljmp setupstall 06E2 1991 cmdnotc8: 1992 ;; 0xc9 06E2 B4 C9 21 1993 cjne a,#0xc9,cmdnotc9 06E5 90 7F E8 1994 mov dptr,#SETUPDAT ; bRequestType == 0xc0 06E8 E0 1995 movx a,@dptr 06E9 B4 C0 17 1996 cjne a,#0xc0,setupstallc9 06EC 90 7F 00 1997 mov dptr,#IN0BUF 06EF 78rF0 1998 mov r0,#parserial 06F1 E2 1999 0$: movx a,@r0 06F2 60 05 2000 jz 1$ 06F4 F0 2001 movx @dptr,a 06F5 08 2002 inc r0 06F6 A3 2003 inc dptr 06F7 80 F8 2004 sjmp 0$ 06F9 E8 2005 1$: mov a,r0 06FA 24 10 2006 add a,#-0xf0 ; -parserial 06FC 90 7F B5 2007 mov dptr,#IN0BC 06FF F0 2008 movx @dptr,a 0700 02s08r5D 2009 ljmp setupack 0703 2010 setupstallc9: 0703 02s08r59 2011 ljmp setupstall 0706 2012 cmdnotc9: 2013 ;; 0xd0 0706 B4 D0 5D 2014 cjne a,#0xd0,cmdnotd0 0709 90 7F E8 2015 mov dptr,#SETUPDAT ; bRequestType == 0xc0 070C E0 2016 movx a,@dptr 070D B4 C0 53 2017 cjne a,#0xc0,setupstalld0 0710 90 7F EC 2018 mov dptr,#SETUPDAT+4 ; wIndex 0713 E0 2019 movx a,@dptr 0714 B4 01 0A 2020 cjne a,#1,0$ 0717 90 7F EA 2021 mov dptr,#SETUPDAT+2 ; wValue 071A E0 2022 movx a,@dptr 071B 54 01 2023 anl a,#1 071D F5*10 2024 mov pttforce,a 071F D2*0A 2025 setb pttforcechg 0721 2026 0$: ;; PTT status 0721 90 7F 00 2027 mov dptr,#IN0BUF 0724 E5*05 2028 mov a,txstate 0726 45*10 2029 orl a,pttforce 0728 60 02 2030 jz 1$ 072A 74 01 2031 mov a,#1 072C F0 2032 1$: movx @dptr,a 2033 ;; DCD status 072D 90 C0 0E 2034 mov dptr,#FSKMDISCIN 0730 E0 2035 movx a,@dptr 0731 A2 E6 2036 mov c,acc.6 0733 A0r08 2037 orl c,/extmodem 0735 92 F0 2038 mov b.0,c 0737 90 C0 09 2039 mov dptr,#FSKSTAT 073A E0 2040 movx a,@dptr 073B A2 E0 2041 mov c,acc.0 073D 72*08 2042 orl c,extmodem 073F 82 F0 2043 anl c,b.0 0741 B3 2044 cpl c 0742 E4 2045 clr a 0743 92 E0 2046 mov acc.0,c 0745 90 7F 01 2047 mov dptr,#IN0BUF+1 0748 F0 2048 movx @dptr,a 2049 ;; RSSI 0749 90 C0 04 2050 mov dptr,#FSKRSSI 074C E0 2051 movx a,@dptr 074D 90 7F 02 2052 mov dptr,#IN0BUF+2 0750 F0 2053 movx @dptr,a 2054 ;; length 0751 90 7F EE 2055 mov dptr,#SETUPDAT+6 ; wLength 0754 E0 2056 movx a,@dptr 0755 24 FD 2057 add a,#-3 0757 50 01 2058 jnc 2$ 0759 E4 2059 clr a 075A 24 03 2060 2$: add a,#3 075C 90 7F B5 2061 mov dptr,#IN0BC 075F F0 2062 movx @dptr,a 0760 02s08r5D 2063 ljmp setupack 0763 2064 setupstalld0: 0763 02s08r59 2065 ljmp setupstall 0766 2066 cmdnotd0: 2067 ;; 0xd1 0766 B4 D1 29 2068 cjne a,#0xd1,cmdnotd1 0769 90 7F E8 2069 mov dptr,#SETUPDAT ; bRequestType == 0xc0 076C E0 2070 movx a,@dptr 076D B4 C0 1F 2071 cjne a,#0xc0,setupstalld1 0770 90 7F 00 2072 mov dptr,#IN0BUF 0773 78rE0 2073 mov r0,#parbitratetx 0775 7F 06 2074 mov r7,#6 0777 E2 2075 1$: movx a,@r0 0778 F0 2076 movx @dptr,a 0779 A3 2077 inc dptr 077A 08 2078 inc r0 077B DF FA 2079 djnz r7,1$ 2080 ;; length 077D 90 7F EE 2081 mov dptr,#SETUPDAT+6 ; wLength 0780 E0 2082 movx a,@dptr 0781 24 FA 2083 add a,#-6 0783 50 01 2084 jnc 2$ 0785 E4 2085 clr a 0786 24 06 2086 2$: add a,#6 0788 90 7F B5 2087 mov dptr,#IN0BC 078B F0 2088 movx @dptr,a 078C 02s08r5D 2089 ljmp setupack 078F 2090 setupstalld1: 078F 02s08r59 2091 ljmp setupstall 0792 2092 cmdnotd1: 2093 ;; 0xd2 0792 B4 D2 20 2094 cjne a,#0xd2,cmdnotd2 0795 90 7F E8 2095 mov dptr,#SETUPDAT ; bRequestType == 0x40 0798 E0 2096 movx a,@dptr 0799 B4 40 16 2097 cjne a,#0x40,setupstalld2 079C 90 7F EA 2098 mov dptr,#SETUPDAT+2 ; wValue 079F E0 2099 movx a,@dptr 07A0 F5 F0 2100 mov b,a 07A2 90 7F 98 2101 mov dptr,#OUTC 07A5 E0 2102 movx a,@dptr 07A6 A2 F0 2103 mov c,b.0 07A8 92 E3 2104 mov acc.3,c 07AA A2 F1 2105 mov c,b.1 07AC 92 E5 2106 mov acc.5,c 07AE F0 2107 movx @dptr,a 07AF 02s08r5D 2108 ljmp setupack 07B2 2109 setupstalld2: 07B2 02s08r59 2110 ljmp setupstall 07B5 2111 cmdnotd2: 2112 ;; 0xd3 07B5 B4 D3 16 2113 cjne a,#0xd3,cmdnotd3 07B8 90 7F E8 2114 mov dptr,#SETUPDAT ; bRequestType == 0x40 07BB E0 2115 movx a,@dptr 07BC B4 40 07 2116 cjne a,#0x40,setupstalld3 07BF 90 7F EA 2117 mov dptr,#SETUPDAT+2 ; wValue 07C2 E0 2118 movx a,@dptr 07C3 10*0B 03 2119 jbc uartempty,cmdd2cont 07C6 2120 setupstalld3: 07C6 02s08r59 2121 ljmp setupstall 07C9 2122 cmdd2cont: 07C9 F5 99 2123 mov sbuf0,a 07CB 02s08r5D 2124 ljmp setupack 07CE 2125 cmdnotd3: 2126 ;; 0xd4 07CE B4 D4 4C 2127 cjne a,#0xd4,cmdnotd4 07D1 90 7F E8 2128 mov dptr,#SETUPDAT ; bRequestType == 0xc0 07D4 E0 2129 movx a,@dptr 07D5 B4 C0 42 2130 cjne a,#0xc0,setupstalld4 07D8 20*08 3F 2131 jb extmodem,setupstalld4 07DB 90 7F EC 2132 mov dptr,#SETUPDAT+4 ; wIndex 07DE E0 2133 movx a,@dptr 07DF 90 7F EA 2134 mov dptr,#SETUPDAT+2 ; wValue 07E2 B4 01 09 2135 cjne a,#1,0$ 07E5 E0 2136 movx a,@dptr 07E6 90 C0 0D 2137 mov dptr,#FSKMDISCOUT 07E9 F0 2138 movx @dptr,a 07EA F5*2E 2139 mov mdiscout,a 07EC 80 0A 2140 sjmp 1$ 07EE B4 02 07 2141 0$: cjne a,#2,1$ 07F1 E0 2142 movx a,@dptr 07F2 90 C0 0C 2143 mov dptr,#FSKMDISCTRIS 07F5 F0 2144 movx @dptr,a 07F6 F5*2D 2145 mov mdisctris,a 07F8 90 C0 0E 2146 1$: mov dptr,#FSKMDISCIN 07FB E0 2147 movx a,@dptr 07FC 90 7F 00 2148 mov dptr,#IN0BUF+0 07FF F0 2149 movx @dptr,a 0800 E5*2E 2150 mov a,mdiscout 0802 A3 2151 inc dptr 0803 F0 2152 movx @dptr,a 0804 E5*2D 2153 mov a,mdisctris 0806 A3 2154 inc dptr 0807 F0 2155 movx @dptr,a 2156 ;; length 0808 90 7F EE 2157 mov dptr,#SETUPDAT+6 ; wLength 080B E0 2158 movx a,@dptr 080C 24 FD 2159 add a,#-3 080E 50 01 2160 jnc 2$ 0810 E4 2161 clr a 0811 24 03 2162 2$: add a,#3 0813 90 7F B5 2163 mov dptr,#IN0BC 0816 F0 2164 movx @dptr,a 0817 02s08r5D 2165 ljmp setupack 081A 2166 setupstalld4: 081A 02s08r59 2167 ljmp setupstall 081D 2168 cmdnotd4: 2169 ;; 0xd5 081D B4 D5 39 2170 cjne a,#0xd5,cmdnotd5 0820 90 7F E8 2171 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0823 E0 2172 movx a,@dptr 0824 B4 C0 2F 2173 cjne a,#0xc0,setupstalld5 0827 90 7F EC 2174 mov dptr,#SETUPDAT+4 ; wIndex 082A E0 2175 movx a,@dptr 082B B4 01 0A 2176 cjne a,#1,0$ 082E 90 7F EA 2177 mov dptr,#SETUPDAT+2 ; wValue 0831 E0 2178 movx a,@dptr 0832 90 C0 0A 2179 mov dptr,#FSKT7FOUT 0835 F0 2180 movx @dptr,a 0836 F5*2C 2181 mov t7fout,a 0838 90 C0 0B 2182 0$: mov dptr,#FSKT7FIN 083B E0 2183 movx a,@dptr 083C 90 7F 00 2184 mov dptr,#IN0BUF+0 083F F0 2185 movx @dptr,a 0840 E5*2C 2186 mov a,t7fout 0842 A3 2187 inc dptr 0843 F0 2188 movx @dptr,a 2189 ;; length 0844 90 7F EE 2190 mov dptr,#SETUPDAT+6 ; wLength 0847 E0 2191 movx a,@dptr 0848 24 FE 2192 add a,#-2 084A 50 01 2193 jnc 2$ 084C E4 2194 clr a 084D 24 02 2195 2$: add a,#2 084F 90 7F B5 2196 mov dptr,#IN0BC 0852 F0 2197 movx @dptr,a 0853 02s08r5D 2198 ljmp setupack 0856 2199 setupstalld5: 0856 02s08r59 2200 ljmp setupstall 0859 2201 cmdnotd5: 2202 ;; unknown commands fall through to setupstall 2203 0859 2204 setupstall: 0859 74 03 2205 mov a,#3 085B 80 02 2206 sjmp endsetup 085D 2207 setupack: 085D 74 02 2208 mov a,#2 085F 2209 endsetup: 085F 90 7F B4 2210 mov dptr,#EP0CS 0862 F0 2211 movx @dptr,a 0863 2212 endusbisr: 2213 ;; epilogue 0863 D0 07 2214 pop ar7 0865 D0 00 2215 pop ar0 0867 D0 86 2216 pop dps 0869 D0 D0 2217 pop psw 086B D0 85 2218 pop dph1 086D D0 84 2219 pop dpl1 086F D0 83 2220 pop dph0 0871 D0 82 2221 pop dpl0 0873 D0 F0 2222 pop b 0875 D0 E0 2223 pop acc 0877 32 2224 reti 2225 0878 2226 usb_sof_isr: 0878 C0 E0 2227 push acc 087A C0 F0 2228 push b 087C C0 82 2229 push dpl0 087E C0 83 2230 push dph0 0880 C0 D0 2231 push psw 0882 75 D0 00 2232 mov psw,#0x00 0885 C0 86 2233 push dps 0887 75 86 00 2234 mov dps,#0 2235 ;; clear interrupt 088A E5 91 2236 mov a,exif 088C C2 E4 2237 clr acc.4 088E F5 91 2238 mov exif,a 0890 90 7F AB 2239 mov dptr,#USBIRQ 0893 74 02 2240 mov a,#0x02 0895 F0 2241 movx @dptr,a 2242 ;; handle interrupt 2243 ;; epilogue 0896 D0 86 2244 pop dps 0898 D0 D0 2245 pop psw 089A D0 83 2246 pop dph0 089C D0 82 2247 pop dpl0 089E D0 F0 2248 pop b 08A0 D0 E0 2249 pop acc 08A2 32 2250 reti 2251 2252 08A3 2253 usb_sutok_isr: 08A3 C0 E0 2254 push acc 08A5 C0 F0 2255 push b 08A7 C0 82 2256 push dpl0 08A9 C0 83 2257 push dph0 08AB C0 D0 2258 push psw 08AD 75 D0 00 2259 mov psw,#0x00 08B0 C0 86 2260 push dps 08B2 75 86 00 2261 mov dps,#0 2262 ;; clear interrupt 08B5 E5 91 2263 mov a,exif 08B7 C2 E4 2264 clr acc.4 08B9 F5 91 2265 mov exif,a 08BB 90 7F AB 2266 mov dptr,#USBIRQ 08BE 74 04 2267 mov a,#0x04 08C0 F0 2268 movx @dptr,a 2269 ;; handle interrupt 2270 ;; epilogue 08C1 D0 86 2271 pop dps 08C3 D0 D0 2272 pop psw 08C5 D0 83 2273 pop dph0 08C7 D0 82 2274 pop dpl0 08C9 D0 F0 2275 pop b 08CB D0 E0 2276 pop acc 08CD 32 2277 reti 2278 08CE 2279 usb_suspend_isr: 08CE C0 E0 2280 push acc 08D0 C0 F0 2281 push b 08D2 C0 82 2282 push dpl0 08D4 C0 83 2283 push dph0 08D6 C0 D0 2284 push psw 08D8 75 D0 00 2285 mov psw,#0x00 08DB C0 86 2286 push dps 08DD 75 86 00 2287 mov dps,#0 2288 ;; clear interrupt 08E0 E5 91 2289 mov a,exif 08E2 C2 E4 2290 clr acc.4 08E4 F5 91 2291 mov exif,a 08E6 90 7F AB 2292 mov dptr,#USBIRQ 08E9 74 08 2293 mov a,#0x08 08EB F0 2294 movx @dptr,a 2295 ;; handle interrupt 2296 ;; epilogue 08EC D0 86 2297 pop dps 08EE D0 D0 2298 pop psw 08F0 D0 83 2299 pop dph0 08F2 D0 82 2300 pop dpl0 08F4 D0 F0 2301 pop b 08F6 D0 E0 2302 pop acc 08F8 32 2303 reti 2304 08F9 2305 usb_usbreset_isr: 08F9 C0 E0 2306 push acc 08FB C0 F0 2307 push b 08FD C0 82 2308 push dpl0 08FF C0 83 2309 push dph0 0901 C0 D0 2310 push psw 0903 75 D0 00 2311 mov psw,#0x00 0906 C0 86 2312 push dps 0908 75 86 00 2313 mov dps,#0 2314 ;; clear interrupt 090B E5 91 2315 mov a,exif 090D C2 E4 2316 clr acc.4 090F F5 91 2317 mov exif,a 0911 90 7F AB 2318 mov dptr,#USBIRQ 0914 74 10 2319 mov a,#0x10 0916 F0 2320 movx @dptr,a 2321 ;; handle interrupt 2322 ;; epilogue 0917 D0 86 2323 pop dps 0919 D0 D0 2324 pop psw 091B D0 83 2325 pop dph0 091D D0 82 2326 pop dpl0 091F D0 F0 2327 pop b 0921 D0 E0 2328 pop acc 0923 32 2329 reti 2330 0924 2331 usb_ep0in_isr: 0924 C0 E0 2332 push acc 0926 C0 F0 2333 push b 0928 C0 82 2334 push dpl0 092A C0 83 2335 push dph0 092C C0 84 2336 push dpl1 092E C0 85 2337 push dph1 0930 C0 D0 2338 push psw 0932 75 D0 00 2339 mov psw,#0x00 0935 C0 86 2340 push dps 0937 75 86 00 2341 mov dps,#0 093A C0 00 2342 push ar0 093C C0 07 2343 push ar7 2344 ;; clear interrupt 093E E5 91 2345 mov a,exif 0940 C2 E4 2346 clr acc.4 0942 F5 91 2347 mov exif,a 0944 90 7F A9 2348 mov dptr,#IN07IRQ 0947 74 01 2349 mov a,#0x01 0949 F0 2350 movx @dptr,a 2351 ;; handle interrupt 2352 2353 ;ep0install: 2354 ; mov a,#3 2355 ; sjmp ep0incs 2356 ;ep0inack: 2357 ; mov a,#2 2358 ;ep0incs: 2359 ; mov dptr,#EP0CS 2360 ; movx @dptr,a 2361 ;ep0inendisr: 2362 ;; epilogue 094A D0 07 2363 pop ar7 094C D0 00 2364 pop ar0 094E D0 86 2365 pop dps 0950 D0 D0 2366 pop psw 0952 D0 85 2367 pop dph1 0954 D0 84 2368 pop dpl1 0956 D0 83 2369 pop dph0 0958 D0 82 2370 pop dpl0 095A D0 F0 2371 pop b 095C D0 E0 2372 pop acc 095E 32 2373 reti 2374 095F 2375 usb_ep0out_isr: 095F C0 E0 2376 push acc 0961 C0 F0 2377 push b 0963 C0 82 2378 push dpl0 0965 C0 83 2379 push dph0 0967 C0 84 2380 push dpl1 0969 C0 85 2381 push dph1 096B C0 D0 2382 push psw 096D 75 D0 00 2383 mov psw,#0x00 0970 C0 86 2384 push dps 0972 75 86 00 2385 mov dps,#0 0975 C0 00 2386 push ar0 0977 C0 06 2387 push ar6 2388 ;; clear interrupt 0979 E5 91 2389 mov a,exif 097B C2 E4 2390 clr acc.4 097D F5 91 2391 mov exif,a 097F 90 7F AA 2392 mov dptr,#OUT07IRQ 0982 74 01 2393 mov a,#0x01 0984 F0 2394 movx @dptr,a 2395 ;; handle interrupt 2396 2397 ;ep0outstall: 2398 ; mov ctrlcode,#0 2399 ; mov a,#3 2400 ; sjmp ep0outcs 2401 ;ep0outack: 2402 ; mov txwr,txtwr 2403 ; mov ctrlcode,#0 2404 ; mov a,#2 2405 ;ep0outcs: 2406 ; mov dptr,#EP0CS 2407 ; movx @dptr,a 2408 ;ep0outendisr: 2409 ;; epilogue 0985 D0 06 2410 pop ar6 0987 D0 00 2411 pop ar0 0989 D0 86 2412 pop dps 098B D0 D0 2413 pop psw 098D D0 85 2414 pop dph1 098F D0 84 2415 pop dpl1 0991 D0 83 2416 pop dph0 0993 D0 82 2417 pop dpl0 0995 D0 F0 2418 pop b 0997 D0 E0 2419 pop acc 0999 32 2420 reti 2421 099A 2422 fillusbintr:: 099A E5*05 2423 mov a,txstate 099C F5 F0 2424 mov b,a 099E D2 F2 2425 setb b.2 09A0 45*10 2426 orl a,pttforce 09A2 B4 00 02 2427 cjne a,#0,0$ 09A5 C2 F2 2428 clr b.2 09A7 90 C0 0E 2429 0$: mov dptr,#FSKMDISCIN 09AA E0 2430 movx a,@dptr 09AB A2 E6 2431 mov c,acc.6 09AD B3 2432 cpl c 09AE 82*08 2433 anl c,extmodem 09B0 92 F3 2434 mov b.3,c 09B2 90 C0 09 2435 mov dptr,#FSKSTAT 09B5 E0 2436 movx a,@dptr 09B6 A2 E0 2437 mov c,acc.0 09B8 B0r08 2438 anl c,/extmodem 09BA 72 F3 2439 orl c,b.3 09BC 92 F3 2440 mov b.3,c 09BE A2*0B 2441 mov c,uartempty 09C0 92 F5 2442 mov b.5,c 09C2 D3 2443 setb c 09C3 E5*13 2444 mov a,rxrd 09C5 B5*12 06 2445 cjne a,rxwr,1$ 09C8 90 7F B8 2446 mov dptr,#(IN2CS) 09CB E0 2447 movx a,@dptr 09CC A2 E1 2448 mov c,acc.1 09CE 92 F4 2449 1$: mov b.4,c 2450 ;; bytewide elements 09D0 90 7E 80 2451 mov dptr,#(IN1BUF) 09D3 E5 F0 2452 mov a,b 09D5 F0 2453 movx @dptr,a 09D6 E5*08 2454 mov a,txwr 09D8 F4 2455 cpl a 09D9 25*09 2456 add a,txrd 09DB 54 0F 2457 anl a,#(TXCHUNKS-1) 09DD 90 7E 81 2458 mov dptr,#(IN1BUF+1) 09E0 F0 2459 movx @dptr,a 09E1 E5*13 2460 mov a,rxrd 09E3 F4 2461 cpl a 09E4 25*12 2462 add a,rxwr 09E6 04 2463 inc a 09E7 54 1F 2464 anl a,#(RXCHUNKS-1) 09E9 90 7E 82 2465 mov dptr,#(IN1BUF+2) 09EC F0 2466 movx @dptr,a 09ED 90 C0 04 2467 mov dptr,#FSKRSSI 09F0 E0 2468 movx a,@dptr 09F1 90 7E 83 2469 mov dptr,#(IN1BUF+3) 09F4 F0 2470 movx @dptr,a 2471 ; counter 09F5 05*04 2472 inc irqcount 09F7 E5*04 2473 mov a,irqcount 09F9 90 7E 84 2474 mov dptr,#(IN1BUF+4) 09FC F0 2475 movx @dptr,a 2476 ; UART buffer 09FD 75 F0 05 2477 mov b,#5 0A00 90 7E 85 2478 mov dptr,#(IN1BUF+5) 0A03 E5*2B 2479 2$: mov a,uartrd 0A05 B5*2A 07 2480 cjne a,uartwr,3$ 2481 ; set length 0A08 90 7F B7 2482 mov dptr,#IN1BC 0A0B E5 F0 2483 mov a,b 0A0D F0 2484 movx @dptr,a 0A0E 22 2485 ret 2486 0A0F 24r1A 2487 3$: add a,#uartbuf 0A11 F8 2488 mov r0,a 0A12 E6 2489 mov a,@r0 0A13 F0 2490 movx @dptr,a 0A14 A3 2491 inc dptr 0A15 05 F0 2492 inc b 0A17 E5*2B 2493 mov a,uartrd 0A19 04 2494 inc a 0A1A 54 0F 2495 anl a,#0xf 0A1C F5*2B 2496 mov uartrd,a 0A1E 80 E3 2497 sjmp 2$ 2498 2499 0A20 2500 usb_ep1in_isr: 0A20 C0 E0 2501 push acc 0A22 C0 F0 2502 push b 0A24 C0 82 2503 push dpl0 0A26 C0 83 2504 push dph0 0A28 C0 D0 2505 push psw 0A2A 75 D0 00 2506 mov psw,#0x00 0A2D C0 86 2507 push dps 0A2F 75 86 00 2508 mov dps,#0 2509 ;; clear interrupt 0A32 E5 91 2510 mov a,exif 0A34 C2 E4 2511 clr acc.4 0A36 F5 91 2512 mov exif,a 0A38 90 7F A9 2513 mov dptr,#IN07IRQ 0A3B 74 02 2514 mov a,#0x02 0A3D F0 2515 movx @dptr,a 2516 ;; handle interrupt 0A3E 12s09r9A 2517 lcall fillusbintr 2518 ;; epilogue 0A41 D0 86 2519 pop dps 0A43 D0 D0 2520 pop psw 0A45 D0 83 2521 pop dph0 0A47 D0 82 2522 pop dpl0 0A49 D0 F0 2523 pop b 0A4B D0 E0 2524 pop acc 0A4D 32 2525 reti 2526 0A4E 2527 usb_ep1out_isr: 0A4E C0 E0 2528 push acc 0A50 C0 F0 2529 push b 0A52 C0 82 2530 push dpl0 0A54 C0 83 2531 push dph0 0A56 C0 D0 2532 push psw 0A58 75 D0 00 2533 mov psw,#0x00 0A5B C0 86 2534 push dps 0A5D 75 86 00 2535 mov dps,#0 2536 ;; clear interrupt 0A60 E5 91 2537 mov a,exif 0A62 C2 E4 2538 clr acc.4 0A64 F5 91 2539 mov exif,a 0A66 90 7F AA 2540 mov dptr,#OUT07IRQ 0A69 74 02 2541 mov a,#0x02 0A6B F0 2542 movx @dptr,a 2543 ;; handle interrupt 2544 ;; epilogue 0A6C D0 86 2545 pop dps 0A6E D0 D0 2546 pop psw 0A70 D0 83 2547 pop dph0 0A72 D0 82 2548 pop dpl0 0A74 D0 F0 2549 pop b 0A76 D0 E0 2550 pop acc 0A78 32 2551 reti 2552 0A79 2553 usb_ep2in_isr: 0A79 C0 E0 2554 push acc 0A7B C0 F0 2555 push b 0A7D C0 82 2556 push dpl0 0A7F C0 83 2557 push dph0 0A81 C0 D0 2558 push psw 0A83 75 D0 00 2559 mov psw,#0x00 0A86 C0 86 2560 push dps 0A88 75 86 00 2561 mov dps,#0 2562 ;; clear interrupt 0A8B E5 91 2563 mov a,exif 0A8D C2 E4 2564 clr acc.4 0A8F F5 91 2565 mov exif,a 0A91 90 7F A9 2566 mov dptr,#IN07IRQ 0A94 74 04 2567 mov a,#0x04 0A96 F0 2568 movx @dptr,a 2569 ;; handle interrupt 2570 ;; epilogue 0A97 D0 86 2571 pop dps 0A99 D0 D0 2572 pop psw 0A9B D0 83 2573 pop dph0 0A9D D0 82 2574 pop dpl0 0A9F D0 F0 2575 pop b 0AA1 D0 E0 2576 pop acc 0AA3 32 2577 reti 2578 0AA4 2579 usb_ep2out_isr: 0AA4 C0 E0 2580 push acc 0AA6 C0 F0 2581 push b 0AA8 C0 82 2582 push dpl0 0AAA C0 83 2583 push dph0 0AAC C0 D0 2584 push psw 0AAE 75 D0 00 2585 mov psw,#0x00 0AB1 C0 86 2586 push dps 0AB3 75 86 00 2587 mov dps,#0 2588 ;; clear interrupt 0AB6 E5 91 2589 mov a,exif 0AB8 C2 E4 2590 clr acc.4 0ABA F5 91 2591 mov exif,a 0ABC 90 7F AA 2592 mov dptr,#OUT07IRQ 0ABF 74 04 2593 mov a,#0x04 0AC1 F0 2594 movx @dptr,a 2595 ;; handle interrupt 2596 ;; epilogue 0AC2 D0 86 2597 pop dps 0AC4 D0 D0 2598 pop psw 0AC6 D0 83 2599 pop dph0 0AC8 D0 82 2600 pop dpl0 0ACA D0 F0 2601 pop b 0ACC D0 E0 2602 pop acc 0ACE 32 2603 reti 2604 0ACF 2605 usb_ep3in_isr: 0ACF C0 E0 2606 push acc 0AD1 C0 F0 2607 push b 0AD3 C0 82 2608 push dpl0 0AD5 C0 83 2609 push dph0 0AD7 C0 D0 2610 push psw 0AD9 75 D0 00 2611 mov psw,#0x00 0ADC C0 86 2612 push dps 0ADE 75 86 00 2613 mov dps,#0 2614 ;; clear interrupt 0AE1 E5 91 2615 mov a,exif 0AE3 C2 E4 2616 clr acc.4 0AE5 F5 91 2617 mov exif,a 0AE7 90 7F A9 2618 mov dptr,#IN07IRQ 0AEA 74 08 2619 mov a,#0x08 0AEC F0 2620 movx @dptr,a 2621 ;; handle interrupt 2622 ;; epilogue 0AED D0 86 2623 pop dps 0AEF D0 D0 2624 pop psw 0AF1 D0 83 2625 pop dph0 0AF3 D0 82 2626 pop dpl0 0AF5 D0 F0 2627 pop b 0AF7 D0 E0 2628 pop acc 0AF9 32 2629 reti 2630 0AFA 2631 usb_ep3out_isr: 0AFA C0 E0 2632 push acc 0AFC C0 F0 2633 push b 0AFE C0 82 2634 push dpl0 0B00 C0 83 2635 push dph0 0B02 C0 D0 2636 push psw 0B04 75 D0 00 2637 mov psw,#0x00 0B07 C0 86 2638 push dps 0B09 75 86 00 2639 mov dps,#0 2640 ;; clear interrupt 0B0C E5 91 2641 mov a,exif 0B0E C2 E4 2642 clr acc.4 0B10 F5 91 2643 mov exif,a 0B12 90 7F AA 2644 mov dptr,#OUT07IRQ 0B15 74 08 2645 mov a,#0x08 0B17 F0 2646 movx @dptr,a 2647 ;; handle interrupt 2648 ;; epilogue 0B18 D0 86 2649 pop dps 0B1A D0 D0 2650 pop psw 0B1C D0 83 2651 pop dph0 0B1E D0 82 2652 pop dpl0 0B20 D0 F0 2653 pop b 0B22 D0 E0 2654 pop acc 0B24 32 2655 reti 2656 0B25 2657 usb_ep4in_isr: 0B25 C0 E0 2658 push acc 0B27 C0 F0 2659 push b 0B29 C0 82 2660 push dpl0 0B2B C0 83 2661 push dph0 0B2D C0 D0 2662 push psw 0B2F 75 D0 00 2663 mov psw,#0x00 0B32 C0 86 2664 push dps 0B34 75 86 00 2665 mov dps,#0 2666 ;; clear interrupt 0B37 E5 91 2667 mov a,exif 0B39 C2 E4 2668 clr acc.4 0B3B F5 91 2669 mov exif,a 0B3D 90 7F A9 2670 mov dptr,#IN07IRQ 0B40 74 10 2671 mov a,#0x10 0B42 F0 2672 movx @dptr,a 2673 ;; handle interrupt 2674 ;; epilogue 0B43 D0 86 2675 pop dps 0B45 D0 D0 2676 pop psw 0B47 D0 83 2677 pop dph0 0B49 D0 82 2678 pop dpl0 0B4B D0 F0 2679 pop b 0B4D D0 E0 2680 pop acc 0B4F 32 2681 reti 2682 0B50 2683 usb_ep4out_isr: 0B50 C0 E0 2684 push acc 0B52 C0 F0 2685 push b 0B54 C0 82 2686 push dpl0 0B56 C0 83 2687 push dph0 0B58 C0 D0 2688 push psw 0B5A 75 D0 00 2689 mov psw,#0x00 0B5D C0 86 2690 push dps 0B5F 75 86 00 2691 mov dps,#0 2692 ;; clear interrupt 0B62 E5 91 2693 mov a,exif 0B64 C2 E4 2694 clr acc.4 0B66 F5 91 2695 mov exif,a 0B68 90 7F AA 2696 mov dptr,#OUT07IRQ 0B6B 74 10 2697 mov a,#0x10 0B6D F0 2698 movx @dptr,a 2699 ;; handle interrupt 2700 ;; epilogue 0B6E D0 86 2701 pop dps 0B70 D0 D0 2702 pop psw 0B72 D0 83 2703 pop dph0 0B74 D0 82 2704 pop dpl0 0B76 D0 F0 2705 pop b 0B78 D0 E0 2706 pop acc 0B7A 32 2707 reti 2708 0B7B 2709 usb_ep5in_isr: 0B7B C0 E0 2710 push acc 0B7D C0 F0 2711 push b 0B7F C0 82 2712 push dpl0 0B81 C0 83 2713 push dph0 0B83 C0 D0 2714 push psw 0B85 75 D0 00 2715 mov psw,#0x00 0B88 C0 86 2716 push dps 0B8A 75 86 00 2717 mov dps,#0 2718 ;; clear interrupt 0B8D E5 91 2719 mov a,exif 0B8F C2 E4 2720 clr acc.4 0B91 F5 91 2721 mov exif,a 0B93 90 7F A9 2722 mov dptr,#IN07IRQ 0B96 74 20 2723 mov a,#0x20 0B98 F0 2724 movx @dptr,a 2725 ;; handle interrupt 2726 ;; epilogue 0B99 D0 86 2727 pop dps 0B9B D0 D0 2728 pop psw 0B9D D0 83 2729 pop dph0 0B9F D0 82 2730 pop dpl0 0BA1 D0 F0 2731 pop b 0BA3 D0 E0 2732 pop acc 0BA5 32 2733 reti 2734 0BA6 2735 usb_ep5out_isr: 0BA6 C0 E0 2736 push acc 0BA8 C0 F0 2737 push b 0BAA C0 82 2738 push dpl0 0BAC C0 83 2739 push dph0 0BAE C0 D0 2740 push psw 0BB0 75 D0 00 2741 mov psw,#0x00 0BB3 C0 86 2742 push dps 0BB5 75 86 00 2743 mov dps,#0 2744 ;; clear interrupt 0BB8 E5 91 2745 mov a,exif 0BBA C2 E4 2746 clr acc.4 0BBC F5 91 2747 mov exif,a 0BBE 90 7F AA 2748 mov dptr,#OUT07IRQ 0BC1 74 20 2749 mov a,#0x20 0BC3 F0 2750 movx @dptr,a 2751 ;; handle interrupt 2752 ;; epilogue 0BC4 D0 86 2753 pop dps 0BC6 D0 D0 2754 pop psw 0BC8 D0 83 2755 pop dph0 0BCA D0 82 2756 pop dpl0 0BCC D0 F0 2757 pop b 0BCE D0 E0 2758 pop acc 0BD0 32 2759 reti 2760 0BD1 2761 usb_ep6in_isr: 0BD1 C0 E0 2762 push acc 0BD3 C0 F0 2763 push b 0BD5 C0 82 2764 push dpl0 0BD7 C0 83 2765 push dph0 0BD9 C0 D0 2766 push psw 0BDB 75 D0 00 2767 mov psw,#0x00 0BDE C0 86 2768 push dps 0BE0 75 86 00 2769 mov dps,#0 2770 ;; clear interrupt 0BE3 E5 91 2771 mov a,exif 0BE5 C2 E4 2772 clr acc.4 0BE7 F5 91 2773 mov exif,a 0BE9 90 7F A9 2774 mov dptr,#IN07IRQ 0BEC 74 40 2775 mov a,#0x40 0BEE F0 2776 movx @dptr,a 2777 ;; handle interrupt 2778 ;; epilogue 0BEF D0 86 2779 pop dps 0BF1 D0 D0 2780 pop psw 0BF3 D0 83 2781 pop dph0 0BF5 D0 82 2782 pop dpl0 0BF7 D0 F0 2783 pop b 0BF9 D0 E0 2784 pop acc 0BFB 32 2785 reti 2786 0BFC 2787 usb_ep6out_isr: 0BFC C0 E0 2788 push acc 0BFE C0 F0 2789 push b 0C00 C0 82 2790 push dpl0 0C02 C0 83 2791 push dph0 0C04 C0 D0 2792 push psw 0C06 75 D0 00 2793 mov psw,#0x00 0C09 C0 86 2794 push dps 0C0B 75 86 00 2795 mov dps,#0 2796 ;; clear interrupt 0C0E E5 91 2797 mov a,exif 0C10 C2 E4 2798 clr acc.4 0C12 F5 91 2799 mov exif,a 0C14 90 7F AA 2800 mov dptr,#OUT07IRQ 0C17 74 40 2801 mov a,#0x40 0C19 F0 2802 movx @dptr,a 2803 ;; handle interrupt 2804 ;; epilogue 0C1A D0 86 2805 pop dps 0C1C D0 D0 2806 pop psw 0C1E D0 83 2807 pop dph0 0C20 D0 82 2808 pop dpl0 0C22 D0 F0 2809 pop b 0C24 D0 E0 2810 pop acc 0C26 32 2811 reti 2812 0C27 2813 usb_ep7in_isr: 0C27 C0 E0 2814 push acc 0C29 C0 F0 2815 push b 0C2B C0 82 2816 push dpl0 0C2D C0 83 2817 push dph0 0C2F C0 D0 2818 push psw 0C31 75 D0 00 2819 mov psw,#0x00 0C34 C0 86 2820 push dps 0C36 75 86 00 2821 mov dps,#0 2822 ;; clear interrupt 0C39 E5 91 2823 mov a,exif 0C3B C2 E4 2824 clr acc.4 0C3D F5 91 2825 mov exif,a 0C3F 90 7F A9 2826 mov dptr,#IN07IRQ 0C42 74 80 2827 mov a,#0x80 0C44 F0 2828 movx @dptr,a 2829 ;; handle interrupt 2830 ;; epilogue 0C45 D0 86 2831 pop dps 0C47 D0 D0 2832 pop psw 0C49 D0 83 2833 pop dph0 0C4B D0 82 2834 pop dpl0 0C4D D0 F0 2835 pop b 0C4F D0 E0 2836 pop acc 0C51 32 2837 reti 2838 0C52 2839 usb_ep7out_isr: 0C52 C0 E0 2840 push acc 0C54 C0 F0 2841 push b 0C56 C0 82 2842 push dpl0 0C58 C0 83 2843 push dph0 0C5A C0 D0 2844 push psw 0C5C 75 D0 00 2845 mov psw,#0x00 0C5F C0 86 2846 push dps 0C61 75 86 00 2847 mov dps,#0 2848 ;; clear interrupt 0C64 E5 91 2849 mov a,exif 0C66 C2 E4 2850 clr acc.4 0C68 F5 91 2851 mov exif,a 0C6A 90 7F AA 2852 mov dptr,#OUT07IRQ 0C6D 74 80 2853 mov a,#0x80 0C6F F0 2854 movx @dptr,a 2855 ;; handle interrupt 2856 ;; epilogue 0C70 D0 86 2857 pop dps 0C72 D0 D0 2858 pop psw 0C74 D0 83 2859 pop dph0 0C76 D0 82 2860 pop dpl0 0C78 D0 F0 2861 pop b 0C7A D0 E0 2862 pop acc 0C7C 32 2863 reti 2864 2865 ;; ----------------------------------------------------- 2866 ;; USB descriptors 2867 ;; ----------------------------------------------------- 2868 2869 ;; Device and/or Interface Class codes 0000 2870 USB_CLASS_PER_INTERFACE = 0 0001 2871 USB_CLASS_AUDIO = 1 0002 2872 USB_CLASS_COMM = 2 0003 2873 USB_CLASS_HID = 3 0007 2874 USB_CLASS_PRINTER = 7 0008 2875 USB_CLASS_MASS_STORAGE = 8 0009 2876 USB_CLASS_HUB = 9 00FF 2877 USB_CLASS_VENDOR_SPEC = 0xff 2878 2879 ;; Descriptor types 0001 2880 USB_DT_DEVICE = 0x01 0002 2881 USB_DT_CONFIG = 0x02 0003 2882 USB_DT_STRING = 0x03 0004 2883 USB_DT_INTERFACE = 0x04 0005 2884 USB_DT_ENDPOINT = 0x05 2885 2886 ;; Standard requests 0000 2887 USB_REQ_GET_STATUS = 0x00 0001 2888 USB_REQ_CLEAR_FEATURE = 0x01 0003 2889 USB_REQ_SET_FEATURE = 0x03 0005 2890 USB_REQ_SET_ADDRESS = 0x05 0006 2891 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2892 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2893 USB_REQ_GET_CONFIGURATION = 0x08 0009 2894 USB_REQ_SET_CONFIGURATION = 0x09 000A 2895 USB_REQ_GET_INTERFACE = 0x0A 000B 2896 USB_REQ_SET_INTERFACE = 0x0B 000C 2897 USB_REQ_SYNCH_FRAME = 0x0C 2898 2899 ;; USB Request Type and Endpoint Directions 0000 2900 USB_DIR_OUT = 0 0080 2901 USB_DIR_IN = 0x80 2902 0000 2903 USB_TYPE_STANDARD = (0x00 << 5) 0020 2904 USB_TYPE_CLASS = (0x01 << 5) 0040 2905 USB_TYPE_VENDOR = (0x02 << 5) 0060 2906 USB_TYPE_RESERVED = (0x03 << 5) 2907 0000 2908 USB_RECIP_DEVICE = 0x00 0001 2909 USB_RECIP_INTERFACE = 0x01 0002 2910 USB_RECIP_ENDPOINT = 0x02 0003 2911 USB_RECIP_OTHER = 0x03 2912 2913 ;; Request target types. 0000 2914 USB_RT_DEVICE = 0x00 0001 2915 USB_RT_INTERFACE = 0x01 0002 2916 USB_RT_ENDPOINT = 0x02 2917 BAC0 2918 VENDID = 0xbac0 6136 2919 PRODID = 0x6136 2920 0C7D 2921 devicedescr: 0C7D 12 2922 .db 18 ; bLength 0C7E 01 2923 .db USB_DT_DEVICE ; bDescriptorType 0C7F 00 01 2924 .db 0x00, 0x01 ; bcdUSB 0C81 FF 2925 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 0C82 00 2926 .db 0 ; bDeviceSubClass 0C83 FF 2927 .db 0xff ; bDeviceProtocol 0C84 40 2928 .db 0x40 ; bMaxPacketSize0 0C85 C0 BA 2929 .db VENDID ; idVendor 0C87 36 61 2930 .db PRODID ; idProduct 0C89 02 00 2931 .db 0x02,0x00 ; bcdDevice 0C8B 01 2932 .db 1 ; iManufacturer 0C8C 02 2933 .db 2 ; iProduct 0C8D 03 2934 .db 3 ; iSerialNumber 0C8E 01 2935 .db 1 ; bNumConfigurations 2936 0C8F 2937 config0descr: 0C8F 09 2938 .db 9 ; bLength 0C90 02 2939 .db USB_DT_CONFIG ; bDescriptorType 0C91 45 00 2940 .db config0sz ; wTotalLength 0C93 01 2941 .db 1 ; bNumInterfaces 0C94 01 2942 .db 1 ; bConfigurationValue 0C95 00 2943 .db 0 ; iConfiguration 0C96 40 2944 .db 0b01000000 ; bmAttributs (self powered) 0C97 00 2945 .db 0 ; MaxPower (mA/2) (self powered so 0) 2946 ;; interface descriptor I0:A0 0C98 09 2947 .db 9 ; bLength 0C99 04 2948 .db USB_DT_INTERFACE ; bDescriptorType 0C9A 00 2949 .db 0 ; bInterfaceNumber 0C9B 00 2950 .db 0 ; bAlternateSetting 0C9C 03 2951 .db 3 ; bNumEndpoints 0C9D FF 2952 .db 0xff ; bInterfaceClass (vendor specific) 0C9E 00 2953 .db 0x00 ; bInterfaceSubClass 0C9F FF 2954 .db 0xff ; bInterfaceProtocol (vendor specific) 0CA0 00 2955 .db 0 ; iInterface 2956 ;; endpoint descriptor I0:A0:E0 0CA1 07 2957 .db 7 ; bLength 0CA2 05 2958 .db USB_DT_ENDPOINT ; bDescriptorType 0CA3 81 2959 .db (USB_DIR_IN | 1) ; bEndpointAddress 0CA4 02 2960 .db 0x02 ; bmAttributes (bulk) 0CA5 40 00 2961 .db 0x40,0x00 ; wMaxPacketSize 0CA7 00 2962 .db 0 ; bInterval 2963 ;; endpoint descriptor I0:A0:E1 0CA8 07 2964 .db 7 ; bLength 0CA9 05 2965 .db USB_DT_ENDPOINT ; bDescriptorType 0CAA 82 2966 .db (USB_DIR_IN | 2) ; bEndpointAddress 0CAB 02 2967 .db 0x02 ; bmAttributes (bulk) 0CAC 40 00 2968 .db 0x40,0x00 ; wMaxPacketSize 0CAE 00 2969 .db 0 ; bInterval 2970 ;; endpoint descriptor I0:A0:E2 0CAF 07 2971 .db 7 ; bLength 0CB0 05 2972 .db USB_DT_ENDPOINT ; bDescriptorType 0CB1 02 2973 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0CB2 02 2974 .db 0x02 ; bmAttributes (bulk) 0CB3 40 00 2975 .db 0x40,0x00 ; wMaxPacketSize 0CB5 00 2976 .db 0 ; bInterval 2977 ;; interface descriptor I0:A1 0CB6 09 2978 .db 9 ; bLength 0CB7 04 2979 .db USB_DT_INTERFACE ; bDescriptorType 0CB8 00 2980 .db 0 ; bInterfaceNumber 0CB9 01 2981 .db 1 ; bAlternateSetting 0CBA 03 2982 .db 3 ; bNumEndpoints 0CBB FF 2983 .db 0xff ; bInterfaceClass (vendor specific) 0CBC 00 2984 .db 0x00 ; bInterfaceSubClass 0CBD FF 2985 .db 0xff ; bInterfaceProtocol (vendor specific) 0CBE 00 2986 .db 0 ; iInterface 2987 ;; endpoint descriptor I0:A1:E0 0CBF 07 2988 .db 7 ; bLength 0CC0 05 2989 .db USB_DT_ENDPOINT ; bDescriptorType 0CC1 81 2990 .db (USB_DIR_IN | 1) ; bEndpointAddress 0CC2 03 2991 .db 0x03 ; bmAttributes (interrupt) 0CC3 40 00 2992 .db 0x40,0x00 ; wMaxPacketSize 0CC5 0A 2993 .db 10 ; bInterval 2994 ;; endpoint descriptor I0:A1:E1 0CC6 07 2995 .db 7 ; bLength 0CC7 05 2996 .db USB_DT_ENDPOINT ; bDescriptorType 0CC8 82 2997 .db (USB_DIR_IN | 2) ; bEndpointAddress 0CC9 02 2998 .db 0x02 ; bmAttributes (bulk) 0CCA 40 00 2999 .db 0x40,0x00 ; wMaxPacketSize 0CCC 00 3000 .db 0 ; bInterval 3001 ;; endpoint descriptor I0:A1:E2 0CCD 07 3002 .db 7 ; bLength 0CCE 05 3003 .db USB_DT_ENDPOINT ; bDescriptorType 0CCF 02 3004 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0CD0 02 3005 .db 0x02 ; bmAttributes (bulk) 0CD1 40 00 3006 .db 0x40,0x00 ; wMaxPacketSize 0CD3 00 3007 .db 0 ; bInterval 3008 0045 3009 config0sz = . - config0descr 3010 0CD4 3011 stringdescr: 0CD4rDCs0C 3012 .db string0 0CD6rE0s0C 3013 .db string1 0CD8rEEs0C 3014 .db string2 0CDAr0As0D 3015 .db stringserial 3016 0004 3017 numstrings = (. - stringdescr)/2 3018 0CDC 3019 string0: 0CDC 04 3020 .db string0sz ; bLength 0CDD 03 3021 .db USB_DT_STRING ; bDescriptorType 0CDE 00 00 3022 .db 0,0 ; LANGID[0]: Lang Neutral 0004 3023 string0sz = . - string0 3024 0CE0 3025 string1: 0CE0 0E 3026 .db string1sz ; bLength 0CE1 03 3027 .db USB_DT_STRING ; bDescriptorType 0CE2 42 00 61 00 79 00 3028 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 3029 string1sz = . - string1 3030 0CEE 3031 string2: 0CEE 1C 3032 .db string2sz ; bLength 0CEF 03 3033 .db USB_DT_STRING ; bDescriptorType 0CF0 55 00 53 00 42 00 3034 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0D00 28 00 46 00 53 00 3035 .db '(,0,'F,0,'S,0,'K,0,'),0 4B 00 29 00 001C 3036 string2sz = . - string2 3037 0D0A 3038 stringserial: 0D0A 02 3039 .db 2 ; bLength 0D0B 03 3040 .db USB_DT_STRING ; bDescriptorType 0D0C 00 00 00 00 00 00 3041 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0D1C 00 00 00 00 00 00 3042 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 3043 baycomusb-0.10.orig/firmware/fskfirmware/main.rst0100644000175100017510000043477607340435154020254 0ustar abaaba 1 .module main 2 3 ;; ENDPOINTS 4 ;; EP0 in/out Control 5 ;; EP1 in Interrupt: Status 6 ;; Byte 0: Modem Status 7 ;; Bit 0-1: Transmitter status 8 ;; 0: idle (off) 9 ;; 1: keyup 10 ;; 2: transmitting packets 11 ;; 3: tail 12 ;; Bit 2: PTT status (1=on) 13 ;; Bit 3: DCD 14 ;; Bit 4: RXB (Rx Packet Ready) 15 ;; Bit 5: UART transmitter empty 16 ;; Bit 6-7: unused 17 ;; Byte 1: Number of empty 64 byte chunks in TX fifo 18 ;; Byte 2: Number of full 64 byte chunks in RX fifo 19 ;; Byte 3: RSSI value 20 ;; Byte 4: IRQ count 21 ;; Byte 5-20: (as needed) UART receiver chars 22 ;; EP2 out Packets to be transmitted 23 ;; EP2 in Received packets; note they have the CRC appended 24 25 ;; COMMAND LIST 26 ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) 27 ;; C0 C8 read mode 28 ;; Return: 29 ;; Byte 0: 1 (MODE_FSK) or 2 (MODE_EXTERNAL) 30 ;; C0 C9 return serial number string 31 ;; C0 D0 get/set PTT/DCD/RSSI 32 ;; wIndex = 1: set forced ptt to wValue 33 ;; Return: 34 ;; Byte 0: PTT status 35 ;; Byte 1: DCD status 36 ;; Byte 2: RSSI status 37 ;; C0 D1 get Bitrate 38 ;; Return: 39 ;; Byte 0-2: TX Bitrate 40 ;; Byte 3-5: RX Bitrate 41 ;; 40 D2 set CON/STA led 42 ;; Bits 0-1 of wValue 43 ;; 40 D3 send byte to UART 44 ;; Byte in wValue 45 ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) 46 ;; wIndex = 1: write wValue to output register 47 ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) 48 ;; Return: 49 ;; Byte 0: Modem Disconnect Input 50 ;; Byte 1: Modem Disconnect Output register 51 ;; Byte 2: Modem Disconnect Tristate register 52 ;; C0 D5 get/set T7F port 53 ;; wIndex = 1: write wValue to T7F output register 54 ;; Return: 55 ;; Byte 0: T7F Input 56 ;; Byte 1: T7F Output register 57 58 ;; define code segments link order 59 .area CODE (CODE) 60 .area CSEG (CODE) 61 .area GSINIT (CODE) 62 .area GSINIT2 (CODE) 63 64 ;; ----------------------------------------------------- 65 66 ;; special function registers (which are not predefined) 0082 67 dpl0 = 0x82 0083 68 dph0 = 0x83 0084 69 dpl1 = 0x84 0085 70 dph1 = 0x85 0086 71 dps = 0x86 008E 72 ckcon = 0x8E 008F 73 spc_fnc = 0x8F 0091 74 exif = 0x91 0092 75 mpage = 0x92 0098 76 scon0 = 0x98 0099 77 sbuf0 = 0x99 00C0 78 scon1 = 0xC0 00C1 79 sbuf1 = 0xC1 00D8 80 eicon = 0xD8 00E8 81 eie = 0xE8 00F8 82 eip = 0xF8 83 84 ;; anchor xdata registers 7F00 85 IN0BUF = 0x7F00 7EC0 86 OUT0BUF = 0x7EC0 7E80 87 IN1BUF = 0x7E80 7E40 88 OUT1BUF = 0x7E40 7E00 89 IN2BUF = 0x7E00 7DC0 90 OUT2BUF = 0x7DC0 7D80 91 IN3BUF = 0x7D80 7D40 92 OUT3BUF = 0x7D40 7D00 93 IN4BUF = 0x7D00 7CC0 94 OUT4BUF = 0x7CC0 7C80 95 IN5BUF = 0x7C80 7C40 96 OUT5BUF = 0x7C40 7C00 97 IN6BUF = 0x7C00 7BC0 98 OUT6BUF = 0x7BC0 7B80 99 IN7BUF = 0x7B80 7B40 100 OUT7BUF = 0x7B40 7FE8 101 SETUPBUF = 0x7FE8 7FE8 102 SETUPDAT = 0x7FE8 103 7FB4 104 EP0CS = 0x7FB4 7FB5 105 IN0BC = 0x7FB5 7FB6 106 IN1CS = 0x7FB6 7FB7 107 IN1BC = 0x7FB7 7FB8 108 IN2CS = 0x7FB8 7FB9 109 IN2BC = 0x7FB9 7FBA 110 IN3CS = 0x7FBA 7FBB 111 IN3BC = 0x7FBB 7FBC 112 IN4CS = 0x7FBC 7FBD 113 IN4BC = 0x7FBD 7FBE 114 IN5CS = 0x7FBE 7FBF 115 IN5BC = 0x7FBF 7FC0 116 IN6CS = 0x7FC0 7FC1 117 IN6BC = 0x7FC1 7FC2 118 IN7CS = 0x7FC2 7FC3 119 IN7BC = 0x7FC3 7FC5 120 OUT0BC = 0x7FC5 7FC6 121 OUT1CS = 0x7FC6 7FC7 122 OUT1BC = 0x7FC7 7FC8 123 OUT2CS = 0x7FC8 7FC9 124 OUT2BC = 0x7FC9 7FCA 125 OUT3CS = 0x7FCA 7FCB 126 OUT3BC = 0x7FCB 7FCC 127 OUT4CS = 0x7FCC 7FCD 128 OUT4BC = 0x7FCD 7FCE 129 OUT5CS = 0x7FCE 7FCF 130 OUT5BC = 0x7FCF 7FD0 131 OUT6CS = 0x7FD0 7FD1 132 OUT6BC = 0x7FD1 7FD2 133 OUT7CS = 0x7FD2 7FD3 134 OUT7BC = 0x7FD3 135 7FA8 136 IVEC = 0x7FA8 7FA9 137 IN07IRQ = 0x7FA9 7FAA 138 OUT07IRQ = 0x7FAA 7FAB 139 USBIRQ = 0x7FAB 7FAC 140 IN07IEN = 0x7FAC 7FAD 141 OUT07IEN = 0x7FAD 7FAE 142 USBIEN = 0x7FAE 7FAF 143 USBBAV = 0x7FAF 7FB2 144 BPADDRH = 0x7FB2 7FB3 145 BPADDRL = 0x7FB3 146 7FD4 147 SUDPTRH = 0x7FD4 7FD5 148 SUDPTRL = 0x7FD5 7FD6 149 USBCS = 0x7FD6 7FD7 150 TOGCTL = 0x7FD7 7FD8 151 USBFRAMEL = 0x7FD8 7FD9 152 USBFRAMEH = 0x7FD9 7FDB 153 FNADDR = 0x7FDB 7FDD 154 USBPAIR = 0x7FDD 7FDE 155 IN07VAL = 0x7FDE 7FDF 156 OUT07VAL = 0x7FDF 7FE3 157 AUTOPTRH = 0x7FE3 7FE4 158 AUTOPTRL = 0x7FE4 7FE5 159 AUTODATA = 0x7FE5 160 161 ;; isochronous endpoints. only available if ISODISAB=0 162 7F60 163 OUT8DATA = 0x7F60 7F61 164 OUT9DATA = 0x7F61 7F62 165 OUT10DATA = 0x7F62 7F63 166 OUT11DATA = 0x7F63 7F64 167 OUT12DATA = 0x7F64 7F65 168 OUT13DATA = 0x7F65 7F66 169 OUT14DATA = 0x7F66 7F67 170 OUT15DATA = 0x7F67 171 7F68 172 IN8DATA = 0x7F68 7F69 173 IN9DATA = 0x7F69 7F6A 174 IN10DATA = 0x7F6A 7F6B 175 IN11DATA = 0x7F6B 7F6C 176 IN12DATA = 0x7F6C 7F6D 177 IN13DATA = 0x7F6D 7F6E 178 IN14DATA = 0x7F6E 7F6F 179 IN15DATA = 0x7F6F 180 7F70 181 OUT8BCH = 0x7F70 7F71 182 OUT8BCL = 0x7F71 7F72 183 OUT9BCH = 0x7F72 7F73 184 OUT9BCL = 0x7F73 7F74 185 OUT10BCH = 0x7F74 7F75 186 OUT10BCL = 0x7F75 7F76 187 OUT11BCH = 0x7F76 7F77 188 OUT11BCL = 0x7F77 7F78 189 OUT12BCH = 0x7F78 7F79 190 OUT12BCL = 0x7F79 7F7A 191 OUT13BCH = 0x7F7A 7F7B 192 OUT13BCL = 0x7F7B 7F7C 193 OUT14BCH = 0x7F7C 7F7D 194 OUT14BCL = 0x7F7D 7F7E 195 OUT15BCH = 0x7F7E 7F7F 196 OUT15BCL = 0x7F7F 197 7FF0 198 OUT8ADDR = 0x7FF0 7FF1 199 OUT9ADDR = 0x7FF1 7FF2 200 OUT10ADDR = 0x7FF2 7FF3 201 OUT11ADDR = 0x7FF3 7FF4 202 OUT12ADDR = 0x7FF4 7FF5 203 OUT13ADDR = 0x7FF5 7FF6 204 OUT14ADDR = 0x7FF6 7FF7 205 OUT15ADDR = 0x7FF7 7FF8 206 IN8ADDR = 0x7FF8 7FF9 207 IN9ADDR = 0x7FF9 7FFA 208 IN10ADDR = 0x7FFA 7FFB 209 IN11ADDR = 0x7FFB 7FFC 210 IN12ADDR = 0x7FFC 7FFD 211 IN13ADDR = 0x7FFD 7FFE 212 IN14ADDR = 0x7FFE 7FFF 213 IN15ADDR = 0x7FFF 214 7FA0 215 ISOERR = 0x7FA0 7FA1 216 ISOCTL = 0x7FA1 7FA2 217 ZBCOUNT = 0x7FA2 7FE0 218 INISOVAL = 0x7FE0 7FE1 219 OUTISOVAL = 0x7FE1 7FE2 220 FASTXFR = 0x7FE2 221 222 ;; CPU control registers 223 7F92 224 CPUCS = 0x7F92 225 226 ;; IO port control registers 227 7F93 228 PORTACFG = 0x7F93 7F94 229 PORTBCFG = 0x7F94 7F95 230 PORTCCFG = 0x7F95 7F96 231 OUTA = 0x7F96 7F97 232 OUTB = 0x7F97 7F98 233 OUTC = 0x7F98 7F99 234 PINSA = 0x7F99 7F9A 235 PINSB = 0x7F9A 7F9B 236 PINSC = 0x7F9B 7F9C 237 OEA = 0x7F9C 7F9D 238 OEB = 0x7F9D 7F9E 239 OEC = 0x7F9E 240 241 ;; I2C controller registers 242 7FA5 243 I2CS = 0x7FA5 7FA6 244 I2DAT = 0x7FA6 245 246 ;; Xilinx FPGA registers C001 247 FSKRXCNT = 0xc001 C002 248 FSKRXDATA = 0xc002 C003 249 FSKRXFLAG = 0xc003 C000 250 FSKTXCNT = 0xc000 C000 251 FSKTXDATA = 0xc000 C001 252 FSKTXCRC = 0xc001 C002 253 FSKTXRAW = 0xc002 C003 254 FSKTXRAWCLR = 0xc003 C004 255 FSKRSSI = 0xc004 C008 256 FSKCTRL = 0xc008 C009 257 FSKSTAT = 0xc009 C00A 258 FSKT7FOUT = 0xc00a C00B 259 FSKT7FIN = 0xc00b C00C 260 FSKMDISCTRIS = 0xc00c C00D 261 FSKMDISCOUT = 0xc00d C00E 262 FSKMDISCIN = 0xc00e 263 264 ;; ----------------------------------------------------- 265 266 .area CODE (CODE) 0000 02 0E 83 267 ljmp startup 0003 02 03 EA 268 ljmp int0_isr 0006 269 .ds 5 000B 02 04 0B 270 ljmp timer0_isr 000E 271 .ds 5 0013 02 04 2C 272 ljmp int1_isr 0016 273 .ds 5 001B 02 04 4D 274 ljmp timer1_isr 001E 275 .ds 5 0023 02 04 6E 276 ljmp ser0_isr 0026 277 .ds 5 002B 02 04 AC 278 ljmp timer2_isr 002E 279 .ds 5 0033 02 04 CD 280 ljmp resume_isr 0036 281 .ds 5 003B 02 04 EE 282 ljmp ser1_isr 003E 283 .ds 5 0043 02 01 00 284 ljmp usb_isr 0046 285 .ds 5 004B 02 05 11 286 ljmp i2c_isr 004E 287 .ds 5 0053 02 05 36 288 ljmp int4_isr 0056 289 .ds 5 005B 02 05 5B 290 ljmp int5_isr 005E 291 .ds 5 0063 02 05 80 292 ljmp int6_isr 293 294 ;; Parameter block at 0xe0 0066 295 .ds 0x7a 00E0 00 00 00 296 parbitratetx: .db 0,0,0 00E3 00 00 00 297 parbitraterx: .db 0,0,0 00E6 00 298 parextmodem: .db 0 00E7 01 299 parpttmute: .db 1 300 301 ;; Serial# string at 0xf0 00E8 302 .ds 8 00F0 303 parserial: 00F0 30 30 30 30 30 30 304 .db '0,'0,'0,'0,'0,'0,'0,'0,0 30 30 00 00F9 305 .ds 7 306 307 ;; USB interrupt dispatch table 0100 308 usb_isr: 0100 02 05 A1 309 ljmp usb_sudav_isr 0103 310 .ds 1 0104 02 09 CF 311 ljmp usb_sof_isr 0107 312 .ds 1 0108 02 09 FA 313 ljmp usb_sutok_isr 010B 314 .ds 1 010C 02 0A 25 315 ljmp usb_suspend_isr 010F 316 .ds 1 0110 02 0A 50 317 ljmp usb_usbreset_isr 0113 318 .ds 1 0114 32 319 reti 0115 320 .ds 3 0118 02 0A 7B 321 ljmp usb_ep0in_isr 011B 322 .ds 1 011C 02 0A B6 323 ljmp usb_ep0out_isr 011F 324 .ds 1 0120 02 0B 77 325 ljmp usb_ep1in_isr 0123 326 .ds 1 0124 02 0B A5 327 ljmp usb_ep1out_isr 0127 328 .ds 1 0128 02 0B D0 329 ljmp usb_ep2in_isr 012B 330 .ds 1 012C 02 0B FB 331 ljmp usb_ep2out_isr 012F 332 .ds 1 0130 02 0C 26 333 ljmp usb_ep3in_isr 0133 334 .ds 1 0134 02 0C 51 335 ljmp usb_ep3out_isr 0137 336 .ds 1 0138 02 0C 7C 337 ljmp usb_ep4in_isr 013B 338 .ds 1 013C 02 0C A7 339 ljmp usb_ep4out_isr 013F 340 .ds 1 0140 02 0C D2 341 ljmp usb_ep5in_isr 0143 342 .ds 1 0144 02 0C FD 343 ljmp usb_ep5out_isr 0147 344 .ds 1 0148 02 0D 28 345 ljmp usb_ep6in_isr 014B 346 .ds 1 014C 02 0D 53 347 ljmp usb_ep6out_isr 014F 348 .ds 1 0150 02 0D 7E 349 ljmp usb_ep7in_isr 0153 350 .ds 1 0154 02 0D A9 351 ljmp usb_ep7out_isr 352 353 ;; ----------------------------------------------------- 354 0020 355 RXCHUNKS = 32 0010 356 TXCHUNKS = 16 357 0000 358 DEBUGIOCOPY = 0 0000 359 DEBUGRECEIVER = 0 360 361 .area OSEG (OVR,DATA) 362 .area BSEG (BIT) 0000 363 ctrl_ptt: .ds 1 0001 364 ctrl_pttmute: .ds 1 0002 365 ctrl_ledptt: .ds 1 0003 366 ctrl_leddcdsrc: .ds 1 0004 367 ctrl_clksel: .ds 1 ; not implemented 0005 368 ctrl_indacd: .ds 1 0006 369 ctrl_indacz: .ds 1 0007 370 ctrl_txdsrc: .ds 1 0020 371 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) 372 0008 373 extmodem: .ds 1 0009 374 pttmute: .ds 1 000A 375 pttforcechg: .ds 1 000B 376 uartempty: .ds 1 377 378 .area ISEG (DATA) 0080 379 txbcnt: .ds TXCHUNKS 0090 380 rxbcnt: .ds RXCHUNKS 00B0 381 stack: .ds 0x80-RXCHUNKS-TXCHUNKS 382 383 .area DSEG (DATA) 0040 384 ctrlcode: .ds 1 0041 385 ctrlcount: .ds 2 0043 386 leddiv: .ds 1 0044 387 irqcount: .ds 1 388 ;; transmitter variables 0045 389 txstate: .ds 1 0046 390 flagcnt: .ds 2 0048 391 txwr: .ds 1 0049 392 txrd: .ds 1 004A 393 txtwr: .ds 1 004B 394 txcnt: .ds 1 004C 395 txaddr: .ds 2 004E 396 txbptr: .ds 1 004F 397 txskip: .ds 1 0050 398 pttforce: .ds 1 399 ;; receiver variables 0051 400 rxstate: .ds 1 0052 401 rxwr: .ds 1 0053 402 rxrd: .ds 1 0054 403 rxtwr: .ds 1 0055 404 rxcnt: .ds 1 0056 405 rxcntc: .ds 1 0057 406 rxaddr: .ds 2 407 0059 408 tmprxcnt: .ds 1 409 410 ;; UART receiver 005A 411 uartbuf: .ds 16 006A 412 uartwr: .ds 1 006B 413 uartrd: .ds 1 414 415 ;; Port state 006C 416 t7fout: .ds 1 006D 417 mdisctris: .ds 1 006E 418 mdiscout: .ds 1 419 420 ;; USB state 006F 421 numconfig: .ds 1 0070 422 altsetting: .ds 1 423 424 .area XSEG (DATA) 1000 425 txbuf: .ds TXCHUNKS*64 1400 426 rxbuf: .ds RXCHUNKS*64 427 428 429 .area GSINIT (CODE) 0E83 430 startup: 0E83 75 81 B0 431 mov sp,#stack ; -1 0E86 E4 432 clr a 0E87 F5 D0 433 mov psw,a 0E89 F5 86 434 mov dps,a 435 ;lcall __sdcc_external_startup 436 ;mov a,dpl0 437 ;jz __sdcc_init_data 438 ;ljmp __sdcc_program_startup 0E8B 439 __sdcc_init_data: 440 441 .area GSINIT2 (CODE) 0E8B 442 __sdcc_program_startup: 443 ;; assembler code startup 0E8B E4 444 clr a 0E8C F5 45 445 mov txstate,a 0E8E F5 48 446 mov txwr,a 0E90 F5 49 447 mov txrd,a 0E92 F5 4A 448 mov txtwr,a 0E94 F5 50 449 mov pttforce,a 0E96 F5 51 450 mov rxstate,a 0E98 F5 52 451 mov rxwr,a 0E9A F5 53 452 mov rxrd,a 0E9C F5 54 453 mov rxtwr,a 0E9E F5 44 454 mov irqcount,a 0EA0 F5 6B 455 mov uartrd,a 0EA2 F5 6A 456 mov uartwr,a 0EA4 F5 86 457 mov dps,a 0EA6 D2 0B 458 setb uartempty 459 ;; some indirect register setup 0EA8 75 8E 30 460 mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs 461 ;; Timer setup: 462 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 463 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0EAB 75 89 21 464 mov tmod,#0x21 0EAE 75 88 55 465 mov tcon,#0x55 ; INT0/INT1 edge 0EB1 75 8D 64 466 mov th1,#256-156 ; 1200 bauds 0EB4 75 87 00 467 mov pcon,#0 ; SMOD0=0 468 ;; init USB subsystem 0EB7 90 7F A1 469 mov dptr,#ISOCTL 0EBA 74 01 470 mov a,#1 ; disable ISO endpoints 0EBC F0 471 movx @dptr,a 0EBD 90 7F AF 472 mov dptr,#USBBAV 0EC0 74 01 473 mov a,#1 ; enable autovector, disable breakpoint logic 0EC2 F0 474 movx @dptr,a 0EC3 E4 475 clr a 0EC4 90 7F E0 476 mov dptr,#INISOVAL 0EC7 F0 477 movx @dptr,a 0EC8 90 7F E1 478 mov dptr,#OUTISOVAL 0ECB F0 479 movx @dptr,a 0ECC 90 7F DD 480 mov dptr,#USBPAIR 0ECF 74 09 481 mov a,#0x9 ; pair EP 2&3 for input & output 0ED1 F0 482 movx @dptr,a 0ED2 90 7F DE 483 mov dptr,#IN07VAL 0ED5 74 07 484 mov a,#0x7 ; enable EP0+EP1+EP2 0ED7 F0 485 movx @dptr,a 0ED8 90 7F DF 486 mov dptr,#OUT07VAL 0EDB 74 05 487 mov a,#0x5 ; enable EP0+EP2 0EDD F0 488 movx @dptr,a 489 ;; USB: init endpoint toggles 0EDE 90 7F D7 490 mov dptr,#TOGCTL 0EE1 74 12 491 mov a,#0x12 0EE3 F0 492 movx @dptr,a 0EE4 74 32 493 mov a,#0x32 ; clear EP 2 in toggle 0EE6 F0 494 movx @dptr,a 0EE7 74 02 495 mov a,#0x02 0EE9 F0 496 movx @dptr,a 0EEA 74 22 497 mov a,#0x22 ; clear EP 2 out toggle 0EEC F0 498 movx @dptr,a 499 ;; configure IO ports 0EED 90 7F 93 500 mov dptr,#PORTACFG 0EF0 74 00 501 mov a,#0 0EF2 F0 502 movx @dptr,a 0EF3 90 7F 96 503 mov dptr,#OUTA 0EF6 74 82 504 mov a,#0x82 ; set PROG hi 0EF8 F0 505 movx @dptr,a 0EF9 90 7F 9C 506 mov dptr,#OEA 0EFC 74 C2 507 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0EFE F0 508 movx @dptr,a 0EFF 90 7F 94 509 mov dptr,#PORTBCFG 0F02 74 00 510 mov a,#0 0F04 F0 511 movx @dptr,a 0F05 90 7F 9D 512 mov dptr,#OEB 0F08 74 00 513 mov a,#0 0F0A F0 514 movx @dptr,a 0F0B 90 7F 95 515 mov dptr,#PORTCCFG 0F0E 74 C3 516 mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins 0F10 F0 517 movx @dptr,a 0F11 90 7F 98 518 mov dptr,#OUTC 0F14 74 28 519 mov a,#0x28 0F16 F0 520 movx @dptr,a 0F17 90 7F 9E 521 mov dptr,#OEC 0F1A 74 2A 522 mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT 0F1C F0 523 movx @dptr,a 524 ;; enable interrupts 0F1D 75 A8 92 525 mov ie,#0x92 ; enable timer 0 and ser 0 int 0F20 75 E8 01 526 mov eie,#0x01 ; enable USB interrupts 0F23 90 7F AE 527 mov dptr,#USBIEN 0F26 74 01 528 mov a,#1 ; enable SUDAV interrupt 0F28 F0 529 movx @dptr,a 0F29 90 7F AC 530 mov dptr,#IN07IEN 0F2C 74 03 531 mov a,#3 ; enable EP0+EP1 interrupt 0F2E F0 532 movx @dptr,a 0F2F 90 7F AD 533 mov dptr,#OUT07IEN 0F32 74 01 534 mov a,#1 ; enable EP0 interrupt 0F34 F0 535 movx @dptr,a 536 ;; initialize UART 0 for T7F communication 0F35 75 98 52 537 mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable 538 ;; Copy serial number 0F38 78 F0 539 mov r0,#parserial 0F3A 90 0E 63 540 mov dptr,#stringserial+2 0F3D E2 541 1$: movx a,@r0 0F3E 60 06 542 jz 2$ 0F40 F0 543 movx @dptr,a 0F41 A3 544 inc dptr 0F42 A3 545 inc dptr 0F43 08 546 inc r0 0F44 80 F7 547 sjmp 1$ 0F46 E8 548 2$: mov a,r0 0F47 24 11 549 add a,#1-0xf0 ; 1-parserial 0F49 25 E0 550 add a,acc 0F4B 90 0E 61 551 mov dptr,#stringserial 0F4E F0 552 movx @dptr,a 553 ;; copy configuration to bit addressable variables 0F4F 554 cpyconfig: 0F4F 75 20 42 555 mov ctrlreg,#0x42 0F52 78 E6 556 mov r0,#parextmodem 0F54 E2 557 movx a,@r0 0F55 A2 E0 558 mov c,acc.0 0F57 92 08 559 mov extmodem,c 0F59 92 07 560 mov ctrl_txdsrc,c 0F5B 92 03 561 mov ctrl_leddcdsrc,c 0F5D 78 E7 562 mov r0,#parpttmute 0F5F E2 563 movx a,@r0 0F60 A2 E0 564 mov c,acc.0 0F62 92 09 565 mov pttmute,c 0F64 92 01 566 mov ctrl_pttmute,c 567 ;; turn off transmitter 0F66 E5 20 568 mov a,ctrlreg 0F68 90 C0 08 569 mov dptr,#FSKCTRL 0F6B F0 570 movx @dptr,a 571 ;; send reset pulse to external modem if selected 0F6C 90 C0 0C 572 mov dptr,#FSKMDISCTRIS 0F6F 74 FF 573 mov a,#0xff 0F71 F0 574 movx @dptr,a 0F72 F5 6D 575 mov mdisctris,a 0F74 30 08 09 576 jnb extmodem,3$ 0F77 74 67 577 mov a,#0x67 ; RESET, RTS and TxD are outputs 0F79 F0 578 movx @dptr,a 0F7A 90 C0 0D 579 mov dptr,#FSKMDISCOUT 0F7D 74 7F 580 mov a,#0x7f ; activate RESET 0F7F F0 581 movx @dptr,a 0F80 582 3$: 0F80 90 C0 0A 583 mov dptr,#FSKT7FOUT 0F83 74 1F 584 mov a,#0x1f 0F85 F0 585 movx @dptr,a 0F86 F5 6C 586 mov t7fout,a 587 ;; initialize USB state 0F88 E4 588 clr a 0F89 F5 6F 589 mov numconfig,a 0F8B F5 70 590 mov altsetting,a 591 ;; give Windows a chance to finish the writecpucs control transfer 592 ;; 20ms delay loop 0F8D 90 D1 20 593 mov dptr,#(-12000)&0xffff 0F90 A3 594 2$: inc dptr ; 3 cycles 0F91 E5 82 595 mov a,dpl0 ; 2 cycles 0F93 45 83 596 orl a,dph0 ; 2 cycles 0F95 70 F9 597 jnz 2$ ; 3 cycles 0001 598 .if 1 599 ;; disconnect from USB bus 0F97 90 7F D6 600 mov dptr,#USBCS 0F9A 74 0A 601 mov a,#10 0F9C F0 602 movx @dptr,a 603 ;; wait 0.3 sec 0F9D 7A 1E 604 mov r2,#30 605 ;; 10ms delay loop 0F9F 90 E8 90 606 0$: mov dptr,#(-6000)&0xffff 0FA2 A3 607 1$: inc dptr ; 3 cycles 0FA3 E5 82 608 mov a,dpl0 ; 2 cycles 0FA5 45 83 609 orl a,dph0 ; 2 cycles 0FA7 70 F9 610 jnz 1$ ; 3 cycles 0FA9 DA F4 611 djnz r2,0$ 612 ;; reconnect to USB bus 0FAB 90 7F D6 613 mov dptr,#USBCS 614 ;mov a,#2 ; 8051 handles control 615 ;movx @dptr,a 0FAE 74 06 616 mov a,#6 ; reconnect, 8051 handles control 0FB0 F0 617 movx @dptr,a 618 .endif 619 ;; terminate reset pulse to external modem if selected 0FB1 30 08 08 620 jnb extmodem,4$ 0FB4 90 C0 0D 621 mov dptr,#FSKMDISCOUT 0FB7 74 FF 622 mov a,#0xff ; deactivate RESET 0FB9 F0 623 movx @dptr,a 0FBA F5 6E 624 mov mdiscout,a 0FBC 625 4$: 626 ;; preinit RAM for debugging purposes (optional) 0000 627 .if 0 628 inittxbuf: 629 mov r7,#TXCHUNKS 630 mov dptr,#txbuf 631 mov a,#0x55+1 632 0$: mov r6,#64 633 1$: movx @dptr,a 634 inc dptr 635 djnz r6,1$ 636 djnz r7,0$ 637 .endif 0000 638 .if 0 639 initrxbuf: 640 mov r7,#RXCHUNKS 641 mov dptr,#rxbuf 642 mov a,#0xaa 643 0$: mov r6,#64 644 1$: movx @dptr,a 645 inc dptr 646 djnz r6,1$ 647 djnz r7,0$ 648 .endif 649 650 ;; final 0FBC 12 0A F1 651 lcall fillusbintr 652 ;; kludge; first OUT2 packet seems to be bogus 653 ;; wait for packet with length 1 and contents 0x55 0FBF 654 waitpkt1: 0FBF 90 7F C8 655 mov dptr,#OUT2CS 0FC2 E0 656 movx a,@dptr 0FC3 20 E1 F9 657 jb acc.1,waitpkt1 0FC6 90 7F C9 658 mov dptr,#OUT2BC 0FC9 E0 659 movx a,@dptr 0FCA B4 01 0D 660 cjne a,#1,0$ 0FCD 90 7D C0 661 mov dptr,#OUT2BUF 0FD0 E0 662 movx a,@dptr 0FD1 B4 55 06 663 cjne a,#0x55,0$ 0FD4 90 7F C9 664 mov dptr,#OUT2BC 0FD7 F0 665 movx @dptr,a 0FD8 80 06 666 sjmp pkt1received 0FDA 90 7F C9 667 0$: mov dptr,#OUT2BC 0FDD F0 668 movx @dptr,a 0FDE 80 DF 669 sjmp waitpkt1 670 ;; clear RX FIFO 0FE0 671 pkt1received: 0FE0 90 C0 03 672 mov dptr,#FSKRXFLAG 0FE3 7F 40 673 mov r7,#64 0FE5 E0 674 1$: movx a,@dptr 0FE6 DF FD 675 djnz r7,1$ 676 ;; start normal operation 0FE8 02 01 8E 677 ljmp mainloop 678 679 .area CSEG (CODE) 0002 680 ar2 = 0x02 0003 681 ar3 = 0x03 0004 682 ar4 = 0x04 0005 683 ar5 = 0x05 0006 684 ar6 = 0x06 0007 685 ar7 = 0x07 0000 686 ar0 = 0x00 0001 687 ar1 = 0x01 688 689 ;; WARNING! The assembler doesn't check for 690 ;; out of range short jump labels!! Double check 691 ;; that the jump labels are within the range! 692 0157 693 setptt: 0157 E5 45 694 mov a,txstate 0159 45 50 695 orl a,pttforce 015B 60 18 696 jz pttoff 697 015D 698 ptton: 015D A2 08 699 mov c,extmodem 015F 50 06 700 jnc 0$ 0161 90 C0 0D 701 mov dptr,#FSKMDISCOUT 0164 74 EF 702 mov a,#0xef 0166 F0 703 movx @dptr,a 0167 92 01 704 0$: mov ctrl_pttmute,c 0169 B3 705 cpl c 016A 92 00 706 mov ctrl_ptt,c 016C D2 02 707 setb ctrl_ledptt 016E E5 20 708 mov a,ctrlreg 0170 90 C0 08 709 mov dptr,#FSKCTRL 0173 F0 710 movx @dptr,a 0174 22 711 ret 712 0175 713 pttoff: 0175 C2 00 714 clr ctrl_ptt 0177 A2 08 715 mov c,extmodem 0179 50 06 716 jnc 3$ 017B 90 C0 0D 717 mov dptr,#FSKMDISCOUT 017E 74 FF 718 mov a,#0xff 0180 F0 719 movx @dptr,a 0181 72 09 720 3$: orl c,pttmute 0183 92 01 721 mov ctrl_pttmute,c 0185 C2 02 722 clr ctrl_ledptt 0187 E5 20 723 mov a,ctrlreg 0189 90 C0 08 724 mov dptr,#FSKCTRL 018C F0 725 movx @dptr,a 018D 22 726 ret 727 018E 728 mainloop: 729 ;; debug: copyloop 0000 730 .if DEBUGIOCOPY 731 iocopyloop: 732 mov a,txrd 733 cjne a,txwr,0$ 734 ljmp iocopyloop 735 1$: mov a,@r0 736 mov @r1,a 737 jz 3$ 738 mov r7,a 739 4$: inc dps 740 movx a,@dptr 741 inc dptr 742 dec dps 743 movx @dptr,a 744 inc dptr 745 djnz r7,4$ 746 3$: mov a,txrd 747 inc a 748 anl a,#(TXCHUNKS-1) 749 mov txrd,a 750 mov a,@r0 751 add a,#-0x40 752 jc 5$ 753 mov rxwr,rxtwr 754 5$: ljmp iocopyloop 755 0$: ;; txpointers 756 add a,#txbcnt 757 mov r0,a 0001 758 .if 1 759 mov a,txrd 760 rr a 761 rr a 762 mov dpl1,a 763 anl a,#0xc0 764 add a,#txbuf 768 mov dph1,a 769 .else 770 mov a,txrd 771 rr a 772 rr a 773 mov dpl1,a 774 anl a,#0xc0 775 xch a,dpl1 776 anl a,#0x3f 777 add a,#>txbuf 778 mov dph1,a 779 .endif 780 ;; rxpointers 781 mov a,rxtwr 782 add a,#rxbcnt 783 mov r1,a 0001 784 .if 1 785 mov a,rxtwr 786 rr a 787 rr a 788 mov dpl0,a 789 anl a,#0xc0 790 add a,#rxbuf 794 mov dph0,a 795 .else 796 mov a,rxtwr 797 rr a 798 rr a 799 mov dpl0,a 800 anl a,#0xc0 801 xch a,dpl0 802 anl a,#0x3f 803 add a,#>rxbuf 804 mov dph0,a 805 .endif 806 ;; update rxpointer 807 mov a,rxtwr 808 inc a 809 anl a,#(RXCHUNKS-1) 810 mov rxtwr,a 811 cjne a,rxrd,1$ 812 ljmp iocopyloop 813 .endif 814 ;; first do TX 018E 815 txstartloop: 816 ;; check if idle or new packet 018E E5 45 817 mov a,txstate 0190 60 06 818 jz txchknewpkt 0192 B4 02 52 819 cjne a,#2,txflagprepare 0195 02 02 4F 820 ljmp txchunkstart 0198 821 txchknewpkt: 0198 E5 48 822 mov a,txwr 019A B5 49 0C 823 cjne a,txrd,txbufnempty 019D 10 0A 03 824 jbc pttforcechg,txidlepttforce 01A0 825 rxstartloop1: 01A0 02 02 B3 826 ljmp rxstartloop 01A3 827 txidlepttforce: 01A3 12 01 57 828 lcall setptt 01A6 02 02 B3 829 ljmp rxstartloop 01A9 830 txbufnempty: 831 ;; start txdelay 832 ;; check length of first packet 01A9 E5 49 833 mov a,txrd 01AB 24 80 834 add a,#txbcnt 01AD F8 835 mov r0,a 01AE E6 836 mov a,@r0 01AF 24 FC 837 add a,#-4 01B1 40 03 838 jc 1$ 01B3 02 02 98 839 ljmp txnextpacket 01B6 840 1$: 841 ;; read the number of flags to send from the first two bytes of the first packet 0001 842 .if 1 01B6 E5 49 843 mov a,txrd 01B8 03 844 rr a 01B9 03 845 rr a 01BA F5 82 846 mov dpl0,a 01BC 54 C0 847 anl a,#0xc0 01BE 24 00 848 add a,#txbuf 01C6 F5 83 852 mov dph0,a 853 .else 854 mov a,txrd 855 rr a 856 rr a 857 mov dpl0,a 858 anl a,#0xc0 859 xch a,dpl0 860 anl a,#0x3f 861 add a,#>txbuf 862 mov dph0,a 863 .endif 01C8 E0 864 movx a,@dptr 01C9 F5 46 865 mov flagcnt,a 01CB A3 866 inc dptr 01CC E0 867 movx a,@dptr 01CD F5 47 868 mov flagcnt+1,a 01CF 05 45 869 inc txstate 01D1 75 4F 02 870 mov txskip,#2 871 ;; sanity check (limit txdelay to about 8s) 01D4 78 E2 872 mov r0,#parbitratetx+2 01D6 E2 873 movx a,@r0 01D7 70 0B 874 jnz 2$ 01D9 78 E1 875 mov r0,#parbitratetx+1 01DB E2 876 movx a,@r0 01DC C3 877 clr c 01DD 95 47 878 subb a,flagcnt+1 01DF 50 03 879 jnc 2$ 01E1 E2 880 movx a,@r0 01E2 F5 47 881 mov flagcnt+1,a 01E4 882 2$: 883 ;; turn on PTT 01E4 12 01 5D 884 lcall ptton 885 ;; flag send routine 01E7 886 txflagprepare: 01E7 90 C0 00 887 mov dptr,#FSKTXCNT 01EA E0 888 movx a,@dptr 01EB 60 B3 889 jz rxstartloop1 01ED FF 890 mov r7,a 891 ;; check if tx ready if external modem 01EE 90 C0 0E 892 mov dptr,#FSKMDISCIN 01F1 E0 893 movx a,@dptr 01F2 90 C0 03 894 mov dptr,#FSKTXRAWCLR 01F5 A2 E5 895 mov c,acc.5 01F7 82 08 896 anl c,extmodem 01F9 40 28 897 jc txflgcntbig 898 ;clr c 01FB E5 46 899 mov a,flagcnt 01FD FE 900 mov r6,a 01FE 9F 901 subb a,r7 01FF F5 46 902 mov flagcnt,a 0201 E5 47 903 mov a,flagcnt+1 0203 94 00 904 subb a,#0 0205 F5 47 905 mov flagcnt+1,a 0207 50 1A 906 jnc txflgcntbig 907 ;; send final flags, update state 0209 EE 908 mov a,r6 020A 60 05 909 jz 1$ 020C 74 7E 910 mov a,#0x7e 020E F0 911 0$: movx @dptr,a 020F DE FD 912 djnz r6,0$ 0211 E5 45 913 1$: mov a,txstate 0213 04 914 inc a 0214 54 03 915 anl a,#3 0216 F5 45 916 mov txstate,a 0218 70 06 917 jnz 2$ 918 ;; turn off PTT 021A 12 01 57 919 lcall setptt 021D 02 02 B3 920 ljmp rxstartloop 0220 02 02 2B 921 2$: ljmp txnewchunk 922 ;; send txdelay flags 0223 923 txflgcntbig: 0223 74 7E 924 mov a,#0x7e 0225 F0 925 0$: movx @dptr,a 0226 DF FD 926 djnz r7,0$ 0228 927 rxstartloop2: 0228 02 02 B3 928 ljmp rxstartloop 929 022B 930 txnewchunk: 022B E5 49 931 mov a,txrd 022D 24 80 932 add a,#txbcnt 022F F5 4E 933 mov txbptr,a 0231 F8 934 mov r0,a 0232 E6 935 mov a,@r0 0233 F4 936 cpl a 0234 04 937 inc a 0235 25 4F 938 add a,txskip 0237 40 5F 939 jc txnextpacket 0239 F5 4B 940 mov txcnt,a 0001 941 .if 1 023B E5 49 942 mov a,txrd 023D 03 943 rr a 023E 03 944 rr a 023F F5 4C 945 mov txaddr,a 0241 54 C0 946 anl a,#0xc0 0243 25 4F 947 add a,txskip 0245 24 00 948 add a,#txbuf 024D F5 4D 952 mov txaddr+1,a 953 .else 954 mov a,txrd 955 rr a 956 rr a 957 mov txaddr,a 958 anl a,#0xc0 959 add a,txskip 960 xch a,txaddr 961 anl a,#0x3f 962 add a,#>txbuf 963 mov txaddr+1,a 964 .endif 024F 965 txchunkstart: 024F 90 C0 00 966 mov dptr,#FSKTXCNT 0252 E0 967 movx a,@dptr 0253 60 D3 968 jz rxstartloop2 0255 FF 969 mov r7,a 0256 E5 4B 970 mov a,txcnt 0258 60 25 971 jz txchunkend 025A 2F 972 add a,r7 025B C5 4B 973 xch a,txcnt 025D 50 06 974 jnc 0$ 025F F4 975 cpl a 0260 04 976 inc a 0261 FF 977 mov r7,a 0262 75 4B 00 978 mov txcnt,#0 0265 90 C0 00 979 0$: mov dptr,#FSKTXDATA 0268 85 4C 84 980 mov dpl1,txaddr 026B 85 4D 85 981 mov dph1,txaddr+1 026E 05 86 982 1$: inc dps 0270 E0 983 movx a,@dptr 0271 A3 984 inc dptr 0272 15 86 985 dec dps 0274 F0 986 movx @dptr,a 0275 DF F7 987 djnz r7,1$ 0277 85 84 4C 988 mov txaddr,dpl1 027A 85 85 4D 989 mov txaddr+1,dph1 027D 80 D0 990 sjmp txchunkstart 027F 991 txchunkend: 027F 75 4F 00 992 mov txskip,#0 0282 A8 4E 993 mov r0,txbptr 0284 E6 994 mov a,@r0 0285 20 E6 13 995 jb acc.6,txnonewframe 0288 EF 996 mov a,r7 0289 24 FD 997 add a,#-3 028B 50 9B 998 jnc rxstartloop2 028D 90 C0 01 999 mov dptr,#FSKTXCRC 0290 F0 1000 movx @dptr,a 0291 F0 1001 movx @dptr,a 0292 90 C0 03 1002 mov dptr,#FSKTXRAWCLR 0295 74 7E 1003 mov a,#0x7e 0297 F0 1004 movx @dptr,a 0298 1005 txnextpacket: 0298 75 4F 02 1006 mov txskip,#2 029B 1007 txnonewframe: 029B E5 49 1008 mov a,txrd 029D 04 1009 inc a 029E 54 0F 1010 anl a,#TXCHUNKS-1 02A0 F5 49 1011 mov txrd,a 02A2 B5 48 86 1012 cjne a,txwr,txnewchunk 02A5 05 45 1013 inc txstate 1014 ;; note: we need to stuff in more than 32 flags, to fill the buffer 1015 ;; (so we don't turn off PTT too early) 02A7 75 46 28 1016 mov flagcnt,#40 02AA 75 47 00 1017 mov flagcnt+1,#0 02AD 02 01 E7 1018 ljmp txflagprepare 1019 0000 1020 .if DEBUGRECEIVER 1021 rxstartloop: 1022 mov dptr,#FSKRXCNT 1023 movx a,@dptr 1024 mov tmprxcnt,a 1025 inc dpl0 1026 add a,#-16 1027 jnc 2$ 0001 1028 .if 1 1029 mov a,rxwr 1030 rr a 1031 rr a 1032 mov dpl1,a 1033 anl a,#0xc0 1034 add a,#rxbuf 1038 mov dph1,a 1039 .else 1040 mov a,rxwr 1041 rr a 1042 rr a 1043 mov dpl1,a 1044 anl a,#0xc0 1045 xch a,dpl1 1046 anl a,#0x3f 1047 add a,#>rxbuf 1048 mov dph1,a 1049 .endif 1050 mov a,rxwr 1051 add a,#rxbcnt 1052 mov r0,a 1053 mov r7,#0 1054 0$: movx a,@dptr 1055 jb acc.5,1$ 1056 inc dps 1057 movx @dptr,a 1058 inc dptr 1059 dec dps 1060 inc r7 1061 jb acc.7,0$ 1062 movx a,@dptr 1063 inc dps 1064 movx @dptr,a 1065 inc dptr 1066 dec dps 1067 inc r7 1068 sjmp 0$ 1069 1$: mov @r0,ar7 1070 mov a,rxwr 1071 inc a 1072 anl a,#RXCHUNKS-1 1073 mov rxwr,a 1074 mov rxtwr,a 1075 2$: ljmp txstartloop 1076 1077 .else 1078 02B0 1079 usbiostart1: 02B0 02 03 55 1080 ljmp usbiostart 1081 ;; real receiver starts here 02B3 1082 rxstartloop: 02B3 90 C0 02 1083 mov dptr,#FSKRXDATA 02B6 E5 51 1084 mov a,rxstate 02B8 70 32 1085 jnz rxdataloopstart 1086 ;; hunt for flags 02BA 80 01 1087 sjmp $1 02BC E0 1088 $0: movx a,@dptr ; read data value 02BD E0 1089 $1: movx a,@dptr ; read control value 02BE 20 E5 EF 1090 jb acc.5,usbiostart1 02C1 30 E7 F8 1091 jnb acc.7,$0 02C4 1092 rxpreparepkt: 02C4 75 56 00 1093 mov rxcntc,#0 02C7 75 51 01 1094 mov rxstate,#1 02CA E5 52 1095 mov a,rxwr 02CC F5 54 1096 mov rxtwr,a 02CE 1097 rxnewchunk: 0001 1098 .if 1 02CE E5 54 1099 mov a,rxtwr 02D0 03 1100 rr a 02D1 03 1101 rr a 02D2 F5 57 1102 mov rxaddr,a 02D4 54 C0 1103 anl a,#0xc0 02D6 24 00 1104 add a,#rxbuf 02DE F5 58 1108 mov rxaddr+1,a 1109 .else 1110 mov a,rxtwr 1111 rr a 1112 rr a 1113 mov rxaddr,a 1114 anl a,#0xc0 1115 xch a,rxaddr 1116 anl a,#0x3f 1117 add a,#>rxbuf 1118 mov rxaddr+1,a 1119 .endif 02E0 75 55 40 1120 mov rxcnt,#64 02E3 02 02 B3 1121 ljmp rxstartloop ; sjmp would be enough 1122 02E6 1123 rxabortframe: 02E6 75 51 00 1124 mov rxstate,#0 02E9 02 02 B3 1125 ljmp rxstartloop 1126 02EC 1127 rxdataloopstart: 02EC AF 55 1128 mov r7,rxcnt 02EE 85 57 84 1129 mov dpl1,rxaddr 02F1 85 58 85 1130 mov dph1,rxaddr+1 02F4 E0 1131 0$: movx a,@dptr ; read command 02F5 20 E6 21 1132 jb acc.6,1$ 02F8 E0 1133 movx a,@dptr 02F9 05 86 1134 inc dps 02FB F0 1135 movx @dptr,a 02FC A3 1136 inc dptr 02FD 15 86 1137 dec dps 02FF DF F3 1138 djnz r7,0$ 0301 E5 54 1139 mov a,rxtwr 0303 24 90 1140 add a,#rxbcnt 0305 F8 1141 mov r0,a 0306 76 40 1142 mov @r0,#64 0308 E5 54 1143 mov a,rxtwr 030A 04 1144 inc a 030B 54 1F 1145 anl a,#RXCHUNKS-1 030D B5 53 03 1146 cjne a,rxrd,2$ 0310 02 02 E6 1147 ljmp rxabortframe 0313 F5 54 1148 2$: mov rxtwr,a 0315 05 56 1149 inc rxcntc 0317 80 B5 1150 sjmp rxnewchunk 0319 8F 55 1151 1$: mov rxcnt,r7 031B 85 84 57 1152 mov rxaddr,dpl1 031E 85 85 58 1153 mov rxaddr+1,dph1 0321 20 E5 8C 1154 jb acc.5,usbiostart1 ; empty 0324 20 E4 BF 1155 jb acc.4,rxabortframe ; abort received 0327 54 0F 1156 anl a,#0xf 0329 B4 0E 98 1157 cjne a,#0xe,rxpreparepkt ; CRC not ok or residue error 032C E5 54 1158 mov a,rxtwr 032E 24 90 1159 add a,#rxbcnt 0330 F8 1160 mov r0,a 0331 74 40 1161 mov a,#64 0333 C3 1162 clr c 0334 9F 1163 subb a,r7 0335 F6 1164 mov @r0,a 0336 E5 56 1165 mov a,rxcntc 0338 70 07 1166 jnz 3$ 033A 74 FC 1167 mov a,#-4 033C 26 1168 add a,@r0 033D 50 13 1169 jnc 6$ ; frame too short 033F 80 04 1170 sjmp 4$ 0341 24 F8 1171 3$: add a,#-8 0343 40 0D 1172 jc 6$ ; frame too long 0345 E5 54 1173 4$: mov a,rxtwr 0347 04 1174 inc a 0348 54 1F 1175 anl a,#RXCHUNKS-1 034A B5 53 03 1176 cjne a,rxrd,5$ 034D 02 02 C4 1177 ljmp rxpreparepkt 0350 F5 52 1178 5$: mov rxwr,a 0352 02 02 C4 1179 6$: ljmp rxpreparepkt 1180 .endif 1181 0355 1182 usbiostart: 1183 ;; check for USB modem->host 0355 E5 53 1184 mov a,rxrd 0357 B5 52 4F 1185 cjne a,rxwr,usbcheckin 1186 ;; check for USB host->modem 035A 1187 usbcheckout: 035A 90 7F C8 1188 mov dptr,#OUT2CS 035D E0 1189 movx a,@dptr 035E 20 E1 46 1190 jb acc.1,endusb2 0361 E5 4A 1191 mov a,txtwr 0363 24 80 1192 add a,#txbcnt 0365 F8 1193 mov r0,a 0366 E5 4A 1194 mov a,txtwr 0368 04 1195 inc a 0369 54 0F 1196 anl a,#(TXCHUNKS-1) 036B B5 49 03 1197 cjne a,txrd,usbout2 036E 02 03 E7 1198 ljmp endusb 0371 1199 usbout2: 0371 FF 1200 mov r7,a 0372 90 7F C9 1201 mov dptr,#OUT2BC 0375 E0 1202 movx a,@dptr 0376 F6 1203 mov @r0,a 0377 FD 1204 mov r5,a 0378 60 20 1205 jz usbout3 037A FE 1206 mov r6,a 0001 1207 .if 1 037B E5 4A 1208 mov a,txtwr 037D 03 1209 rr a 037E 03 1210 rr a 037F F5 84 1211 mov dpl1,a 0381 54 C0 1212 anl a,#0xc0 0383 24 00 1213 add a,#txbuf 038B F5 85 1217 mov dph1,a 1218 .else 1219 mov a,txtwr 1220 rr a 1221 rr a 1222 mov dpl1,a 1223 anl a,#0xc0 1224 xch a,dpl1 1225 anl a,#0x3f 1226 add a,#>txbuf 1227 mov dph1,a 1228 .endif 038D 90 7D C0 1229 mov dptr,#OUT2BUF 0390 1230 usboutloop: 0390 E0 1231 movx a,@dptr 0391 A3 1232 inc dptr 0392 05 86 1233 inc dps 0394 F0 1234 movx @dptr,a 0395 A3 1235 inc dptr 0396 15 86 1236 dec dps 0398 DE F6 1237 djnz r6,usboutloop 039A 1238 usbout3: 039A 8F 4A 1239 mov txtwr,r7 039C ED 1240 mov a,r5 039D 24 C0 1241 add a,#-64 039F 60 02 1242 jz usbout4 03A1 8F 48 1243 mov txwr,r7 03A3 1244 usbout4: 03A3 90 7F C9 1245 mov dptr,#OUT2BC 03A6 F0 1246 movx @dptr,a ; rearm OUT2 03A7 1247 endusb2: 03A7 80 3E 1248 sjmp endusb 1249 03A9 1250 usbcheckin: 03A9 90 7F B8 1251 mov dptr,#IN2CS 03AC E0 1252 movx a,@dptr 03AD 20 E1 AA 1253 jb acc.1,usbcheckout 1254 1255 ;ljmp xxinbuf 1256 03B0 E5 53 1257 mov a,rxrd 03B2 24 90 1258 add a,#rxbcnt 03B4 F8 1259 mov r0,a 03B5 E6 1260 mov a,@r0 03B6 60 20 1261 jz usbin1 03B8 FE 1262 mov r6,a 0001 1263 .if 1 03B9 E5 53 1264 mov a,rxrd 03BB 03 1265 rr a 03BC 03 1266 rr a 03BD F5 84 1267 mov dpl1,a 03BF 54 C0 1268 anl a,#0xc0 03C1 24 00 1269 add a,#rxbuf 03C9 F5 85 1273 mov dph1,a 1274 .else 1275 mov a,rxrd 1276 rr a 1277 rr a 1278 mov dpl1,a 1279 anl a,#0xc0 1280 xch a,dpl1 1281 anl a,#0x3f 1282 addc a,#>rxbuf 1283 mov dph1,a 1284 .endif 03CB 90 7E 00 1285 mov dptr,#IN2BUF 03CE 1286 usbinloop: 03CE 05 86 1287 inc dps 03D0 E0 1288 movx a,@dptr 03D1 A3 1289 inc dptr 03D2 15 86 1290 dec dps 03D4 F0 1291 movx @dptr,a 03D5 A3 1292 inc dptr 03D6 DE F6 1293 djnz r6,usbinloop 03D8 1294 usbin1: 03D8 E6 1295 mov a,@r0 03D9 90 7F B9 1296 mov dptr,#IN2BC 03DC F0 1297 movx @dptr,a 03DD E5 53 1298 mov a,rxrd 03DF 04 1299 inc a 03E0 54 1F 1300 anl a,#(RXCHUNKS-1) 03E2 F5 53 1301 mov rxrd,a 03E4 02 03 5A 1302 ljmp usbcheckout 1303 03E7 1304 endusb: 03E7 02 01 8E 1305 ljmp txstartloop 1306 1307 1308 ;; ------------------ interrupt handlers ------------------------ 1309 03EA 1310 int0_isr: 03EA C0 E0 1311 push acc 03EC C0 F0 1312 push b 03EE C0 82 1313 push dpl0 03F0 C0 83 1314 push dph0 03F2 C0 D0 1315 push psw 03F4 75 D0 00 1316 mov psw,#0x00 03F7 C0 86 1317 push dps 03F9 75 86 00 1318 mov dps,#0 1319 ;; clear interrupt 03FC C2 89 1320 clr tcon+1 1321 ;; handle interrupt 1322 ;; epilogue 03FE D0 86 1323 pop dps 0400 D0 D0 1324 pop psw 0402 D0 83 1325 pop dph0 0404 D0 82 1326 pop dpl0 0406 D0 F0 1327 pop b 0408 D0 E0 1328 pop acc 040A 32 1329 reti 1330 040B 1331 timer0_isr: 040B C0 E0 1332 push acc 040D C0 F0 1333 push b 040F C0 82 1334 push dpl0 0411 C0 83 1335 push dph0 0413 C0 D0 1336 push psw 0415 75 D0 00 1337 mov psw,#0x00 0418 C0 86 1338 push dps 041A 75 86 00 1339 mov dps,#0 1340 ;; clear interrupt 041D C2 8D 1341 clr tcon+5 1342 ;; handle interrupt 0000 1343 .if 0 1344 inc leddiv 1345 mov a,leddiv 1346 anl a,#7 1347 jnz 0$ 1348 mov dptr,#OUTC 1349 movx a,@dptr 1350 xrl a,#0x08 1351 movx @dptr,a 1352 0$: 1353 .endif 1354 ;; epilogue 041F D0 86 1355 pop dps 0421 D0 D0 1356 pop psw 0423 D0 83 1357 pop dph0 0425 D0 82 1358 pop dpl0 0427 D0 F0 1359 pop b 0429 D0 E0 1360 pop acc 042B 32 1361 reti 1362 042C 1363 int1_isr: 042C C0 E0 1364 push acc 042E C0 F0 1365 push b 0430 C0 82 1366 push dpl0 0432 C0 83 1367 push dph0 0434 C0 D0 1368 push psw 0436 75 D0 00 1369 mov psw,#0x00 0439 C0 86 1370 push dps 043B 75 86 00 1371 mov dps,#0 1372 ;; clear interrupt 043E C2 8B 1373 clr tcon+3 1374 ;; handle interrupt 1375 ;; epilogue 0440 D0 86 1376 pop dps 0442 D0 D0 1377 pop psw 0444 D0 83 1378 pop dph0 0446 D0 82 1379 pop dpl0 0448 D0 F0 1380 pop b 044A D0 E0 1381 pop acc 044C 32 1382 reti 1383 044D 1384 timer1_isr: 044D C0 E0 1385 push acc 044F C0 F0 1386 push b 0451 C0 82 1387 push dpl0 0453 C0 83 1388 push dph0 0455 C0 D0 1389 push psw 0457 75 D0 00 1390 mov psw,#0x00 045A C0 86 1391 push dps 045C 75 86 00 1392 mov dps,#0 1393 ;; clear interrupt 045F C2 8F 1394 clr tcon+7 1395 ;; handle interrupt 1396 ;; epilogue 0461 D0 86 1397 pop dps 0463 D0 D0 1398 pop psw 0465 D0 83 1399 pop dph0 0467 D0 82 1400 pop dpl0 0469 D0 F0 1401 pop b 046B D0 E0 1402 pop acc 046D 32 1403 reti 1404 046E 1405 ser0_isr: 046E C0 E0 1406 push acc 0470 C0 F0 1407 push b 0472 C0 82 1408 push dpl0 0474 C0 83 1409 push dph0 0476 C0 D0 1410 push psw 0478 75 D0 00 1411 mov psw,#0x00 047B C0 86 1412 push dps 047D 75 86 00 1413 mov dps,#0 0480 C0 00 1414 push ar0 1415 ;; clear interrupt 0482 10 98 16 1416 jbc scon0+0,1$ ; RI 0485 10 99 0F 1417 0$: jbc scon0+1,2$ ; TI 1418 ;; handle interrupt 1419 ;; epilogue 0488 D0 00 1420 3$: pop ar0 048A D0 86 1421 pop dps 048C D0 D0 1422 pop psw 048E D0 83 1423 pop dph0 0490 D0 82 1424 pop dpl0 0492 D0 F0 1425 pop b 0494 D0 E0 1426 pop acc 0496 32 1427 reti 1428 0497 D2 0B 1429 2$: setb uartempty 0499 80 EA 1430 sjmp 0$ 1431 049B E5 6A 1432 1$: mov a,uartwr 049D 24 5A 1433 add a,#uartbuf 049F F8 1434 mov r0,a 04A0 E5 99 1435 mov a,sbuf0 04A2 F6 1436 mov @r0,a 04A3 E5 6A 1437 mov a,uartwr 04A5 04 1438 inc a 04A6 54 0F 1439 anl a,#0xf 04A8 F5 6A 1440 mov uartwr,a 04AA 80 DC 1441 sjmp 3$ 1442 04AC 1443 timer2_isr: 04AC C0 E0 1444 push acc 04AE C0 F0 1445 push b 04B0 C0 82 1446 push dpl0 04B2 C0 83 1447 push dph0 04B4 C0 D0 1448 push psw 04B6 75 D0 00 1449 mov psw,#0x00 04B9 C0 86 1450 push dps 04BB 75 86 00 1451 mov dps,#0 1452 ;; clear interrupt 04BE C2 CF 1453 clr t2con+7 1454 ;; handle interrupt 1455 ;; epilogue 04C0 D0 86 1456 pop dps 04C2 D0 D0 1457 pop psw 04C4 D0 83 1458 pop dph0 04C6 D0 82 1459 pop dpl0 04C8 D0 F0 1460 pop b 04CA D0 E0 1461 pop acc 04CC 32 1462 reti 1463 04CD 1464 resume_isr: 04CD C0 E0 1465 push acc 04CF C0 F0 1466 push b 04D1 C0 82 1467 push dpl0 04D3 C0 83 1468 push dph0 04D5 C0 D0 1469 push psw 04D7 75 D0 00 1470 mov psw,#0x00 04DA C0 86 1471 push dps 04DC 75 86 00 1472 mov dps,#0 1473 ;; clear interrupt 04DF C2 DC 1474 clr eicon+4 1475 ;; handle interrupt 1476 ;; epilogue 04E1 D0 86 1477 pop dps 04E3 D0 D0 1478 pop psw 04E5 D0 83 1479 pop dph0 04E7 D0 82 1480 pop dpl0 04E9 D0 F0 1481 pop b 04EB D0 E0 1482 pop acc 04ED 32 1483 reti 1484 04EE 1485 ser1_isr: 04EE C0 E0 1486 push acc 04F0 C0 F0 1487 push b 04F2 C0 82 1488 push dpl0 04F4 C0 83 1489 push dph0 04F6 C0 D0 1490 push psw 04F8 75 D0 00 1491 mov psw,#0x00 04FB C0 86 1492 push dps 04FD 75 86 00 1493 mov dps,#0 1494 ;; clear interrupt 0500 C2 C0 1495 clr scon1+0 0502 C2 C1 1496 clr scon1+1 1497 ;; handle interrupt 1498 ;; epilogue 0504 D0 86 1499 pop dps 0506 D0 D0 1500 pop psw 0508 D0 83 1501 pop dph0 050A D0 82 1502 pop dpl0 050C D0 F0 1503 pop b 050E D0 E0 1504 pop acc 0510 32 1505 reti 1506 0511 1507 i2c_isr: 0511 C0 E0 1508 push acc 0513 C0 F0 1509 push b 0515 C0 82 1510 push dpl0 0517 C0 83 1511 push dph0 0519 C0 D0 1512 push psw 051B 75 D0 00 1513 mov psw,#0x00 051E C0 86 1514 push dps 0520 75 86 00 1515 mov dps,#0 1516 ;; clear interrupt 0523 E5 91 1517 mov a,exif 0525 C2 E5 1518 clr acc.5 0527 F5 91 1519 mov exif,a 1520 ;; handle interrupt 1521 ;; epilogue 0529 D0 86 1522 pop dps 052B D0 D0 1523 pop psw 052D D0 83 1524 pop dph0 052F D0 82 1525 pop dpl0 0531 D0 F0 1526 pop b 0533 D0 E0 1527 pop acc 0535 32 1528 reti 1529 0536 1530 int4_isr: 0536 C0 E0 1531 push acc 0538 C0 F0 1532 push b 053A C0 82 1533 push dpl0 053C C0 83 1534 push dph0 053E C0 D0 1535 push psw 0540 75 D0 00 1536 mov psw,#0x00 0543 C0 86 1537 push dps 0545 75 86 00 1538 mov dps,#0 1539 ;; clear interrupt 0548 E5 91 1540 mov a,exif 054A C2 E6 1541 clr acc.6 054C F5 91 1542 mov exif,a 1543 ;; handle interrupt 1544 ;; epilogue 054E D0 86 1545 pop dps 0550 D0 D0 1546 pop psw 0552 D0 83 1547 pop dph0 0554 D0 82 1548 pop dpl0 0556 D0 F0 1549 pop b 0558 D0 E0 1550 pop acc 055A 32 1551 reti 1552 055B 1553 int5_isr: 055B C0 E0 1554 push acc 055D C0 F0 1555 push b 055F C0 82 1556 push dpl0 0561 C0 83 1557 push dph0 0563 C0 D0 1558 push psw 0565 75 D0 00 1559 mov psw,#0x00 0568 C0 86 1560 push dps 056A 75 86 00 1561 mov dps,#0 1562 ;; clear interrupt 056D E5 91 1563 mov a,exif 056F C2 E7 1564 clr acc.7 0571 F5 91 1565 mov exif,a 1566 ;; handle interrupt 1567 ;; epilogue 0573 D0 86 1568 pop dps 0575 D0 D0 1569 pop psw 0577 D0 83 1570 pop dph0 0579 D0 82 1571 pop dpl0 057B D0 F0 1572 pop b 057D D0 E0 1573 pop acc 057F 32 1574 reti 1575 0580 1576 int6_isr: 0580 C0 E0 1577 push acc 0582 C0 F0 1578 push b 0584 C0 82 1579 push dpl0 0586 C0 83 1580 push dph0 0588 C0 D0 1581 push psw 058A 75 D0 00 1582 mov psw,#0x00 058D C0 86 1583 push dps 058F 75 86 00 1584 mov dps,#0 1585 ;; clear interrupt 0592 C2 DB 1586 clr eicon+3 1587 ;; handle interrupt 1588 ;; epilogue 0594 D0 86 1589 pop dps 0596 D0 D0 1590 pop psw 0598 D0 83 1591 pop dph0 059A D0 82 1592 pop dpl0 059C D0 F0 1593 pop b 059E D0 E0 1594 pop acc 05A0 32 1595 reti 1596 05A1 1597 usb_sudav_isr: 05A1 C0 E0 1598 push acc 05A3 C0 F0 1599 push b 05A5 C0 82 1600 push dpl0 05A7 C0 83 1601 push dph0 05A9 C0 84 1602 push dpl1 05AB C0 85 1603 push dph1 05AD C0 D0 1604 push psw 05AF 75 D0 00 1605 mov psw,#0x00 05B2 C0 86 1606 push dps 05B4 75 86 00 1607 mov dps,#0 05B7 C0 00 1608 push ar0 05B9 C0 07 1609 push ar7 1610 ;; clear interrupt 05BB E5 91 1611 mov a,exif 05BD C2 E4 1612 clr acc.4 05BF F5 91 1613 mov exif,a 05C1 90 7F AB 1614 mov dptr,#USBIRQ 05C4 74 01 1615 mov a,#0x01 05C6 F0 1616 movx @dptr,a 1617 ;; handle interrupt 05C7 75 40 00 1618 mov ctrlcode,#0 ; reset control out code 05CA 90 7F E9 1619 mov dptr,#SETUPDAT+1 05CD E0 1620 movx a,@dptr ; bRequest field 1621 ;; standard commands 1622 ;; USB_REQ_GET_DESCRIPTOR 05CE B4 06 59 1623 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 05D1 90 7F E8 1624 mov dptr,#SETUPDAT ; bRequestType == 0x80 05D4 E0 1625 movx a,@dptr 05D5 B4 80 4F 1626 cjne a,#USB_DIR_IN,setupstallstd 05D8 90 7F EB 1627 mov dptr,#SETUPDAT+3 05DB E0 1628 movx a,@dptr 05DC B4 01 0C 1629 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 05DF 90 7F D4 1630 mov dptr,#SUDPTRH 05E2 74 0D 1631 mov a,#>devicedescr 05E4 F0 1632 movx @dptr,a 05E5 A3 1633 inc dptr 05E6 74 D4 1634 mov a,#config0descr 05F9 F0 1644 movx @dptr,a 05FA A3 1645 inc dptr 05FB 74 E6 1646 mov a,#stringdescr 0615 F5 83 1661 mov dph0,a 0617 E0 1662 movx a,@dptr 0618 F5 F0 1663 mov b,a 061A A3 1664 inc dptr 061B E0 1665 movx a,@dptr 061C 90 7F D4 1666 mov dptr,#SUDPTRH 061F F0 1667 movx @dptr,a 0620 A3 1668 inc dptr 0621 E5 F0 1669 mov a,b 0623 F0 1670 movx @dptr,a 1671 ; sjmp setupackstd 0624 1672 setupackstd: 0624 02 09 B4 1673 ljmp setupack 0627 1674 setupstallstd: 0627 02 09 B0 1675 ljmp setupstall 062A 1676 cmdnotgetdesc: 1677 ;; USB_REQ_SET_CONFIGURATION 062A B4 09 41 1678 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 062D 90 7F E8 1679 mov dptr,#SETUPDAT 0630 E0 1680 movx a,@dptr 0631 70 F4 1681 jnz setupstallstd 0633 90 7F EA 1682 mov dptr,#SETUPDAT+2 0636 E0 1683 movx a,@dptr 0637 24 FE 1684 add a,#-2 0639 40 EC 1685 jc setupstallstd 063B E0 1686 movx a,@dptr 063C F5 6F 1687 mov numconfig,a 063E 1688 cmdresettoggleshalt: 063E 90 7F D7 1689 mov dptr,#TOGCTL 0641 78 07 1690 mov r0,#7 0643 E8 1691 0$: mov a,r0 0644 44 10 1692 orl a,#0x10 0646 F0 1693 movx @dptr,a 0647 44 30 1694 orl a,#0x30 0649 F0 1695 movx @dptr,a 064A E8 1696 mov a,r0 064B F0 1697 movx @dptr,a 064C 44 20 1698 orl a,#0x20 064E F0 1699 movx @dptr,a 064F D8 F2 1700 djnz r0,0$ 0651 E4 1701 clr a 0652 F0 1702 movx @dptr,a 0653 74 02 1703 mov a,#2 0655 90 7F B6 1704 mov dptr,#IN1CS 0658 78 07 1705 mov r0,#7 065A F0 1706 1$: movx @dptr,a 065B A3 1707 inc dptr 065C A3 1708 inc dptr 065D D8 FB 1709 djnz r0,1$ 065F 90 7F C6 1710 mov dptr,#OUT1CS 0662 78 07 1711 mov r0,#7 0664 F0 1712 2$: movx @dptr,a 0665 A3 1713 inc dptr 0666 A3 1714 inc dptr 0667 D8 FB 1715 djnz r0,2$ 0669 12 0A F1 1716 lcall fillusbintr 066C 80 B6 1717 sjmp setupackstd 066E 1718 cmdnotsetconf: 1719 ;; USB_REQ_SET_INTERFACE 066E B4 0B 1A 1720 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 0671 90 7F E8 1721 mov dptr,#SETUPDAT 0674 E0 1722 movx a,@dptr 0675 B4 01 AF 1723 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 0678 E5 6F 1724 mov a,numconfig 067A B4 01 AA 1725 cjne a,#1,setupstallstd 067D 90 7F EC 1726 mov dptr,#SETUPDAT+4 0680 E0 1727 movx a,@dptr 0681 70 A4 1728 jnz setupstallstd 0683 90 7F EA 1729 mov dptr,#SETUPDAT+2 0686 E0 1730 movx a,@dptr 0687 F5 70 1731 mov altsetting,a 0689 80 B3 1732 sjmp cmdresettoggleshalt 068B 1733 cmdnotsetint: 1734 ;; USB_REQ_GET_INTERFACE 068B B4 0A 20 1735 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 068E 90 7F E8 1736 mov dptr,#SETUPDAT 0691 E0 1737 movx a,@dptr 0692 B4 81 92 1738 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 0695 E5 6F 1739 mov a,numconfig 0697 B4 01 8D 1740 cjne a,#1,setupstallstd 069A 90 7F EC 1741 mov dptr,#SETUPDAT+4 069D E0 1742 movx a,@dptr 069E 70 87 1743 jnz setupstallstd 06A0 E5 70 1744 mov a,altsetting 06A2 1745 cmdrespondonebyte: 06A2 90 7F 00 1746 mov dptr,#IN0BUF 06A5 F0 1747 movx @dptr,a 06A6 90 7F B5 1748 mov dptr,#IN0BC 06A9 74 01 1749 mov a,#1 06AB F0 1750 movx @dptr,a 06AC 80 4E 1751 sjmp setupackstd2 06AE 1752 cmdnotgetint: 1753 ;; USB_REQ_GET_CONFIGURATION 06AE B4 08 0B 1754 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 06B1 90 7F E8 1755 mov dptr,#SETUPDAT 06B4 E0 1756 movx a,@dptr 06B5 B4 80 47 1757 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 06B8 E5 6F 1758 mov a,numconfig 06BA 80 E6 1759 sjmp cmdrespondonebyte 06BC 1760 cmdnotgetconf: 1761 ;; USB_REQ_GET_STATUS (0) 06BC 70 44 1762 jnz cmdnotgetstat 06BE 90 7F E8 1763 mov dptr,#SETUPDAT 06C1 E0 1764 movx a,@dptr 06C2 B4 80 11 1765 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 06C5 74 01 1766 mov a,#1 06C7 1767 cmdrespondstat: 06C7 90 7F 00 1768 mov dptr,#IN0BUF 06CA F0 1769 movx @dptr,a 06CB A3 1770 inc dptr 06CC E4 1771 clr a 06CD F0 1772 movx @dptr,a 06CE 90 7F B5 1773 mov dptr,#IN0BC 06D1 74 02 1774 mov a,#2 06D3 F0 1775 movx @dptr,a 06D4 80 26 1776 sjmp setupackstd2 06D6 1777 cmdnotgetstatdev: 06D6 B4 81 03 1778 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 06D9 E4 1779 clr a 06DA 80 EB 1780 sjmp cmdrespondstat 06DC 1781 cmdnotgetstatintf: 06DC B4 82 20 1782 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 06DF 90 7F EC 1783 mov dptr,#SETUPDAT+4 06E2 E0 1784 movx a,@dptr 06E3 90 7F C4 1785 mov dptr,#OUT1CS-2 06E6 30 E7 03 1786 jnb acc.7,0$ 06E9 90 7F B4 1787 mov dptr,#IN1CS-2 06EC 54 0F 1788 0$: anl a,#15 06EE 60 0F 1789 jz setupstallstd2 06F0 20 E3 0C 1790 jb acc.3,setupstallstd2 06F3 25 E0 1791 add a,acc 06F5 25 82 1792 add a,dpl0 06F7 F5 82 1793 mov dpl0,a 06F9 E0 1794 movx a,@dptr 06FA 80 CB 1795 sjmp cmdrespondstat 06FC 1796 setupackstd2: 06FC 02 09 B4 1797 ljmp setupack 06FF 1798 setupstallstd2: 06FF 02 09 B0 1799 ljmp setupstall 0702 1800 cmdnotgetstat: 1801 ;; USB_REQ_SET_FEATURE 0702 B4 03 05 1802 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 0705 75 F0 01 1803 mov b,#1 0708 80 06 1804 sjmp handleftr 070A 1805 cmdnotsetftr: 1806 ;; USB_REQ_CLEAR_FEATURE 070A B4 01 44 1807 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 070D 75 F0 00 1808 mov b,#0 0710 1809 handleftr: 0710 90 7F E8 1810 mov dptr,#SETUPDAT 0713 E0 1811 movx a,@dptr 0714 B4 02 E8 1812 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 0717 A3 1813 inc dptr 0718 A3 1814 inc dptr 0719 E0 1815 movx a,@dptr 071A 70 E3 1816 jnz setupstallstd2 ; not ENDPOINT_HALT feature 071C A3 1817 inc dptr 071D E0 1818 movx a,@dptr 071E 70 DF 1819 jnz setupstallstd2 0720 A3 1820 inc dptr 0721 E0 1821 movx a,@dptr 0722 90 7F C4 1822 mov dptr,#OUT1CS-2 0725 30 E7 05 1823 jnb acc.7,0$ 0728 90 7F B4 1824 mov dptr,#IN1CS-2 072B 44 10 1825 orl a,#0x10 072D 20 E3 CF 1826 0$: jb acc.3,setupstallstd2 1827 ;; clear data toggle 0730 54 1F 1828 anl a,#0x1f 0732 05 86 1829 inc dps 0734 90 7F D7 1830 mov dptr,#TOGCTL 0737 F0 1831 movx @dptr,a 0738 44 20 1832 orl a,#0x20 073A F0 1833 movx @dptr,a 073B 54 0F 1834 anl a,#15 073D F0 1835 movx @dptr,a 073E 15 86 1836 dec dps 1837 ;; clear/set ep halt feature 0740 25 E0 1838 add a,acc 0742 25 82 1839 add a,dpl0 0744 F5 82 1840 mov dpl0,a 0746 E5 F0 1841 mov a,b 0748 F0 1842 movx @dptr,a 0749 80 B1 1843 sjmp setupackstd2 1844 074B 1845 cmdnotc0_1: 074B 02 08 19 1846 ljmp cmdnotc0 074E 1847 setupstallc0_1: 074E 02 09 B0 1848 ljmp setupstall 1849 0751 1850 cmdnotclrftr: 1851 ;; vendor specific commands 1852 ;; 0xc0 0751 B4 C0 F7 1853 cjne a,#0xc0,cmdnotc0_1 0754 90 7F E8 1854 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0757 E0 1855 movx a,@dptr 0758 B4 C0 F3 1856 cjne a,#0xc0,setupstallc0_1 1857 ;; fill status buffer 075B E5 45 1858 mov a,txstate 075D F5 F0 1859 mov b,a 075F D2 F2 1860 setb b.2 0761 45 50 1861 orl a,pttforce 0763 B4 00 02 1862 cjne a,#0,0$ 0766 C2 F2 1863 clr b.2 0768 90 C0 0E 1864 0$: mov dptr,#FSKMDISCIN 076B E0 1865 movx a,@dptr 076C A2 E6 1866 mov c,acc.6 076E B3 1867 cpl c 076F 82 08 1868 anl c,extmodem 0771 92 F3 1869 mov b.3,c 0773 90 C0 09 1870 mov dptr,#FSKSTAT 0776 E0 1871 movx a,@dptr 0777 A2 E0 1872 mov c,acc.0 0779 B0 08 1873 anl c,/extmodem 077B 72 F3 1874 orl c,b.3 077D 92 F3 1875 mov b.3,c 077F A2 0B 1876 mov c,uartempty 0781 92 F5 1877 mov b.5,c 0783 E4 1878 clr a 0784 90 7F 04 1879 mov dptr,#(IN0BUF+4) 0787 F0 1880 movx @dptr,a 1881 ;; bytewide elements 0788 90 7F 00 1882 mov dptr,#(IN0BUF) 078B E5 F0 1883 mov a,b 078D F0 1884 movx @dptr,a 078E E5 48 1885 mov a,txwr 0790 F4 1886 cpl a 0791 25 49 1887 add a,txrd 0793 54 0F 1888 anl a,#(TXCHUNKS-1) 0795 90 7F 01 1889 mov dptr,#(IN0BUF+1) 0798 F0 1890 movx @dptr,a 0799 E5 53 1891 mov a,rxrd 079B F4 1892 cpl a 079C 25 52 1893 add a,rxwr 079E 04 1894 inc a 079F 54 1F 1895 anl a,#(RXCHUNKS-1) 07A1 90 7F 02 1896 mov dptr,#(IN0BUF+2) 07A4 F0 1897 movx @dptr,a 07A5 90 C0 04 1898 mov dptr,#FSKRSSI 07A8 E0 1899 movx a,@dptr 07A9 90 7F 03 1900 mov dptr,#(IN0BUF+3) 07AC F0 1901 movx @dptr,a 1902 ;; counter 07AD 05 44 1903 inc irqcount 07AF E5 44 1904 mov a,irqcount 07B1 90 7F 05 1905 mov dptr,#(IN0BUF+5) 07B4 F0 1906 movx @dptr,a 1907 ;; additional fields (HDLC state mach) 07B5 E5 45 1908 mov a,txstate 07B7 A3 1909 inc dptr 07B8 F0 1910 movx @dptr,a 07B9 E5 49 1911 mov a,txrd 07BB A3 1912 inc dptr 07BC F0 1913 movx @dptr,a 07BD E5 48 1914 mov a,txwr 07BF A3 1915 inc dptr 07C0 F0 1916 movx @dptr,a 07C1 E5 4A 1917 mov a,txtwr 07C3 A3 1918 inc dptr 07C4 F0 1919 movx @dptr,a 07C5 E5 4B 1920 mov a,txcnt 07C7 A3 1921 inc dptr 07C8 F0 1922 movx @dptr,a 07C9 E5 46 1923 mov a,flagcnt 07CB A3 1924 inc dptr 07CC F0 1925 movx @dptr,a 07CD E5 47 1926 mov a,flagcnt+1 07CF A3 1927 inc dptr 07D0 F0 1928 movx @dptr,a 07D1 E5 51 1929 mov a,rxstate 07D3 A3 1930 inc dptr 07D4 F0 1931 movx @dptr,a 07D5 E5 53 1932 mov a,rxrd 07D7 A3 1933 inc dptr 07D8 F0 1934 movx @dptr,a 07D9 E5 52 1935 mov a,rxwr 07DB A3 1936 inc dptr 07DC F0 1937 movx @dptr,a 07DD E5 54 1938 mov a,rxtwr 07DF A3 1939 inc dptr 07E0 F0 1940 movx @dptr,a 07E1 E5 55 1941 mov a,rxcnt 07E3 A3 1942 inc dptr 07E4 F0 1943 movx @dptr,a 1944 ;; FPGA registers 07E5 E5 59 1945 mov a,tmprxcnt 07E7 90 7F 12 1946 mov dptr,#(IN0BUF+18) 07EA F0 1947 movx @dptr,a 07EB 90 C0 00 1948 mov dptr,#FSKTXCNT 07EE E0 1949 movx a,@dptr 07EF 90 7F 13 1950 mov dptr,#(IN0BUF+19) 07F2 F0 1951 movx @dptr,a 07F3 A3 1952 inc dptr 07F4 E5 20 1953 mov a,ctrlreg 07F6 F0 1954 movx @dptr,a 07F7 90 C0 09 1955 mov dptr,#FSKSTAT 07FA E0 1956 movx a,@dptr 07FB 90 7F 15 1957 mov dptr,#(IN0BUF+21) 07FE F0 1958 movx @dptr,a 1959 ;; Anchor Registers 07FF 90 7F C8 1960 mov dptr,#OUT2CS 0802 E0 1961 movx a,@dptr 0803 90 7F 16 1962 mov dptr,#(IN0BUF+22) 0806 F0 1963 movx @dptr,a 1964 ;; set length 0807 90 7F EE 1965 mov dptr,#SETUPDAT+6 ; wLength 080A E0 1966 movx a,@dptr 080B 24 E9 1967 add a,#-(6+12+4+1) 080D 50 01 1968 jnc 4$ 080F E4 1969 clr a 0810 24 17 1970 4$: add a,#(6+12+4+1) 0812 90 7F B5 1971 mov dptr,#IN0BC 0815 F0 1972 movx @dptr,a 0816 02 09 B4 1973 ljmp setupack 0819 1974 cmdnotc0: 1975 ;; 0xc8 0819 B4 C8 1D 1976 cjne a,#0xc8,cmdnotc8 081C 90 7F E8 1977 mov dptr,#SETUPDAT ; bRequestType == 0xc0 081F E0 1978 movx a,@dptr 0820 B4 C0 13 1979 cjne a,#0xc0,setupstallc8 0823 74 01 1980 mov a,#1 0825 30 08 01 1981 jnb extmodem,1$ 0828 04 1982 inc a 0829 90 7F 00 1983 1$: mov dptr,#IN0BUF 082C F0 1984 movx @dptr,a 082D 90 7F B5 1985 mov dptr,#IN0BC 0830 74 01 1986 mov a,#1 0832 F0 1987 movx @dptr,a 0833 02 09 B4 1988 ljmp setupack 0836 1989 setupstallc8: 0836 02 09 B0 1990 ljmp setupstall 0839 1991 cmdnotc8: 1992 ;; 0xc9 0839 B4 C9 21 1993 cjne a,#0xc9,cmdnotc9 083C 90 7F E8 1994 mov dptr,#SETUPDAT ; bRequestType == 0xc0 083F E0 1995 movx a,@dptr 0840 B4 C0 17 1996 cjne a,#0xc0,setupstallc9 0843 90 7F 00 1997 mov dptr,#IN0BUF 0846 78 F0 1998 mov r0,#parserial 0848 E2 1999 0$: movx a,@r0 0849 60 05 2000 jz 1$ 084B F0 2001 movx @dptr,a 084C 08 2002 inc r0 084D A3 2003 inc dptr 084E 80 F8 2004 sjmp 0$ 0850 E8 2005 1$: mov a,r0 0851 24 10 2006 add a,#-0xf0 ; -parserial 0853 90 7F B5 2007 mov dptr,#IN0BC 0856 F0 2008 movx @dptr,a 0857 02 09 B4 2009 ljmp setupack 085A 2010 setupstallc9: 085A 02 09 B0 2011 ljmp setupstall 085D 2012 cmdnotc9: 2013 ;; 0xd0 085D B4 D0 5D 2014 cjne a,#0xd0,cmdnotd0 0860 90 7F E8 2015 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0863 E0 2016 movx a,@dptr 0864 B4 C0 53 2017 cjne a,#0xc0,setupstalld0 0867 90 7F EC 2018 mov dptr,#SETUPDAT+4 ; wIndex 086A E0 2019 movx a,@dptr 086B B4 01 0A 2020 cjne a,#1,0$ 086E 90 7F EA 2021 mov dptr,#SETUPDAT+2 ; wValue 0871 E0 2022 movx a,@dptr 0872 54 01 2023 anl a,#1 0874 F5 50 2024 mov pttforce,a 0876 D2 0A 2025 setb pttforcechg 0878 2026 0$: ;; PTT status 0878 90 7F 00 2027 mov dptr,#IN0BUF 087B E5 45 2028 mov a,txstate 087D 45 50 2029 orl a,pttforce 087F 60 02 2030 jz 1$ 0881 74 01 2031 mov a,#1 0883 F0 2032 1$: movx @dptr,a 2033 ;; DCD status 0884 90 C0 0E 2034 mov dptr,#FSKMDISCIN 0887 E0 2035 movx a,@dptr 0888 A2 E6 2036 mov c,acc.6 088A A0 08 2037 orl c,/extmodem 088C 92 F0 2038 mov b.0,c 088E 90 C0 09 2039 mov dptr,#FSKSTAT 0891 E0 2040 movx a,@dptr 0892 A2 E0 2041 mov c,acc.0 0894 72 08 2042 orl c,extmodem 0896 82 F0 2043 anl c,b.0 0898 B3 2044 cpl c 0899 E4 2045 clr a 089A 92 E0 2046 mov acc.0,c 089C 90 7F 01 2047 mov dptr,#IN0BUF+1 089F F0 2048 movx @dptr,a 2049 ;; RSSI 08A0 90 C0 04 2050 mov dptr,#FSKRSSI 08A3 E0 2051 movx a,@dptr 08A4 90 7F 02 2052 mov dptr,#IN0BUF+2 08A7 F0 2053 movx @dptr,a 2054 ;; length 08A8 90 7F EE 2055 mov dptr,#SETUPDAT+6 ; wLength 08AB E0 2056 movx a,@dptr 08AC 24 FD 2057 add a,#-3 08AE 50 01 2058 jnc 2$ 08B0 E4 2059 clr a 08B1 24 03 2060 2$: add a,#3 08B3 90 7F B5 2061 mov dptr,#IN0BC 08B6 F0 2062 movx @dptr,a 08B7 02 09 B4 2063 ljmp setupack 08BA 2064 setupstalld0: 08BA 02 09 B0 2065 ljmp setupstall 08BD 2066 cmdnotd0: 2067 ;; 0xd1 08BD B4 D1 29 2068 cjne a,#0xd1,cmdnotd1 08C0 90 7F E8 2069 mov dptr,#SETUPDAT ; bRequestType == 0xc0 08C3 E0 2070 movx a,@dptr 08C4 B4 C0 1F 2071 cjne a,#0xc0,setupstalld1 08C7 90 7F 00 2072 mov dptr,#IN0BUF 08CA 78 E0 2073 mov r0,#parbitratetx 08CC 7F 06 2074 mov r7,#6 08CE E2 2075 1$: movx a,@r0 08CF F0 2076 movx @dptr,a 08D0 A3 2077 inc dptr 08D1 08 2078 inc r0 08D2 DF FA 2079 djnz r7,1$ 2080 ;; length 08D4 90 7F EE 2081 mov dptr,#SETUPDAT+6 ; wLength 08D7 E0 2082 movx a,@dptr 08D8 24 FA 2083 add a,#-6 08DA 50 01 2084 jnc 2$ 08DC E4 2085 clr a 08DD 24 06 2086 2$: add a,#6 08DF 90 7F B5 2087 mov dptr,#IN0BC 08E2 F0 2088 movx @dptr,a 08E3 02 09 B4 2089 ljmp setupack 08E6 2090 setupstalld1: 08E6 02 09 B0 2091 ljmp setupstall 08E9 2092 cmdnotd1: 2093 ;; 0xd2 08E9 B4 D2 20 2094 cjne a,#0xd2,cmdnotd2 08EC 90 7F E8 2095 mov dptr,#SETUPDAT ; bRequestType == 0x40 08EF E0 2096 movx a,@dptr 08F0 B4 40 16 2097 cjne a,#0x40,setupstalld2 08F3 90 7F EA 2098 mov dptr,#SETUPDAT+2 ; wValue 08F6 E0 2099 movx a,@dptr 08F7 F5 F0 2100 mov b,a 08F9 90 7F 98 2101 mov dptr,#OUTC 08FC E0 2102 movx a,@dptr 08FD A2 F0 2103 mov c,b.0 08FF 92 E3 2104 mov acc.3,c 0901 A2 F1 2105 mov c,b.1 0903 92 E5 2106 mov acc.5,c 0905 F0 2107 movx @dptr,a 0906 02 09 B4 2108 ljmp setupack 0909 2109 setupstalld2: 0909 02 09 B0 2110 ljmp setupstall 090C 2111 cmdnotd2: 2112 ;; 0xd3 090C B4 D3 16 2113 cjne a,#0xd3,cmdnotd3 090F 90 7F E8 2114 mov dptr,#SETUPDAT ; bRequestType == 0x40 0912 E0 2115 movx a,@dptr 0913 B4 40 07 2116 cjne a,#0x40,setupstalld3 0916 90 7F EA 2117 mov dptr,#SETUPDAT+2 ; wValue 0919 E0 2118 movx a,@dptr 091A 10 0B 03 2119 jbc uartempty,cmdd2cont 091D 2120 setupstalld3: 091D 02 09 B0 2121 ljmp setupstall 0920 2122 cmdd2cont: 0920 F5 99 2123 mov sbuf0,a 0922 02 09 B4 2124 ljmp setupack 0925 2125 cmdnotd3: 2126 ;; 0xd4 0925 B4 D4 4C 2127 cjne a,#0xd4,cmdnotd4 0928 90 7F E8 2128 mov dptr,#SETUPDAT ; bRequestType == 0xc0 092B E0 2129 movx a,@dptr 092C B4 C0 42 2130 cjne a,#0xc0,setupstalld4 092F 20 08 3F 2131 jb extmodem,setupstalld4 0932 90 7F EC 2132 mov dptr,#SETUPDAT+4 ; wIndex 0935 E0 2133 movx a,@dptr 0936 90 7F EA 2134 mov dptr,#SETUPDAT+2 ; wValue 0939 B4 01 09 2135 cjne a,#1,0$ 093C E0 2136 movx a,@dptr 093D 90 C0 0D 2137 mov dptr,#FSKMDISCOUT 0940 F0 2138 movx @dptr,a 0941 F5 6E 2139 mov mdiscout,a 0943 80 0A 2140 sjmp 1$ 0945 B4 02 07 2141 0$: cjne a,#2,1$ 0948 E0 2142 movx a,@dptr 0949 90 C0 0C 2143 mov dptr,#FSKMDISCTRIS 094C F0 2144 movx @dptr,a 094D F5 6D 2145 mov mdisctris,a 094F 90 C0 0E 2146 1$: mov dptr,#FSKMDISCIN 0952 E0 2147 movx a,@dptr 0953 90 7F 00 2148 mov dptr,#IN0BUF+0 0956 F0 2149 movx @dptr,a 0957 E5 6E 2150 mov a,mdiscout 0959 A3 2151 inc dptr 095A F0 2152 movx @dptr,a 095B E5 6D 2153 mov a,mdisctris 095D A3 2154 inc dptr 095E F0 2155 movx @dptr,a 2156 ;; length 095F 90 7F EE 2157 mov dptr,#SETUPDAT+6 ; wLength 0962 E0 2158 movx a,@dptr 0963 24 FD 2159 add a,#-3 0965 50 01 2160 jnc 2$ 0967 E4 2161 clr a 0968 24 03 2162 2$: add a,#3 096A 90 7F B5 2163 mov dptr,#IN0BC 096D F0 2164 movx @dptr,a 096E 02 09 B4 2165 ljmp setupack 0971 2166 setupstalld4: 0971 02 09 B0 2167 ljmp setupstall 0974 2168 cmdnotd4: 2169 ;; 0xd5 0974 B4 D5 39 2170 cjne a,#0xd5,cmdnotd5 0977 90 7F E8 2171 mov dptr,#SETUPDAT ; bRequestType == 0xc0 097A E0 2172 movx a,@dptr 097B B4 C0 2F 2173 cjne a,#0xc0,setupstalld5 097E 90 7F EC 2174 mov dptr,#SETUPDAT+4 ; wIndex 0981 E0 2175 movx a,@dptr 0982 B4 01 0A 2176 cjne a,#1,0$ 0985 90 7F EA 2177 mov dptr,#SETUPDAT+2 ; wValue 0988 E0 2178 movx a,@dptr 0989 90 C0 0A 2179 mov dptr,#FSKT7FOUT 098C F0 2180 movx @dptr,a 098D F5 6C 2181 mov t7fout,a 098F 90 C0 0B 2182 0$: mov dptr,#FSKT7FIN 0992 E0 2183 movx a,@dptr 0993 90 7F 00 2184 mov dptr,#IN0BUF+0 0996 F0 2185 movx @dptr,a 0997 E5 6C 2186 mov a,t7fout 0999 A3 2187 inc dptr 099A F0 2188 movx @dptr,a 2189 ;; length 099B 90 7F EE 2190 mov dptr,#SETUPDAT+6 ; wLength 099E E0 2191 movx a,@dptr 099F 24 FE 2192 add a,#-2 09A1 50 01 2193 jnc 2$ 09A3 E4 2194 clr a 09A4 24 02 2195 2$: add a,#2 09A6 90 7F B5 2196 mov dptr,#IN0BC 09A9 F0 2197 movx @dptr,a 09AA 02 09 B4 2198 ljmp setupack 09AD 2199 setupstalld5: 09AD 02 09 B0 2200 ljmp setupstall 09B0 2201 cmdnotd5: 2202 ;; unknown commands fall through to setupstall 2203 09B0 2204 setupstall: 09B0 74 03 2205 mov a,#3 09B2 80 02 2206 sjmp endsetup 09B4 2207 setupack: 09B4 74 02 2208 mov a,#2 09B6 2209 endsetup: 09B6 90 7F B4 2210 mov dptr,#EP0CS 09B9 F0 2211 movx @dptr,a 09BA 2212 endusbisr: 2213 ;; epilogue 09BA D0 07 2214 pop ar7 09BC D0 00 2215 pop ar0 09BE D0 86 2216 pop dps 09C0 D0 D0 2217 pop psw 09C2 D0 85 2218 pop dph1 09C4 D0 84 2219 pop dpl1 09C6 D0 83 2220 pop dph0 09C8 D0 82 2221 pop dpl0 09CA D0 F0 2222 pop b 09CC D0 E0 2223 pop acc 09CE 32 2224 reti 2225 09CF 2226 usb_sof_isr: 09CF C0 E0 2227 push acc 09D1 C0 F0 2228 push b 09D3 C0 82 2229 push dpl0 09D5 C0 83 2230 push dph0 09D7 C0 D0 2231 push psw 09D9 75 D0 00 2232 mov psw,#0x00 09DC C0 86 2233 push dps 09DE 75 86 00 2234 mov dps,#0 2235 ;; clear interrupt 09E1 E5 91 2236 mov a,exif 09E3 C2 E4 2237 clr acc.4 09E5 F5 91 2238 mov exif,a 09E7 90 7F AB 2239 mov dptr,#USBIRQ 09EA 74 02 2240 mov a,#0x02 09EC F0 2241 movx @dptr,a 2242 ;; handle interrupt 2243 ;; epilogue 09ED D0 86 2244 pop dps 09EF D0 D0 2245 pop psw 09F1 D0 83 2246 pop dph0 09F3 D0 82 2247 pop dpl0 09F5 D0 F0 2248 pop b 09F7 D0 E0 2249 pop acc 09F9 32 2250 reti 2251 2252 09FA 2253 usb_sutok_isr: 09FA C0 E0 2254 push acc 09FC C0 F0 2255 push b 09FE C0 82 2256 push dpl0 0A00 C0 83 2257 push dph0 0A02 C0 D0 2258 push psw 0A04 75 D0 00 2259 mov psw,#0x00 0A07 C0 86 2260 push dps 0A09 75 86 00 2261 mov dps,#0 2262 ;; clear interrupt 0A0C E5 91 2263 mov a,exif 0A0E C2 E4 2264 clr acc.4 0A10 F5 91 2265 mov exif,a 0A12 90 7F AB 2266 mov dptr,#USBIRQ 0A15 74 04 2267 mov a,#0x04 0A17 F0 2268 movx @dptr,a 2269 ;; handle interrupt 2270 ;; epilogue 0A18 D0 86 2271 pop dps 0A1A D0 D0 2272 pop psw 0A1C D0 83 2273 pop dph0 0A1E D0 82 2274 pop dpl0 0A20 D0 F0 2275 pop b 0A22 D0 E0 2276 pop acc 0A24 32 2277 reti 2278 0A25 2279 usb_suspend_isr: 0A25 C0 E0 2280 push acc 0A27 C0 F0 2281 push b 0A29 C0 82 2282 push dpl0 0A2B C0 83 2283 push dph0 0A2D C0 D0 2284 push psw 0A2F 75 D0 00 2285 mov psw,#0x00 0A32 C0 86 2286 push dps 0A34 75 86 00 2287 mov dps,#0 2288 ;; clear interrupt 0A37 E5 91 2289 mov a,exif 0A39 C2 E4 2290 clr acc.4 0A3B F5 91 2291 mov exif,a 0A3D 90 7F AB 2292 mov dptr,#USBIRQ 0A40 74 08 2293 mov a,#0x08 0A42 F0 2294 movx @dptr,a 2295 ;; handle interrupt 2296 ;; epilogue 0A43 D0 86 2297 pop dps 0A45 D0 D0 2298 pop psw 0A47 D0 83 2299 pop dph0 0A49 D0 82 2300 pop dpl0 0A4B D0 F0 2301 pop b 0A4D D0 E0 2302 pop acc 0A4F 32 2303 reti 2304 0A50 2305 usb_usbreset_isr: 0A50 C0 E0 2306 push acc 0A52 C0 F0 2307 push b 0A54 C0 82 2308 push dpl0 0A56 C0 83 2309 push dph0 0A58 C0 D0 2310 push psw 0A5A 75 D0 00 2311 mov psw,#0x00 0A5D C0 86 2312 push dps 0A5F 75 86 00 2313 mov dps,#0 2314 ;; clear interrupt 0A62 E5 91 2315 mov a,exif 0A64 C2 E4 2316 clr acc.4 0A66 F5 91 2317 mov exif,a 0A68 90 7F AB 2318 mov dptr,#USBIRQ 0A6B 74 10 2319 mov a,#0x10 0A6D F0 2320 movx @dptr,a 2321 ;; handle interrupt 2322 ;; epilogue 0A6E D0 86 2323 pop dps 0A70 D0 D0 2324 pop psw 0A72 D0 83 2325 pop dph0 0A74 D0 82 2326 pop dpl0 0A76 D0 F0 2327 pop b 0A78 D0 E0 2328 pop acc 0A7A 32 2329 reti 2330 0A7B 2331 usb_ep0in_isr: 0A7B C0 E0 2332 push acc 0A7D C0 F0 2333 push b 0A7F C0 82 2334 push dpl0 0A81 C0 83 2335 push dph0 0A83 C0 84 2336 push dpl1 0A85 C0 85 2337 push dph1 0A87 C0 D0 2338 push psw 0A89 75 D0 00 2339 mov psw,#0x00 0A8C C0 86 2340 push dps 0A8E 75 86 00 2341 mov dps,#0 0A91 C0 00 2342 push ar0 0A93 C0 07 2343 push ar7 2344 ;; clear interrupt 0A95 E5 91 2345 mov a,exif 0A97 C2 E4 2346 clr acc.4 0A99 F5 91 2347 mov exif,a 0A9B 90 7F A9 2348 mov dptr,#IN07IRQ 0A9E 74 01 2349 mov a,#0x01 0AA0 F0 2350 movx @dptr,a 2351 ;; handle interrupt 2352 2353 ;ep0install: 2354 ; mov a,#3 2355 ; sjmp ep0incs 2356 ;ep0inack: 2357 ; mov a,#2 2358 ;ep0incs: 2359 ; mov dptr,#EP0CS 2360 ; movx @dptr,a 2361 ;ep0inendisr: 2362 ;; epilogue 0AA1 D0 07 2363 pop ar7 0AA3 D0 00 2364 pop ar0 0AA5 D0 86 2365 pop dps 0AA7 D0 D0 2366 pop psw 0AA9 D0 85 2367 pop dph1 0AAB D0 84 2368 pop dpl1 0AAD D0 83 2369 pop dph0 0AAF D0 82 2370 pop dpl0 0AB1 D0 F0 2371 pop b 0AB3 D0 E0 2372 pop acc 0AB5 32 2373 reti 2374 0AB6 2375 usb_ep0out_isr: 0AB6 C0 E0 2376 push acc 0AB8 C0 F0 2377 push b 0ABA C0 82 2378 push dpl0 0ABC C0 83 2379 push dph0 0ABE C0 84 2380 push dpl1 0AC0 C0 85 2381 push dph1 0AC2 C0 D0 2382 push psw 0AC4 75 D0 00 2383 mov psw,#0x00 0AC7 C0 86 2384 push dps 0AC9 75 86 00 2385 mov dps,#0 0ACC C0 00 2386 push ar0 0ACE C0 06 2387 push ar6 2388 ;; clear interrupt 0AD0 E5 91 2389 mov a,exif 0AD2 C2 E4 2390 clr acc.4 0AD4 F5 91 2391 mov exif,a 0AD6 90 7F AA 2392 mov dptr,#OUT07IRQ 0AD9 74 01 2393 mov a,#0x01 0ADB F0 2394 movx @dptr,a 2395 ;; handle interrupt 2396 2397 ;ep0outstall: 2398 ; mov ctrlcode,#0 2399 ; mov a,#3 2400 ; sjmp ep0outcs 2401 ;ep0outack: 2402 ; mov txwr,txtwr 2403 ; mov ctrlcode,#0 2404 ; mov a,#2 2405 ;ep0outcs: 2406 ; mov dptr,#EP0CS 2407 ; movx @dptr,a 2408 ;ep0outendisr: 2409 ;; epilogue 0ADC D0 06 2410 pop ar6 0ADE D0 00 2411 pop ar0 0AE0 D0 86 2412 pop dps 0AE2 D0 D0 2413 pop psw 0AE4 D0 85 2414 pop dph1 0AE6 D0 84 2415 pop dpl1 0AE8 D0 83 2416 pop dph0 0AEA D0 82 2417 pop dpl0 0AEC D0 F0 2418 pop b 0AEE D0 E0 2419 pop acc 0AF0 32 2420 reti 2421 0AF1 2422 fillusbintr:: 0AF1 E5 45 2423 mov a,txstate 0AF3 F5 F0 2424 mov b,a 0AF5 D2 F2 2425 setb b.2 0AF7 45 50 2426 orl a,pttforce 0AF9 B4 00 02 2427 cjne a,#0,0$ 0AFC C2 F2 2428 clr b.2 0AFE 90 C0 0E 2429 0$: mov dptr,#FSKMDISCIN 0B01 E0 2430 movx a,@dptr 0B02 A2 E6 2431 mov c,acc.6 0B04 B3 2432 cpl c 0B05 82 08 2433 anl c,extmodem 0B07 92 F3 2434 mov b.3,c 0B09 90 C0 09 2435 mov dptr,#FSKSTAT 0B0C E0 2436 movx a,@dptr 0B0D A2 E0 2437 mov c,acc.0 0B0F B0 08 2438 anl c,/extmodem 0B11 72 F3 2439 orl c,b.3 0B13 92 F3 2440 mov b.3,c 0B15 A2 0B 2441 mov c,uartempty 0B17 92 F5 2442 mov b.5,c 0B19 D3 2443 setb c 0B1A E5 53 2444 mov a,rxrd 0B1C B5 52 06 2445 cjne a,rxwr,1$ 0B1F 90 7F B8 2446 mov dptr,#(IN2CS) 0B22 E0 2447 movx a,@dptr 0B23 A2 E1 2448 mov c,acc.1 0B25 92 F4 2449 1$: mov b.4,c 2450 ;; bytewide elements 0B27 90 7E 80 2451 mov dptr,#(IN1BUF) 0B2A E5 F0 2452 mov a,b 0B2C F0 2453 movx @dptr,a 0B2D E5 48 2454 mov a,txwr 0B2F F4 2455 cpl a 0B30 25 49 2456 add a,txrd 0B32 54 0F 2457 anl a,#(TXCHUNKS-1) 0B34 90 7E 81 2458 mov dptr,#(IN1BUF+1) 0B37 F0 2459 movx @dptr,a 0B38 E5 53 2460 mov a,rxrd 0B3A F4 2461 cpl a 0B3B 25 52 2462 add a,rxwr 0B3D 04 2463 inc a 0B3E 54 1F 2464 anl a,#(RXCHUNKS-1) 0B40 90 7E 82 2465 mov dptr,#(IN1BUF+2) 0B43 F0 2466 movx @dptr,a 0B44 90 C0 04 2467 mov dptr,#FSKRSSI 0B47 E0 2468 movx a,@dptr 0B48 90 7E 83 2469 mov dptr,#(IN1BUF+3) 0B4B F0 2470 movx @dptr,a 2471 ; counter 0B4C 05 44 2472 inc irqcount 0B4E E5 44 2473 mov a,irqcount 0B50 90 7E 84 2474 mov dptr,#(IN1BUF+4) 0B53 F0 2475 movx @dptr,a 2476 ; UART buffer 0B54 75 F0 05 2477 mov b,#5 0B57 90 7E 85 2478 mov dptr,#(IN1BUF+5) 0B5A E5 6B 2479 2$: mov a,uartrd 0B5C B5 6A 07 2480 cjne a,uartwr,3$ 2481 ; set length 0B5F 90 7F B7 2482 mov dptr,#IN1BC 0B62 E5 F0 2483 mov a,b 0B64 F0 2484 movx @dptr,a 0B65 22 2485 ret 2486 0B66 24 5A 2487 3$: add a,#uartbuf 0B68 F8 2488 mov r0,a 0B69 E6 2489 mov a,@r0 0B6A F0 2490 movx @dptr,a 0B6B A3 2491 inc dptr 0B6C 05 F0 2492 inc b 0B6E E5 6B 2493 mov a,uartrd 0B70 04 2494 inc a 0B71 54 0F 2495 anl a,#0xf 0B73 F5 6B 2496 mov uartrd,a 0B75 80 E3 2497 sjmp 2$ 2498 2499 0B77 2500 usb_ep1in_isr: 0B77 C0 E0 2501 push acc 0B79 C0 F0 2502 push b 0B7B C0 82 2503 push dpl0 0B7D C0 83 2504 push dph0 0B7F C0 D0 2505 push psw 0B81 75 D0 00 2506 mov psw,#0x00 0B84 C0 86 2507 push dps 0B86 75 86 00 2508 mov dps,#0 2509 ;; clear interrupt 0B89 E5 91 2510 mov a,exif 0B8B C2 E4 2511 clr acc.4 0B8D F5 91 2512 mov exif,a 0B8F 90 7F A9 2513 mov dptr,#IN07IRQ 0B92 74 02 2514 mov a,#0x02 0B94 F0 2515 movx @dptr,a 2516 ;; handle interrupt 0B95 12 0A F1 2517 lcall fillusbintr 2518 ;; epilogue 0B98 D0 86 2519 pop dps 0B9A D0 D0 2520 pop psw 0B9C D0 83 2521 pop dph0 0B9E D0 82 2522 pop dpl0 0BA0 D0 F0 2523 pop b 0BA2 D0 E0 2524 pop acc 0BA4 32 2525 reti 2526 0BA5 2527 usb_ep1out_isr: 0BA5 C0 E0 2528 push acc 0BA7 C0 F0 2529 push b 0BA9 C0 82 2530 push dpl0 0BAB C0 83 2531 push dph0 0BAD C0 D0 2532 push psw 0BAF 75 D0 00 2533 mov psw,#0x00 0BB2 C0 86 2534 push dps 0BB4 75 86 00 2535 mov dps,#0 2536 ;; clear interrupt 0BB7 E5 91 2537 mov a,exif 0BB9 C2 E4 2538 clr acc.4 0BBB F5 91 2539 mov exif,a 0BBD 90 7F AA 2540 mov dptr,#OUT07IRQ 0BC0 74 02 2541 mov a,#0x02 0BC2 F0 2542 movx @dptr,a 2543 ;; handle interrupt 2544 ;; epilogue 0BC3 D0 86 2545 pop dps 0BC5 D0 D0 2546 pop psw 0BC7 D0 83 2547 pop dph0 0BC9 D0 82 2548 pop dpl0 0BCB D0 F0 2549 pop b 0BCD D0 E0 2550 pop acc 0BCF 32 2551 reti 2552 0BD0 2553 usb_ep2in_isr: 0BD0 C0 E0 2554 push acc 0BD2 C0 F0 2555 push b 0BD4 C0 82 2556 push dpl0 0BD6 C0 83 2557 push dph0 0BD8 C0 D0 2558 push psw 0BDA 75 D0 00 2559 mov psw,#0x00 0BDD C0 86 2560 push dps 0BDF 75 86 00 2561 mov dps,#0 2562 ;; clear interrupt 0BE2 E5 91 2563 mov a,exif 0BE4 C2 E4 2564 clr acc.4 0BE6 F5 91 2565 mov exif,a 0BE8 90 7F A9 2566 mov dptr,#IN07IRQ 0BEB 74 04 2567 mov a,#0x04 0BED F0 2568 movx @dptr,a 2569 ;; handle interrupt 2570 ;; epilogue 0BEE D0 86 2571 pop dps 0BF0 D0 D0 2572 pop psw 0BF2 D0 83 2573 pop dph0 0BF4 D0 82 2574 pop dpl0 0BF6 D0 F0 2575 pop b 0BF8 D0 E0 2576 pop acc 0BFA 32 2577 reti 2578 0BFB 2579 usb_ep2out_isr: 0BFB C0 E0 2580 push acc 0BFD C0 F0 2581 push b 0BFF C0 82 2582 push dpl0 0C01 C0 83 2583 push dph0 0C03 C0 D0 2584 push psw 0C05 75 D0 00 2585 mov psw,#0x00 0C08 C0 86 2586 push dps 0C0A 75 86 00 2587 mov dps,#0 2588 ;; clear interrupt 0C0D E5 91 2589 mov a,exif 0C0F C2 E4 2590 clr acc.4 0C11 F5 91 2591 mov exif,a 0C13 90 7F AA 2592 mov dptr,#OUT07IRQ 0C16 74 04 2593 mov a,#0x04 0C18 F0 2594 movx @dptr,a 2595 ;; handle interrupt 2596 ;; epilogue 0C19 D0 86 2597 pop dps 0C1B D0 D0 2598 pop psw 0C1D D0 83 2599 pop dph0 0C1F D0 82 2600 pop dpl0 0C21 D0 F0 2601 pop b 0C23 D0 E0 2602 pop acc 0C25 32 2603 reti 2604 0C26 2605 usb_ep3in_isr: 0C26 C0 E0 2606 push acc 0C28 C0 F0 2607 push b 0C2A C0 82 2608 push dpl0 0C2C C0 83 2609 push dph0 0C2E C0 D0 2610 push psw 0C30 75 D0 00 2611 mov psw,#0x00 0C33 C0 86 2612 push dps 0C35 75 86 00 2613 mov dps,#0 2614 ;; clear interrupt 0C38 E5 91 2615 mov a,exif 0C3A C2 E4 2616 clr acc.4 0C3C F5 91 2617 mov exif,a 0C3E 90 7F A9 2618 mov dptr,#IN07IRQ 0C41 74 08 2619 mov a,#0x08 0C43 F0 2620 movx @dptr,a 2621 ;; handle interrupt 2622 ;; epilogue 0C44 D0 86 2623 pop dps 0C46 D0 D0 2624 pop psw 0C48 D0 83 2625 pop dph0 0C4A D0 82 2626 pop dpl0 0C4C D0 F0 2627 pop b 0C4E D0 E0 2628 pop acc 0C50 32 2629 reti 2630 0C51 2631 usb_ep3out_isr: 0C51 C0 E0 2632 push acc 0C53 C0 F0 2633 push b 0C55 C0 82 2634 push dpl0 0C57 C0 83 2635 push dph0 0C59 C0 D0 2636 push psw 0C5B 75 D0 00 2637 mov psw,#0x00 0C5E C0 86 2638 push dps 0C60 75 86 00 2639 mov dps,#0 2640 ;; clear interrupt 0C63 E5 91 2641 mov a,exif 0C65 C2 E4 2642 clr acc.4 0C67 F5 91 2643 mov exif,a 0C69 90 7F AA 2644 mov dptr,#OUT07IRQ 0C6C 74 08 2645 mov a,#0x08 0C6E F0 2646 movx @dptr,a 2647 ;; handle interrupt 2648 ;; epilogue 0C6F D0 86 2649 pop dps 0C71 D0 D0 2650 pop psw 0C73 D0 83 2651 pop dph0 0C75 D0 82 2652 pop dpl0 0C77 D0 F0 2653 pop b 0C79 D0 E0 2654 pop acc 0C7B 32 2655 reti 2656 0C7C 2657 usb_ep4in_isr: 0C7C C0 E0 2658 push acc 0C7E C0 F0 2659 push b 0C80 C0 82 2660 push dpl0 0C82 C0 83 2661 push dph0 0C84 C0 D0 2662 push psw 0C86 75 D0 00 2663 mov psw,#0x00 0C89 C0 86 2664 push dps 0C8B 75 86 00 2665 mov dps,#0 2666 ;; clear interrupt 0C8E E5 91 2667 mov a,exif 0C90 C2 E4 2668 clr acc.4 0C92 F5 91 2669 mov exif,a 0C94 90 7F A9 2670 mov dptr,#IN07IRQ 0C97 74 10 2671 mov a,#0x10 0C99 F0 2672 movx @dptr,a 2673 ;; handle interrupt 2674 ;; epilogue 0C9A D0 86 2675 pop dps 0C9C D0 D0 2676 pop psw 0C9E D0 83 2677 pop dph0 0CA0 D0 82 2678 pop dpl0 0CA2 D0 F0 2679 pop b 0CA4 D0 E0 2680 pop acc 0CA6 32 2681 reti 2682 0CA7 2683 usb_ep4out_isr: 0CA7 C0 E0 2684 push acc 0CA9 C0 F0 2685 push b 0CAB C0 82 2686 push dpl0 0CAD C0 83 2687 push dph0 0CAF C0 D0 2688 push psw 0CB1 75 D0 00 2689 mov psw,#0x00 0CB4 C0 86 2690 push dps 0CB6 75 86 00 2691 mov dps,#0 2692 ;; clear interrupt 0CB9 E5 91 2693 mov a,exif 0CBB C2 E4 2694 clr acc.4 0CBD F5 91 2695 mov exif,a 0CBF 90 7F AA 2696 mov dptr,#OUT07IRQ 0CC2 74 10 2697 mov a,#0x10 0CC4 F0 2698 movx @dptr,a 2699 ;; handle interrupt 2700 ;; epilogue 0CC5 D0 86 2701 pop dps 0CC7 D0 D0 2702 pop psw 0CC9 D0 83 2703 pop dph0 0CCB D0 82 2704 pop dpl0 0CCD D0 F0 2705 pop b 0CCF D0 E0 2706 pop acc 0CD1 32 2707 reti 2708 0CD2 2709 usb_ep5in_isr: 0CD2 C0 E0 2710 push acc 0CD4 C0 F0 2711 push b 0CD6 C0 82 2712 push dpl0 0CD8 C0 83 2713 push dph0 0CDA C0 D0 2714 push psw 0CDC 75 D0 00 2715 mov psw,#0x00 0CDF C0 86 2716 push dps 0CE1 75 86 00 2717 mov dps,#0 2718 ;; clear interrupt 0CE4 E5 91 2719 mov a,exif 0CE6 C2 E4 2720 clr acc.4 0CE8 F5 91 2721 mov exif,a 0CEA 90 7F A9 2722 mov dptr,#IN07IRQ 0CED 74 20 2723 mov a,#0x20 0CEF F0 2724 movx @dptr,a 2725 ;; handle interrupt 2726 ;; epilogue 0CF0 D0 86 2727 pop dps 0CF2 D0 D0 2728 pop psw 0CF4 D0 83 2729 pop dph0 0CF6 D0 82 2730 pop dpl0 0CF8 D0 F0 2731 pop b 0CFA D0 E0 2732 pop acc 0CFC 32 2733 reti 2734 0CFD 2735 usb_ep5out_isr: 0CFD C0 E0 2736 push acc 0CFF C0 F0 2737 push b 0D01 C0 82 2738 push dpl0 0D03 C0 83 2739 push dph0 0D05 C0 D0 2740 push psw 0D07 75 D0 00 2741 mov psw,#0x00 0D0A C0 86 2742 push dps 0D0C 75 86 00 2743 mov dps,#0 2744 ;; clear interrupt 0D0F E5 91 2745 mov a,exif 0D11 C2 E4 2746 clr acc.4 0D13 F5 91 2747 mov exif,a 0D15 90 7F AA 2748 mov dptr,#OUT07IRQ 0D18 74 20 2749 mov a,#0x20 0D1A F0 2750 movx @dptr,a 2751 ;; handle interrupt 2752 ;; epilogue 0D1B D0 86 2753 pop dps 0D1D D0 D0 2754 pop psw 0D1F D0 83 2755 pop dph0 0D21 D0 82 2756 pop dpl0 0D23 D0 F0 2757 pop b 0D25 D0 E0 2758 pop acc 0D27 32 2759 reti 2760 0D28 2761 usb_ep6in_isr: 0D28 C0 E0 2762 push acc 0D2A C0 F0 2763 push b 0D2C C0 82 2764 push dpl0 0D2E C0 83 2765 push dph0 0D30 C0 D0 2766 push psw 0D32 75 D0 00 2767 mov psw,#0x00 0D35 C0 86 2768 push dps 0D37 75 86 00 2769 mov dps,#0 2770 ;; clear interrupt 0D3A E5 91 2771 mov a,exif 0D3C C2 E4 2772 clr acc.4 0D3E F5 91 2773 mov exif,a 0D40 90 7F A9 2774 mov dptr,#IN07IRQ 0D43 74 40 2775 mov a,#0x40 0D45 F0 2776 movx @dptr,a 2777 ;; handle interrupt 2778 ;; epilogue 0D46 D0 86 2779 pop dps 0D48 D0 D0 2780 pop psw 0D4A D0 83 2781 pop dph0 0D4C D0 82 2782 pop dpl0 0D4E D0 F0 2783 pop b 0D50 D0 E0 2784 pop acc 0D52 32 2785 reti 2786 0D53 2787 usb_ep6out_isr: 0D53 C0 E0 2788 push acc 0D55 C0 F0 2789 push b 0D57 C0 82 2790 push dpl0 0D59 C0 83 2791 push dph0 0D5B C0 D0 2792 push psw 0D5D 75 D0 00 2793 mov psw,#0x00 0D60 C0 86 2794 push dps 0D62 75 86 00 2795 mov dps,#0 2796 ;; clear interrupt 0D65 E5 91 2797 mov a,exif 0D67 C2 E4 2798 clr acc.4 0D69 F5 91 2799 mov exif,a 0D6B 90 7F AA 2800 mov dptr,#OUT07IRQ 0D6E 74 40 2801 mov a,#0x40 0D70 F0 2802 movx @dptr,a 2803 ;; handle interrupt 2804 ;; epilogue 0D71 D0 86 2805 pop dps 0D73 D0 D0 2806 pop psw 0D75 D0 83 2807 pop dph0 0D77 D0 82 2808 pop dpl0 0D79 D0 F0 2809 pop b 0D7B D0 E0 2810 pop acc 0D7D 32 2811 reti 2812 0D7E 2813 usb_ep7in_isr: 0D7E C0 E0 2814 push acc 0D80 C0 F0 2815 push b 0D82 C0 82 2816 push dpl0 0D84 C0 83 2817 push dph0 0D86 C0 D0 2818 push psw 0D88 75 D0 00 2819 mov psw,#0x00 0D8B C0 86 2820 push dps 0D8D 75 86 00 2821 mov dps,#0 2822 ;; clear interrupt 0D90 E5 91 2823 mov a,exif 0D92 C2 E4 2824 clr acc.4 0D94 F5 91 2825 mov exif,a 0D96 90 7F A9 2826 mov dptr,#IN07IRQ 0D99 74 80 2827 mov a,#0x80 0D9B F0 2828 movx @dptr,a 2829 ;; handle interrupt 2830 ;; epilogue 0D9C D0 86 2831 pop dps 0D9E D0 D0 2832 pop psw 0DA0 D0 83 2833 pop dph0 0DA2 D0 82 2834 pop dpl0 0DA4 D0 F0 2835 pop b 0DA6 D0 E0 2836 pop acc 0DA8 32 2837 reti 2838 0DA9 2839 usb_ep7out_isr: 0DA9 C0 E0 2840 push acc 0DAB C0 F0 2841 push b 0DAD C0 82 2842 push dpl0 0DAF C0 83 2843 push dph0 0DB1 C0 D0 2844 push psw 0DB3 75 D0 00 2845 mov psw,#0x00 0DB6 C0 86 2846 push dps 0DB8 75 86 00 2847 mov dps,#0 2848 ;; clear interrupt 0DBB E5 91 2849 mov a,exif 0DBD C2 E4 2850 clr acc.4 0DBF F5 91 2851 mov exif,a 0DC1 90 7F AA 2852 mov dptr,#OUT07IRQ 0DC4 74 80 2853 mov a,#0x80 0DC6 F0 2854 movx @dptr,a 2855 ;; handle interrupt 2856 ;; epilogue 0DC7 D0 86 2857 pop dps 0DC9 D0 D0 2858 pop psw 0DCB D0 83 2859 pop dph0 0DCD D0 82 2860 pop dpl0 0DCF D0 F0 2861 pop b 0DD1 D0 E0 2862 pop acc 0DD3 32 2863 reti 2864 2865 ;; ----------------------------------------------------- 2866 ;; USB descriptors 2867 ;; ----------------------------------------------------- 2868 2869 ;; Device and/or Interface Class codes 0000 2870 USB_CLASS_PER_INTERFACE = 0 0001 2871 USB_CLASS_AUDIO = 1 0002 2872 USB_CLASS_COMM = 2 0003 2873 USB_CLASS_HID = 3 0007 2874 USB_CLASS_PRINTER = 7 0008 2875 USB_CLASS_MASS_STORAGE = 8 0009 2876 USB_CLASS_HUB = 9 00FF 2877 USB_CLASS_VENDOR_SPEC = 0xff 2878 2879 ;; Descriptor types 0001 2880 USB_DT_DEVICE = 0x01 0002 2881 USB_DT_CONFIG = 0x02 0003 2882 USB_DT_STRING = 0x03 0004 2883 USB_DT_INTERFACE = 0x04 0005 2884 USB_DT_ENDPOINT = 0x05 2885 2886 ;; Standard requests 0000 2887 USB_REQ_GET_STATUS = 0x00 0001 2888 USB_REQ_CLEAR_FEATURE = 0x01 0003 2889 USB_REQ_SET_FEATURE = 0x03 0005 2890 USB_REQ_SET_ADDRESS = 0x05 0006 2891 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2892 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2893 USB_REQ_GET_CONFIGURATION = 0x08 0009 2894 USB_REQ_SET_CONFIGURATION = 0x09 000A 2895 USB_REQ_GET_INTERFACE = 0x0A 000B 2896 USB_REQ_SET_INTERFACE = 0x0B 000C 2897 USB_REQ_SYNCH_FRAME = 0x0C 2898 2899 ;; USB Request Type and Endpoint Directions 0000 2900 USB_DIR_OUT = 0 0080 2901 USB_DIR_IN = 0x80 2902 0000 2903 USB_TYPE_STANDARD = (0x00 << 5) 0020 2904 USB_TYPE_CLASS = (0x01 << 5) 0040 2905 USB_TYPE_VENDOR = (0x02 << 5) 0060 2906 USB_TYPE_RESERVED = (0x03 << 5) 2907 0000 2908 USB_RECIP_DEVICE = 0x00 0001 2909 USB_RECIP_INTERFACE = 0x01 0002 2910 USB_RECIP_ENDPOINT = 0x02 0003 2911 USB_RECIP_OTHER = 0x03 2912 2913 ;; Request target types. 0000 2914 USB_RT_DEVICE = 0x00 0001 2915 USB_RT_INTERFACE = 0x01 0002 2916 USB_RT_ENDPOINT = 0x02 2917 BAC0 2918 VENDID = 0xbac0 6136 2919 PRODID = 0x6136 2920 0DD4 2921 devicedescr: 0DD4 12 2922 .db 18 ; bLength 0DD5 01 2923 .db USB_DT_DEVICE ; bDescriptorType 0DD6 00 01 2924 .db 0x00, 0x01 ; bcdUSB 0DD8 FF 2925 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 0DD9 00 2926 .db 0 ; bDeviceSubClass 0DDA FF 2927 .db 0xff ; bDeviceProtocol 0DDB 40 2928 .db 0x40 ; bMaxPacketSize0 0DDC C0 BA 2929 .db VENDID ; idVendor 0DDE 36 61 2930 .db PRODID ; idProduct 0DE0 02 00 2931 .db 0x02,0x00 ; bcdDevice 0DE2 01 2932 .db 1 ; iManufacturer 0DE3 02 2933 .db 2 ; iProduct 0DE4 03 2934 .db 3 ; iSerialNumber 0DE5 01 2935 .db 1 ; bNumConfigurations 2936 0DE6 2937 config0descr: 0DE6 09 2938 .db 9 ; bLength 0DE7 02 2939 .db USB_DT_CONFIG ; bDescriptorType 0DE8 45 00 2940 .db config0sz ; wTotalLength 0DEA 01 2941 .db 1 ; bNumInterfaces 0DEB 01 2942 .db 1 ; bConfigurationValue 0DEC 00 2943 .db 0 ; iConfiguration 0DED 40 2944 .db 0b01000000 ; bmAttributs (self powered) 0DEE 00 2945 .db 0 ; MaxPower (mA/2) (self powered so 0) 2946 ;; interface descriptor I0:A0 0DEF 09 2947 .db 9 ; bLength 0DF0 04 2948 .db USB_DT_INTERFACE ; bDescriptorType 0DF1 00 2949 .db 0 ; bInterfaceNumber 0DF2 00 2950 .db 0 ; bAlternateSetting 0DF3 03 2951 .db 3 ; bNumEndpoints 0DF4 FF 2952 .db 0xff ; bInterfaceClass (vendor specific) 0DF5 00 2953 .db 0x00 ; bInterfaceSubClass 0DF6 FF 2954 .db 0xff ; bInterfaceProtocol (vendor specific) 0DF7 00 2955 .db 0 ; iInterface 2956 ;; endpoint descriptor I0:A0:E0 0DF8 07 2957 .db 7 ; bLength 0DF9 05 2958 .db USB_DT_ENDPOINT ; bDescriptorType 0DFA 81 2959 .db (USB_DIR_IN | 1) ; bEndpointAddress 0DFB 02 2960 .db 0x02 ; bmAttributes (bulk) 0DFC 40 00 2961 .db 0x40,0x00 ; wMaxPacketSize 0DFE 00 2962 .db 0 ; bInterval 2963 ;; endpoint descriptor I0:A0:E1 0DFF 07 2964 .db 7 ; bLength 0E00 05 2965 .db USB_DT_ENDPOINT ; bDescriptorType 0E01 82 2966 .db (USB_DIR_IN | 2) ; bEndpointAddress 0E02 02 2967 .db 0x02 ; bmAttributes (bulk) 0E03 40 00 2968 .db 0x40,0x00 ; wMaxPacketSize 0E05 00 2969 .db 0 ; bInterval 2970 ;; endpoint descriptor I0:A0:E2 0E06 07 2971 .db 7 ; bLength 0E07 05 2972 .db USB_DT_ENDPOINT ; bDescriptorType 0E08 02 2973 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0E09 02 2974 .db 0x02 ; bmAttributes (bulk) 0E0A 40 00 2975 .db 0x40,0x00 ; wMaxPacketSize 0E0C 00 2976 .db 0 ; bInterval 2977 ;; interface descriptor I0:A1 0E0D 09 2978 .db 9 ; bLength 0E0E 04 2979 .db USB_DT_INTERFACE ; bDescriptorType 0E0F 00 2980 .db 0 ; bInterfaceNumber 0E10 01 2981 .db 1 ; bAlternateSetting 0E11 03 2982 .db 3 ; bNumEndpoints 0E12 FF 2983 .db 0xff ; bInterfaceClass (vendor specific) 0E13 00 2984 .db 0x00 ; bInterfaceSubClass 0E14 FF 2985 .db 0xff ; bInterfaceProtocol (vendor specific) 0E15 00 2986 .db 0 ; iInterface 2987 ;; endpoint descriptor I0:A1:E0 0E16 07 2988 .db 7 ; bLength 0E17 05 2989 .db USB_DT_ENDPOINT ; bDescriptorType 0E18 81 2990 .db (USB_DIR_IN | 1) ; bEndpointAddress 0E19 03 2991 .db 0x03 ; bmAttributes (interrupt) 0E1A 40 00 2992 .db 0x40,0x00 ; wMaxPacketSize 0E1C 0A 2993 .db 10 ; bInterval 2994 ;; endpoint descriptor I0:A1:E1 0E1D 07 2995 .db 7 ; bLength 0E1E 05 2996 .db USB_DT_ENDPOINT ; bDescriptorType 0E1F 82 2997 .db (USB_DIR_IN | 2) ; bEndpointAddress 0E20 02 2998 .db 0x02 ; bmAttributes (bulk) 0E21 40 00 2999 .db 0x40,0x00 ; wMaxPacketSize 0E23 00 3000 .db 0 ; bInterval 3001 ;; endpoint descriptor I0:A1:E2 0E24 07 3002 .db 7 ; bLength 0E25 05 3003 .db USB_DT_ENDPOINT ; bDescriptorType 0E26 02 3004 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0E27 02 3005 .db 0x02 ; bmAttributes (bulk) 0E28 40 00 3006 .db 0x40,0x00 ; wMaxPacketSize 0E2A 00 3007 .db 0 ; bInterval 3008 0045 3009 config0sz = . - config0descr 3010 0E2B 3011 stringdescr: 0E2B 33 0E 3012 .db string0 0E2D 37 0E 3013 .db string1 0E2F 45 0E 3014 .db string2 0E31 61 0E 3015 .db stringserial 3016 0004 3017 numstrings = (. - stringdescr)/2 3018 0E33 3019 string0: 0E33 04 3020 .db string0sz ; bLength 0E34 03 3021 .db USB_DT_STRING ; bDescriptorType 0E35 00 00 3022 .db 0,0 ; LANGID[0]: Lang Neutral 0004 3023 string0sz = . - string0 3024 0E37 3025 string1: 0E37 0E 3026 .db string1sz ; bLength 0E38 03 3027 .db USB_DT_STRING ; bDescriptorType 0E39 42 00 61 00 79 00 3028 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 3029 string1sz = . - string1 3030 0E45 3031 string2: 0E45 1C 3032 .db string2sz ; bLength 0E46 03 3033 .db USB_DT_STRING ; bDescriptorType 0E47 55 00 53 00 42 00 3034 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0E57 28 00 46 00 53 00 3035 .db '(,0,'F,0,'S,0,'K,0,'),0 4B 00 29 00 001C 3036 string2sz = . - string2 3037 0E61 3038 stringserial: 0E61 02 3039 .db 2 ; bLength 0E62 03 3040 .db USB_DT_STRING ; bDescriptorType 0E63 00 00 00 00 00 00 3041 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0E73 00 00 00 00 00 00 3042 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 3043 baycomusb-0.10.orig/firmware/fskfirmware/main.map0100644000175100017510000000665507340435154020210 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 s_OSEG 0000 l__CODE 0000 s__CODE 0000 s_CODE 0000 s_BSEG 0000 l_OSEG 0008 l_GSINIT 000C l_BSEG 0031 l_DSEG 0040 s_DSEG 0080 l_ISEG 0080 s_ISEG 0157 l_CODE 0157 s_CSEG 0160 l_GSINIT2 0C00 l_XSEG 0D2C l_CSEG 0E83 s_GSINIT 0E8B s_GSINIT2 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 0157 = 343. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 0157 0D2C = 3372. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:0AF1 fillusbintr Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT 0E83 0008 = 8. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT2 0E8B 0160 = 352. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ OSEG 0000 0000 = 0. bytes (REL,OVR) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 000C = 12. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0080 = 128. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 0031 = 49. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 0C00 = 3072. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/fskfirmware/main.asm0100644000175100017510000013632507340251057020207 0ustar abaaba .module main ;; ENDPOINTS ;; EP0 in/out Control ;; EP1 in Interrupt: Status ;; Byte 0: Modem Status ;; Bit 0-1: Transmitter status ;; 0: idle (off) ;; 1: keyup ;; 2: transmitting packets ;; 3: tail ;; Bit 2: PTT status (1=on) ;; Bit 3: DCD ;; Bit 4: RXB (Rx Packet Ready) ;; Bit 5: UART transmitter empty ;; Bit 6-7: unused ;; Byte 1: Number of empty 64 byte chunks in TX fifo ;; Byte 2: Number of full 64 byte chunks in RX fifo ;; Byte 3: RSSI value ;; Byte 4: IRQ count ;; Byte 5-20: (as needed) UART receiver chars ;; EP2 out Packets to be transmitted ;; EP2 in Received packets; note they have the CRC appended ;; COMMAND LIST ;; C0 C0 read status (max. 23 bytes, first 6 same as EP1 in) ;; C0 C8 read mode ;; Return: ;; Byte 0: 1 (MODE_FSK) or 2 (MODE_EXTERNAL) ;; C0 C9 return serial number string ;; C0 D0 get/set PTT/DCD/RSSI ;; wIndex = 1: set forced ptt to wValue ;; Return: ;; Byte 0: PTT status ;; Byte 1: DCD status ;; Byte 2: RSSI status ;; C0 D1 get Bitrate ;; Return: ;; Byte 0-2: TX Bitrate ;; Byte 3-5: RX Bitrate ;; 40 D2 set CON/STA led ;; Bits 0-1 of wValue ;; 40 D3 send byte to UART ;; Byte in wValue ;; C0 D4 get/set modem disconnect port (only if internal modem used, stalls otherwise) ;; wIndex = 1: write wValue to output register ;; wIndex = 2: write wValue to tristate mask register (1 = input, 0 = output) ;; Return: ;; Byte 0: Modem Disconnect Input ;; Byte 1: Modem Disconnect Output register ;; Byte 2: Modem Disconnect Tristate register ;; C0 D5 get/set T7F port ;; wIndex = 1: write wValue to T7F output register ;; Return: ;; Byte 0: T7F Input ;; Byte 1: T7F Output register ;; define code segments link order .area CODE (CODE) .area CSEG (CODE) .area GSINIT (CODE) .area GSINIT2 (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; Xilinx FPGA registers FSKRXCNT = 0xc001 FSKRXDATA = 0xc002 FSKRXFLAG = 0xc003 FSKTXCNT = 0xc000 FSKTXDATA = 0xc000 FSKTXCRC = 0xc001 FSKTXRAW = 0xc002 FSKTXRAWCLR = 0xc003 FSKRSSI = 0xc004 FSKCTRL = 0xc008 FSKSTAT = 0xc009 FSKT7FOUT = 0xc00a FSKT7FIN = 0xc00b FSKMDISCTRIS = 0xc00c FSKMDISCOUT = 0xc00d FSKMDISCIN = 0xc00e ;; ----------------------------------------------------- .area CODE (CODE) ljmp startup ljmp int0_isr .ds 5 ljmp timer0_isr .ds 5 ljmp int1_isr .ds 5 ljmp timer1_isr .ds 5 ljmp ser0_isr .ds 5 ljmp timer2_isr .ds 5 ljmp resume_isr .ds 5 ljmp ser1_isr .ds 5 ljmp usb_isr .ds 5 ljmp i2c_isr .ds 5 ljmp int4_isr .ds 5 ljmp int5_isr .ds 5 ljmp int6_isr ;; Parameter block at 0xe0 .ds 0x7a parbitratetx: .db 0,0,0 parbitraterx: .db 0,0,0 parextmodem: .db 0 parpttmute: .db 1 ;; Serial# string at 0xf0 .ds 8 parserial: .db '0,'0,'0,'0,'0,'0,'0,'0,0 .ds 7 ;; USB interrupt dispatch table usb_isr: ljmp usb_sudav_isr .ds 1 ljmp usb_sof_isr .ds 1 ljmp usb_sutok_isr .ds 1 ljmp usb_suspend_isr .ds 1 ljmp usb_usbreset_isr .ds 1 reti .ds 3 ljmp usb_ep0in_isr .ds 1 ljmp usb_ep0out_isr .ds 1 ljmp usb_ep1in_isr .ds 1 ljmp usb_ep1out_isr .ds 1 ljmp usb_ep2in_isr .ds 1 ljmp usb_ep2out_isr .ds 1 ljmp usb_ep3in_isr .ds 1 ljmp usb_ep3out_isr .ds 1 ljmp usb_ep4in_isr .ds 1 ljmp usb_ep4out_isr .ds 1 ljmp usb_ep5in_isr .ds 1 ljmp usb_ep5out_isr .ds 1 ljmp usb_ep6in_isr .ds 1 ljmp usb_ep6out_isr .ds 1 ljmp usb_ep7in_isr .ds 1 ljmp usb_ep7out_isr ;; ----------------------------------------------------- RXCHUNKS = 32 TXCHUNKS = 16 DEBUGIOCOPY = 0 DEBUGRECEIVER = 0 .area OSEG (OVR,DATA) .area BSEG (BIT) ctrl_ptt: .ds 1 ctrl_pttmute: .ds 1 ctrl_ledptt: .ds 1 ctrl_leddcdsrc: .ds 1 ctrl_clksel: .ds 1 ; not implemented ctrl_indacd: .ds 1 ctrl_indacz: .ds 1 ctrl_txdsrc: .ds 1 ctrlreg = 0x20 ; ((ctrl_ptt/8)+0x20) extmodem: .ds 1 pttmute: .ds 1 pttforcechg: .ds 1 uartempty: .ds 1 .area ISEG (DATA) txbcnt: .ds TXCHUNKS rxbcnt: .ds RXCHUNKS stack: .ds 0x80-RXCHUNKS-TXCHUNKS .area DSEG (DATA) ctrlcode: .ds 1 ctrlcount: .ds 2 leddiv: .ds 1 irqcount: .ds 1 ;; transmitter variables txstate: .ds 1 flagcnt: .ds 2 txwr: .ds 1 txrd: .ds 1 txtwr: .ds 1 txcnt: .ds 1 txaddr: .ds 2 txbptr: .ds 1 txskip: .ds 1 pttforce: .ds 1 ;; receiver variables rxstate: .ds 1 rxwr: .ds 1 rxrd: .ds 1 rxtwr: .ds 1 rxcnt: .ds 1 rxcntc: .ds 1 rxaddr: .ds 2 tmprxcnt: .ds 1 ;; UART receiver uartbuf: .ds 16 uartwr: .ds 1 uartrd: .ds 1 ;; Port state t7fout: .ds 1 mdisctris: .ds 1 mdiscout: .ds 1 ;; USB state numconfig: .ds 1 altsetting: .ds 1 .area XSEG (DATA) txbuf: .ds TXCHUNKS*64 rxbuf: .ds RXCHUNKS*64 .area GSINIT (CODE) startup: mov sp,#stack ; -1 clr a mov psw,a mov dps,a ;lcall __sdcc_external_startup ;mov a,dpl0 ;jz __sdcc_init_data ;ljmp __sdcc_program_startup __sdcc_init_data: .area GSINIT2 (CODE) __sdcc_program_startup: ;; assembler code startup clr a mov txstate,a mov txwr,a mov txrd,a mov txtwr,a mov pttforce,a mov rxstate,a mov rxwr,a mov rxrd,a mov rxtwr,a mov irqcount,a mov uartrd,a mov uartwr,a mov dps,a setb uartempty ;; some indirect register setup mov ckcon,#0x30 ; zero external wait states, to avoid chip bugs ;; Timer setup: ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 mov tmod,#0x21 mov tcon,#0x55 ; INT0/INT1 edge mov th1,#256-156 ; 1200 bauds mov pcon,#0 ; SMOD0=0 ;; init USB subsystem mov dptr,#ISOCTL mov a,#1 ; disable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a clr a mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR mov a,#0x9 ; pair EP 2&3 for input & output movx @dptr,a mov dptr,#IN07VAL mov a,#0x7 ; enable EP0+EP1+EP2 movx @dptr,a mov dptr,#OUT07VAL mov a,#0x5 ; enable EP0+EP2 movx @dptr,a ;; USB: init endpoint toggles mov dptr,#TOGCTL mov a,#0x12 movx @dptr,a mov a,#0x32 ; clear EP 2 in toggle movx @dptr,a mov a,#0x02 movx @dptr,a mov a,#0x22 ; clear EP 2 out toggle movx @dptr,a ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x82 ; set PROG hi movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0xc3 ; RD/WR/TXD0/RXD0 are special function pins movx @dptr,a mov dptr,#OUTC mov a,#0x28 movx @dptr,a mov dptr,#OEC mov a,#0x2a ; out: LEDCON,LEDSTA,TCK in: TDO,INIT movx @dptr,a ;; enable interrupts mov ie,#0x92 ; enable timer 0 and ser 0 int mov eie,#0x01 ; enable USB interrupts mov dptr,#USBIEN mov a,#1 ; enable SUDAV interrupt movx @dptr,a mov dptr,#IN07IEN mov a,#3 ; enable EP0+EP1 interrupt movx @dptr,a mov dptr,#OUT07IEN mov a,#1 ; enable EP0 interrupt movx @dptr,a ;; initialize UART 0 for T7F communication mov scon0,#0x52 ; Mode 1, Timer 1, Receiver enable ;; Copy serial number mov r0,#parserial mov dptr,#stringserial+2 1$: movx a,@r0 jz 2$ movx @dptr,a inc dptr inc dptr inc r0 sjmp 1$ 2$: mov a,r0 add a,#1-0xf0 ; 1-parserial add a,acc mov dptr,#stringserial movx @dptr,a ;; copy configuration to bit addressable variables cpyconfig: mov ctrlreg,#0x42 mov r0,#parextmodem movx a,@r0 mov c,acc.0 mov extmodem,c mov ctrl_txdsrc,c mov ctrl_leddcdsrc,c mov r0,#parpttmute movx a,@r0 mov c,acc.0 mov pttmute,c mov ctrl_pttmute,c ;; turn off transmitter mov a,ctrlreg mov dptr,#FSKCTRL movx @dptr,a ;; send reset pulse to external modem if selected mov dptr,#FSKMDISCTRIS mov a,#0xff movx @dptr,a mov mdisctris,a jnb extmodem,3$ mov a,#0x67 ; RESET, RTS and TxD are outputs movx @dptr,a mov dptr,#FSKMDISCOUT mov a,#0x7f ; activate RESET movx @dptr,a 3$: mov dptr,#FSKT7FOUT mov a,#0x1f movx @dptr,a mov t7fout,a ;; initialize USB state clr a mov numconfig,a mov altsetting,a ;; give Windows a chance to finish the writecpucs control transfer ;; 20ms delay loop mov dptr,#(-12000)&0xffff 2$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 2$ ; 3 cycles .if 1 ;; disconnect from USB bus mov dptr,#USBCS mov a,#10 movx @dptr,a ;; wait 0.3 sec mov r2,#30 ;; 10ms delay loop 0$: mov dptr,#(-6000)&0xffff 1$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 1$ ; 3 cycles djnz r2,0$ ;; reconnect to USB bus mov dptr,#USBCS ;mov a,#2 ; 8051 handles control ;movx @dptr,a mov a,#6 ; reconnect, 8051 handles control movx @dptr,a .endif ;; terminate reset pulse to external modem if selected jnb extmodem,4$ mov dptr,#FSKMDISCOUT mov a,#0xff ; deactivate RESET movx @dptr,a mov mdiscout,a 4$: ;; preinit RAM for debugging purposes (optional) .if 0 inittxbuf: mov r7,#TXCHUNKS mov dptr,#txbuf mov a,#0x55+1 0$: mov r6,#64 1$: movx @dptr,a inc dptr djnz r6,1$ djnz r7,0$ .endif .if 0 initrxbuf: mov r7,#RXCHUNKS mov dptr,#rxbuf mov a,#0xaa 0$: mov r6,#64 1$: movx @dptr,a inc dptr djnz r6,1$ djnz r7,0$ .endif ;; final lcall fillusbintr ;; kludge; first OUT2 packet seems to be bogus ;; wait for packet with length 1 and contents 0x55 waitpkt1: mov dptr,#OUT2CS movx a,@dptr jb acc.1,waitpkt1 mov dptr,#OUT2BC movx a,@dptr cjne a,#1,0$ mov dptr,#OUT2BUF movx a,@dptr cjne a,#0x55,0$ mov dptr,#OUT2BC movx @dptr,a sjmp pkt1received 0$: mov dptr,#OUT2BC movx @dptr,a sjmp waitpkt1 ;; clear RX FIFO pkt1received: mov dptr,#FSKRXFLAG mov r7,#64 1$: movx a,@dptr djnz r7,1$ ;; start normal operation ljmp mainloop .area CSEG (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 ;; WARNING! The assembler doesn't check for ;; out of range short jump labels!! Double check ;; that the jump labels are within the range! setptt: mov a,txstate orl a,pttforce jz pttoff ptton: mov c,extmodem jnc 0$ mov dptr,#FSKMDISCOUT mov a,#0xef movx @dptr,a 0$: mov ctrl_pttmute,c cpl c mov ctrl_ptt,c setb ctrl_ledptt mov a,ctrlreg mov dptr,#FSKCTRL movx @dptr,a ret pttoff: clr ctrl_ptt mov c,extmodem jnc 3$ mov dptr,#FSKMDISCOUT mov a,#0xff movx @dptr,a 3$: orl c,pttmute mov ctrl_pttmute,c clr ctrl_ledptt mov a,ctrlreg mov dptr,#FSKCTRL movx @dptr,a ret mainloop: ;; debug: copyloop .if DEBUGIOCOPY iocopyloop: mov a,txrd cjne a,txwr,0$ ljmp iocopyloop 1$: mov a,@r0 mov @r1,a jz 3$ mov r7,a 4$: inc dps movx a,@dptr inc dptr dec dps movx @dptr,a inc dptr djnz r7,4$ 3$: mov a,txrd inc a anl a,#(TXCHUNKS-1) mov txrd,a mov a,@r0 add a,#-0x40 jc 5$ mov rxwr,rxtwr 5$: ljmp iocopyloop 0$: ;; txpointers add a,#txbcnt mov r0,a .if 1 mov a,txrd rr a rr a mov dpl1,a anl a,#0xc0 add a,#txbuf mov dph1,a .else mov a,txrd rr a rr a mov dpl1,a anl a,#0xc0 xch a,dpl1 anl a,#0x3f add a,#>txbuf mov dph1,a .endif ;; rxpointers mov a,rxtwr add a,#rxbcnt mov r1,a .if 1 mov a,rxtwr rr a rr a mov dpl0,a anl a,#0xc0 add a,#rxbuf mov dph0,a .else mov a,rxtwr rr a rr a mov dpl0,a anl a,#0xc0 xch a,dpl0 anl a,#0x3f add a,#>rxbuf mov dph0,a .endif ;; update rxpointer mov a,rxtwr inc a anl a,#(RXCHUNKS-1) mov rxtwr,a cjne a,rxrd,1$ ljmp iocopyloop .endif ;; first do TX txstartloop: ;; check if idle or new packet mov a,txstate jz txchknewpkt cjne a,#2,txflagprepare ljmp txchunkstart txchknewpkt: mov a,txwr cjne a,txrd,txbufnempty jbc pttforcechg,txidlepttforce rxstartloop1: ljmp rxstartloop txidlepttforce: lcall setptt ljmp rxstartloop txbufnempty: ;; start txdelay ;; check length of first packet mov a,txrd add a,#txbcnt mov r0,a mov a,@r0 add a,#-4 jc 1$ ljmp txnextpacket 1$: ;; read the number of flags to send from the first two bytes of the first packet .if 1 mov a,txrd rr a rr a mov dpl0,a anl a,#0xc0 add a,#txbuf mov dph0,a .else mov a,txrd rr a rr a mov dpl0,a anl a,#0xc0 xch a,dpl0 anl a,#0x3f add a,#>txbuf mov dph0,a .endif movx a,@dptr mov flagcnt,a inc dptr movx a,@dptr mov flagcnt+1,a inc txstate mov txskip,#2 ;; sanity check (limit txdelay to about 8s) mov r0,#parbitratetx+2 movx a,@r0 jnz 2$ mov r0,#parbitratetx+1 movx a,@r0 clr c subb a,flagcnt+1 jnc 2$ movx a,@r0 mov flagcnt+1,a 2$: ;; turn on PTT lcall ptton ;; flag send routine txflagprepare: mov dptr,#FSKTXCNT movx a,@dptr jz rxstartloop1 mov r7,a ;; check if tx ready if external modem mov dptr,#FSKMDISCIN movx a,@dptr mov dptr,#FSKTXRAWCLR mov c,acc.5 anl c,extmodem jc txflgcntbig ;clr c mov a,flagcnt mov r6,a subb a,r7 mov flagcnt,a mov a,flagcnt+1 subb a,#0 mov flagcnt+1,a jnc txflgcntbig ;; send final flags, update state mov a,r6 jz 1$ mov a,#0x7e 0$: movx @dptr,a djnz r6,0$ 1$: mov a,txstate inc a anl a,#3 mov txstate,a jnz 2$ ;; turn off PTT lcall setptt ljmp rxstartloop 2$: ljmp txnewchunk ;; send txdelay flags txflgcntbig: mov a,#0x7e 0$: movx @dptr,a djnz r7,0$ rxstartloop2: ljmp rxstartloop txnewchunk: mov a,txrd add a,#txbcnt mov txbptr,a mov r0,a mov a,@r0 cpl a inc a add a,txskip jc txnextpacket mov txcnt,a .if 1 mov a,txrd rr a rr a mov txaddr,a anl a,#0xc0 add a,txskip add a,#txbuf mov txaddr+1,a .else mov a,txrd rr a rr a mov txaddr,a anl a,#0xc0 add a,txskip xch a,txaddr anl a,#0x3f add a,#>txbuf mov txaddr+1,a .endif txchunkstart: mov dptr,#FSKTXCNT movx a,@dptr jz rxstartloop2 mov r7,a mov a,txcnt jz txchunkend add a,r7 xch a,txcnt jnc 0$ cpl a inc a mov r7,a mov txcnt,#0 0$: mov dptr,#FSKTXDATA mov dpl1,txaddr mov dph1,txaddr+1 1$: inc dps movx a,@dptr inc dptr dec dps movx @dptr,a djnz r7,1$ mov txaddr,dpl1 mov txaddr+1,dph1 sjmp txchunkstart txchunkend: mov txskip,#0 mov r0,txbptr mov a,@r0 jb acc.6,txnonewframe mov a,r7 add a,#-3 jnc rxstartloop2 mov dptr,#FSKTXCRC movx @dptr,a movx @dptr,a mov dptr,#FSKTXRAWCLR mov a,#0x7e movx @dptr,a txnextpacket: mov txskip,#2 txnonewframe: mov a,txrd inc a anl a,#TXCHUNKS-1 mov txrd,a cjne a,txwr,txnewchunk inc txstate ;; note: we need to stuff in more than 32 flags, to fill the buffer ;; (so we don't turn off PTT too early) mov flagcnt,#40 mov flagcnt+1,#0 ljmp txflagprepare .if DEBUGRECEIVER rxstartloop: mov dptr,#FSKRXCNT movx a,@dptr mov tmprxcnt,a inc dpl0 add a,#-16 jnc 2$ .if 1 mov a,rxwr rr a rr a mov dpl1,a anl a,#0xc0 add a,#rxbuf mov dph1,a .else mov a,rxwr rr a rr a mov dpl1,a anl a,#0xc0 xch a,dpl1 anl a,#0x3f add a,#>rxbuf mov dph1,a .endif mov a,rxwr add a,#rxbcnt mov r0,a mov r7,#0 0$: movx a,@dptr jb acc.5,1$ inc dps movx @dptr,a inc dptr dec dps inc r7 jb acc.7,0$ movx a,@dptr inc dps movx @dptr,a inc dptr dec dps inc r7 sjmp 0$ 1$: mov @r0,ar7 mov a,rxwr inc a anl a,#RXCHUNKS-1 mov rxwr,a mov rxtwr,a 2$: ljmp txstartloop .else usbiostart1: ljmp usbiostart ;; real receiver starts here rxstartloop: mov dptr,#FSKRXDATA mov a,rxstate jnz rxdataloopstart ;; hunt for flags sjmp $1 $0: movx a,@dptr ; read data value $1: movx a,@dptr ; read control value jb acc.5,usbiostart1 jnb acc.7,$0 rxpreparepkt: mov rxcntc,#0 mov rxstate,#1 mov a,rxwr mov rxtwr,a rxnewchunk: .if 1 mov a,rxtwr rr a rr a mov rxaddr,a anl a,#0xc0 add a,#rxbuf mov rxaddr+1,a .else mov a,rxtwr rr a rr a mov rxaddr,a anl a,#0xc0 xch a,rxaddr anl a,#0x3f add a,#>rxbuf mov rxaddr+1,a .endif mov rxcnt,#64 ljmp rxstartloop ; sjmp would be enough rxabortframe: mov rxstate,#0 ljmp rxstartloop rxdataloopstart: mov r7,rxcnt mov dpl1,rxaddr mov dph1,rxaddr+1 0$: movx a,@dptr ; read command jb acc.6,1$ movx a,@dptr inc dps movx @dptr,a inc dptr dec dps djnz r7,0$ mov a,rxtwr add a,#rxbcnt mov r0,a mov @r0,#64 mov a,rxtwr inc a anl a,#RXCHUNKS-1 cjne a,rxrd,2$ ljmp rxabortframe 2$: mov rxtwr,a inc rxcntc sjmp rxnewchunk 1$: mov rxcnt,r7 mov rxaddr,dpl1 mov rxaddr+1,dph1 jb acc.5,usbiostart1 ; empty jb acc.4,rxabortframe ; abort received anl a,#0xf cjne a,#0xe,rxpreparepkt ; CRC not ok or residue error mov a,rxtwr add a,#rxbcnt mov r0,a mov a,#64 clr c subb a,r7 mov @r0,a mov a,rxcntc jnz 3$ mov a,#-4 add a,@r0 jnc 6$ ; frame too short sjmp 4$ 3$: add a,#-8 jc 6$ ; frame too long 4$: mov a,rxtwr inc a anl a,#RXCHUNKS-1 cjne a,rxrd,5$ ljmp rxpreparepkt 5$: mov rxwr,a 6$: ljmp rxpreparepkt .endif usbiostart: ;; check for USB modem->host mov a,rxrd cjne a,rxwr,usbcheckin ;; check for USB host->modem usbcheckout: mov dptr,#OUT2CS movx a,@dptr jb acc.1,endusb2 mov a,txtwr add a,#txbcnt mov r0,a mov a,txtwr inc a anl a,#(TXCHUNKS-1) cjne a,txrd,usbout2 ljmp endusb usbout2: mov r7,a mov dptr,#OUT2BC movx a,@dptr mov @r0,a mov r5,a jz usbout3 mov r6,a .if 1 mov a,txtwr rr a rr a mov dpl1,a anl a,#0xc0 add a,#txbuf mov dph1,a .else mov a,txtwr rr a rr a mov dpl1,a anl a,#0xc0 xch a,dpl1 anl a,#0x3f add a,#>txbuf mov dph1,a .endif mov dptr,#OUT2BUF usboutloop: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r6,usboutloop usbout3: mov txtwr,r7 mov a,r5 add a,#-64 jz usbout4 mov txwr,r7 usbout4: mov dptr,#OUT2BC movx @dptr,a ; rearm OUT2 endusb2: sjmp endusb usbcheckin: mov dptr,#IN2CS movx a,@dptr jb acc.1,usbcheckout ;ljmp xxinbuf mov a,rxrd add a,#rxbcnt mov r0,a mov a,@r0 jz usbin1 mov r6,a .if 1 mov a,rxrd rr a rr a mov dpl1,a anl a,#0xc0 add a,#rxbuf mov dph1,a .else mov a,rxrd rr a rr a mov dpl1,a anl a,#0xc0 xch a,dpl1 anl a,#0x3f addc a,#>rxbuf mov dph1,a .endif mov dptr,#IN2BUF usbinloop: inc dps movx a,@dptr inc dptr dec dps movx @dptr,a inc dptr djnz r6,usbinloop usbin1: mov a,@r0 mov dptr,#IN2BC movx @dptr,a mov a,rxrd inc a anl a,#(RXCHUNKS-1) mov rxrd,a ljmp usbcheckout endusb: ljmp txstartloop ;; ------------------ interrupt handlers ------------------------ int0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+5 ;; handle interrupt .if 0 inc leddiv mov a,leddiv anl a,#7 jnz 0$ mov dptr,#OUTC movx a,@dptr xrl a,#0x08 movx @dptr,a 0$: .endif ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 ;; clear interrupt jbc scon0+0,1$ ; RI 0$: jbc scon0+1,2$ ; TI ;; handle interrupt ;; epilogue 3$: pop ar0 pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti 2$: setb uartempty sjmp 0$ 1$: mov a,uartwr add a,#uartbuf mov r0,a mov a,sbuf0 mov @r0,a mov a,uartwr inc a anl a,#0xf mov uartwr,a sjmp 3$ timer2_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr t2con+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti resume_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+4 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon1+0 clr scon1+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti i2c_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.5 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int4_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.6 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int5_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.7 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int6_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sudav_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov ctrlcode,#0 ; reset control out code mov dptr,#SETUPDAT+1 movx a,@dptr ; bRequest field ;; standard commands ;; USB_REQ_GET_DESCRIPTOR cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc mov dptr,#SETUPDAT ; bRequestType == 0x80 movx a,@dptr cjne a,#USB_DIR_IN,setupstallstd mov dptr,#SETUPDAT+3 movx a,@dptr cjne a,#USB_DT_DEVICE,cmdnotgetdescdev mov dptr,#SUDPTRH mov a,#>devicedescr movx @dptr,a inc dptr mov a,#config0descr movx @dptr,a inc dptr mov a,#stringdescr mov dph0,a movx a,@dptr mov b,a inc dptr movx a,@dptr mov dptr,#SUDPTRH movx @dptr,a inc dptr mov a,b movx @dptr,a ; sjmp setupackstd setupackstd: ljmp setupack setupstallstd: ljmp setupstall cmdnotgetdesc: ;; USB_REQ_SET_CONFIGURATION cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf mov dptr,#SETUPDAT movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr add a,#-2 jc setupstallstd movx a,@dptr mov numconfig,a cmdresettoggleshalt: mov dptr,#TOGCTL mov r0,#7 0$: mov a,r0 orl a,#0x10 movx @dptr,a orl a,#0x30 movx @dptr,a mov a,r0 movx @dptr,a orl a,#0x20 movx @dptr,a djnz r0,0$ clr a movx @dptr,a mov a,#2 mov dptr,#IN1CS mov r0,#7 1$: movx @dptr,a inc dptr inc dptr djnz r0,1$ mov dptr,#OUT1CS mov r0,#7 2$: movx @dptr,a inc dptr inc dptr djnz r0,2$ lcall fillusbintr sjmp setupackstd cmdnotsetconf: ;; USB_REQ_SET_INTERFACE cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr mov altsetting,a sjmp cmdresettoggleshalt cmdnotsetint: ;; USB_REQ_GET_INTERFACE cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr jnz setupstallstd mov a,altsetting cmdrespondonebyte: mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a sjmp setupackstd2 cmdnotgetint: ;; USB_REQ_GET_CONFIGURATION cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 mov a,numconfig sjmp cmdrespondonebyte cmdnotgetconf: ;; USB_REQ_GET_STATUS (0) jnz cmdnotgetstat mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev mov a,#1 cmdrespondstat: mov dptr,#IN0BUF movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#IN0BC mov a,#2 movx @dptr,a sjmp setupackstd2 cmdnotgetstatdev: cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf clr a sjmp cmdrespondstat cmdnotgetstatintf: cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 mov dptr,#SETUPDAT+4 movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 0$: anl a,#15 jz setupstallstd2 jb acc.3,setupstallstd2 add a,acc add a,dpl0 mov dpl0,a movx a,@dptr sjmp cmdrespondstat setupackstd2: ljmp setupack setupstallstd2: ljmp setupstall cmdnotgetstat: ;; USB_REQ_SET_FEATURE cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr mov b,#1 sjmp handleftr cmdnotsetftr: ;; USB_REQ_CLEAR_FEATURE cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr mov b,#0 handleftr: mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 inc dptr inc dptr movx a,@dptr jnz setupstallstd2 ; not ENDPOINT_HALT feature inc dptr movx a,@dptr jnz setupstallstd2 inc dptr movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 orl a,#0x10 0$: jb acc.3,setupstallstd2 ;; clear data toggle anl a,#0x1f inc dps mov dptr,#TOGCTL movx @dptr,a orl a,#0x20 movx @dptr,a anl a,#15 movx @dptr,a dec dps ;; clear/set ep halt feature add a,acc add a,dpl0 mov dpl0,a mov a,b movx @dptr,a sjmp setupackstd2 cmdnotc0_1: ljmp cmdnotc0 setupstallc0_1: ljmp setupstall cmdnotclrftr: ;; vendor specific commands ;; 0xc0 cjne a,#0xc0,cmdnotc0_1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc0_1 ;; fill status buffer mov a,txstate mov b,a setb b.2 orl a,pttforce cjne a,#0,0$ clr b.2 0$: mov dptr,#FSKMDISCIN movx a,@dptr mov c,acc.6 cpl c anl c,extmodem mov b.3,c mov dptr,#FSKSTAT movx a,@dptr mov c,acc.0 anl c,/extmodem orl c,b.3 mov b.3,c mov c,uartempty mov b.5,c clr a mov dptr,#(IN0BUF+4) movx @dptr,a ;; bytewide elements mov dptr,#(IN0BUF) mov a,b movx @dptr,a mov a,txwr cpl a add a,txrd anl a,#(TXCHUNKS-1) mov dptr,#(IN0BUF+1) movx @dptr,a mov a,rxrd cpl a add a,rxwr inc a anl a,#(RXCHUNKS-1) mov dptr,#(IN0BUF+2) movx @dptr,a mov dptr,#FSKRSSI movx a,@dptr mov dptr,#(IN0BUF+3) movx @dptr,a ;; counter inc irqcount mov a,irqcount mov dptr,#(IN0BUF+5) movx @dptr,a ;; additional fields (HDLC state mach) mov a,txstate inc dptr movx @dptr,a mov a,txrd inc dptr movx @dptr,a mov a,txwr inc dptr movx @dptr,a mov a,txtwr inc dptr movx @dptr,a mov a,txcnt inc dptr movx @dptr,a mov a,flagcnt inc dptr movx @dptr,a mov a,flagcnt+1 inc dptr movx @dptr,a mov a,rxstate inc dptr movx @dptr,a mov a,rxrd inc dptr movx @dptr,a mov a,rxwr inc dptr movx @dptr,a mov a,rxtwr inc dptr movx @dptr,a mov a,rxcnt inc dptr movx @dptr,a ;; FPGA registers mov a,tmprxcnt mov dptr,#(IN0BUF+18) movx @dptr,a mov dptr,#FSKTXCNT movx a,@dptr mov dptr,#(IN0BUF+19) movx @dptr,a inc dptr mov a,ctrlreg movx @dptr,a mov dptr,#FSKSTAT movx a,@dptr mov dptr,#(IN0BUF+21) movx @dptr,a ;; Anchor Registers mov dptr,#OUT2CS movx a,@dptr mov dptr,#(IN0BUF+22) movx @dptr,a ;; set length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-(6+12+4+1) jnc 4$ clr a 4$: add a,#(6+12+4+1) mov dptr,#IN0BC movx @dptr,a ljmp setupack cmdnotc0: ;; 0xc8 cjne a,#0xc8,cmdnotc8 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc8 mov a,#1 jnb extmodem,1$ inc a 1$: mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a ljmp setupack setupstallc8: ljmp setupstall cmdnotc8: ;; 0xc9 cjne a,#0xc9,cmdnotc9 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallc9 mov dptr,#IN0BUF mov r0,#parserial 0$: movx a,@r0 jz 1$ movx @dptr,a inc r0 inc dptr sjmp 0$ 1$: mov a,r0 add a,#-0xf0 ; -parserial mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallc9: ljmp setupstall cmdnotc9: ;; 0xd0 cjne a,#0xd0,cmdnotd0 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld0 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,0$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr anl a,#1 mov pttforce,a setb pttforcechg 0$: ;; PTT status mov dptr,#IN0BUF mov a,txstate orl a,pttforce jz 1$ mov a,#1 1$: movx @dptr,a ;; DCD status mov dptr,#FSKMDISCIN movx a,@dptr mov c,acc.6 orl c,/extmodem mov b.0,c mov dptr,#FSKSTAT movx a,@dptr mov c,acc.0 orl c,extmodem anl c,b.0 cpl c clr a mov acc.0,c mov dptr,#IN0BUF+1 movx @dptr,a ;; RSSI mov dptr,#FSKRSSI movx a,@dptr mov dptr,#IN0BUF+2 movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-3 jnc 2$ clr a 2$: add a,#3 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld0: ljmp setupstall cmdnotd0: ;; 0xd1 cjne a,#0xd1,cmdnotd1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld1 mov dptr,#IN0BUF mov r0,#parbitratetx mov r7,#6 1$: movx a,@r0 movx @dptr,a inc dptr inc r0 djnz r7,1$ ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-6 jnc 2$ clr a 2$: add a,#6 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld1: ljmp setupstall cmdnotd1: ;; 0xd2 cjne a,#0xd2,cmdnotd2 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,setupstalld2 mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr mov b,a mov dptr,#OUTC movx a,@dptr mov c,b.0 mov acc.3,c mov c,b.1 mov acc.5,c movx @dptr,a ljmp setupack setupstalld2: ljmp setupstall cmdnotd2: ;; 0xd3 cjne a,#0xd3,cmdnotd3 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,setupstalld3 mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr jbc uartempty,cmdd2cont setupstalld3: ljmp setupstall cmdd2cont: mov sbuf0,a ljmp setupack cmdnotd3: ;; 0xd4 cjne a,#0xd4,cmdnotd4 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld4 jb extmodem,setupstalld4 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr mov dptr,#SETUPDAT+2 ; wValue cjne a,#1,0$ movx a,@dptr mov dptr,#FSKMDISCOUT movx @dptr,a mov mdiscout,a sjmp 1$ 0$: cjne a,#2,1$ movx a,@dptr mov dptr,#FSKMDISCTRIS movx @dptr,a mov mdisctris,a 1$: mov dptr,#FSKMDISCIN movx a,@dptr mov dptr,#IN0BUF+0 movx @dptr,a mov a,mdiscout inc dptr movx @dptr,a mov a,mdisctris inc dptr movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-3 jnc 2$ clr a 2$: add a,#3 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld4: ljmp setupstall cmdnotd4: ;; 0xd5 cjne a,#0xd5,cmdnotd5 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstalld5 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr cjne a,#1,0$ mov dptr,#SETUPDAT+2 ; wValue movx a,@dptr mov dptr,#FSKT7FOUT movx @dptr,a mov t7fout,a 0$: mov dptr,#FSKT7FIN movx a,@dptr mov dptr,#IN0BUF+0 movx @dptr,a mov a,t7fout inc dptr movx @dptr,a ;; length mov dptr,#SETUPDAT+6 ; wLength movx a,@dptr add a,#-2 jnc 2$ clr a 2$: add a,#2 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstalld5: ljmp setupstall cmdnotd5: ;; unknown commands fall through to setupstall setupstall: mov a,#3 sjmp endsetup setupack: mov a,#2 endsetup: mov dptr,#EP0CS movx @dptr,a endusbisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sof_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sutok_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_suspend_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_usbreset_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep0in_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt ;ep0install: ; mov a,#3 ; sjmp ep0incs ;ep0inack: ; mov a,#2 ;ep0incs: ; mov dptr,#EP0CS ; movx @dptr,a ;ep0inendisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_ep0out_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar6 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt ;ep0outstall: ; mov ctrlcode,#0 ; mov a,#3 ; sjmp ep0outcs ;ep0outack: ; mov txwr,txtwr ; mov ctrlcode,#0 ; mov a,#2 ;ep0outcs: ; mov dptr,#EP0CS ; movx @dptr,a ;ep0outendisr: ;; epilogue pop ar6 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti fillusbintr:: mov a,txstate mov b,a setb b.2 orl a,pttforce cjne a,#0,0$ clr b.2 0$: mov dptr,#FSKMDISCIN movx a,@dptr mov c,acc.6 cpl c anl c,extmodem mov b.3,c mov dptr,#FSKSTAT movx a,@dptr mov c,acc.0 anl c,/extmodem orl c,b.3 mov b.3,c mov c,uartempty mov b.5,c setb c mov a,rxrd cjne a,rxwr,1$ mov dptr,#(IN2CS) movx a,@dptr mov c,acc.1 1$: mov b.4,c ;; bytewide elements mov dptr,#(IN1BUF) mov a,b movx @dptr,a mov a,txwr cpl a add a,txrd anl a,#(TXCHUNKS-1) mov dptr,#(IN1BUF+1) movx @dptr,a mov a,rxrd cpl a add a,rxwr inc a anl a,#(RXCHUNKS-1) mov dptr,#(IN1BUF+2) movx @dptr,a mov dptr,#FSKRSSI movx a,@dptr mov dptr,#(IN1BUF+3) movx @dptr,a ; counter inc irqcount mov a,irqcount mov dptr,#(IN1BUF+4) movx @dptr,a ; UART buffer mov b,#5 mov dptr,#(IN1BUF+5) 2$: mov a,uartrd cjne a,uartwr,3$ ; set length mov dptr,#IN1BC mov a,b movx @dptr,a ret 3$: add a,#uartbuf mov r0,a mov a,@r0 movx @dptr,a inc dptr inc b mov a,uartrd inc a anl a,#0xf mov uartrd,a sjmp 2$ usb_ep1in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt lcall fillusbintr ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep1out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ;; ----------------------------------------------------- ;; USB descriptors ;; ----------------------------------------------------- ;; Device and/or Interface Class codes USB_CLASS_PER_INTERFACE = 0 USB_CLASS_AUDIO = 1 USB_CLASS_COMM = 2 USB_CLASS_HID = 3 USB_CLASS_PRINTER = 7 USB_CLASS_MASS_STORAGE = 8 USB_CLASS_HUB = 9 USB_CLASS_VENDOR_SPEC = 0xff ;; Descriptor types USB_DT_DEVICE = 0x01 USB_DT_CONFIG = 0x02 USB_DT_STRING = 0x03 USB_DT_INTERFACE = 0x04 USB_DT_ENDPOINT = 0x05 ;; Standard requests USB_REQ_GET_STATUS = 0x00 USB_REQ_CLEAR_FEATURE = 0x01 USB_REQ_SET_FEATURE = 0x03 USB_REQ_SET_ADDRESS = 0x05 USB_REQ_GET_DESCRIPTOR = 0x06 USB_REQ_SET_DESCRIPTOR = 0x07 USB_REQ_GET_CONFIGURATION = 0x08 USB_REQ_SET_CONFIGURATION = 0x09 USB_REQ_GET_INTERFACE = 0x0A USB_REQ_SET_INTERFACE = 0x0B USB_REQ_SYNCH_FRAME = 0x0C ;; USB Request Type and Endpoint Directions USB_DIR_OUT = 0 USB_DIR_IN = 0x80 USB_TYPE_STANDARD = (0x00 << 5) USB_TYPE_CLASS = (0x01 << 5) USB_TYPE_VENDOR = (0x02 << 5) USB_TYPE_RESERVED = (0x03 << 5) USB_RECIP_DEVICE = 0x00 USB_RECIP_INTERFACE = 0x01 USB_RECIP_ENDPOINT = 0x02 USB_RECIP_OTHER = 0x03 ;; Request target types. USB_RT_DEVICE = 0x00 USB_RT_INTERFACE = 0x01 USB_RT_ENDPOINT = 0x02 VENDID = 0xbac0 PRODID = 0x6136 devicedescr: .db 18 ; bLength .db USB_DT_DEVICE ; bDescriptorType .db 0x00, 0x01 ; bcdUSB .db USB_CLASS_VENDOR_SPEC ; bDeviceClass .db 0 ; bDeviceSubClass .db 0xff ; bDeviceProtocol .db 0x40 ; bMaxPacketSize0 .db VENDID ; idVendor .db PRODID ; idProduct .db 0x02,0x00 ; bcdDevice .db 1 ; iManufacturer .db 2 ; iProduct .db 3 ; iSerialNumber .db 1 ; bNumConfigurations config0descr: .db 9 ; bLength .db USB_DT_CONFIG ; bDescriptorType .db config0sz ; wTotalLength .db 1 ; bNumInterfaces .db 1 ; bConfigurationValue .db 0 ; iConfiguration .db 0b01000000 ; bmAttributs (self powered) .db 0 ; MaxPower (mA/2) (self powered so 0) ;; interface descriptor I0:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A0:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A0:E1 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A0:E2 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; interface descriptor I0:A1 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 1 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A1:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x03 ; bmAttributes (interrupt) .db 0x40,0x00 ; wMaxPacketSize .db 10 ; bInterval ;; endpoint descriptor I0:A1:E1 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A1:E2 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval config0sz = . - config0descr stringdescr: .db string0 .db string1 .db string2 .db stringserial numstrings = (. - stringdescr)/2 string0: .db string0sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 0,0 ; LANGID[0]: Lang Neutral string0sz = . - string0 string1: .db string1sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 string1sz = . - string1 string2: .db string2sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 .db '(,0,'F,0,'S,0,'K,0,'),0 string2sz = . - string2 stringserial: .db 2 ; bLength .db USB_DT_STRING ; bDescriptorType .dw 0,0,0,0,0,0,0,0 .dw 0,0,0,0,0,0,0,0 baycomusb-0.10.orig/firmware/fskfirmware/main.lnk0100644000175100017510000000014707325134422020202 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/firmware/fskfirmware/fsk.c0100644000175100017510000005177207325134422017511 0ustar abaaba/*****************************************************************************/ /* * fsk.c -- AnchorChips EZUSB Project main. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "regezusb.h" xdata at 0xc001 unsigned short FSKRXCNT; xdata at 0xc002 unsigned short FSKRXDATA; xdata at 0xc003 unsigned short FSKRXFLAG; xdata at 0xc000 unsigned short FSKTXCNT; xdata at 0xc000 unsigned short FSKTXDATA; xdata at 0xc001 unsigned short FSKTXCRC; xdata at 0xc002 unsigned short FSKTXRAW; xdata at 0xc003 unsigned short FSKTXRAWCLR; xdata at 0xc004 unsigned short FSKRSSI; xdata at 0xc008 unsigned short FSKCTRL; xdata at 0xc009 unsigned short FSKSTAT; xdata at 0xc00a unsigned short FSKT7FOUT; xdata at 0xc00b unsigned short FSKT7FIN; xdata short *errmsg = 0; unsigned short errcode, errval; unsigned short ctrlcode; unsigned int ctrlcount; void wait_1ms(void) { /* Delay for 1 millisecond (1000 microseconds). */ /* 10 cycles * 166.6 ns per cycle is 1.66 microseconds per loop. */ /* 1000 microseconds / 1.66 = 602. [assumes 24 MHz clock] */ _asm mov _DPS,#0 mov dptr,#(0xffff - 602) ; /* long pulse for operating */ loop: inc dptr ; 3 cycles mov a,dpl ; 2 cycles orl a,dph ; 2 cycles jnz loop ; 3 cycles _endasm; } #pragma SAVE #pragma NOOVERLAY #if 0 void int0_isr(void) interrupt 0 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _TCON+1 _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void timer0_isr(void) interrupt 1 { static short div; _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _TCON+5 _endasm; div++; div &= 0x7; if (!div) OUTC ^= 0x08; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void int1_isr(void) interrupt 2 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _TCON+3 _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void timer1_isr(void) interrupt 3 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _TCON+7 _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void ser0_isr(void) interrupt 4 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _SCON0+0 clr _SCON0+1 _endasm; /* epilogue */ _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void timer2_isr(void) interrupt 5 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _T2CON+7 _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void resume_isr(void) interrupt 6 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _EICON+4 _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void ser1_isr(void) interrupt 7 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _SCON1+0 clr _SCON1+1 _endasm; /* epilogue */ _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void i2c_isr(void) interrupt 9 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.5 mov _EXIF,a _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void int4_isr(void) interrupt 10 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.6 mov _EXIF,a _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void int5_isr(void) interrupt 11 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.7 mov _EXIF,a _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void int6_isr(void) interrupt 12 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm clr _EICON+3 _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } static const short usb_device_descriptor[] = { 0x12, /* bLength */ 0x01, /* bDescriptorType */ 0x00, 0x01, /* bcdUSB */ 0xff, /* bDeviceClass (vendor specific) */ 0x00, /* bDeviceSubClass */ 0xff, /* bDeviceProtocol (vendor specific) */ 0x40, /* bMaxPacketSize0 */ 0x34, 0x12, /* idVendor */ 0x78, 0x56, /* idProduct */ 0x02, 0x01, /* bcdDevice */ 0x00, /* iManufacturer */ 0x00, /* iProduct */ 0x00, /* iSerialNumber */ 0x01 /* bNumConfigurations */ }; static const short usb_config0_descriptor[] = { 0x09, /* bLength */ 0x02, /* bDescriptorType */ 0x19, 0x00, /* wTotalLength */ 0x01, /* bNumInterfaces */ 0x01, /* bConfigurationValue */ 0x00, /* iConfiguration */ 0x40, /* bmAttributs */ 0x19, /* MaxPower */ /* interface descriptor */ 0x09, /* bLength */ 0x04, /* bDescriptorType */ 0x00, /* bInterfaceNumber */ 0x00, /* bAlternateSetting */ 0x01, /* bNumEndpoints */ 0xff, /* bInterfaceClass (vendor specific) */ 0x00, /* bInterfaceSubClass */ 0xff, /* bInterfaceProtocol (vendor specific) */ 0x00, /* iInterface */ /* endpoint descriptor */ 0x07, /* bLength */ 0x05, /* bDescriptorType */ 0x02, /* bEndpointAddress */ 0x02, /* bmAttributes (bulk) */ 0x40, 0x00, /* wMaxPacketSize */ 0x00 /* bInterval */ }; void usb_sudav_isr(void) interrupt 13 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; USBIRQ = 0x01; /* reset control OUT code */ ctrlcode = 0; /* process control transfer */ switch (SETUPDAT[1]) { /* bRequest field */ /* vendor specific */ case 0xb0: if (SETUPDAT[0] != 0xC0) goto setupstall; { short cnt0 = SETUPDAT[6], cnt1; xdata short *p1 = (xdata short *)"blah"; xdata short *p2 = IN0BUF; if (cnt0 > 64) cnt0 = 64; cnt1 = cnt0; if (p1) { while (cnt0 > 0U && *p1) { *p2++ = *p1++; cnt0--; } } while (cnt0 > 0U) { *p2++ = 0; cnt0--; } IN0BC = cnt1; } goto setupack; case 0xb1: if (SETUPDAT[0] != 0xC0) goto setupstall; IN0BUF[0] = errcode; IN0BUF[1] = errval; IN0BUF[2] = SP; IN0BUF[3] = 0; if ((unsigned short)SETUPDAT[6] > 4U) IN0BC = 4; else IN0BC = SETUPDAT[6]; goto setupack; case 0xbc: if (SETUPDAT[0] != 0x40) goto setupstall; if ((SETUPDAT[6] | SETUPDAT[7]) != 0) goto setupstall; _asm ; mov dptr,#(_SETUPDAT+2) ; movx a,@dptr ; mov (_txdelay+0),a ; inc dptr ; movx a,@dptr ; mov (_txdelay+1),a ; _endasm ; goto setupack; case 0xbd: #if 0 if (SETUPDAT[0] != 0x40) goto setupstall; if ((SETUPDAT[6] | SETUPDAT[7]) != 0) goto setupstall; _asm ; clr _SCON0+1 ; _endasm ; SBUF0 = SETUPDAT[2]; #endif goto setupack; case 0xbe: if (SETUPDAT[0] != 0x40) goto setupstall; if ((SETUPDAT[6] | SETUPDAT[7]) != 0) goto setupstall; FSKT7FOUT = SETUPDAT[2]; goto setupack; case 0xc0: if (SETUPDAT[0] != 0xc0) goto setupstall; #if 0 if (SETUPDAT[6] < 6) goto setupstall; #endif _asm ; mov a,_txstate ; mov b,a ; setb b.2 ; cjne a,#0,intrx0 ; clr b.2 ; intrx0: mov dptr,#_FSKSTAT ; movx a,@dptr ; mov c,acc.0 ; mov b.3,c ; mov c,_SCON0+1 ; mov b.5,c ; jnb _SCON0+0,intrx2 ; mov a,_SBUF0 ; mov dptr,#(_IN0BUF+4) ; movx @dptr,a ; setb b.4 ; clr _SCON0+0 ; intrx2: ; /* bytewide elements */ mov dptr,#(_IN0BUF) ; mov a,b ; mov a,_txstate ; movx @dptr,a ; mov a,_txwr ; cpl a ; add a,_txrd ; anl a,#(_TXCHUNKS-1) ; mov dptr,#(_IN0BUF+1) ; movx @dptr,a ; mov a,_rxrd ; cpl a ; add a,_rxwr ; inc a ; anl a,#(_RXCHUNKS-1) ; mov dptr,#(_IN0BUF+2) ; movx @dptr,a ; mov dptr,#_FSKRSSI ; movx a,@dptr ; mov dptr,#(_IN0BUF+3) ; movx @dptr,a ; ; /* counter */ inc _irqcount ; mov a,_irqcount ; mov dptr,#(_IN0BUF+5) ; movx @dptr,a ; ; /* set length */ mov dptr,#_IN0BC ; mov a,#6 ; movx @dptr,a ; _endasm; goto setupack; default: goto setupstall; } setupack: EP0CS = 2; /* clear HSNAK */ goto endusbisr; setupstall: EP0CS = 3; /* signal stall */ goto endusbisr; endusbisr: _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_sof_isr(void) interrupt 14 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; USBIRQ = 0x02; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_sutok_isr(void) interrupt 15 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; USBIRQ = 0x04; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_suspend_isr(void) interrupt 16 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; USBIRQ = 0x08; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_usbreset_isr(void) interrupt 17 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; USBIRQ = 0x10; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep0in_isr(void) interrupt 18 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; IN07IRQ = 0x01; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep0out_isr(void) interrupt 19 { xdata unsigned short *dptr; unsigned short cnt; _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; OUT07IRQ = 0x01; /* check code */ if (ctrlcode != 1) goto setupstall; cnt = OUT0BC; goto arm; setupack: EP0CS = 2; /* clear HSNAK */ ctrlcode = 0; goto endusbisr; setupstall: EP0CS = 3; /* signal stall */ ctrlcode = 0; goto endusbisr; arm: OUT0BC = 1; endusbisr: _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } unsigned short irqcount; void fill_intr(void) { _asm ; mov a,_txstate ; mov b,a ; setb b.2 ; cjne a,#0,intr0 ; clr b.2 ; intr0: mov dptr,#_FSKSTAT ; movx a,@dptr ; mov c,acc.0 ; mov b.3,c ; mov c,_SCON0+1 ; mov b.5,c ; jnb _SCON0+0,intr2 ; mov a,_SBUF0 ; mov dptr,#(_IN1BUF+4) ; movx @dptr,a ; setb b.4 ; clr _SCON0+0 ; intr2: ; /* bytewide elements */ mov dptr,#(_IN1BUF) ; mov a,b ; mov a,_txstate ; movx @dptr,a ; mov a,_txwr ; cpl a ; add a,_txrd ; anl a,#(_TXCHUNKS-1) ; mov dptr,#(_IN1BUF+1) ; movx @dptr,a ; mov a,_rxrd ; cpl a ; add a,_rxwr ; inc a ; anl a,#(_RXCHUNKS-1) ; mov dptr,#(_IN1BUF+2) ; movx @dptr,a ; mov dptr,#_FSKRSSI ; movx a,@dptr ; mov dptr,#(_IN1BUF+3) ; movx @dptr,a ; ; /* counter */ inc _irqcount ; mov a,_irqcount ; mov dptr,#(_IN1BUF+5) ; movx @dptr,a ; ; /* set length */ mov dptr,#_IN1BC ; mov a,#6 ; movx @dptr,a ; _endasm; } void usb_ep1in_isr(void) interrupt 20 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; IN07IRQ = 0x02; _asm ; acall _fill_intr ; _endasm; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep1out_isr(void) interrupt 21 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; OUT07IRQ = 0x02; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep2in_isr(void) interrupt 22 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; IN07IRQ = 0x04; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep2out_isr(void) interrupt 23 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; OUT07IRQ = 0x04; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep3in_isr(void) interrupt 24 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; IN07IRQ = 0x08; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep3out_isr(void) interrupt 25 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; OUT07IRQ = 0x08; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep4in_isr(void) interrupt 26 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; IN07IRQ = 0x10; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep4out_isr(void) interrupt 27 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; OUT07IRQ = 0x10; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep5in_isr(void) interrupt 28 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; IN07IRQ = 0x20; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep5out_isr(void) interrupt 29 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; OUT07IRQ = 0x20; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep6in_isr(void) interrupt 30 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; IN07IRQ = 0x40; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep6out_isr(void) interrupt 31 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; OUT07IRQ = 0x40; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep7in_isr(void) interrupt 32 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; IN07IRQ = 0x80; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } void usb_ep7out_isr(void) interrupt 33 { _asm ; push _DPL1 ; push _DPH1 ; push _DPS ; mov _DPS,#0 ; _endasm; /* clear interrupt */ _asm mov a,_EXIF clr acc.4 mov _EXIF,a _endasm; OUT07IRQ = 0x80; _asm ; pop _DPS ; pop _DPH1 ; pop _DPL1 ; _endasm; } #endif #pragma RESTORE void fill_intr(void); unsigned short leddiv; unsigned short irqcount; /* * The chunks need to be powers of 2! */ #define TXCHUNKS 16 #define RXCHUNKS 32 idata unsigned short txbcnt[TXCHUNKS]; idata unsigned short rxbcnt[RXCHUNKS]; idata unsigned short stack[0x100-TXCHUNKS-RXCHUNKS]; unsigned short txstate; /* 0 = idle, 1 = txdelay, 2 = packet, 3 = txtail */ unsigned int flagcnt, txdelay; unsigned short txwr, txrd, txtwr, txptr; unsigned short rxstate; unsigned short rxwr, rxrd, rxtwr, rxptr; xdata unsigned short txbuf[TXCHUNKS][64]; xdata unsigned short rxbuf[RXCHUNKS][64]; void ezusbmain(void) { errcode = 0; errval = 0; txdelay = 10; txstate = txwr = txrd = txtwr = txptr = 0; rxstate = rxwr = rxrd = rxtwr = rxptr = 0; irqcount = 0; ISOCTL = 1; /* disable ISO endpoints */ USBBAV = 1; /* enable autovector, disable breakpoint logic */ /* * Timer setup: * timer 0: LED blink : T0M=0, CT0=0, MODE0=1 * timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 */ CKCON = 0x31; /* one external wait state, to avoid chip bugs */ TMOD = 0x21; TCON = 0x55; /* INT0/INT1 edge */ TH1 = 256-156; /* 1200 bauds */ PCON = 0; /* SMOD0=0 */ /* set IO ports accordingly */ PORTACFG = 0; OUTA = 0x82; /* set PROG hi */ OEA = 0xc2; /* out: TMS,TDI,PROG in: DONE */ PORTBCFG = 0; OEB = 0; PORTCCFG = 0xc3; /* RD/WR/TXD0/RXD0 are special function pins */ OUTC = 0x20; OEC = 0x2a; /* out: LEDCON,LEDSTA,TCK in: TDO,INIT */ /* enable interrupts */ IE = 0x82; /* enable timer 0 int */ EIE = 0x01; /* enable USB interrupts */ USBIEN = 1; /* enable SUDAV interrupt */ IN07VAL = 0x7; /* enable EP0+EP1+EP2 */ OUT07VAL = 0x5; /* enable EP0+EP2 */ INISOVAL = 0; OUTISOVAL = 0; IN07IEN = 3; /* enable EP0+EP1 interrupt */ OUT07IEN = 1; /* enable EP0 interrupt */ /* initialize UART 0 for T7F communication */ SCON0 = 0x52; /* Mode 1, Timer 1, Receiver enable */ /*USBPAIR = 0x09; /* pair EP 2&3 for input & output */ USBPAIR = 0; #if 0 TOGCTL = 0x12; TOGCTL = 0x32; /* clear EP 2 in toggle */ TOGCTL = 0x02; TOGCTL = 0x22; /* clear EP 2 out toggle */ #endif OUT2BC = 0; fill_intr(); errmsg = (xdata short *)"all ok"; errcode = 0x20; return; err: for (;;); } baycomusb-0.10.orig/firmware/fskfirmware/regezusb.h0100644000175100017510000002056607325134422020556 0ustar abaaba/*------------------------------------------------------------------------- Register Declarations for Anchorchips AN21xx USB processors Written By - Thomas Sailer . sailer@ife.ee.ethz.ch (1999) based on reg51.h by Sandeep Dutta . sandeep.dutta@usa.net (1998) 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ #ifndef REGAN21xx_H #define REGAN21xx_H /* BYTE Register */ sfr at 0x81 SP ; sfr at 0x82 DPL ; sfr at 0x83 DPH ; sfr at 0x82 DPL0 ; sfr at 0x83 DPH0 ; sfr at 0x84 DPL1 ; sfr at 0x85 DPH1 ; sfr at 0x86 DPS ; sfr at 0x87 PCON ; sfr at 0x88 TCON ; sfr at 0x89 TMOD ; sfr at 0x8A TL0 ; sfr at 0x8B TL1 ; sfr at 0x8C TH0 ; sfr at 0x8D TH1 ; sfr at 0x8E CKCON ; sfr at 0x8F SPC_FNC ; sfr at 0x91 EXIF ; sfr at 0x92 MPAGE ; sfr at 0x98 SCON0 ; sfr at 0x99 SBUF0 ; sfr at 0xA8 IE ; sfr at 0xB8 IP ; sfr at 0xC0 SCON1 ; sfr at 0xC1 SBUF1 ; sfr at 0xC8 T2CON ; sfr at 0xCA RCAP2L ; sfr at 0xCB RCAP2H ; sfr at 0xCC TL2 ; sfr at 0xCD TH2 ; sfr at 0xD0 PSW ; sfr at 0xD8 EICON ; sfr at 0xE0 ACC ; sfr at 0xE8 EIE ; sfr at 0xF0 B ; sfr at 0xF8 EIP ; /* BIT Register */ /* TCON */ sbit at 0x8F TF1 ; sbit at 0x8E TR1 ; sbit at 0x8D TF0 ; sbit at 0x8C TR0 ; sbit at 0x8B IE1 ; sbit at 0x8A IT1 ; sbit at 0x89 IE0 ; sbit at 0x88 IT0 ; /* TMOD bits */ #define GATE1 (1<<7) #define C_T1 (1<<6) #define M1_1 (1<<5) #define M0_1 (1<<4) #define GATE0 (1<<3) #define C_T0 (1<<2) #define M1_0 (1<<1) #define M0_0 (1<<0) /* SCON0 */ sbit at 0x9F SM0_0 ; sbit at 0x9E SM1_0 ; sbit at 0x9D SM2_0 ; sbit at 0x9C REN_0 ; sbit at 0x9B TB8_0 ; sbit at 0x9A RB8_0 ; sbit at 0x99 TI_0 ; sbit at 0x98 RI_0 ; /* IE */ sbit at 0xAF EA ; sbit at 0xAE ES1 ; sbit at 0xAD ET2 ; sbit at 0xAC ES0 ; sbit at 0xAB ET1 ; sbit at 0xAA EX1 ; sbit at 0xA9 ET0 ; sbit at 0xA8 EX0 ; /* IP */ sbit at 0xBE PS1 ; sbit at 0xBD PT2 ; sbit at 0xBC PS0 ; sbit at 0xBB PT1 ; sbit at 0xBA PX1 ; sbit at 0xB9 PT0 ; sbit at 0xB8 PX0 ; /* SCON1 */ sbit at 0xC7 SM0_1 ; sbit at 0xC6 SM1_1 ; sbit at 0xC5 SM2_1 ; sbit at 0xC4 REN_1 ; sbit at 0xC3 TB8_1 ; sbit at 0xC2 RB8_1 ; sbit at 0xC1 TI_1 ; sbit at 0xC0 RI_1 ; /* T2CON */ sbit at 0xCF TF2 ; sbit at 0xCE EXF2 ; sbit at 0xCD RCLK ; sbit at 0xCC TCLK ; sbit at 0xCB EXEN2 ; sbit at 0xCA TR2 ; sbit at 0xC9 CT2 ; sbit at 0xC8 CPRL2 ; /* PSW */ sbit at 0xD7 CY ; sbit at 0xD6 AC ; sbit at 0xD5 F0 ; sbit at 0xD4 RS1 ; sbit at 0xD3 RS0 ; sbit at 0xD2 OV ; sbit at 0xD0 P ; /* EICON */ sbit at 0xDF SMOD1 ; sbit at 0xDD ERESI ; sbit at 0xDC RESI ; sbit at 0xDB INT6 ; /* EIE */ sbit at 0xEC EWDI ; sbit at 0xEB EX5 ; sbit at 0xEA EX4 ; sbit at 0xE9 EI2C ; sbit at 0xE8 EUSB ; /* EIP */ sbit at 0xFC PX6 ; sbit at 0xFB PX5 ; sbit at 0xFA PX4 ; sbit at 0xF9 PI2C ; sbit at 0xF8 PUSB ; /* XDATA registers */ /* control/interrupt/bulk endpoints */ xdata at 0x7F00 short IN0BUF[64]; xdata at 0x7EC0 short OUT0BUF[64]; xdata at 0x7E80 short IN1BUF[64]; xdata at 0x7E40 short OUT1BUF[64]; xdata at 0x7E00 short IN2BUF[64]; xdata at 0x7DC0 short OUT2BUF[64]; xdata at 0x7D80 short IN3BUF[64]; xdata at 0x7D40 short OUT3BUF[64]; xdata at 0x7D00 short IN4BUF[64]; xdata at 0x7CC0 short OUT4BUF[64]; xdata at 0x7C80 short IN5BUF[64]; xdata at 0x7C40 short OUT5BUF[64]; xdata at 0x7C00 short IN6BUF[64]; xdata at 0x7BC0 short OUT6BUF[64]; xdata at 0x7B80 short IN7BUF[64]; xdata at 0x7B40 short OUT7BUF[64]; xdata at 0x7FE8 short SETUPBUF[8]; xdata at 0x7FE8 short SETUPDAT[8]; xdata at 0x7FB4 short EP0CS; xdata at 0x7FB5 short IN0BC; xdata at 0x7FB6 short IN1CS; xdata at 0x7FB7 short IN1BC; xdata at 0x7FB8 short IN2CS; xdata at 0x7FB9 short IN2BC; xdata at 0x7FBA short IN3CS; xdata at 0x7FBB short IN3BC; xdata at 0x7FBC short IN4CS; xdata at 0x7FBD short IN4BC; xdata at 0x7FBE short IN5CS; xdata at 0x7FBF short IN5BC; xdata at 0x7FC0 short IN6CS; xdata at 0x7FC1 short IN6BC; xdata at 0x7FC2 short IN7CS; xdata at 0x7FC3 short IN7BC; xdata at 0x7FC5 short OUT0BC; xdata at 0x7FC6 short OUT1CS; xdata at 0x7FC7 short OUT1BC; xdata at 0x7FC8 short OUT2CS; xdata at 0x7FC9 short OUT2BC; xdata at 0x7FCA short OUT3CS; xdata at 0x7FCB short OUT3BC; xdata at 0x7FCC short OUT4CS; xdata at 0x7FCD short OUT4BC; xdata at 0x7FCE short OUT5CS; xdata at 0x7FCF short OUT5BC; xdata at 0x7FD0 short OUT6CS; xdata at 0x7FD1 short OUT6BC; xdata at 0x7FD2 short OUT7CS; xdata at 0x7FD3 short OUT7BC; xdata at 0x7FA8 short IVEC; xdata at 0x7FA9 short IN07IRQ; xdata at 0x7FAA short OUT07IRQ; xdata at 0x7FAB short USBIRQ; xdata at 0x7FAC short IN07IEN; xdata at 0x7FAD short OUT07IEN; xdata at 0x7FAE short USBIEN; xdata at 0x7FAF short USBBAV; xdata at 0x7FB2 short BPADDRH; xdata at 0x7FB3 short BPADDRL; xdata at 0x7FD4 short SUDPTRH; xdata at 0x7FD5 short SUDPTRL; xdata at 0x7FD6 short USBCS; xdata at 0x7FD7 short TOGCTL; xdata at 0x7FD8 short USBFRAMEL; xdata at 0x7FD9 short USBFRAMEH; xdata at 0x7FDB short FNADDR; xdata at 0x7FDD short USBPAIR; xdata at 0x7FDE short IN07VAL; xdata at 0x7FDF short OUT07VAL; xdata at 0x7FE3 short AUTOPTRH; xdata at 0x7FE4 short AUTOPTRL; xdata at 0x7FE5 short AUTODATA; /* isochronous endpoints. only available if ISODISAB=0 */ xdata at 0x7F60 short OUT8DATA; xdata at 0x7F61 short OUT9DATA; xdata at 0x7F62 short OUT10DATA; xdata at 0x7F63 short OUT11DATA; xdata at 0x7F64 short OUT12DATA; xdata at 0x7F65 short OUT13DATA; xdata at 0x7F66 short OUT14DATA; xdata at 0x7F67 short OUT15DATA; xdata at 0x7F68 short IN8DATA; xdata at 0x7F69 short IN9DATA; xdata at 0x7F6A short IN10DATA; xdata at 0x7F6B short IN11DATA; xdata at 0x7F6C short IN12DATA; xdata at 0x7F6D short IN13DATA; xdata at 0x7F6E short IN14DATA; xdata at 0x7F6F short IN15DATA; xdata at 0x7F70 short OUT8BCH; xdata at 0x7F71 short OUT8BCL; xdata at 0x7F72 short OUT9BCH; xdata at 0x7F73 short OUT9BCL; xdata at 0x7F74 short OUT10BCH; xdata at 0x7F75 short OUT10BCL; xdata at 0x7F76 short OUT11BCH; xdata at 0x7F77 short OUT11BCL; xdata at 0x7F78 short OUT12BCH; xdata at 0x7F79 short OUT12BCL; xdata at 0x7F7A short OUT13BCH; xdata at 0x7F7B short OUT13BCL; xdata at 0x7F7C short OUT14BCH; xdata at 0x7F7D short OUT14BCL; xdata at 0x7F7E short OUT15BCH; xdata at 0x7F7F short OUT15BCL; xdata at 0x7FF0 short OUT8ADDR; xdata at 0x7FF1 short OUT9ADDR; xdata at 0x7FF2 short OUT10ADDR; xdata at 0x7FF3 short OUT11ADDR; xdata at 0x7FF4 short OUT12ADDR; xdata at 0x7FF5 short OUT13ADDR; xdata at 0x7FF6 short OUT14ADDR; xdata at 0x7FF7 short OUT15ADDR; xdata at 0x7FF8 short IN8ADDR; xdata at 0x7FF9 short IN9ADDR; xdata at 0x7FFA short IN10ADDR; xdata at 0x7FFB short IN11ADDR; xdata at 0x7FFC short IN12ADDR; xdata at 0x7FFD short IN13ADDR; xdata at 0x7FFE short IN14ADDR; xdata at 0x7FFF short IN15ADDR; xdata at 0x7FA0 short ISOERR; xdata at 0x7FA1 short ISOCTL; xdata at 0x7FA2 short ZBCOUNT; xdata at 0x7FE0 short INISOVAL; xdata at 0x7FE1 short OUTISOVAL; xdata at 0x7FE2 short FASTXFR; /* CPU control registers */ xdata at 0x7F92 short CPUCS; /* IO port control registers */ xdata at 0x7F93 short PORTACFG; xdata at 0x7F94 short PORTBCFG; xdata at 0x7F95 short PORTCCFG; xdata at 0x7F96 short OUTA; xdata at 0x7F97 short OUTB; xdata at 0x7F98 short OUTC; xdata at 0x7F99 short PINSA; xdata at 0x7F9A short PINSB; xdata at 0x7F9B short PINSC; xdata at 0x7F9C short OEA; xdata at 0x7F9D short OEB; xdata at 0x7F9E short OEC; /* I2C controller registers */ xdata at 0x7FA5 short I2CS; xdata at 0x7FA6 short I2DAT; /* interrupts */ #endif baycomusb-0.10.orig/firmware/fskfirmware/ezregs.inc0100644000175100017510000000663507325134422020552 0ustar abaaba ;; special function registers sp = 0x81 dpl = 0x82 dph = 0x83 dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 pcon = 0x87 tcon = 0x88 tmod = 0x89 tl0 = 0x8A tl1 = 0x8B th0 = 0x8C th1 = 0x8D ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 ie = 0xA8 ip = 0xB8 scon1 = 0xC0 sbuf1 = 0xC1 t2con = 0xC8 rcap2l = 0xCA rcap2h = 0xCB tl2 = 0xCC th2 = 0xCD psw = 0xD0 eicon = 0xD8 acc = 0xE0 eie = 0xE8 b = 0xF0 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 baycomusb-0.10.orig/firmware/resetfirmware/0042755000175100017510000000000007340500004017100 5ustar abaababaycomusb-0.10.orig/firmware/resetfirmware/Makefile.in0100644000175100017510000001402007340500004021135 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/resetfirmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/resetfirmware/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 = firmware/resetfirmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/resetfirmware/main.rel: $(top_srcdir)/firmware/resetfirmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/resetfirmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/resetfirmware/main.ihx: $(top_srcdir)/firmware/resetfirmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/resetfirmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/resetfirmware/Makefile.am0100644000175100017510000000100107325134422021131 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/resetfirmware/main.rel: $(top_srcdir)/firmware/resetfirmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/resetfirmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/resetfirmware/main.ihx $(top_srcdir)/firmware/resetfirmware/main.ihx: $(top_srcdir)/firmware/resetfirmware/main.rel cd $(top_srcdir)/firmware/resetfirmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk baycomusb-0.10.orig/firmware/resetfirmware/main.ihx0100644000175100017510000000116007325134422020541 0ustar abaaba:0E00000075817FE4F5D0F586758E31F5A8F593 :0E000E00E8907FAEF0907FACF0907FADF09068 :0E001C00E890A3E582458370F9907FD6E4F06A :0E002A00907FA17401F0907FAF7401F0E4901C :0E0038007FE0F0907FE1F0907FDDF0907FDEC2 :0E004600F0907FDFF0907FD77F07EF4410F03F :0E0054004430F0EFF04420F0DFF2907F937420 :0E00620000F0907F967480F0907F9C74C2F046 :0D007000907F947400F0907F9D7400F090DC :0E007D007F957400F0907F987408F0907F9E3D :0E008B00742EF07A6490E890A3E582458370AD :0E009900F9DAF4907FD67404F0907F9874200A :0E00A700F0907F987420F07A2890E890A3E5FE :0E00B50082458370F9DAF4907F987428F07A0F :0E00C3000A90E890A3E582458370F9DAF48094 :0100D100D658 :00000001FF baycomusb-0.10.orig/firmware/resetfirmware/main.rel0100644000175100017510000000223107325134422020533 0ustar abaabaXH H 7 areas 0 global symbols M main A _CODE size 0 flags 0 A CODE size D2 flags 20 A OSEG size 0 flags 4 A BSEG size 0 flags 80 A ISEG size 0 flags 0 A DSEG size 0 flags 0 A XSEG size 0 flags 0 T 00 00 75 81 7F E4 F5 D0 F5 86 75 8E 31 F5 A8 F5 R 00 00 00 01 T 00 0E E8 90 7F AE F0 90 7F AC F0 90 7F AD F0 90 R 00 00 00 01 T 00 1C E8 90 A3 E5 82 45 83 70 F9 90 7F D6 E4 F0 R 00 00 00 01 T 00 2A 90 7F A1 74 01 F0 90 7F AF 74 01 F0 E4 90 R 00 00 00 01 T 00 38 7F E0 F0 90 7F E1 F0 90 7F DD F0 90 7F DE R 00 00 00 01 T 00 46 F0 90 7F DF F0 90 7F D7 7F 07 EF 44 10 F0 R 00 00 00 01 T 00 54 44 30 F0 EF F0 44 20 F0 DF F2 90 7F 93 74 R 00 00 00 01 T 00 62 00 F0 90 7F 96 74 80 F0 90 7F 9C 74 C2 F0 R 00 00 00 01 T 00 70 90 7F 94 74 00 F0 90 7F 9D 74 00 F0 90 R 00 00 00 01 T 00 7D 7F 95 74 00 F0 90 7F 98 74 08 F0 90 7F 9E R 00 00 00 01 T 00 8B 74 2E F0 7A 64 90 E8 90 A3 E5 82 45 83 70 R 00 00 00 01 T 00 99 F9 DA F4 90 7F D6 74 04 F0 90 7F 98 74 20 R 00 00 00 01 T 00 A7 F0 90 7F 98 74 20 F0 7A 28 90 E8 90 A3 E5 R 00 00 00 01 T 00 B5 82 45 83 70 F9 DA F4 90 7F 98 74 28 F0 7A R 00 00 00 01 T 00 C3 0A 90 E8 90 A3 E5 82 45 83 70 F9 DA F4 80 R 00 00 00 01 T 00 D1 D6 R 00 00 00 01 baycomusb-0.10.orig/firmware/resetfirmware/main.lst0100644000175100017510000004165107325134422020564 0ustar abaaba 1 .module main 2 3 ;; this apparently does not work; the anchorchips controller 4 ;; sometimes gets into a state where it responds to get_device_descriptor 5 ;; requests with zero length descriptors 6 7 ;; define code segments link order 8 .area CODE (CODE) 9 10 ;; ----------------------------------------------------- 11 12 ;; special function registers (which are not predefined) 0082 13 dpl0 = 0x82 0083 14 dph0 = 0x83 0084 15 dpl1 = 0x84 0085 16 dph1 = 0x85 0086 17 dps = 0x86 008E 18 ckcon = 0x8E 008F 19 spc_fnc = 0x8F 0091 20 exif = 0x91 0092 21 mpage = 0x92 0098 22 scon0 = 0x98 0099 23 sbuf0 = 0x99 00C0 24 scon1 = 0xC0 00C1 25 sbuf1 = 0xC1 00D8 26 eicon = 0xD8 00E8 27 eie = 0xE8 00F8 28 eip = 0xF8 29 30 ;; anchor xdata registers 7F00 31 IN0BUF = 0x7F00 7EC0 32 OUT0BUF = 0x7EC0 7E80 33 IN1BUF = 0x7E80 7E40 34 OUT1BUF = 0x7E40 7E00 35 IN2BUF = 0x7E00 7DC0 36 OUT2BUF = 0x7DC0 7D80 37 IN3BUF = 0x7D80 7D40 38 OUT3BUF = 0x7D40 7D00 39 IN4BUF = 0x7D00 7CC0 40 OUT4BUF = 0x7CC0 7C80 41 IN5BUF = 0x7C80 7C40 42 OUT5BUF = 0x7C40 7C00 43 IN6BUF = 0x7C00 7BC0 44 OUT6BUF = 0x7BC0 7B80 45 IN7BUF = 0x7B80 7B40 46 OUT7BUF = 0x7B40 7FE8 47 SETUPBUF = 0x7FE8 7FE8 48 SETUPDAT = 0x7FE8 49 7FB4 50 EP0CS = 0x7FB4 7FB5 51 IN0BC = 0x7FB5 7FB6 52 IN1CS = 0x7FB6 7FB7 53 IN1BC = 0x7FB7 7FB8 54 IN2CS = 0x7FB8 7FB9 55 IN2BC = 0x7FB9 7FBA 56 IN3CS = 0x7FBA 7FBB 57 IN3BC = 0x7FBB 7FBC 58 IN4CS = 0x7FBC 7FBD 59 IN4BC = 0x7FBD 7FBE 60 IN5CS = 0x7FBE 7FBF 61 IN5BC = 0x7FBF 7FC0 62 IN6CS = 0x7FC0 7FC1 63 IN6BC = 0x7FC1 7FC2 64 IN7CS = 0x7FC2 7FC3 65 IN7BC = 0x7FC3 7FC5 66 OUT0BC = 0x7FC5 7FC6 67 OUT1CS = 0x7FC6 7FC7 68 OUT1BC = 0x7FC7 7FC8 69 OUT2CS = 0x7FC8 7FC9 70 OUT2BC = 0x7FC9 7FCA 71 OUT3CS = 0x7FCA 7FCB 72 OUT3BC = 0x7FCB 7FCC 73 OUT4CS = 0x7FCC 7FCD 74 OUT4BC = 0x7FCD 7FCE 75 OUT5CS = 0x7FCE 7FCF 76 OUT5BC = 0x7FCF 7FD0 77 OUT6CS = 0x7FD0 7FD1 78 OUT6BC = 0x7FD1 7FD2 79 OUT7CS = 0x7FD2 7FD3 80 OUT7BC = 0x7FD3 81 7FA8 82 IVEC = 0x7FA8 7FA9 83 IN07IRQ = 0x7FA9 7FAA 84 OUT07IRQ = 0x7FAA 7FAB 85 USBIRQ = 0x7FAB 7FAC 86 IN07IEN = 0x7FAC 7FAD 87 OUT07IEN = 0x7FAD 7FAE 88 USBIEN = 0x7FAE 7FAF 89 USBBAV = 0x7FAF 7FB2 90 BPADDRH = 0x7FB2 7FB3 91 BPADDRL = 0x7FB3 92 7FD4 93 SUDPTRH = 0x7FD4 7FD5 94 SUDPTRL = 0x7FD5 7FD6 95 USBCS = 0x7FD6 7FD7 96 TOGCTL = 0x7FD7 7FD8 97 USBFRAMEL = 0x7FD8 7FD9 98 USBFRAMEH = 0x7FD9 7FDB 99 FNADDR = 0x7FDB 7FDD 100 USBPAIR = 0x7FDD 7FDE 101 IN07VAL = 0x7FDE 7FDF 102 OUT07VAL = 0x7FDF 7FE3 103 AUTOPTRH = 0x7FE3 7FE4 104 AUTOPTRL = 0x7FE4 7FE5 105 AUTODATA = 0x7FE5 106 107 ;; isochronous endpoints. only available if ISODISAB=0 108 7F60 109 OUT8DATA = 0x7F60 7F61 110 OUT9DATA = 0x7F61 7F62 111 OUT10DATA = 0x7F62 7F63 112 OUT11DATA = 0x7F63 7F64 113 OUT12DATA = 0x7F64 7F65 114 OUT13DATA = 0x7F65 7F66 115 OUT14DATA = 0x7F66 7F67 116 OUT15DATA = 0x7F67 117 7F68 118 IN8DATA = 0x7F68 7F69 119 IN9DATA = 0x7F69 7F6A 120 IN10DATA = 0x7F6A 7F6B 121 IN11DATA = 0x7F6B 7F6C 122 IN12DATA = 0x7F6C 7F6D 123 IN13DATA = 0x7F6D 7F6E 124 IN14DATA = 0x7F6E 7F6F 125 IN15DATA = 0x7F6F 126 7F70 127 OUT8BCH = 0x7F70 7F71 128 OUT8BCL = 0x7F71 7F72 129 OUT9BCH = 0x7F72 7F73 130 OUT9BCL = 0x7F73 7F74 131 OUT10BCH = 0x7F74 7F75 132 OUT10BCL = 0x7F75 7F76 133 OUT11BCH = 0x7F76 7F77 134 OUT11BCL = 0x7F77 7F78 135 OUT12BCH = 0x7F78 7F79 136 OUT12BCL = 0x7F79 7F7A 137 OUT13BCH = 0x7F7A 7F7B 138 OUT13BCL = 0x7F7B 7F7C 139 OUT14BCH = 0x7F7C 7F7D 140 OUT14BCL = 0x7F7D 7F7E 141 OUT15BCH = 0x7F7E 7F7F 142 OUT15BCL = 0x7F7F 143 7FF0 144 OUT8ADDR = 0x7FF0 7FF1 145 OUT9ADDR = 0x7FF1 7FF2 146 OUT10ADDR = 0x7FF2 7FF3 147 OUT11ADDR = 0x7FF3 7FF4 148 OUT12ADDR = 0x7FF4 7FF5 149 OUT13ADDR = 0x7FF5 7FF6 150 OUT14ADDR = 0x7FF6 7FF7 151 OUT15ADDR = 0x7FF7 7FF8 152 IN8ADDR = 0x7FF8 7FF9 153 IN9ADDR = 0x7FF9 7FFA 154 IN10ADDR = 0x7FFA 7FFB 155 IN11ADDR = 0x7FFB 7FFC 156 IN12ADDR = 0x7FFC 7FFD 157 IN13ADDR = 0x7FFD 7FFE 158 IN14ADDR = 0x7FFE 7FFF 159 IN15ADDR = 0x7FFF 160 7FA0 161 ISOERR = 0x7FA0 7FA1 162 ISOCTL = 0x7FA1 7FA2 163 ZBCOUNT = 0x7FA2 7FE0 164 INISOVAL = 0x7FE0 7FE1 165 OUTISOVAL = 0x7FE1 7FE2 166 FASTXFR = 0x7FE2 167 168 ;; CPU control registers 169 7F92 170 CPUCS = 0x7F92 171 172 ;; IO port control registers 173 7F93 174 PORTACFG = 0x7F93 7F94 175 PORTBCFG = 0x7F94 7F95 176 PORTCCFG = 0x7F95 7F96 177 OUTA = 0x7F96 7F97 178 OUTB = 0x7F97 7F98 179 OUTC = 0x7F98 7F99 180 PINSA = 0x7F99 7F9A 181 PINSB = 0x7F9A 7F9B 182 PINSC = 0x7F9B 7F9C 183 OEA = 0x7F9C 7F9D 184 OEB = 0x7F9D 7F9E 185 OEC = 0x7F9E 186 187 ;; I2C controller registers 188 7FA5 189 I2CS = 0x7FA5 7FA6 190 I2DAT = 0x7FA6 191 192 ;; ----------------------------------------------------- 193 194 .area CODE (CODE) 0000 75 81 7F 195 mov sp,#0x7f 0003 E4 196 clr a 0004 F5 D0 197 mov psw,a 0006 F5 86 198 mov dps,a 199 200 ;; some indirect register setup 0008 75 8E 31 201 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 202 ;; disable interrupts 000B F5 A8 203 mov ie,a ; disable timer 0 int 000D F5 E8 204 mov eie,a ; disable USB interrupts 000F 90 7F AE 205 mov dptr,#USBIEN 0012 F0 206 movx @dptr,a 0013 90 7F AC 207 mov dptr,#IN07IEN 0016 F0 208 movx @dptr,a 0017 90 7F AD 209 mov dptr,#OUT07IEN 001A F0 210 movx @dptr,a 211 ;; allow Windows time to finish the writecpucs control transfer 212 ;; 10ms delay loop 001B 90 E8 90 213 mov dptr,#-6000 001E A3 214 3$: inc dptr ; 3 cycles 001F E5 82 215 mov a,dpl0 ; 2 cycles 0021 45 83 216 orl a,dph0 ; 2 cycles 0023 70 F9 217 jnz 3$ ; 3 cycles 218 ;; disconnect from USB bus 0025 90 7F D6 219 mov dptr,#USBCS 0028 E4 220 clr a 0029 F0 221 movx @dptr,a 222 ;; init USB subsystem 002A 90 7F A1 223 mov dptr,#ISOCTL 002D 74 01 224 mov a,#1 ; disable ISO endpoints 002F F0 225 movx @dptr,a 0030 90 7F AF 226 mov dptr,#USBBAV 0033 74 01 227 mov a,#1 ; enable autovector, disable breakpoint logic 0035 F0 228 movx @dptr,a 0036 E4 229 clr a 0037 90 7F E0 230 mov dptr,#INISOVAL 003A F0 231 movx @dptr,a 003B 90 7F E1 232 mov dptr,#OUTISOVAL 003E F0 233 movx @dptr,a 003F 90 7F DD 234 mov dptr,#USBPAIR 0042 F0 235 movx @dptr,a 0043 90 7F DE 236 mov dptr,#IN07VAL 0046 F0 237 movx @dptr,a 0047 90 7F DF 238 mov dptr,#OUT07VAL 004A F0 239 movx @dptr,a 240 ;; USB: clear endpoint toggles 004B 90 7F D7 241 mov dptr,#TOGCTL 004E 7F 07 242 mov r7,#7 ; clear endpoint toggles 1-7 0050 EF 243 10$: mov a,r7 0051 44 10 244 orl a,#0x10 0053 F0 245 movx @dptr,a 0054 44 30 246 orl a,#0x30 0056 F0 247 movx @dptr,a ; clear EP r7 in toggle 0057 EF 248 mov a,r7 0058 F0 249 movx @dptr,a 0059 44 20 250 orl a,#0x20 005B F0 251 movx @dptr,a ; clear EP r7 out toggle 005C DF F2 252 djnz r7,10$ 253 ;; configure IO ports 005E 90 7F 93 254 mov dptr,#PORTACFG 0061 74 00 255 mov a,#0 0063 F0 256 movx @dptr,a 0064 90 7F 96 257 mov dptr,#OUTA 0067 74 80 258 mov a,#0x80 ; set PROG lo 0069 F0 259 movx @dptr,a 006A 90 7F 9C 260 mov dptr,#OEA 006D 74 C2 261 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 006F F0 262 movx @dptr,a 0070 90 7F 94 263 mov dptr,#PORTBCFG 0073 74 00 264 mov a,#0 0075 F0 265 movx @dptr,a 0076 90 7F 9D 266 mov dptr,#OEB 0079 74 00 267 mov a,#0 007B F0 268 movx @dptr,a 007C 90 7F 95 269 mov dptr,#PORTCCFG 007F 74 00 270 mov a,#0 0081 F0 271 movx @dptr,a 0082 90 7F 98 272 mov dptr,#OUTC 0085 74 08 273 mov a,#0x08 0087 F0 274 movx @dptr,a 0088 90 7F 9E 275 mov dptr,#OEC 008B 74 2E 276 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 008D F0 277 movx @dptr,a 278 ;; wait 1 sec 008E 7A 64 279 mov r2,#100 280 ;; 10ms delay loop 0090 90 E8 90 281 0$: mov dptr,#-6000 0093 A3 282 1$: inc dptr ; 3 cycles 0094 E5 82 283 mov a,dpl0 ; 2 cycles 0096 45 83 284 orl a,dph0 ; 2 cycles 0098 70 F9 285 jnz 1$ ; 3 cycles 009A DA F4 286 djnz r2,0$ 287 ;; reconnect to USB bus 009C 90 7F D6 288 mov dptr,#USBCS 009F 74 04 289 mov a,#4 00A1 F0 290 movx @dptr,a 291 ;; light green led 00A2 90 7F 98 292 mov dptr,#OUTC 00A5 74 20 293 mov a,#0x20 00A7 F0 294 movx @dptr,a 295 0000 296 .if 0 297 ;; light green led 298 mov dptr,#OUTC 299 mov a,#0x20 300 movx @dptr,a 301 100$: sjmp 100$ 302 .else 303 ;; light green led 00A8 90 7F 98 304 100$: mov dptr,#OUTC 00AB 74 20 305 mov a,#0x20 00AD F0 306 movx @dptr,a 307 ;; wait 400ms 00AE 7A 28 308 mov r2,#40 309 ;; 10ms delay loop 00B0 90 E8 90 310 101$: mov dptr,#(-6000)&0xffff 00B3 A3 311 102$: inc dptr ; 3 cycles 00B4 E5 82 312 mov a,dpl0 ; 2 cycles 00B6 45 83 313 orl a,dph0 ; 2 cycles 00B8 70 F9 314 jnz 102$ ; 3 cycles 00BA DA F4 315 djnz r2,101$ 316 ;; switch green led off 00BC 90 7F 98 317 mov dptr,#OUTC 00BF 74 28 318 mov a,#0x28 00C1 F0 319 movx @dptr,a 320 ;; wait 100ms 00C2 7A 0A 321 mov r2,#10 322 ;; 10ms delay loop 00C4 90 E8 90 323 103$: mov dptr,#(-6000)&0xffff 00C7 A3 324 104$: inc dptr ; 3 cycles 00C8 E5 82 325 mov a,dpl0 ; 2 cycles 00CA 45 83 326 orl a,dph0 ; 2 cycles 00CC 70 F9 327 jnz 104$ ; 3 cycles 00CE DA F4 328 djnz r2,103$ 00D0 80 D6 329 sjmp 100$ 330 .endif 331 332 .area OSEG (OVR,DATA) 333 .area BSEG (BIT) 334 .area ISEG (DATA) 335 .area DSEG (DATA) 336 .area XSEG (DATA) baycomusb-0.10.orig/firmware/resetfirmware/main.rst0100644000175100017510000004165107325134422020572 0ustar abaaba 1 .module main 2 3 ;; this apparently does not work; the anchorchips controller 4 ;; sometimes gets into a state where it responds to get_device_descriptor 5 ;; requests with zero length descriptors 6 7 ;; define code segments link order 8 .area CODE (CODE) 9 10 ;; ----------------------------------------------------- 11 12 ;; special function registers (which are not predefined) 0082 13 dpl0 = 0x82 0083 14 dph0 = 0x83 0084 15 dpl1 = 0x84 0085 16 dph1 = 0x85 0086 17 dps = 0x86 008E 18 ckcon = 0x8E 008F 19 spc_fnc = 0x8F 0091 20 exif = 0x91 0092 21 mpage = 0x92 0098 22 scon0 = 0x98 0099 23 sbuf0 = 0x99 00C0 24 scon1 = 0xC0 00C1 25 sbuf1 = 0xC1 00D8 26 eicon = 0xD8 00E8 27 eie = 0xE8 00F8 28 eip = 0xF8 29 30 ;; anchor xdata registers 7F00 31 IN0BUF = 0x7F00 7EC0 32 OUT0BUF = 0x7EC0 7E80 33 IN1BUF = 0x7E80 7E40 34 OUT1BUF = 0x7E40 7E00 35 IN2BUF = 0x7E00 7DC0 36 OUT2BUF = 0x7DC0 7D80 37 IN3BUF = 0x7D80 7D40 38 OUT3BUF = 0x7D40 7D00 39 IN4BUF = 0x7D00 7CC0 40 OUT4BUF = 0x7CC0 7C80 41 IN5BUF = 0x7C80 7C40 42 OUT5BUF = 0x7C40 7C00 43 IN6BUF = 0x7C00 7BC0 44 OUT6BUF = 0x7BC0 7B80 45 IN7BUF = 0x7B80 7B40 46 OUT7BUF = 0x7B40 7FE8 47 SETUPBUF = 0x7FE8 7FE8 48 SETUPDAT = 0x7FE8 49 7FB4 50 EP0CS = 0x7FB4 7FB5 51 IN0BC = 0x7FB5 7FB6 52 IN1CS = 0x7FB6 7FB7 53 IN1BC = 0x7FB7 7FB8 54 IN2CS = 0x7FB8 7FB9 55 IN2BC = 0x7FB9 7FBA 56 IN3CS = 0x7FBA 7FBB 57 IN3BC = 0x7FBB 7FBC 58 IN4CS = 0x7FBC 7FBD 59 IN4BC = 0x7FBD 7FBE 60 IN5CS = 0x7FBE 7FBF 61 IN5BC = 0x7FBF 7FC0 62 IN6CS = 0x7FC0 7FC1 63 IN6BC = 0x7FC1 7FC2 64 IN7CS = 0x7FC2 7FC3 65 IN7BC = 0x7FC3 7FC5 66 OUT0BC = 0x7FC5 7FC6 67 OUT1CS = 0x7FC6 7FC7 68 OUT1BC = 0x7FC7 7FC8 69 OUT2CS = 0x7FC8 7FC9 70 OUT2BC = 0x7FC9 7FCA 71 OUT3CS = 0x7FCA 7FCB 72 OUT3BC = 0x7FCB 7FCC 73 OUT4CS = 0x7FCC 7FCD 74 OUT4BC = 0x7FCD 7FCE 75 OUT5CS = 0x7FCE 7FCF 76 OUT5BC = 0x7FCF 7FD0 77 OUT6CS = 0x7FD0 7FD1 78 OUT6BC = 0x7FD1 7FD2 79 OUT7CS = 0x7FD2 7FD3 80 OUT7BC = 0x7FD3 81 7FA8 82 IVEC = 0x7FA8 7FA9 83 IN07IRQ = 0x7FA9 7FAA 84 OUT07IRQ = 0x7FAA 7FAB 85 USBIRQ = 0x7FAB 7FAC 86 IN07IEN = 0x7FAC 7FAD 87 OUT07IEN = 0x7FAD 7FAE 88 USBIEN = 0x7FAE 7FAF 89 USBBAV = 0x7FAF 7FB2 90 BPADDRH = 0x7FB2 7FB3 91 BPADDRL = 0x7FB3 92 7FD4 93 SUDPTRH = 0x7FD4 7FD5 94 SUDPTRL = 0x7FD5 7FD6 95 USBCS = 0x7FD6 7FD7 96 TOGCTL = 0x7FD7 7FD8 97 USBFRAMEL = 0x7FD8 7FD9 98 USBFRAMEH = 0x7FD9 7FDB 99 FNADDR = 0x7FDB 7FDD 100 USBPAIR = 0x7FDD 7FDE 101 IN07VAL = 0x7FDE 7FDF 102 OUT07VAL = 0x7FDF 7FE3 103 AUTOPTRH = 0x7FE3 7FE4 104 AUTOPTRL = 0x7FE4 7FE5 105 AUTODATA = 0x7FE5 106 107 ;; isochronous endpoints. only available if ISODISAB=0 108 7F60 109 OUT8DATA = 0x7F60 7F61 110 OUT9DATA = 0x7F61 7F62 111 OUT10DATA = 0x7F62 7F63 112 OUT11DATA = 0x7F63 7F64 113 OUT12DATA = 0x7F64 7F65 114 OUT13DATA = 0x7F65 7F66 115 OUT14DATA = 0x7F66 7F67 116 OUT15DATA = 0x7F67 117 7F68 118 IN8DATA = 0x7F68 7F69 119 IN9DATA = 0x7F69 7F6A 120 IN10DATA = 0x7F6A 7F6B 121 IN11DATA = 0x7F6B 7F6C 122 IN12DATA = 0x7F6C 7F6D 123 IN13DATA = 0x7F6D 7F6E 124 IN14DATA = 0x7F6E 7F6F 125 IN15DATA = 0x7F6F 126 7F70 127 OUT8BCH = 0x7F70 7F71 128 OUT8BCL = 0x7F71 7F72 129 OUT9BCH = 0x7F72 7F73 130 OUT9BCL = 0x7F73 7F74 131 OUT10BCH = 0x7F74 7F75 132 OUT10BCL = 0x7F75 7F76 133 OUT11BCH = 0x7F76 7F77 134 OUT11BCL = 0x7F77 7F78 135 OUT12BCH = 0x7F78 7F79 136 OUT12BCL = 0x7F79 7F7A 137 OUT13BCH = 0x7F7A 7F7B 138 OUT13BCL = 0x7F7B 7F7C 139 OUT14BCH = 0x7F7C 7F7D 140 OUT14BCL = 0x7F7D 7F7E 141 OUT15BCH = 0x7F7E 7F7F 142 OUT15BCL = 0x7F7F 143 7FF0 144 OUT8ADDR = 0x7FF0 7FF1 145 OUT9ADDR = 0x7FF1 7FF2 146 OUT10ADDR = 0x7FF2 7FF3 147 OUT11ADDR = 0x7FF3 7FF4 148 OUT12ADDR = 0x7FF4 7FF5 149 OUT13ADDR = 0x7FF5 7FF6 150 OUT14ADDR = 0x7FF6 7FF7 151 OUT15ADDR = 0x7FF7 7FF8 152 IN8ADDR = 0x7FF8 7FF9 153 IN9ADDR = 0x7FF9 7FFA 154 IN10ADDR = 0x7FFA 7FFB 155 IN11ADDR = 0x7FFB 7FFC 156 IN12ADDR = 0x7FFC 7FFD 157 IN13ADDR = 0x7FFD 7FFE 158 IN14ADDR = 0x7FFE 7FFF 159 IN15ADDR = 0x7FFF 160 7FA0 161 ISOERR = 0x7FA0 7FA1 162 ISOCTL = 0x7FA1 7FA2 163 ZBCOUNT = 0x7FA2 7FE0 164 INISOVAL = 0x7FE0 7FE1 165 OUTISOVAL = 0x7FE1 7FE2 166 FASTXFR = 0x7FE2 167 168 ;; CPU control registers 169 7F92 170 CPUCS = 0x7F92 171 172 ;; IO port control registers 173 7F93 174 PORTACFG = 0x7F93 7F94 175 PORTBCFG = 0x7F94 7F95 176 PORTCCFG = 0x7F95 7F96 177 OUTA = 0x7F96 7F97 178 OUTB = 0x7F97 7F98 179 OUTC = 0x7F98 7F99 180 PINSA = 0x7F99 7F9A 181 PINSB = 0x7F9A 7F9B 182 PINSC = 0x7F9B 7F9C 183 OEA = 0x7F9C 7F9D 184 OEB = 0x7F9D 7F9E 185 OEC = 0x7F9E 186 187 ;; I2C controller registers 188 7FA5 189 I2CS = 0x7FA5 7FA6 190 I2DAT = 0x7FA6 191 192 ;; ----------------------------------------------------- 193 194 .area CODE (CODE) 0000 75 81 7F 195 mov sp,#0x7f 0003 E4 196 clr a 0004 F5 D0 197 mov psw,a 0006 F5 86 198 mov dps,a 199 200 ;; some indirect register setup 0008 75 8E 31 201 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 202 ;; disable interrupts 000B F5 A8 203 mov ie,a ; disable timer 0 int 000D F5 E8 204 mov eie,a ; disable USB interrupts 000F 90 7F AE 205 mov dptr,#USBIEN 0012 F0 206 movx @dptr,a 0013 90 7F AC 207 mov dptr,#IN07IEN 0016 F0 208 movx @dptr,a 0017 90 7F AD 209 mov dptr,#OUT07IEN 001A F0 210 movx @dptr,a 211 ;; allow Windows time to finish the writecpucs control transfer 212 ;; 10ms delay loop 001B 90 E8 90 213 mov dptr,#-6000 001E A3 214 3$: inc dptr ; 3 cycles 001F E5 82 215 mov a,dpl0 ; 2 cycles 0021 45 83 216 orl a,dph0 ; 2 cycles 0023 70 F9 217 jnz 3$ ; 3 cycles 218 ;; disconnect from USB bus 0025 90 7F D6 219 mov dptr,#USBCS 0028 E4 220 clr a 0029 F0 221 movx @dptr,a 222 ;; init USB subsystem 002A 90 7F A1 223 mov dptr,#ISOCTL 002D 74 01 224 mov a,#1 ; disable ISO endpoints 002F F0 225 movx @dptr,a 0030 90 7F AF 226 mov dptr,#USBBAV 0033 74 01 227 mov a,#1 ; enable autovector, disable breakpoint logic 0035 F0 228 movx @dptr,a 0036 E4 229 clr a 0037 90 7F E0 230 mov dptr,#INISOVAL 003A F0 231 movx @dptr,a 003B 90 7F E1 232 mov dptr,#OUTISOVAL 003E F0 233 movx @dptr,a 003F 90 7F DD 234 mov dptr,#USBPAIR 0042 F0 235 movx @dptr,a 0043 90 7F DE 236 mov dptr,#IN07VAL 0046 F0 237 movx @dptr,a 0047 90 7F DF 238 mov dptr,#OUT07VAL 004A F0 239 movx @dptr,a 240 ;; USB: clear endpoint toggles 004B 90 7F D7 241 mov dptr,#TOGCTL 004E 7F 07 242 mov r7,#7 ; clear endpoint toggles 1-7 0050 EF 243 10$: mov a,r7 0051 44 10 244 orl a,#0x10 0053 F0 245 movx @dptr,a 0054 44 30 246 orl a,#0x30 0056 F0 247 movx @dptr,a ; clear EP r7 in toggle 0057 EF 248 mov a,r7 0058 F0 249 movx @dptr,a 0059 44 20 250 orl a,#0x20 005B F0 251 movx @dptr,a ; clear EP r7 out toggle 005C DF F2 252 djnz r7,10$ 253 ;; configure IO ports 005E 90 7F 93 254 mov dptr,#PORTACFG 0061 74 00 255 mov a,#0 0063 F0 256 movx @dptr,a 0064 90 7F 96 257 mov dptr,#OUTA 0067 74 80 258 mov a,#0x80 ; set PROG lo 0069 F0 259 movx @dptr,a 006A 90 7F 9C 260 mov dptr,#OEA 006D 74 C2 261 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 006F F0 262 movx @dptr,a 0070 90 7F 94 263 mov dptr,#PORTBCFG 0073 74 00 264 mov a,#0 0075 F0 265 movx @dptr,a 0076 90 7F 9D 266 mov dptr,#OEB 0079 74 00 267 mov a,#0 007B F0 268 movx @dptr,a 007C 90 7F 95 269 mov dptr,#PORTCCFG 007F 74 00 270 mov a,#0 0081 F0 271 movx @dptr,a 0082 90 7F 98 272 mov dptr,#OUTC 0085 74 08 273 mov a,#0x08 0087 F0 274 movx @dptr,a 0088 90 7F 9E 275 mov dptr,#OEC 008B 74 2E 276 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 008D F0 277 movx @dptr,a 278 ;; wait 1 sec 008E 7A 64 279 mov r2,#100 280 ;; 10ms delay loop 0090 90 E8 90 281 0$: mov dptr,#-6000 0093 A3 282 1$: inc dptr ; 3 cycles 0094 E5 82 283 mov a,dpl0 ; 2 cycles 0096 45 83 284 orl a,dph0 ; 2 cycles 0098 70 F9 285 jnz 1$ ; 3 cycles 009A DA F4 286 djnz r2,0$ 287 ;; reconnect to USB bus 009C 90 7F D6 288 mov dptr,#USBCS 009F 74 04 289 mov a,#4 00A1 F0 290 movx @dptr,a 291 ;; light green led 00A2 90 7F 98 292 mov dptr,#OUTC 00A5 74 20 293 mov a,#0x20 00A7 F0 294 movx @dptr,a 295 0000 296 .if 0 297 ;; light green led 298 mov dptr,#OUTC 299 mov a,#0x20 300 movx @dptr,a 301 100$: sjmp 100$ 302 .else 303 ;; light green led 00A8 90 7F 98 304 100$: mov dptr,#OUTC 00AB 74 20 305 mov a,#0x20 00AD F0 306 movx @dptr,a 307 ;; wait 400ms 00AE 7A 28 308 mov r2,#40 309 ;; 10ms delay loop 00B0 90 E8 90 310 101$: mov dptr,#(-6000)&0xffff 00B3 A3 311 102$: inc dptr ; 3 cycles 00B4 E5 82 312 mov a,dpl0 ; 2 cycles 00B6 45 83 313 orl a,dph0 ; 2 cycles 00B8 70 F9 314 jnz 102$ ; 3 cycles 00BA DA F4 315 djnz r2,101$ 316 ;; switch green led off 00BC 90 7F 98 317 mov dptr,#OUTC 00BF 74 28 318 mov a,#0x28 00C1 F0 319 movx @dptr,a 320 ;; wait 100ms 00C2 7A 0A 321 mov r2,#10 322 ;; 10ms delay loop 00C4 90 E8 90 323 103$: mov dptr,#(-6000)&0xffff 00C7 A3 324 104$: inc dptr ; 3 cycles 00C8 E5 82 325 mov a,dpl0 ; 2 cycles 00CA 45 83 326 orl a,dph0 ; 2 cycles 00CC 70 F9 327 jnz 104$ ; 3 cycles 00CE DA F4 328 djnz r2,103$ 00D0 80 D6 329 sjmp 100$ 330 .endif 331 332 .area OSEG (OVR,DATA) 333 .area BSEG (BIT) 334 .area ISEG (DATA) 335 .area DSEG (DATA) 336 .area XSEG (DATA) baycomusb-0.10.orig/firmware/resetfirmware/main.map0100644000175100017510000000476307325134422020542 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 s_OSEG 0000 l_XSEG 0000 l__CODE 0000 s__CODE 0000 l_BSEG 0000 s_CODE 0000 l_DSEG 0000 l_ISEG 0000 s_BSEG 0000 l_OSEG 0040 s_DSEG 0080 s_ISEG 00D2 l_CODE 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 00D2 = 210. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ OSEG 0000 0000 = 0. bytes (REL,OVR) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 0000 = 0. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 0000 = 0. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/resetfirmware/main.asm0100644000175100017510000001465107325134422020542 0ustar abaaba .module main ;; this apparently does not work; the anchorchips controller ;; sometimes gets into a state where it responds to get_device_descriptor ;; requests with zero length descriptors ;; define code segments link order .area CODE (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; ----------------------------------------------------- .area CODE (CODE) mov sp,#0x7f clr a mov psw,a mov dps,a ;; some indirect register setup mov ckcon,#0x31 ; one external wait state, to avoid chip bugs ;; disable interrupts mov ie,a ; disable timer 0 int mov eie,a ; disable USB interrupts mov dptr,#USBIEN movx @dptr,a mov dptr,#IN07IEN movx @dptr,a mov dptr,#OUT07IEN movx @dptr,a ;; allow Windows time to finish the writecpucs control transfer ;; 10ms delay loop mov dptr,#-6000 3$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 3$ ; 3 cycles ;; disconnect from USB bus mov dptr,#USBCS clr a movx @dptr,a ;; init USB subsystem mov dptr,#ISOCTL mov a,#1 ; disable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a clr a mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR movx @dptr,a mov dptr,#IN07VAL movx @dptr,a mov dptr,#OUT07VAL movx @dptr,a ;; USB: clear endpoint toggles mov dptr,#TOGCTL mov r7,#7 ; clear endpoint toggles 1-7 10$: mov a,r7 orl a,#0x10 movx @dptr,a orl a,#0x30 movx @dptr,a ; clear EP r7 in toggle mov a,r7 movx @dptr,a orl a,#0x20 movx @dptr,a ; clear EP r7 out toggle djnz r7,10$ ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x80 ; set PROG lo movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0 movx @dptr,a mov dptr,#OUTC mov a,#0x08 movx @dptr,a mov dptr,#OEC mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO movx @dptr,a ;; wait 1 sec mov r2,#100 ;; 10ms delay loop 0$: mov dptr,#-6000 1$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 1$ ; 3 cycles djnz r2,0$ ;; reconnect to USB bus mov dptr,#USBCS mov a,#4 movx @dptr,a ;; light green led mov dptr,#OUTC mov a,#0x20 movx @dptr,a .if 0 ;; light green led mov dptr,#OUTC mov a,#0x20 movx @dptr,a 100$: sjmp 100$ .else ;; light green led 100$: mov dptr,#OUTC mov a,#0x20 movx @dptr,a ;; wait 400ms mov r2,#40 ;; 10ms delay loop 101$: mov dptr,#(-6000)&0xffff 102$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 102$ ; 3 cycles djnz r2,101$ ;; switch green led off mov dptr,#OUTC mov a,#0x28 movx @dptr,a ;; wait 100ms mov r2,#10 ;; 10ms delay loop 103$: mov dptr,#(-6000)&0xffff 104$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 104$ ; 3 cycles djnz r2,103$ sjmp 100$ .endif .area OSEG (OVR,DATA) .area BSEG (BIT) .area ISEG (DATA) .area DSEG (DATA) .area XSEG (DATA) baycomusb-0.10.orig/firmware/resetfirmware/main.lnk0100644000175100017510000000014707325134422020541 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/firmware/reset2firmware/0042755000175100017510000000000007340500004017162 5ustar abaababaycomusb-0.10.orig/firmware/reset2firmware/Makefile.in0100644000175100017510000001403107340500004021221 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ @HAVELD51_TRUE@noinst_DATA = $(top_srcdir)/firmware/reset2firmware/main.ihx EXTRA_DIST = main.ihx main.rel main.lst main.rst main.map main.asm main.lnk mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 firmware/reset2firmware/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 = firmware/reset2firmware 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 $(DATA) 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 @HAVEAS51_TRUE@$(top_srcdir)/firmware/reset2firmware/main.rel: $(top_srcdir)/firmware/reset2firmware/main.asm @HAVEAS51_TRUE@ $(AS8051) -plosgff $(top_srcdir)/firmware/reset2firmware/main.asm @HAVELD51_TRUE@$(top_srcdir)/firmware/reset2firmware/main.ihx: $(top_srcdir)/firmware/reset2firmware/main.rel @HAVELD51_TRUE@ cd $(top_srcdir)/firmware/reset2firmware; $(LD8051) -f main.lnk # 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: baycomusb-0.10.orig/firmware/reset2firmware/Makefile.am0100644000175100017510000000101007325134422021213 0ustar abaabaif HAVEAS51 $(top_srcdir)/firmware/reset2firmware/main.rel: $(top_srcdir)/firmware/reset2firmware/main.asm $(AS8051) -plosgff $(top_srcdir)/firmware/reset2firmware/main.asm endif if HAVELD51 noinst_DATA = $(top_srcdir)/firmware/reset2firmware/main.ihx $(top_srcdir)/firmware/reset2firmware/main.ihx: $(top_srcdir)/firmware/reset2firmware/main.rel cd $(top_srcdir)/firmware/reset2firmware; $(LD8051) -f main.lnk endif EXTRA_DIST = \ main.ihx main.rel main.lst main.rst main.map main.asm main.lnk baycomusb-0.10.orig/firmware/reset2firmware/main.ihx0100644000175100017510000002503607337536710020644 0ustar abaaba:06000000020BDF020236D4 :03000B0002025797 :030013000202875F :03001B000202A836 :030023000202C90D :03002B000202ECE2 :0300330002030DB8 :03003B0002032E8F :03004300020100B7 :03004B000203515C :030053000203762F :03005B0002039B02 :030063000203C0D5 :03010000020429CD :03010400020711DE :0301080002073CAF :03010C0002076780 :0301100002079251 :0101140032B8 :030118000207BD1E :03011C00020813C3 :030120000208CF03 :030124000208FDD1 :03012800020928A1 :03012C0002095372 :0301300002097E43 :030134000209A914 :030138000209D4E5 :03013C000209FFB6 :03014000020A2A86 :03014400020A5557 :03014800020A8028 :03014C00020AABF9 :03015000020AD6CA :03015400020B019A :080BDF00758180E4F5D0F58674 :060BE700E4F540F541F5C4 :040BED0042F543F595 :0C0BF10045F546F586F5A8758E3175892E :0E0BFD0021758855758D6475870090E890A36A :0D0C0B00E582458370F9907FA17401F0909F :0E0C18007FAF7401F0E4907FE0F0907FE1F098 :0D0C2600907FDD7409F0907FDE7407F09080 :0E0C33007FDF7405F0907FD77412F07432F0FA :0D0C41007402F07422F0907F937400F09024 :0E0C4E007F967480F0907F9C74C2F0907F942B :0E0C5C007400F0907F9D7400F0907F957400FE :0E0C6A00F0907F987420F0907F9E742EF075AD :0E0C7800A88275E801907FAE7401F0907FAC09 :0E0C86007403F0907FAD7401F075982075999D :0C0C9400FFE4F54BF54C907FD6740AF09D :0E0CA0007A1E90E890A3E582458370F9DAF49D :0D0CAE00907FD67402F07406F01208B0902A :0D0CBB007F967482F0907F99E030E206751C :060CC8004080020DF6124F :0E0CCE0001577A057B007C0612015D7A087BD7 :0D0CDC00007C0012015D7A087B017C001293 :0B0CE900015D74F82F60087540818FDA :0B0CF40041020DF67A057B057C0C1216 :0C0CFF00015D907F9E742AF0754001900A :0D0D0B007F9BE030E2FC7A037BFF7C01124D :0E0D1800015D907F967442F0907F937440F0DE :0D0D2600907F957402F0754010907FC8E436 :050D3300F0907FC9F003 :0E0D3800907FC9F0907FC8E020E1F9907FC95C :0E0D4600E024FE50ED907DC0E0B4FFE6A3E097 :080D5400B404E1754011800BAD :0B0D5C00907FC9F0907FC8E020E1F913 :0C0D6700907FC9E060EFFF2542F542E4F8 :0C0D73003543F543907DC0E08004E03083 :0E0D7F0099FDC299F599A3DFF5907F9BE020C6 :0C0D8D00E20C907FC87401F075409002E9 :020D99000DF655 :0B0D9B00749C254274D1354350B79082 :0D0DA6007F947400F0907F957400F07FFA48 :0E0DB300907F99E020E21F907F9BE020E206F7 :0D0DC100754090020DF6907F98E0D2E1F0B1 :0B0DCE00C2E1F0DFE0754091020DF67D :0E0DD9007F10907F98E0D2E1F0C2E1F0DFF8E9 :0D0DE700907F9574C0F075402090C0087496 :020DF40042F0CB :020DF60080FE7D :060157007A057B007CFF2D :0E015D007E017F007402CB13CB92E6CC13CC54 :0E016B0092E7907F96F0907F9BE030E003EEED :0E0179004207907F98E0D2E1F0C2E1F0EE2361 :04018700FEDAD722A3 :01018B001063 :0E018C000586907FA5C2F07480F0907FA6E5F6 :0E019A00F0F0907FA5E020E22030E0F930E1A7 :0E01A8000F907FA61586E0A30586F0907FA538 :0E01B600DFE77440F0E020E6FC1586EF227FC4 :0301C400FF80F1C8 :0E01C7000586907FA5D2F07480F0907FA6E5AB :0E01D500F0F0907FA5E020E24C30E0F930E140 :0E01E30003EF700B7440F0E020E6FC1586E49C :0E01F10022B401037420F0907FA6E0907FA559 :0E01FF00E020E22730E0F9EFB402037420F0B4 :0E020D00B401037440F0907FA6E01586F0A3C4 :0E021B000586907FA5DFDDE020E6FC1586E479 :0D022900227440F0E020E6FC74FF158622F0 :0E023600C0E0C0F0C082C083C0D075D000C050 :0E02440086758600C289D086D0D0D083D08245 :05025200D0F0D0E03205 :0E025700C0E0C0F0C082C083C0D075D000C02F :0C02650086758600C28D0544E5445407F0 :090271007007907F98E06408F02A :0D027A00D086D0D0D083D082D0F0D0E0323A :0E028700C0E0C0F0C082C083C0D075D000C0FF :0E02950086758600C28BD086D0D0D083D082F2 :0502A300D0F0D0E032B4 :0E02A800C0E0C0F0C082C083C0D075D000C0DE :0E02B60086758600C28FD086D0D0D083D082CD :0502C400D0F0D0E03293 :0E02C900C0E0C0F0C082C083C0D075D000C0BD :0E02D70086758600C298C299D086D0D0D0839A :0702E500D082D0F0D0E0321E :0E02EC00C0E0C0F0C082C083C0D075D000C09A :0E02FA0086758600C2CFD086D0D0D083D08249 :05030800D0F0D0E0324E :0E030D00C0E0C0F0C082C083C0D075D000C078 :0E031B0086758600C2DCD086D0D0D083D0821A :05032900D0F0D0E0322D :0E032E00C0E0C0F0C082C083C0D075D000C057 :0E033C0086758600C2C0C2C1D086D0D0D083E4 :07034A00D082D0F0D0E032B8 :0E035100C0E0C0F0C082C083C0D075D000C034 :0E035F0086758600E591C2E5F591D086D0D076 :09036D00D083D082D0F0D0E03240 :0E037600C0E0C0F0C082C083C0D075D000C00F :0E03840086758600E591C2E6F591D086D0D050 :09039200D083D082D0F0D0E0321B :0E039B00C0E0C0F0C082C083C0D075D000C0EA :0E03A90086758600E591C2E7F591D086D0D02A :0903B700D083D082D0F0D0E032F6 :0E03C000C0E0C0F0C082C083C0D075D000C0C5 :0E03CE0086758600C2DBD086D0D0D083D08268 :0503DC00D0F0D0E0327A :0803E100E549FF24C0F549E5E0 :0903E9004A34005012E4F549F514 :0C03F2004AF5467402907FB4F0EF6025DD :0C03FE008004F54A7F408F00854782850F :0D040A0048830586907F001586E0A30586D7 :0C041700F0A31586D8F68582478583483F :06042300EF907FB5F0220E :0E042900C0E0C0F0C082C083C084C085C0D0D7 :0E04370075D000C086758600C000C007E59134 :0D044500C2E4F591907FAB7401F0754600A4 :0E045200907FE9E0B40659907FE8E0B4804F57 :0D046000907FEBE0B4010C907FD4740BF0A2 :06046D00A3742CF080399D :0D047300B40212907FEAE07033907FD474E1 :080480000BF0A3743EF0802490 :0E048800B40324907FEAE024FC401CE025E051 :0C0496002483F582E4340BF583E0F5F0DC :0A04A200A3E0907FD4F0A3E5F0F092 :0304AC000206F64F :0304AF000206F250 :0E04B200B40941907FE8E070F4907FEAE02406 :0604C000FE40ECE0F54BEC :0E04C600907FD77807E84410F04430F0E8F05B :0E04D4004420F0D8F2E4F07402907FB678076E :0E04E200F0A3A3D8FB907FC67807F0A3A3D8A1 :0604F000FB1208B080B60B :0D04F600B40B1A907FE8E0B401AFE54BB401 :0D05030001AA907FECE070A4907FEAE0F583 :030510004C80B369 :0D051300B40A20907FE8E0B48192E54BB47B :0A052000018D907FECE07087E54C40 :0C052A00907F00F0907FB57401F0804ECF :0D053600B4080B907FE8E0B48047E54B80EF :01054300E6D1 :0B0544007044907FE8E0B48011740167 :0E054F00907F00F0A3E4F0907FB57402F0807E :01055D002677 :06055E00B48103E480EB10 :0E056400B48220907FECE0907FC430E70390DB :0E0572007FB4540F600F20E30C25E02582F5C6 :0405800082E080CBCA :030584000206F676 :030587000206F277 :08058A00B4030575F0018006C1 :06059200B4013E75F0000B :0E059800907FE8E0B402E8A3A3E070E3A3E0E4 :0E05A60070DFA3E0907FC430E705907FB4447F :0E05B4001020E3CF541F0586907FD7F044201F :0E05C200F0540FF0158625E02582F582E5F055 :0305D000F080B107 :0C05D300B4A33E907FEAE0F547A3E0F5FA :0C05DF00482450502D907FEEE0F5492597 :0605EB0047A3E0F54A35CC :0C05F10048401D907FE8E0B4400A7546C9 :0D05FD0001907FC5F00206FCB4C0097546F0 :07060A00021203E10206FCED :030611000206F2EC :0E061400B4B13E907FE8E0B4C034907F00E5C2 :0C06220040F0A3E541F0A3E581C082C0D8 :0E062E0083907FDFE0D083D082F0A37400C001 :0E063C0082C083907FC8E0D083D082F0A3906C :08064A007FB57404F00206F60E :030652000206F2AB :0E065500B4B22B907FE8E0B4C021907F00E5A6 :0806630040F0A3E541F0A3E51E :08066B0042F0A3E543F0A3E512 :0B06730045F0907FB57405F0054502CE :02067E0006F67E :030680000206F27D :0E068300B4B32A907FE8E0B4C02075F0A090D8 :0E069100018B7F0112018C7013907F007F0699 :0E069F001201C770097406907FB5F00206F6CE :0306AD000206F250 :0E06B000B4B43F907FEFE07036907FEEE0F83C :0D06BE00FF24C0402C907FECE0F5F0F547E4 :0D06CB00907FE8E0B4400A754602907FC5BC :0E06D800F00206FCB4C010907F001201C77043 :0906E60008E8907FB5F00206F669 :0306EF000206F20E :0406F200740380020B :0206F60074028C :0406F800907FB4F04B :0E06FC00D007D000D086D0D0D085D084D08357 :07070A00D082D0F0D0E032F4 :0E071100C0E0C0F0C082C083C0D075D000C070 :0E071F0086758600E591C2E4F591907FAB747B :0E072D0002F0D086D0D0D083D082D0F0D0E0C1 :01073B00328B :0E073C00C0E0C0F0C082C083C0D075D000C045 :0E074A0086758600E591C2E4F591907FAB7450 :0E07580004F0D086D0D0D083D082D0F0D0E094 :010766003260 :0E076700C0E0C0F0C082C083C0D075D000C01A :0E07750086758600E591C2E4F591907FAB7425 :0E07830008F0D086D0D0D083D082D0F0D0E065 :010791003235 :0E079200C0E0C0F0C082C083C0D075D000C0EF :0E07A00086758600E591C2E4F591907FAB74FA :0E07AE0010F0D086D0D0D083D082D0F0D0E032 :0107BC00320A :0E07BD00C0E0C0F0C082C083C084C085C0D040 :0E07CB0075D000C086758600C000C007E5919D :0D07D900C2E4F591907FA97401F0E546B4EB :0E07E60002051203E18011907FB5E4F080045B :0407F4007403800208 :0207F800740289 :0407FA00907FB4F048 :0E07FE00D007D000D086D0D0D085D084D08354 :07080C00D082D0F0D0E032F1 :0E081300C0E0C0F0C082C083C084C085C0D0E9 :0E08210075D000C086758600C000C006E59147 :0D082F00C2E4F591907FAA7401F0E546B493 :0D083C000136907FC5E06028FFC3E5499FAD :07084900F549E54A9400F5B2 :0A0850004A4038907EC08547848539 :0D085A004885E0A30586F0A31586DFF6852E :060867008447858548E589 :0B086D0049454A60208027B402149027 :0D0878007FC5E06015FF8547F0907EC0123F :06088500018C70028007E7 :07088B0075460074038005AF :05089200754600740230 :04089700907FB4F0AA :0E089B00D006D000D086D0D0D085D084D083B7 :0708A900D082D0F0D0E03254 :0C08B000907E80E540F0A3E541F0A3E558 :0808BC0042F0A3E543F0A3E5BF :0B08C40045F0907FB77405F005452259 :0E08CF00C0E0C0F0C082C083C0D075D000C0B1 :0E08DD0086758600E591C2E4F591907FA974BE :0E08EB0002F01208B0D086D0D0D083D082D0D8 :0408F900F0D0E03229 :0E08FD00C0E0C0F0C082C083C0D075D000C083 :0E090B0086758600E591C2E4F591907FAA748E :0E09190002F0D086D0D0D083D082D0F0D0E0D3 :01092700329D :0E092800C0E0C0F0C082C083C0D075D000C057 :0E09360086758600E591C2E4F591907FA97464 :0E09440004F0D086D0D0D083D082D0F0D0E0A6 :010952003272 :0E095300C0E0C0F0C082C083C0D075D000C02C :0E09610086758600E591C2E4F591907FAA7438 :0E096F0004F0D086D0D0D083D082D0F0D0E07B :01097D003247 :0E097E00C0E0C0F0C082C083C0D075D000C001 :0E098C0086758600E591C2E4F591907FA9740E :0E099A0008F0D086D0D0D083D082D0F0D0E04C :0109A800321C :0E09A900C0E0C0F0C082C083C0D075D000C0D6 :0E09B70086758600E591C2E4F591907FAA74E2 :0E09C50008F0D086D0D0D083D082D0F0D0E021 :0109D30032F1 :0E09D400C0E0C0F0C082C083C0D075D000C0AB :0E09E20086758600E591C2E4F591907FA974B8 :0E09F00010F0D086D0D0D083D082D0F0D0E0EE :0109FE0032C6 :0E09FF00C0E0C0F0C082C083C0D075D000C080 :0E0A0D0086758600E591C2E4F591907FAA748B :0E0A1B0010F0D086D0D0D083D082D0F0D0E0C2 :010A2900329A :0E0A2A00C0E0C0F0C082C083C0D075D000C054 :0E0A380086758600E591C2E4F591907FA97461 :0E0A460020F0D086D0D0D083D082D0F0D0E087 :010A5400326F :0E0A5500C0E0C0F0C082C083C0D075D000C029 :0E0A630086758600E591C2E4F591907FAA7435 :0E0A710020F0D086D0D0D083D082D0F0D0E05C :010A7F003244 :0E0A8000C0E0C0F0C082C083C0D075D000C0FE :0E0A8E0086758600E591C2E4F591907FA9740B :0E0A9C0040F0D086D0D0D083D082D0F0D0E011 :010AAA003219 :0E0AAB00C0E0C0F0C082C083C0D075D000C0D3 :0E0AB90086758600E591C2E4F591907FAA74DF :0E0AC70040F0D086D0D0D083D082D0F0D0E0E6 :010AD50032EE :0E0AD600C0E0C0F0C082C083C0D075D000C0A8 :0E0AE40086758600E591C2E4F591907FA974B5 :0E0AF20080F0D086D0D0D083D082D0F0D0E07B :010B000032C2 :0E0B0100C0E0C0F0C082C083C0D075D000C07C :0E0B0F0086758600E591C2E4F591907FAA7488 :0E0B1D0080F0D086D0D0D083D082D0F0D0E04F :010B2B003297 :0E0B2C0012010001FF00FF40C0BA3561020057 :040B3A0001020301B0 :0E0B3E00090245000101004000090400000307 :0E0B4C00FF00FF000705810240000007058240 :0E0B5A000240000007050202400000090400EE :0E0B68000103FF00FF000705810340000A079C :0D0B76000582024000000705020240000059 :020B83008B0BDA :020B85008F0BD4 :020B87009D0BC4 :020B8900BD0BA2 :040B8B00040300005F :0E0B8F000E0342006100790063006F006D00EC :0E0B9D00200355005300420046004C00450066 :0E0BAB0058002000280062006C0061006E00FF :040BB9006B002900A4 :0E0BBD00020300000000000000000000000025 :0E0BCB0000000000000000000000000000001C :060BD90000000000000016 :00000001FF baycomusb-0.10.orig/firmware/reset2firmware/main.rel0100644000175100017510000005552507337536710020644 0ustar abaabaXH H 9 areas 2 global symbols M main A _CODE size 0 flags 0 A CODE size 157 flags 20 A CSEG size A88 flags 20 S xmemread Def028A S fillusbintr Def0759 A GSINIT size 8 flags 20 A GSINIT2 size 211 flags 20 A BSEG size 0 flags 80 A ISEG size 80 flags 0 A DSEG size D flags 0 A XSEG size 0 flags 0 T 00 00 02 00 00 02 00 DF R 00 00 00 01 00 03 00 03 00 06 00 02 T 00 06 R 00 00 00 01 T 00 0B 02 01 00 R 00 00 00 01 00 03 00 02 T 00 0E R 00 00 00 01 T 00 13 02 01 30 R 00 00 00 01 00 03 00 02 T 00 16 R 00 00 00 01 T 00 1B 02 01 51 R 00 00 00 01 00 03 00 02 T 00 1E R 00 00 00 01 T 00 23 02 01 72 R 00 00 00 01 00 03 00 02 T 00 26 R 00 00 00 01 T 00 2B 02 01 95 R 00 00 00 01 00 03 00 02 T 00 2E R 00 00 00 01 T 00 33 02 01 B6 R 00 00 00 01 00 03 00 02 T 00 36 R 00 00 00 01 T 00 3B 02 01 D7 R 00 00 00 01 00 03 00 02 T 00 3E R 00 00 00 01 T 00 43 02 01 00 R 00 00 00 01 00 03 00 01 T 00 46 R 00 00 00 01 T 00 4B 02 01 FA R 00 00 00 01 00 03 00 02 T 00 4E R 00 00 00 01 T 00 53 02 02 1F R 00 00 00 01 00 03 00 02 T 00 56 R 00 00 00 01 T 00 5B 02 02 44 R 00 00 00 01 00 03 00 02 T 00 5E R 00 00 00 01 T 00 63 02 02 69 R 00 00 00 01 00 03 00 02 T 00 66 R 00 00 00 01 T 01 00 R 00 00 00 01 T 01 00 02 02 D2 R 00 00 00 01 00 03 00 02 T 01 03 R 00 00 00 01 T 01 04 02 05 BA R 00 00 00 01 00 03 00 02 T 01 07 R 00 00 00 01 T 01 08 02 05 E5 R 00 00 00 01 00 03 00 02 T 01 0B R 00 00 00 01 T 01 0C 02 06 10 R 00 00 00 01 00 03 00 02 T 01 0F R 00 00 00 01 T 01 10 02 06 3B R 00 00 00 01 00 03 00 02 T 01 13 R 00 00 00 01 T 01 14 32 R 00 00 00 01 T 01 15 R 00 00 00 01 T 01 18 02 06 66 R 00 00 00 01 00 03 00 02 T 01 1B R 00 00 00 01 T 01 1C 02 06 BC R 00 00 00 01 00 03 00 02 T 01 1F R 00 00 00 01 T 01 20 02 07 78 R 00 00 00 01 00 03 00 02 T 01 23 R 00 00 00 01 T 01 24 02 07 A6 R 00 00 00 01 00 03 00 02 T 01 27 R 00 00 00 01 T 01 28 02 07 D1 R 00 00 00 01 00 03 00 02 T 01 2B R 00 00 00 01 T 01 2C 02 07 FC R 00 00 00 01 00 03 00 02 T 01 2F R 00 00 00 01 T 01 30 02 08 27 R 00 00 00 01 00 03 00 02 T 01 33 R 00 00 00 01 T 01 34 02 08 52 R 00 00 00 01 00 03 00 02 T 01 37 R 00 00 00 01 T 01 38 02 08 7D R 00 00 00 01 00 03 00 02 T 01 3B R 00 00 00 01 T 01 3C 02 08 A8 R 00 00 00 01 00 03 00 02 T 01 3F R 00 00 00 01 T 01 40 02 08 D3 R 00 00 00 01 00 03 00 02 T 01 43 R 00 00 00 01 T 01 44 02 08 FE R 00 00 00 01 00 03 00 02 T 01 47 R 00 00 00 01 T 01 48 02 09 29 R 00 00 00 01 00 03 00 02 T 01 4B R 00 00 00 01 T 01 4C 02 09 54 R 00 00 00 01 00 03 00 02 T 01 4F R 00 00 00 01 T 01 50 02 09 7F R 00 00 00 01 00 03 00 02 T 01 53 R 00 00 00 01 T 01 54 02 09 AA R 00 00 00 01 00 03 00 02 T 00 00 R 00 00 00 06 T 00 00 R 00 00 00 07 T 00 01 R 00 00 00 07 T 00 02 R 00 00 00 07 T 00 04 R 00 00 00 07 T 00 05 R 00 00 00 07 T 00 06 R 00 00 00 07 T 00 07 R 00 00 00 07 T 00 09 R 00 00 00 07 T 00 0B R 00 00 00 07 T 00 0C R 00 00 00 07 T 00 00 R 00 00 00 03 T 00 00 75 81 00 00 E4 F5 D0 F5 86 R 00 00 00 03 09 04 00 06 T 00 08 R 00 00 00 03 T 00 00 R 00 00 00 04 T 00 00 E4 F5 00 00 F5 00 01 F5 R 00 00 00 04 29 04 00 07 29 07 00 07 T 00 06 00 02 F5 00 03 F5 R 00 00 00 04 29 02 00 07 29 05 00 07 T 00 0A 00 05 F5 00 06 F5 86 F5 A8 75 8E 31 75 89 R 00 00 00 04 29 02 00 07 29 05 00 07 T 00 16 21 75 88 55 75 8D 64 75 87 00 90 E8 90 A3 R 00 00 00 04 T 00 24 E5 82 45 83 70 F9 90 7F A1 74 01 F0 90 R 00 00 00 04 T 00 31 7F AF 74 01 F0 E4 90 7F E0 F0 90 7F E1 F0 R 00 00 00 04 T 00 3F 90 7F DD 74 09 F0 90 7F DE 74 07 F0 90 R 00 00 00 04 T 00 4C 7F DF 74 05 F0 90 7F D7 74 12 F0 74 32 F0 R 00 00 00 04 T 00 5A 74 02 F0 74 22 F0 90 7F 93 74 00 F0 90 R 00 00 00 04 T 00 67 7F 96 74 80 F0 90 7F 9C 74 C2 F0 90 7F 94 R 00 00 00 04 T 00 75 74 00 F0 90 7F 9D 74 00 F0 90 7F 95 74 00 R 00 00 00 04 T 00 83 F0 90 7F 98 74 20 F0 90 7F 9E 74 2E F0 75 R 00 00 00 04 T 00 91 A8 82 75 E8 01 90 7F AE 74 01 F0 90 7F AC R 00 00 00 04 T 00 9F 74 03 F0 90 7F AD 74 01 F0 75 98 20 75 99 R 00 00 00 04 T 00 AD FF E4 F5 00 0B F5 00 0C 90 7F D6 74 0A F0 R 00 00 00 04 29 05 00 07 29 08 00 07 T 00 B9 7A 1E 90 E8 90 A3 E5 82 45 83 70 F9 DA F4 R 00 00 00 04 T 00 C7 90 7F D6 74 02 F0 74 06 F0 12 07 59 90 R 00 00 00 04 00 0C 00 02 T 00 D4 7F 96 74 82 F0 90 7F 99 E0 30 E2 06 75 R 00 00 00 04 T 00 E1 00 00 80 02 02 0F 12 R 00 00 00 04 29 02 00 07 00 06 00 04 T 00 E7 00 00 7A 05 7B 00 7C 06 12 00 06 7A 08 7B R 00 00 00 04 00 02 00 02 00 0B 00 02 T 00 F5 00 7C 00 12 00 06 7A 08 7B 01 7C 00 12 R 00 00 00 04 00 06 00 02 T 01 02 00 06 74 F8 2F 60 08 75 00 00 81 8F R 00 00 00 04 00 02 00 02 29 0A 00 07 T 01 0D 00 01 02 02 0F 7A 05 7B 05 7C 0C 12 R 00 00 00 04 29 02 00 07 00 05 00 04 T 01 18 00 06 90 7F 9E 74 2A F0 75 00 00 01 90 R 00 00 00 04 00 02 00 02 29 0B 00 07 T 01 24 7F 9B E0 30 E2 FC 7A 03 7B FF 7C 01 12 R 00 00 00 04 T 01 31 00 06 90 7F 96 74 42 F0 90 7F 93 74 40 F0 R 00 00 00 04 00 02 00 02 T 01 3F 90 7F 95 74 02 F0 75 00 00 10 90 7F C8 E4 R 00 00 00 04 29 09 00 07 T 01 4C F0 90 7F C9 F0 R 00 00 00 04 T 01 51 R 00 00 00 04 T 01 51 90 7F C9 F0 90 7F C8 E0 20 E1 F9 90 7F C9 R 00 00 00 04 T 01 5F E0 24 FE 50 ED 90 7D C0 E0 B4 FF E6 A3 E0 R 00 00 00 04 T 01 6D B4 04 E1 75 00 00 11 80 0B R 00 00 00 04 29 06 00 07 T 01 75 R 00 00 00 04 T 01 75 90 7F C9 F0 90 7F C8 E0 20 E1 F9 R 00 00 00 04 T 01 80 R 00 00 00 04 T 01 80 90 7F C9 E0 60 EF FF 25 00 02 F5 00 02 E4 R 00 00 00 04 29 0A 00 07 29 0D 00 07 T 01 8C 35 00 03 F5 00 03 90 7D C0 E0 80 04 E0 30 R 00 00 00 04 29 03 00 07 29 06 00 07 T 01 98 99 FD C2 99 F5 99 A3 DF F5 90 7F 9B E0 20 R 00 00 00 04 T 01 A6 E2 0C 90 7F C8 74 01 F0 75 00 00 90 02 R 00 00 00 04 29 0B 00 07 T 01 B2 02 0F R 00 00 00 04 00 02 00 04 T 01 B4 R 00 00 00 04 T 01 B4 74 9C 25 00 02 74 D1 35 00 03 50 B7 90 R 00 00 00 04 29 05 00 07 29 0A 00 07 T 01 BF 7F 94 74 00 F0 90 7F 95 74 00 F0 7F FA R 00 00 00 04 T 01 CC R 00 00 00 04 T 01 CC 90 7F 99 E0 20 E2 1F 90 7F 9B E0 20 E2 06 R 00 00 00 04 T 01 DA 75 00 00 90 02 02 0F 90 7F 98 E0 D2 E1 F0 R 00 00 00 04 29 03 00 07 00 07 00 04 T 01 E7 C2 E1 F0 DF E0 75 00 00 91 02 02 0F R 00 00 00 04 29 08 00 07 00 0C 00 04 T 01 F2 R 00 00 00 04 T 01 F2 7F 10 90 7F 98 E0 D2 E1 F0 C2 E1 F0 DF F8 R 00 00 00 04 T 02 00 90 7F 95 74 C0 F0 75 00 00 20 90 C0 08 74 R 00 00 00 04 29 09 00 07 T 02 0D 42 F0 R 00 00 00 04 T 02 0F R 00 00 00 04 T 02 0F 80 FE R 00 00 00 04 T 00 00 R 00 00 00 02 T 00 00 7A 05 7B 00 7C FF R 00 00 00 02 T 00 06 R 00 00 00 02 T 00 06 R 00 00 00 02 T 00 06 7E 01 7F 00 74 02 CB 13 CB 92 E6 CC 13 CC R 00 00 00 02 T 00 14 92 E7 90 7F 96 F0 90 7F 9B E0 30 E0 03 EE R 00 00 00 02 T 00 22 42 07 90 7F 98 E0 D2 E1 F0 C2 E1 F0 EE 23 R 00 00 00 02 T 00 30 FE DA D7 22 R 00 00 00 02 T 00 34 R 00 00 00 02 T 00 34 10 R 00 00 00 02 T 00 35 R 00 00 00 02 T 00 35 05 86 90 7F A5 C2 F0 74 80 F0 90 7F A6 E5 R 00 00 00 02 T 00 43 F0 F0 90 7F A5 E0 20 E2 20 30 E0 F9 30 E1 R 00 00 00 02 T 00 51 0F 90 7F A6 15 86 E0 A3 05 86 F0 90 7F A5 R 00 00 00 02 T 00 5F DF E7 74 40 F0 E0 20 E6 FC 15 86 EF 22 7F R 00 00 00 02 T 00 6D FF 80 F1 R 00 00 00 02 T 00 70 R 00 00 00 02 T 00 70 05 86 90 7F A5 D2 F0 74 80 F0 90 7F A6 E5 R 00 00 00 02 T 00 7E F0 F0 90 7F A5 E0 20 E2 4C 30 E0 F9 30 E1 R 00 00 00 02 T 00 8C 03 EF 70 0B 74 40 F0 E0 20 E6 FC 15 86 E4 R 00 00 00 02 T 00 9A 22 B4 01 03 74 20 F0 90 7F A6 E0 90 7F A5 R 00 00 00 02 T 00 A8 E0 20 E2 27 30 E0 F9 EF B4 02 03 74 20 F0 R 00 00 00 02 T 00 B6 B4 01 03 74 40 F0 90 7F A6 E0 15 86 F0 A3 R 00 00 00 02 T 00 C4 05 86 90 7F A5 DF DD E0 20 E6 FC 15 86 E4 R 00 00 00 02 T 00 D2 22 74 40 F0 E0 20 E6 FC 74 FF 15 86 22 R 00 00 00 02 T 00 DF R 00 00 00 02 T 00 DF C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 00 ED 86 75 86 00 C2 89 D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 00 FB D0 F0 D0 E0 32 R 00 00 00 02 T 01 00 R 00 00 00 02 T 01 00 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 0E 86 75 86 00 C2 8D 05 00 04 E5 00 04 54 07 R 00 00 00 02 29 09 00 07 29 0C 00 07 T 01 1A 70 07 90 7F 98 E0 64 08 F0 R 00 00 00 02 T 01 23 R 00 00 00 02 T 01 23 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 30 R 00 00 00 02 T 01 30 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 3E 86 75 86 00 C2 8B D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 4C D0 F0 D0 E0 32 R 00 00 00 02 T 01 51 R 00 00 00 02 T 01 51 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 5F 86 75 86 00 C2 8F D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 6D D0 F0 D0 E0 32 R 00 00 00 02 T 01 72 R 00 00 00 02 T 01 72 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 80 86 75 86 00 C2 98 C2 99 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 8E D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 95 R 00 00 00 02 T 01 95 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 A3 86 75 86 00 C2 CF D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 B1 D0 F0 D0 E0 32 R 00 00 00 02 T 01 B6 R 00 00 00 02 T 01 B6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 C4 86 75 86 00 C2 DC D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 01 D2 D0 F0 D0 E0 32 R 00 00 00 02 T 01 D7 R 00 00 00 02 T 01 D7 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 01 E5 86 75 86 00 C2 C0 C2 C1 D0 86 D0 D0 D0 83 R 00 00 00 02 T 01 F3 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 01 FA R 00 00 00 02 T 01 FA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 08 86 75 86 00 E5 91 C2 E5 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 16 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 1F R 00 00 00 02 T 02 1F C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 2D 86 75 86 00 E5 91 C2 E6 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 3B D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 44 R 00 00 00 02 T 02 44 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 52 86 75 86 00 E5 91 C2 E7 F5 91 D0 86 D0 D0 R 00 00 00 02 T 02 60 D0 83 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 02 69 R 00 00 00 02 T 02 69 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 02 77 86 75 86 00 C2 DB D0 86 D0 D0 D0 83 D0 82 R 00 00 00 02 T 02 85 D0 F0 D0 E0 32 R 00 00 00 02 T 02 8A R 00 00 00 02 T 02 8A E5 00 09 FF 24 C0 F5 00 09 E5 R 00 00 00 02 29 03 00 07 29 09 00 07 T 02 92 00 0A 34 00 50 12 E4 F5 00 09 F5 R 00 00 00 02 29 02 00 07 29 0A 00 07 T 02 9B 00 0A F5 00 06 74 02 90 7F B4 F0 EF 60 25 R 00 00 00 02 29 02 00 07 29 05 00 07 T 02 A7 80 04 F5 00 0A 7F 40 8F 00 85 00 07 82 85 R 00 00 00 02 29 05 00 07 29 0C 00 07 T 02 B3 00 08 83 05 86 90 7F 00 15 86 E0 A3 05 86 R 00 00 00 02 29 02 00 07 T 02 C0 F0 A3 15 86 D8 F6 85 82 00 07 85 83 00 08 R 00 00 00 02 29 0A 00 07 29 0E 00 07 T 02 CC EF 90 7F B5 F0 22 R 00 00 00 02 T 02 D2 R 00 00 00 02 T 02 D2 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 02 E0 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 02 EE C2 E4 F5 91 90 7F AB 74 01 F0 75 00 06 00 R 00 00 00 02 29 0D 00 07 T 02 FB 90 7F E9 E0 B4 06 59 90 7F E8 E0 B4 80 4F R 00 00 00 02 T 03 09 90 7F EB E0 B4 01 0C 90 7F D4 74 09 D5 F0 R 00 00 00 02 89 0D 00 02 T 03 16 A3 74 09 D5 F0 80 39 R 00 00 00 02 09 04 00 02 T 03 1C R 00 00 00 02 T 03 1C B4 02 12 90 7F EA E0 70 33 90 7F D4 74 R 00 00 00 02 T 03 29 09 E7 F0 A3 74 09 E7 F0 80 24 R 00 00 00 02 89 02 00 02 09 07 00 02 T 03 31 R 00 00 00 02 T 03 31 B4 03 24 90 7F EA E0 24 FC 40 1C E0 25 E0 R 00 00 00 02 T 03 3F 24 0A 2C F5 82 E4 34 0A 2C F5 83 E0 F5 F0 R 00 00 00 02 09 03 00 02 89 09 00 02 T 03 4B A3 E0 90 7F D4 F0 A3 E5 F0 F0 R 00 00 00 02 T 03 55 R 00 00 00 02 T 03 55 02 05 9F R 00 00 00 02 00 03 00 02 T 03 58 R 00 00 00 02 T 03 58 02 05 9B R 00 00 00 02 00 03 00 02 T 03 5B R 00 00 00 02 T 03 5B B4 09 41 90 7F E8 E0 70 F4 90 7F EA E0 24 R 00 00 00 02 T 03 69 FE 40 EC E0 F5 00 0B R 00 00 00 02 29 07 00 07 T 03 6F R 00 00 00 02 T 03 6F 90 7F D7 78 07 E8 44 10 F0 44 30 F0 E8 F0 R 00 00 00 02 T 03 7D 44 20 F0 D8 F2 E4 F0 74 02 90 7F B6 78 07 R 00 00 00 02 T 03 8B F0 A3 A3 D8 FB 90 7F C6 78 07 F0 A3 A3 D8 R 00 00 00 02 T 03 99 FB 12 07 59 80 B6 R 00 00 00 02 00 04 00 02 T 03 9F R 00 00 00 02 T 03 9F B4 0B 1A 90 7F E8 E0 B4 01 AF E5 00 0B B4 R 00 00 00 02 29 0D 00 07 T 03 AC 01 AA 90 7F EC E0 70 A4 90 7F EA E0 F5 R 00 00 00 02 T 03 B9 00 0C 80 B3 R 00 00 00 02 29 02 00 07 T 03 BC R 00 00 00 02 T 03 BC B4 0A 20 90 7F E8 E0 B4 81 92 E5 00 0B B4 R 00 00 00 02 29 0D 00 07 T 03 C9 01 8D 90 7F EC E0 70 87 E5 00 0C R 00 00 00 02 29 0B 00 07 T 03 D3 R 00 00 00 02 T 03 D3 90 7F 00 F0 90 7F B5 74 01 F0 80 4E R 00 00 00 02 T 03 DF R 00 00 00 02 T 03 DF B4 08 0B 90 7F E8 E0 B4 80 47 E5 00 0B 80 R 00 00 00 02 29 0D 00 07 T 03 EC E6 R 00 00 00 02 T 03 ED R 00 00 00 02 T 03 ED 70 44 90 7F E8 E0 B4 80 11 74 01 R 00 00 00 02 T 03 F8 R 00 00 00 02 T 03 F8 90 7F 00 F0 A3 E4 F0 90 7F B5 74 02 F0 80 R 00 00 00 02 T 04 06 26 R 00 00 00 02 T 04 07 R 00 00 00 02 T 04 07 B4 81 03 E4 80 EB R 00 00 00 02 T 04 0D R 00 00 00 02 T 04 0D B4 82 20 90 7F EC E0 90 7F C4 30 E7 03 90 R 00 00 00 02 T 04 1B 7F B4 54 0F 60 0F 20 E3 0C 25 E0 25 82 F5 R 00 00 00 02 T 04 29 82 E0 80 CB R 00 00 00 02 T 04 2D R 00 00 00 02 T 04 2D 02 05 9F R 00 00 00 02 00 03 00 02 T 04 30 R 00 00 00 02 T 04 30 02 05 9B R 00 00 00 02 00 03 00 02 T 04 33 R 00 00 00 02 T 04 33 B4 03 05 75 F0 01 80 06 R 00 00 00 02 T 04 3B R 00 00 00 02 T 04 3B B4 01 3E 75 F0 00 R 00 00 00 02 T 04 41 R 00 00 00 02 T 04 41 90 7F E8 E0 B4 02 E8 A3 A3 E0 70 E3 A3 E0 R 00 00 00 02 T 04 4F 70 DF A3 E0 90 7F C4 30 E7 05 90 7F B4 44 R 00 00 00 02 T 04 5D 10 20 E3 CF 54 1F 05 86 90 7F D7 F0 44 20 R 00 00 00 02 T 04 6B F0 54 0F F0 15 86 25 E0 25 82 F5 82 E5 F0 R 00 00 00 02 T 04 79 F0 80 B1 R 00 00 00 02 T 04 7C R 00 00 00 02 T 04 7C B4 A3 3E 90 7F EA E0 F5 00 07 A3 E0 F5 R 00 00 00 02 29 0A 00 07 T 04 88 00 08 24 50 50 2D 90 7F EE E0 F5 00 09 25 R 00 00 00 02 29 02 00 07 29 0D 00 07 T 04 94 00 07 A3 E0 F5 00 0A 35 R 00 00 00 02 29 02 00 07 29 07 00 07 T 04 9A 00 08 40 1D 90 7F E8 E0 B4 40 0A 75 00 06 R 00 00 00 02 29 02 00 07 29 0E 00 07 T 04 A6 01 90 7F C5 F0 02 05 A5 B4 C0 09 75 00 06 R 00 00 00 02 00 08 00 02 29 0E 00 07 T 04 B3 02 12 02 8A 02 05 A5 R 00 00 00 02 00 04 00 02 00 07 00 02 T 04 BA R 00 00 00 02 T 04 BA 02 05 9B R 00 00 00 02 00 03 00 02 T 04 BD R 00 00 00 02 T 04 BD B4 B1 3E 90 7F E8 E0 B4 C0 34 90 7F 00 E5 R 00 00 00 02 T 04 CB 00 00 F0 A3 E5 00 01 F0 A3 E5 81 C0 82 C0 R 00 00 00 02 29 02 00 07 29 07 00 07 T 04 D7 83 90 7F DF E0 D0 83 D0 82 F0 A3 74 00 C0 R 00 00 00 02 T 04 E5 82 C0 83 90 7F C8 E0 D0 83 D0 82 F0 A3 90 R 00 00 00 02 T 04 F3 7F B5 74 04 F0 02 05 9F R 00 00 00 02 00 08 00 02 T 04 FB R 00 00 00 02 T 04 FB 02 05 9B R 00 00 00 02 00 03 00 02 T 04 FE R 00 00 00 02 T 04 FE B4 B2 2B 90 7F E8 E0 B4 C0 21 90 7F 00 E5 R 00 00 00 02 T 05 0C 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 02 00 07 29 07 00 07 T 05 14 00 02 F0 A3 E5 00 03 F0 A3 E5 R 00 00 00 02 29 02 00 07 29 07 00 07 T 05 1C 00 05 F0 90 7F B5 74 05 F0 05 00 05 02 R 00 00 00 02 29 02 00 07 29 0C 00 07 T 05 27 05 9F R 00 00 00 02 00 02 00 02 T 05 29 R 00 00 00 02 T 05 29 02 05 9B R 00 00 00 02 00 03 00 02 T 05 2C R 00 00 00 02 T 05 2C B4 B3 2A 90 7F E8 E0 B4 C0 20 75 F0 A0 90 R 00 00 00 02 T 05 3A 00 34 7F 01 12 00 35 70 13 90 7F 00 7F 06 R 00 00 00 02 00 02 00 02 00 07 00 02 T 05 48 12 00 70 70 09 74 06 90 7F B5 F0 02 05 9F R 00 00 00 02 00 03 00 02 00 0E 00 02 T 05 56 R 00 00 00 02 T 05 56 02 05 9B R 00 00 00 02 00 03 00 02 T 05 59 R 00 00 00 02 T 05 59 B4 B4 3F 90 7F EF E0 70 36 90 7F EE E0 F8 R 00 00 00 02 T 05 67 FF 24 C0 40 2C 90 7F EC E0 F5 F0 F5 00 07 R 00 00 00 02 29 0E 00 07 T 05 74 90 7F E8 E0 B4 40 0A 75 00 06 02 90 7F C5 R 00 00 00 02 29 0A 00 07 T 05 81 F0 02 05 A5 B4 C0 10 90 7F 00 12 00 70 70 R 00 00 00 02 00 04 00 02 00 0D 00 02 T 05 8F 08 E8 90 7F B5 F0 02 05 9F R 00 00 00 02 00 09 00 02 T 05 98 R 00 00 00 02 T 05 98 02 05 9B R 00 00 00 02 00 03 00 02 T 05 9B R 00 00 00 02 T 05 9B R 00 00 00 02 T 05 9B 74 03 80 02 R 00 00 00 02 T 05 9F R 00 00 00 02 T 05 9F 74 02 R 00 00 00 02 T 05 A1 R 00 00 00 02 T 05 A1 90 7F B4 F0 R 00 00 00 02 T 05 A5 R 00 00 00 02 T 05 A5 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 05 B3 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 05 BA R 00 00 00 02 T 05 BA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 05 C8 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 05 D6 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 05 E4 32 R 00 00 00 02 T 05 E5 R 00 00 00 02 T 05 E5 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 05 F3 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 06 01 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 0F 32 R 00 00 00 02 T 06 10 R 00 00 00 02 T 06 10 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 1E 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 06 2C 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 3A 32 R 00 00 00 02 T 06 3B R 00 00 00 02 T 06 3B C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 06 49 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AB 74 R 00 00 00 02 T 06 57 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 06 65 32 R 00 00 00 02 T 06 66 R 00 00 00 02 T 06 66 C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 06 74 75 D0 00 C0 86 75 86 00 C0 00 C0 07 E5 91 R 00 00 00 02 T 06 82 C2 E4 F5 91 90 7F A9 74 01 F0 E5 00 06 B4 R 00 00 00 02 29 0D 00 07 T 06 8F 02 05 12 02 8A 80 11 90 7F B5 E4 F0 80 04 R 00 00 00 02 00 05 00 02 T 06 9D R 00 00 00 02 T 06 9D 74 03 80 02 R 00 00 00 02 T 06 A1 R 00 00 00 02 T 06 A1 74 02 R 00 00 00 02 T 06 A3 R 00 00 00 02 T 06 A3 90 7F B4 F0 R 00 00 00 02 T 06 A7 R 00 00 00 02 T 06 A7 D0 07 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 06 B5 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 06 BC R 00 00 00 02 T 06 BC C0 E0 C0 F0 C0 82 C0 83 C0 84 C0 85 C0 D0 R 00 00 00 02 T 06 CA 75 D0 00 C0 86 75 86 00 C0 00 C0 06 E5 91 R 00 00 00 02 T 06 D8 C2 E4 F5 91 90 7F AA 74 01 F0 E5 00 06 B4 R 00 00 00 02 29 0D 00 07 T 06 E5 01 36 90 7F C5 E0 60 28 FF C3 E5 00 09 9F R 00 00 00 02 29 0D 00 07 T 06 F2 F5 00 09 E5 00 0A 94 00 F5 R 00 00 00 02 29 03 00 07 29 06 00 07 T 06 F9 00 0A 40 38 90 7E C0 85 00 07 84 85 R 00 00 00 02 29 02 00 07 29 0A 00 07 T 07 03 00 08 85 E0 A3 05 86 F0 A3 15 86 DF F6 85 R 00 00 00 02 29 02 00 07 T 07 10 84 00 07 85 85 00 08 E5 R 00 00 00 02 29 03 00 07 29 07 00 07 T 07 16 00 09 45 00 0A 60 20 80 27 B4 02 14 90 R 00 00 00 02 29 02 00 07 29 05 00 07 T 07 21 7F C5 E0 60 15 FF 85 00 07 F0 90 7E C0 12 R 00 00 00 02 29 09 00 07 T 07 2E 00 35 70 02 80 07 R 00 00 00 02 00 02 00 02 T 07 34 R 00 00 00 02 T 07 34 75 00 06 00 74 03 80 05 R 00 00 00 02 29 03 00 07 T 07 3B R 00 00 00 02 T 07 3B 75 00 06 00 74 02 R 00 00 00 02 29 03 00 07 T 07 40 R 00 00 00 02 T 07 40 90 7F B4 F0 R 00 00 00 02 T 07 44 R 00 00 00 02 T 07 44 D0 06 D0 00 D0 86 D0 D0 D0 85 D0 84 D0 83 R 00 00 00 02 T 07 52 D0 82 D0 F0 D0 E0 32 R 00 00 00 02 T 07 59 R 00 00 00 02 T 07 59 90 7E 80 E5 00 00 F0 A3 E5 00 01 F0 A3 E5 R 00 00 00 02 29 06 00 07 29 0B 00 07 T 07 65 00 02 F0 A3 E5 00 03 F0 A3 E5 R 00 00 00 02 29 02 00 07 29 07 00 07 T 07 6D 00 05 F0 90 7F B7 74 05 F0 05 00 05 22 R 00 00 00 02 29 02 00 07 29 0C 00 07 T 07 78 R 00 00 00 02 T 07 78 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 86 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 94 02 F0 12 07 59 D0 86 D0 D0 D0 83 D0 82 D0 R 00 00 00 02 00 05 00 02 T 07 A2 F0 D0 E0 32 R 00 00 00 02 T 07 A6 R 00 00 00 02 T 07 A6 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 B4 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 07 C2 02 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 D0 32 R 00 00 00 02 T 07 D1 R 00 00 00 02 T 07 D1 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 07 DF 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 07 ED 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 07 FB 32 R 00 00 00 02 T 07 FC R 00 00 00 02 T 07 FC C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 0A 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 08 18 04 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 26 32 R 00 00 00 02 T 08 27 R 00 00 00 02 T 08 27 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 35 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 08 43 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 51 32 R 00 00 00 02 T 08 52 R 00 00 00 02 T 08 52 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 60 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 08 6E 08 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 7C 32 R 00 00 00 02 T 08 7D R 00 00 00 02 T 08 7D C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 8B 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 08 99 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 A7 32 R 00 00 00 02 T 08 A8 R 00 00 00 02 T 08 A8 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 B6 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 08 C4 10 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 D2 32 R 00 00 00 02 T 08 D3 R 00 00 00 02 T 08 D3 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 08 E1 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 08 EF 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 08 FD 32 R 00 00 00 02 T 08 FE R 00 00 00 02 T 08 FE C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 0C 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 1A 20 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 28 32 R 00 00 00 02 T 09 29 R 00 00 00 02 T 09 29 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 37 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 45 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 53 32 R 00 00 00 02 T 09 54 R 00 00 00 02 T 09 54 C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 62 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 70 40 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 7E 32 R 00 00 00 02 T 09 7F R 00 00 00 02 T 09 7F C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 8D 86 75 86 00 E5 91 C2 E4 F5 91 90 7F A9 74 R 00 00 00 02 T 09 9B 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 A9 32 R 00 00 00 02 T 09 AA R 00 00 00 02 T 09 AA C0 E0 C0 F0 C0 82 C0 83 C0 D0 75 D0 00 C0 R 00 00 00 02 T 09 B8 86 75 86 00 E5 91 C2 E4 F5 91 90 7F AA 74 R 00 00 00 02 T 09 C6 80 F0 D0 86 D0 D0 D0 83 D0 82 D0 F0 D0 E0 R 00 00 00 02 T 09 D4 32 R 00 00 00 02 T 09 D5 R 00 00 00 02 T 09 D5 12 01 00 01 FF 00 FF 40 C0 BA 35 61 02 00 R 00 00 00 02 T 09 E3 01 02 03 01 R 00 00 00 02 T 09 E7 R 00 00 00 02 T 09 E7 09 02 45 00 01 01 00 40 00 09 04 00 00 03 R 00 00 00 02 T 09 F5 FF 00 FF 00 07 05 81 02 40 00 00 07 05 82 R 00 00 00 02 T 0A 03 02 40 00 00 07 05 02 02 40 00 00 09 04 00 R 00 00 00 02 T 0A 11 01 03 FF 00 FF 00 07 05 81 03 40 00 0A 07 R 00 00 00 02 T 0A 1F 05 82 02 40 00 00 07 05 02 02 40 00 00 R 00 00 00 02 T 0A 2C R 00 00 00 02 T 0A 2C 0A 34 0A 34 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0A 2E 0A 38 0A 38 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0A 30 0A 46 0A 46 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0A 32 0A 66 0A 66 R 00 00 00 02 09 02 00 02 89 04 00 02 T 0A 34 R 00 00 00 02 T 0A 34 04 03 00 00 R 00 00 00 02 T 0A 38 R 00 00 00 02 T 0A 38 0E 03 42 00 61 00 79 00 63 00 6F 00 6D 00 R 00 00 00 02 T 0A 46 R 00 00 00 02 T 0A 46 20 03 55 00 53 00 42 00 46 00 4C 00 45 00 R 00 00 00 02 T 0A 54 58 00 20 00 28 00 62 00 6C 00 61 00 6E 00 R 00 00 00 02 T 0A 62 6B 00 29 00 R 00 00 00 02 T 0A 66 R 00 00 00 02 T 0A 66 02 03 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0A 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R 00 00 00 02 T 0A 82 00 00 00 00 00 00 R 00 00 00 02 baycomusb-0.10.orig/firmware/reset2firmware/main.lst0100644000175100017510000033572507337536710020667 0ustar abaaba 1 .module main 2 3 ;; define code segments link order 4 .area CODE (CODE) 5 .area CSEG (CODE) 6 .area GSINIT (CODE) 7 .area GSINIT2 (CODE) 8 9 ;; ----------------------------------------------------- 10 11 ;; special function registers (which are not predefined) 0082 12 dpl0 = 0x82 0083 13 dph0 = 0x83 0084 14 dpl1 = 0x84 0085 15 dph1 = 0x85 0086 16 dps = 0x86 008E 17 ckcon = 0x8E 008F 18 spc_fnc = 0x8F 0091 19 exif = 0x91 0092 20 mpage = 0x92 0098 21 scon0 = 0x98 0099 22 sbuf0 = 0x99 00C0 23 scon1 = 0xC0 00C1 24 sbuf1 = 0xC1 00D8 25 eicon = 0xD8 00E8 26 eie = 0xE8 00F8 27 eip = 0xF8 28 29 ;; anchor xdata registers 7F00 30 IN0BUF = 0x7F00 7EC0 31 OUT0BUF = 0x7EC0 7E80 32 IN1BUF = 0x7E80 7E40 33 OUT1BUF = 0x7E40 7E00 34 IN2BUF = 0x7E00 7DC0 35 OUT2BUF = 0x7DC0 7D80 36 IN3BUF = 0x7D80 7D40 37 OUT3BUF = 0x7D40 7D00 38 IN4BUF = 0x7D00 7CC0 39 OUT4BUF = 0x7CC0 7C80 40 IN5BUF = 0x7C80 7C40 41 OUT5BUF = 0x7C40 7C00 42 IN6BUF = 0x7C00 7BC0 43 OUT6BUF = 0x7BC0 7B80 44 IN7BUF = 0x7B80 7B40 45 OUT7BUF = 0x7B40 7FE8 46 SETUPBUF = 0x7FE8 7FE8 47 SETUPDAT = 0x7FE8 48 7FB4 49 EP0CS = 0x7FB4 7FB5 50 IN0BC = 0x7FB5 7FB6 51 IN1CS = 0x7FB6 7FB7 52 IN1BC = 0x7FB7 7FB8 53 IN2CS = 0x7FB8 7FB9 54 IN2BC = 0x7FB9 7FBA 55 IN3CS = 0x7FBA 7FBB 56 IN3BC = 0x7FBB 7FBC 57 IN4CS = 0x7FBC 7FBD 58 IN4BC = 0x7FBD 7FBE 59 IN5CS = 0x7FBE 7FBF 60 IN5BC = 0x7FBF 7FC0 61 IN6CS = 0x7FC0 7FC1 62 IN6BC = 0x7FC1 7FC2 63 IN7CS = 0x7FC2 7FC3 64 IN7BC = 0x7FC3 7FC5 65 OUT0BC = 0x7FC5 7FC6 66 OUT1CS = 0x7FC6 7FC7 67 OUT1BC = 0x7FC7 7FC8 68 OUT2CS = 0x7FC8 7FC9 69 OUT2BC = 0x7FC9 7FCA 70 OUT3CS = 0x7FCA 7FCB 71 OUT3BC = 0x7FCB 7FCC 72 OUT4CS = 0x7FCC 7FCD 73 OUT4BC = 0x7FCD 7FCE 74 OUT5CS = 0x7FCE 7FCF 75 OUT5BC = 0x7FCF 7FD0 76 OUT6CS = 0x7FD0 7FD1 77 OUT6BC = 0x7FD1 7FD2 78 OUT7CS = 0x7FD2 7FD3 79 OUT7BC = 0x7FD3 80 7FA8 81 IVEC = 0x7FA8 7FA9 82 IN07IRQ = 0x7FA9 7FAA 83 OUT07IRQ = 0x7FAA 7FAB 84 USBIRQ = 0x7FAB 7FAC 85 IN07IEN = 0x7FAC 7FAD 86 OUT07IEN = 0x7FAD 7FAE 87 USBIEN = 0x7FAE 7FAF 88 USBBAV = 0x7FAF 7FB2 89 BPADDRH = 0x7FB2 7FB3 90 BPADDRL = 0x7FB3 91 7FD4 92 SUDPTRH = 0x7FD4 7FD5 93 SUDPTRL = 0x7FD5 7FD6 94 USBCS = 0x7FD6 7FD7 95 TOGCTL = 0x7FD7 7FD8 96 USBFRAMEL = 0x7FD8 7FD9 97 USBFRAMEH = 0x7FD9 7FDB 98 FNADDR = 0x7FDB 7FDD 99 USBPAIR = 0x7FDD 7FDE 100 IN07VAL = 0x7FDE 7FDF 101 OUT07VAL = 0x7FDF 7FE3 102 AUTOPTRH = 0x7FE3 7FE4 103 AUTOPTRL = 0x7FE4 7FE5 104 AUTODATA = 0x7FE5 105 106 ;; isochronous endpoints. only available if ISODISAB=0 107 7F60 108 OUT8DATA = 0x7F60 7F61 109 OUT9DATA = 0x7F61 7F62 110 OUT10DATA = 0x7F62 7F63 111 OUT11DATA = 0x7F63 7F64 112 OUT12DATA = 0x7F64 7F65 113 OUT13DATA = 0x7F65 7F66 114 OUT14DATA = 0x7F66 7F67 115 OUT15DATA = 0x7F67 116 7F68 117 IN8DATA = 0x7F68 7F69 118 IN9DATA = 0x7F69 7F6A 119 IN10DATA = 0x7F6A 7F6B 120 IN11DATA = 0x7F6B 7F6C 121 IN12DATA = 0x7F6C 7F6D 122 IN13DATA = 0x7F6D 7F6E 123 IN14DATA = 0x7F6E 7F6F 124 IN15DATA = 0x7F6F 125 7F70 126 OUT8BCH = 0x7F70 7F71 127 OUT8BCL = 0x7F71 7F72 128 OUT9BCH = 0x7F72 7F73 129 OUT9BCL = 0x7F73 7F74 130 OUT10BCH = 0x7F74 7F75 131 OUT10BCL = 0x7F75 7F76 132 OUT11BCH = 0x7F76 7F77 133 OUT11BCL = 0x7F77 7F78 134 OUT12BCH = 0x7F78 7F79 135 OUT12BCL = 0x7F79 7F7A 136 OUT13BCH = 0x7F7A 7F7B 137 OUT13BCL = 0x7F7B 7F7C 138 OUT14BCH = 0x7F7C 7F7D 139 OUT14BCL = 0x7F7D 7F7E 140 OUT15BCH = 0x7F7E 7F7F 141 OUT15BCL = 0x7F7F 142 7FF0 143 OUT8ADDR = 0x7FF0 7FF1 144 OUT9ADDR = 0x7FF1 7FF2 145 OUT10ADDR = 0x7FF2 7FF3 146 OUT11ADDR = 0x7FF3 7FF4 147 OUT12ADDR = 0x7FF4 7FF5 148 OUT13ADDR = 0x7FF5 7FF6 149 OUT14ADDR = 0x7FF6 7FF7 150 OUT15ADDR = 0x7FF7 7FF8 151 IN8ADDR = 0x7FF8 7FF9 152 IN9ADDR = 0x7FF9 7FFA 153 IN10ADDR = 0x7FFA 7FFB 154 IN11ADDR = 0x7FFB 7FFC 155 IN12ADDR = 0x7FFC 7FFD 156 IN13ADDR = 0x7FFD 7FFE 157 IN14ADDR = 0x7FFE 7FFF 158 IN15ADDR = 0x7FFF 159 7FA0 160 ISOERR = 0x7FA0 7FA1 161 ISOCTL = 0x7FA1 7FA2 162 ZBCOUNT = 0x7FA2 7FE0 163 INISOVAL = 0x7FE0 7FE1 164 OUTISOVAL = 0x7FE1 7FE2 165 FASTXFR = 0x7FE2 166 167 ;; CPU control registers 168 7F92 169 CPUCS = 0x7F92 170 171 ;; IO port control registers 172 7F93 173 PORTACFG = 0x7F93 7F94 174 PORTBCFG = 0x7F94 7F95 175 PORTCCFG = 0x7F95 7F96 176 OUTA = 0x7F96 7F97 177 OUTB = 0x7F97 7F98 178 OUTC = 0x7F98 7F99 179 PINSA = 0x7F99 7F9A 180 PINSB = 0x7F9A 7F9B 181 PINSC = 0x7F9B 7F9C 182 OEA = 0x7F9C 7F9D 183 OEB = 0x7F9D 7F9E 184 OEC = 0x7F9E 185 186 ;; I2C controller registers 187 7FA5 188 I2CS = 0x7FA5 7FA6 189 I2DAT = 0x7FA6 190 191 ;; FPGA defines 0003 192 XC4K_IRLENGTH = 3 0000 193 XC4K_EXTEST = 0 0001 194 XC4K_PRELOAD = 1 0005 195 XC4K_CONFIGURE = 5 0007 196 XC4K_BYPASS = 7 197 2E64 198 FPGA_CONFIGSIZE = 11876 0158 199 FPGA_BOUND = 344 200 0000 201 SOFTWARECONFIG = 0 202 203 ;; ----------------------------------------------------- 204 205 .area CODE (CODE) 0000 02s00r00 206 ljmp startup 0003 02s00rDF 207 ljmp int0_isr 0006 208 .ds 5 000B 02s01r00 209 ljmp timer0_isr 000E 210 .ds 5 0013 02s01r30 211 ljmp int1_isr 0016 212 .ds 5 001B 02s01r51 213 ljmp timer1_isr 001E 214 .ds 5 0023 02s01r72 215 ljmp ser0_isr 0026 216 .ds 5 002B 02s01r95 217 ljmp timer2_isr 002E 218 .ds 5 0033 02s01rB6 219 ljmp resume_isr 0036 220 .ds 5 003B 02s01rD7 221 ljmp ser1_isr 003E 222 .ds 5 0043 02s01r00 223 ljmp usb_isr 0046 224 .ds 5 004B 02s01rFA 225 ljmp i2c_isr 004E 226 .ds 5 0053 02s02r1F 227 ljmp int4_isr 0056 228 .ds 5 005B 02s02r44 229 ljmp int5_isr 005E 230 .ds 5 0063 02s02r69 231 ljmp int6_isr 232 0066 233 .ds 0x9a 234 ;; USB interrupt dispatch table 0100 235 usb_isr: 0100 02s02rD2 236 ljmp usb_sudav_isr 0103 237 .ds 1 0104 02s05rBA 238 ljmp usb_sof_isr 0107 239 .ds 1 0108 02s05rE5 240 ljmp usb_sutok_isr 010B 241 .ds 1 010C 02s06r10 242 ljmp usb_suspend_isr 010F 243 .ds 1 0110 02s06r3B 244 ljmp usb_usbreset_isr 0113 245 .ds 1 0114 32 246 reti 0115 247 .ds 3 0118 02s06r66 248 ljmp usb_ep0in_isr 011B 249 .ds 1 011C 02s06rBC 250 ljmp usb_ep0out_isr 011F 251 .ds 1 0120 02s07r78 252 ljmp usb_ep1in_isr 0123 253 .ds 1 0124 02s07rA6 254 ljmp usb_ep1out_isr 0127 255 .ds 1 0128 02s07rD1 256 ljmp usb_ep2in_isr 012B 257 .ds 1 012C 02s07rFC 258 ljmp usb_ep2out_isr 012F 259 .ds 1 0130 02s08r27 260 ljmp usb_ep3in_isr 0133 261 .ds 1 0134 02s08r52 262 ljmp usb_ep3out_isr 0137 263 .ds 1 0138 02s08r7D 264 ljmp usb_ep4in_isr 013B 265 .ds 1 013C 02s08rA8 266 ljmp usb_ep4out_isr 013F 267 .ds 1 0140 02s08rD3 268 ljmp usb_ep5in_isr 0143 269 .ds 1 0144 02s08rFE 270 ljmp usb_ep5out_isr 0147 271 .ds 1 0148 02s09r29 272 ljmp usb_ep6in_isr 014B 273 .ds 1 014C 02s09r54 274 ljmp usb_ep6out_isr 014F 275 .ds 1 0150 02s09r7F 276 ljmp usb_ep7in_isr 0153 277 .ds 1 0154 02s09rAA 278 ljmp usb_ep7out_isr 279 280 ;; ----------------------------------------------------- 281 282 .area BSEG (BIT) 283 284 .area ISEG (DATA) 0000 285 stack: .ds 0x80 286 287 .area DSEG (DATA) 0000 288 errcode: .ds 1 0001 289 errval: .ds 1 0002 290 cfgcount: .ds 2 0004 291 leddiv: .ds 1 0005 292 irqcount: .ds 1 0006 293 ctrlcode: .ds 1 0007 294 ctrladdr: .ds 2 0009 295 ctrllen: .ds 2 296 297 ;; USB state 000B 298 numconfig: .ds 1 000C 299 altsetting: .ds 1 300 301 .area XSEG (DATA) 302 303 304 .area GSINIT (CODE) 0000 305 startup: 0000 75 81r00 306 mov sp,#stack ; -1 0003 E4 307 clr a 0004 F5 D0 308 mov psw,a 0006 F5 86 309 mov dps,a 310 ;lcall __sdcc_external_startup 311 ;mov a,dpl0 312 ;jz __sdcc_init_data 313 ;ljmp __sdcc_program_startup 0008 314 __sdcc_init_data: 315 316 .area GSINIT2 (CODE) 0000 317 __sdcc_program_startup: 318 ;; assembler code startup 0000 E4 319 clr a 0001 F5*00 320 mov errcode,a 0003 F5*01 321 mov errval,a 0005 F5*02 322 mov cfgcount,a 0007 F5*03 323 mov cfgcount+1,a 0009 F5*05 324 mov irqcount,a 000B F5*06 325 mov ctrlcode,a 000D F5 86 326 mov dps,a 000F F5 A8 327 mov ie,a 328 ;; some indirect register setup 0011 75 8E 31 329 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 330 ;; Timer setup: 331 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 332 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0014 75 89 21 333 mov tmod,#0x21 0017 75 88 55 334 mov tcon,#0x55 ; INT0/INT1 edge 001A 75 8D 64 335 mov th1,#256-156 ; 1200 bauds 001D 75 87 00 336 mov pcon,#0 ; SMOD0=0 337 ;; give Windows a chance to finish the writecpucs control transfer 338 ;; 10ms delay loop 0020 90 E8 90 339 mov dptr,#(-6000)&0xffff 0023 A3 340 9$: inc dptr ; 3 cycles 0024 E5 82 341 mov a,dpl0 ; 2 cycles 0026 45 83 342 orl a,dph0 ; 2 cycles 0028 70 F9 343 jnz 9$ ; 3 cycles 344 ;; init USB subsystem 002A 90 7F A1 345 mov dptr,#ISOCTL 002D 74 01 346 mov a,#1 ; disable ISO endpoints 002F F0 347 movx @dptr,a 0030 90 7F AF 348 mov dptr,#USBBAV 0033 74 01 349 mov a,#1 ; enable autovector, disable breakpoint logic 0035 F0 350 movx @dptr,a 0036 E4 351 clr a 0037 90 7F E0 352 mov dptr,#INISOVAL 003A F0 353 movx @dptr,a 003B 90 7F E1 354 mov dptr,#OUTISOVAL 003E F0 355 movx @dptr,a 003F 90 7F DD 356 mov dptr,#USBPAIR 0042 74 09 357 mov a,#0x9 ; pair EP 2&3 for input & output 0044 F0 358 movx @dptr,a 0045 90 7F DE 359 mov dptr,#IN07VAL 0048 74 07 360 mov a,#0x7 ; enable EP0+EP1+EP2 004A F0 361 movx @dptr,a 004B 90 7F DF 362 mov dptr,#OUT07VAL 004E 74 05 363 mov a,#0x5 ; enable EP0+EP2 0050 F0 364 movx @dptr,a 365 ;; USB: init endpoint toggles 0051 90 7F D7 366 mov dptr,#TOGCTL 0054 74 12 367 mov a,#0x12 0056 F0 368 movx @dptr,a 0057 74 32 369 mov a,#0x32 ; clear EP 2 in toggle 0059 F0 370 movx @dptr,a 005A 74 02 371 mov a,#0x02 005C F0 372 movx @dptr,a 005D 74 22 373 mov a,#0x22 ; clear EP 2 out toggle 005F F0 374 movx @dptr,a 375 ;; configure IO ports 0060 90 7F 93 376 mov dptr,#PORTACFG 0063 74 00 377 mov a,#0 0065 F0 378 movx @dptr,a 0066 90 7F 96 379 mov dptr,#OUTA 0069 74 80 380 mov a,#0x80 ; set PROG lo 006B F0 381 movx @dptr,a 006C 90 7F 9C 382 mov dptr,#OEA 006F 74 C2 383 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0071 F0 384 movx @dptr,a 0072 90 7F 94 385 mov dptr,#PORTBCFG 0075 74 00 386 mov a,#0 0077 F0 387 movx @dptr,a 0078 90 7F 9D 388 mov dptr,#OEB 007B 74 00 389 mov a,#0 007D F0 390 movx @dptr,a 007E 90 7F 95 391 mov dptr,#PORTCCFG 0081 74 00 392 mov a,#0 0083 F0 393 movx @dptr,a 0084 90 7F 98 394 mov dptr,#OUTC 0087 74 20 395 mov a,#0x20 0089 F0 396 movx @dptr,a 008A 90 7F 9E 397 mov dptr,#OEC 008D 74 2E 398 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 008F F0 399 movx @dptr,a 400 ;; enable interrupts 0090 75 A8 82 401 mov ie,#0x82 ; enable timer 0 0093 75 E8 01 402 mov eie,#0x01 ; enable USB interrupts 0096 90 7F AE 403 mov dptr,#USBIEN 0099 74 01 404 mov a,#1 ; enable SUDAV interrupt 009B F0 405 movx @dptr,a 009C 90 7F AC 406 mov dptr,#IN07IEN 009F 74 03 407 mov a,#3 ; enable EP0+EP1 interrupt 00A1 F0 408 movx @dptr,a 00A2 90 7F AD 409 mov dptr,#OUT07IEN 00A5 74 01 410 mov a,#1 ; enable EP0 interrupt 00A7 F0 411 movx @dptr,a 412 ;; initialize UART 0 for config loading 00A8 75 98 20 413 mov scon0,#0x20 ; mode 0, CLK24/4 00AB 75 99 FF 414 mov sbuf0,#0xff 415 ;; initialize USB state 00AE E4 416 clr a 00AF F5*0B 417 mov numconfig,a 00B1 F5*0C 418 mov altsetting,a 0001 419 .if 1 420 ;; disconnect from USB bus 00B3 90 7F D6 421 mov dptr,#USBCS 00B6 74 0A 422 mov a,#10 00B8 F0 423 movx @dptr,a 424 ;; wait 0.3 sec 00B9 7A 1E 425 mov r2,#30 426 ;; 10ms delay loop 00BB 90 E8 90 427 0$: mov dptr,#(-6000)&0xffff 00BE A3 428 1$: inc dptr ; 3 cycles 00BF E5 82 429 mov a,dpl0 ; 2 cycles 00C1 45 83 430 orl a,dph0 ; 2 cycles 00C3 70 F9 431 jnz 1$ ; 3 cycles 00C5 DA F4 432 djnz r2,0$ 433 ;; reconnect to USB bus 00C7 90 7F D6 434 mov dptr,#USBCS 00CA 74 02 435 mov a,#2 ; 8051 handles control 00CC F0 436 movx @dptr,a 00CD 74 06 437 mov a,#6 ; reconnect, 8051 handles control 00CF F0 438 movx @dptr,a 439 .endif 440 441 ;; final 00D0 12s07r59 442 lcall fillusbintr 443 ;; kludge; first OUT2 packet seems to be bogus 444 ;; wait for packet with length 1 and contents 0x55 445 446 ;; some short delay 00D3 90 7F 96 447 mov dptr,#OUTA 00D6 74 82 448 mov a,#0x82 ; set PROG hi 00D8 F0 449 movx @dptr,a 00D9 90 7F 99 450 mov dptr,#PINSA 00DC E0 451 movx a,@dptr 00DD 30 E2 06 452 jnb acc.2,8$ 453 ;; DONE stuck high 00E0 75*00 80 454 mov errcode,#0x80 00E3 02s02r0F 455 ljmp fpgaerr 00E6 12s00r00 456 8$: lcall jtag_reset_tap 00E9 7A 05 457 mov r2,#5 00EB 7B 00 458 mov r3,#0 00ED 7C 06 459 mov r4,#6 00EF 12s00r06 460 lcall jtag_shiftout ; enter SHIFT-IR state 00F2 7A 08 461 mov r2,#8 00F4 7B 00 462 mov r3,#0 00F6 7C 00 463 mov r4,#0 00F8 12s00r06 464 lcall jtag_shiftout ; assume max. 8bit IR 00FB 7A 08 465 mov r2,#8 00FD 7B 01 466 mov r3,#1 00FF 7C 00 467 mov r4,#0 0101 12s00r06 468 lcall jtag_shift ; shift in a single bit 0104 74 F8 469 mov a,#-(1<(-FPGA_CONFIGSIZE) 01BA 35*03 596 addc a,cfgcount+1 01BC 50 B7 597 jnc loadloop 598 ;; configuration download complete, start FPGA 01BE 90 7F 94 599 mov dptr,#PORTBCFG 01C1 74 00 600 mov a,#0 ; TDI no longer special function pin 01C3 F0 601 movx @dptr,a 01C4 90 7F 95 602 mov dptr,#PORTCCFG 01C7 74 00 603 mov a,#0 ; TCK no longer special function pin 01C9 F0 604 movx @dptr,a 605 ;; wait for done loop 01CA 7F FA 606 mov r7,#250 01CC 607 doneloop: 01CC 90 7F 99 608 mov dptr,#PINSA 01CF E0 609 movx a,@dptr 01D0 20 E2 1F 610 jb acc.2,doneactive 01D3 90 7F 9B 611 mov dptr,#PINSC 01D6 E0 612 movx a,@dptr 01D7 20 E2 06 613 jb acc.2,1$ 614 ;; INIT low 01DA 75*00 90 615 mov errcode,#0x90 01DD 02s02r0F 616 ljmp fpgaerr 01E0 90 7F 98 617 1$: mov dptr,#OUTC 01E3 E0 618 movx a,@dptr 01E4 D2 E1 619 setb acc.1 01E6 F0 620 movx @dptr,a 01E7 C2 E1 621 clr acc.1 01E9 F0 622 movx @dptr,a 01EA DF E0 623 djnz r7,doneloop 624 ;; DONE stuck low 01EC 75*00 91 625 mov errcode,#0x91 01EF 02s02r0F 626 ljmp fpgaerr 627 01F2 628 doneactive: 629 ;; generate 16 clock pulses to start up FPGA 01F2 7F 10 630 mov r7,#16 01F4 90 7F 98 631 mov dptr,#OUTC 01F7 E0 632 movx a,@dptr 01F8 D2 E1 633 0$: setb acc.1 01FA F0 634 movx @dptr,a 01FB C2 E1 635 clr acc.1 01FD F0 636 movx @dptr,a 01FE DF F8 637 djnz r7,0$ 0200 90 7F 95 638 mov dptr,#PORTCCFG 0203 74 C0 639 mov a,#0xc0 ; RD/WR is special function pin 0205 F0 640 movx @dptr,a 0206 75*00 20 641 mov errcode,#0x20 642 643 ;; turn off PTT 0209 90 C0 08 644 mov dptr,#0xc008 020C 74 42 645 mov a,#0x42 020E F0 646 movx @dptr,a 647 020F 648 fpgaerr: 020F 80 FE 649 sjmp fpgaerr 650 651 .area CSEG (CODE) 0002 652 ar2 = 0x02 0003 653 ar3 = 0x03 0004 654 ar4 = 0x04 0005 655 ar5 = 0x05 0006 656 ar6 = 0x06 0007 657 ar7 = 0x07 0000 658 ar0 = 0x00 0001 659 ar1 = 0x01 660 661 ;; jtag_shift 662 ;; r2 = num 663 ;; r3 = tdi 664 ;; r4 = tms 665 ;; return: r7 = tdo 0000 666 jtag_reset_tap: 0000 7A 05 667 mov r2,#5 0002 7B 00 668 mov r3,#0 0004 7C FF 669 mov r4,#0xff 0006 670 jtag_shiftout: 0006 671 jtag_shift: 0006 7E 01 672 mov r6,#1 0008 7F 00 673 mov r7,#0 000A 74 02 674 1$: mov a,#2 000C CB 675 xch a,r3 000D 13 676 rrc a 000E CB 677 xch a,r3 000F 92 E6 678 mov acc.6,c 0011 CC 679 xch a,r4 0012 13 680 rrc a 0013 CC 681 xch a,r4 0014 92 E7 682 mov acc.7,c 0016 90 7F 96 683 mov dptr,#OUTA 0019 F0 684 movx @dptr,a 001A 90 7F 9B 685 mov dptr,#PINSC 001D E0 686 movx a,@dptr 001E 30 E0 03 687 jnb acc.0,2$ 0021 EE 688 mov a,r6 0022 42 07 689 orl ar7,a 0024 90 7F 98 690 2$: mov dptr,#OUTC 0027 E0 691 movx a,@dptr 0028 D2 E1 692 setb acc.1 002A F0 693 movx @dptr,a 002B C2 E1 694 clr acc.1 002D F0 695 movx @dptr,a 002E EE 696 mov a,r6 002F 23 697 rl a 0030 FE 698 mov r6,a 0031 DA D7 699 djnz r2,1$ 0033 22 700 ret 701 702 ;; EEPROM address where the serial number is located 703 0034 704 eepromstraddr: 0034 10 705 .db 0x10 706 707 ;; I2C Routines 708 ;; note: ckcon should be set to #0x31 to avoid chip bugs 709 0035 710 writei2c: 711 ;; dptr: data to be sent 712 ;; b: device address 713 ;; r7: transfer length 714 ;; return: a: status (bytes remaining, 0xff bus error) 0035 05 86 715 inc dps 0037 90 7F A5 716 mov dptr,#I2CS 003A C2 F0 717 clr b.0 ; r/w = 0 003C 74 80 718 mov a,#0x80 ; start condition 003E F0 719 movx @dptr,a 003F 90 7F A6 720 mov dptr,#I2DAT 0042 E5 F0 721 mov a,b 0044 F0 722 movx @dptr,a 0045 90 7F A5 723 mov dptr,#I2CS 0048 E0 724 0$: movx a,@dptr 0049 20 E2 20 725 jb acc.2,3$ ; BERR 004C 30 E0 F9 726 jnb acc.0,0$ ; DONE 004F 30 E1 0F 727 jnb acc.1,1$ ; ACK 0052 90 7F A6 728 mov dptr,#I2DAT 0055 15 86 729 dec dps 0057 E0 730 movx a,@dptr 0058 A3 731 inc dptr 0059 05 86 732 inc dps 005B F0 733 movx @dptr,a 005C 90 7F A5 734 mov dptr,#I2CS 005F DF E7 735 djnz r7,0$ 0061 74 40 736 1$: mov a,#0x40 ; stop condition 0063 F0 737 movx @dptr,a 0064 E0 738 2$: movx a,@dptr 0065 20 E6 FC 739 jb acc.6,2$ 0068 15 86 740 dec dps 006A EF 741 mov a,r7 006B 22 742 ret 006C 7F FF 743 3$: mov r7,#255 006E 80 F1 744 sjmp 1$ 745 0070 746 readi2c: 747 ;; dptr: data to be sent 748 ;; b: device address 749 ;; r7: transfer length 750 ;; return: a: status (bytes remaining, 0xff bus error) 0070 05 86 751 inc dps 0072 90 7F A5 752 mov dptr,#I2CS 0075 D2 F0 753 setb b.0 ; r/w = 1 0077 74 80 754 mov a,#0x80 ; start condition 0079 F0 755 movx @dptr,a 007A 90 7F A6 756 mov dptr,#I2DAT 007D E5 F0 757 mov a,b 007F F0 758 movx @dptr,a 0080 90 7F A5 759 mov dptr,#I2CS 0083 E0 760 0$: movx a,@dptr 0084 20 E2 4C 761 jb acc.2,9$ ; BERR 0087 30 E0 F9 762 jnb acc.0,0$ ; DONE 008A 30 E1 03 763 jnb acc.1,5$ ; ACK 008D EF 764 mov a,r7 008E 70 0B 765 jnz 1$ 0090 74 40 766 5$: mov a,#0x40 ; stop condition 0092 F0 767 movx @dptr,a 0093 E0 768 2$: movx a,@dptr 0094 20 E6 FC 769 jb acc.6,2$ 0097 15 86 770 dec dps 0099 E4 771 clr a 009A 22 772 ret 009B B4 01 03 773 1$: cjne a,#1,3$ 009E 74 20 774 mov a,#0x20 ; LASTRD = 1 00A0 F0 775 movx @dptr,a 00A1 90 7F A6 776 3$: mov dptr,#I2DAT 00A4 E0 777 movx a,@dptr ; initiate first read 00A5 90 7F A5 778 mov dptr,#I2CS 00A8 E0 779 4$: movx a,@dptr 00A9 20 E2 27 780 jb acc.2,9$ ; BERR 00AC 30 E0 F9 781 jnb acc.0,4$ ; DONE 00AF EF 782 mov a,r7 00B0 B4 02 03 783 cjne a,#2,6$ 00B3 74 20 784 mov a,#0x20 ; LASTRD = 1 00B5 F0 785 movx @dptr,a 00B6 B4 01 03 786 6$: cjne a,#1,7$ 00B9 74 40 787 mov a,#0x40 ; stop condition 00BB F0 788 movx @dptr,a 00BC 90 7F A6 789 7$: mov dptr,#I2DAT 00BF E0 790 movx a,@dptr ; read data 00C0 15 86 791 dec dps 00C2 F0 792 movx @dptr,a 00C3 A3 793 inc dptr 00C4 05 86 794 inc dps 00C6 90 7F A5 795 mov dptr,#I2CS 00C9 DF DD 796 djnz r7,4$ 00CB E0 797 8$: movx a,@dptr 00CC 20 E6 FC 798 jb acc.6,8$ 00CF 15 86 799 dec dps 00D1 E4 800 clr a 00D2 22 801 ret 00D3 74 40 802 9$: mov a,#0x40 ; stop condition 00D5 F0 803 movx @dptr,a 00D6 E0 804 10$: movx a,@dptr 00D7 20 E6 FC 805 jb acc.6,10$ 00DA 74 FF 806 mov a,#255 00DC 15 86 807 dec dps 00DE 22 808 ret 809 810 ;; ------------------ interrupt handlers ------------------------ 811 00DF 812 int0_isr: 00DF C0 E0 813 push acc 00E1 C0 F0 814 push b 00E3 C0 82 815 push dpl0 00E5 C0 83 816 push dph0 00E7 C0 D0 817 push psw 00E9 75 D0 00 818 mov psw,#0x00 00EC C0 86 819 push dps 00EE 75 86 00 820 mov dps,#0 821 ;; clear interrupt 00F1 C2 89 822 clr tcon+1 823 ;; handle interrupt 824 ;; epilogue 00F3 D0 86 825 pop dps 00F5 D0 D0 826 pop psw 00F7 D0 83 827 pop dph0 00F9 D0 82 828 pop dpl0 00FB D0 F0 829 pop b 00FD D0 E0 830 pop acc 00FF 32 831 reti 832 0100 833 timer0_isr: 0100 C0 E0 834 push acc 0102 C0 F0 835 push b 0104 C0 82 836 push dpl0 0106 C0 83 837 push dph0 0108 C0 D0 838 push psw 010A 75 D0 00 839 mov psw,#0x00 010D C0 86 840 push dps 010F 75 86 00 841 mov dps,#0 842 ;; clear interrupt 0112 C2 8D 843 clr tcon+5 844 ;; handle interrupt 0114 05*04 845 inc leddiv 0116 E5*04 846 mov a,leddiv 0118 54 07 847 anl a,#7 011A 70 07 848 jnz 0$ 011C 90 7F 98 849 mov dptr,#OUTC 011F E0 850 movx a,@dptr 0120 64 08 851 xrl a,#0x08 0122 F0 852 movx @dptr,a 0123 853 0$: 854 ;; epilogue 0123 D0 86 855 pop dps 0125 D0 D0 856 pop psw 0127 D0 83 857 pop dph0 0129 D0 82 858 pop dpl0 012B D0 F0 859 pop b 012D D0 E0 860 pop acc 012F 32 861 reti 862 0130 863 int1_isr: 0130 C0 E0 864 push acc 0132 C0 F0 865 push b 0134 C0 82 866 push dpl0 0136 C0 83 867 push dph0 0138 C0 D0 868 push psw 013A 75 D0 00 869 mov psw,#0x00 013D C0 86 870 push dps 013F 75 86 00 871 mov dps,#0 872 ;; clear interrupt 0142 C2 8B 873 clr tcon+3 874 ;; handle interrupt 875 ;; epilogue 0144 D0 86 876 pop dps 0146 D0 D0 877 pop psw 0148 D0 83 878 pop dph0 014A D0 82 879 pop dpl0 014C D0 F0 880 pop b 014E D0 E0 881 pop acc 0150 32 882 reti 883 0151 884 timer1_isr: 0151 C0 E0 885 push acc 0153 C0 F0 886 push b 0155 C0 82 887 push dpl0 0157 C0 83 888 push dph0 0159 C0 D0 889 push psw 015B 75 D0 00 890 mov psw,#0x00 015E C0 86 891 push dps 0160 75 86 00 892 mov dps,#0 893 ;; clear interrupt 0163 C2 8F 894 clr tcon+7 895 ;; handle interrupt 896 ;; epilogue 0165 D0 86 897 pop dps 0167 D0 D0 898 pop psw 0169 D0 83 899 pop dph0 016B D0 82 900 pop dpl0 016D D0 F0 901 pop b 016F D0 E0 902 pop acc 0171 32 903 reti 904 0172 905 ser0_isr: 0172 C0 E0 906 push acc 0174 C0 F0 907 push b 0176 C0 82 908 push dpl0 0178 C0 83 909 push dph0 017A C0 D0 910 push psw 017C 75 D0 00 911 mov psw,#0x00 017F C0 86 912 push dps 0181 75 86 00 913 mov dps,#0 914 ;; clear interrupt 0184 C2 98 915 clr scon0+0 0186 C2 99 916 clr scon0+1 917 ;; handle interrupt 918 ;; epilogue 0188 D0 86 919 pop dps 018A D0 D0 920 pop psw 018C D0 83 921 pop dph0 018E D0 82 922 pop dpl0 0190 D0 F0 923 pop b 0192 D0 E0 924 pop acc 0194 32 925 reti 926 0195 927 timer2_isr: 0195 C0 E0 928 push acc 0197 C0 F0 929 push b 0199 C0 82 930 push dpl0 019B C0 83 931 push dph0 019D C0 D0 932 push psw 019F 75 D0 00 933 mov psw,#0x00 01A2 C0 86 934 push dps 01A4 75 86 00 935 mov dps,#0 936 ;; clear interrupt 01A7 C2 CF 937 clr t2con+7 938 ;; handle interrupt 939 ;; epilogue 01A9 D0 86 940 pop dps 01AB D0 D0 941 pop psw 01AD D0 83 942 pop dph0 01AF D0 82 943 pop dpl0 01B1 D0 F0 944 pop b 01B3 D0 E0 945 pop acc 01B5 32 946 reti 947 01B6 948 resume_isr: 01B6 C0 E0 949 push acc 01B8 C0 F0 950 push b 01BA C0 82 951 push dpl0 01BC C0 83 952 push dph0 01BE C0 D0 953 push psw 01C0 75 D0 00 954 mov psw,#0x00 01C3 C0 86 955 push dps 01C5 75 86 00 956 mov dps,#0 957 ;; clear interrupt 01C8 C2 DC 958 clr eicon+4 959 ;; handle interrupt 960 ;; epilogue 01CA D0 86 961 pop dps 01CC D0 D0 962 pop psw 01CE D0 83 963 pop dph0 01D0 D0 82 964 pop dpl0 01D2 D0 F0 965 pop b 01D4 D0 E0 966 pop acc 01D6 32 967 reti 968 01D7 969 ser1_isr: 01D7 C0 E0 970 push acc 01D9 C0 F0 971 push b 01DB C0 82 972 push dpl0 01DD C0 83 973 push dph0 01DF C0 D0 974 push psw 01E1 75 D0 00 975 mov psw,#0x00 01E4 C0 86 976 push dps 01E6 75 86 00 977 mov dps,#0 978 ;; clear interrupt 01E9 C2 C0 979 clr scon1+0 01EB C2 C1 980 clr scon1+1 981 ;; handle interrupt 982 ;; epilogue 01ED D0 86 983 pop dps 01EF D0 D0 984 pop psw 01F1 D0 83 985 pop dph0 01F3 D0 82 986 pop dpl0 01F5 D0 F0 987 pop b 01F7 D0 E0 988 pop acc 01F9 32 989 reti 990 01FA 991 i2c_isr: 01FA C0 E0 992 push acc 01FC C0 F0 993 push b 01FE C0 82 994 push dpl0 0200 C0 83 995 push dph0 0202 C0 D0 996 push psw 0204 75 D0 00 997 mov psw,#0x00 0207 C0 86 998 push dps 0209 75 86 00 999 mov dps,#0 1000 ;; clear interrupt 020C E5 91 1001 mov a,exif 020E C2 E5 1002 clr acc.5 0210 F5 91 1003 mov exif,a 1004 ;; handle interrupt 1005 ;; epilogue 0212 D0 86 1006 pop dps 0214 D0 D0 1007 pop psw 0216 D0 83 1008 pop dph0 0218 D0 82 1009 pop dpl0 021A D0 F0 1010 pop b 021C D0 E0 1011 pop acc 021E 32 1012 reti 1013 021F 1014 int4_isr: 021F C0 E0 1015 push acc 0221 C0 F0 1016 push b 0223 C0 82 1017 push dpl0 0225 C0 83 1018 push dph0 0227 C0 D0 1019 push psw 0229 75 D0 00 1020 mov psw,#0x00 022C C0 86 1021 push dps 022E 75 86 00 1022 mov dps,#0 1023 ;; clear interrupt 0231 E5 91 1024 mov a,exif 0233 C2 E6 1025 clr acc.6 0235 F5 91 1026 mov exif,a 1027 ;; handle interrupt 1028 ;; epilogue 0237 D0 86 1029 pop dps 0239 D0 D0 1030 pop psw 023B D0 83 1031 pop dph0 023D D0 82 1032 pop dpl0 023F D0 F0 1033 pop b 0241 D0 E0 1034 pop acc 0243 32 1035 reti 1036 0244 1037 int5_isr: 0244 C0 E0 1038 push acc 0246 C0 F0 1039 push b 0248 C0 82 1040 push dpl0 024A C0 83 1041 push dph0 024C C0 D0 1042 push psw 024E 75 D0 00 1043 mov psw,#0x00 0251 C0 86 1044 push dps 0253 75 86 00 1045 mov dps,#0 1046 ;; clear interrupt 0256 E5 91 1047 mov a,exif 0258 C2 E7 1048 clr acc.7 025A F5 91 1049 mov exif,a 1050 ;; handle interrupt 1051 ;; epilogue 025C D0 86 1052 pop dps 025E D0 D0 1053 pop psw 0260 D0 83 1054 pop dph0 0262 D0 82 1055 pop dpl0 0264 D0 F0 1056 pop b 0266 D0 E0 1057 pop acc 0268 32 1058 reti 1059 0269 1060 int6_isr: 0269 C0 E0 1061 push acc 026B C0 F0 1062 push b 026D C0 82 1063 push dpl0 026F C0 83 1064 push dph0 0271 C0 D0 1065 push psw 0273 75 D0 00 1066 mov psw,#0x00 0276 C0 86 1067 push dps 0278 75 86 00 1068 mov dps,#0 1069 ;; clear interrupt 027B C2 DB 1070 clr eicon+3 1071 ;; handle interrupt 1072 ;; epilogue 027D D0 86 1073 pop dps 027F D0 D0 1074 pop psw 0281 D0 83 1075 pop dph0 0283 D0 82 1076 pop dpl0 0285 D0 F0 1077 pop b 0287 D0 E0 1078 pop acc 0289 32 1079 reti 1080 028A 1081 xmemread:: 028A E5*09 1082 mov a,ctrllen 028C FF 1083 mov r7,a 028D 24 C0 1084 add a,#-64 028F F5*09 1085 mov ctrllen,a 0291 E5*0A 1086 mov a,ctrllen+1 0293 34 00 1087 addc a,#0 0295 50 12 1088 jnc 0$ 0297 E4 1089 clr a 0298 F5*09 1090 mov ctrllen,a 029A F5*0A 1091 mov ctrllen+1,a 029C F5*06 1092 mov ctrlcode,a 029E 74 02 1093 mov a,#2 ; ack control transfer 02A0 90 7F B4 1094 mov dptr,#EP0CS 02A3 F0 1095 movx @dptr,a 02A4 EF 1096 mov a,r7 02A5 60 25 1097 jz 2$ 02A7 80 04 1098 sjmp 1$ 02A9 F5*0A 1099 0$: mov ctrllen+1,a 02AB 7F 40 1100 mov r7,#64 02AD 8F 00 1101 1$: mov ar0,r7 02AF 85*07 82 1102 mov dpl0,ctrladdr 02B2 85*08 83 1103 mov dph0,ctrladdr+1 02B5 05 86 1104 inc dps 02B7 90 7F 00 1105 mov dptr,#IN0BUF 02BA 15 86 1106 dec dps 02BC E0 1107 3$: movx a,@dptr 02BD A3 1108 inc dptr 02BE 05 86 1109 inc dps 02C0 F0 1110 movx @dptr,a 02C1 A3 1111 inc dptr 02C2 15 86 1112 dec dps 02C4 D8 F6 1113 djnz r0,3$ 02C6 85 82*07 1114 mov ctrladdr,dpl0 02C9 85 83*08 1115 mov ctrladdr+1,dph0 02CC EF 1116 2$: mov a,r7 02CD 90 7F B5 1117 mov dptr,#IN0BC 02D0 F0 1118 movx @dptr,a 02D1 22 1119 ret 1120 02D2 1121 usb_sudav_isr: 02D2 C0 E0 1122 push acc 02D4 C0 F0 1123 push b 02D6 C0 82 1124 push dpl0 02D8 C0 83 1125 push dph0 02DA C0 84 1126 push dpl1 02DC C0 85 1127 push dph1 02DE C0 D0 1128 push psw 02E0 75 D0 00 1129 mov psw,#0x00 02E3 C0 86 1130 push dps 02E5 75 86 00 1131 mov dps,#0 02E8 C0 00 1132 push ar0 02EA C0 07 1133 push ar7 1134 ;; clear interrupt 02EC E5 91 1135 mov a,exif 02EE C2 E4 1136 clr acc.4 02F0 F5 91 1137 mov exif,a 02F2 90 7F AB 1138 mov dptr,#USBIRQ 02F5 74 01 1139 mov a,#0x01 02F7 F0 1140 movx @dptr,a 1141 ;; handle interrupt 02F8 75*06 00 1142 mov ctrlcode,#0 ; reset control out code 02FB 90 7F E9 1143 mov dptr,#SETUPDAT+1 02FE E0 1144 movx a,@dptr ; bRequest field 1145 ;; standard commands 1146 ;; USB_REQ_GET_DESCRIPTOR 02FF B4 06 59 1147 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 0302 90 7F E8 1148 mov dptr,#SETUPDAT ; bRequestType == 0x80 0305 E0 1149 movx a,@dptr 0306 B4 80 4F 1150 cjne a,#USB_DIR_IN,setupstallstd 0309 90 7F EB 1151 mov dptr,#SETUPDAT+3 030C E0 1152 movx a,@dptr 030D B4 01 0C 1153 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 0310 90 7F D4 1154 mov dptr,#SUDPTRH 0313 74s09 1155 mov a,#>devicedescr 0315 F0 1156 movx @dptr,a 0316 A3 1157 inc dptr 0317 74rD5 1158 mov a,#config0descr 032A F0 1168 movx @dptr,a 032B A3 1169 inc dptr 032C 74rE7 1170 mov a,#stringdescr 0346 F5 83 1185 mov dph0,a 0348 E0 1186 movx a,@dptr 0349 F5 F0 1187 mov b,a 034B A3 1188 inc dptr 034C E0 1189 movx a,@dptr 034D 90 7F D4 1190 mov dptr,#SUDPTRH 0350 F0 1191 movx @dptr,a 0351 A3 1192 inc dptr 0352 E5 F0 1193 mov a,b 0354 F0 1194 movx @dptr,a 1195 ; sjmp setupackstd 0355 1196 setupackstd: 0355 02s05r9F 1197 ljmp setupack 0358 1198 setupstallstd: 0358 02s05r9B 1199 ljmp setupstall 035B 1200 cmdnotgetdesc: 1201 ;; USB_REQ_SET_CONFIGURATION 035B B4 09 41 1202 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 035E 90 7F E8 1203 mov dptr,#SETUPDAT 0361 E0 1204 movx a,@dptr 0362 70 F4 1205 jnz setupstallstd 0364 90 7F EA 1206 mov dptr,#SETUPDAT+2 0367 E0 1207 movx a,@dptr 0368 24 FE 1208 add a,#-2 036A 40 EC 1209 jc setupstallstd 036C E0 1210 movx a,@dptr 036D F5*0B 1211 mov numconfig,a 036F 1212 cmdresettoggleshalt: 036F 90 7F D7 1213 mov dptr,#TOGCTL 0372 78 07 1214 mov r0,#7 0374 E8 1215 0$: mov a,r0 0375 44 10 1216 orl a,#0x10 0377 F0 1217 movx @dptr,a 0378 44 30 1218 orl a,#0x30 037A F0 1219 movx @dptr,a 037B E8 1220 mov a,r0 037C F0 1221 movx @dptr,a 037D 44 20 1222 orl a,#0x20 037F F0 1223 movx @dptr,a 0380 D8 F2 1224 djnz r0,0$ 0382 E4 1225 clr a 0383 F0 1226 movx @dptr,a 0384 74 02 1227 mov a,#2 0386 90 7F B6 1228 mov dptr,#IN1CS 0389 78 07 1229 mov r0,#7 038B F0 1230 1$: movx @dptr,a 038C A3 1231 inc dptr 038D A3 1232 inc dptr 038E D8 FB 1233 djnz r0,1$ 0390 90 7F C6 1234 mov dptr,#OUT1CS 0393 78 07 1235 mov r0,#7 0395 F0 1236 2$: movx @dptr,a 0396 A3 1237 inc dptr 0397 A3 1238 inc dptr 0398 D8 FB 1239 djnz r0,2$ 039A 12s07r59 1240 lcall fillusbintr 039D 80 B6 1241 sjmp setupackstd 039F 1242 cmdnotsetconf: 1243 ;; USB_REQ_SET_INTERFACE 039F B4 0B 1A 1244 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 03A2 90 7F E8 1245 mov dptr,#SETUPDAT 03A5 E0 1246 movx a,@dptr 03A6 B4 01 AF 1247 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 03A9 E5*0B 1248 mov a,numconfig 03AB B4 01 AA 1249 cjne a,#1,setupstallstd 03AE 90 7F EC 1250 mov dptr,#SETUPDAT+4 03B1 E0 1251 movx a,@dptr 03B2 70 A4 1252 jnz setupstallstd 03B4 90 7F EA 1253 mov dptr,#SETUPDAT+2 03B7 E0 1254 movx a,@dptr 03B8 F5*0C 1255 mov altsetting,a 03BA 80 B3 1256 sjmp cmdresettoggleshalt 03BC 1257 cmdnotsetint: 1258 ;; USB_REQ_GET_INTERFACE 03BC B4 0A 20 1259 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 03BF 90 7F E8 1260 mov dptr,#SETUPDAT 03C2 E0 1261 movx a,@dptr 03C3 B4 81 92 1262 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 03C6 E5*0B 1263 mov a,numconfig 03C8 B4 01 8D 1264 cjne a,#1,setupstallstd 03CB 90 7F EC 1265 mov dptr,#SETUPDAT+4 03CE E0 1266 movx a,@dptr 03CF 70 87 1267 jnz setupstallstd 03D1 E5*0C 1268 mov a,altsetting 03D3 1269 cmdrespondonebyte: 03D3 90 7F 00 1270 mov dptr,#IN0BUF 03D6 F0 1271 movx @dptr,a 03D7 90 7F B5 1272 mov dptr,#IN0BC 03DA 74 01 1273 mov a,#1 03DC F0 1274 movx @dptr,a 03DD 80 4E 1275 sjmp setupackstd2 03DF 1276 cmdnotgetint: 1277 ;; USB_REQ_GET_CONFIGURATION 03DF B4 08 0B 1278 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 03E2 90 7F E8 1279 mov dptr,#SETUPDAT 03E5 E0 1280 movx a,@dptr 03E6 B4 80 47 1281 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 03E9 E5*0B 1282 mov a,numconfig 03EB 80 E6 1283 sjmp cmdrespondonebyte 03ED 1284 cmdnotgetconf: 1285 ;; USB_REQ_GET_STATUS (0) 03ED 70 44 1286 jnz cmdnotgetstat 03EF 90 7F E8 1287 mov dptr,#SETUPDAT 03F2 E0 1288 movx a,@dptr 03F3 B4 80 11 1289 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 03F6 74 01 1290 mov a,#1 03F8 1291 cmdrespondstat: 03F8 90 7F 00 1292 mov dptr,#IN0BUF 03FB F0 1293 movx @dptr,a 03FC A3 1294 inc dptr 03FD E4 1295 clr a 03FE F0 1296 movx @dptr,a 03FF 90 7F B5 1297 mov dptr,#IN0BC 0402 74 02 1298 mov a,#2 0404 F0 1299 movx @dptr,a 0405 80 26 1300 sjmp setupackstd2 0407 1301 cmdnotgetstatdev: 0407 B4 81 03 1302 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 040A E4 1303 clr a 040B 80 EB 1304 sjmp cmdrespondstat 040D 1305 cmdnotgetstatintf: 040D B4 82 20 1306 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 0410 90 7F EC 1307 mov dptr,#SETUPDAT+4 0413 E0 1308 movx a,@dptr 0414 90 7F C4 1309 mov dptr,#OUT1CS-2 0417 30 E7 03 1310 jnb acc.7,0$ 041A 90 7F B4 1311 mov dptr,#IN1CS-2 041D 54 0F 1312 0$: anl a,#15 041F 60 0F 1313 jz setupstallstd2 0421 20 E3 0C 1314 jb acc.3,setupstallstd2 0424 25 E0 1315 add a,acc 0426 25 82 1316 add a,dpl0 0428 F5 82 1317 mov dpl0,a 042A E0 1318 movx a,@dptr 042B 80 CB 1319 sjmp cmdrespondstat 042D 1320 setupackstd2: 042D 02s05r9F 1321 ljmp setupack 0430 1322 setupstallstd2: 0430 02s05r9B 1323 ljmp setupstall 0433 1324 cmdnotgetstat: 1325 ;; USB_REQ_SET_FEATURE 0433 B4 03 05 1326 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 0436 75 F0 01 1327 mov b,#1 0439 80 06 1328 sjmp handleftr 043B 1329 cmdnotsetftr: 1330 ;; USB_REQ_CLEAR_FEATURE 043B B4 01 3E 1331 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 043E 75 F0 00 1332 mov b,#0 0441 1333 handleftr: 0441 90 7F E8 1334 mov dptr,#SETUPDAT 0444 E0 1335 movx a,@dptr 0445 B4 02 E8 1336 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 0448 A3 1337 inc dptr 0449 A3 1338 inc dptr 044A E0 1339 movx a,@dptr 044B 70 E3 1340 jnz setupstallstd2 ; not ENDPOINT_HALT feature 044D A3 1341 inc dptr 044E E0 1342 movx a,@dptr 044F 70 DF 1343 jnz setupstallstd2 0451 A3 1344 inc dptr 0452 E0 1345 movx a,@dptr 0453 90 7F C4 1346 mov dptr,#OUT1CS-2 0456 30 E7 05 1347 jnb acc.7,0$ 0459 90 7F B4 1348 mov dptr,#IN1CS-2 045C 44 10 1349 orl a,#0x10 045E 20 E3 CF 1350 0$: jb acc.3,setupstallstd2 1351 ;; clear data toggle 0461 54 1F 1352 anl a,#0x1f 0463 05 86 1353 inc dps 0465 90 7F D7 1354 mov dptr,#TOGCTL 0468 F0 1355 movx @dptr,a 0469 44 20 1356 orl a,#0x20 046B F0 1357 movx @dptr,a 046C 54 0F 1358 anl a,#15 046E F0 1359 movx @dptr,a 046F 15 86 1360 dec dps 1361 ;; clear/set ep halt feature 0471 25 E0 1362 add a,acc 0473 25 82 1363 add a,dpl0 0475 F5 82 1364 mov dpl0,a 0477 E5 F0 1365 mov a,b 0479 F0 1366 movx @dptr,a 047A 80 B1 1367 sjmp setupackstd2 047C 1368 cmdnotclrftr: 1369 ;; vendor specific commands 1370 ;; 0xa3 047C B4 A3 3E 1371 cjne a,#0xa3,cmdnota3 047F 90 7F EA 1372 mov dptr,#SETUPDAT+2 0482 E0 1373 movx a,@dptr 0483 F5*07 1374 mov ctrladdr,a 0485 A3 1375 inc dptr 0486 E0 1376 movx a,@dptr 0487 F5*08 1377 mov ctrladdr+1,a 0489 24 50 1378 add a,#80 048B 50 2D 1379 jnc setupstalla3 048D 90 7F EE 1380 mov dptr,#SETUPDAT+6 0490 E0 1381 movx a,@dptr 0491 F5*09 1382 mov ctrllen,a 0493 25*07 1383 add a,ctrladdr 0495 A3 1384 inc dptr 0496 E0 1385 movx a,@dptr 0497 F5*0A 1386 mov ctrllen+1,a 0499 35*08 1387 addc a,ctrladdr+1 049B 40 1D 1388 jc setupstalla3 049D 90 7F E8 1389 mov dptr,#SETUPDAT ; bRequestType == 0x40 04A0 E0 1390 movx a,@dptr 04A1 B4 40 0A 1391 cjne a,#0x40,1$ 04A4 75*06 01 1392 mov ctrlcode,#1 04A7 90 7F C5 1393 mov dptr,#OUT0BC 04AA F0 1394 movx @dptr,a 04AB 02s05rA5 1395 ljmp endusbisr 04AE B4 C0 09 1396 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 04B1 75*06 02 1397 mov ctrlcode,#2 04B4 12s02r8A 1398 lcall xmemread 04B7 02s05rA5 1399 ljmp endusbisr 04BA 1400 setupstalla3: 04BA 02s05r9B 1401 ljmp setupstall 04BD 1402 cmdnota3: 1403 ;; 0xb1 04BD B4 B1 3E 1404 cjne a,#0xb1,cmdnotb1 04C0 90 7F E8 1405 mov dptr,#SETUPDAT ; bRequestType == 0xc0 04C3 E0 1406 movx a,@dptr 04C4 B4 C0 34 1407 cjne a,#0xc0,setupstallb1 04C7 90 7F 00 1408 mov dptr,#IN0BUF 04CA E5*00 1409 mov a,errcode 04CC F0 1410 movx @dptr,a 04CD A3 1411 inc dptr 04CE E5*01 1412 mov a,errval 04D0 F0 1413 movx @dptr,a 04D1 A3 1414 inc dptr 04D2 E5 81 1415 mov a,sp 1416 1417 ;;; xxxx 04D4 C0 82 1418 push dpl0 04D6 C0 83 1419 push dph0 04D8 90 7F DF 1420 mov dptr,#OUT07VAL 04DB E0 1421 movx a,@dptr 04DC D0 83 1422 pop dph0 04DE D0 82 1423 pop dpl0 1424 ;;; xxxx 1425 04E0 F0 1426 movx @dptr,a 04E1 A3 1427 inc dptr 04E2 74 00 1428 mov a,#0 1429 1430 ;;; xxxx 04E4 C0 82 1431 push dpl0 04E6 C0 83 1432 push dph0 04E8 90 7F C8 1433 mov dptr,#OUT2CS 04EB E0 1434 movx a,@dptr 04EC D0 83 1435 pop dph0 04EE D0 82 1436 pop dpl0 1437 ;;; xxxx 1438 04F0 F0 1439 movx @dptr,a 04F1 A3 1440 inc dptr 04F2 90 7F B5 1441 mov dptr,#IN0BC 04F5 74 04 1442 mov a,#4 04F7 F0 1443 movx @dptr,a 04F8 02s05r9F 1444 ljmp setupack 04FB 1445 setupstallb1: 04FB 02s05r9B 1446 ljmp setupstall 04FE 1447 cmdnotb1: 1448 ;; 0xb2 04FE B4 B2 2B 1449 cjne a,#0xb2,cmdnotb2 0501 90 7F E8 1450 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0504 E0 1451 movx a,@dptr 0505 B4 C0 21 1452 cjne a,#0xc0,setupstallb2 0508 90 7F 00 1453 mov dptr,#IN0BUF 050B E5*00 1454 mov a,errcode 050D F0 1455 movx @dptr,a 050E A3 1456 inc dptr 050F E5*01 1457 mov a,errval 0511 F0 1458 movx @dptr,a 0512 A3 1459 inc dptr 0513 E5*02 1460 mov a,cfgcount 0515 F0 1461 movx @dptr,a 0516 A3 1462 inc dptr 0517 E5*03 1463 mov a,cfgcount+1 0519 F0 1464 movx @dptr,a 051A A3 1465 inc dptr 051B E5*05 1466 mov a,irqcount 051D F0 1467 movx @dptr,a 051E 90 7F B5 1468 mov dptr,#IN0BC 0521 74 05 1469 mov a,#5 0523 F0 1470 movx @dptr,a 0524 05*05 1471 inc irqcount 0526 02s05r9F 1472 ljmp setupack 0529 1473 setupstallb2: 0529 02s05r9B 1474 ljmp setupstall 052C 1475 cmdnotb2: 1476 ;; 0xb3 052C B4 B3 2A 1477 cjne a,#0xb3,cmdnotb3 052F 90 7F E8 1478 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0532 E0 1479 movx a,@dptr 0533 B4 C0 20 1480 cjne a,#0xc0,setupstallb3 1481 ;; read EEPROM 0006 1482 serstrlen = 6 0536 75 F0 A0 1483 mov b,#0xa0 ; EEPROM address 0539 90s00r34 1484 mov dptr,#eepromstraddr 053C 7F 01 1485 mov r7,#1 053E 12s00r35 1486 lcall writei2c 0541 70 13 1487 jnz setupstallb3 0543 90 7F 00 1488 mov dptr,#IN0BUF 0546 7F 06 1489 mov r7,#serstrlen 0548 12s00r70 1490 lcall readi2c 054B 70 09 1491 jnz setupstallb3 054D 74 06 1492 mov a,#serstrlen 054F 90 7F B5 1493 mov dptr,#IN0BC 0552 F0 1494 movx @dptr,a 0553 02s05r9F 1495 ljmp setupack 0556 1496 setupstallb3: 0556 02s05r9B 1497 ljmp setupstall 0559 1498 cmdnotb3: 1499 ;; 0xb4 0559 B4 B4 3F 1500 cjne a,#0xb4,cmdnotb4 055C 90 7F EF 1501 mov dptr,#SETUPDAT+7 055F E0 1502 movx a,@dptr 0560 70 36 1503 jnz setupstallb4 0562 90 7F EE 1504 mov dptr,#SETUPDAT+6 0565 E0 1505 movx a,@dptr 0566 F8 1506 mov r0,a 0567 FF 1507 mov r7,a 0568 24 C0 1508 add a,#-64 056A 40 2C 1509 jc setupstallb4 056C 90 7F EC 1510 mov dptr,#SETUPDAT+4 ; wIndex 056F E0 1511 movx a,@dptr 0570 F5 F0 1512 mov b,a 0572 F5*07 1513 mov ctrladdr,a 0574 90 7F E8 1514 mov dptr,#SETUPDAT 0577 E0 1515 movx a,@dptr 0578 B4 40 0A 1516 cjne a,#0x40,0$ ; bRequestType == 0x40 057B 75*06 02 1517 mov ctrlcode,#2 057E 90 7F C5 1518 mov dptr,#OUT0BC 0581 F0 1519 movx @dptr,a 0582 02s05rA5 1520 ljmp endusbisr 0585 B4 C0 10 1521 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 0588 90 7F 00 1522 mov dptr,#IN0BUF 058B 12s00r70 1523 lcall readi2c 058E 70 08 1524 jnz setupstallb4 0590 E8 1525 mov a,r0 0591 90 7F B5 1526 mov dptr,#IN0BC 0594 F0 1527 movx @dptr,a 0595 02s05r9F 1528 ljmp setupack 0598 1529 setupstallb4: 0598 02s05r9B 1530 ljmp setupstall 059B 1531 cmdnotb4: 1532 ;; unknown commands fall through to setupstall 1533 059B 1534 setupstall: 059B 74 03 1535 mov a,#3 059D 80 02 1536 sjmp endsetup 059F 1537 setupack: 059F 74 02 1538 mov a,#2 05A1 1539 endsetup: 05A1 90 7F B4 1540 mov dptr,#EP0CS 05A4 F0 1541 movx @dptr,a 05A5 1542 endusbisr: 1543 ;; epilogue 05A5 D0 07 1544 pop ar7 05A7 D0 00 1545 pop ar0 05A9 D0 86 1546 pop dps 05AB D0 D0 1547 pop psw 05AD D0 85 1548 pop dph1 05AF D0 84 1549 pop dpl1 05B1 D0 83 1550 pop dph0 05B3 D0 82 1551 pop dpl0 05B5 D0 F0 1552 pop b 05B7 D0 E0 1553 pop acc 05B9 32 1554 reti 1555 05BA 1556 usb_sof_isr: 05BA C0 E0 1557 push acc 05BC C0 F0 1558 push b 05BE C0 82 1559 push dpl0 05C0 C0 83 1560 push dph0 05C2 C0 D0 1561 push psw 05C4 75 D0 00 1562 mov psw,#0x00 05C7 C0 86 1563 push dps 05C9 75 86 00 1564 mov dps,#0 1565 ;; clear interrupt 05CC E5 91 1566 mov a,exif 05CE C2 E4 1567 clr acc.4 05D0 F5 91 1568 mov exif,a 05D2 90 7F AB 1569 mov dptr,#USBIRQ 05D5 74 02 1570 mov a,#0x02 05D7 F0 1571 movx @dptr,a 1572 ;; handle interrupt 1573 ;; epilogue 05D8 D0 86 1574 pop dps 05DA D0 D0 1575 pop psw 05DC D0 83 1576 pop dph0 05DE D0 82 1577 pop dpl0 05E0 D0 F0 1578 pop b 05E2 D0 E0 1579 pop acc 05E4 32 1580 reti 1581 1582 05E5 1583 usb_sutok_isr: 05E5 C0 E0 1584 push acc 05E7 C0 F0 1585 push b 05E9 C0 82 1586 push dpl0 05EB C0 83 1587 push dph0 05ED C0 D0 1588 push psw 05EF 75 D0 00 1589 mov psw,#0x00 05F2 C0 86 1590 push dps 05F4 75 86 00 1591 mov dps,#0 1592 ;; clear interrupt 05F7 E5 91 1593 mov a,exif 05F9 C2 E4 1594 clr acc.4 05FB F5 91 1595 mov exif,a 05FD 90 7F AB 1596 mov dptr,#USBIRQ 0600 74 04 1597 mov a,#0x04 0602 F0 1598 movx @dptr,a 1599 ;; handle interrupt 1600 ;; epilogue 0603 D0 86 1601 pop dps 0605 D0 D0 1602 pop psw 0607 D0 83 1603 pop dph0 0609 D0 82 1604 pop dpl0 060B D0 F0 1605 pop b 060D D0 E0 1606 pop acc 060F 32 1607 reti 1608 0610 1609 usb_suspend_isr: 0610 C0 E0 1610 push acc 0612 C0 F0 1611 push b 0614 C0 82 1612 push dpl0 0616 C0 83 1613 push dph0 0618 C0 D0 1614 push psw 061A 75 D0 00 1615 mov psw,#0x00 061D C0 86 1616 push dps 061F 75 86 00 1617 mov dps,#0 1618 ;; clear interrupt 0622 E5 91 1619 mov a,exif 0624 C2 E4 1620 clr acc.4 0626 F5 91 1621 mov exif,a 0628 90 7F AB 1622 mov dptr,#USBIRQ 062B 74 08 1623 mov a,#0x08 062D F0 1624 movx @dptr,a 1625 ;; handle interrupt 1626 ;; epilogue 062E D0 86 1627 pop dps 0630 D0 D0 1628 pop psw 0632 D0 83 1629 pop dph0 0634 D0 82 1630 pop dpl0 0636 D0 F0 1631 pop b 0638 D0 E0 1632 pop acc 063A 32 1633 reti 1634 063B 1635 usb_usbreset_isr: 063B C0 E0 1636 push acc 063D C0 F0 1637 push b 063F C0 82 1638 push dpl0 0641 C0 83 1639 push dph0 0643 C0 D0 1640 push psw 0645 75 D0 00 1641 mov psw,#0x00 0648 C0 86 1642 push dps 064A 75 86 00 1643 mov dps,#0 1644 ;; clear interrupt 064D E5 91 1645 mov a,exif 064F C2 E4 1646 clr acc.4 0651 F5 91 1647 mov exif,a 0653 90 7F AB 1648 mov dptr,#USBIRQ 0656 74 10 1649 mov a,#0x10 0658 F0 1650 movx @dptr,a 1651 ;; handle interrupt 1652 ;; epilogue 0659 D0 86 1653 pop dps 065B D0 D0 1654 pop psw 065D D0 83 1655 pop dph0 065F D0 82 1656 pop dpl0 0661 D0 F0 1657 pop b 0663 D0 E0 1658 pop acc 0665 32 1659 reti 1660 0666 1661 usb_ep0in_isr: 0666 C0 E0 1662 push acc 0668 C0 F0 1663 push b 066A C0 82 1664 push dpl0 066C C0 83 1665 push dph0 066E C0 84 1666 push dpl1 0670 C0 85 1667 push dph1 0672 C0 D0 1668 push psw 0674 75 D0 00 1669 mov psw,#0x00 0677 C0 86 1670 push dps 0679 75 86 00 1671 mov dps,#0 067C C0 00 1672 push ar0 067E C0 07 1673 push ar7 1674 ;; clear interrupt 0680 E5 91 1675 mov a,exif 0682 C2 E4 1676 clr acc.4 0684 F5 91 1677 mov exif,a 0686 90 7F A9 1678 mov dptr,#IN07IRQ 0689 74 01 1679 mov a,#0x01 068B F0 1680 movx @dptr,a 1681 ;; handle interrupt 068C E5*06 1682 mov a,ctrlcode 068E B4 02 05 1683 cjne a,#2,0$ 0691 12s02r8A 1684 lcall xmemread 0694 80 11 1685 sjmp ep0inendisr 0696 90 7F B5 1686 0$: mov dptr,#IN0BC 0699 E4 1687 clr a 069A F0 1688 movx @dptr,a 069B 80 04 1689 sjmp ep0inack 1690 069D 1691 ep0install: 069D 74 03 1692 mov a,#3 069F 80 02 1693 sjmp ep0incs 06A1 1694 ep0inack: 06A1 74 02 1695 mov a,#2 06A3 1696 ep0incs: 06A3 90 7F B4 1697 mov dptr,#EP0CS 06A6 F0 1698 movx @dptr,a 06A7 1699 ep0inendisr: 1700 ;; epilogue 06A7 D0 07 1701 pop ar7 06A9 D0 00 1702 pop ar0 06AB D0 86 1703 pop dps 06AD D0 D0 1704 pop psw 06AF D0 85 1705 pop dph1 06B1 D0 84 1706 pop dpl1 06B3 D0 83 1707 pop dph0 06B5 D0 82 1708 pop dpl0 06B7 D0 F0 1709 pop b 06B9 D0 E0 1710 pop acc 06BB 32 1711 reti 1712 06BC 1713 usb_ep0out_isr: 06BC C0 E0 1714 push acc 06BE C0 F0 1715 push b 06C0 C0 82 1716 push dpl0 06C2 C0 83 1717 push dph0 06C4 C0 84 1718 push dpl1 06C6 C0 85 1719 push dph1 06C8 C0 D0 1720 push psw 06CA 75 D0 00 1721 mov psw,#0x00 06CD C0 86 1722 push dps 06CF 75 86 00 1723 mov dps,#0 06D2 C0 00 1724 push ar0 06D4 C0 06 1725 push ar6 1726 ;; clear interrupt 06D6 E5 91 1727 mov a,exif 06D8 C2 E4 1728 clr acc.4 06DA F5 91 1729 mov exif,a 06DC 90 7F AA 1730 mov dptr,#OUT07IRQ 06DF 74 01 1731 mov a,#0x01 06E1 F0 1732 movx @dptr,a 1733 ;; handle interrupt 06E2 E5*06 1734 mov a,ctrlcode ; check control code 06E4 B4 01 36 1735 cjne a,#0x01,i2cwr 1736 ;; write to external memory 06E7 90 7F C5 1737 mov dptr,#OUT0BC 06EA E0 1738 movx a,@dptr 06EB 60 28 1739 jz 0$ 06ED FF 1740 mov r7,a 06EE C3 1741 clr c 06EF E5*09 1742 mov a,ctrllen 06F1 9F 1743 subb a,r7 06F2 F5*09 1744 mov ctrllen,a 06F4 E5*0A 1745 mov a,ctrllen+1 06F6 94 00 1746 subb a,#0 06F8 F5*0A 1747 mov ctrllen+1,a 06FA 40 38 1748 jc ep0outstall 06FC 90 7E C0 1749 mov dptr,#OUT0BUF 06FF 85*07 84 1750 mov dpl1,ctrladdr 0702 85*08 85 1751 mov dph1,ctrladdr+1 0705 E0 1752 1$: movx a,@dptr 0706 A3 1753 inc dptr 0707 05 86 1754 inc dps 0709 F0 1755 movx @dptr,a 070A A3 1756 inc dptr 070B 15 86 1757 dec dps 070D DF F6 1758 djnz r7,1$ 070F 85 84*07 1759 mov ctrladdr,dpl1 0712 85 85*08 1760 mov ctrladdr+1,dph1 0715 E5*09 1761 0$: mov a,ctrllen 0717 45*0A 1762 orl a,ctrllen+1 0719 60 20 1763 jz ep0outack 071B 80 27 1764 sjmp ep0outendisr 1765 1766 ;; write I2C eeprom 071D B4 02 14 1767 i2cwr: cjne a,#0x02,ep0outstall 0720 90 7F C5 1768 mov dptr,#OUT0BC 0723 E0 1769 movx a,@dptr 0724 60 15 1770 jz ep0outack 0726 FF 1771 mov r7,a 0727 85*07 F0 1772 mov b,ctrladdr 072A 90 7E C0 1773 mov dptr,#OUT0BUF 072D 12s00r35 1774 lcall writei2c 0730 70 02 1775 jnz ep0outstall 0732 80 07 1776 sjmp ep0outack 1777 0734 1778 ep0outstall: 0734 75*06 00 1779 mov ctrlcode,#0 0737 74 03 1780 mov a,#3 0739 80 05 1781 sjmp ep0outcs 073B 1782 ep0outack: 073B 75*06 00 1783 mov ctrlcode,#0 073E 74 02 1784 mov a,#2 0740 1785 ep0outcs: 0740 90 7F B4 1786 mov dptr,#EP0CS 0743 F0 1787 movx @dptr,a 0744 1788 ep0outendisr: 1789 ;; epilogue 0744 D0 06 1790 pop ar6 0746 D0 00 1791 pop ar0 0748 D0 86 1792 pop dps 074A D0 D0 1793 pop psw 074C D0 85 1794 pop dph1 074E D0 84 1795 pop dpl1 0750 D0 83 1796 pop dph0 0752 D0 82 1797 pop dpl0 0754 D0 F0 1798 pop b 0756 D0 E0 1799 pop acc 0758 32 1800 reti 1801 0759 1802 fillusbintr:: 0759 90 7E 80 1803 mov dptr,#IN1BUF 075C E5*00 1804 mov a,errcode 075E F0 1805 movx @dptr,a 075F A3 1806 inc dptr 0760 E5*01 1807 mov a,errval 0762 F0 1808 movx @dptr,a 0763 A3 1809 inc dptr 0764 E5*02 1810 mov a,cfgcount 0766 F0 1811 movx @dptr,a 0767 A3 1812 inc dptr 0768 E5*03 1813 mov a,cfgcount+1 076A F0 1814 movx @dptr,a 076B A3 1815 inc dptr 076C E5*05 1816 mov a,irqcount 076E F0 1817 movx @dptr,a 076F 90 7F B7 1818 mov dptr,#IN1BC 0772 74 05 1819 mov a,#5 0774 F0 1820 movx @dptr,a 0775 05*05 1821 inc irqcount 0777 22 1822 ret 1823 0778 1824 usb_ep1in_isr: 0778 C0 E0 1825 push acc 077A C0 F0 1826 push b 077C C0 82 1827 push dpl0 077E C0 83 1828 push dph0 0780 C0 D0 1829 push psw 0782 75 D0 00 1830 mov psw,#0x00 0785 C0 86 1831 push dps 0787 75 86 00 1832 mov dps,#0 1833 ;; clear interrupt 078A E5 91 1834 mov a,exif 078C C2 E4 1835 clr acc.4 078E F5 91 1836 mov exif,a 0790 90 7F A9 1837 mov dptr,#IN07IRQ 0793 74 02 1838 mov a,#0x02 0795 F0 1839 movx @dptr,a 1840 ;; handle interrupt 0796 12s07r59 1841 lcall fillusbintr 1842 ;; epilogue 0799 D0 86 1843 pop dps 079B D0 D0 1844 pop psw 079D D0 83 1845 pop dph0 079F D0 82 1846 pop dpl0 07A1 D0 F0 1847 pop b 07A3 D0 E0 1848 pop acc 07A5 32 1849 reti 1850 07A6 1851 usb_ep1out_isr: 07A6 C0 E0 1852 push acc 07A8 C0 F0 1853 push b 07AA C0 82 1854 push dpl0 07AC C0 83 1855 push dph0 07AE C0 D0 1856 push psw 07B0 75 D0 00 1857 mov psw,#0x00 07B3 C0 86 1858 push dps 07B5 75 86 00 1859 mov dps,#0 1860 ;; clear interrupt 07B8 E5 91 1861 mov a,exif 07BA C2 E4 1862 clr acc.4 07BC F5 91 1863 mov exif,a 07BE 90 7F AA 1864 mov dptr,#OUT07IRQ 07C1 74 02 1865 mov a,#0x02 07C3 F0 1866 movx @dptr,a 1867 ;; handle interrupt 1868 ;; epilogue 07C4 D0 86 1869 pop dps 07C6 D0 D0 1870 pop psw 07C8 D0 83 1871 pop dph0 07CA D0 82 1872 pop dpl0 07CC D0 F0 1873 pop b 07CE D0 E0 1874 pop acc 07D0 32 1875 reti 1876 07D1 1877 usb_ep2in_isr: 07D1 C0 E0 1878 push acc 07D3 C0 F0 1879 push b 07D5 C0 82 1880 push dpl0 07D7 C0 83 1881 push dph0 07D9 C0 D0 1882 push psw 07DB 75 D0 00 1883 mov psw,#0x00 07DE C0 86 1884 push dps 07E0 75 86 00 1885 mov dps,#0 1886 ;; clear interrupt 07E3 E5 91 1887 mov a,exif 07E5 C2 E4 1888 clr acc.4 07E7 F5 91 1889 mov exif,a 07E9 90 7F A9 1890 mov dptr,#IN07IRQ 07EC 74 04 1891 mov a,#0x04 07EE F0 1892 movx @dptr,a 1893 ;; handle interrupt 1894 ;; epilogue 07EF D0 86 1895 pop dps 07F1 D0 D0 1896 pop psw 07F3 D0 83 1897 pop dph0 07F5 D0 82 1898 pop dpl0 07F7 D0 F0 1899 pop b 07F9 D0 E0 1900 pop acc 07FB 32 1901 reti 1902 07FC 1903 usb_ep2out_isr: 07FC C0 E0 1904 push acc 07FE C0 F0 1905 push b 0800 C0 82 1906 push dpl0 0802 C0 83 1907 push dph0 0804 C0 D0 1908 push psw 0806 75 D0 00 1909 mov psw,#0x00 0809 C0 86 1910 push dps 080B 75 86 00 1911 mov dps,#0 1912 ;; clear interrupt 080E E5 91 1913 mov a,exif 0810 C2 E4 1914 clr acc.4 0812 F5 91 1915 mov exif,a 0814 90 7F AA 1916 mov dptr,#OUT07IRQ 0817 74 04 1917 mov a,#0x04 0819 F0 1918 movx @dptr,a 1919 ;; handle interrupt 1920 ;; epilogue 081A D0 86 1921 pop dps 081C D0 D0 1922 pop psw 081E D0 83 1923 pop dph0 0820 D0 82 1924 pop dpl0 0822 D0 F0 1925 pop b 0824 D0 E0 1926 pop acc 0826 32 1927 reti 1928 0827 1929 usb_ep3in_isr: 0827 C0 E0 1930 push acc 0829 C0 F0 1931 push b 082B C0 82 1932 push dpl0 082D C0 83 1933 push dph0 082F C0 D0 1934 push psw 0831 75 D0 00 1935 mov psw,#0x00 0834 C0 86 1936 push dps 0836 75 86 00 1937 mov dps,#0 1938 ;; clear interrupt 0839 E5 91 1939 mov a,exif 083B C2 E4 1940 clr acc.4 083D F5 91 1941 mov exif,a 083F 90 7F A9 1942 mov dptr,#IN07IRQ 0842 74 08 1943 mov a,#0x08 0844 F0 1944 movx @dptr,a 1945 ;; handle interrupt 1946 ;; epilogue 0845 D0 86 1947 pop dps 0847 D0 D0 1948 pop psw 0849 D0 83 1949 pop dph0 084B D0 82 1950 pop dpl0 084D D0 F0 1951 pop b 084F D0 E0 1952 pop acc 0851 32 1953 reti 1954 0852 1955 usb_ep3out_isr: 0852 C0 E0 1956 push acc 0854 C0 F0 1957 push b 0856 C0 82 1958 push dpl0 0858 C0 83 1959 push dph0 085A C0 D0 1960 push psw 085C 75 D0 00 1961 mov psw,#0x00 085F C0 86 1962 push dps 0861 75 86 00 1963 mov dps,#0 1964 ;; clear interrupt 0864 E5 91 1965 mov a,exif 0866 C2 E4 1966 clr acc.4 0868 F5 91 1967 mov exif,a 086A 90 7F AA 1968 mov dptr,#OUT07IRQ 086D 74 08 1969 mov a,#0x08 086F F0 1970 movx @dptr,a 1971 ;; handle interrupt 1972 ;; epilogue 0870 D0 86 1973 pop dps 0872 D0 D0 1974 pop psw 0874 D0 83 1975 pop dph0 0876 D0 82 1976 pop dpl0 0878 D0 F0 1977 pop b 087A D0 E0 1978 pop acc 087C 32 1979 reti 1980 087D 1981 usb_ep4in_isr: 087D C0 E0 1982 push acc 087F C0 F0 1983 push b 0881 C0 82 1984 push dpl0 0883 C0 83 1985 push dph0 0885 C0 D0 1986 push psw 0887 75 D0 00 1987 mov psw,#0x00 088A C0 86 1988 push dps 088C 75 86 00 1989 mov dps,#0 1990 ;; clear interrupt 088F E5 91 1991 mov a,exif 0891 C2 E4 1992 clr acc.4 0893 F5 91 1993 mov exif,a 0895 90 7F A9 1994 mov dptr,#IN07IRQ 0898 74 10 1995 mov a,#0x10 089A F0 1996 movx @dptr,a 1997 ;; handle interrupt 1998 ;; epilogue 089B D0 86 1999 pop dps 089D D0 D0 2000 pop psw 089F D0 83 2001 pop dph0 08A1 D0 82 2002 pop dpl0 08A3 D0 F0 2003 pop b 08A5 D0 E0 2004 pop acc 08A7 32 2005 reti 2006 08A8 2007 usb_ep4out_isr: 08A8 C0 E0 2008 push acc 08AA C0 F0 2009 push b 08AC C0 82 2010 push dpl0 08AE C0 83 2011 push dph0 08B0 C0 D0 2012 push psw 08B2 75 D0 00 2013 mov psw,#0x00 08B5 C0 86 2014 push dps 08B7 75 86 00 2015 mov dps,#0 2016 ;; clear interrupt 08BA E5 91 2017 mov a,exif 08BC C2 E4 2018 clr acc.4 08BE F5 91 2019 mov exif,a 08C0 90 7F AA 2020 mov dptr,#OUT07IRQ 08C3 74 10 2021 mov a,#0x10 08C5 F0 2022 movx @dptr,a 2023 ;; handle interrupt 2024 ;; epilogue 08C6 D0 86 2025 pop dps 08C8 D0 D0 2026 pop psw 08CA D0 83 2027 pop dph0 08CC D0 82 2028 pop dpl0 08CE D0 F0 2029 pop b 08D0 D0 E0 2030 pop acc 08D2 32 2031 reti 2032 08D3 2033 usb_ep5in_isr: 08D3 C0 E0 2034 push acc 08D5 C0 F0 2035 push b 08D7 C0 82 2036 push dpl0 08D9 C0 83 2037 push dph0 08DB C0 D0 2038 push psw 08DD 75 D0 00 2039 mov psw,#0x00 08E0 C0 86 2040 push dps 08E2 75 86 00 2041 mov dps,#0 2042 ;; clear interrupt 08E5 E5 91 2043 mov a,exif 08E7 C2 E4 2044 clr acc.4 08E9 F5 91 2045 mov exif,a 08EB 90 7F A9 2046 mov dptr,#IN07IRQ 08EE 74 20 2047 mov a,#0x20 08F0 F0 2048 movx @dptr,a 2049 ;; handle interrupt 2050 ;; epilogue 08F1 D0 86 2051 pop dps 08F3 D0 D0 2052 pop psw 08F5 D0 83 2053 pop dph0 08F7 D0 82 2054 pop dpl0 08F9 D0 F0 2055 pop b 08FB D0 E0 2056 pop acc 08FD 32 2057 reti 2058 08FE 2059 usb_ep5out_isr: 08FE C0 E0 2060 push acc 0900 C0 F0 2061 push b 0902 C0 82 2062 push dpl0 0904 C0 83 2063 push dph0 0906 C0 D0 2064 push psw 0908 75 D0 00 2065 mov psw,#0x00 090B C0 86 2066 push dps 090D 75 86 00 2067 mov dps,#0 2068 ;; clear interrupt 0910 E5 91 2069 mov a,exif 0912 C2 E4 2070 clr acc.4 0914 F5 91 2071 mov exif,a 0916 90 7F AA 2072 mov dptr,#OUT07IRQ 0919 74 20 2073 mov a,#0x20 091B F0 2074 movx @dptr,a 2075 ;; handle interrupt 2076 ;; epilogue 091C D0 86 2077 pop dps 091E D0 D0 2078 pop psw 0920 D0 83 2079 pop dph0 0922 D0 82 2080 pop dpl0 0924 D0 F0 2081 pop b 0926 D0 E0 2082 pop acc 0928 32 2083 reti 2084 0929 2085 usb_ep6in_isr: 0929 C0 E0 2086 push acc 092B C0 F0 2087 push b 092D C0 82 2088 push dpl0 092F C0 83 2089 push dph0 0931 C0 D0 2090 push psw 0933 75 D0 00 2091 mov psw,#0x00 0936 C0 86 2092 push dps 0938 75 86 00 2093 mov dps,#0 2094 ;; clear interrupt 093B E5 91 2095 mov a,exif 093D C2 E4 2096 clr acc.4 093F F5 91 2097 mov exif,a 0941 90 7F A9 2098 mov dptr,#IN07IRQ 0944 74 40 2099 mov a,#0x40 0946 F0 2100 movx @dptr,a 2101 ;; handle interrupt 2102 ;; epilogue 0947 D0 86 2103 pop dps 0949 D0 D0 2104 pop psw 094B D0 83 2105 pop dph0 094D D0 82 2106 pop dpl0 094F D0 F0 2107 pop b 0951 D0 E0 2108 pop acc 0953 32 2109 reti 2110 0954 2111 usb_ep6out_isr: 0954 C0 E0 2112 push acc 0956 C0 F0 2113 push b 0958 C0 82 2114 push dpl0 095A C0 83 2115 push dph0 095C C0 D0 2116 push psw 095E 75 D0 00 2117 mov psw,#0x00 0961 C0 86 2118 push dps 0963 75 86 00 2119 mov dps,#0 2120 ;; clear interrupt 0966 E5 91 2121 mov a,exif 0968 C2 E4 2122 clr acc.4 096A F5 91 2123 mov exif,a 096C 90 7F AA 2124 mov dptr,#OUT07IRQ 096F 74 40 2125 mov a,#0x40 0971 F0 2126 movx @dptr,a 2127 ;; handle interrupt 2128 ;; epilogue 0972 D0 86 2129 pop dps 0974 D0 D0 2130 pop psw 0976 D0 83 2131 pop dph0 0978 D0 82 2132 pop dpl0 097A D0 F0 2133 pop b 097C D0 E0 2134 pop acc 097E 32 2135 reti 2136 097F 2137 usb_ep7in_isr: 097F C0 E0 2138 push acc 0981 C0 F0 2139 push b 0983 C0 82 2140 push dpl0 0985 C0 83 2141 push dph0 0987 C0 D0 2142 push psw 0989 75 D0 00 2143 mov psw,#0x00 098C C0 86 2144 push dps 098E 75 86 00 2145 mov dps,#0 2146 ;; clear interrupt 0991 E5 91 2147 mov a,exif 0993 C2 E4 2148 clr acc.4 0995 F5 91 2149 mov exif,a 0997 90 7F A9 2150 mov dptr,#IN07IRQ 099A 74 80 2151 mov a,#0x80 099C F0 2152 movx @dptr,a 2153 ;; handle interrupt 2154 ;; epilogue 099D D0 86 2155 pop dps 099F D0 D0 2156 pop psw 09A1 D0 83 2157 pop dph0 09A3 D0 82 2158 pop dpl0 09A5 D0 F0 2159 pop b 09A7 D0 E0 2160 pop acc 09A9 32 2161 reti 2162 09AA 2163 usb_ep7out_isr: 09AA C0 E0 2164 push acc 09AC C0 F0 2165 push b 09AE C0 82 2166 push dpl0 09B0 C0 83 2167 push dph0 09B2 C0 D0 2168 push psw 09B4 75 D0 00 2169 mov psw,#0x00 09B7 C0 86 2170 push dps 09B9 75 86 00 2171 mov dps,#0 2172 ;; clear interrupt 09BC E5 91 2173 mov a,exif 09BE C2 E4 2174 clr acc.4 09C0 F5 91 2175 mov exif,a 09C2 90 7F AA 2176 mov dptr,#OUT07IRQ 09C5 74 80 2177 mov a,#0x80 09C7 F0 2178 movx @dptr,a 2179 ;; handle interrupt 2180 ;; epilogue 09C8 D0 86 2181 pop dps 09CA D0 D0 2182 pop psw 09CC D0 83 2183 pop dph0 09CE D0 82 2184 pop dpl0 09D0 D0 F0 2185 pop b 09D2 D0 E0 2186 pop acc 09D4 32 2187 reti 2188 2189 ;; ----------------------------------------------------- 2190 ;; USB descriptors 2191 ;; ----------------------------------------------------- 2192 2193 ;; Device and/or Interface Class codes 0000 2194 USB_CLASS_PER_INTERFACE = 0 0001 2195 USB_CLASS_AUDIO = 1 0002 2196 USB_CLASS_COMM = 2 0003 2197 USB_CLASS_HID = 3 0007 2198 USB_CLASS_PRINTER = 7 0008 2199 USB_CLASS_MASS_STORAGE = 8 0009 2200 USB_CLASS_HUB = 9 00FF 2201 USB_CLASS_VENDOR_SPEC = 0xff 2202 2203 ;; Descriptor types 0001 2204 USB_DT_DEVICE = 0x01 0002 2205 USB_DT_CONFIG = 0x02 0003 2206 USB_DT_STRING = 0x03 0004 2207 USB_DT_INTERFACE = 0x04 0005 2208 USB_DT_ENDPOINT = 0x05 2209 2210 ;; Standard requests 0000 2211 USB_REQ_GET_STATUS = 0x00 0001 2212 USB_REQ_CLEAR_FEATURE = 0x01 0003 2213 USB_REQ_SET_FEATURE = 0x03 0005 2214 USB_REQ_SET_ADDRESS = 0x05 0006 2215 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2216 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2217 USB_REQ_GET_CONFIGURATION = 0x08 0009 2218 USB_REQ_SET_CONFIGURATION = 0x09 000A 2219 USB_REQ_GET_INTERFACE = 0x0A 000B 2220 USB_REQ_SET_INTERFACE = 0x0B 000C 2221 USB_REQ_SYNCH_FRAME = 0x0C 2222 2223 ;; USB Request Type and Endpoint Directions 0000 2224 USB_DIR_OUT = 0 0080 2225 USB_DIR_IN = 0x80 2226 0000 2227 USB_TYPE_STANDARD = (0x00 << 5) 0020 2228 USB_TYPE_CLASS = (0x01 << 5) 0040 2229 USB_TYPE_VENDOR = (0x02 << 5) 0060 2230 USB_TYPE_RESERVED = (0x03 << 5) 2231 0000 2232 USB_RECIP_DEVICE = 0x00 0001 2233 USB_RECIP_INTERFACE = 0x01 0002 2234 USB_RECIP_ENDPOINT = 0x02 0003 2235 USB_RECIP_OTHER = 0x03 2236 2237 ;; Request target types. 0000 2238 USB_RT_DEVICE = 0x00 0001 2239 USB_RT_INTERFACE = 0x01 0002 2240 USB_RT_ENDPOINT = 0x02 2241 BAC0 2242 VENDID = 0xbac0 6135 2243 PRODID = 0x6135 2244 09D5 2245 devicedescr: 09D5 12 2246 .db 18 ; bLength 09D6 01 2247 .db USB_DT_DEVICE ; bDescriptorType 09D7 00 01 2248 .db 0x00, 0x01 ; bcdUSB 09D9 FF 2249 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 09DA 00 2250 .db 0 ; bDeviceSubClass 09DB FF 2251 .db 0xff ; bDeviceProtocol 09DC 40 2252 .db 0x40 ; bMaxPacketSize0 09DD C0 BA 2253 .db VENDID ; idVendor 09DF 35 61 2254 .db PRODID ; idProduct 09E1 02 00 2255 .db 0x02,0x00 ; bcdDevice 09E3 01 2256 .db 1 ; iManufacturer 09E4 02 2257 .db 2 ; iProduct 09E5 03 2258 .db 3 ; iSerialNumber 09E6 01 2259 .db 1 ; bNumConfigurations 2260 09E7 2261 config0descr: 09E7 09 2262 .db 9 ; bLength 09E8 02 2263 .db USB_DT_CONFIG ; bDescriptorType 09E9 45 00 2264 .db config0sz ; wTotalLength 09EB 01 2265 .db 1 ; bNumInterfaces 09EC 01 2266 .db 1 ; bConfigurationValue 09ED 00 2267 .db 0 ; iConfiguration 09EE 40 2268 .db 0b01000000 ; bmAttributs (self powered) 09EF 00 2269 .db 0 ; MaxPower (mA/2) (self powered so 0) 2270 ;; interface descriptor I0:A0 09F0 09 2271 .db 9 ; bLength 09F1 04 2272 .db USB_DT_INTERFACE ; bDescriptorType 09F2 00 2273 .db 0 ; bInterfaceNumber 09F3 00 2274 .db 0 ; bAlternateSetting 09F4 03 2275 .db 3 ; bNumEndpoints 09F5 FF 2276 .db 0xff ; bInterfaceClass (vendor specific) 09F6 00 2277 .db 0x00 ; bInterfaceSubClass 09F7 FF 2278 .db 0xff ; bInterfaceProtocol (vendor specific) 09F8 00 2279 .db 0 ; iInterface 2280 ;; endpoint descriptor I0:A0:E0 09F9 07 2281 .db 7 ; bLength 09FA 05 2282 .db USB_DT_ENDPOINT ; bDescriptorType 09FB 81 2283 .db (USB_DIR_IN | 1) ; bEndpointAddress 09FC 02 2284 .db 0x02 ; bmAttributes (bulk) 09FD 40 00 2285 .db 0x40,0x00 ; wMaxPacketSize 09FF 00 2286 .db 0 ; bInterval 2287 ;; endpoint descriptor I0:A0:E1 0A00 07 2288 .db 7 ; bLength 0A01 05 2289 .db USB_DT_ENDPOINT ; bDescriptorType 0A02 82 2290 .db (USB_DIR_IN | 2) ; bEndpointAddress 0A03 02 2291 .db 0x02 ; bmAttributes (bulk) 0A04 40 00 2292 .db 0x40,0x00 ; wMaxPacketSize 0A06 00 2293 .db 0 ; bInterval 2294 ;; endpoint descriptor I0:A0:E2 0A07 07 2295 .db 7 ; bLength 0A08 05 2296 .db USB_DT_ENDPOINT ; bDescriptorType 0A09 02 2297 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0A0A 02 2298 .db 0x02 ; bmAttributes (bulk) 0A0B 40 00 2299 .db 0x40,0x00 ; wMaxPacketSize 0A0D 00 2300 .db 0 ; bInterval 2301 ;; interface descriptor I0:A1 0A0E 09 2302 .db 9 ; bLength 0A0F 04 2303 .db USB_DT_INTERFACE ; bDescriptorType 0A10 00 2304 .db 0 ; bInterfaceNumber 0A11 01 2305 .db 1 ; bAlternateSetting 0A12 03 2306 .db 3 ; bNumEndpoints 0A13 FF 2307 .db 0xff ; bInterfaceClass (vendor specific) 0A14 00 2308 .db 0x00 ; bInterfaceSubClass 0A15 FF 2309 .db 0xff ; bInterfaceProtocol (vendor specific) 0A16 00 2310 .db 0 ; iInterface 2311 ;; endpoint descriptor I0:A1:E0 0A17 07 2312 .db 7 ; bLength 0A18 05 2313 .db USB_DT_ENDPOINT ; bDescriptorType 0A19 81 2314 .db (USB_DIR_IN | 1) ; bEndpointAddress 0A1A 03 2315 .db 0x03 ; bmAttributes (interrupt) 0A1B 40 00 2316 .db 0x40,0x00 ; wMaxPacketSize 0A1D 0A 2317 .db 10 ; bInterval 2318 ;; endpoint descriptor I0:A1:E1 0A1E 07 2319 .db 7 ; bLength 0A1F 05 2320 .db USB_DT_ENDPOINT ; bDescriptorType 0A20 82 2321 .db (USB_DIR_IN | 2) ; bEndpointAddress 0A21 02 2322 .db 0x02 ; bmAttributes (bulk) 0A22 40 00 2323 .db 0x40,0x00 ; wMaxPacketSize 0A24 00 2324 .db 0 ; bInterval 2325 ;; endpoint descriptor I0:A1:E2 0A25 07 2326 .db 7 ; bLength 0A26 05 2327 .db USB_DT_ENDPOINT ; bDescriptorType 0A27 02 2328 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0A28 02 2329 .db 0x02 ; bmAttributes (bulk) 0A29 40 00 2330 .db 0x40,0x00 ; wMaxPacketSize 0A2B 00 2331 .db 0 ; bInterval 2332 0045 2333 config0sz = . - config0descr 2334 0A2C 2335 stringdescr: 0A2Cr34s0A 2336 .db string0 0A2Er38s0A 2337 .db string1 0A30r46s0A 2338 .db string2 0A32r66s0A 2339 .db stringserial 2340 0004 2341 numstrings = (. - stringdescr)/2 2342 0A34 2343 string0: 0A34 04 2344 .db string0sz ; bLength 0A35 03 2345 .db USB_DT_STRING ; bDescriptorType 0A36 00 00 2346 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2347 string0sz = . - string0 2348 0A38 2349 string1: 0A38 0E 2350 .db string1sz ; bLength 0A39 03 2351 .db USB_DT_STRING ; bDescriptorType 0A3A 42 00 61 00 79 00 2352 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2353 string1sz = . - string1 2354 0A46 2355 string2: 0A46 20 2356 .db string2sz ; bLength 0A47 03 2357 .db USB_DT_STRING ; bDescriptorType 0A48 55 00 53 00 42 00 2358 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0A58 28 00 62 00 6C 00 2359 .db '(,0,'b,0,'l,0,'a,0,'n,0,'k,0,'),0 61 00 6E 00 6B 00 29 00 0020 2360 string2sz = . - string2 2361 0A66 2362 stringserial: 0A66 02 2363 .db 2 ; bLength 0A67 03 2364 .db USB_DT_STRING ; bDescriptorType 0A68 00 00 00 00 00 00 2365 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0A78 00 00 00 00 00 00 2366 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2367 baycomusb-0.10.orig/firmware/reset2firmware/main.rst0100644000175100017510000033572507337536710020675 0ustar abaaba 1 .module main 2 3 ;; define code segments link order 4 .area CODE (CODE) 5 .area CSEG (CODE) 6 .area GSINIT (CODE) 7 .area GSINIT2 (CODE) 8 9 ;; ----------------------------------------------------- 10 11 ;; special function registers (which are not predefined) 0082 12 dpl0 = 0x82 0083 13 dph0 = 0x83 0084 14 dpl1 = 0x84 0085 15 dph1 = 0x85 0086 16 dps = 0x86 008E 17 ckcon = 0x8E 008F 18 spc_fnc = 0x8F 0091 19 exif = 0x91 0092 20 mpage = 0x92 0098 21 scon0 = 0x98 0099 22 sbuf0 = 0x99 00C0 23 scon1 = 0xC0 00C1 24 sbuf1 = 0xC1 00D8 25 eicon = 0xD8 00E8 26 eie = 0xE8 00F8 27 eip = 0xF8 28 29 ;; anchor xdata registers 7F00 30 IN0BUF = 0x7F00 7EC0 31 OUT0BUF = 0x7EC0 7E80 32 IN1BUF = 0x7E80 7E40 33 OUT1BUF = 0x7E40 7E00 34 IN2BUF = 0x7E00 7DC0 35 OUT2BUF = 0x7DC0 7D80 36 IN3BUF = 0x7D80 7D40 37 OUT3BUF = 0x7D40 7D00 38 IN4BUF = 0x7D00 7CC0 39 OUT4BUF = 0x7CC0 7C80 40 IN5BUF = 0x7C80 7C40 41 OUT5BUF = 0x7C40 7C00 42 IN6BUF = 0x7C00 7BC0 43 OUT6BUF = 0x7BC0 7B80 44 IN7BUF = 0x7B80 7B40 45 OUT7BUF = 0x7B40 7FE8 46 SETUPBUF = 0x7FE8 7FE8 47 SETUPDAT = 0x7FE8 48 7FB4 49 EP0CS = 0x7FB4 7FB5 50 IN0BC = 0x7FB5 7FB6 51 IN1CS = 0x7FB6 7FB7 52 IN1BC = 0x7FB7 7FB8 53 IN2CS = 0x7FB8 7FB9 54 IN2BC = 0x7FB9 7FBA 55 IN3CS = 0x7FBA 7FBB 56 IN3BC = 0x7FBB 7FBC 57 IN4CS = 0x7FBC 7FBD 58 IN4BC = 0x7FBD 7FBE 59 IN5CS = 0x7FBE 7FBF 60 IN5BC = 0x7FBF 7FC0 61 IN6CS = 0x7FC0 7FC1 62 IN6BC = 0x7FC1 7FC2 63 IN7CS = 0x7FC2 7FC3 64 IN7BC = 0x7FC3 7FC5 65 OUT0BC = 0x7FC5 7FC6 66 OUT1CS = 0x7FC6 7FC7 67 OUT1BC = 0x7FC7 7FC8 68 OUT2CS = 0x7FC8 7FC9 69 OUT2BC = 0x7FC9 7FCA 70 OUT3CS = 0x7FCA 7FCB 71 OUT3BC = 0x7FCB 7FCC 72 OUT4CS = 0x7FCC 7FCD 73 OUT4BC = 0x7FCD 7FCE 74 OUT5CS = 0x7FCE 7FCF 75 OUT5BC = 0x7FCF 7FD0 76 OUT6CS = 0x7FD0 7FD1 77 OUT6BC = 0x7FD1 7FD2 78 OUT7CS = 0x7FD2 7FD3 79 OUT7BC = 0x7FD3 80 7FA8 81 IVEC = 0x7FA8 7FA9 82 IN07IRQ = 0x7FA9 7FAA 83 OUT07IRQ = 0x7FAA 7FAB 84 USBIRQ = 0x7FAB 7FAC 85 IN07IEN = 0x7FAC 7FAD 86 OUT07IEN = 0x7FAD 7FAE 87 USBIEN = 0x7FAE 7FAF 88 USBBAV = 0x7FAF 7FB2 89 BPADDRH = 0x7FB2 7FB3 90 BPADDRL = 0x7FB3 91 7FD4 92 SUDPTRH = 0x7FD4 7FD5 93 SUDPTRL = 0x7FD5 7FD6 94 USBCS = 0x7FD6 7FD7 95 TOGCTL = 0x7FD7 7FD8 96 USBFRAMEL = 0x7FD8 7FD9 97 USBFRAMEH = 0x7FD9 7FDB 98 FNADDR = 0x7FDB 7FDD 99 USBPAIR = 0x7FDD 7FDE 100 IN07VAL = 0x7FDE 7FDF 101 OUT07VAL = 0x7FDF 7FE3 102 AUTOPTRH = 0x7FE3 7FE4 103 AUTOPTRL = 0x7FE4 7FE5 104 AUTODATA = 0x7FE5 105 106 ;; isochronous endpoints. only available if ISODISAB=0 107 7F60 108 OUT8DATA = 0x7F60 7F61 109 OUT9DATA = 0x7F61 7F62 110 OUT10DATA = 0x7F62 7F63 111 OUT11DATA = 0x7F63 7F64 112 OUT12DATA = 0x7F64 7F65 113 OUT13DATA = 0x7F65 7F66 114 OUT14DATA = 0x7F66 7F67 115 OUT15DATA = 0x7F67 116 7F68 117 IN8DATA = 0x7F68 7F69 118 IN9DATA = 0x7F69 7F6A 119 IN10DATA = 0x7F6A 7F6B 120 IN11DATA = 0x7F6B 7F6C 121 IN12DATA = 0x7F6C 7F6D 122 IN13DATA = 0x7F6D 7F6E 123 IN14DATA = 0x7F6E 7F6F 124 IN15DATA = 0x7F6F 125 7F70 126 OUT8BCH = 0x7F70 7F71 127 OUT8BCL = 0x7F71 7F72 128 OUT9BCH = 0x7F72 7F73 129 OUT9BCL = 0x7F73 7F74 130 OUT10BCH = 0x7F74 7F75 131 OUT10BCL = 0x7F75 7F76 132 OUT11BCH = 0x7F76 7F77 133 OUT11BCL = 0x7F77 7F78 134 OUT12BCH = 0x7F78 7F79 135 OUT12BCL = 0x7F79 7F7A 136 OUT13BCH = 0x7F7A 7F7B 137 OUT13BCL = 0x7F7B 7F7C 138 OUT14BCH = 0x7F7C 7F7D 139 OUT14BCL = 0x7F7D 7F7E 140 OUT15BCH = 0x7F7E 7F7F 141 OUT15BCL = 0x7F7F 142 7FF0 143 OUT8ADDR = 0x7FF0 7FF1 144 OUT9ADDR = 0x7FF1 7FF2 145 OUT10ADDR = 0x7FF2 7FF3 146 OUT11ADDR = 0x7FF3 7FF4 147 OUT12ADDR = 0x7FF4 7FF5 148 OUT13ADDR = 0x7FF5 7FF6 149 OUT14ADDR = 0x7FF6 7FF7 150 OUT15ADDR = 0x7FF7 7FF8 151 IN8ADDR = 0x7FF8 7FF9 152 IN9ADDR = 0x7FF9 7FFA 153 IN10ADDR = 0x7FFA 7FFB 154 IN11ADDR = 0x7FFB 7FFC 155 IN12ADDR = 0x7FFC 7FFD 156 IN13ADDR = 0x7FFD 7FFE 157 IN14ADDR = 0x7FFE 7FFF 158 IN15ADDR = 0x7FFF 159 7FA0 160 ISOERR = 0x7FA0 7FA1 161 ISOCTL = 0x7FA1 7FA2 162 ZBCOUNT = 0x7FA2 7FE0 163 INISOVAL = 0x7FE0 7FE1 164 OUTISOVAL = 0x7FE1 7FE2 165 FASTXFR = 0x7FE2 166 167 ;; CPU control registers 168 7F92 169 CPUCS = 0x7F92 170 171 ;; IO port control registers 172 7F93 173 PORTACFG = 0x7F93 7F94 174 PORTBCFG = 0x7F94 7F95 175 PORTCCFG = 0x7F95 7F96 176 OUTA = 0x7F96 7F97 177 OUTB = 0x7F97 7F98 178 OUTC = 0x7F98 7F99 179 PINSA = 0x7F99 7F9A 180 PINSB = 0x7F9A 7F9B 181 PINSC = 0x7F9B 7F9C 182 OEA = 0x7F9C 7F9D 183 OEB = 0x7F9D 7F9E 184 OEC = 0x7F9E 185 186 ;; I2C controller registers 187 7FA5 188 I2CS = 0x7FA5 7FA6 189 I2DAT = 0x7FA6 190 191 ;; FPGA defines 0003 192 XC4K_IRLENGTH = 3 0000 193 XC4K_EXTEST = 0 0001 194 XC4K_PRELOAD = 1 0005 195 XC4K_CONFIGURE = 5 0007 196 XC4K_BYPASS = 7 197 2E64 198 FPGA_CONFIGSIZE = 11876 0158 199 FPGA_BOUND = 344 200 0000 201 SOFTWARECONFIG = 0 202 203 ;; ----------------------------------------------------- 204 205 .area CODE (CODE) 0000 02 0B DF 206 ljmp startup 0003 02 02 36 207 ljmp int0_isr 0006 208 .ds 5 000B 02 02 57 209 ljmp timer0_isr 000E 210 .ds 5 0013 02 02 87 211 ljmp int1_isr 0016 212 .ds 5 001B 02 02 A8 213 ljmp timer1_isr 001E 214 .ds 5 0023 02 02 C9 215 ljmp ser0_isr 0026 216 .ds 5 002B 02 02 EC 217 ljmp timer2_isr 002E 218 .ds 5 0033 02 03 0D 219 ljmp resume_isr 0036 220 .ds 5 003B 02 03 2E 221 ljmp ser1_isr 003E 222 .ds 5 0043 02 01 00 223 ljmp usb_isr 0046 224 .ds 5 004B 02 03 51 225 ljmp i2c_isr 004E 226 .ds 5 0053 02 03 76 227 ljmp int4_isr 0056 228 .ds 5 005B 02 03 9B 229 ljmp int5_isr 005E 230 .ds 5 0063 02 03 C0 231 ljmp int6_isr 232 0066 233 .ds 0x9a 234 ;; USB interrupt dispatch table 0100 235 usb_isr: 0100 02 04 29 236 ljmp usb_sudav_isr 0103 237 .ds 1 0104 02 07 11 238 ljmp usb_sof_isr 0107 239 .ds 1 0108 02 07 3C 240 ljmp usb_sutok_isr 010B 241 .ds 1 010C 02 07 67 242 ljmp usb_suspend_isr 010F 243 .ds 1 0110 02 07 92 244 ljmp usb_usbreset_isr 0113 245 .ds 1 0114 32 246 reti 0115 247 .ds 3 0118 02 07 BD 248 ljmp usb_ep0in_isr 011B 249 .ds 1 011C 02 08 13 250 ljmp usb_ep0out_isr 011F 251 .ds 1 0120 02 08 CF 252 ljmp usb_ep1in_isr 0123 253 .ds 1 0124 02 08 FD 254 ljmp usb_ep1out_isr 0127 255 .ds 1 0128 02 09 28 256 ljmp usb_ep2in_isr 012B 257 .ds 1 012C 02 09 53 258 ljmp usb_ep2out_isr 012F 259 .ds 1 0130 02 09 7E 260 ljmp usb_ep3in_isr 0133 261 .ds 1 0134 02 09 A9 262 ljmp usb_ep3out_isr 0137 263 .ds 1 0138 02 09 D4 264 ljmp usb_ep4in_isr 013B 265 .ds 1 013C 02 09 FF 266 ljmp usb_ep4out_isr 013F 267 .ds 1 0140 02 0A 2A 268 ljmp usb_ep5in_isr 0143 269 .ds 1 0144 02 0A 55 270 ljmp usb_ep5out_isr 0147 271 .ds 1 0148 02 0A 80 272 ljmp usb_ep6in_isr 014B 273 .ds 1 014C 02 0A AB 274 ljmp usb_ep6out_isr 014F 275 .ds 1 0150 02 0A D6 276 ljmp usb_ep7in_isr 0153 277 .ds 1 0154 02 0B 01 278 ljmp usb_ep7out_isr 279 280 ;; ----------------------------------------------------- 281 282 .area BSEG (BIT) 283 284 .area ISEG (DATA) 0080 285 stack: .ds 0x80 286 287 .area DSEG (DATA) 0040 288 errcode: .ds 1 0041 289 errval: .ds 1 0042 290 cfgcount: .ds 2 0044 291 leddiv: .ds 1 0045 292 irqcount: .ds 1 0046 293 ctrlcode: .ds 1 0047 294 ctrladdr: .ds 2 0049 295 ctrllen: .ds 2 296 297 ;; USB state 004B 298 numconfig: .ds 1 004C 299 altsetting: .ds 1 300 301 .area XSEG (DATA) 302 303 304 .area GSINIT (CODE) 0BDF 305 startup: 0BDF 75 81 80 306 mov sp,#stack ; -1 0BE2 E4 307 clr a 0BE3 F5 D0 308 mov psw,a 0BE5 F5 86 309 mov dps,a 310 ;lcall __sdcc_external_startup 311 ;mov a,dpl0 312 ;jz __sdcc_init_data 313 ;ljmp __sdcc_program_startup 0BE7 314 __sdcc_init_data: 315 316 .area GSINIT2 (CODE) 0BE7 317 __sdcc_program_startup: 318 ;; assembler code startup 0BE7 E4 319 clr a 0BE8 F5 40 320 mov errcode,a 0BEA F5 41 321 mov errval,a 0BEC F5 42 322 mov cfgcount,a 0BEE F5 43 323 mov cfgcount+1,a 0BF0 F5 45 324 mov irqcount,a 0BF2 F5 46 325 mov ctrlcode,a 0BF4 F5 86 326 mov dps,a 0BF6 F5 A8 327 mov ie,a 328 ;; some indirect register setup 0BF8 75 8E 31 329 mov ckcon,#0x31 ; one external wait state, to avoid chip bugs 330 ;; Timer setup: 331 ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 332 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 0BFB 75 89 21 333 mov tmod,#0x21 0BFE 75 88 55 334 mov tcon,#0x55 ; INT0/INT1 edge 0C01 75 8D 64 335 mov th1,#256-156 ; 1200 bauds 0C04 75 87 00 336 mov pcon,#0 ; SMOD0=0 337 ;; give Windows a chance to finish the writecpucs control transfer 338 ;; 10ms delay loop 0C07 90 E8 90 339 mov dptr,#(-6000)&0xffff 0C0A A3 340 9$: inc dptr ; 3 cycles 0C0B E5 82 341 mov a,dpl0 ; 2 cycles 0C0D 45 83 342 orl a,dph0 ; 2 cycles 0C0F 70 F9 343 jnz 9$ ; 3 cycles 344 ;; init USB subsystem 0C11 90 7F A1 345 mov dptr,#ISOCTL 0C14 74 01 346 mov a,#1 ; disable ISO endpoints 0C16 F0 347 movx @dptr,a 0C17 90 7F AF 348 mov dptr,#USBBAV 0C1A 74 01 349 mov a,#1 ; enable autovector, disable breakpoint logic 0C1C F0 350 movx @dptr,a 0C1D E4 351 clr a 0C1E 90 7F E0 352 mov dptr,#INISOVAL 0C21 F0 353 movx @dptr,a 0C22 90 7F E1 354 mov dptr,#OUTISOVAL 0C25 F0 355 movx @dptr,a 0C26 90 7F DD 356 mov dptr,#USBPAIR 0C29 74 09 357 mov a,#0x9 ; pair EP 2&3 for input & output 0C2B F0 358 movx @dptr,a 0C2C 90 7F DE 359 mov dptr,#IN07VAL 0C2F 74 07 360 mov a,#0x7 ; enable EP0+EP1+EP2 0C31 F0 361 movx @dptr,a 0C32 90 7F DF 362 mov dptr,#OUT07VAL 0C35 74 05 363 mov a,#0x5 ; enable EP0+EP2 0C37 F0 364 movx @dptr,a 365 ;; USB: init endpoint toggles 0C38 90 7F D7 366 mov dptr,#TOGCTL 0C3B 74 12 367 mov a,#0x12 0C3D F0 368 movx @dptr,a 0C3E 74 32 369 mov a,#0x32 ; clear EP 2 in toggle 0C40 F0 370 movx @dptr,a 0C41 74 02 371 mov a,#0x02 0C43 F0 372 movx @dptr,a 0C44 74 22 373 mov a,#0x22 ; clear EP 2 out toggle 0C46 F0 374 movx @dptr,a 375 ;; configure IO ports 0C47 90 7F 93 376 mov dptr,#PORTACFG 0C4A 74 00 377 mov a,#0 0C4C F0 378 movx @dptr,a 0C4D 90 7F 96 379 mov dptr,#OUTA 0C50 74 80 380 mov a,#0x80 ; set PROG lo 0C52 F0 381 movx @dptr,a 0C53 90 7F 9C 382 mov dptr,#OEA 0C56 74 C2 383 mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE 0C58 F0 384 movx @dptr,a 0C59 90 7F 94 385 mov dptr,#PORTBCFG 0C5C 74 00 386 mov a,#0 0C5E F0 387 movx @dptr,a 0C5F 90 7F 9D 388 mov dptr,#OEB 0C62 74 00 389 mov a,#0 0C64 F0 390 movx @dptr,a 0C65 90 7F 95 391 mov dptr,#PORTCCFG 0C68 74 00 392 mov a,#0 0C6A F0 393 movx @dptr,a 0C6B 90 7F 98 394 mov dptr,#OUTC 0C6E 74 20 395 mov a,#0x20 0C70 F0 396 movx @dptr,a 0C71 90 7F 9E 397 mov dptr,#OEC 0C74 74 2E 398 mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO 0C76 F0 399 movx @dptr,a 400 ;; enable interrupts 0C77 75 A8 82 401 mov ie,#0x82 ; enable timer 0 0C7A 75 E8 01 402 mov eie,#0x01 ; enable USB interrupts 0C7D 90 7F AE 403 mov dptr,#USBIEN 0C80 74 01 404 mov a,#1 ; enable SUDAV interrupt 0C82 F0 405 movx @dptr,a 0C83 90 7F AC 406 mov dptr,#IN07IEN 0C86 74 03 407 mov a,#3 ; enable EP0+EP1 interrupt 0C88 F0 408 movx @dptr,a 0C89 90 7F AD 409 mov dptr,#OUT07IEN 0C8C 74 01 410 mov a,#1 ; enable EP0 interrupt 0C8E F0 411 movx @dptr,a 412 ;; initialize UART 0 for config loading 0C8F 75 98 20 413 mov scon0,#0x20 ; mode 0, CLK24/4 0C92 75 99 FF 414 mov sbuf0,#0xff 415 ;; initialize USB state 0C95 E4 416 clr a 0C96 F5 4B 417 mov numconfig,a 0C98 F5 4C 418 mov altsetting,a 0001 419 .if 1 420 ;; disconnect from USB bus 0C9A 90 7F D6 421 mov dptr,#USBCS 0C9D 74 0A 422 mov a,#10 0C9F F0 423 movx @dptr,a 424 ;; wait 0.3 sec 0CA0 7A 1E 425 mov r2,#30 426 ;; 10ms delay loop 0CA2 90 E8 90 427 0$: mov dptr,#(-6000)&0xffff 0CA5 A3 428 1$: inc dptr ; 3 cycles 0CA6 E5 82 429 mov a,dpl0 ; 2 cycles 0CA8 45 83 430 orl a,dph0 ; 2 cycles 0CAA 70 F9 431 jnz 1$ ; 3 cycles 0CAC DA F4 432 djnz r2,0$ 433 ;; reconnect to USB bus 0CAE 90 7F D6 434 mov dptr,#USBCS 0CB1 74 02 435 mov a,#2 ; 8051 handles control 0CB3 F0 436 movx @dptr,a 0CB4 74 06 437 mov a,#6 ; reconnect, 8051 handles control 0CB6 F0 438 movx @dptr,a 439 .endif 440 441 ;; final 0CB7 12 08 B0 442 lcall fillusbintr 443 ;; kludge; first OUT2 packet seems to be bogus 444 ;; wait for packet with length 1 and contents 0x55 445 446 ;; some short delay 0CBA 90 7F 96 447 mov dptr,#OUTA 0CBD 74 82 448 mov a,#0x82 ; set PROG hi 0CBF F0 449 movx @dptr,a 0CC0 90 7F 99 450 mov dptr,#PINSA 0CC3 E0 451 movx a,@dptr 0CC4 30 E2 06 452 jnb acc.2,8$ 453 ;; DONE stuck high 0CC7 75 40 80 454 mov errcode,#0x80 0CCA 02 0D F6 455 ljmp fpgaerr 0CCD 12 01 57 456 8$: lcall jtag_reset_tap 0CD0 7A 05 457 mov r2,#5 0CD2 7B 00 458 mov r3,#0 0CD4 7C 06 459 mov r4,#6 0CD6 12 01 5D 460 lcall jtag_shiftout ; enter SHIFT-IR state 0CD9 7A 08 461 mov r2,#8 0CDB 7B 00 462 mov r3,#0 0CDD 7C 00 463 mov r4,#0 0CDF 12 01 5D 464 lcall jtag_shiftout ; assume max. 8bit IR 0CE2 7A 08 465 mov r2,#8 0CE4 7B 01 466 mov r3,#1 0CE6 7C 00 467 mov r4,#0 0CE8 12 01 5D 468 lcall jtag_shift ; shift in a single bit 0CEB 74 F8 469 mov a,#-(1<(-FPGA_CONFIGSIZE) 0DA1 35 43 596 addc a,cfgcount+1 0DA3 50 B7 597 jnc loadloop 598 ;; configuration download complete, start FPGA 0DA5 90 7F 94 599 mov dptr,#PORTBCFG 0DA8 74 00 600 mov a,#0 ; TDI no longer special function pin 0DAA F0 601 movx @dptr,a 0DAB 90 7F 95 602 mov dptr,#PORTCCFG 0DAE 74 00 603 mov a,#0 ; TCK no longer special function pin 0DB0 F0 604 movx @dptr,a 605 ;; wait for done loop 0DB1 7F FA 606 mov r7,#250 0DB3 607 doneloop: 0DB3 90 7F 99 608 mov dptr,#PINSA 0DB6 E0 609 movx a,@dptr 0DB7 20 E2 1F 610 jb acc.2,doneactive 0DBA 90 7F 9B 611 mov dptr,#PINSC 0DBD E0 612 movx a,@dptr 0DBE 20 E2 06 613 jb acc.2,1$ 614 ;; INIT low 0DC1 75 40 90 615 mov errcode,#0x90 0DC4 02 0D F6 616 ljmp fpgaerr 0DC7 90 7F 98 617 1$: mov dptr,#OUTC 0DCA E0 618 movx a,@dptr 0DCB D2 E1 619 setb acc.1 0DCD F0 620 movx @dptr,a 0DCE C2 E1 621 clr acc.1 0DD0 F0 622 movx @dptr,a 0DD1 DF E0 623 djnz r7,doneloop 624 ;; DONE stuck low 0DD3 75 40 91 625 mov errcode,#0x91 0DD6 02 0D F6 626 ljmp fpgaerr 627 0DD9 628 doneactive: 629 ;; generate 16 clock pulses to start up FPGA 0DD9 7F 10 630 mov r7,#16 0DDB 90 7F 98 631 mov dptr,#OUTC 0DDE E0 632 movx a,@dptr 0DDF D2 E1 633 0$: setb acc.1 0DE1 F0 634 movx @dptr,a 0DE2 C2 E1 635 clr acc.1 0DE4 F0 636 movx @dptr,a 0DE5 DF F8 637 djnz r7,0$ 0DE7 90 7F 95 638 mov dptr,#PORTCCFG 0DEA 74 C0 639 mov a,#0xc0 ; RD/WR is special function pin 0DEC F0 640 movx @dptr,a 0DED 75 40 20 641 mov errcode,#0x20 642 643 ;; turn off PTT 0DF0 90 C0 08 644 mov dptr,#0xc008 0DF3 74 42 645 mov a,#0x42 0DF5 F0 646 movx @dptr,a 647 0DF6 648 fpgaerr: 0DF6 80 FE 649 sjmp fpgaerr 650 651 .area CSEG (CODE) 0002 652 ar2 = 0x02 0003 653 ar3 = 0x03 0004 654 ar4 = 0x04 0005 655 ar5 = 0x05 0006 656 ar6 = 0x06 0007 657 ar7 = 0x07 0000 658 ar0 = 0x00 0001 659 ar1 = 0x01 660 661 ;; jtag_shift 662 ;; r2 = num 663 ;; r3 = tdi 664 ;; r4 = tms 665 ;; return: r7 = tdo 0157 666 jtag_reset_tap: 0157 7A 05 667 mov r2,#5 0159 7B 00 668 mov r3,#0 015B 7C FF 669 mov r4,#0xff 015D 670 jtag_shiftout: 015D 671 jtag_shift: 015D 7E 01 672 mov r6,#1 015F 7F 00 673 mov r7,#0 0161 74 02 674 1$: mov a,#2 0163 CB 675 xch a,r3 0164 13 676 rrc a 0165 CB 677 xch a,r3 0166 92 E6 678 mov acc.6,c 0168 CC 679 xch a,r4 0169 13 680 rrc a 016A CC 681 xch a,r4 016B 92 E7 682 mov acc.7,c 016D 90 7F 96 683 mov dptr,#OUTA 0170 F0 684 movx @dptr,a 0171 90 7F 9B 685 mov dptr,#PINSC 0174 E0 686 movx a,@dptr 0175 30 E0 03 687 jnb acc.0,2$ 0178 EE 688 mov a,r6 0179 42 07 689 orl ar7,a 017B 90 7F 98 690 2$: mov dptr,#OUTC 017E E0 691 movx a,@dptr 017F D2 E1 692 setb acc.1 0181 F0 693 movx @dptr,a 0182 C2 E1 694 clr acc.1 0184 F0 695 movx @dptr,a 0185 EE 696 mov a,r6 0186 23 697 rl a 0187 FE 698 mov r6,a 0188 DA D7 699 djnz r2,1$ 018A 22 700 ret 701 702 ;; EEPROM address where the serial number is located 703 018B 704 eepromstraddr: 018B 10 705 .db 0x10 706 707 ;; I2C Routines 708 ;; note: ckcon should be set to #0x31 to avoid chip bugs 709 018C 710 writei2c: 711 ;; dptr: data to be sent 712 ;; b: device address 713 ;; r7: transfer length 714 ;; return: a: status (bytes remaining, 0xff bus error) 018C 05 86 715 inc dps 018E 90 7F A5 716 mov dptr,#I2CS 0191 C2 F0 717 clr b.0 ; r/w = 0 0193 74 80 718 mov a,#0x80 ; start condition 0195 F0 719 movx @dptr,a 0196 90 7F A6 720 mov dptr,#I2DAT 0199 E5 F0 721 mov a,b 019B F0 722 movx @dptr,a 019C 90 7F A5 723 mov dptr,#I2CS 019F E0 724 0$: movx a,@dptr 01A0 20 E2 20 725 jb acc.2,3$ ; BERR 01A3 30 E0 F9 726 jnb acc.0,0$ ; DONE 01A6 30 E1 0F 727 jnb acc.1,1$ ; ACK 01A9 90 7F A6 728 mov dptr,#I2DAT 01AC 15 86 729 dec dps 01AE E0 730 movx a,@dptr 01AF A3 731 inc dptr 01B0 05 86 732 inc dps 01B2 F0 733 movx @dptr,a 01B3 90 7F A5 734 mov dptr,#I2CS 01B6 DF E7 735 djnz r7,0$ 01B8 74 40 736 1$: mov a,#0x40 ; stop condition 01BA F0 737 movx @dptr,a 01BB E0 738 2$: movx a,@dptr 01BC 20 E6 FC 739 jb acc.6,2$ 01BF 15 86 740 dec dps 01C1 EF 741 mov a,r7 01C2 22 742 ret 01C3 7F FF 743 3$: mov r7,#255 01C5 80 F1 744 sjmp 1$ 745 01C7 746 readi2c: 747 ;; dptr: data to be sent 748 ;; b: device address 749 ;; r7: transfer length 750 ;; return: a: status (bytes remaining, 0xff bus error) 01C7 05 86 751 inc dps 01C9 90 7F A5 752 mov dptr,#I2CS 01CC D2 F0 753 setb b.0 ; r/w = 1 01CE 74 80 754 mov a,#0x80 ; start condition 01D0 F0 755 movx @dptr,a 01D1 90 7F A6 756 mov dptr,#I2DAT 01D4 E5 F0 757 mov a,b 01D6 F0 758 movx @dptr,a 01D7 90 7F A5 759 mov dptr,#I2CS 01DA E0 760 0$: movx a,@dptr 01DB 20 E2 4C 761 jb acc.2,9$ ; BERR 01DE 30 E0 F9 762 jnb acc.0,0$ ; DONE 01E1 30 E1 03 763 jnb acc.1,5$ ; ACK 01E4 EF 764 mov a,r7 01E5 70 0B 765 jnz 1$ 01E7 74 40 766 5$: mov a,#0x40 ; stop condition 01E9 F0 767 movx @dptr,a 01EA E0 768 2$: movx a,@dptr 01EB 20 E6 FC 769 jb acc.6,2$ 01EE 15 86 770 dec dps 01F0 E4 771 clr a 01F1 22 772 ret 01F2 B4 01 03 773 1$: cjne a,#1,3$ 01F5 74 20 774 mov a,#0x20 ; LASTRD = 1 01F7 F0 775 movx @dptr,a 01F8 90 7F A6 776 3$: mov dptr,#I2DAT 01FB E0 777 movx a,@dptr ; initiate first read 01FC 90 7F A5 778 mov dptr,#I2CS 01FF E0 779 4$: movx a,@dptr 0200 20 E2 27 780 jb acc.2,9$ ; BERR 0203 30 E0 F9 781 jnb acc.0,4$ ; DONE 0206 EF 782 mov a,r7 0207 B4 02 03 783 cjne a,#2,6$ 020A 74 20 784 mov a,#0x20 ; LASTRD = 1 020C F0 785 movx @dptr,a 020D B4 01 03 786 6$: cjne a,#1,7$ 0210 74 40 787 mov a,#0x40 ; stop condition 0212 F0 788 movx @dptr,a 0213 90 7F A6 789 7$: mov dptr,#I2DAT 0216 E0 790 movx a,@dptr ; read data 0217 15 86 791 dec dps 0219 F0 792 movx @dptr,a 021A A3 793 inc dptr 021B 05 86 794 inc dps 021D 90 7F A5 795 mov dptr,#I2CS 0220 DF DD 796 djnz r7,4$ 0222 E0 797 8$: movx a,@dptr 0223 20 E6 FC 798 jb acc.6,8$ 0226 15 86 799 dec dps 0228 E4 800 clr a 0229 22 801 ret 022A 74 40 802 9$: mov a,#0x40 ; stop condition 022C F0 803 movx @dptr,a 022D E0 804 10$: movx a,@dptr 022E 20 E6 FC 805 jb acc.6,10$ 0231 74 FF 806 mov a,#255 0233 15 86 807 dec dps 0235 22 808 ret 809 810 ;; ------------------ interrupt handlers ------------------------ 811 0236 812 int0_isr: 0236 C0 E0 813 push acc 0238 C0 F0 814 push b 023A C0 82 815 push dpl0 023C C0 83 816 push dph0 023E C0 D0 817 push psw 0240 75 D0 00 818 mov psw,#0x00 0243 C0 86 819 push dps 0245 75 86 00 820 mov dps,#0 821 ;; clear interrupt 0248 C2 89 822 clr tcon+1 823 ;; handle interrupt 824 ;; epilogue 024A D0 86 825 pop dps 024C D0 D0 826 pop psw 024E D0 83 827 pop dph0 0250 D0 82 828 pop dpl0 0252 D0 F0 829 pop b 0254 D0 E0 830 pop acc 0256 32 831 reti 832 0257 833 timer0_isr: 0257 C0 E0 834 push acc 0259 C0 F0 835 push b 025B C0 82 836 push dpl0 025D C0 83 837 push dph0 025F C0 D0 838 push psw 0261 75 D0 00 839 mov psw,#0x00 0264 C0 86 840 push dps 0266 75 86 00 841 mov dps,#0 842 ;; clear interrupt 0269 C2 8D 843 clr tcon+5 844 ;; handle interrupt 026B 05 44 845 inc leddiv 026D E5 44 846 mov a,leddiv 026F 54 07 847 anl a,#7 0271 70 07 848 jnz 0$ 0273 90 7F 98 849 mov dptr,#OUTC 0276 E0 850 movx a,@dptr 0277 64 08 851 xrl a,#0x08 0279 F0 852 movx @dptr,a 027A 853 0$: 854 ;; epilogue 027A D0 86 855 pop dps 027C D0 D0 856 pop psw 027E D0 83 857 pop dph0 0280 D0 82 858 pop dpl0 0282 D0 F0 859 pop b 0284 D0 E0 860 pop acc 0286 32 861 reti 862 0287 863 int1_isr: 0287 C0 E0 864 push acc 0289 C0 F0 865 push b 028B C0 82 866 push dpl0 028D C0 83 867 push dph0 028F C0 D0 868 push psw 0291 75 D0 00 869 mov psw,#0x00 0294 C0 86 870 push dps 0296 75 86 00 871 mov dps,#0 872 ;; clear interrupt 0299 C2 8B 873 clr tcon+3 874 ;; handle interrupt 875 ;; epilogue 029B D0 86 876 pop dps 029D D0 D0 877 pop psw 029F D0 83 878 pop dph0 02A1 D0 82 879 pop dpl0 02A3 D0 F0 880 pop b 02A5 D0 E0 881 pop acc 02A7 32 882 reti 883 02A8 884 timer1_isr: 02A8 C0 E0 885 push acc 02AA C0 F0 886 push b 02AC C0 82 887 push dpl0 02AE C0 83 888 push dph0 02B0 C0 D0 889 push psw 02B2 75 D0 00 890 mov psw,#0x00 02B5 C0 86 891 push dps 02B7 75 86 00 892 mov dps,#0 893 ;; clear interrupt 02BA C2 8F 894 clr tcon+7 895 ;; handle interrupt 896 ;; epilogue 02BC D0 86 897 pop dps 02BE D0 D0 898 pop psw 02C0 D0 83 899 pop dph0 02C2 D0 82 900 pop dpl0 02C4 D0 F0 901 pop b 02C6 D0 E0 902 pop acc 02C8 32 903 reti 904 02C9 905 ser0_isr: 02C9 C0 E0 906 push acc 02CB C0 F0 907 push b 02CD C0 82 908 push dpl0 02CF C0 83 909 push dph0 02D1 C0 D0 910 push psw 02D3 75 D0 00 911 mov psw,#0x00 02D6 C0 86 912 push dps 02D8 75 86 00 913 mov dps,#0 914 ;; clear interrupt 02DB C2 98 915 clr scon0+0 02DD C2 99 916 clr scon0+1 917 ;; handle interrupt 918 ;; epilogue 02DF D0 86 919 pop dps 02E1 D0 D0 920 pop psw 02E3 D0 83 921 pop dph0 02E5 D0 82 922 pop dpl0 02E7 D0 F0 923 pop b 02E9 D0 E0 924 pop acc 02EB 32 925 reti 926 02EC 927 timer2_isr: 02EC C0 E0 928 push acc 02EE C0 F0 929 push b 02F0 C0 82 930 push dpl0 02F2 C0 83 931 push dph0 02F4 C0 D0 932 push psw 02F6 75 D0 00 933 mov psw,#0x00 02F9 C0 86 934 push dps 02FB 75 86 00 935 mov dps,#0 936 ;; clear interrupt 02FE C2 CF 937 clr t2con+7 938 ;; handle interrupt 939 ;; epilogue 0300 D0 86 940 pop dps 0302 D0 D0 941 pop psw 0304 D0 83 942 pop dph0 0306 D0 82 943 pop dpl0 0308 D0 F0 944 pop b 030A D0 E0 945 pop acc 030C 32 946 reti 947 030D 948 resume_isr: 030D C0 E0 949 push acc 030F C0 F0 950 push b 0311 C0 82 951 push dpl0 0313 C0 83 952 push dph0 0315 C0 D0 953 push psw 0317 75 D0 00 954 mov psw,#0x00 031A C0 86 955 push dps 031C 75 86 00 956 mov dps,#0 957 ;; clear interrupt 031F C2 DC 958 clr eicon+4 959 ;; handle interrupt 960 ;; epilogue 0321 D0 86 961 pop dps 0323 D0 D0 962 pop psw 0325 D0 83 963 pop dph0 0327 D0 82 964 pop dpl0 0329 D0 F0 965 pop b 032B D0 E0 966 pop acc 032D 32 967 reti 968 032E 969 ser1_isr: 032E C0 E0 970 push acc 0330 C0 F0 971 push b 0332 C0 82 972 push dpl0 0334 C0 83 973 push dph0 0336 C0 D0 974 push psw 0338 75 D0 00 975 mov psw,#0x00 033B C0 86 976 push dps 033D 75 86 00 977 mov dps,#0 978 ;; clear interrupt 0340 C2 C0 979 clr scon1+0 0342 C2 C1 980 clr scon1+1 981 ;; handle interrupt 982 ;; epilogue 0344 D0 86 983 pop dps 0346 D0 D0 984 pop psw 0348 D0 83 985 pop dph0 034A D0 82 986 pop dpl0 034C D0 F0 987 pop b 034E D0 E0 988 pop acc 0350 32 989 reti 990 0351 991 i2c_isr: 0351 C0 E0 992 push acc 0353 C0 F0 993 push b 0355 C0 82 994 push dpl0 0357 C0 83 995 push dph0 0359 C0 D0 996 push psw 035B 75 D0 00 997 mov psw,#0x00 035E C0 86 998 push dps 0360 75 86 00 999 mov dps,#0 1000 ;; clear interrupt 0363 E5 91 1001 mov a,exif 0365 C2 E5 1002 clr acc.5 0367 F5 91 1003 mov exif,a 1004 ;; handle interrupt 1005 ;; epilogue 0369 D0 86 1006 pop dps 036B D0 D0 1007 pop psw 036D D0 83 1008 pop dph0 036F D0 82 1009 pop dpl0 0371 D0 F0 1010 pop b 0373 D0 E0 1011 pop acc 0375 32 1012 reti 1013 0376 1014 int4_isr: 0376 C0 E0 1015 push acc 0378 C0 F0 1016 push b 037A C0 82 1017 push dpl0 037C C0 83 1018 push dph0 037E C0 D0 1019 push psw 0380 75 D0 00 1020 mov psw,#0x00 0383 C0 86 1021 push dps 0385 75 86 00 1022 mov dps,#0 1023 ;; clear interrupt 0388 E5 91 1024 mov a,exif 038A C2 E6 1025 clr acc.6 038C F5 91 1026 mov exif,a 1027 ;; handle interrupt 1028 ;; epilogue 038E D0 86 1029 pop dps 0390 D0 D0 1030 pop psw 0392 D0 83 1031 pop dph0 0394 D0 82 1032 pop dpl0 0396 D0 F0 1033 pop b 0398 D0 E0 1034 pop acc 039A 32 1035 reti 1036 039B 1037 int5_isr: 039B C0 E0 1038 push acc 039D C0 F0 1039 push b 039F C0 82 1040 push dpl0 03A1 C0 83 1041 push dph0 03A3 C0 D0 1042 push psw 03A5 75 D0 00 1043 mov psw,#0x00 03A8 C0 86 1044 push dps 03AA 75 86 00 1045 mov dps,#0 1046 ;; clear interrupt 03AD E5 91 1047 mov a,exif 03AF C2 E7 1048 clr acc.7 03B1 F5 91 1049 mov exif,a 1050 ;; handle interrupt 1051 ;; epilogue 03B3 D0 86 1052 pop dps 03B5 D0 D0 1053 pop psw 03B7 D0 83 1054 pop dph0 03B9 D0 82 1055 pop dpl0 03BB D0 F0 1056 pop b 03BD D0 E0 1057 pop acc 03BF 32 1058 reti 1059 03C0 1060 int6_isr: 03C0 C0 E0 1061 push acc 03C2 C0 F0 1062 push b 03C4 C0 82 1063 push dpl0 03C6 C0 83 1064 push dph0 03C8 C0 D0 1065 push psw 03CA 75 D0 00 1066 mov psw,#0x00 03CD C0 86 1067 push dps 03CF 75 86 00 1068 mov dps,#0 1069 ;; clear interrupt 03D2 C2 DB 1070 clr eicon+3 1071 ;; handle interrupt 1072 ;; epilogue 03D4 D0 86 1073 pop dps 03D6 D0 D0 1074 pop psw 03D8 D0 83 1075 pop dph0 03DA D0 82 1076 pop dpl0 03DC D0 F0 1077 pop b 03DE D0 E0 1078 pop acc 03E0 32 1079 reti 1080 03E1 1081 xmemread:: 03E1 E5 49 1082 mov a,ctrllen 03E3 FF 1083 mov r7,a 03E4 24 C0 1084 add a,#-64 03E6 F5 49 1085 mov ctrllen,a 03E8 E5 4A 1086 mov a,ctrllen+1 03EA 34 00 1087 addc a,#0 03EC 50 12 1088 jnc 0$ 03EE E4 1089 clr a 03EF F5 49 1090 mov ctrllen,a 03F1 F5 4A 1091 mov ctrllen+1,a 03F3 F5 46 1092 mov ctrlcode,a 03F5 74 02 1093 mov a,#2 ; ack control transfer 03F7 90 7F B4 1094 mov dptr,#EP0CS 03FA F0 1095 movx @dptr,a 03FB EF 1096 mov a,r7 03FC 60 25 1097 jz 2$ 03FE 80 04 1098 sjmp 1$ 0400 F5 4A 1099 0$: mov ctrllen+1,a 0402 7F 40 1100 mov r7,#64 0404 8F 00 1101 1$: mov ar0,r7 0406 85 47 82 1102 mov dpl0,ctrladdr 0409 85 48 83 1103 mov dph0,ctrladdr+1 040C 05 86 1104 inc dps 040E 90 7F 00 1105 mov dptr,#IN0BUF 0411 15 86 1106 dec dps 0413 E0 1107 3$: movx a,@dptr 0414 A3 1108 inc dptr 0415 05 86 1109 inc dps 0417 F0 1110 movx @dptr,a 0418 A3 1111 inc dptr 0419 15 86 1112 dec dps 041B D8 F6 1113 djnz r0,3$ 041D 85 82 47 1114 mov ctrladdr,dpl0 0420 85 83 48 1115 mov ctrladdr+1,dph0 0423 EF 1116 2$: mov a,r7 0424 90 7F B5 1117 mov dptr,#IN0BC 0427 F0 1118 movx @dptr,a 0428 22 1119 ret 1120 0429 1121 usb_sudav_isr: 0429 C0 E0 1122 push acc 042B C0 F0 1123 push b 042D C0 82 1124 push dpl0 042F C0 83 1125 push dph0 0431 C0 84 1126 push dpl1 0433 C0 85 1127 push dph1 0435 C0 D0 1128 push psw 0437 75 D0 00 1129 mov psw,#0x00 043A C0 86 1130 push dps 043C 75 86 00 1131 mov dps,#0 043F C0 00 1132 push ar0 0441 C0 07 1133 push ar7 1134 ;; clear interrupt 0443 E5 91 1135 mov a,exif 0445 C2 E4 1136 clr acc.4 0447 F5 91 1137 mov exif,a 0449 90 7F AB 1138 mov dptr,#USBIRQ 044C 74 01 1139 mov a,#0x01 044E F0 1140 movx @dptr,a 1141 ;; handle interrupt 044F 75 46 00 1142 mov ctrlcode,#0 ; reset control out code 0452 90 7F E9 1143 mov dptr,#SETUPDAT+1 0455 E0 1144 movx a,@dptr ; bRequest field 1145 ;; standard commands 1146 ;; USB_REQ_GET_DESCRIPTOR 0456 B4 06 59 1147 cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc 0459 90 7F E8 1148 mov dptr,#SETUPDAT ; bRequestType == 0x80 045C E0 1149 movx a,@dptr 045D B4 80 4F 1150 cjne a,#USB_DIR_IN,setupstallstd 0460 90 7F EB 1151 mov dptr,#SETUPDAT+3 0463 E0 1152 movx a,@dptr 0464 B4 01 0C 1153 cjne a,#USB_DT_DEVICE,cmdnotgetdescdev 0467 90 7F D4 1154 mov dptr,#SUDPTRH 046A 74 0B 1155 mov a,#>devicedescr 046C F0 1156 movx @dptr,a 046D A3 1157 inc dptr 046E 74 2C 1158 mov a,#config0descr 0481 F0 1168 movx @dptr,a 0482 A3 1169 inc dptr 0483 74 3E 1170 mov a,#stringdescr 049D F5 83 1185 mov dph0,a 049F E0 1186 movx a,@dptr 04A0 F5 F0 1187 mov b,a 04A2 A3 1188 inc dptr 04A3 E0 1189 movx a,@dptr 04A4 90 7F D4 1190 mov dptr,#SUDPTRH 04A7 F0 1191 movx @dptr,a 04A8 A3 1192 inc dptr 04A9 E5 F0 1193 mov a,b 04AB F0 1194 movx @dptr,a 1195 ; sjmp setupackstd 04AC 1196 setupackstd: 04AC 02 06 F6 1197 ljmp setupack 04AF 1198 setupstallstd: 04AF 02 06 F2 1199 ljmp setupstall 04B2 1200 cmdnotgetdesc: 1201 ;; USB_REQ_SET_CONFIGURATION 04B2 B4 09 41 1202 cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf 04B5 90 7F E8 1203 mov dptr,#SETUPDAT 04B8 E0 1204 movx a,@dptr 04B9 70 F4 1205 jnz setupstallstd 04BB 90 7F EA 1206 mov dptr,#SETUPDAT+2 04BE E0 1207 movx a,@dptr 04BF 24 FE 1208 add a,#-2 04C1 40 EC 1209 jc setupstallstd 04C3 E0 1210 movx a,@dptr 04C4 F5 4B 1211 mov numconfig,a 04C6 1212 cmdresettoggleshalt: 04C6 90 7F D7 1213 mov dptr,#TOGCTL 04C9 78 07 1214 mov r0,#7 04CB E8 1215 0$: mov a,r0 04CC 44 10 1216 orl a,#0x10 04CE F0 1217 movx @dptr,a 04CF 44 30 1218 orl a,#0x30 04D1 F0 1219 movx @dptr,a 04D2 E8 1220 mov a,r0 04D3 F0 1221 movx @dptr,a 04D4 44 20 1222 orl a,#0x20 04D6 F0 1223 movx @dptr,a 04D7 D8 F2 1224 djnz r0,0$ 04D9 E4 1225 clr a 04DA F0 1226 movx @dptr,a 04DB 74 02 1227 mov a,#2 04DD 90 7F B6 1228 mov dptr,#IN1CS 04E0 78 07 1229 mov r0,#7 04E2 F0 1230 1$: movx @dptr,a 04E3 A3 1231 inc dptr 04E4 A3 1232 inc dptr 04E5 D8 FB 1233 djnz r0,1$ 04E7 90 7F C6 1234 mov dptr,#OUT1CS 04EA 78 07 1235 mov r0,#7 04EC F0 1236 2$: movx @dptr,a 04ED A3 1237 inc dptr 04EE A3 1238 inc dptr 04EF D8 FB 1239 djnz r0,2$ 04F1 12 08 B0 1240 lcall fillusbintr 04F4 80 B6 1241 sjmp setupackstd 04F6 1242 cmdnotsetconf: 1243 ;; USB_REQ_SET_INTERFACE 04F6 B4 0B 1A 1244 cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint 04F9 90 7F E8 1245 mov dptr,#SETUPDAT 04FC E0 1246 movx a,@dptr 04FD B4 01 AF 1247 cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd 0500 E5 4B 1248 mov a,numconfig 0502 B4 01 AA 1249 cjne a,#1,setupstallstd 0505 90 7F EC 1250 mov dptr,#SETUPDAT+4 0508 E0 1251 movx a,@dptr 0509 70 A4 1252 jnz setupstallstd 050B 90 7F EA 1253 mov dptr,#SETUPDAT+2 050E E0 1254 movx a,@dptr 050F F5 4C 1255 mov altsetting,a 0511 80 B3 1256 sjmp cmdresettoggleshalt 0513 1257 cmdnotsetint: 1258 ;; USB_REQ_GET_INTERFACE 0513 B4 0A 20 1259 cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint 0516 90 7F E8 1260 mov dptr,#SETUPDAT 0519 E0 1261 movx a,@dptr 051A B4 81 92 1262 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd 051D E5 4B 1263 mov a,numconfig 051F B4 01 8D 1264 cjne a,#1,setupstallstd 0522 90 7F EC 1265 mov dptr,#SETUPDAT+4 0525 E0 1266 movx a,@dptr 0526 70 87 1267 jnz setupstallstd 0528 E5 4C 1268 mov a,altsetting 052A 1269 cmdrespondonebyte: 052A 90 7F 00 1270 mov dptr,#IN0BUF 052D F0 1271 movx @dptr,a 052E 90 7F B5 1272 mov dptr,#IN0BC 0531 74 01 1273 mov a,#1 0533 F0 1274 movx @dptr,a 0534 80 4E 1275 sjmp setupackstd2 0536 1276 cmdnotgetint: 1277 ;; USB_REQ_GET_CONFIGURATION 0536 B4 08 0B 1278 cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf 0539 90 7F E8 1279 mov dptr,#SETUPDAT 053C E0 1280 movx a,@dptr 053D B4 80 47 1281 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 0540 E5 4B 1282 mov a,numconfig 0542 80 E6 1283 sjmp cmdrespondonebyte 0544 1284 cmdnotgetconf: 1285 ;; USB_REQ_GET_STATUS (0) 0544 70 44 1286 jnz cmdnotgetstat 0546 90 7F E8 1287 mov dptr,#SETUPDAT 0549 E0 1288 movx a,@dptr 054A B4 80 11 1289 cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev 054D 74 01 1290 mov a,#1 054F 1291 cmdrespondstat: 054F 90 7F 00 1292 mov dptr,#IN0BUF 0552 F0 1293 movx @dptr,a 0553 A3 1294 inc dptr 0554 E4 1295 clr a 0555 F0 1296 movx @dptr,a 0556 90 7F B5 1297 mov dptr,#IN0BC 0559 74 02 1298 mov a,#2 055B F0 1299 movx @dptr,a 055C 80 26 1300 sjmp setupackstd2 055E 1301 cmdnotgetstatdev: 055E B4 81 03 1302 cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf 0561 E4 1303 clr a 0562 80 EB 1304 sjmp cmdrespondstat 0564 1305 cmdnotgetstatintf: 0564 B4 82 20 1306 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 0567 90 7F EC 1307 mov dptr,#SETUPDAT+4 056A E0 1308 movx a,@dptr 056B 90 7F C4 1309 mov dptr,#OUT1CS-2 056E 30 E7 03 1310 jnb acc.7,0$ 0571 90 7F B4 1311 mov dptr,#IN1CS-2 0574 54 0F 1312 0$: anl a,#15 0576 60 0F 1313 jz setupstallstd2 0578 20 E3 0C 1314 jb acc.3,setupstallstd2 057B 25 E0 1315 add a,acc 057D 25 82 1316 add a,dpl0 057F F5 82 1317 mov dpl0,a 0581 E0 1318 movx a,@dptr 0582 80 CB 1319 sjmp cmdrespondstat 0584 1320 setupackstd2: 0584 02 06 F6 1321 ljmp setupack 0587 1322 setupstallstd2: 0587 02 06 F2 1323 ljmp setupstall 058A 1324 cmdnotgetstat: 1325 ;; USB_REQ_SET_FEATURE 058A B4 03 05 1326 cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr 058D 75 F0 01 1327 mov b,#1 0590 80 06 1328 sjmp handleftr 0592 1329 cmdnotsetftr: 1330 ;; USB_REQ_CLEAR_FEATURE 0592 B4 01 3E 1331 cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr 0595 75 F0 00 1332 mov b,#0 0598 1333 handleftr: 0598 90 7F E8 1334 mov dptr,#SETUPDAT 059B E0 1335 movx a,@dptr 059C B4 02 E8 1336 cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 059F A3 1337 inc dptr 05A0 A3 1338 inc dptr 05A1 E0 1339 movx a,@dptr 05A2 70 E3 1340 jnz setupstallstd2 ; not ENDPOINT_HALT feature 05A4 A3 1341 inc dptr 05A5 E0 1342 movx a,@dptr 05A6 70 DF 1343 jnz setupstallstd2 05A8 A3 1344 inc dptr 05A9 E0 1345 movx a,@dptr 05AA 90 7F C4 1346 mov dptr,#OUT1CS-2 05AD 30 E7 05 1347 jnb acc.7,0$ 05B0 90 7F B4 1348 mov dptr,#IN1CS-2 05B3 44 10 1349 orl a,#0x10 05B5 20 E3 CF 1350 0$: jb acc.3,setupstallstd2 1351 ;; clear data toggle 05B8 54 1F 1352 anl a,#0x1f 05BA 05 86 1353 inc dps 05BC 90 7F D7 1354 mov dptr,#TOGCTL 05BF F0 1355 movx @dptr,a 05C0 44 20 1356 orl a,#0x20 05C2 F0 1357 movx @dptr,a 05C3 54 0F 1358 anl a,#15 05C5 F0 1359 movx @dptr,a 05C6 15 86 1360 dec dps 1361 ;; clear/set ep halt feature 05C8 25 E0 1362 add a,acc 05CA 25 82 1363 add a,dpl0 05CC F5 82 1364 mov dpl0,a 05CE E5 F0 1365 mov a,b 05D0 F0 1366 movx @dptr,a 05D1 80 B1 1367 sjmp setupackstd2 05D3 1368 cmdnotclrftr: 1369 ;; vendor specific commands 1370 ;; 0xa3 05D3 B4 A3 3E 1371 cjne a,#0xa3,cmdnota3 05D6 90 7F EA 1372 mov dptr,#SETUPDAT+2 05D9 E0 1373 movx a,@dptr 05DA F5 47 1374 mov ctrladdr,a 05DC A3 1375 inc dptr 05DD E0 1376 movx a,@dptr 05DE F5 48 1377 mov ctrladdr+1,a 05E0 24 50 1378 add a,#80 05E2 50 2D 1379 jnc setupstalla3 05E4 90 7F EE 1380 mov dptr,#SETUPDAT+6 05E7 E0 1381 movx a,@dptr 05E8 F5 49 1382 mov ctrllen,a 05EA 25 47 1383 add a,ctrladdr 05EC A3 1384 inc dptr 05ED E0 1385 movx a,@dptr 05EE F5 4A 1386 mov ctrllen+1,a 05F0 35 48 1387 addc a,ctrladdr+1 05F2 40 1D 1388 jc setupstalla3 05F4 90 7F E8 1389 mov dptr,#SETUPDAT ; bRequestType == 0x40 05F7 E0 1390 movx a,@dptr 05F8 B4 40 0A 1391 cjne a,#0x40,1$ 05FB 75 46 01 1392 mov ctrlcode,#1 05FE 90 7F C5 1393 mov dptr,#OUT0BC 0601 F0 1394 movx @dptr,a 0602 02 06 FC 1395 ljmp endusbisr 0605 B4 C0 09 1396 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 0608 75 46 02 1397 mov ctrlcode,#2 060B 12 03 E1 1398 lcall xmemread 060E 02 06 FC 1399 ljmp endusbisr 0611 1400 setupstalla3: 0611 02 06 F2 1401 ljmp setupstall 0614 1402 cmdnota3: 1403 ;; 0xb1 0614 B4 B1 3E 1404 cjne a,#0xb1,cmdnotb1 0617 90 7F E8 1405 mov dptr,#SETUPDAT ; bRequestType == 0xc0 061A E0 1406 movx a,@dptr 061B B4 C0 34 1407 cjne a,#0xc0,setupstallb1 061E 90 7F 00 1408 mov dptr,#IN0BUF 0621 E5 40 1409 mov a,errcode 0623 F0 1410 movx @dptr,a 0624 A3 1411 inc dptr 0625 E5 41 1412 mov a,errval 0627 F0 1413 movx @dptr,a 0628 A3 1414 inc dptr 0629 E5 81 1415 mov a,sp 1416 1417 ;;; xxxx 062B C0 82 1418 push dpl0 062D C0 83 1419 push dph0 062F 90 7F DF 1420 mov dptr,#OUT07VAL 0632 E0 1421 movx a,@dptr 0633 D0 83 1422 pop dph0 0635 D0 82 1423 pop dpl0 1424 ;;; xxxx 1425 0637 F0 1426 movx @dptr,a 0638 A3 1427 inc dptr 0639 74 00 1428 mov a,#0 1429 1430 ;;; xxxx 063B C0 82 1431 push dpl0 063D C0 83 1432 push dph0 063F 90 7F C8 1433 mov dptr,#OUT2CS 0642 E0 1434 movx a,@dptr 0643 D0 83 1435 pop dph0 0645 D0 82 1436 pop dpl0 1437 ;;; xxxx 1438 0647 F0 1439 movx @dptr,a 0648 A3 1440 inc dptr 0649 90 7F B5 1441 mov dptr,#IN0BC 064C 74 04 1442 mov a,#4 064E F0 1443 movx @dptr,a 064F 02 06 F6 1444 ljmp setupack 0652 1445 setupstallb1: 0652 02 06 F2 1446 ljmp setupstall 0655 1447 cmdnotb1: 1448 ;; 0xb2 0655 B4 B2 2B 1449 cjne a,#0xb2,cmdnotb2 0658 90 7F E8 1450 mov dptr,#SETUPDAT ; bRequestType == 0xc0 065B E0 1451 movx a,@dptr 065C B4 C0 21 1452 cjne a,#0xc0,setupstallb2 065F 90 7F 00 1453 mov dptr,#IN0BUF 0662 E5 40 1454 mov a,errcode 0664 F0 1455 movx @dptr,a 0665 A3 1456 inc dptr 0666 E5 41 1457 mov a,errval 0668 F0 1458 movx @dptr,a 0669 A3 1459 inc dptr 066A E5 42 1460 mov a,cfgcount 066C F0 1461 movx @dptr,a 066D A3 1462 inc dptr 066E E5 43 1463 mov a,cfgcount+1 0670 F0 1464 movx @dptr,a 0671 A3 1465 inc dptr 0672 E5 45 1466 mov a,irqcount 0674 F0 1467 movx @dptr,a 0675 90 7F B5 1468 mov dptr,#IN0BC 0678 74 05 1469 mov a,#5 067A F0 1470 movx @dptr,a 067B 05 45 1471 inc irqcount 067D 02 06 F6 1472 ljmp setupack 0680 1473 setupstallb2: 0680 02 06 F2 1474 ljmp setupstall 0683 1475 cmdnotb2: 1476 ;; 0xb3 0683 B4 B3 2A 1477 cjne a,#0xb3,cmdnotb3 0686 90 7F E8 1478 mov dptr,#SETUPDAT ; bRequestType == 0xc0 0689 E0 1479 movx a,@dptr 068A B4 C0 20 1480 cjne a,#0xc0,setupstallb3 1481 ;; read EEPROM 0006 1482 serstrlen = 6 068D 75 F0 A0 1483 mov b,#0xa0 ; EEPROM address 0690 90 01 8B 1484 mov dptr,#eepromstraddr 0693 7F 01 1485 mov r7,#1 0695 12 01 8C 1486 lcall writei2c 0698 70 13 1487 jnz setupstallb3 069A 90 7F 00 1488 mov dptr,#IN0BUF 069D 7F 06 1489 mov r7,#serstrlen 069F 12 01 C7 1490 lcall readi2c 06A2 70 09 1491 jnz setupstallb3 06A4 74 06 1492 mov a,#serstrlen 06A6 90 7F B5 1493 mov dptr,#IN0BC 06A9 F0 1494 movx @dptr,a 06AA 02 06 F6 1495 ljmp setupack 06AD 1496 setupstallb3: 06AD 02 06 F2 1497 ljmp setupstall 06B0 1498 cmdnotb3: 1499 ;; 0xb4 06B0 B4 B4 3F 1500 cjne a,#0xb4,cmdnotb4 06B3 90 7F EF 1501 mov dptr,#SETUPDAT+7 06B6 E0 1502 movx a,@dptr 06B7 70 36 1503 jnz setupstallb4 06B9 90 7F EE 1504 mov dptr,#SETUPDAT+6 06BC E0 1505 movx a,@dptr 06BD F8 1506 mov r0,a 06BE FF 1507 mov r7,a 06BF 24 C0 1508 add a,#-64 06C1 40 2C 1509 jc setupstallb4 06C3 90 7F EC 1510 mov dptr,#SETUPDAT+4 ; wIndex 06C6 E0 1511 movx a,@dptr 06C7 F5 F0 1512 mov b,a 06C9 F5 47 1513 mov ctrladdr,a 06CB 90 7F E8 1514 mov dptr,#SETUPDAT 06CE E0 1515 movx a,@dptr 06CF B4 40 0A 1516 cjne a,#0x40,0$ ; bRequestType == 0x40 06D2 75 46 02 1517 mov ctrlcode,#2 06D5 90 7F C5 1518 mov dptr,#OUT0BC 06D8 F0 1519 movx @dptr,a 06D9 02 06 FC 1520 ljmp endusbisr 06DC B4 C0 10 1521 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 06DF 90 7F 00 1522 mov dptr,#IN0BUF 06E2 12 01 C7 1523 lcall readi2c 06E5 70 08 1524 jnz setupstallb4 06E7 E8 1525 mov a,r0 06E8 90 7F B5 1526 mov dptr,#IN0BC 06EB F0 1527 movx @dptr,a 06EC 02 06 F6 1528 ljmp setupack 06EF 1529 setupstallb4: 06EF 02 06 F2 1530 ljmp setupstall 06F2 1531 cmdnotb4: 1532 ;; unknown commands fall through to setupstall 1533 06F2 1534 setupstall: 06F2 74 03 1535 mov a,#3 06F4 80 02 1536 sjmp endsetup 06F6 1537 setupack: 06F6 74 02 1538 mov a,#2 06F8 1539 endsetup: 06F8 90 7F B4 1540 mov dptr,#EP0CS 06FB F0 1541 movx @dptr,a 06FC 1542 endusbisr: 1543 ;; epilogue 06FC D0 07 1544 pop ar7 06FE D0 00 1545 pop ar0 0700 D0 86 1546 pop dps 0702 D0 D0 1547 pop psw 0704 D0 85 1548 pop dph1 0706 D0 84 1549 pop dpl1 0708 D0 83 1550 pop dph0 070A D0 82 1551 pop dpl0 070C D0 F0 1552 pop b 070E D0 E0 1553 pop acc 0710 32 1554 reti 1555 0711 1556 usb_sof_isr: 0711 C0 E0 1557 push acc 0713 C0 F0 1558 push b 0715 C0 82 1559 push dpl0 0717 C0 83 1560 push dph0 0719 C0 D0 1561 push psw 071B 75 D0 00 1562 mov psw,#0x00 071E C0 86 1563 push dps 0720 75 86 00 1564 mov dps,#0 1565 ;; clear interrupt 0723 E5 91 1566 mov a,exif 0725 C2 E4 1567 clr acc.4 0727 F5 91 1568 mov exif,a 0729 90 7F AB 1569 mov dptr,#USBIRQ 072C 74 02 1570 mov a,#0x02 072E F0 1571 movx @dptr,a 1572 ;; handle interrupt 1573 ;; epilogue 072F D0 86 1574 pop dps 0731 D0 D0 1575 pop psw 0733 D0 83 1576 pop dph0 0735 D0 82 1577 pop dpl0 0737 D0 F0 1578 pop b 0739 D0 E0 1579 pop acc 073B 32 1580 reti 1581 1582 073C 1583 usb_sutok_isr: 073C C0 E0 1584 push acc 073E C0 F0 1585 push b 0740 C0 82 1586 push dpl0 0742 C0 83 1587 push dph0 0744 C0 D0 1588 push psw 0746 75 D0 00 1589 mov psw,#0x00 0749 C0 86 1590 push dps 074B 75 86 00 1591 mov dps,#0 1592 ;; clear interrupt 074E E5 91 1593 mov a,exif 0750 C2 E4 1594 clr acc.4 0752 F5 91 1595 mov exif,a 0754 90 7F AB 1596 mov dptr,#USBIRQ 0757 74 04 1597 mov a,#0x04 0759 F0 1598 movx @dptr,a 1599 ;; handle interrupt 1600 ;; epilogue 075A D0 86 1601 pop dps 075C D0 D0 1602 pop psw 075E D0 83 1603 pop dph0 0760 D0 82 1604 pop dpl0 0762 D0 F0 1605 pop b 0764 D0 E0 1606 pop acc 0766 32 1607 reti 1608 0767 1609 usb_suspend_isr: 0767 C0 E0 1610 push acc 0769 C0 F0 1611 push b 076B C0 82 1612 push dpl0 076D C0 83 1613 push dph0 076F C0 D0 1614 push psw 0771 75 D0 00 1615 mov psw,#0x00 0774 C0 86 1616 push dps 0776 75 86 00 1617 mov dps,#0 1618 ;; clear interrupt 0779 E5 91 1619 mov a,exif 077B C2 E4 1620 clr acc.4 077D F5 91 1621 mov exif,a 077F 90 7F AB 1622 mov dptr,#USBIRQ 0782 74 08 1623 mov a,#0x08 0784 F0 1624 movx @dptr,a 1625 ;; handle interrupt 1626 ;; epilogue 0785 D0 86 1627 pop dps 0787 D0 D0 1628 pop psw 0789 D0 83 1629 pop dph0 078B D0 82 1630 pop dpl0 078D D0 F0 1631 pop b 078F D0 E0 1632 pop acc 0791 32 1633 reti 1634 0792 1635 usb_usbreset_isr: 0792 C0 E0 1636 push acc 0794 C0 F0 1637 push b 0796 C0 82 1638 push dpl0 0798 C0 83 1639 push dph0 079A C0 D0 1640 push psw 079C 75 D0 00 1641 mov psw,#0x00 079F C0 86 1642 push dps 07A1 75 86 00 1643 mov dps,#0 1644 ;; clear interrupt 07A4 E5 91 1645 mov a,exif 07A6 C2 E4 1646 clr acc.4 07A8 F5 91 1647 mov exif,a 07AA 90 7F AB 1648 mov dptr,#USBIRQ 07AD 74 10 1649 mov a,#0x10 07AF F0 1650 movx @dptr,a 1651 ;; handle interrupt 1652 ;; epilogue 07B0 D0 86 1653 pop dps 07B2 D0 D0 1654 pop psw 07B4 D0 83 1655 pop dph0 07B6 D0 82 1656 pop dpl0 07B8 D0 F0 1657 pop b 07BA D0 E0 1658 pop acc 07BC 32 1659 reti 1660 07BD 1661 usb_ep0in_isr: 07BD C0 E0 1662 push acc 07BF C0 F0 1663 push b 07C1 C0 82 1664 push dpl0 07C3 C0 83 1665 push dph0 07C5 C0 84 1666 push dpl1 07C7 C0 85 1667 push dph1 07C9 C0 D0 1668 push psw 07CB 75 D0 00 1669 mov psw,#0x00 07CE C0 86 1670 push dps 07D0 75 86 00 1671 mov dps,#0 07D3 C0 00 1672 push ar0 07D5 C0 07 1673 push ar7 1674 ;; clear interrupt 07D7 E5 91 1675 mov a,exif 07D9 C2 E4 1676 clr acc.4 07DB F5 91 1677 mov exif,a 07DD 90 7F A9 1678 mov dptr,#IN07IRQ 07E0 74 01 1679 mov a,#0x01 07E2 F0 1680 movx @dptr,a 1681 ;; handle interrupt 07E3 E5 46 1682 mov a,ctrlcode 07E5 B4 02 05 1683 cjne a,#2,0$ 07E8 12 03 E1 1684 lcall xmemread 07EB 80 11 1685 sjmp ep0inendisr 07ED 90 7F B5 1686 0$: mov dptr,#IN0BC 07F0 E4 1687 clr a 07F1 F0 1688 movx @dptr,a 07F2 80 04 1689 sjmp ep0inack 1690 07F4 1691 ep0install: 07F4 74 03 1692 mov a,#3 07F6 80 02 1693 sjmp ep0incs 07F8 1694 ep0inack: 07F8 74 02 1695 mov a,#2 07FA 1696 ep0incs: 07FA 90 7F B4 1697 mov dptr,#EP0CS 07FD F0 1698 movx @dptr,a 07FE 1699 ep0inendisr: 1700 ;; epilogue 07FE D0 07 1701 pop ar7 0800 D0 00 1702 pop ar0 0802 D0 86 1703 pop dps 0804 D0 D0 1704 pop psw 0806 D0 85 1705 pop dph1 0808 D0 84 1706 pop dpl1 080A D0 83 1707 pop dph0 080C D0 82 1708 pop dpl0 080E D0 F0 1709 pop b 0810 D0 E0 1710 pop acc 0812 32 1711 reti 1712 0813 1713 usb_ep0out_isr: 0813 C0 E0 1714 push acc 0815 C0 F0 1715 push b 0817 C0 82 1716 push dpl0 0819 C0 83 1717 push dph0 081B C0 84 1718 push dpl1 081D C0 85 1719 push dph1 081F C0 D0 1720 push psw 0821 75 D0 00 1721 mov psw,#0x00 0824 C0 86 1722 push dps 0826 75 86 00 1723 mov dps,#0 0829 C0 00 1724 push ar0 082B C0 06 1725 push ar6 1726 ;; clear interrupt 082D E5 91 1727 mov a,exif 082F C2 E4 1728 clr acc.4 0831 F5 91 1729 mov exif,a 0833 90 7F AA 1730 mov dptr,#OUT07IRQ 0836 74 01 1731 mov a,#0x01 0838 F0 1732 movx @dptr,a 1733 ;; handle interrupt 0839 E5 46 1734 mov a,ctrlcode ; check control code 083B B4 01 36 1735 cjne a,#0x01,i2cwr 1736 ;; write to external memory 083E 90 7F C5 1737 mov dptr,#OUT0BC 0841 E0 1738 movx a,@dptr 0842 60 28 1739 jz 0$ 0844 FF 1740 mov r7,a 0845 C3 1741 clr c 0846 E5 49 1742 mov a,ctrllen 0848 9F 1743 subb a,r7 0849 F5 49 1744 mov ctrllen,a 084B E5 4A 1745 mov a,ctrllen+1 084D 94 00 1746 subb a,#0 084F F5 4A 1747 mov ctrllen+1,a 0851 40 38 1748 jc ep0outstall 0853 90 7E C0 1749 mov dptr,#OUT0BUF 0856 85 47 84 1750 mov dpl1,ctrladdr 0859 85 48 85 1751 mov dph1,ctrladdr+1 085C E0 1752 1$: movx a,@dptr 085D A3 1753 inc dptr 085E 05 86 1754 inc dps 0860 F0 1755 movx @dptr,a 0861 A3 1756 inc dptr 0862 15 86 1757 dec dps 0864 DF F6 1758 djnz r7,1$ 0866 85 84 47 1759 mov ctrladdr,dpl1 0869 85 85 48 1760 mov ctrladdr+1,dph1 086C E5 49 1761 0$: mov a,ctrllen 086E 45 4A 1762 orl a,ctrllen+1 0870 60 20 1763 jz ep0outack 0872 80 27 1764 sjmp ep0outendisr 1765 1766 ;; write I2C eeprom 0874 B4 02 14 1767 i2cwr: cjne a,#0x02,ep0outstall 0877 90 7F C5 1768 mov dptr,#OUT0BC 087A E0 1769 movx a,@dptr 087B 60 15 1770 jz ep0outack 087D FF 1771 mov r7,a 087E 85 47 F0 1772 mov b,ctrladdr 0881 90 7E C0 1773 mov dptr,#OUT0BUF 0884 12 01 8C 1774 lcall writei2c 0887 70 02 1775 jnz ep0outstall 0889 80 07 1776 sjmp ep0outack 1777 088B 1778 ep0outstall: 088B 75 46 00 1779 mov ctrlcode,#0 088E 74 03 1780 mov a,#3 0890 80 05 1781 sjmp ep0outcs 0892 1782 ep0outack: 0892 75 46 00 1783 mov ctrlcode,#0 0895 74 02 1784 mov a,#2 0897 1785 ep0outcs: 0897 90 7F B4 1786 mov dptr,#EP0CS 089A F0 1787 movx @dptr,a 089B 1788 ep0outendisr: 1789 ;; epilogue 089B D0 06 1790 pop ar6 089D D0 00 1791 pop ar0 089F D0 86 1792 pop dps 08A1 D0 D0 1793 pop psw 08A3 D0 85 1794 pop dph1 08A5 D0 84 1795 pop dpl1 08A7 D0 83 1796 pop dph0 08A9 D0 82 1797 pop dpl0 08AB D0 F0 1798 pop b 08AD D0 E0 1799 pop acc 08AF 32 1800 reti 1801 08B0 1802 fillusbintr:: 08B0 90 7E 80 1803 mov dptr,#IN1BUF 08B3 E5 40 1804 mov a,errcode 08B5 F0 1805 movx @dptr,a 08B6 A3 1806 inc dptr 08B7 E5 41 1807 mov a,errval 08B9 F0 1808 movx @dptr,a 08BA A3 1809 inc dptr 08BB E5 42 1810 mov a,cfgcount 08BD F0 1811 movx @dptr,a 08BE A3 1812 inc dptr 08BF E5 43 1813 mov a,cfgcount+1 08C1 F0 1814 movx @dptr,a 08C2 A3 1815 inc dptr 08C3 E5 45 1816 mov a,irqcount 08C5 F0 1817 movx @dptr,a 08C6 90 7F B7 1818 mov dptr,#IN1BC 08C9 74 05 1819 mov a,#5 08CB F0 1820 movx @dptr,a 08CC 05 45 1821 inc irqcount 08CE 22 1822 ret 1823 08CF 1824 usb_ep1in_isr: 08CF C0 E0 1825 push acc 08D1 C0 F0 1826 push b 08D3 C0 82 1827 push dpl0 08D5 C0 83 1828 push dph0 08D7 C0 D0 1829 push psw 08D9 75 D0 00 1830 mov psw,#0x00 08DC C0 86 1831 push dps 08DE 75 86 00 1832 mov dps,#0 1833 ;; clear interrupt 08E1 E5 91 1834 mov a,exif 08E3 C2 E4 1835 clr acc.4 08E5 F5 91 1836 mov exif,a 08E7 90 7F A9 1837 mov dptr,#IN07IRQ 08EA 74 02 1838 mov a,#0x02 08EC F0 1839 movx @dptr,a 1840 ;; handle interrupt 08ED 12 08 B0 1841 lcall fillusbintr 1842 ;; epilogue 08F0 D0 86 1843 pop dps 08F2 D0 D0 1844 pop psw 08F4 D0 83 1845 pop dph0 08F6 D0 82 1846 pop dpl0 08F8 D0 F0 1847 pop b 08FA D0 E0 1848 pop acc 08FC 32 1849 reti 1850 08FD 1851 usb_ep1out_isr: 08FD C0 E0 1852 push acc 08FF C0 F0 1853 push b 0901 C0 82 1854 push dpl0 0903 C0 83 1855 push dph0 0905 C0 D0 1856 push psw 0907 75 D0 00 1857 mov psw,#0x00 090A C0 86 1858 push dps 090C 75 86 00 1859 mov dps,#0 1860 ;; clear interrupt 090F E5 91 1861 mov a,exif 0911 C2 E4 1862 clr acc.4 0913 F5 91 1863 mov exif,a 0915 90 7F AA 1864 mov dptr,#OUT07IRQ 0918 74 02 1865 mov a,#0x02 091A F0 1866 movx @dptr,a 1867 ;; handle interrupt 1868 ;; epilogue 091B D0 86 1869 pop dps 091D D0 D0 1870 pop psw 091F D0 83 1871 pop dph0 0921 D0 82 1872 pop dpl0 0923 D0 F0 1873 pop b 0925 D0 E0 1874 pop acc 0927 32 1875 reti 1876 0928 1877 usb_ep2in_isr: 0928 C0 E0 1878 push acc 092A C0 F0 1879 push b 092C C0 82 1880 push dpl0 092E C0 83 1881 push dph0 0930 C0 D0 1882 push psw 0932 75 D0 00 1883 mov psw,#0x00 0935 C0 86 1884 push dps 0937 75 86 00 1885 mov dps,#0 1886 ;; clear interrupt 093A E5 91 1887 mov a,exif 093C C2 E4 1888 clr acc.4 093E F5 91 1889 mov exif,a 0940 90 7F A9 1890 mov dptr,#IN07IRQ 0943 74 04 1891 mov a,#0x04 0945 F0 1892 movx @dptr,a 1893 ;; handle interrupt 1894 ;; epilogue 0946 D0 86 1895 pop dps 0948 D0 D0 1896 pop psw 094A D0 83 1897 pop dph0 094C D0 82 1898 pop dpl0 094E D0 F0 1899 pop b 0950 D0 E0 1900 pop acc 0952 32 1901 reti 1902 0953 1903 usb_ep2out_isr: 0953 C0 E0 1904 push acc 0955 C0 F0 1905 push b 0957 C0 82 1906 push dpl0 0959 C0 83 1907 push dph0 095B C0 D0 1908 push psw 095D 75 D0 00 1909 mov psw,#0x00 0960 C0 86 1910 push dps 0962 75 86 00 1911 mov dps,#0 1912 ;; clear interrupt 0965 E5 91 1913 mov a,exif 0967 C2 E4 1914 clr acc.4 0969 F5 91 1915 mov exif,a 096B 90 7F AA 1916 mov dptr,#OUT07IRQ 096E 74 04 1917 mov a,#0x04 0970 F0 1918 movx @dptr,a 1919 ;; handle interrupt 1920 ;; epilogue 0971 D0 86 1921 pop dps 0973 D0 D0 1922 pop psw 0975 D0 83 1923 pop dph0 0977 D0 82 1924 pop dpl0 0979 D0 F0 1925 pop b 097B D0 E0 1926 pop acc 097D 32 1927 reti 1928 097E 1929 usb_ep3in_isr: 097E C0 E0 1930 push acc 0980 C0 F0 1931 push b 0982 C0 82 1932 push dpl0 0984 C0 83 1933 push dph0 0986 C0 D0 1934 push psw 0988 75 D0 00 1935 mov psw,#0x00 098B C0 86 1936 push dps 098D 75 86 00 1937 mov dps,#0 1938 ;; clear interrupt 0990 E5 91 1939 mov a,exif 0992 C2 E4 1940 clr acc.4 0994 F5 91 1941 mov exif,a 0996 90 7F A9 1942 mov dptr,#IN07IRQ 0999 74 08 1943 mov a,#0x08 099B F0 1944 movx @dptr,a 1945 ;; handle interrupt 1946 ;; epilogue 099C D0 86 1947 pop dps 099E D0 D0 1948 pop psw 09A0 D0 83 1949 pop dph0 09A2 D0 82 1950 pop dpl0 09A4 D0 F0 1951 pop b 09A6 D0 E0 1952 pop acc 09A8 32 1953 reti 1954 09A9 1955 usb_ep3out_isr: 09A9 C0 E0 1956 push acc 09AB C0 F0 1957 push b 09AD C0 82 1958 push dpl0 09AF C0 83 1959 push dph0 09B1 C0 D0 1960 push psw 09B3 75 D0 00 1961 mov psw,#0x00 09B6 C0 86 1962 push dps 09B8 75 86 00 1963 mov dps,#0 1964 ;; clear interrupt 09BB E5 91 1965 mov a,exif 09BD C2 E4 1966 clr acc.4 09BF F5 91 1967 mov exif,a 09C1 90 7F AA 1968 mov dptr,#OUT07IRQ 09C4 74 08 1969 mov a,#0x08 09C6 F0 1970 movx @dptr,a 1971 ;; handle interrupt 1972 ;; epilogue 09C7 D0 86 1973 pop dps 09C9 D0 D0 1974 pop psw 09CB D0 83 1975 pop dph0 09CD D0 82 1976 pop dpl0 09CF D0 F0 1977 pop b 09D1 D0 E0 1978 pop acc 09D3 32 1979 reti 1980 09D4 1981 usb_ep4in_isr: 09D4 C0 E0 1982 push acc 09D6 C0 F0 1983 push b 09D8 C0 82 1984 push dpl0 09DA C0 83 1985 push dph0 09DC C0 D0 1986 push psw 09DE 75 D0 00 1987 mov psw,#0x00 09E1 C0 86 1988 push dps 09E3 75 86 00 1989 mov dps,#0 1990 ;; clear interrupt 09E6 E5 91 1991 mov a,exif 09E8 C2 E4 1992 clr acc.4 09EA F5 91 1993 mov exif,a 09EC 90 7F A9 1994 mov dptr,#IN07IRQ 09EF 74 10 1995 mov a,#0x10 09F1 F0 1996 movx @dptr,a 1997 ;; handle interrupt 1998 ;; epilogue 09F2 D0 86 1999 pop dps 09F4 D0 D0 2000 pop psw 09F6 D0 83 2001 pop dph0 09F8 D0 82 2002 pop dpl0 09FA D0 F0 2003 pop b 09FC D0 E0 2004 pop acc 09FE 32 2005 reti 2006 09FF 2007 usb_ep4out_isr: 09FF C0 E0 2008 push acc 0A01 C0 F0 2009 push b 0A03 C0 82 2010 push dpl0 0A05 C0 83 2011 push dph0 0A07 C0 D0 2012 push psw 0A09 75 D0 00 2013 mov psw,#0x00 0A0C C0 86 2014 push dps 0A0E 75 86 00 2015 mov dps,#0 2016 ;; clear interrupt 0A11 E5 91 2017 mov a,exif 0A13 C2 E4 2018 clr acc.4 0A15 F5 91 2019 mov exif,a 0A17 90 7F AA 2020 mov dptr,#OUT07IRQ 0A1A 74 10 2021 mov a,#0x10 0A1C F0 2022 movx @dptr,a 2023 ;; handle interrupt 2024 ;; epilogue 0A1D D0 86 2025 pop dps 0A1F D0 D0 2026 pop psw 0A21 D0 83 2027 pop dph0 0A23 D0 82 2028 pop dpl0 0A25 D0 F0 2029 pop b 0A27 D0 E0 2030 pop acc 0A29 32 2031 reti 2032 0A2A 2033 usb_ep5in_isr: 0A2A C0 E0 2034 push acc 0A2C C0 F0 2035 push b 0A2E C0 82 2036 push dpl0 0A30 C0 83 2037 push dph0 0A32 C0 D0 2038 push psw 0A34 75 D0 00 2039 mov psw,#0x00 0A37 C0 86 2040 push dps 0A39 75 86 00 2041 mov dps,#0 2042 ;; clear interrupt 0A3C E5 91 2043 mov a,exif 0A3E C2 E4 2044 clr acc.4 0A40 F5 91 2045 mov exif,a 0A42 90 7F A9 2046 mov dptr,#IN07IRQ 0A45 74 20 2047 mov a,#0x20 0A47 F0 2048 movx @dptr,a 2049 ;; handle interrupt 2050 ;; epilogue 0A48 D0 86 2051 pop dps 0A4A D0 D0 2052 pop psw 0A4C D0 83 2053 pop dph0 0A4E D0 82 2054 pop dpl0 0A50 D0 F0 2055 pop b 0A52 D0 E0 2056 pop acc 0A54 32 2057 reti 2058 0A55 2059 usb_ep5out_isr: 0A55 C0 E0 2060 push acc 0A57 C0 F0 2061 push b 0A59 C0 82 2062 push dpl0 0A5B C0 83 2063 push dph0 0A5D C0 D0 2064 push psw 0A5F 75 D0 00 2065 mov psw,#0x00 0A62 C0 86 2066 push dps 0A64 75 86 00 2067 mov dps,#0 2068 ;; clear interrupt 0A67 E5 91 2069 mov a,exif 0A69 C2 E4 2070 clr acc.4 0A6B F5 91 2071 mov exif,a 0A6D 90 7F AA 2072 mov dptr,#OUT07IRQ 0A70 74 20 2073 mov a,#0x20 0A72 F0 2074 movx @dptr,a 2075 ;; handle interrupt 2076 ;; epilogue 0A73 D0 86 2077 pop dps 0A75 D0 D0 2078 pop psw 0A77 D0 83 2079 pop dph0 0A79 D0 82 2080 pop dpl0 0A7B D0 F0 2081 pop b 0A7D D0 E0 2082 pop acc 0A7F 32 2083 reti 2084 0A80 2085 usb_ep6in_isr: 0A80 C0 E0 2086 push acc 0A82 C0 F0 2087 push b 0A84 C0 82 2088 push dpl0 0A86 C0 83 2089 push dph0 0A88 C0 D0 2090 push psw 0A8A 75 D0 00 2091 mov psw,#0x00 0A8D C0 86 2092 push dps 0A8F 75 86 00 2093 mov dps,#0 2094 ;; clear interrupt 0A92 E5 91 2095 mov a,exif 0A94 C2 E4 2096 clr acc.4 0A96 F5 91 2097 mov exif,a 0A98 90 7F A9 2098 mov dptr,#IN07IRQ 0A9B 74 40 2099 mov a,#0x40 0A9D F0 2100 movx @dptr,a 2101 ;; handle interrupt 2102 ;; epilogue 0A9E D0 86 2103 pop dps 0AA0 D0 D0 2104 pop psw 0AA2 D0 83 2105 pop dph0 0AA4 D0 82 2106 pop dpl0 0AA6 D0 F0 2107 pop b 0AA8 D0 E0 2108 pop acc 0AAA 32 2109 reti 2110 0AAB 2111 usb_ep6out_isr: 0AAB C0 E0 2112 push acc 0AAD C0 F0 2113 push b 0AAF C0 82 2114 push dpl0 0AB1 C0 83 2115 push dph0 0AB3 C0 D0 2116 push psw 0AB5 75 D0 00 2117 mov psw,#0x00 0AB8 C0 86 2118 push dps 0ABA 75 86 00 2119 mov dps,#0 2120 ;; clear interrupt 0ABD E5 91 2121 mov a,exif 0ABF C2 E4 2122 clr acc.4 0AC1 F5 91 2123 mov exif,a 0AC3 90 7F AA 2124 mov dptr,#OUT07IRQ 0AC6 74 40 2125 mov a,#0x40 0AC8 F0 2126 movx @dptr,a 2127 ;; handle interrupt 2128 ;; epilogue 0AC9 D0 86 2129 pop dps 0ACB D0 D0 2130 pop psw 0ACD D0 83 2131 pop dph0 0ACF D0 82 2132 pop dpl0 0AD1 D0 F0 2133 pop b 0AD3 D0 E0 2134 pop acc 0AD5 32 2135 reti 2136 0AD6 2137 usb_ep7in_isr: 0AD6 C0 E0 2138 push acc 0AD8 C0 F0 2139 push b 0ADA C0 82 2140 push dpl0 0ADC C0 83 2141 push dph0 0ADE C0 D0 2142 push psw 0AE0 75 D0 00 2143 mov psw,#0x00 0AE3 C0 86 2144 push dps 0AE5 75 86 00 2145 mov dps,#0 2146 ;; clear interrupt 0AE8 E5 91 2147 mov a,exif 0AEA C2 E4 2148 clr acc.4 0AEC F5 91 2149 mov exif,a 0AEE 90 7F A9 2150 mov dptr,#IN07IRQ 0AF1 74 80 2151 mov a,#0x80 0AF3 F0 2152 movx @dptr,a 2153 ;; handle interrupt 2154 ;; epilogue 0AF4 D0 86 2155 pop dps 0AF6 D0 D0 2156 pop psw 0AF8 D0 83 2157 pop dph0 0AFA D0 82 2158 pop dpl0 0AFC D0 F0 2159 pop b 0AFE D0 E0 2160 pop acc 0B00 32 2161 reti 2162 0B01 2163 usb_ep7out_isr: 0B01 C0 E0 2164 push acc 0B03 C0 F0 2165 push b 0B05 C0 82 2166 push dpl0 0B07 C0 83 2167 push dph0 0B09 C0 D0 2168 push psw 0B0B 75 D0 00 2169 mov psw,#0x00 0B0E C0 86 2170 push dps 0B10 75 86 00 2171 mov dps,#0 2172 ;; clear interrupt 0B13 E5 91 2173 mov a,exif 0B15 C2 E4 2174 clr acc.4 0B17 F5 91 2175 mov exif,a 0B19 90 7F AA 2176 mov dptr,#OUT07IRQ 0B1C 74 80 2177 mov a,#0x80 0B1E F0 2178 movx @dptr,a 2179 ;; handle interrupt 2180 ;; epilogue 0B1F D0 86 2181 pop dps 0B21 D0 D0 2182 pop psw 0B23 D0 83 2183 pop dph0 0B25 D0 82 2184 pop dpl0 0B27 D0 F0 2185 pop b 0B29 D0 E0 2186 pop acc 0B2B 32 2187 reti 2188 2189 ;; ----------------------------------------------------- 2190 ;; USB descriptors 2191 ;; ----------------------------------------------------- 2192 2193 ;; Device and/or Interface Class codes 0000 2194 USB_CLASS_PER_INTERFACE = 0 0001 2195 USB_CLASS_AUDIO = 1 0002 2196 USB_CLASS_COMM = 2 0003 2197 USB_CLASS_HID = 3 0007 2198 USB_CLASS_PRINTER = 7 0008 2199 USB_CLASS_MASS_STORAGE = 8 0009 2200 USB_CLASS_HUB = 9 00FF 2201 USB_CLASS_VENDOR_SPEC = 0xff 2202 2203 ;; Descriptor types 0001 2204 USB_DT_DEVICE = 0x01 0002 2205 USB_DT_CONFIG = 0x02 0003 2206 USB_DT_STRING = 0x03 0004 2207 USB_DT_INTERFACE = 0x04 0005 2208 USB_DT_ENDPOINT = 0x05 2209 2210 ;; Standard requests 0000 2211 USB_REQ_GET_STATUS = 0x00 0001 2212 USB_REQ_CLEAR_FEATURE = 0x01 0003 2213 USB_REQ_SET_FEATURE = 0x03 0005 2214 USB_REQ_SET_ADDRESS = 0x05 0006 2215 USB_REQ_GET_DESCRIPTOR = 0x06 0007 2216 USB_REQ_SET_DESCRIPTOR = 0x07 0008 2217 USB_REQ_GET_CONFIGURATION = 0x08 0009 2218 USB_REQ_SET_CONFIGURATION = 0x09 000A 2219 USB_REQ_GET_INTERFACE = 0x0A 000B 2220 USB_REQ_SET_INTERFACE = 0x0B 000C 2221 USB_REQ_SYNCH_FRAME = 0x0C 2222 2223 ;; USB Request Type and Endpoint Directions 0000 2224 USB_DIR_OUT = 0 0080 2225 USB_DIR_IN = 0x80 2226 0000 2227 USB_TYPE_STANDARD = (0x00 << 5) 0020 2228 USB_TYPE_CLASS = (0x01 << 5) 0040 2229 USB_TYPE_VENDOR = (0x02 << 5) 0060 2230 USB_TYPE_RESERVED = (0x03 << 5) 2231 0000 2232 USB_RECIP_DEVICE = 0x00 0001 2233 USB_RECIP_INTERFACE = 0x01 0002 2234 USB_RECIP_ENDPOINT = 0x02 0003 2235 USB_RECIP_OTHER = 0x03 2236 2237 ;; Request target types. 0000 2238 USB_RT_DEVICE = 0x00 0001 2239 USB_RT_INTERFACE = 0x01 0002 2240 USB_RT_ENDPOINT = 0x02 2241 BAC0 2242 VENDID = 0xbac0 6135 2243 PRODID = 0x6135 2244 0B2C 2245 devicedescr: 0B2C 12 2246 .db 18 ; bLength 0B2D 01 2247 .db USB_DT_DEVICE ; bDescriptorType 0B2E 00 01 2248 .db 0x00, 0x01 ; bcdUSB 0B30 FF 2249 .db USB_CLASS_VENDOR_SPEC ; bDeviceClass 0B31 00 2250 .db 0 ; bDeviceSubClass 0B32 FF 2251 .db 0xff ; bDeviceProtocol 0B33 40 2252 .db 0x40 ; bMaxPacketSize0 0B34 C0 BA 2253 .db VENDID ; idVendor 0B36 35 61 2254 .db PRODID ; idProduct 0B38 02 00 2255 .db 0x02,0x00 ; bcdDevice 0B3A 01 2256 .db 1 ; iManufacturer 0B3B 02 2257 .db 2 ; iProduct 0B3C 03 2258 .db 3 ; iSerialNumber 0B3D 01 2259 .db 1 ; bNumConfigurations 2260 0B3E 2261 config0descr: 0B3E 09 2262 .db 9 ; bLength 0B3F 02 2263 .db USB_DT_CONFIG ; bDescriptorType 0B40 45 00 2264 .db config0sz ; wTotalLength 0B42 01 2265 .db 1 ; bNumInterfaces 0B43 01 2266 .db 1 ; bConfigurationValue 0B44 00 2267 .db 0 ; iConfiguration 0B45 40 2268 .db 0b01000000 ; bmAttributs (self powered) 0B46 00 2269 .db 0 ; MaxPower (mA/2) (self powered so 0) 2270 ;; interface descriptor I0:A0 0B47 09 2271 .db 9 ; bLength 0B48 04 2272 .db USB_DT_INTERFACE ; bDescriptorType 0B49 00 2273 .db 0 ; bInterfaceNumber 0B4A 00 2274 .db 0 ; bAlternateSetting 0B4B 03 2275 .db 3 ; bNumEndpoints 0B4C FF 2276 .db 0xff ; bInterfaceClass (vendor specific) 0B4D 00 2277 .db 0x00 ; bInterfaceSubClass 0B4E FF 2278 .db 0xff ; bInterfaceProtocol (vendor specific) 0B4F 00 2279 .db 0 ; iInterface 2280 ;; endpoint descriptor I0:A0:E0 0B50 07 2281 .db 7 ; bLength 0B51 05 2282 .db USB_DT_ENDPOINT ; bDescriptorType 0B52 81 2283 .db (USB_DIR_IN | 1) ; bEndpointAddress 0B53 02 2284 .db 0x02 ; bmAttributes (bulk) 0B54 40 00 2285 .db 0x40,0x00 ; wMaxPacketSize 0B56 00 2286 .db 0 ; bInterval 2287 ;; endpoint descriptor I0:A0:E1 0B57 07 2288 .db 7 ; bLength 0B58 05 2289 .db USB_DT_ENDPOINT ; bDescriptorType 0B59 82 2290 .db (USB_DIR_IN | 2) ; bEndpointAddress 0B5A 02 2291 .db 0x02 ; bmAttributes (bulk) 0B5B 40 00 2292 .db 0x40,0x00 ; wMaxPacketSize 0B5D 00 2293 .db 0 ; bInterval 2294 ;; endpoint descriptor I0:A0:E2 0B5E 07 2295 .db 7 ; bLength 0B5F 05 2296 .db USB_DT_ENDPOINT ; bDescriptorType 0B60 02 2297 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0B61 02 2298 .db 0x02 ; bmAttributes (bulk) 0B62 40 00 2299 .db 0x40,0x00 ; wMaxPacketSize 0B64 00 2300 .db 0 ; bInterval 2301 ;; interface descriptor I0:A1 0B65 09 2302 .db 9 ; bLength 0B66 04 2303 .db USB_DT_INTERFACE ; bDescriptorType 0B67 00 2304 .db 0 ; bInterfaceNumber 0B68 01 2305 .db 1 ; bAlternateSetting 0B69 03 2306 .db 3 ; bNumEndpoints 0B6A FF 2307 .db 0xff ; bInterfaceClass (vendor specific) 0B6B 00 2308 .db 0x00 ; bInterfaceSubClass 0B6C FF 2309 .db 0xff ; bInterfaceProtocol (vendor specific) 0B6D 00 2310 .db 0 ; iInterface 2311 ;; endpoint descriptor I0:A1:E0 0B6E 07 2312 .db 7 ; bLength 0B6F 05 2313 .db USB_DT_ENDPOINT ; bDescriptorType 0B70 81 2314 .db (USB_DIR_IN | 1) ; bEndpointAddress 0B71 03 2315 .db 0x03 ; bmAttributes (interrupt) 0B72 40 00 2316 .db 0x40,0x00 ; wMaxPacketSize 0B74 0A 2317 .db 10 ; bInterval 2318 ;; endpoint descriptor I0:A1:E1 0B75 07 2319 .db 7 ; bLength 0B76 05 2320 .db USB_DT_ENDPOINT ; bDescriptorType 0B77 82 2321 .db (USB_DIR_IN | 2) ; bEndpointAddress 0B78 02 2322 .db 0x02 ; bmAttributes (bulk) 0B79 40 00 2323 .db 0x40,0x00 ; wMaxPacketSize 0B7B 00 2324 .db 0 ; bInterval 2325 ;; endpoint descriptor I0:A1:E2 0B7C 07 2326 .db 7 ; bLength 0B7D 05 2327 .db USB_DT_ENDPOINT ; bDescriptorType 0B7E 02 2328 .db (USB_DIR_OUT | 2) ; bEndpointAddress 0B7F 02 2329 .db 0x02 ; bmAttributes (bulk) 0B80 40 00 2330 .db 0x40,0x00 ; wMaxPacketSize 0B82 00 2331 .db 0 ; bInterval 2332 0045 2333 config0sz = . - config0descr 2334 0B83 2335 stringdescr: 0B83 8B 0B 2336 .db string0 0B85 8F 0B 2337 .db string1 0B87 9D 0B 2338 .db string2 0B89 BD 0B 2339 .db stringserial 2340 0004 2341 numstrings = (. - stringdescr)/2 2342 0B8B 2343 string0: 0B8B 04 2344 .db string0sz ; bLength 0B8C 03 2345 .db USB_DT_STRING ; bDescriptorType 0B8D 00 00 2346 .db 0,0 ; LANGID[0]: Lang Neutral 0004 2347 string0sz = . - string0 2348 0B8F 2349 string1: 0B8F 0E 2350 .db string1sz ; bLength 0B90 03 2351 .db USB_DT_STRING ; bDescriptorType 0B91 42 00 61 00 79 00 2352 .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 63 00 6F 00 6D 00 000E 2353 string1sz = . - string1 2354 0B9D 2355 string2: 0B9D 20 2356 .db string2sz ; bLength 0B9E 03 2357 .db USB_DT_STRING ; bDescriptorType 0B9F 55 00 53 00 42 00 2358 .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 46 00 4C 00 45 00 58 00 20 00 0BAF 28 00 62 00 6C 00 2359 .db '(,0,'b,0,'l,0,'a,0,'n,0,'k,0,'),0 61 00 6E 00 6B 00 29 00 0020 2360 string2sz = . - string2 2361 0BBD 2362 stringserial: 0BBD 02 2363 .db 2 ; bLength 0BBE 03 2364 .db USB_DT_STRING ; bDescriptorType 0BBF 00 00 00 00 00 00 2365 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 0BCF 00 00 00 00 00 00 2366 .dw 0,0,0,0,0,0,0,0 00 00 00 00 00 00 00 00 00 00 2367 baycomusb-0.10.orig/firmware/reset2firmware/main.map0100644000175100017510000000625407337536710020632 0ustar abaaba Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ . .ABS. 0000 0000 = 0. bytes (ABS,OVR) Value Global -------- -------------------------------- 0000 l_XSEG 0000 l__CODE 0000 s__CODE 0000 l_BSEG 0000 s_CODE 0000 s_BSEG 0008 l_GSINIT 000D l_DSEG 0040 s_DSEG 0080 l_ISEG 0080 s_ISEG 0157 l_CODE 0157 s_CSEG 0211 l_GSINIT2 0A88 l_CSEG 0BDF s_GSINIT 0BE7 s_GSINIT2 1000 s_XSEG Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ _CODE 0000 0000 = 0. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CODE 0000 0157 = 343. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ CSEG 0157 0A88 = 2696. bytes (REL,CON,CODE) Value Global -------- -------------------------------- 0C:03E1 xmemread 0C:08B0 fillusbintr Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT 0BDF 0008 = 8. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ GSINIT2 0BE7 0211 = 529. bytes (REL,CON,CODE) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ BSEG 0000 0000 = 0. bytes (REL,CON,BIT) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ ISEG 0080 0080 = 128. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ DSEG 0040 000D = 13. bytes (REL,CON) Hexadecimal Area Addr Size Decimal Bytes (Attributes) -------------------------------- ---- ---- ------- ----- ------------ XSEG 1000 0000 = 0. bytes (REL,CON) ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 1. Files Linked [ module(s) ] main.rel [ main ] ASxxxx Linker V01.70 + NoICE + SDCC Feb 1999, page 2. User Base Address Definitions CODE = 0x0000 DSEG = 0x0040 XSEG = 0x1000 ISEG = 0x0080 BSEG = 0x0000 baycomusb-0.10.orig/firmware/reset2firmware/main.asm0100644000175100017510000011145107337536704020634 0ustar abaaba .module main ;; define code segments link order .area CODE (CODE) .area CSEG (CODE) .area GSINIT (CODE) .area GSINIT2 (CODE) ;; ----------------------------------------------------- ;; special function registers (which are not predefined) dpl0 = 0x82 dph0 = 0x83 dpl1 = 0x84 dph1 = 0x85 dps = 0x86 ckcon = 0x8E spc_fnc = 0x8F exif = 0x91 mpage = 0x92 scon0 = 0x98 sbuf0 = 0x99 scon1 = 0xC0 sbuf1 = 0xC1 eicon = 0xD8 eie = 0xE8 eip = 0xF8 ;; anchor xdata registers IN0BUF = 0x7F00 OUT0BUF = 0x7EC0 IN1BUF = 0x7E80 OUT1BUF = 0x7E40 IN2BUF = 0x7E00 OUT2BUF = 0x7DC0 IN3BUF = 0x7D80 OUT3BUF = 0x7D40 IN4BUF = 0x7D00 OUT4BUF = 0x7CC0 IN5BUF = 0x7C80 OUT5BUF = 0x7C40 IN6BUF = 0x7C00 OUT6BUF = 0x7BC0 IN7BUF = 0x7B80 OUT7BUF = 0x7B40 SETUPBUF = 0x7FE8 SETUPDAT = 0x7FE8 EP0CS = 0x7FB4 IN0BC = 0x7FB5 IN1CS = 0x7FB6 IN1BC = 0x7FB7 IN2CS = 0x7FB8 IN2BC = 0x7FB9 IN3CS = 0x7FBA IN3BC = 0x7FBB IN4CS = 0x7FBC IN4BC = 0x7FBD IN5CS = 0x7FBE IN5BC = 0x7FBF IN6CS = 0x7FC0 IN6BC = 0x7FC1 IN7CS = 0x7FC2 IN7BC = 0x7FC3 OUT0BC = 0x7FC5 OUT1CS = 0x7FC6 OUT1BC = 0x7FC7 OUT2CS = 0x7FC8 OUT2BC = 0x7FC9 OUT3CS = 0x7FCA OUT3BC = 0x7FCB OUT4CS = 0x7FCC OUT4BC = 0x7FCD OUT5CS = 0x7FCE OUT5BC = 0x7FCF OUT6CS = 0x7FD0 OUT6BC = 0x7FD1 OUT7CS = 0x7FD2 OUT7BC = 0x7FD3 IVEC = 0x7FA8 IN07IRQ = 0x7FA9 OUT07IRQ = 0x7FAA USBIRQ = 0x7FAB IN07IEN = 0x7FAC OUT07IEN = 0x7FAD USBIEN = 0x7FAE USBBAV = 0x7FAF BPADDRH = 0x7FB2 BPADDRL = 0x7FB3 SUDPTRH = 0x7FD4 SUDPTRL = 0x7FD5 USBCS = 0x7FD6 TOGCTL = 0x7FD7 USBFRAMEL = 0x7FD8 USBFRAMEH = 0x7FD9 FNADDR = 0x7FDB USBPAIR = 0x7FDD IN07VAL = 0x7FDE OUT07VAL = 0x7FDF AUTOPTRH = 0x7FE3 AUTOPTRL = 0x7FE4 AUTODATA = 0x7FE5 ;; isochronous endpoints. only available if ISODISAB=0 OUT8DATA = 0x7F60 OUT9DATA = 0x7F61 OUT10DATA = 0x7F62 OUT11DATA = 0x7F63 OUT12DATA = 0x7F64 OUT13DATA = 0x7F65 OUT14DATA = 0x7F66 OUT15DATA = 0x7F67 IN8DATA = 0x7F68 IN9DATA = 0x7F69 IN10DATA = 0x7F6A IN11DATA = 0x7F6B IN12DATA = 0x7F6C IN13DATA = 0x7F6D IN14DATA = 0x7F6E IN15DATA = 0x7F6F OUT8BCH = 0x7F70 OUT8BCL = 0x7F71 OUT9BCH = 0x7F72 OUT9BCL = 0x7F73 OUT10BCH = 0x7F74 OUT10BCL = 0x7F75 OUT11BCH = 0x7F76 OUT11BCL = 0x7F77 OUT12BCH = 0x7F78 OUT12BCL = 0x7F79 OUT13BCH = 0x7F7A OUT13BCL = 0x7F7B OUT14BCH = 0x7F7C OUT14BCL = 0x7F7D OUT15BCH = 0x7F7E OUT15BCL = 0x7F7F OUT8ADDR = 0x7FF0 OUT9ADDR = 0x7FF1 OUT10ADDR = 0x7FF2 OUT11ADDR = 0x7FF3 OUT12ADDR = 0x7FF4 OUT13ADDR = 0x7FF5 OUT14ADDR = 0x7FF6 OUT15ADDR = 0x7FF7 IN8ADDR = 0x7FF8 IN9ADDR = 0x7FF9 IN10ADDR = 0x7FFA IN11ADDR = 0x7FFB IN12ADDR = 0x7FFC IN13ADDR = 0x7FFD IN14ADDR = 0x7FFE IN15ADDR = 0x7FFF ISOERR = 0x7FA0 ISOCTL = 0x7FA1 ZBCOUNT = 0x7FA2 INISOVAL = 0x7FE0 OUTISOVAL = 0x7FE1 FASTXFR = 0x7FE2 ;; CPU control registers CPUCS = 0x7F92 ;; IO port control registers PORTACFG = 0x7F93 PORTBCFG = 0x7F94 PORTCCFG = 0x7F95 OUTA = 0x7F96 OUTB = 0x7F97 OUTC = 0x7F98 PINSA = 0x7F99 PINSB = 0x7F9A PINSC = 0x7F9B OEA = 0x7F9C OEB = 0x7F9D OEC = 0x7F9E ;; I2C controller registers I2CS = 0x7FA5 I2DAT = 0x7FA6 ;; FPGA defines XC4K_IRLENGTH = 3 XC4K_EXTEST = 0 XC4K_PRELOAD = 1 XC4K_CONFIGURE = 5 XC4K_BYPASS = 7 FPGA_CONFIGSIZE = 11876 FPGA_BOUND = 344 SOFTWARECONFIG = 0 ;; ----------------------------------------------------- .area CODE (CODE) ljmp startup ljmp int0_isr .ds 5 ljmp timer0_isr .ds 5 ljmp int1_isr .ds 5 ljmp timer1_isr .ds 5 ljmp ser0_isr .ds 5 ljmp timer2_isr .ds 5 ljmp resume_isr .ds 5 ljmp ser1_isr .ds 5 ljmp usb_isr .ds 5 ljmp i2c_isr .ds 5 ljmp int4_isr .ds 5 ljmp int5_isr .ds 5 ljmp int6_isr .ds 0x9a ;; USB interrupt dispatch table usb_isr: ljmp usb_sudav_isr .ds 1 ljmp usb_sof_isr .ds 1 ljmp usb_sutok_isr .ds 1 ljmp usb_suspend_isr .ds 1 ljmp usb_usbreset_isr .ds 1 reti .ds 3 ljmp usb_ep0in_isr .ds 1 ljmp usb_ep0out_isr .ds 1 ljmp usb_ep1in_isr .ds 1 ljmp usb_ep1out_isr .ds 1 ljmp usb_ep2in_isr .ds 1 ljmp usb_ep2out_isr .ds 1 ljmp usb_ep3in_isr .ds 1 ljmp usb_ep3out_isr .ds 1 ljmp usb_ep4in_isr .ds 1 ljmp usb_ep4out_isr .ds 1 ljmp usb_ep5in_isr .ds 1 ljmp usb_ep5out_isr .ds 1 ljmp usb_ep6in_isr .ds 1 ljmp usb_ep6out_isr .ds 1 ljmp usb_ep7in_isr .ds 1 ljmp usb_ep7out_isr ;; ----------------------------------------------------- .area BSEG (BIT) .area ISEG (DATA) stack: .ds 0x80 .area DSEG (DATA) errcode: .ds 1 errval: .ds 1 cfgcount: .ds 2 leddiv: .ds 1 irqcount: .ds 1 ctrlcode: .ds 1 ctrladdr: .ds 2 ctrllen: .ds 2 ;; USB state numconfig: .ds 1 altsetting: .ds 1 .area XSEG (DATA) .area GSINIT (CODE) startup: mov sp,#stack ; -1 clr a mov psw,a mov dps,a ;lcall __sdcc_external_startup ;mov a,dpl0 ;jz __sdcc_init_data ;ljmp __sdcc_program_startup __sdcc_init_data: .area GSINIT2 (CODE) __sdcc_program_startup: ;; assembler code startup clr a mov errcode,a mov errval,a mov cfgcount,a mov cfgcount+1,a mov irqcount,a mov ctrlcode,a mov dps,a mov ie,a ;; some indirect register setup mov ckcon,#0x31 ; one external wait state, to avoid chip bugs ;; Timer setup: ;; timer 0: LED blink : T0M=0, CT0=0, MODE0=1 ;; timer 1: Baudrate gen : T1M=1, CT1=0, MODE1=2 mov tmod,#0x21 mov tcon,#0x55 ; INT0/INT1 edge mov th1,#256-156 ; 1200 bauds mov pcon,#0 ; SMOD0=0 ;; give Windows a chance to finish the writecpucs control transfer ;; 10ms delay loop mov dptr,#(-6000)&0xffff 9$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 9$ ; 3 cycles ;; init USB subsystem mov dptr,#ISOCTL mov a,#1 ; disable ISO endpoints movx @dptr,a mov dptr,#USBBAV mov a,#1 ; enable autovector, disable breakpoint logic movx @dptr,a clr a mov dptr,#INISOVAL movx @dptr,a mov dptr,#OUTISOVAL movx @dptr,a mov dptr,#USBPAIR mov a,#0x9 ; pair EP 2&3 for input & output movx @dptr,a mov dptr,#IN07VAL mov a,#0x7 ; enable EP0+EP1+EP2 movx @dptr,a mov dptr,#OUT07VAL mov a,#0x5 ; enable EP0+EP2 movx @dptr,a ;; USB: init endpoint toggles mov dptr,#TOGCTL mov a,#0x12 movx @dptr,a mov a,#0x32 ; clear EP 2 in toggle movx @dptr,a mov a,#0x02 movx @dptr,a mov a,#0x22 ; clear EP 2 out toggle movx @dptr,a ;; configure IO ports mov dptr,#PORTACFG mov a,#0 movx @dptr,a mov dptr,#OUTA mov a,#0x80 ; set PROG lo movx @dptr,a mov dptr,#OEA mov a,#0xc2 ; out: TMS,TDI,PROG in: DONE movx @dptr,a mov dptr,#PORTBCFG mov a,#0 movx @dptr,a mov dptr,#OEB mov a,#0 movx @dptr,a mov dptr,#PORTCCFG mov a,#0 movx @dptr,a mov dptr,#OUTC mov a,#0x20 movx @dptr,a mov dptr,#OEC mov a,#0x2e ; out: LEDCON,LEDSTA,TCK,INIT in: TDO movx @dptr,a ;; enable interrupts mov ie,#0x82 ; enable timer 0 mov eie,#0x01 ; enable USB interrupts mov dptr,#USBIEN mov a,#1 ; enable SUDAV interrupt movx @dptr,a mov dptr,#IN07IEN mov a,#3 ; enable EP0+EP1 interrupt movx @dptr,a mov dptr,#OUT07IEN mov a,#1 ; enable EP0 interrupt movx @dptr,a ;; initialize UART 0 for config loading mov scon0,#0x20 ; mode 0, CLK24/4 mov sbuf0,#0xff ;; initialize USB state clr a mov numconfig,a mov altsetting,a .if 1 ;; disconnect from USB bus mov dptr,#USBCS mov a,#10 movx @dptr,a ;; wait 0.3 sec mov r2,#30 ;; 10ms delay loop 0$: mov dptr,#(-6000)&0xffff 1$: inc dptr ; 3 cycles mov a,dpl0 ; 2 cycles orl a,dph0 ; 2 cycles jnz 1$ ; 3 cycles djnz r2,0$ ;; reconnect to USB bus mov dptr,#USBCS mov a,#2 ; 8051 handles control movx @dptr,a mov a,#6 ; reconnect, 8051 handles control movx @dptr,a .endif ;; final lcall fillusbintr ;; kludge; first OUT2 packet seems to be bogus ;; wait for packet with length 1 and contents 0x55 ;; some short delay mov dptr,#OUTA mov a,#0x82 ; set PROG hi movx @dptr,a mov dptr,#PINSA movx a,@dptr jnb acc.2,8$ ;; DONE stuck high mov errcode,#0x80 ljmp fpgaerr 8$: lcall jtag_reset_tap mov r2,#5 mov r3,#0 mov r4,#6 lcall jtag_shiftout ; enter SHIFT-IR state mov r2,#8 mov r3,#0 mov r4,#0 lcall jtag_shiftout ; assume max. 8bit IR mov r2,#8 mov r3,#1 mov r4,#0 lcall jtag_shift ; shift in a single bit mov a,#-(1<(-FPGA_CONFIGSIZE) addc a,cfgcount+1 jnc loadloop ;; configuration download complete, start FPGA mov dptr,#PORTBCFG mov a,#0 ; TDI no longer special function pin movx @dptr,a mov dptr,#PORTCCFG mov a,#0 ; TCK no longer special function pin movx @dptr,a ;; wait for done loop mov r7,#250 doneloop: mov dptr,#PINSA movx a,@dptr jb acc.2,doneactive mov dptr,#PINSC movx a,@dptr jb acc.2,1$ ;; INIT low mov errcode,#0x90 ljmp fpgaerr 1$: mov dptr,#OUTC movx a,@dptr setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a djnz r7,doneloop ;; DONE stuck low mov errcode,#0x91 ljmp fpgaerr doneactive: ;; generate 16 clock pulses to start up FPGA mov r7,#16 mov dptr,#OUTC movx a,@dptr 0$: setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a djnz r7,0$ mov dptr,#PORTCCFG mov a,#0xc0 ; RD/WR is special function pin movx @dptr,a mov errcode,#0x20 ;; turn off PTT mov dptr,#0xc008 mov a,#0x42 movx @dptr,a fpgaerr: sjmp fpgaerr .area CSEG (CODE) ar2 = 0x02 ar3 = 0x03 ar4 = 0x04 ar5 = 0x05 ar6 = 0x06 ar7 = 0x07 ar0 = 0x00 ar1 = 0x01 ;; jtag_shift ;; r2 = num ;; r3 = tdi ;; r4 = tms ;; return: r7 = tdo jtag_reset_tap: mov r2,#5 mov r3,#0 mov r4,#0xff jtag_shiftout: jtag_shift: mov r6,#1 mov r7,#0 1$: mov a,#2 xch a,r3 rrc a xch a,r3 mov acc.6,c xch a,r4 rrc a xch a,r4 mov acc.7,c mov dptr,#OUTA movx @dptr,a mov dptr,#PINSC movx a,@dptr jnb acc.0,2$ mov a,r6 orl ar7,a 2$: mov dptr,#OUTC movx a,@dptr setb acc.1 movx @dptr,a clr acc.1 movx @dptr,a mov a,r6 rl a mov r6,a djnz r2,1$ ret ;; EEPROM address where the serial number is located eepromstraddr: .db 0x10 ;; I2C Routines ;; note: ckcon should be set to #0x31 to avoid chip bugs writei2c: ;; dptr: data to be sent ;; b: device address ;; r7: transfer length ;; return: a: status (bytes remaining, 0xff bus error) inc dps mov dptr,#I2CS clr b.0 ; r/w = 0 mov a,#0x80 ; start condition movx @dptr,a mov dptr,#I2DAT mov a,b movx @dptr,a mov dptr,#I2CS 0$: movx a,@dptr jb acc.2,3$ ; BERR jnb acc.0,0$ ; DONE jnb acc.1,1$ ; ACK mov dptr,#I2DAT dec dps movx a,@dptr inc dptr inc dps movx @dptr,a mov dptr,#I2CS djnz r7,0$ 1$: mov a,#0x40 ; stop condition movx @dptr,a 2$: movx a,@dptr jb acc.6,2$ dec dps mov a,r7 ret 3$: mov r7,#255 sjmp 1$ readi2c: ;; dptr: data to be sent ;; b: device address ;; r7: transfer length ;; return: a: status (bytes remaining, 0xff bus error) inc dps mov dptr,#I2CS setb b.0 ; r/w = 1 mov a,#0x80 ; start condition movx @dptr,a mov dptr,#I2DAT mov a,b movx @dptr,a mov dptr,#I2CS 0$: movx a,@dptr jb acc.2,9$ ; BERR jnb acc.0,0$ ; DONE jnb acc.1,5$ ; ACK mov a,r7 jnz 1$ 5$: mov a,#0x40 ; stop condition movx @dptr,a 2$: movx a,@dptr jb acc.6,2$ dec dps clr a ret 1$: cjne a,#1,3$ mov a,#0x20 ; LASTRD = 1 movx @dptr,a 3$: mov dptr,#I2DAT movx a,@dptr ; initiate first read mov dptr,#I2CS 4$: movx a,@dptr jb acc.2,9$ ; BERR jnb acc.0,4$ ; DONE mov a,r7 cjne a,#2,6$ mov a,#0x20 ; LASTRD = 1 movx @dptr,a 6$: cjne a,#1,7$ mov a,#0x40 ; stop condition movx @dptr,a 7$: mov dptr,#I2DAT movx a,@dptr ; read data dec dps movx @dptr,a inc dptr inc dps mov dptr,#I2CS djnz r7,4$ 8$: movx a,@dptr jb acc.6,8$ dec dps clr a ret 9$: mov a,#0x40 ; stop condition movx @dptr,a 10$: movx a,@dptr jb acc.6,10$ mov a,#255 dec dps ret ;; ------------------ interrupt handlers ------------------------ int0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+5 ;; handle interrupt inc leddiv mov a,leddiv anl a,#7 jnz 0$ mov dptr,#OUTC movx a,@dptr xrl a,#0x08 movx @dptr,a 0$: ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr tcon+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser0_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon0+0 clr scon0+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti timer2_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr t2con+7 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti resume_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+4 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ser1_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr scon1+0 clr scon1+1 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti i2c_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.5 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int4_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.6 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int5_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.7 mov exif,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti int6_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt clr eicon+3 ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti xmemread:: mov a,ctrllen mov r7,a add a,#-64 mov ctrllen,a mov a,ctrllen+1 addc a,#0 jnc 0$ clr a mov ctrllen,a mov ctrllen+1,a mov ctrlcode,a mov a,#2 ; ack control transfer mov dptr,#EP0CS movx @dptr,a mov a,r7 jz 2$ sjmp 1$ 0$: mov ctrllen+1,a mov r7,#64 1$: mov ar0,r7 mov dpl0,ctrladdr mov dph0,ctrladdr+1 inc dps mov dptr,#IN0BUF dec dps 3$: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r0,3$ mov ctrladdr,dpl0 mov ctrladdr+1,dph0 2$: mov a,r7 mov dptr,#IN0BC movx @dptr,a ret usb_sudav_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov ctrlcode,#0 ; reset control out code mov dptr,#SETUPDAT+1 movx a,@dptr ; bRequest field ;; standard commands ;; USB_REQ_GET_DESCRIPTOR cjne a,#USB_REQ_GET_DESCRIPTOR,cmdnotgetdesc mov dptr,#SETUPDAT ; bRequestType == 0x80 movx a,@dptr cjne a,#USB_DIR_IN,setupstallstd mov dptr,#SETUPDAT+3 movx a,@dptr cjne a,#USB_DT_DEVICE,cmdnotgetdescdev mov dptr,#SUDPTRH mov a,#>devicedescr movx @dptr,a inc dptr mov a,#config0descr movx @dptr,a inc dptr mov a,#stringdescr mov dph0,a movx a,@dptr mov b,a inc dptr movx a,@dptr mov dptr,#SUDPTRH movx @dptr,a inc dptr mov a,b movx @dptr,a ; sjmp setupackstd setupackstd: ljmp setupack setupstallstd: ljmp setupstall cmdnotgetdesc: ;; USB_REQ_SET_CONFIGURATION cjne a,#USB_REQ_SET_CONFIGURATION,cmdnotsetconf mov dptr,#SETUPDAT movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr add a,#-2 jc setupstallstd movx a,@dptr mov numconfig,a cmdresettoggleshalt: mov dptr,#TOGCTL mov r0,#7 0$: mov a,r0 orl a,#0x10 movx @dptr,a orl a,#0x30 movx @dptr,a mov a,r0 movx @dptr,a orl a,#0x20 movx @dptr,a djnz r0,0$ clr a movx @dptr,a mov a,#2 mov dptr,#IN1CS mov r0,#7 1$: movx @dptr,a inc dptr inc dptr djnz r0,1$ mov dptr,#OUT1CS mov r0,#7 2$: movx @dptr,a inc dptr inc dptr djnz r0,2$ lcall fillusbintr sjmp setupackstd cmdnotsetconf: ;; USB_REQ_SET_INTERFACE cjne a,#USB_REQ_SET_INTERFACE,cmdnotsetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_OUT,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr jnz setupstallstd mov dptr,#SETUPDAT+2 movx a,@dptr mov altsetting,a sjmp cmdresettoggleshalt cmdnotsetint: ;; USB_REQ_GET_INTERFACE cjne a,#USB_REQ_GET_INTERFACE,cmdnotgetint mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,setupstallstd mov a,numconfig cjne a,#1,setupstallstd mov dptr,#SETUPDAT+4 movx a,@dptr jnz setupstallstd mov a,altsetting cmdrespondonebyte: mov dptr,#IN0BUF movx @dptr,a mov dptr,#IN0BC mov a,#1 movx @dptr,a sjmp setupackstd2 cmdnotgetint: ;; USB_REQ_GET_CONFIGURATION cjne a,#USB_REQ_GET_CONFIGURATION,cmdnotgetconf mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,setupstallstd2 mov a,numconfig sjmp cmdrespondonebyte cmdnotgetconf: ;; USB_REQ_GET_STATUS (0) jnz cmdnotgetstat mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_DEVICE|USB_DIR_IN,cmdnotgetstatdev mov a,#1 cmdrespondstat: mov dptr,#IN0BUF movx @dptr,a inc dptr clr a movx @dptr,a mov dptr,#IN0BC mov a,#2 movx @dptr,a sjmp setupackstd2 cmdnotgetstatdev: cjne a,#USB_RECIP_INTERFACE|USB_DIR_IN,cmdnotgetstatintf clr a sjmp cmdrespondstat cmdnotgetstatintf: cjne a,#USB_RECIP_ENDPOINT|USB_DIR_IN,setupstallstd2 mov dptr,#SETUPDAT+4 movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 0$: anl a,#15 jz setupstallstd2 jb acc.3,setupstallstd2 add a,acc add a,dpl0 mov dpl0,a movx a,@dptr sjmp cmdrespondstat setupackstd2: ljmp setupack setupstallstd2: ljmp setupstall cmdnotgetstat: ;; USB_REQ_SET_FEATURE cjne a,#USB_REQ_SET_FEATURE,cmdnotsetftr mov b,#1 sjmp handleftr cmdnotsetftr: ;; USB_REQ_CLEAR_FEATURE cjne a,#USB_REQ_CLEAR_FEATURE,cmdnotclrftr mov b,#0 handleftr: mov dptr,#SETUPDAT movx a,@dptr cjne a,#USB_RECIP_ENDPOINT|USB_DIR_OUT,setupstallstd2 inc dptr inc dptr movx a,@dptr jnz setupstallstd2 ; not ENDPOINT_HALT feature inc dptr movx a,@dptr jnz setupstallstd2 inc dptr movx a,@dptr mov dptr,#OUT1CS-2 jnb acc.7,0$ mov dptr,#IN1CS-2 orl a,#0x10 0$: jb acc.3,setupstallstd2 ;; clear data toggle anl a,#0x1f inc dps mov dptr,#TOGCTL movx @dptr,a orl a,#0x20 movx @dptr,a anl a,#15 movx @dptr,a dec dps ;; clear/set ep halt feature add a,acc add a,dpl0 mov dpl0,a mov a,b movx @dptr,a sjmp setupackstd2 cmdnotclrftr: ;; vendor specific commands ;; 0xa3 cjne a,#0xa3,cmdnota3 mov dptr,#SETUPDAT+2 movx a,@dptr mov ctrladdr,a inc dptr movx a,@dptr mov ctrladdr+1,a add a,#80 jnc setupstalla3 mov dptr,#SETUPDAT+6 movx a,@dptr mov ctrllen,a add a,ctrladdr inc dptr movx a,@dptr mov ctrllen+1,a addc a,ctrladdr+1 jc setupstalla3 mov dptr,#SETUPDAT ; bRequestType == 0x40 movx a,@dptr cjne a,#0x40,1$ mov ctrlcode,#1 mov dptr,#OUT0BC movx @dptr,a ljmp endusbisr 1$: cjne a,#0xc0,setupstalla3 ; bRequestType == 0xc0 mov ctrlcode,#2 lcall xmemread ljmp endusbisr setupstalla3: ljmp setupstall cmdnota3: ;; 0xb1 cjne a,#0xb1,cmdnotb1 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb1 mov dptr,#IN0BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,sp ;;; xxxx push dpl0 push dph0 mov dptr,#OUT07VAL movx a,@dptr pop dph0 pop dpl0 ;;; xxxx movx @dptr,a inc dptr mov a,#0 ;;; xxxx push dpl0 push dph0 mov dptr,#OUT2CS movx a,@dptr pop dph0 pop dpl0 ;;; xxxx movx @dptr,a inc dptr mov dptr,#IN0BC mov a,#4 movx @dptr,a ljmp setupack setupstallb1: ljmp setupstall cmdnotb1: ;; 0xb2 cjne a,#0xb2,cmdnotb2 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb2 mov dptr,#IN0BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,cfgcount movx @dptr,a inc dptr mov a,cfgcount+1 movx @dptr,a inc dptr mov a,irqcount movx @dptr,a mov dptr,#IN0BC mov a,#5 movx @dptr,a inc irqcount ljmp setupack setupstallb2: ljmp setupstall cmdnotb2: ;; 0xb3 cjne a,#0xb3,cmdnotb3 mov dptr,#SETUPDAT ; bRequestType == 0xc0 movx a,@dptr cjne a,#0xc0,setupstallb3 ;; read EEPROM serstrlen = 6 mov b,#0xa0 ; EEPROM address mov dptr,#eepromstraddr mov r7,#1 lcall writei2c jnz setupstallb3 mov dptr,#IN0BUF mov r7,#serstrlen lcall readi2c jnz setupstallb3 mov a,#serstrlen mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallb3: ljmp setupstall cmdnotb3: ;; 0xb4 cjne a,#0xb4,cmdnotb4 mov dptr,#SETUPDAT+7 movx a,@dptr jnz setupstallb4 mov dptr,#SETUPDAT+6 movx a,@dptr mov r0,a mov r7,a add a,#-64 jc setupstallb4 mov dptr,#SETUPDAT+4 ; wIndex movx a,@dptr mov b,a mov ctrladdr,a mov dptr,#SETUPDAT movx a,@dptr cjne a,#0x40,0$ ; bRequestType == 0x40 mov ctrlcode,#2 mov dptr,#OUT0BC movx @dptr,a ljmp endusbisr 0$: cjne a,#0xc0,setupstallb4 ; bRequestType == 0xc0 mov dptr,#IN0BUF lcall readi2c jnz setupstallb4 mov a,r0 mov dptr,#IN0BC movx @dptr,a ljmp setupack setupstallb4: ljmp setupstall cmdnotb4: ;; unknown commands fall through to setupstall setupstall: mov a,#3 sjmp endsetup setupack: mov a,#2 endsetup: mov dptr,#EP0CS movx @dptr,a endusbisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_sof_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_sutok_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_suspend_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_usbreset_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#USBIRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep0in_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar7 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov a,ctrlcode cjne a,#2,0$ lcall xmemread sjmp ep0inendisr 0$: mov dptr,#IN0BC clr a movx @dptr,a sjmp ep0inack ep0install: mov a,#3 sjmp ep0incs ep0inack: mov a,#2 ep0incs: mov dptr,#EP0CS movx @dptr,a ep0inendisr: ;; epilogue pop ar7 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti usb_ep0out_isr: push acc push b push dpl0 push dph0 push dpl1 push dph1 push psw mov psw,#0x00 push dps mov dps,#0 push ar0 push ar6 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x01 movx @dptr,a ;; handle interrupt mov a,ctrlcode ; check control code cjne a,#0x01,i2cwr ;; write to external memory mov dptr,#OUT0BC movx a,@dptr jz 0$ mov r7,a clr c mov a,ctrllen subb a,r7 mov ctrllen,a mov a,ctrllen+1 subb a,#0 mov ctrllen+1,a jc ep0outstall mov dptr,#OUT0BUF mov dpl1,ctrladdr mov dph1,ctrladdr+1 1$: movx a,@dptr inc dptr inc dps movx @dptr,a inc dptr dec dps djnz r7,1$ mov ctrladdr,dpl1 mov ctrladdr+1,dph1 0$: mov a,ctrllen orl a,ctrllen+1 jz ep0outack sjmp ep0outendisr ;; write I2C eeprom i2cwr: cjne a,#0x02,ep0outstall mov dptr,#OUT0BC movx a,@dptr jz ep0outack mov r7,a mov b,ctrladdr mov dptr,#OUT0BUF lcall writei2c jnz ep0outstall sjmp ep0outack ep0outstall: mov ctrlcode,#0 mov a,#3 sjmp ep0outcs ep0outack: mov ctrlcode,#0 mov a,#2 ep0outcs: mov dptr,#EP0CS movx @dptr,a ep0outendisr: ;; epilogue pop ar6 pop ar0 pop dps pop psw pop dph1 pop dpl1 pop dph0 pop dpl0 pop b pop acc reti fillusbintr:: mov dptr,#IN1BUF mov a,errcode movx @dptr,a inc dptr mov a,errval movx @dptr,a inc dptr mov a,cfgcount movx @dptr,a inc dptr mov a,cfgcount+1 movx @dptr,a inc dptr mov a,irqcount movx @dptr,a mov dptr,#IN1BC mov a,#5 movx @dptr,a inc irqcount ret usb_ep1in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt lcall fillusbintr ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep1out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x02 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep2out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x04 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep3out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x08 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep4out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x10 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep5out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x20 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep6out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x40 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7in_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#IN07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti usb_ep7out_isr: push acc push b push dpl0 push dph0 push psw mov psw,#0x00 push dps mov dps,#0 ;; clear interrupt mov a,exif clr acc.4 mov exif,a mov dptr,#OUT07IRQ mov a,#0x80 movx @dptr,a ;; handle interrupt ;; epilogue pop dps pop psw pop dph0 pop dpl0 pop b pop acc reti ;; ----------------------------------------------------- ;; USB descriptors ;; ----------------------------------------------------- ;; Device and/or Interface Class codes USB_CLASS_PER_INTERFACE = 0 USB_CLASS_AUDIO = 1 USB_CLASS_COMM = 2 USB_CLASS_HID = 3 USB_CLASS_PRINTER = 7 USB_CLASS_MASS_STORAGE = 8 USB_CLASS_HUB = 9 USB_CLASS_VENDOR_SPEC = 0xff ;; Descriptor types USB_DT_DEVICE = 0x01 USB_DT_CONFIG = 0x02 USB_DT_STRING = 0x03 USB_DT_INTERFACE = 0x04 USB_DT_ENDPOINT = 0x05 ;; Standard requests USB_REQ_GET_STATUS = 0x00 USB_REQ_CLEAR_FEATURE = 0x01 USB_REQ_SET_FEATURE = 0x03 USB_REQ_SET_ADDRESS = 0x05 USB_REQ_GET_DESCRIPTOR = 0x06 USB_REQ_SET_DESCRIPTOR = 0x07 USB_REQ_GET_CONFIGURATION = 0x08 USB_REQ_SET_CONFIGURATION = 0x09 USB_REQ_GET_INTERFACE = 0x0A USB_REQ_SET_INTERFACE = 0x0B USB_REQ_SYNCH_FRAME = 0x0C ;; USB Request Type and Endpoint Directions USB_DIR_OUT = 0 USB_DIR_IN = 0x80 USB_TYPE_STANDARD = (0x00 << 5) USB_TYPE_CLASS = (0x01 << 5) USB_TYPE_VENDOR = (0x02 << 5) USB_TYPE_RESERVED = (0x03 << 5) USB_RECIP_DEVICE = 0x00 USB_RECIP_INTERFACE = 0x01 USB_RECIP_ENDPOINT = 0x02 USB_RECIP_OTHER = 0x03 ;; Request target types. USB_RT_DEVICE = 0x00 USB_RT_INTERFACE = 0x01 USB_RT_ENDPOINT = 0x02 VENDID = 0xbac0 PRODID = 0x6135 devicedescr: .db 18 ; bLength .db USB_DT_DEVICE ; bDescriptorType .db 0x00, 0x01 ; bcdUSB .db USB_CLASS_VENDOR_SPEC ; bDeviceClass .db 0 ; bDeviceSubClass .db 0xff ; bDeviceProtocol .db 0x40 ; bMaxPacketSize0 .db VENDID ; idVendor .db PRODID ; idProduct .db 0x02,0x00 ; bcdDevice .db 1 ; iManufacturer .db 2 ; iProduct .db 3 ; iSerialNumber .db 1 ; bNumConfigurations config0descr: .db 9 ; bLength .db USB_DT_CONFIG ; bDescriptorType .db config0sz ; wTotalLength .db 1 ; bNumInterfaces .db 1 ; bConfigurationValue .db 0 ; iConfiguration .db 0b01000000 ; bmAttributs (self powered) .db 0 ; MaxPower (mA/2) (self powered so 0) ;; interface descriptor I0:A0 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 0 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A0:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A0:E1 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A0:E2 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; interface descriptor I0:A1 .db 9 ; bLength .db USB_DT_INTERFACE ; bDescriptorType .db 0 ; bInterfaceNumber .db 1 ; bAlternateSetting .db 3 ; bNumEndpoints .db 0xff ; bInterfaceClass (vendor specific) .db 0x00 ; bInterfaceSubClass .db 0xff ; bInterfaceProtocol (vendor specific) .db 0 ; iInterface ;; endpoint descriptor I0:A1:E0 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 1) ; bEndpointAddress .db 0x03 ; bmAttributes (interrupt) .db 0x40,0x00 ; wMaxPacketSize .db 10 ; bInterval ;; endpoint descriptor I0:A1:E1 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_IN | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval ;; endpoint descriptor I0:A1:E2 .db 7 ; bLength .db USB_DT_ENDPOINT ; bDescriptorType .db (USB_DIR_OUT | 2) ; bEndpointAddress .db 0x02 ; bmAttributes (bulk) .db 0x40,0x00 ; wMaxPacketSize .db 0 ; bInterval config0sz = . - config0descr stringdescr: .db string0 .db string1 .db string2 .db stringserial numstrings = (. - stringdescr)/2 string0: .db string0sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 0,0 ; LANGID[0]: Lang Neutral string0sz = . - string0 string1: .db string1sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'B,0,'a,0,'y,0,'c,0,'o,0,'m,0 string1sz = . - string1 string2: .db string2sz ; bLength .db USB_DT_STRING ; bDescriptorType .db 'U,0,'S,0,'B,0,'F,0,'L,0,'E,0,'X,0,' ,0 .db '(,0,'b,0,'l,0,'a,0,'n,0,'k,0,'),0 string2sz = . - string2 stringserial: .db 2 ; bLength .db USB_DT_STRING ; bDescriptorType .dw 0,0,0,0,0,0,0,0 .dw 0,0,0,0,0,0,0,0 baycomusb-0.10.orig/firmware/reset2firmware/main.lnk0100644000175100017510000000014707325134422020623 0ustar abaaba-muxi -b CODE = 0x0000 -b DSEG = 0x0040 -b XSEG = 0x1000 -b ISEG = 0x0080 -b BSEG = 0x0000 main.rel -e baycomusb-0.10.orig/fpga/0042755000175100017510000000000007340500005013323 5ustar abaababaycomusb-0.10.orig/fpga/Makefile.in0100644000175100017510000001457207340500005015374 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ noinst_HEADERS = afsk_firmware.h fsk_firmware.h fsk_fpga.h sample_firmware.h mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = HEADERS = $(noinst_HEADERS) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 fpga/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = fpga 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 $(HEADERS) 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-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-tags clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-tags distclean-generic clean-am distclean: distclean-am 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-am .PHONY: 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: baycomusb-0.10.orig/fpga/Makefile.am0100644000175100017510000000011607325134422015361 0ustar abaabanoinst_HEADERS = afsk_firmware.h fsk_firmware.h fsk_fpga.h sample_firmware.h baycomusb-0.10.orig/fpga/afsk_firmware.h0100644000175100017510000022443307325134422016330 0ustar abaaba/*****************************************************************************/ /* * afsk_firmware.h -- HDLC packet radio modem for EPP using FPGA utility. * * Copyright (C) 1998 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define AFSK_FIRMWAREDATE "20001009" /* firmware */ static const unsigned char afsk_firmware[] = { 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xee, 0x7f, 0xff, 0xfd, 0xe5, 0xd7, 0x5f, 0x7e, 0xfd, 0xed, 0xbf, 0xef, 0xfe, 0xf2, 0xee, 0xad, 0xbf, 0xfe, 0xf6, 0xfb, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x7d, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf8, 0xed, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0x5f, 0xfc, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xe7, 0xff, 0x6f, 0xfe, 0xfb, 0xc6, 0x5f, 0x6f, 0xfd, 0xf5, 0xd6, 0x5f, 0x7f, 0x7d, 0xe3, 0xaf, 0x37, 0xfe, 0xfa, 0xeb, 0xaf, 0xbd, 0xfe, 0x9b, 0xf3, 0x5f, 0xe5, 0xf5, 0xd5, 0x5f, 0x5f, 0xfd, 0xf5, 0xd7, 0xae, 0xfa, 0xfa, 0xaa, 0xaf, 0xbf, 0xfe, 0xfa, 0xe9, 0xff, 0xc6, 0xff, 0x3b, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0x9d, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xb9, 0xff, 0x6c, 0xbd, 0xdf, 0xfe, 0xfb, 0xed, 0xbf, 0xff, 0x6e, 0xb6, 0xdf, 0x6f, 0xfb, 0xfd, 0xf7, 0xdf, 0x5f, 0xff, 0x6f, 0xee, 0xff, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xff, 0xd5, 0x57, 0x5f, 0x7d, 0xf7, 0xf5, 0xd7, 0x5f, 0x7f, 0x9b, 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0x7f, 0xff, 0xdd, 0x77, 0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xfe, 0xd7, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef, 0xbf, 0xbf, 0xbe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xb7, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbd, 0x6f, 0xbf, 0xff, 0xfe, 0xbb, 0xef, 0xbf, 0xff, 0xfe, 0x6d, 0xf4, 0xff, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0xfe, 0xf6, 0xdb, 0x69, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 0xfe, 0xfb, 0xcf, 0xbb, 0xff, 0xfe, 0xfb, 0xff, 0xe6, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xee, 0xbf, 0xdf, 0xfe, 0xfb, 0xef, 0xbf, 0xef, 0xbe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xc7, 0x6f, 0xde, 0xb9, 0xf7, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xff, 0x6f, 0xfe, 0xff, 0xfc, 0xf7, 0xcf, 0x7f, 0xff, 0xfc, 0xf7, 0xdf, 0x7f, 0xee, 0xf3, 0xe7, 0xbf, 0xff, 0xee, 0xfb, 0xef, 0xff, 0x9b, 0xdd, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0x67, 0x9f, 0x7f, 0xbe, 0xf9, 0xe7, 0x9b, 0x7f, 0xfe, 0xdd, 0x66, 0xff, 0xbd, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xfe, 0xdf, 0xdf, 0xff, 0xfd, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xf7, 0x6f, 0xfe, 0x9f, 0x5d, 0xf6, 0xda, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0xdf, 0x7e, 0xfb, 0xcf, 0xb7, 0xdf, 0x7e, 0xfb, 0xef, 0xff, 0x9b, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0x7f, 0xfe, 0xff, 0xbf, 0xff, 0x7f, 0xfe, 0xbf, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xfe, 0xfd, 0xf7, 0xae, 0xff, 0xe9, 0xf3, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xbf, 0xf9, 0xff, 0xf3, 0xff, 0xb7, 0xff, 0x7f, 0xfb, 0xff, 0xf7, 0xff, 0xf9, 0xbf, 0x8f, 0xff, 0xf7, 0xff, 0xff, 0xfb, 0xff, 0x67, 0x7e, 0xff, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf7, 0x9f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0x9b, 0xff, 0x7e, 0xff, 0xf5, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbe, 0xff, 0xfe, 0xfb, 0xee, 0xbb, 0xff, 0xfe, 0xfb, 0xff, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xbf, 0xff, 0xfe, 0xf7, 0xfd, 0x7f, 0xdb, 0xfa, 0xff, 0xff, 0x7e, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xfd, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xfb, 0xef, 0x7f, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xe6, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0xf9, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0xff, 0xbf, 0xf7, 0xff, 0xfe, 0xf7, 0xff, 0xff, 0xfb, 0x6f, 0xdf, 0xff, 0x6b, 0xf8, 0xff, 0xff, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xed, 0xff, 0xf7, 0xfc, 0xff, 0xff, 0xff, 0xbb, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfe, 0xfe, 0xed, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xa6, 0xef, 0xf7, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xd7, 0xef, 0xf7, 0xbf, 0xf9, 0xbb, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0x9f, 0xff, 0xfb, 0x6f, 0xfa, 0xff, 0xff, 0xfc, 0xb3, 0xf7, 0x3f, 0xf2, 0xff, 0xf3, 0x9f, 0x7f, 0xfe, 0xfb, 0xc6, 0xff, 0xff, 0x7f, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xbe, 0xf5, 0xdc, 0xff, 0xbf, 0xff, 0xff, 0xf6, 0xb7, 0x7f, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x7f, 0x3f, 0xee, 0xfb, 0xa7, 0xff, 0xff, 0xff, 0x5d, 0xe7, 0xee, 0x79, 0xff, 0xfb, 0xfe, 0x9f, 0xff, 0xff, 0x8f, 0xf9, 0xef, 0xf7, 0xea, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xd9, 0xff, 0x5f, 0xef, 0xff, 0x5d, 0xf6, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xeb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xf9, 0xff, 0x7d, 0x7f, 0xdd, 0xff, 0xff, 0x1b, 0xfe, 0xbf, 0xe7, 0xcb, 0x6f, 0xb9, 0xff, 0xfe, 0xfd, 0xef, 0x7f, 0x6b, 0xad, 0xff, 0xff, 0xf7, 0xff, 0xfb, 0xff, 0x3f, 0x66, 0xff, 0xfb, 0xff, 0xe6, 0x5f, 0xfe, 0xbf, 0xff, 0xff, 0xfb, 0x5f, 0xb6, 0xeb, 0xfb, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xb7, 0xf9, 0xff, 0x7b, 0xdd, 0xff, 0xbe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0xff, 0xff, 0x4f, 0x3d, 0xff, 0xff, 0xff, 0x6f, 0xd6, 0xb7, 0xff, 0xf5, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xfb, 0x4f, 0xff, 0xff, 0x5f, 0x9b, 0xfb, 0xbb, 0xd5, 0x65, 0xf7, 0x6f, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xfe, 0xf9, 0xff, 0x3d, 0xd1, 0xeb, 0xb3, 0xff, 0xef, 0x66, 0xfe, 0x7b, 0xf7, 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x37, 0xed, 0xfe, 0xd1, 0xf4, 0xfb, 0xea, 0xff, 0xb3, 0xb1, 0xff, 0x5a, 0xfe, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xf5, 0xf7, 0xff, 0xdf, 0xbe, 0xdf, 0x7f, 0x6d, 0xbf, 0xff, 0xff, 0x66, 0xee, 0xff, 0xb7, 0xce, 0xff, 0xbf, 0xfd, 0x83, 0xff, 0x3f, 0xf1, 0x61, 0x2b, 0xff, 0x1f, 0x5f, 0xff, 0xff, 0xff, 0xbf, 0x9b, 0xf7, 0xff, 0xff, 0x6d, 0xb7, 0xfd, 0x7f, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe6, 0xfd, 0xff, 0x7d, 0xf6, 0xd9, 0xff, 0x9f, 0xff, 0xff, 0xf9, 0xcf, 0x3f, 0xff, 0xef, 0xfb, 0x9f, 0xfc, 0xfb, 0xff, 0xbd, 0xb1, 0xff, 0xfb, 0xcc, 0x3e, 0xda, 0xfe, 0xf3, 0xef, 0x3f, 0xff, 0xf9, 0xd7, 0xda, 0x6c, 0xff, 0xfd, 0x77, 0xdf, 0xff, 0x66, 0xe6, 0xff, 0xef, 0xff, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xf9, 0xff, 0xfd, 0xf7, 0xfe, 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xef, 0x7f, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xef, 0xa6, 0xfe, 0x7f, 0xb5, 0xdc, 0xf6, 0xfe, 0x1f, 0xff, 0xff, 0xf1, 0x87, 0xb7, 0xff, 0xfd, 0xf1, 0xf7, 0xf7, 0x7f, 0xbf, 0xab, 0x79, 0xff, 0xef, 0x9f, 0x7c, 0xf6, 0xfa, 0xef, 0xff, 0xff, 0xf6, 0xb1, 0xc7, 0xbe, 0xdf, 0xfc, 0x95, 0xdf, 0xb7, 0x7f, 0x63, 0xfe, 0xbf, 0xde, 0xb7, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xbf, 0x7e, 0x75, 0xff, 0xfe, 0x9b, 0x5f, 0xff, 0xff, 0xf7, 0xfe, 0x9a, 0xff, 0xaf, 0xcf, 0x3f, 0xff, 0xec, 0xf3, 0xcf, 0x3f, 0xff, 0xdc, 0x67, 0x9f, 0x7b, 0xfc, 0xd1, 0xc7, 0x17, 0x7f, 0xbe, 0xe6, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xfd, 0xe7, 0xff, 0xdf, 0x7e, 0xfd, 0xf5, 0xff, 0xff, 0xbf, 0xbf, 0xf9, 0xff, 0xfa, 0xff, 0xff, 0xbf, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xf9, 0xff, 0xbf, 0x5f, 0x7f, 0xfd, 0xfd, 0xfd, 0xbf, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xd7, 0x7f, 0xff, 0xdf, 0xff, 0xf7, 0x9b, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0x7b, 0xff, 0xfd, 0xff, 0xdf, 0xdb, 0xfe, 0xfb, 0xfb, 0xb5, 0xdf, 0xde, 0xfb, 0xbf, 0xff, 0xe6, 0xff, 0xdb, 0xef, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0x17, 0xff, 0xdf, 0xff, 0xef, 0xa7, 0xf7, 0xff, 0xaf, 0xe9, 0xff, 0xa7, 0x3f, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xaa, 0xd7, 0x5b, 0x7f, 0xfd, 0xf4, 0xd7, 0x5d, 0x7d, 0xfd, 0x6b, 0xfe, 0x3f, 0xfb, 0xf1, 0x8f, 0xcf, 0xfc, 0xf8, 0xff, 0x8f, 0x7e, 0xbc, 0xf3, 0x7f, 0x7f, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0x5b, 0xfe, 0xfe, 0xff, 0xbf, 0xef, 0xff, 0xfb, 0x5d, 0xdf, 0xfd, 0xbf, 0xff, 0xbf, 0xf7, 0xff, 0xef, 0x7f, 0xe6, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfb, 0xff, 0xbd, 0xff, 0xfd, 0xfa, 0xfd, 0xaf, 0x7f, 0xfe, 0xff, 0xfe, 0xff, 0xaf, 0xf9, 0xff, 0x7b, 0xef, 0xaf, 0xe7, 0xfe, 0xbf, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xde, 0x7e, 0x7f, 0xbf, 0xf1, 0x47, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xe7, 0xdf, 0x3d, 0xfd, 0xff, 0xfe, 0xfe, 0xfa, 0xff, 0x9b, 0xff, 0x6f, 0xbf, 0xff, 0xf8, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xdf, 0xfd, 0x71, 0xdf, 0xff, 0xff, 0xef, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xe7, 0xff, 0xf5, 0xff, 0x77, 0xff, 0xd5, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xbf, 0xef, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xed, 0xbf, 0x6e, 0xfd, 0xfb, 0xbf, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xef, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe7, 0xf9, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xa7, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3b, 0xbf, 0xff, 0x5d, 0xff, 0xfd, 0xd6, 0xd1, 0x7f, 0xff, 0xbf, 0xf1, 0xff, 0xff, 0xed, 0xdf, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf5, 0xdb, 0x3d, 0x77, 0xfd, 0xff, 0xef, 0xff, 0x67, 0xfe, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0x1b, 0xfe, 0xfc, 0xfe, 0xcb, 0x2b, 0xbb, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0x4f, 0x3f, 0xbd, 0xff, 0xeb, 0xff, 0xff, 0x3f, 0x66, 0x3f, 0xff, 0xff, 0xb2, 0xcf, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xdf, 0xdf, 0x7f, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xb7, 0xf9, 0xff, 0x6f, 0xfd, 0xb9, 0xbe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf2, 0x7e, 0xfd, 0xff, 0xbf, 0xff, 0x6f, 0xd6, 0xff, 0x9f, 0x3e, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xfd, 0x86, 0x59, 0xff, 0xff, 0xdb, 0x5f, 0x9b, 0xfb, 0xff, 0xbd, 0x56, 0x5b, 0x79, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x5e, 0xfb, 0x7f, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xef, 0x66, 0xfe, 0xff, 0xaf, 0x99, 0x77, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xca, 0xbd, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0x7f, 0xeb, 0xaf, 0xad, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf5, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xe6, 0xff, 0x13, 0xdb, 0x7f, 0xef, 0xf4, 0xff, 0xff, 0x3f, 0xfc, 0xe1, 0xfd, 0xfd, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x9b, 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xfb, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xb7, 0xdf, 0x7e, 0xfb, 0xff, 0xb7, 0xdf, 0xf6, 0xe6, 0xfd, 0x9f, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xfb, 0xcf, 0xb3, 0xff, 0xff, 0xfb, 0xef, 0xbd, 0xb1, 0x5f, 0xf3, 0xef, 0xbf, 0xff, 0xfc, 0xfb, 0xef, 0x3f, 0xff, 0xf9, 0x76, 0xdf, 0x7f, 0x8d, 0xfd, 0xf7, 0xd9, 0xf7, 0x64, 0xe6, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0x7f, 0xff, 0x3f, 0x9b, 0xfb, 0xfd, 0xfe, 0xdf, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xf7, 0xef, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xa6, 0xfe, 0x4f, 0xed, 0xb5, 0xf7, 0xc7, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xd6, 0x7f, 0xff, 0xfb, 0xff, 0xde, 0x7f, 0xfc, 0xab, 0x79, 0xf7, 0xe6, 0xbb, 0xaf, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xdd, 0x9f, 0x7f, 0x7d, 0xbb, 0xef, 0xbb, 0x7f, 0x6f, 0xfe, 0xff, 0xfe, 0xfe, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xff, 0x7e, 0x9d, 0xff, 0xff, 0xef, 0xef, 0xff, 0xee, 0xff, 0x9b, 0xff, 0xef, 0x83, 0x3f, 0xfa, 0xfc, 0xf0, 0xcf, 0x3f, 0xbf, 0xfc, 0x65, 0x9f, 0x7d, 0xfe, 0xf1, 0xe7, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0x8f, 0xb7, 0xff, 0xfe, 0xf7, 0xfd, 0x7f, 0xff, 0xf9, 0xcf, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xbe, 0xec, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, 0xeb, 0x5f, 0xf7, 0xd9, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0x9e, 0xfb, 0xef, 0x7f, 0xe7, 0xff, 0xf7, 0xff, 0xeb, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xef, 0xf9, 0xf6, 0xdf, 0x7f, 0xfe, 0xff, 0xfd, 0x9f, 0xfb, 0xdc, 0xe3, 0xf9, 0xbd, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x6f, 0xbf, 0xfd, 0xfe, 0xff, 0xff, 0xef, 0xff, 0x9e, 0xf7, 0xbf, 0x7e, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe9, 0xff, 0xaf, 0xbe, 0x7c, 0xea, 0xeb, 0xaf, 0xbd, 0xfa, 0xfa, 0xd7, 0x5b, 0x7f, 0xd5, 0xf1, 0xd7, 0x5f, 0x7e, 0xfd, 0x6b, 0xfe, 0xfe, 0xfc, 0xe0, 0xb3, 0x5d, 0xef, 0xff, 0xf3, 0xef, 0x7e, 0xff, 0xff, 0xfe, 0x17, 0xfe, 0xff, 0xf7, 0xe7, 0xff, 0x1b, 0xff, 0xeb, 0x7c, 0xfe, 0xff, 0xfb, 0xfb, 0xfb, 0x6e, 0xb7, 0xff, 0xef, 0xff, 0xff, 0xfd, 0xff, 0xfd, 0x9f, 0xfe, 0x7f, 0xe6, 0xff, 0xef, 0xfb, 0xfe, 0xff, 0xff, 0xbe, 0xee, 0xfd, 0xfe, 0xf7, 0xfe, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0x7e, 0xff, 0xaf, 0xf9, 0xff, 0xff, 0xef, 0xbf, 0xdf, 0xdf, 0xf7, 0xdf, 0xff, 0xff, 0xf3, 0x55, 0xfe, 0x9b, 0xff, 0xbf, 0xf5, 0xf6, 0xff, 0x6f, 0xf6, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xfd, 0xff, 0xdf, 0x5b, 0xaf, 0xff, 0x9b, 0xff, 0xbf, 0xbf, 0xfe, 0xf8, 0xef, 0xbf, 0xff, 0xfe, 0xff, 0xdf, 0x5f, 0xfd, 0xf8, 0xf7, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xbf, 0xff, 0xbb, 0xdf, 0xdf, 0x6b, 0xcf, 0xff, 0xff, 0xfb, 0xef, 0xfe, 0xf7, 0xff, 0xdf, 0xff, 0xdf, 0xff, 0xbf, 0xd9, 0xff, 0xf7, 0x1f, 0xef, 0xff, 0xf9, 0xf7, 0xef, 0xff, 0xbf, 0xaf, 0xff, 0xfd, 0xfe, 0xfe, 0xff, 0xdf, 0xf7, 0xee, 0x6e, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0xff, 0xff, 0xdf, 0xff, 0xde, 0xf0, 0xfb, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x9b, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xbf, 0xf7, 0xbf, 0xeb, 0xb3, 0xff, 0x7f, 0xff, 0xf9, 0xff, 0xff, 0xe6, 0xff, 0xdf, 0x3b, 0xff, 0xfc, 0xf7, 0xef, 0xff, 0xff, 0x7f, 0x77, 0xff, 0x5f, 0xff, 0x9f, 0xff, 0xf9, 0xff, 0xfe, 0xab, 0xe1, 0xff, 0xff, 0xaf, 0xd7, 0xdf, 0x7f, 0xfa, 0xff, 0xff, 0x7d, 0xed, 0xae, 0xdf, 0x7e, 0xff, 0xdf, 0xff, 0xd3, 0xff, 0x67, 0xfe, 0xff, 0xff, 0xba, 0xff, 0xfe, 0xbf, 0xff, 0xef, 0xff, 0xd7, 0xff, 0xff, 0xf7, 0xde, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xfe, 0xbf, 0xfd, 0xf7, 0xdf, 0xbf, 0xff, 0xff, 0xff, 0xea, 0x97, 0xff, 0xe7, 0xf9, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0x66, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfb, 0xf5, 0xdf, 0xd9, 0xff, 0xef, 0xfd, 0xf7, 0xdf, 0xff, 0xb7, 0xf9, 0x5f, 0x7b, 0xfe, 0xa9, 0x97, 0xca, 0x77, 0xfe, 0xaf, 0x71, 0xfd, 0x3f, 0xde, 0xde, 0x2f, 0x3f, 0xff, 0xd4, 0xff, 0x6f, 0xd6, 0xbf, 0xdf, 0x3f, 0xeb, 0xad, 0xf3, 0xcf, 0xfe, 0xfb, 0xdd, 0xef, 0xff, 0xfd, 0xdf, 0x7b, 0xe7, 0x9f, 0xf7, 0x5f, 0x9b, 0xfb, 0xbf, 0xcb, 0xff, 0xdf, 0x6a, 0xff, 0x96, 0xff, 0xba, 0xbc, 0x65, 0xb7, 0xfd, 0x7c, 0xd9, 0x4c, 0x7b, 0xcd, 0xee, 0x66, 0xfe, 0xfb, 0xf7, 0xbe, 0xf7, 0xda, 0xbf, 0xf7, 0x97, 0xfb, 0xdd, 0x1f, 0xcb, 0x97, 0xf5, 0xbc, 0xda, 0x4c, 0xfb, 0xb3, 0xb1, 0xff, 0xfa, 0x6a, 0xaf, 0xf3, 0xff, 0xfd, 0xda, 0xaf, 0xff, 0xbb, 0xf7, 0xdf, 0x58, 0x5f, 0xbf, 0xfe, 0xd7, 0xff, 0x66, 0xee, 0xff, 0xff, 0xfa, 0x6f, 0xfd, 0xfd, 0xcf, 0xfe, 0x7b, 0xff, 0xcf, 0xf9, 0xef, 0xd7, 0x7f, 0xfb, 0xff, 0xf5, 0xbf, 0x9b, 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xfc, 0xbf, 0xff, 0x6f, 0xbf, 0xbd, 0xf7, 0xb7, 0xdb, 0x7f, 0xfe, 0xed, 0xb7, 0x9f, 0xf7, 0xe6, 0xfd, 0xbf, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0x79, 0xf7, 0x97, 0xdf, 0x3f, 0xfb, 0xbe, 0x3f, 0xff, 0xfe, 0xfe, 0xcb, 0xbd, 0xb1, 0xff, 0x7b, 0xed, 0xbb, 0xcf, 0x7e, 0x7b, 0xed, 0xbe, 0xdf, 0xf1, 0xd7, 0xd9, 0x7f, 0xbf, 0x7d, 0xf7, 0xdf, 0xff, 0x66, 0xe6, 0xdf, 0x7f, 0xff, 0xff, 0xf3, 0xdb, 0xff, 0xff, 0xbf, 0xf3, 0xff, 0xdf, 0xfe, 0xfb, 0xe7, 0xbf, 0xf7, 0xde, 0x3f, 0x9b, 0xfb, 0xfe, 0xef, 0xff, 0xff, 0xfe, 0xbb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xbf, 0xff, 0xfd, 0xfb, 0xf7, 0xff, 0xef, 0xa6, 0xfe, 0xff, 0xbf, 0xbf, 0xf7, 0xfe, 0xbf, 0xff, 0xbf, 0xf6, 0xdf, 0x3f, 0xef, 0xfd, 0xff, 0xfd, 0xfe, 0xdf, 0xff, 0xab, 0x79, 0xff, 0xaa, 0xbf, 0xef, 0xf6, 0xfa, 0xe7, 0xfb, 0xaf, 0x7e, 0xf3, 0xcf, 0xbf, 0xdf, 0xfe, 0xf5, 0xdf, 0x7e, 0x7f, 0x6f, 0xfe, 0xff, 0xdf, 0xbf, 0xeb, 0xed, 0xff, 0x5d, 0xfe, 0xff, 0xfd, 0x7e, 0xf9, 0xe5, 0xd3, 0x7b, 0x77, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xaf, 0xcf, 0x1f, 0xfa, 0xec, 0xf3, 0x83, 0x3f, 0xbf, 0xf4, 0x47, 0x1f, 0x7d, 0xf4, 0xf1, 0x67, 0x1f, 0x7f, 0xfe, 0xe6, 0xff, 0xef, 0xf7, 0xdf, 0x7e, 0xfb, 0xdd, 0x74, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xfc, 0xbd, 0xbf, 0x3f, 0xff, 0xfa, 0xff, 0x6f, 0x7f, 0xff, 0xf9, 0xff, 0xff, 0xfd, 0xf7, 0xf7, 0xff, 0x6f, 0xfe, 0xdf, 0xbe, 0xff, 0xff, 0xbf, 0xef, 0xfd, 0xf7, 0xff, 0xea, 0xdf, 0x7f, 0xf5, 0xd7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xfd, 0xd7, 0x5f, 0x7b, 0xff, 0xfd, 0xfd, 0xdf, 0xf7, 0xfe, 0x6b, 0xfb, 0xfd, 0xf7, 0xfe, 0xfb, 0xef, 0xff, 0xe6, 0xff, 0xfb, 0xff, 0xbf, 0xfd, 0xff, 0xdb, 0xef, 0xbf, 0xfd, 0xfc, 0x17, 0x97, 0x7e, 0xaa, 0xdf, 0x37, 0xff, 0xde, 0xbf, 0xe9, 0xff, 0x8f, 0xbf, 0xfe, 0xfa, 0xeb, 0xad, 0xb5, 0xfe, 0x6a, 0x97, 0x5f, 0x76, 0xf5, 0xb5, 0xd7, 0x5f, 0x7f, 0xfc, 0x6f, 0xfe, 0x7f, 0xfb, 0xff, 0x33, 0xfb, 0xbe, 0xec, 0xf3, 0x23, 0xff, 0xbd, 0xf6, 0xff, 0xef, 0xff, 0x7f, 0xf6, 0xdd, 0xef, 0x1b, 0xff, 0xff, 0xdf, 0xed, 0xff, 0xff, 0xbf, 0xbf, 0xde, 0xfb, 0xfd, 0xff, 0xbf, 0xcf, 0xde, 0xfd, 0xff, 0xff, 0xfb, 0xfd, 0xe6, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xf9, 0xfe, 0xff, 0xaf, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xbf, 0xf9, 0xdf, 0xfa, 0xeb, 0xbd, 0xbf, 0xdc, 0xff, 0xeb, 0xbf, 0xff, 0xcf, 0xf7, 0xf7, 0x5b, 0xbe, 0xbf, 0xf7, 0xd7, 0xf7, 0x67, 0xfe, 0xff, 0xfd, 0xbb, 0x7f, 0x9f, 0xfb, 0xff, 0xf6, 0xf6, 0xfe, 0xf7, 0xdf, 0xcf, 0xb5, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0x99, 0xff, 0xef, 0xaf, 0xff, 0xfe, 0xe7, 0x9f, 0xff, 0xff, 0x7f, 0xfe, 0x5f, 0xff, 0xff, 0xf3, 0xdf, 0xdf, 0x7f, 0xdf, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xfe, 0x7b, 0xaf, 0xff, 0xfb, 0xef, 0xe7, 0xfe, 0x7f, 0xf7, 0x79, 0xff, 0xf7, 0xff, 0x9f, 0xf9, 0xff, 0x6f, 0xff, 0xff, 0x9f, 0x7f, 0x7e, 0xff, 0xff, 0x9f, 0xff, 0xb7, 0x7d, 0xde, 0x6f, 0xff, 0xff, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0x7f, 0xfc, 0xd7, 0xdf, 0x3b, 0xfa, 0xff, 0xf3, 0xbf, 0xeb, 0xf7, 0xf9, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0x3f, 0xdf, 0xfb, 0xf7, 0xbf, 0xff, 0xff, 0xd6, 0x5f, 0xef, 0x5f, 0x7d, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xdf, 0xaf, 0xff, 0xfe, 0xf3, 0xef, 0xb7, 0xff, 0xdf, 0xf7, 0xfb, 0xf7, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xf1, 0xff, 0xff, 0xef, 0xb7, 0x7e, 0xff, 0x5d, 0xef, 0xf7, 0xff, 0xb4, 0x9f, 0x9e, 0x5c, 0x5b, 0xfd, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xfd, 0xf3, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xdf, 0x7f, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0x7e, 0x9e, 0xfc, 0xe7, 0x9c, 0xdf, 0x3f, 0xff, 0xac, 0xb7, 0xfc, 0xf7, 0xeb, 0x7c, 0xfd, 0x3f, 0x66, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0x7f, 0xfd, 0xef, 0xe5, 0xff, 0xef, 0x7f, 0xeb, 0xcf, 0xfd, 0x77, 0xfe, 0xff, 0xff, 0xb7, 0xf9, 0x9f, 0xfa, 0xff, 0xf5, 0xe7, 0xcb, 0x57, 0xda, 0xff, 0xff, 0xfb, 0xff, 0x14, 0xf3, 0x4f, 0xfd, 0x5f, 0xfe, 0xff, 0x6f, 0xd6, 0xb7, 0xfe, 0x3d, 0xff, 0xff, 0xf3, 0x9d, 0xec, 0xff, 0xbf, 0xff, 0x3f, 0xf1, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0x5f, 0x9b, 0xfb, 0xab, 0xfd, 0xff, 0xb6, 0xfd, 0xf5, 0x97, 0x5f, 0xdf, 0x3f, 0x7f, 0xff, 0x43, 0xec, 0xdd, 0xef, 0x7f, 0xcd, 0xee, 0x66, 0xfe, 0x6b, 0x7f, 0xff, 0x5a, 0xef, 0xbf, 0x67, 0xda, 0xff, 0xff, 0x5f, 0xdf, 0xbf, 0xfb, 0xfc, 0xfd, 0xff, 0xab, 0xb3, 0xb1, 0xff, 0xff, 0xff, 0xf5, 0x7f, 0xdf, 0x7d, 0xd8, 0xf5, 0xfe, 0xef, 0xf7, 0xd6, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x66, 0xee, 0xff, 0xff, 0xf7, 0xdf, 0xfd, 0xe7, 0xcf, 0x7e, 0x7f, 0xfc, 0xaf, 0x7d, 0x97, 0xfe, 0x5f, 0xff, 0xff, 0xff, 0xbf, 0x9b, 0xf7, 0xff, 0xff, 0x6f, 0xff, 0xee, 0xbb, 0xff, 0x2f, 0xf7, 0xbf, 0xf9, 0xff, 0x7b, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xe6, 0xfd, 0xff, 0x7f, 0xf7, 0xdd, 0xff, 0xff, 0x79, 0xf7, 0xf9, 0xef, 0xfc, 0xff, 0xec, 0xf3, 0xde, 0xfa, 0xff, 0xfb, 0xbd, 0xb1, 0xff, 0xfb, 0xed, 0x33, 0xdb, 0x76, 0x7b, 0xed, 0x3e, 0xde, 0xf9, 0xb7, 0x9f, 0x67, 0xad, 0x3d, 0xf6, 0xdb, 0xff, 0x66, 0xe6, 0xdf, 0x3f, 0xff, 0xfc, 0xf3, 0xdb, 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0x7f, 0xfb, 0xff, 0xbf, 0xdf, 0xdf, 0x3f, 0x9b, 0xfb, 0xfb, 0xf7, 0xdf, 0xbf, 0xef, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xa6, 0x7e, 0xfb, 0x2f, 0x96, 0xfb, 0xef, 0xbf, 0xef, 0xfe, 0xd1, 0xe7, 0xff, 0x7f, 0xb9, 0xb1, 0xf5, 0xff, 0x7b, 0xff, 0xab, 0x79, 0xff, 0xeb, 0xcb, 0xff, 0xff, 0xf9, 0xe7, 0xfb, 0xff, 0xfe, 0xfb, 0xee, 0x1e, 0xed, 0x6c, 0xd7, 0xee, 0x77, 0x7f, 0x6f, 0xfe, 0xbf, 0xff, 0xeb, 0xcf, 0xff, 0xde, 0xfd, 0xbf, 0xdf, 0xf7, 0xff, 0xff, 0xef, 0xfa, 0x5d, 0xf7, 0xff, 0x77, 0xff, 0x9b, 0xff, 0xbf, 0xcf, 0x3f, 0xfa, 0xfc, 0xf3, 0x8f, 0x3d, 0xff, 0xfc, 0xe3, 0x9f, 0x7f, 0x6e, 0xd8, 0xe7, 0x1f, 0x7f, 0xfe, 0xe6, 0xff, 0xfb, 0xbf, 0xbf, 0xf9, 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xcf, 0x1a, 0xff, 0xff, 0x9f, 0xfe, 0xdf, 0x4f, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xfd, 0xfd, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xbf, 0xfd, 0xff, 0xf7, 0x7f, 0xff, 0xbd, 0xff, 0xdf, 0xbf, 0xdb, 0xfe, 0xef, 0x3f, 0xf6, 0xde, 0x6f, 0xed, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf7, 0xd3, 0xeb, 0xff, 0xff, 0xff, 0x97, 0x9f, 0x7a, 0xf1, 0xe5, 0x7f, 0xff, 0xfe, 0xbf, 0xe9, 0xff, 0xaf, 0xbf, 0xfa, 0xfa, 0xeb, 0xae, 0xb7, 0xfe, 0xf0, 0x13, 0x5f, 0x6f, 0xfd, 0xf5, 0x97, 0x5f, 0x7f, 0xfd, 0x6b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xfc, 0xfc, 0x7f, 0xef, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0x1b, 0xff, 0xff, 0xef, 0x7f, 0xdf, 0xfb, 0xfa, 0x9b, 0xab, 0xf7, 0x75, 0x7f, 0xf7, 0xf3, 0xdf, 0xfd, 0xff, 0xdf, 0xbf, 0x7f, 0xe6, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xbf, 0xbf, 0xce, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xf9, 0xff, 0xef, 0xfb, 0xaf, 0xff, 0xde, 0x78, 0xe3, 0xff, 0x7f, 0xbd, 0xd5, 0xf7, 0xdf, 0xfe, 0xf9, 0x55, 0x5f, 0xff, 0x6f, 0xfe, 0xff, 0x77, 0xf7, 0xdb, 0xef, 0x5f, 0xbf, 0xbd, 0xbe, 0xbf, 0xfe, 0xba, 0xef, 0x5d, 0xdf, 0xf7, 0xfc, 0xfd, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xef, 0xff, 0x8f, 0x7f, 0xfd, 0xff, 0xd7, 0xfb, 0xff, 0xff, 0xfb, 0xb3, 0xfe, 0x6f, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xfa, 0xfd, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xbd, 0xbf, 0xdf, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xb9, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xee, 0xff, 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xfe, 0xef, 0xff, 0xaf, 0xbf, 0xff, 0x6e, 0xfe, 0x7f, 0x3f, 0xe8, 0xff, 0xff, 0x7f, 0xbf, 0xef, 0xfb, 0xbd, 0xff, 0xfa, 0xfb, 0x7d, 0x9f, 0x7f, 0xfe, 0xfb, 0xff, 0x9b, 0xfb, 0x7f, 0xff, 0xdd, 0xef, 0xbf, 0x7f, 0xfb, 0xff, 0x9e, 0x6f, 0xbf, 0xf7, 0xfe, 0xff, 0xb7, 0x7f, 0xfd, 0xfd, 0xef, 0xe6, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xfa, 0xef, 0xbf, 0xde, 0xfe, 0x37, 0xfd, 0xea, 0x77, 0xd9, 0xef, 0xaf, 0xff, 0xfe, 0xbf, 0xf1, 0xff, 0xff, 0x7f, 0xbf, 0xfe, 0x7e, 0xf9, 0xef, 0x1e, 0xff, 0xfd, 0xef, 0xff, 0x6b, 0xbb, 0xe3, 0xbe, 0xdf, 0xff, 0x67, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0x7e, 0xfa, 0xed, 0x9f, 0xf7, 0xff, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xd7, 0xfb, 0x1b, 0xfe, 0xff, 0xf0, 0xff, 0xef, 0xef, 0x39, 0xfc, 0xff, 0xcb, 0x7f, 0x7f, 0xfd, 0xf7, 0xfd, 0x57, 0xff, 0x7d, 0xf7, 0xbf, 0x66, 0xff, 0xdf, 0xe5, 0xd7, 0xf7, 0x7f, 0xf9, 0xff, 0xff, 0xfd, 0xef, 0xb7, 0x5f, 0x7d, 0xff, 0xf5, 0xbf, 0xdf, 0xfa, 0xb7, 0xf9, 0x9f, 0x5e, 0x5e, 0x65, 0xe6, 0xf7, 0xe3, 0xff, 0xbf, 0x7f, 0xff, 0xf7, 0xbf, 0xd3, 0x67, 0xf1, 0xe5, 0xf7, 0xf9, 0x6f, 0xd6, 0xe7, 0xde, 0x75, 0xf2, 0xf9, 0xbf, 0xff, 0xfd, 0xff, 0x7c, 0x7f, 0x9f, 0x61, 0xf6, 0x3f, 0x67, 0xf4, 0xfd, 0x5c, 0x99, 0xfb, 0x7f, 0xed, 0xf5, 0xc7, 0xef, 0x3f, 0xfe, 0xfd, 0xfa, 0xdf, 0x6b, 0xab, 0xab, 0xfc, 0x13, 0x4a, 0xfb, 0xfd, 0xef, 0x66, 0xfe, 0x9f, 0x66, 0xd6, 0xf9, 0xaf, 0xd9, 0x7f, 0xbf, 0xff, 0x7d, 0x73, 0x5f, 0x3b, 0x5f, 0xd4, 0xd3, 0x7e, 0xfd, 0x93, 0xb1, 0xff, 0x7e, 0xff, 0xef, 0xd7, 0xfe, 0xf9, 0xff, 0xaf, 0x7f, 0xfd, 0x97, 0xfa, 0x56, 0x2f, 0x2d, 0xef, 0xde, 0xff, 0x66, 0xee, 0xff, 0x12, 0x4f, 0x39, 0xb5, 0xbf, 0xcf, 0xff, 0x7b, 0x5f, 0x7b, 0xef, 0xb5, 0xff, 0x6a, 0xd9, 0x6f, 0xb7, 0xbf, 0x99, 0xf7, 0x7f, 0xdb, 0xfd, 0x37, 0xff, 0x7e, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xfe, 0xdf, 0x7f, 0xbf, 0xff, 0xf6, 0xdf, 0x76, 0xe6, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0x7f, 0xfd, 0xfd, 0xe7, 0xfb, 0xdf, 0x3b, 0xff, 0xbc, 0xf7, 0xce, 0xbe, 0xeb, 0xcf, 0xbd, 0xb1, 0xff, 0xe3, 0xcf, 0x37, 0xff, 0x3e, 0xbb, 0xef, 0xb7, 0xff, 0xfd, 0xc7, 0x1f, 0x7f, 0xaf, 0xd9, 0x66, 0xdb, 0xab, 0x6e, 0xe6, 0xff, 0x7f, 0xbf, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xf7, 0xdf, 0xfe, 0x3f, 0x9b, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xbe, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0x7d, 0xff, 0xf7, 0xff, 0xed, 0xe6, 0xfe, 0x3f, 0xef, 0xdf, 0xfe, 0xfe, 0xdf, 0x3f, 0xff, 0xf6, 0xb5, 0xbf, 0x7e, 0xf8, 0xef, 0xd5, 0x7f, 0xff, 0xfb, 0xbb, 0x61, 0xdf, 0xe7, 0x8f, 0x7d, 0xfe, 0x7c, 0xe7, 0xcd, 0xbf, 0x7a, 0xd5, 0xcf, 0x37, 0x5f, 0x75, 0xf3, 0xc5, 0x5f, 0x7f, 0x6f, 0xee, 0xff, 0xda, 0xfe, 0xff, 0xfe, 0xdf, 0xff, 0x7a, 0xef, 0xdf, 0xe7, 0xff, 0xef, 0xdf, 0xff, 0xbe, 0xf7, 0xff, 0xff, 0x9b, 0xfb, 0xbe, 0xcf, 0x3e, 0xff, 0xfc, 0xf3, 0xcf, 0x2e, 0xfb, 0xf4, 0xe7, 0x9f, 0x7f, 0xfc, 0xf1, 0xe5, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xdf, 0xbf, 0xff, 0xfe, 0xf7, 0x3f, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xbf, 0xe1, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe, 0xf7, 0xef, 0xeb, 0xff, 0xfd, 0xff, 0xff, 0x5f, 0x7f, 0x5f, 0xf5, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xbb, 0xef, 0xef, 0xff, 0xff, 0xff, 0xdf, 0x7f, 0x7e, 0xfd, 0xff, 0xff, 0x9b, 0xfb, 0xbf, 0xfd, 0xf5, 0xd7, 0xef, 0xff, 0xfd, 0xef, 0xde, 0xfb, 0xfe, 0xfb, 0xef, 0xbd, 0xf7, 0x5c, 0x7b, 0xef, 0xff, 0xe6, 0xff, 0xff, 0x6f, 0xbf, 0xfd, 0xf2, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xdf, 0x7e, 0xfb, 0xe7, 0xff, 0xdf, 0xfd, 0xb7, 0xf9, 0xff, 0xaf, 0x37, 0xfe, 0x7a, 0xeb, 0x2f, 0xbd, 0xf6, 0xf2, 0xd7, 0x5f, 0x7e, 0xdd, 0xf5, 0x97, 0x5f, 0x77, 0xfd, 0x6f, 0xee, 0xff, 0x6f, 0xf2, 0x83, 0xf5, 0xfb, 0xfc, 0xf3, 0xfb, 0xff, 0xed, 0xfb, 0xc1, 0x73, 0xfe, 0xfe, 0xab, 0xdf, 0xef, 0x1b, 0xff, 0xff, 0xf7, 0xb3, 0x6f, 0xff, 0x9b, 0x6f, 0xb6, 0x7f, 0xbf, 0xbf, 0xbf, 0xfe, 0xff, 0xf7, 0xb5, 0xe7, 0x7f, 0xdd, 0xe6, 0xff, 0x7f, 0xaf, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfb, 0xaf, 0xea, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0x2f, 0xfe, 0xdf, 0x58, 0xeb, 0xbf, 0xfe, 0xfd, 0xef, 0xd6, 0xfd, 0x7f, 0xfd, 0xfd, 0xd3, 0xff, 0x63, 0xfe, 0xff, 0x7f, 0xef, 0xef, 0xf3, 0xbd, 0xbf, 0x77, 0xfb, 0xf7, 0xdf, 0xff, 0xef, 0xfd, 0x7f, 0xff, 0xfd, 0xed, 0xff, 0x99, 0xff, 0xff, 0x7f, 0xde, 0xbe, 0x7f, 0xff, 0xbf, 0xef, 0xfb, 0x33, 0xff, 0x77, 0xff, 0xe7, 0xd6, 0xfe, 0xff, 0x7f, 0xff, 0xe6, 0xff, 0x7f, 0xaf, 0xbf, 0xfc, 0xef, 0xfd, 0xff, 0x37, 0xfe, 0xad, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0xf5, 0x8f, 0xf9, 0xff, 0xdf, 0xfe, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xed, 0xff, 0x7f, 0xff, 0x3a, 0xfb, 0xb7, 0xf7, 0xf5, 0x6f, 0xfe, 0xff, 0xfb, 0xdf, 0xdf, 0xaf, 0x73, 0xeb, 0xff, 0xf3, 0xff, 0xf7, 0xf3, 0xf4, 0xe5, 0x1e, 0xfc, 0xf7, 0xff, 0xfe, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xdf, 0xde, 0xef, 0xfa, 0xfe, 0xfb, 0xff, 0xf7, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xe6, 0xff, 0xbf, 0xbf, 0xff, 0xfe, 0xfb, 0xae, 0xbf, 0xdf, 0xfe, 0xe5, 0xdf, 0xeb, 0xdd, 0xff, 0xf5, 0xfe, 0xeb, 0xfe, 0xbf, 0xf1, 0xff, 0xdf, 0x6b, 0xb7, 0xbb, 0xfe, 0xff, 0xed, 0x9f, 0x7b, 0xfd, 0xfe, 0xff, 0xfe, 0xbe, 0xfd, 0x97, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfe, 0xeb, 0xef, 0xbf, 0xef, 0xfa, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0x7f, 0xfb, 0x1b, 0xfe, 0xef, 0xbf, 0xff, 0x0b, 0xbf, 0x7f, 0xfe, 0xf9, 0xef, 0xff, 0xf9, 0xfd, 0x97, 0xb5, 0x77, 0xca, 0x64, 0xf7, 0x3f, 0x66, 0xff, 0xfb, 0xef, 0xa7, 0x9f, 0xff, 0xbf, 0xff, 0xf2, 0xff, 0xff, 0xfc, 0xff, 0xe6, 0xed, 0xe5, 0xdf, 0xf3, 0xff, 0xb7, 0xf9, 0xff, 0xfe, 0xfb, 0xbf, 0xfc, 0x5b, 0xde, 0xff, 0xff, 0xe6, 0x3d, 0xdf, 0xd4, 0xf9, 0xcf, 0xfd, 0xdf, 0x5c, 0xff, 0x6f, 0xd6, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x73, 0xff, 0xff, 0xff, 0xdd, 0xe7, 0xbf, 0xf5, 0xe4, 0xf3, 0xe7, 0xbf, 0xf5, 0x5f, 0x9b, 0xfb, 0xef, 0xbf, 0x67, 0x97, 0xfd, 0xff, 0xff, 0xff, 0xda, 0xd6, 0xff, 0x5b, 0xed, 0xad, 0xdf, 0x4c, 0x97, 0xed, 0xef, 0x66, 0xfe, 0xbb, 0xef, 0xfd, 0xf9, 0xf7, 0x9b, 0xf5, 0xbf, 0xf2, 0x75, 0xfb, 0x4c, 0x7b, 0xe9, 0x3f, 0x53, 0xef, 0xb3, 0xb3, 0xb1, 0xff, 0xfe, 0xeb, 0xff, 0xf3, 0xff, 0xd6, 0x7f, 0x8c, 0xf5, 0x9d, 0xff, 0xff, 0x7f, 0x67, 0xff, 0xf7, 0xf5, 0xff, 0x66, 0xee, 0xbf, 0xff, 0x1f, 0x3f, 0xff, 0xbf, 0xff, 0x3f, 0x6b, 0xd1, 0x63, 0xef, 0xbf, 0xff, 0x58, 0x7b, 0xff, 0xb5, 0xbf, 0x9b, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xf3, 0xef, 0xb7, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xff, 0xf9, 0xe7, 0x9f, 0xf7, 0xe6, 0xdd, 0xff, 0xff, 0xff, 0xdf, 0x67, 0xfe, 0xfd, 0xd7, 0x59, 0xdf, 0xfe, 0xff, 0xff, 0x3f, 0xff, 0xfe, 0xf3, 0xcf, 0xad, 0xb1, 0xff, 0x7b, 0xed, 0x3f, 0xc7, 0x7a, 0xf3, 0xec, 0x36, 0xee, 0xdd, 0xf7, 0xdf, 0x6f, 0xaf, 0x7d, 0xf7, 0xdf, 0xff, 0x62, 0xe6, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xdb, 0x6f, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xf9, 0xef, 0xff, 0xff, 0xfe, 0x3f, 0x9b, 0xfb, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xef, 0xfb, 0xff, 0xff, 0xdf, 0x7f, 0x7f, 0xff, 0xff, 0xef, 0xff, 0xef, 0xa6, 0xfe, 0xff, 0xaf, 0x9d, 0xfb, 0xd6, 0xff, 0xbf, 0xdf, 0xf1, 0xb7, 0xf7, 0xda, 0xfb, 0xe5, 0xb7, 0xdf, 0xdf, 0xfb, 0xab, 0x79, 0xff, 0x7f, 0xbf, 0x6f, 0xbe, 0xf8, 0xff, 0xdf, 0x7f, 0xfe, 0xd5, 0xdd, 0x5f, 0xdf, 0x7d, 0xf7, 0xe7, 0x7f, 0x7f, 0x6f, 0xfe, 0xff, 0xff, 0xba, 0xdf, 0xaf, 0xff, 0xdf, 0x7b, 0xbf, 0x5f, 0x6f, 0xfd, 0xfd, 0xf7, 0x7f, 0xff, 0x9f, 0x77, 0xff, 0x9b, 0xff, 0xff, 0xc7, 0x3f, 0xff, 0xe8, 0xf2, 0xcf, 0x3f, 0x3f, 0xd4, 0x45, 0x8f, 0x7d, 0xe6, 0xf1, 0xe7, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0xff, 0xb5, 0xbf, 0xf9, 0xfa, 0xfd, 0x3f, 0xfe, 0x7d, 0xf7, 0xdf, 0xcf, 0x7f, 0xff, 0xf5, 0x9f, 0x7f, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xec, 0xef, 0xbf, 0x3e, 0xfe, 0xef, 0xff, 0xeb, 0x7d, 0xf7, 0xd9, 0x7f, 0xff, 0xff, 0xf7, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xbf, 0xfb, 0xff, 0xaf, 0xab, 0xff, 0xff, 0xdf, 0xe9, 0xd7, 0x3f, 0xfd, 0xdf, 0xdf, 0x7f, 0xf9, 0xfd, 0xff, 0x9b, 0xff, 0xff, 0xfb, 0xf6, 0xd7, 0x6b, 0xac, 0xff, 0xfd, 0x9f, 0xfb, 0xfc, 0xe3, 0xed, 0xbd, 0xdf, 0x5e, 0x7e, 0xed, 0xff, 0xe6, 0xff, 0xd7, 0xef, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xfd, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xfb, 0xfd, 0xff, 0x7f, 0xfe, 0xbf, 0xe9, 0xff, 0xaf, 0xbb, 0xfe, 0xfa, 0xeb, 0xad, 0xbf, 0xfe, 0xfa, 0x97, 0x5f, 0x3f, 0xf5, 0x75, 0xd7, 0x5f, 0x7f, 0xf9, 0x6b, 0xfe, 0xfd, 0xff, 0xff, 0x3d, 0x3f, 0xba, 0xed, 0xf3, 0x8d, 0xff, 0x3d, 0xf6, 0xff, 0xf5, 0xfd, 0xbf, 0xd9, 0x7f, 0xff, 0x1b, 0xff, 0xff, 0xdb, 0xed, 0xef, 0xf7, 0xdb, 0x9f, 0xfd, 0xfa, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbb, 0xef, 0xff, 0x7f, 0xe6, 0xfe, 0x7f, 0xff, 0xff, 0xbf, 0xeb, 0xff, 0xdf, 0xfb, 0xff, 0x5f, 0xfd, 0xff, 0xfb, 0xef, 0xff, 0x5b, 0xfd, 0xfd, 0xbf, 0xf9, 0x7f, 0xff, 0xf3, 0xff, 0xbd, 0x8e, 0x5f, 0xff, 0x0f, 0xff, 0x7d, 0xf7, 0xfa, 0x7f, 0x6f, 0xe5, 0xf5, 0xd7, 0xfb, 0x6f, 0xfe, 0xff, 0x7f, 0xef, 0xff, 0xba, 0xdf, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x7f, 0x77, 0xfd, 0xed, 0x7d, 0x9b, 0xbf, 0xfd, 0xff, 0xff, 0x79, 0xfb, 0x7e, 0xed, 0xdf, 0xa9, 0xf7, 0x1f, 0xff, 0xed, 0x73, 0xf5, 0xfb, 0xcf, 0xff, 0xff, 0xe6, 0x7f, 0x7f, 0x7b, 0xbb, 0xff, 0x72, 0xfb, 0x2f, 0xff, 0xff, 0xef, 0xff, 0x9e, 0x7f, 0xfb, 0xff, 0x7f, 0xfd, 0xff, 0xb7, 0xb9, 0xff, 0xff, 0xff, 0xb5, 0xfb, 0xff, 0x5e, 0xff, 0xff, 0xae, 0xc7, 0xff, 0xdf, 0x7b, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0x6b, 0xee, 0xff, 0xff, 0xfd, 0xdf, 0x7f, 0xfa, 0xef, 0xef, 0xf3, 0xfa, 0x7f, 0xfe, 0xf9, 0xd7, 0xfd, 0xfb, 0x76, 0xf1, 0xff, 0x9b, 0xfb, 0xff, 0xfd, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x7c, 0xfd, 0xfb, 0xee, 0xfd, 0xff, 0xfd, 0xaf, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xeb, 0xff, 0xbd, 0xfe, 0xbf, 0xff, 0xa6, 0xcb, 0xef, 0xff, 0x8f, 0xaf, 0xbe, 0x55, 0xff, 0x5f, 0x4f, 0xff, 0xbf, 0xf1, 0xef, 0xfb, 0xdd, 0xff, 0xdf, 0xff, 0xda, 0xef, 0xff, 0xf6, 0x7f, 0xd6, 0x7f, 0x3f, 0xbb, 0xfb, 0x2f, 0xdf, 0xff, 0x67, 0x7e, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x3f, 0xfd, 0xff, 0x6f, 0xff, 0x7f, 0xf7, 0xf7, 0xff, 0x1b, 0xfe, 0xff, 0xd7, 0xca, 0x0f, 0xaf, 0xf9, 0xe7, 0xf9, 0x3a, 0x3f, 0x5f, 0x7f, 0xb5, 0x7c, 0x56, 0xeb, 0xe1, 0xf5, 0xbf, 0x66, 0xff, 0xff, 0xec, 0xe7, 0x5f, 0x6e, 0xed, 0xf9, 0xbd, 0xfe, 0x9f, 0xd7, 0x5f, 0x4e, 0x3d, 0xf5, 0xbf, 0x72, 0xff, 0xb7, 0xf9, 0xff, 0x3f, 0x3f, 0xaf, 0x96, 0xff, 0xfe, 0xbf, 0xaf, 0xff, 0x3b, 0xf5, 0xd2, 0xdf, 0xff, 0x35, 0xf7, 0x5f, 0xea, 0x6f, 0xd6, 0xff, 0xdf, 0xff, 0xeb, 0xbf, 0xb7, 0xfe, 0x3f, 0xeb, 0xbf, 0x4e, 0xfd, 0xfd, 0xd7, 0xdf, 0xe7, 0xfd, 0x7d, 0x5e, 0x99, 0xfb, 0xff, 0xef, 0xf6, 0xbf, 0x69, 0xe1, 0xbf, 0xfe, 0xdb, 0xbf, 0x5f, 0x33, 0xcd, 0x3e, 0xfb, 0x5e, 0xff, 0xbd, 0xee, 0x66, 0xfe, 0xff, 0xef, 0x96, 0x5f, 0x6f, 0xa9, 0xa7, 0xbe, 0x6a, 0xff, 0x57, 0x5f, 0x7d, 0xf7, 0x5e, 0x5b, 0x6f, 0xb4, 0x93, 0xb1, 0xff, 0x7f, 0x7d, 0xaf, 0xff, 0xfb, 0xfe, 0xea, 0xaf, 0xf2, 0xbf, 0xfc, 0x57, 0xfb, 0x8b, 0xb9, 0xf6, 0xdd, 0xff, 0x66, 0xee, 0xff, 0xff, 0x0f, 0x6f, 0xaf, 0xbd, 0xfe, 0x3a, 0xeb, 0xf5, 0x2f, 0xf5, 0xb5, 0x70, 0xde, 0xa8, 0xed, 0xed, 0xbf, 0x99, 0xf7, 0xff, 0xdb, 0xfd, 0xbf, 0xdd, 0xff, 0xfb, 0xcf, 0xb7, 0xff, 0xed, 0xfe, 0xdf, 0x6e, 0xbe, 0xff, 0xff, 0x9f, 0x77, 0xe6, 0xfd, 0xff, 0x7f, 0xf6, 0xdb, 0x67, 0xfe, 0xf1, 0xff, 0x19, 0xff, 0x3f, 0xf3, 0xef, 0xf3, 0xdf, 0xff, 0xf3, 0xec, 0xbd, 0xa1, 0x5f, 0x7b, 0xcd, 0xbb, 0xc7, 0x78, 0xdb, 0xef, 0x3f, 0xd6, 0xfd, 0xe7, 0xdb, 0x69, 0xba, 0xa9, 0xf6, 0x5b, 0xbd, 0x6e, 0xe6, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdb, 0x7f, 0xff, 0xbd, 0xf7, 0xbf, 0xdf, 0xfe, 0xfb, 0xfd, 0xff, 0xdf, 0xfe, 0x3f, 0x9b, 0x7b, 0xfb, 0xf7, 0xbb, 0x7f, 0xff, 0xfd, 0xef, 0xef, 0xff, 0xfe, 0xfb, 0xed, 0xdf, 0xdf, 0x7f, 0xff, 0xdf, 0xff, 0xed, 0xe6, 0xfe, 0xeb, 0x6f, 0xbc, 0xf7, 0x46, 0xff, 0xaf, 0xff, 0xf9, 0xed, 0x97, 0x7f, 0x7b, 0xe1, 0xdc, 0xdf, 0xff, 0xf8, 0xbb, 0x61, 0xff, 0xf6, 0x8d, 0xad, 0xfa, 0xf8, 0xf7, 0xcb, 0x7f, 0xde, 0xf9, 0xc5, 0x5e, 0x5b, 0xbc, 0xf1, 0xcf, 0x3b, 0x7f, 0x6f, 0xfe, 0xbf, 0xde, 0xf7, 0xef, 0xbf, 0x9e, 0xfe, 0xba, 0xcf, 0xfd, 0x3f, 0xfd, 0xfd, 0xd2, 0xdb, 0xfd, 0xff, 0xe7, 0xff, 0x9b, 0xff, 0xaf, 0xcb, 0x3f, 0xff, 0xf8, 0xa0, 0xcf, 0x3e, 0xbf, 0xfc, 0x47, 0x07, 0x7f, 0xe4, 0xd9, 0xe7, 0x1f, 0x7f, 0xfe, 0xe6, 0xbf, 0x8b, 0x6f, 0xbe, 0xfe, 0xfe, 0xef, 0x2f, 0xfe, 0xf9, 0xcf, 0x97, 0x7f, 0x7c, 0xf9, 0xe7, 0xff, 0x7f, 0xff, 0xbf, 0xe1, 0x7f, 0xfa, 0xed, 0xaf, 0xff, 0x5e, 0xfa, 0xeb, 0xff, 0xff, 0xff, 0xe5, 0xdb, 0xdf, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xae, 0xff, 0xff, 0xbf, 0xeb, 0xfe, 0xfa, 0xff, 0xea, 0xdf, 0x1d, 0xfd, 0xd7, 0x7f, 0xfe, 0xff, 0xf7, 0xff, 0x9b, 0xfb, 0x2f, 0xc3, 0xf7, 0xdf, 0x7b, 0x21, 0xbf, 0xfc, 0x9f, 0xba, 0x55, 0x03, 0xef, 0xb5, 0xf7, 0xfe, 0x7a, 0xed, 0xff, 0xe6, 0x7f, 0xff, 0xff, 0xb7, 0xbd, 0xf4, 0xfa, 0xff, 0x7f, 0xf5, 0xfe, 0xf7, 0x5f, 0x7c, 0xf9, 0xff, 0xa7, 0xde, 0xee, 0xbf, 0xf9, 0xff, 0xaf, 0xbf, 0xde, 0xa8, 0xcb, 0x8e, 0x9d, 0xfa, 0xba, 0x97, 0x4b, 0x2c, 0xb9, 0xf4, 0xd7, 0x5c, 0x7f, 0xfd, 0x6f, 0xfe, 0xfb, 0x7f, 0x7f, 0xfb, 0x3d, 0xfb, 0xd7, 0xef, 0xff, 0xf6, 0xbe, 0xf1, 0xbf, 0xff, 0x7f, 0xf7, 0xf7, 0xd9, 0x6d, 0x1b, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xbd, 0xff, 0xff, 0x79, 0x67, 0xaf, 0xdb, 0xbf, 0xff, 0x7f, 0xde, 0xfd, 0xbf, 0xff, 0xfc, 0xe6, 0xfd, 0x7f, 0xf7, 0xfb, 0xf1, 0xca, 0x7f, 0x7f, 0xf3, 0xff, 0x7f, 0xef, 0xfe, 0xfb, 0xff, 0xbf, 0xff, 0xfd, 0xff, 0xbf, 0xf9, 0x5f, 0xf6, 0xff, 0xab, 0xff, 0xdd, 0xea, 0xa3, 0xaf, 0xf7, 0xbd, 0xf4, 0xfe, 0xcf, 0x7f, 0xbe, 0xf5, 0xd7, 0x7a, 0x6e, 0xfe, 0xff, 0xbe, 0xff, 0xeb, 0xff, 0xef, 0xfe, 0xee, 0xde, 0xdf, 0x7f, 0xfb, 0xff, 0xdf, 0xf7, 0xff, 0xfb, 0xf7, 0xfd, 0x98, 0xff, 0x3f, 0xff, 0xdb, 0x3f, 0xfe, 0x0f, 0xd5, 0xef, 0xde, 0xdb, 0x3f, 0xfb, 0xef, 0xef, 0xff, 0xdf, 0x27, 0xef, 0xff, 0xe6, 0x7f, 0xff, 0x7f, 0xf7, 0xfd, 0xff, 0xeb, 0xef, 0xdf, 0xff, 0xee, 0xd7, 0xff, 0xe6, 0xf7, 0xef, 0xfe, 0xfb, 0xff, 0x9f, 0xf9, 0xff, 0xf7, 0x3e, 0xff, 0xfd, 0xdf, 0x9f, 0xf9, 0xfd, 0xfd, 0xbb, 0xff, 0xfe, 0xfe, 0xed, 0xff, 0xdf, 0xff, 0xff, 0x6f, 0xfe, 0x37, 0xfe, 0x3d, 0xff, 0x4f, 0xff, 0xdf, 0xbf, 0xbf, 0xf6, 0xfe, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xe7, 0xfa, 0x7f, 0x98, 0xff, 0xdf, 0xfe, 0xfd, 0xff, 0xf3, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xdf, 0xff, 0xff, 0xfb, 0xf4, 0xff, 0xfe, 0xff, 0x66, 0xff, 0xfe, 0xbf, 0xfb, 0x7e, 0xdf, 0xcf, 0xbf, 0xd7, 0xfc, 0xb5, 0xd7, 0xff, 0xbf, 0xcd, 0xff, 0xd7, 0xfd, 0xff, 0xbf, 0xe1, 0x3f, 0xff, 0x6b, 0xbf, 0xed, 0xed, 0xf9, 0xe7, 0x9f, 0xfd, 0xfd, 0xff, 0xdd, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x6b, 0xfe, 0xff, 0xfb, 0x5e, 0xf3, 0xff, 0xff, 0xf6, 0xdb, 0xb7, 0xbf, 0xff, 0xbf, 0x76, 0xd7, 0xef, 0xfb, 0xbf, 0xff, 0xff, 0x9a, 0xff, 0xe6, 0xfa, 0xaf, 0xbf, 0xbf, 0x7f, 0xff, 0xcb, 0xaf, 0xbe, 0xfc, 0xc8, 0xf7, 0xef, 0x3c, 0xf8, 0xcf, 0x8f, 0xef, 0x86, 0xff, 0xff, 0xef, 0xfe, 0xcb, 0xee, 0xfb, 0x3f, 0xff, 0xc7, 0xbf, 0xdf, 0xd3, 0xfc, 0xfb, 0xb5, 0x7c, 0xd9, 0xfd, 0xaf, 0xd9, 0xff, 0x5f, 0xda, 0x7c, 0xb3, 0xfb, 0x7f, 0xed, 0xf9, 0xf3, 0xff, 0xfd, 0x72, 0xea, 0xff, 0x9f, 0xff, 0xf7, 0xff, 0x6d, 0xfe, 0xff, 0xff, 0x5e, 0xfa, 0xef, 0xbf, 0xfe, 0x7a, 0x7e, 0xff, 0xcf, 0xfd, 0xfd, 0xff, 0x5f, 0x7f, 0xf3, 0xdd, 0xfc, 0x9b, 0xf7, 0xff, 0xbf, 0xdf, 0xfb, 0xfb, 0xbf, 0xb7, 0xde, 0xff, 0xff, 0xdb, 0x7f, 0xff, 0xff, 0xff, 0x99, 0x7f, 0xff, 0x57, 0xe6, 0xfe, 0x6b, 0xef, 0xed, 0xfd, 0xde, 0xeb, 0xfb, 0xaf, 0x77, 0xbf, 0xd8, 0xcc, 0xff, 0xff, 0xb5, 0x12, 0xde, 0xff, 0xbb, 0xb9, 0xff, 0xea, 0xbb, 0x7f, 0x9e, 0xfb, 0xab, 0xbd, 0xbf, 0xce, 0xf7, 0xd5, 0x77, 0xff, 0xff, 0xef, 0xa4, 0xf7, 0xff, 0x64, 0xee, 0xbf, 0xda, 0xee, 0xfb, 0xeb, 0xbe, 0xfe, 0x7e, 0xff, 0x7b, 0xfd, 0xad, 0xfd, 0xff, 0x59, 0xcb, 0x99, 0xfd, 0xa7, 0x99, 0xfb, 0xaf, 0x85, 0xf7, 0xfb, 0x7b, 0xbf, 0xbf, 0xbf, 0xef, 0xff, 0xdf, 0x5d, 0xff, 0xff, 0xfa, 0x76, 0x63, 0xfb, 0x0d, 0xe6, 0xfd, 0xdf, 0x76, 0xff, 0x6d, 0xf7, 0xff, 0xfe, 0xff, 0xfd, 0x6f, 0xbb, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0xed, 0xe7, 0x9d, 0x79, 0xf7, 0xe7, 0x9f, 0xff, 0xe6, 0xf9, 0x7f, 0xfc, 0x7f, 0xfe, 0xb3, 0xcf, 0xfe, 0xfb, 0xef, 0xff, 0xdf, 0x3e, 0x73, 0x6d, 0xec, 0xff, 0xf8, 0xe3, 0x8f, 0x3f, 0xdc, 0x7e, 0xfb, 0xcd, 0x75, 0xd8, 0xc9, 0xf7, 0xd9, 0x7d, 0xff, 0xd5, 0xc7, 0xaa, 0x9b, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf6, 0xdb, 0x6f, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xbf, 0xef, 0xce, 0xe6, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xfd, 0xf7, 0xfb, 0xff, 0x7e, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x6f, 0xbb, 0xa9, 0xff, 0xd2, 0x0f, 0xf5, 0xbc, 0xf1, 0xfa, 0xef, 0x2d, 0xf6, 0xf3, 0xcf, 0xd6, 0x5f, 0xff, 0xef, 0xef, 0x9f, 0xfe, 0x6e, 0xde, 0xbf, 0xf8, 0xe3, 0x9f, 0x37, 0xbe, 0xfa, 0xf3, 0x8b, 0xff, 0xfc, 0xf3, 0xe5, 0xb7, 0xff, 0x7d, 0xb1, 0xcd, 0xdf, 0x9b, 0xff, 0xf7, 0xf7, 0xfe, 0xfb, 0xfb, 0xaf, 0xff, 0xfe, 0xfa, 0xff, 0xff, 0x3d, 0xfd, 0xf5, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x30, 0xcf, 0x3c, 0x33, 0xec, 0xb3, 0x8b, 0x2c, 0xed, 0xf9, 0x45, 0x1f, 0x5d, 0xfe, 0xf1, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xf2, 0x8f, 0xff, 0xff, 0xfd, 0xfa, 0xef, 0x3f, 0xff, 0xfb, 0xef, 0xd7, 0x5f, 0x7f, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 0xf8, 0xbf, 0x5c, 0xfb, 0xff, 0x7f, 0x97, 0xfe, 0xfe, 0xea, 0xff, 0xff, 0xfb, 0xf4, 0xd7, 0x57, 0x7f, 0xff, 0xfd, 0xff, 0x9b, 0xff, 0xff, 0xeb, 0xfe, 0xfb, 0xff, 0xaa, 0xff, 0xee, 0xb2, 0xba, 0xf7, 0xd7, 0xfd, 0x75, 0xd7, 0x7f, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x7f, 0xb1, 0xfd, 0xf6, 0x5f, 0x68, 0x6f, 0xbf, 0xa6, 0x3f, 0xdd, 0x40, 0x7e, 0xd9, 0xb5, 0xf7, 0xfe, 0xfb, 0xbf, 0xf9, 0xbf, 0xff, 0xcb, 0xff, 0xff, 0xfd, 0xf7, 0xd3, 0xff, 0x3f, 0xf9, 0xed, 0xf7, 0xf7, 0x7b, 0xfb, 0xed, 0x2f, 0xff, 0x6d, 0xfa, 0xf7, 0xeb, 0xad, 0xbe, 0xf6, 0xea, 0xe3, 0xae, 0xbf, 0xbe, 0xf5, 0x53, 0x5d, 0x7b, 0xf5, 0xa1, 0x57, 0x5f, 0xff, 0x9b, 0xf9, 0x3e, 0xff, 0xaf, 0xef, 0x6a, 0xef, 0xff, 0xff, 0xe7, 0x9f, 0x9f, 0xfd, 0xd9, 0xdf, 0x67, 0x9f, 0xee, 0xd1, 0xfb, 0xc6, 0xff, 0x7b, 0xf2, 0xfa, 0xff, 0xdb, 0xff, 0xff, 0xae, 0xeb, 0xed, 0xfd, 0x3f, 0xdf, 0xf7, 0x7e, 0xb5, 0xdf, 0x5d, 0xbf, 0x79, 0xff, 0xfd, 0x7f, 0xff, 0xfc, 0xff, 0xdf, 0xfe, 0xf6, 0xd3, 0xbe, 0xfe, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xfe, 0x6f, 0xda, 0xf7, 0xff, 0xff, 0xff, 0xa5, 0xe7, 0x5b, 0xb8, 0xaf, 0x9f, 0x7f, 0xbe, 0xf5, 0xd6, 0x7f, 0x6f, 0x5f, 0xff, 0x7e, 0x19, 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xdb, 0xff, 0x7f, 0xbf, 0x6e, 0xff, 0xf7, 0x5f, 0xdb, 0x6d, 0xff, 0xf7, 0xde, 0x7f, 0x7f, 0xa6, 0xfe, 0x7f, 0xff, 0xfd, 0xff, 0xfb, 0x6f, 0xbf, 0xff, 0xee, 0x77, 0x5e, 0x7e, 0xdf, 0xbd, 0xfd, 0xcf, 0x3f, 0xfb, 0xbf, 0xf1, 0xeb, 0xfe, 0xff, 0xef, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfb, 0xef, 0xe5, 0xf7, 0xf3, 0xff, 0xbd, 0xd7, 0xff, 0x65, 0xfe, 0xf7, 0xba, 0xff, 0xbb, 0xef, 0xf5, 0xf5, 0x97, 0x9f, 0xff, 0xe6, 0xb3, 0xb7, 0xbf, 0xfe, 0x7f, 0xbf, 0xfe, 0xff, 0x9b, 0xfd, 0xff, 0xbb, 0xde, 0xbc, 0xfd, 0xcf, 0x1f, 0x56, 0x7d, 0x65, 0xaf, 0xfb, 0x7b, 0xff, 0xed, 0xa9, 0x7f, 0xfe, 0x7f, 0xe6, 0xff, 0xfe, 0xfd, 0xbb, 0xf2, 0xbf, 0xed, 0xdf, 0xff, 0xfe, 0xef, 0x5f, 0xe7, 0xfb, 0xdf, 0xfb, 0xdf, 0xdf, 0xfe, 0xbb, 0xf9, 0xbf, 0xd7, 0x3f, 0xaf, 0xf3, 0xfe, 0xad, 0xff, 0xff, 0xfd, 0x9e, 0x7f, 0xbf, 0xef, 0x1e, 0xd9, 0xf6, 0x97, 0xff, 0x6e, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0x9f, 0xfb, 0xf7, 0xf7, 0x7f, 0xfb, 0xfb, 0xff, 0x5f, 0xff, 0x7f, 0xff, 0xfa, 0xfe, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xef, 0xff, 0xeb, 0xff, 0xcf, 0x86, 0xff, 0x6f, 0xff, 0xfe, 0xff, 0x67, 0xfd, 0xff, 0xfc, 0xcb, 0x5f, 0x7e, 0x53, 0x7f, 0xf7, 0xbf, 0x72, 0xff, 0xfd, 0x8f, 0xd9, 0xff, 0x7f, 0x5d, 0xbf, 0xff, 0x5b, 0xfa, 0x6b, 0x2f, 0x73, 0xbd, 0xe4, 0xd2, 0xd3, 0x7d, 0xfd, 0xbd, 0xfc, 0xff, 0x6d, 0xfe, 0xff, 0xfe, 0xff, 0x7f, 0xec, 0xb7, 0xde, 0x6a, 0xeb, 0x5d, 0x6d, 0x2d, 0x75, 0x9e, 0xff, 0x7f, 0xf3, 0xcf, 0xff, 0x9b, 0xf5, 0xff, 0xbf, 0xfe, 0x7f, 0xeb, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xeb, 0x4f, 0xfd, 0xe7, 0xd7, 0xd3, 0xfd, 0xff, 0xd7, 0xe6, 0xfe, 0x6b, 0xf6, 0xd9, 0x25, 0xbf, 0x69, 0xaf, 0x9d, 0xf6, 0xb5, 0xd2, 0x4a, 0x33, 0xff, 0x3f, 0xf3, 0x4c, 0xf8, 0xbb, 0x99, 0xff, 0xde, 0xbf, 0xff, 0xfe, 0x7b, 0xef, 0xbd, 0xf1, 0xfe, 0xf7, 0xdf, 0x77, 0xdf, 0x7f, 0xad, 0xcc, 0xd3, 0xff, 0x6c, 0xec, 0xbf, 0xf6, 0xdf, 0xdf, 0xaf, 0xed, 0x8b, 0x7f, 0xbf, 0xff, 0xfb, 0xf7, 0xf5, 0xf7, 0xff, 0x2b, 0x2d, 0xf4, 0xbf, 0x99, 0xfb, 0xef, 0xff, 0x53, 0xe7, 0xeb, 0xaf, 0xb5, 0x92, 0x5a, 0x55, 0x5e, 0x7b, 0xf5, 0xbd, 0xd7, 0xbe, 0x7d, 0x85, 0xef, 0xe6, 0xfd, 0xff, 0x7f, 0xdb, 0x6f, 0x3f, 0xdf, 0x6a, 0xab, 0xed, 0x6d, 0xb7, 0xfd, 0xfe, 0xef, 0x3f, 0xfe, 0xfd, 0xfa, 0xbd, 0x79, 0xff, 0x7f, 0x9f, 0xf9, 0xe6, 0x9f, 0x27, 0x9f, 0x7c, 0xf2, 0x93, 0x4f, 0x3e, 0xff, 0xfd, 0x3f, 0xff, 0xba, 0x7f, 0x6f, 0xec, 0xff, 0xbe, 0xd3, 0xaf, 0xbf, 0x95, 0x58, 0xf2, 0x89, 0x57, 0x7e, 0xf1, 0xe5, 0xdb, 0x6f, 0xff, 0xdd, 0xe7, 0x3f, 0x99, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0x67, 0x9f, 0xed, 0xb6, 0xb5, 0xcf, 0x7e, 0xdf, 0x3f, 0xff, 0xee, 0xfb, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 0xfd, 0xfa, 0xdf, 0xff, 0xda, 0x6b, 0xbe, 0xbd, 0xcd, 0xb5, 0xff, 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbb, 0xa9, 0xff, 0x7a, 0x19, 0xaf, 0xfe, 0xfe, 0xc2, 0x0b, 0x2f, 0x7c, 0xe1, 0x85, 0x3f, 0xff, 0xfb, 0xed, 0x9d, 0x7a, 0xff, 0x6a, 0xde, 0xb7, 0xfa, 0x63, 0x89, 0x3f, 0xf7, 0x79, 0x67, 0x9d, 0xff, 0xec, 0xf3, 0xce, 0x57, 0xdd, 0x6d, 0xf5, 0xcf, 0xdf, 0x9b, 0xff, 0xff, 0xf7, 0xfb, 0xb2, 0xef, 0x7f, 0xf7, 0xfb, 0x6f, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xf7, 0x5d, 0xfe, 0xfb, 0xff, 0xe6, 0xff, 0xff, 0xf1, 0x87, 0x3e, 0xbb, 0xe8, 0xa2, 0x8f, 0x3e, 0xf5, 0x90, 0xe1, 0x1e, 0x7d, 0xf6, 0xd1, 0xe3, 0x8f, 0xbf, 0xf9, 0xff, 0xfb, 0xed, 0xa7, 0xff, 0x7e, 0xff, 0xdf, 0x7f, 0xff, 0xbb, 0xee, 0x13, 0xff, 0xff, 0xfd, 0xc7, 0x9a, 0xef, 0x6f, 0xfe, 0x9f, 0x3f, 0xfe, 0xeb, 0xff, 0x8f, 0xbe, 0xf2, 0xeb, 0x5b, 0x5e, 0x5d, 0xf4, 0xd7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xbf, 0xe7, 0xde, 0xfb, 0xef, 0xaa, 0xbb, 0xfe, 0xf2, 0xd2, 0x57, 0x4e, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xb9, 0xff, 0xe6, 0xff, 0x7b, 0xec, 0xbd, 0xf6, 0x3b, 0x7f, 0xff, 0xfd, 0xe7, 0x3f, 0xff, 0x58, 0x7b, 0xed, 0xb5, 0xff, 0x7a, 0xea, 0xbf, 0xd9, 0xff, 0xf6, 0xfb, 0xef, 0xbf, 0xff, 0xf6, 0xdf, 0x6f, 0x75, 0xf9, 0xa9, 0x97, 0xfe, 0x7e, 0x6b, 0xfd, 0xff, 0xff, 0x6f, 0xea, 0x7f, 0x6b, 0xad, 0xbf, 0xde, 0xba, 0xab, 0x2f, 0xb7, 0xbe, 0x75, 0xd7, 0x5b, 0x7f, 0xad, 0x71, 0x57, 0x1f, 0xff, 0x9a, 0xff, 0xee, 0xfb, 0x7f, 0xad, 0xcf, 0xef, 0xbf, 0xff, 0xf2, 0xfd, 0x7b, 0xfe, 0xff, 0x65, 0x77, 0xeb, 0xf0, 0xfd, 0xfe, 0xc6, 0xff, 0xff, 0xff, 0xf7, 0xad, 0xbe, 0xff, 0xfe, 0xdb, 0xff, 0x3f, 0x5d, 0xff, 0x7e, 0xef, 0xbf, 0xf7, 0xfe, 0xef, 0x9f, 0xf9, 0xdf, 0xdf, 0xfc, 0xff, 0xff, 0xb6, 0x7f, 0xfd, 0xaf, 0xff, 0xff, 0xec, 0x3a, 0xbf, 0xfd, 0xf7, 0xff, 0xdb, 0xee, 0x6d, 0xfe, 0xef, 0xcf, 0x7e, 0xee, 0x6d, 0xbf, 0xfc, 0x60, 0xc9, 0x7f, 0x7b, 0xfd, 0xf5, 0xfe, 0x0e, 0xf5, 0xfd, 0xfd, 0xfe, 0x9b, 0xfd, 0xff, 0xff, 0xba, 0xff, 0xef, 0x6b, 0x6f, 0xf7, 0xdb, 0xff, 0xf7, 0xfe, 0xed, 0xff, 0xef, 0xef, 0xdf, 0x53, 0xdf, 0xe6, 0xff, 0xdf, 0x3f, 0x9d, 0xaf, 0xd7, 0x87, 0xbf, 0x3b, 0xfc, 0xf1, 0xb6, 0xdf, 0xff, 0x7f, 0xb7, 0xf7, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xee, 0xff, 0x7f, 0xf3, 0xff, 0xfa, 0xe3, 0xab, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0x7e, 0xf6, 0xed, 0xd7, 0xff, 0x6d, 0xf6, 0xbf, 0x7f, 0xd7, 0x7f, 0xf7, 0xfb, 0xdf, 0xff, 0xff, 0xcf, 0xef, 0x6d, 0xdf, 0xff, 0x7f, 0xbd, 0x9d, 0xfe, 0xff, 0x9b, 0x7f, 0x7d, 0xff, 0x7f, 0xbf, 0xb3, 0xfd, 0xfb, 0xef, 0xff, 0x7e, 0xbc, 0xb7, 0xfe, 0x6f, 0xd7, 0xff, 0xf7, 0xff, 0xff, 0xa6, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xf6, 0xbf, 0xff, 0xff, 0x3f, 0xbf, 0xbb, 0x7f, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xf9, 0xef, 0x67, 0xcf, 0xbd, 0xff, 0x1e, 0x7b, 0x6d, 0xb5, 0xfa, 0x9f, 0xef, 0xff, 0x5f, 0xbe, 0xeb, 0xff, 0xdf, 0xf7, 0x6e, 0xf8, 0xff, 0xfe, 0xfd, 0xe7, 0xd7, 0xfd, 0xfe, 0xf8, 0xef, 0xff, 0xff, 0xed, 0xbf, 0xff, 0xff, 0xde, 0xef, 0xf1, 0xbf, 0x99, 0xfe, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xcf, 0xff, 0xff, 0xfc, 0xfd, 0xbb, 0xff, 0xf7, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xfd, 0xab, 0xef, 0xbc, 0xc2, 0xc7, 0xef, 0xf5, 0xfc, 0xf6, 0xf7, 0xbf, 0x79, 0xfd, 0x97, 0xbd, 0xd7, 0xdf, 0xff, 0xaf, 0xf9, 0xff, 0xef, 0xbb, 0xff, 0xfe, 0xfd, 0x3e, 0xbf, 0xef, 0x7f, 0xff, 0xbf, 0x72, 0xff, 0xfd, 0xfd, 0x75, 0xfe, 0xff, 0x6d, 0xee, 0xff, 0xff, 0xfe, 0xeb, 0x7f, 0xfd, 0xfe, 0x7a, 0xee, 0xff, 0xff, 0xfd, 0xf7, 0xd7, 0xff, 0x2e, 0xf9, 0xe7, 0xfa, 0x1b, 0xf5, 0xa9, 0xbf, 0xff, 0xff, 0xd7, 0xef, 0xbf, 0xde, 0xfe, 0xff, 0x53, 0x7f, 0x9f, 0xf5, 0x9e, 0x13, 0x67, 0x38, 0x57, 0x66, 0xfe, 0x7f, 0xa7, 0xbf, 0x66, 0xff, 0x7b, 0xa5, 0xed, 0x67, 0x37, 0xfb, 0x6b, 0xb3, 0x6f, 0x7f, 0x7b, 0x4a, 0xb3, 0x9b, 0xb9, 0xff, 0x5a, 0xfc, 0xf5, 0xfd, 0xff, 0xde, 0xa9, 0xff, 0x7d, 0xaf, 0xde, 0x73, 0xef, 0xfd, 0xf5, 0xf6, 0xb7, 0xed, 0x6c, 0xee, 0xbf, 0xfe, 0xda, 0xeb, 0x7f, 0xb7, 0xb7, 0x7f, 0xeb, 0x5f, 0x7f, 0x7d, 0xd7, 0xd5, 0xeb, 0x8f, 0x9f, 0xed, 0xbf, 0x19, 0xfb, 0xff, 0xfd, 0xf7, 0xdf, 0xdf, 0xeb, 0xff, 0x83, 0xfa, 0xd7, 0x5f, 0x2f, 0xef, 0x95, 0x8e, 0xff, 0x7d, 0xf3, 0xef, 0xe6, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0x76, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7b, 0x7f, 0xbe, 0xed, 0xff, 0x9d, 0x79, 0xdf, 0xff, 0xbf, 0xf9, 0xf7, 0x1d, 0x7f, 0x9f, 0xf9, 0xff, 0x3f, 0xff, 0x3c, 0xff, 0xfc, 0xb3, 0xdf, 0x7e, 0x7f, 0x67, 0xe4, 0xef, 0xfe, 0xfb, 0xed, 0x33, 0xff, 0xbe, 0xf3, 0xef, 0x75, 0xff, 0xbd, 0xc6, 0x9f, 0x7f, 0xb4, 0x99, 0xb6, 0xbf, 0x98, 0xfb, 0xff, 0xff, 0x3f, 0xbf, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xfb, 0xec, 0xff, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0x7f, 0xff, 0xf7, 0xff, 0x77, 0xff, 0xfe, 0xff, 0xff, 0xbb, 0xa9, 0xff, 0x5a, 0x7b, 0xff, 0xfd, 0xf8, 0xfa, 0x1b, 0xaf, 0x7f, 0xfd, 0xf4, 0x1e, 0x7a, 0xf8, 0xeb, 0xfc, 0xbf, 0xef, 0x6e, 0xd8, 0xf7, 0xfb, 0xae, 0xab, 0x75, 0xbf, 0xfa, 0x66, 0xbb, 0x5f, 0x7d, 0xf9, 0xcc, 0x1f, 0xff, 0xfc, 0xd1, 0x45, 0xdf, 0x9b, 0xff, 0xfd, 0xff, 0xde, 0xbb, 0xaf, 0xed, 0xff, 0xfa, 0x7a, 0xf7, 0x5d, 0xff, 0xfd, 0xd7, 0xdf, 0x7f, 0xb7, 0xdf, 0xff, 0xe6, 0xff, 0xeb, 0xb3, 0x8b, 0x2f, 0xff, 0xf8, 0xb1, 0x87, 0x3f, 0xf7, 0xf1, 0xc7, 0x9e, 0x7d, 0xfc, 0xf0, 0x47, 0x97, 0xbf, 0xf9, 0xef, 0xfa, 0xfb, 0xbf, 0xff, 0xfc, 0xfb, 0xf9, 0xb7, 0xff, 0xfd, 0xef, 0x9f, 0x7f, 0xff, 0xfb, 0xf4, 0xff, 0xfd, 0x6f, 0xf8, 0xff, 0xfe, 0xfe, 0xfa, 0xfa, 0xff, 0xfe, 0x7e, 0xff, 0xdf, 0xff, 0xfb, 0xed, 0xdf, 0xff, 0x7e, 0xfd, 0xf5, 0xed, 0x9b, 0xff, 0xff, 0xff, 0xee, 0xfb, 0xcb, 0xff, 0xf7, 0xfe, 0xfb, 0xfb, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0xfb, 0xff, 0xff, 0xbd, 0x66, 0xff, 0x7b, 0xbf, 0xbd, 0xe7, 0xf3, 0x7f, 0xbf, 0xf5, 0xf7, 0xbf, 0xbf, 0xdf, 0xfb, 0xed, 0xbd, 0xff, 0x5e, 0xf3, 0xbf, 0xf9, 0xff, 0xee, 0xdb, 0xef, 0xee, 0xfb, 0xf6, 0xff, 0xff, 0xbf, 0x7f, 0xcd, 0xff, 0xff, 0xdf, 0xf9, 0xe9, 0xa7, 0xff, 0x6b, 0xfa, 0xbf, 0xeb, 0xae, 0xba, 0xf4, 0xb8, 0xc1, 0xaf, 0xbf, 0xea, 0x35, 0x97, 0x5f, 0x3d, 0xfd, 0xc5, 0x06, 0x5b, 0xfe, 0x9a, 0xff, 0x3e, 0xbb, 0x7c, 0xf3, 0xcf, 0xee, 0xfe, 0xfc, 0xbf, 0x7f, 0xde, 0xb5, 0xbb, 0xf7, 0x7f, 0x7f, 0xfe, 0xfd, 0xdf, 0xc6, 0xff, 0xde, 0x6f, 0xab, 0xaf, 0xf5, 0xdf, 0xa7, 0xff, 0xad, 0xff, 0xfd, 0xde, 0xff, 0xaf, 0x5f, 0xef, 0xff, 0xbd, 0x9a, 0xe9, 0xfe, 0xfa, 0xf7, 0xdc, 0xfd, 0xfe, 0xbf, 0x5f, 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xbf, 0xbd, 0xff, 0xdb, 0xd9, 0xff, 0x6f, 0xfc, 0xbf, 0xff, 0xbf, 0xcf, 0x8f, 0xfe, 0xbe, 0x77, 0xef, 0x7f, 0x3e, 0xed, 0xef, 0xff, 0xff, 0x5d, 0xfa, 0x7f, 0xdf, 0x9b, 0xff, 0x7f, 0xfd, 0xff, 0xfd, 0xfe, 0xf7, 0xff, 0xbf, 0xfe, 0xff, 0x5f, 0xff, 0x77, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xef, 0xe6, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x7e, 0xeb, 0x9e, 0xff, 0xb6, 0xe5, 0xbd, 0xff, 0xff, 0x9f, 0xbf, 0xff, 0x7f, 0xfb, 0xbf, 0xf9, 0xdf, 0x3e, 0xd3, 0x6f, 0xfe, 0xfd, 0xf7, 0xff, 0x87, 0xff, 0xff, 0xff, 0xd3, 0xde, 0x3f, 0xfd, 0xbd, 0xe7, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xde, 0xfa, 0xfd, 0xfe, 0xd5, 0xef, 0xff, 0xf7, 0xea, 0xb7, 0xff, 0xdf, 0xee, 0xff, 0x7d, 0xbd, 0xff, 0x9b, 0xff, 0xed, 0xfb, 0xff, 0xf4, 0x7d, 0xfb, 0xfb, 0x9f, 0x70, 0xff, 0xdf, 0xff, 0xfb, 0x5e, 0xf7, 0xbd, 0xf8, 0xff, 0xff, 0xe6, 0xbf, 0xfb, 0xff, 0x3f, 0xff, 0xdf, 0xff, 0xf7, 0xfe, 0xe5, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xbf, 0xa9, 0xff, 0xba, 0xdf, 0xbf, 0xf7, 0xfb, 0xbf, 0xaf, 0x3f, 0xef, 0xbb, 0xfe, 0xdf, 0xfb, 0xcf, 0x9d, 0xdf, 0xd6, 0xff, 0x6e, 0xfe, 0xdf, 0x7e, 0xa3, 0xc5, 0xff, 0xbf, 0xfe, 0x98, 0xe3, 0xf7, 0xf3, 0xeb, 0xd7, 0xdf, 0x7e, 0xfe, 0xed, 0xff, 0xbf, 0x99, 0xff, 0xdf, 0x5f, 0x7b, 0xbb, 0xff, 0xff, 0xff, 0xef, 0xaf, 0xff, 0xff, 0x7f, 0xfd, 0xf7, 0xd7, 0x7f, 0xbd, 0xd7, 0xff, 0x86, 0xff, 0x8f, 0x7f, 0xfe, 0xf3, 0xfe, 0xef, 0x6c, 0xf2, 0xf9, 0xff, 0x3f, 0xeb, 0xe5, 0xf7, 0x5f, 0x7e, 0xff, 0xfb, 0x8f, 0xd9, 0xff, 0xef, 0x5b, 0x3f, 0xbd, 0xff, 0x7a, 0xbd, 0xff, 0xfd, 0xff, 0xef, 0x54, 0x53, 0x7d, 0xb9, 0xe4, 0xff, 0xff, 0x6d, 0xfe, 0xff, 0xfe, 0x7a, 0xcd, 0xbf, 0xf3, 0xfe, 0x5e, 0xae, 0x7f, 0x4f, 0xbd, 0xf5, 0xd6, 0x5b, 0x6f, 0xfd, 0xff, 0xff, 0x9b, 0xf5, 0xff, 0xb3, 0xcf, 0x38, 0xff, 0xef, 0xb3, 0xcf, 0xfa, 0xf7, 0x53, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0x67, 0xfd, 0xd7, 0xe6, 0xf6, 0xeb, 0xb6, 0x97, 0x70, 0x7e, 0x5d, 0xe5, 0xd7, 0x6f, 0x35, 0xfb, 0x5f, 0x7b, 0xed, 0xb5, 0xd7, 0xfe, 0xff, 0xbb, 0x99, 0xff, 0x6f, 0xbd, 0xb6, 0x8e, 0x7b, 0xf3, 0xb9, 0xf6, 0x56, 0xcd, 0xde, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xd7, 0xed, 0x6c, 0xec, 0xbf, 0xfe, 0x3b, 0x7b, 0xbb, 0xed, 0x1d, 0xfe, 0xeb, 0x7f, 0x7b, 0xbd, 0xbf, 0xfe, 0xeb, 0xaf, 0xe7, 0xff, 0xbf, 0x99, 0xf9, 0xff, 0xbf, 0xde, 0x0a, 0x7f, 0x7d, 0x96, 0xff, 0xfa, 0xf7, 0x5f, 0x0f, 0x25, 0x14, 0x56, 0x5a, 0x7b, 0xfd, 0xef, 0xa6, 0xfd, 0xff, 0xfe, 0xef, 0xed, 0xbf, 0xfe, 0xfc, 0xff, 0xff, 0x7f, 0xfe, 0xdf, 0x7e, 0xdb, 0x6d, 0xbd, 0xfd, 0xb7, 0xbd, 0x79, 0xff, 0xff, 0xfd, 0x79, 0xc6, 0x5f, 0x77, 0xff, 0xff, 0xe7, 0xff, 0xdd, 0x37, 0xdf, 0x60, 0x83, 0x0d, 0x7e, 0x7f, 0x6f, 0xec, 0xff, 0xf6, 0x7b, 0x8d, 0xbf, 0xdb, 0x6c, 0xfb, 0xed, 0x7f, 0x7f, 0xfd, 0xe5, 0x92, 0x4b, 0x2e, 0xb1, 0xf6, 0xbf, 0x99, 0xf9, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xdb, 0x6f, 0xff, 0xff, 0xdf, 0x3f, 0xfb, 0xcc, 0x37, 0xcf, 0xbc, 0xff, 0xcf, 0xe6, 0xbe, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0x7f, 0xdb, 0x74, 0xf3, 0x4d, 0xb7, 0xf7, 0xff, 0xbb, 0xa9, 0xff, 0xff, 0xeb, 0xbd, 0xfd, 0xff, 0xe6, 0xef, 0xb7, 0x7f, 0xfd, 0xff, 0x3f, 0x5a, 0x38, 0xa9, 0x85, 0xff, 0xff, 0x6a, 0xde, 0xdf, 0xfd, 0xf3, 0x9d, 0xaf, 0xb6, 0xf9, 0xf6, 0xcb, 0x5d, 0xfd, 0xf3, 0xdf, 0x3f, 0xff, 0xfc, 0xf3, 0x5f, 0xdf, 0x9b, 0xff, 0xbf, 0xdf, 0xce, 0x3f, 0xef, 0xee, 0xda, 0xde, 0xff, 0xff, 0xef, 0xff, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xe6, 0xfd, 0xff, 0xa3, 0xcf, 0x3f, 0x3e, 0xfc, 0xf3, 0xcf, 0x2f, 0xff, 0xf9, 0xe1, 0x17, 0x39, 0x74, 0x91, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xf3, 0x9d, 0xff, 0xff, 0x7c, 0xe6, 0xef, 0x2f, 0xff, 0xfd, 0x45, 0xfb, 0xff, 0xbc, 0xf3, 0xef, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0x3c, 0xfb, 0xff, 0xef, 0x8f, 0xff, 0xfe, 0xcb, 0xdb, 0x5f, 0x7d, 0x7e, 0xd5, 0x5f, 0x5f, 0xfd, 0xf5, 0xff, 0x9b, 0xfd, 0xff, 0xef, 0xfe, 0xff, 0xcf, 0xe8, 0xff, 0xfe, 0xbf, 0xda, 0x57, 0xcf, 0xff, 0xf5, 0xd6, 0x5d, 0xfe, 0xff, 0xff, 0xe6, 0xff, 0xdf, 0x7c, 0xff, 0xf7, 0x16, 0x5b, 0x6f, 0xff, 0xed, 0x3d, 0xd7, 0xfa, 0xf3, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xbf, 0xf9, 0xff, 0xf4, 0xd3, 0x7f, 0xb7, 0xfd, 0xf2, 0xdb, 0x7b, 0xbd, 0xff, 0xff, 0xb7, 0xdf, 0x7e, 0xfb, 0xa9, 0xb7, 0xf3, 0x6d, 0xfa, 0xef, 0xab, 0xae, 0xbe, 0xda, 0xea, 0xcb, 0x25, 0xbe, 0xf8, 0xd5, 0x97, 0x5d, 0x7b, 0xf4, 0xf5, 0x57, 0x5d, 0xfd, 0x9a, 0xff, 0x1f, 0xff, 0xff, 0xf6, 0xcb, 0xdf, 0xbf, 0xfd, 0xfe, 0xff, 0xfd, 0x57, 0xe9, 0xe9, 0xc7, 0x3f, 0x7e, 0xff, 0xff, 0xc6, 0xff, 0x7f, 0xff, 0x9b, 0x6f, 0xbd, 0xff, 0x6a, 0xfb, 0xff, 0x3f, 0xfb, 0xb7, 0x7f, 0xd7, 0xf7, 0xd3, 0xef, 0xbf, 0x9f, 0xd9, 0xfb, 0xe2, 0xff, 0xf7, 0xff, 0xf6, 0xbf, 0xff, 0x7f, 0xfe, 0xff, 0xbe, 0xef, 0xff, 0xff, 0x7f, 0xbf, 0xfb, 0xff, 0x6f, 0xf6, 0x3e, 0x5e, 0xfa, 0x7f, 0x8e, 0xff, 0x5f, 0xf8, 0x6e, 0x7f, 0xfd, 0xfd, 0x7f, 0xbb, 0xef, 0xbe, 0xf9, 0xe9, 0xfb, 0x9b, 0xff, 0xff, 0xbf, 0xbe, 0xff, 0xf5, 0xff, 0x7f, 0x6f, 0xfe, 0x7f, 0xdf, 0xdf, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xe6, 0x6f, 0xcb, 0xfe, 0x7d, 0xd4, 0xbb, 0xfd, 0x1f, 0xfb, 0xbe, 0x7c, 0xcf, 0xfd, 0xff, 0xbf, 0x7e, 0xf7, 0xfd, 0xf7, 0xbf, 0xf9, 0xff, 0xff, 0xfa, 0xff, 0x3e, 0xff, 0xf6, 0xff, 0xcf, 0x77, 0xff, 0xed, 0xff, 0x5f, 0x76, 0xf3, 0xf5, 0xb6, 0xff, 0x6f, 0xee, 0xf7, 0x7d, 0x5e, 0xff, 0xbf, 0xbe, 0xff, 0x5f, 0xef, 0xc7, 0x1f, 0xf7, 0xbf, 0xff, 0x7c, 0xff, 0xef, 0xf7, 0xff, 0x9a, 0xff, 0x4e, 0xfe, 0xef, 0xff, 0x69, 0xf7, 0xd6, 0x6f, 0xfd, 0xf7, 0x9e, 0xff, 0x7e, 0xff, 0xff, 0xfb, 0xfd, 0xff, 0xdf, 0xe6, 0xff, 0xf3, 0xfc, 0xff, 0xd7, 0xdf, 0xff, 0xff, 0x6f, 0xff, 0xfd, 0xde, 0x7f, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xde, 0xad, 0xfb, 0xff, 0xfa, 0xe9, 0xbc, 0xfb, 0xdf, 0xf3, 0xfa, 0x7d, 0xee, 0xfb, 0xe7, 0x3d, 0xff, 0x6f, 0xfc, 0x3f, 0x6c, 0xf2, 0xad, 0xbf, 0xff, 0xff, 0xf3, 0xe7, 0x57, 0xff, 0xbd, 0xbf, 0xdf, 0x76, 0xdf, 0xed, 0xf7, 0xff, 0x99, 0xfd, 0xff, 0xff, 0xf7, 0xed, 0xef, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0x8f, 0xfd, 0xff, 0xf5, 0x5e, 0x5e, 0xff, 0xf5, 0xff, 0xa6, 0x7f, 0xbd, 0xaf, 0xbe, 0xc1, 0xef, 0xcb, 0xef, 0xff, 0xc1, 0xcf, 0xff, 0xf9, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd9, 0xcf, 0xf3, 0xbf, 0xef, 0xf2, 0xff, 0xfa, 0xeb, 0xf5, 0xd7, 0xfb, 0xff, 0x7a, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xff, 0x6d, 0xfe, 0xff, 0x9f, 0x7f, 0xfa, 0xa5, 0xbe, 0xfe, 0xda, 0x3f, 0x7f, 0xe7, 0xef, 0xff, 0xd6, 0x5b, 0x6f, 0xbd, 0xf5, 0xff, 0x9b, 0xf5, 0xfc, 0xb7, 0xde, 0x7e, 0xea, 0xac, 0xb3, 0xfe, 0x3f, 0xd7, 0xfb, 0xff, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xff, 0xd7, 0xe6, 0xfe, 0x7d, 0xf3, 0xed, 0xfd, 0x53, 0xcd, 0xaf, 0xff, 0x5e, 0xff, 0xd0, 0xea, 0x7b, 0xcd, 0xb4, 0xd2, 0x4a, 0xab, 0xbb, 0x99, 0x3f, 0xef, 0x68, 0xff, 0xbe, 0x6d, 0xf6, 0xa9, 0xef, 0xd6, 0xd7, 0xd4, 0xff, 0xff, 0xab, 0xef, 0x3f, 0xfb, 0xec, 0x6c, 0xec, 0xef, 0xb2, 0xfa, 0xef, 0xfd, 0xff, 0xb6, 0x7e, 0xef, 0xff, 0x7b, 0x9d, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x99, 0xf9, 0xbf, 0xfd, 0xf7, 0xf3, 0x3e, 0x2f, 0xff, 0x8e, 0xfe, 0xff, 0xdf, 0xed, 0xe7, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xef, 0x46, 0xfd, 0xdf, 0xf6, 0xdb, 0xff, 0xb7, 0xdf, 0xff, 0xff, 0xcf, 0x7f, 0xbb, 0xf7, 0x7e, 0xdf, 0x7d, 0xf7, 0xfd, 0xf7, 0xbd, 0x79, 0xf7, 0x47, 0xff, 0x7d, 0xfe, 0x7f, 0xef, 0xff, 0xf9, 0xf7, 0xbf, 0xcf, 0x37, 0xdf, 0x67, 0x9f, 0x7d, 0xf6, 0x79, 0x6f, 0xe8, 0xff, 0x38, 0xbb, 0x8f, 0x3f, 0xd7, 0x58, 0xfb, 0xed, 0x74, 0xb7, 0xf9, 0xe5, 0xd2, 0x5f, 0x2f, 0xfd, 0xf5, 0xbb, 0x99, 0xf9, 0xf7, 0xce, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0x6f, 0xff, 0xfd, 0xe7, 0x7f, 0xff, 0xec, 0xb3, 0xcf, 0x3e, 0x7b, 0x4e, 0xe6, 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0xbf, 0xff, 0xff, 0xf7, 0xef, 0x7f, 0x7f, 0xff, 0x75, 0xdb, 0xed, 0xb5, 0xdb, 0xde, 0xbb, 0xb9, 0xff, 0xd6, 0x7f, 0xef, 0xfc, 0xff, 0xf3, 0xeb, 0xaf, 0xff, 0xfd, 0xce, 0x3f, 0xfe, 0x7f, 0xfd, 0xf5, 0xd7, 0xfb, 0x6a, 0xde, 0x97, 0xf9, 0xea, 0x9b, 0x67, 0xb6, 0x5a, 0xf2, 0xcb, 0x57, 0xfe, 0xf3, 0xcf, 0x56, 0xfb, 0xed, 0xf7, 0xdf, 0xce, 0x9b, 0xff, 0xb7, 0xbf, 0xfe, 0xee, 0xeb, 0xbf, 0xbf, 0xfe, 0xfb, 0xff, 0xff, 0xad, 0xfb, 0xf5, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xe6, 0xff, 0xff, 0xf0, 0x8f, 0x3f, 0x3e, 0xf8, 0xa3, 0x8f, 0x2e, 0x7f, 0xd9, 0xe3, 0x9f, 0x7f, 0xf4, 0xd1, 0x47, 0x1f, 0xbf, 0xf9, 0xff, 0xfe, 0xe9, 0xbf, 0xff, 0x7c, 0xfb, 0x9f, 0x2f, 0x7f, 0xfd, 0xef, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0x1f, 0xff, 0xff, 0x7f, 0x8b, 0xff, 0xfb, 0xcb, 0x5b, 0xdf, 0x7b, 0xf4, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xbf, 0xeb, 0xff, 0xfb, 0xef, 0xb9, 0xbf, 0xff, 0xbf, 0xfa, 0xf5, 0x4f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 0x7f, 0xad, 0xfd, 0xf7, 0x12, 0x7b, 0x3f, 0xff, 0xed, 0xee, 0xff, 0x58, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xbf, 0xf9, 0xff, 0xff, 0xfb, 0x4f, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xbf, 0xea, 0xc9, 0xff, 0xdf, 0x6d, 0xff, 0xbd, 0x77, 0xff, 0x6f, 0xfa, 0xf7, 0xeb, 0xae, 0xbb, 0xfa, 0xfa, 0xc9, 0x8f, 0xbf, 0xe6, 0xf5, 0xd7, 0x5f, 0x6f, 0xbd, 0x75, 0x57, 0x5d, 0xff, 0x9b, 0xbf, 0xbf, 0xfd, 0x7c, 0xe3, 0xef, 0xcf, 0xfb, 0xff, 0xaf, 0xff, 0xbf, 0xcf, 0xd9, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0xdf, 0x46, 0xff, 0xfd, 0xf7, 0xf7, 0x7f, 0xd7, 0xfe, 0xfa, 0xfd, 0xaf, 0xff, 0xff, 0xbf, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x9f, 0xf9, 0xef, 0xcb, 0xeb, 0xaf, 0xed, 0xfe, 0xbf, 0xff, 0xff, 0xfc, 0xf3, 0x7f, 0x6b, 0xfe, 0xff, 0xf7, 0xae, 0xfb, 0xe7, 0x67, 0xfe, 0xf7, 0xdb, 0xa4, 0xcf, 0xaf, 0x2f, 0xd8, 0xfa, 0xee, 0x5f, 0xee, 0xf5, 0xf5, 0x7e, 0x7f, 0x7f, 0xff, 0xf7, 0x7f, 0x99, 0x7d, 0xfb, 0xff, 0xff, 0xdf, 0xea, 0xef, 0x9f, 0x7e, 0xbf, 0xb5, 0xff, 0x5f, 0xfb, 0xff, 0xff, 0xff, 0x7c, 0xff, 0x7f, 0xe6, 0xff, 0xff, 0x9e, 0xbf, 0xee, 0xf3, 0xa7, 0x17, 0xb4, 0xdd, 0x3e, 0x57, 0x3e, 0xf7, 0xb8, 0xbd, 0xff, 0xff, 0xff, 0x9f, 0xd9, 0xfb, 0xff, 0xcb, 0x8f, 0xbf, 0xdf, 0xfe, 0xff, 0xef, 0xff, 0xdf, 0xe1, 0xbf, 0xf7, 0xff, 0xff, 0xbd, 0xf7, 0xff, 0x6f, 0xfe, 0xf7, 0xff, 0xff, 0xff, 0x6d, 0xfd, 0xf6, 0xff, 0xba, 0xed, 0xfb, 0xbf, 0xbf, 0xff, 0xff, 0x79, 0xbf, 0xfc, 0xff, 0x9b, 0xff, 0xff, 0x1b, 0xbf, 0xee, 0xf3, 0xcd, 0xff, 0xfd, 0xed, 0xff, 0xf7, 0xff, 0xff, 0x6f, 0xf3, 0xef, 0xbf, 0xff, 0xff, 0xe6, 0xff, 0xfe, 0x7f, 0xbf, 0xef, 0xb7, 0xeb, 0xff, 0x6f, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xff, 0xbf, 0xb9, 0xff, 0x5b, 0xe3, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0x77, 0xfd, 0x77, 0xdb, 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x6f, 0xfc, 0x7d, 0xdf, 0xbf, 0x6f, 0xbf, 0xff, 0xfb, 0xfa, 0xcb, 0xfb, 0xde, 0xfe, 0xb1, 0xfb, 0xff, 0x7f, 0xf5, 0xf5, 0xff, 0x9b, 0x7a, 0xff, 0xff, 0xf3, 0xfb, 0xef, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x86, 0x7f, 0xde, 0x7f, 0xbc, 0xf1, 0xef, 0xef, 0x7c, 0xbf, 0xf1, 0xff, 0x3c, 0x7f, 0xa8, 0xfb, 0xf7, 0xf7, 0xdf, 0xff, 0x8f, 0xd9, 0xcf, 0xfe, 0xdb, 0xbf, 0xbe, 0xfc, 0x3b, 0xff, 0x3f, 0xff, 0xff, 0xdd, 0x5f, 0xeb, 0xff, 0xfd, 0xf5, 0xff, 0xff, 0x6d, 0xfe, 0xa7, 0xfe, 0xfa, 0x7b, 0xa5, 0xe7, 0x9f, 0x7e, 0xfa, 0xf9, 0xcf, 0xff, 0xf7, 0xf2, 0x7f, 0x7f, 0x3f, 0xff, 0xff, 0x9b, 0xf5, 0xed, 0xb7, 0xff, 0xfb, 0xff, 0xbc, 0xa7, 0xdf, 0x3b, 0xf7, 0xd9, 0xe7, 0x3d, 0xff, 0xdf, 0x5f, 0x6f, 0xff, 0xd7, 0xe6, 0xfe, 0xee, 0x3b, 0xdb, 0x6f, 0xfa, 0x6f, 0xf6, 0xaf, 0xff, 0xff, 0xfb, 0xed, 0xff, 0xbf, 0xb6, 0x9f, 0xd6, 0xfb, 0xbb, 0x99, 0xff, 0xef, 0xb9, 0xf5, 0xd6, 0x7f, 0xab, 0xfd, 0xf6, 0xd6, 0x77, 0xde, 0x5b, 0x6f, 0xbd, 0xf5, 0x5f, 0xdb, 0xec, 0x6c, 0xec, 0xff, 0x9e, 0x72, 0xff, 0xff, 0xef, 0xda, 0x53, 0xfb, 0xdf, 0x5f, 0x7f, 0xff, 0xf5, 0x73, 0xf9, 0xfd, 0xf7, 0xbf, 0x99, 0xfb, 0xaf, 0xaf, 0xbe, 0xff, 0x6b, 0xff, 0xa1, 0x8d, 0xfb, 0xd7, 0xdf, 0xff, 0xff, 0xf7, 0xd8, 0xf9, 0xfc, 0xff, 0x8f, 0xe6, 0xfd, 0xff, 0xfc, 0xdb, 0x6f, 0xbf, 0xdf, 0x7c, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x6f, 0xbf, 0xed, 0xb7, 0xbd, 0x79, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x5b, 0x67, 0xff, 0xf5, 0xff, 0x3f, 0xff, 0xfa, 0xff, 0xcd, 0x33, 0xee, 0xff, 0x7f, 0x6f, 0xec, 0xd7, 0x7e, 0xe3, 0xef, 0xb5, 0xfb, 0x38, 0xbb, 0xef, 0x77, 0xbf, 0xdd, 0xf7, 0xdb, 0x6f, 0xfc, 0xfd, 0xf7, 0xbf, 0x99, 0xf9, 0xf7, 0xcf, 0x7f, 0xff, 0xfd, 0xf7, 0xfb, 0xff, 0xbf, 0xfd, 0xe7, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xbf, 0xff, 0xcf, 0xe6, 0xbe, 0xff, 0xfb, 0xef, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xf7, 0xff, 0xbb, 0xa9, 0xff, 0xfb, 0x1f, 0xff, 0xbf, 0x56, 0xd3, 0xad, 0xff, 0xff, 0xbd, 0xf7, 0xfb, 0xff, 0xff, 0xf3, 0xfd, 0xf7, 0xff, 0x6a, 0xde, 0xdf, 0xfc, 0x63, 0xdd, 0xad, 0xba, 0xf9, 0xfa, 0xdf, 0x7f, 0xfd, 0xf9, 0xef, 0x3b, 0xef, 0x7c, 0xf7, 0xd7, 0xdf, 0x9b, 0xff, 0xbf, 0xf3, 0xfa, 0xfb, 0xef, 0xee, 0xbb, 0x7e, 0xbe, 0xdf, 0x7f, 0xbf, 0xbf, 0xf7, 0x5f, 0xdb, 0x77, 0xff, 0xef, 0xe6, 0xff, 0xef, 0xe3, 0x8f, 0x3f, 0xfe, 0xec, 0x63, 0xcf, 0x3e, 0xf7, 0xd1, 0xe7, 0x1f, 0x7f, 0xfc, 0xf1, 0x47, 0x9f, 0xbb, 0xf9, 0xff, 0xff, 0xff, 0x7f, 0xbf, 0xff, 0xf6, 0xeb, 0xbf, 0xff, 0xfd, 0xf7, 0x9f, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xdf, 0xff, 0xff, 0xfc, 0xfa, 0xef, 0x5f, 0xff, 0xfd, 0xe7, 0xff, 0xff, 0xfe, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xff, 0xfe, 0xef, 0xbf, 0xbf, 0xfe, 0xfa, 0xdb, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xdf, 0xff, 0xbd, 0xfc, 0xda, 0x7b, 0x2f, 0xff, 0xfe, 0xb6, 0x9f, 0x7f, 0x7e, 0xef, 0xbf, 0xff, 0x7e, 0xfb, 0xbf, 0xf9, 0xff, 0xf5, 0x5b, 0xff, 0xbf, 0xfd, 0xfe, 0xca, 0x3f, 0x3f, 0xfa, 0xff, 0xf7, 0xff, 0x7d, 0xf1, 0xed, 0xb7, 0xfb, 0x6f, 0xfa, 0xff, 0xe3, 0x2f, 0xbd, 0xd4, 0x7a, 0xe3, 0xad, 0xbf, 0xfa, 0xf5, 0xc3, 0x5b, 0x7f, 0xbd, 0x75, 0xd7, 0x5d, 0xfb, 0x9a, 0xff, 0xff, 0x3c, 0xff, 0xf7, 0xfb, 0x37, 0xff, 0x7f, 0x7f, 0xef, 0xff, 0xfe, 0xdd, 0xbf, 0x7f, 0x57, 0x7e, 0xf7, 0xef, 0xc6, 0xff, 0x7f, 0xff, 0xbf, 0xbf, 0xbf, 0xe7, 0xff, 0xf5, 0xf7, 0xff, 0x6e, 0x7e, 0xff, 0xfb, 0xfe, 0xd3, 0xfb, 0xff, 0x9f, 0xf9, 0x7f, 0xff, 0xff, 0x7f, 0xdf, 0xff, 0xdf, 0xbd, 0x7f, 0xfe, 0xeb, 0xff, 0xff, 0xfe, 0xff, 0xe7, 0xcf, 0xff, 0xff, 0x6f, 0xfa, 0xb5, 0x7e, 0xfe, 0xf3, 0xaf, 0xbb, 0xfe, 0xd8, 0xff, 0x7f, 0x7d, 0xf5, 0xf1, 0xff, 0x5f, 0x7e, 0xfe, 0xf9, 0xff, 0x9a, 0xff, 0xbb, 0xff, 0xf5, 0xff, 0xdb, 0x55, 0x7f, 0xef, 0xbf, 0xff, 0x7d, 0xd7, 0xf7, 0xff, 0xd7, 0xff, 0xf7, 0xdf, 0xfe, 0xe6, 0xff, 0xfb, 0x9c, 0xeb, 0xef, 0xe9, 0xff, 0xff, 0x7e, 0xfe, 0xfd, 0xc7, 0xdf, 0xf7, 0x7b, 0xf3, 0xdd, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xe7, 0xcb, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xe7, 0xff, 0x37, 0xb5, 0xf7, 0xdf, 0x7f, 0xf9, 0xf1, 0xff, 0xff, 0x6f, 0xbe, 0xef, 0xff, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0x7f, 0xaf, 0xfd, 0xff, 0xaf, 0xf7, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xef, 0xff, 0xfc, 0xff, 0x8f, 0xfe, 0xcf, 0xdf, 0xef, 0xf5, 0xff, 0xf7, 0xff, 0xef, 0x5d, 0xa7, 0xf7, 0xef, 0xff, 0xff, 0xe6, 0xfb, 0xbf, 0xf3, 0xf6, 0xdf, 0xff, 0xef, 0xff, 0xff, 0xfd, 0xbf, 0xfd, 0xff, 0x7f, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xdf, 0xfe, 0xbf, 0x5e, 0xfd, 0xde, 0xbf, 0xd7, 0xbf, 0xef, 0xfb, 0xff, 0xaf, 0xff, 0x7f, 0xff, 0xf7, 0x6f, 0xfc, 0xdf, 0xfe, 0xf2, 0x6b, 0xbf, 0xff, 0xfb, 0xfa, 0xe7, 0xfc, 0xff, 0xef, 0xd7, 0xdf, 0x7e, 0xff, 0xff, 0xdf, 0x7f, 0x99, 0xff, 0xbf, 0xff, 0xf7, 0xff, 0xef, 0xff, 0xff, 0xf3, 0x7b, 0x7f, 0xff, 0xbf, 0xf5, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x7d, 0x9e, 0xaf, 0xe7, 0xff, 0x7f, 0x1d, 0x7f, 0xfe, 0xf8, 0xcf, 0x3f, 0x7f, 0xa8, 0xff, 0xfd, 0xfc, 0xff, 0xff, 0xaf, 0x99, 0x9f, 0xff, 0xff, 0xf5, 0xff, 0xf7, 0x7f, 0xbd, 0x6f, 0x7f, 0xf7, 0xdf, 0xf4, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x69, 0xfe, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x77, 0xee, 0xff, 0x2f, 0xff, 0x97, 0xd2, 0xeb, 0xff, 0x3f, 0xf5, 0x7f, 0x1b, 0xf4, 0xdf, 0xa6, 0xfe, 0x3f, 0xff, 0xdf, 0x7f, 0xfd, 0xff, 0xf7, 0xdb, 0x7f, 0xbf, 0xff, 0xfe, 0xff, 0x7f, 0xfd, 0x57, 0xe6, 0xfe, 0xdf, 0xef, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf9, 0x7f, 0x9f, 0x2f, 0xbc, 0xd3, 0xff, 0xff, 0xbb, 0x99, 0xff, 0xff, 0x6f, 0xf6, 0xff, 0x5a, 0xff, 0xff, 0xff, 0x56, 0x77, 0x7e, 0x7b, 0x65, 0xbd, 0x77, 0xd4, 0x7f, 0xff, 0x6c, 0x2c, 0xff, 0xc7, 0xfb, 0xff, 0xff, 0xff, 0xcd, 0x37, 0xef, 0xf5, 0x5f, 0xfb, 0xf7, 0xd7, 0xd6, 0x5f, 0xfd, 0xf5, 0xbf, 0x19, 0xd9, 0xff, 0x97, 0xf7, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0x7e, 0xf7, 0x5f, 0xe7, 0xff, 0xd7, 0x5f, 0x59, 0x7f, 0xfd, 0x4f, 0x66, 0xfd, 0xdf, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xf9, 0xb7, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0xb5, 0x79, 0xff, 0xff, 0xfd, 0xf5, 0xf7, 0xff, 0x7f, 0xde, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfb, 0xcc, 0x33, 0xfe, 0xff, 0x7f, 0x6f, 0xec, 0xff, 0xfe, 0x7b, 0xec, 0xb6, 0xdf, 0xfc, 0x7b, 0xed, 0x73, 0xbb, 0xbd, 0xb6, 0x99, 0x6b, 0xfe, 0xfd, 0xf7, 0xbf, 0x99, 0xfb, 0xf7, 0xdf, 0xff, 0xff, 0xfc, 0xf6, 0xff, 0x7f, 0xbf, 0xfd, 0xe7, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xfe, 0xfe, 0xfd, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xdf, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xbb, 0xa9, 0xff, 0xee, 0x7f, 0xef, 0xbf, 0xfe, 0xee, 0xfb, 0xff, 0xff, 0xbf, 0xdd, 0xd7, 0xff, 0xfc, 0xf3, 0xff, 0xff, 0xfb, 0x6a, 0xd8, 0x9f, 0xfd, 0xea, 0xdb, 0x2f, 0xdf, 0xdc, 0x76, 0xdf, 0xf7, 0xfe, 0xf9, 0xe4, 0x3b, 0xff, 0xec, 0xff, 0xff, 0xdf, 0x98, 0xf7, 0xbf, 0xb6, 0xfe, 0xff, 0xf9, 0xfd, 0xfe, 0xfe, 0xfa, 0xff, 0xef, 0xfd, 0xff, 0xe7, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xbf, 0xff, 0xf3, 0x8f, 0x3f, 0xfb, 0xfc, 0xb3, 0x8f, 0x2e, 0x7f, 0xf9, 0x63, 0x9f, 0x7d, 0xf4, 0xf9, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xf6, 0xeb, 0xff, 0x9f, 0xfe, 0xf3, 0x9b, 0x2f, 0xfe, 0xfd, 0xcd, 0xd7, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0x7f, 0xff, 0xfb, 0xaf, 0x9f, 0xfd, 0xfe, 0xeb, 0xdf, 0xff, 0xfd, 0xf4, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xff, 0x3f, 0xef, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xfe, 0xbe, 0xda, 0xf5, 0xcf, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xdf, 0xa0, 0xfd, 0xdd, 0x3b, 0xd8, 0x3f, 0xbf, 0xac, 0xfd, 0xbd, 0xe1, 0x7f, 0xef, 0xbd, 0xbf, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xce, 0xfd, 0xbf, 0xbd, 0xff, 0xff, 0x7d, 0x3f, 0xfa, 0xef, 0xb7, 0xdf, 0x7e, 0xfa, 0xff, 0xff, 0xff, 0x6f, 0xfa, 0xff, 0xeb, 0xaf, 0xbd, 0xfe, 0xea, 0xa3, 0xaf, 0xbe, 0xd6, 0xc5, 0xd7, 0x5f, 0x7d, 0xbd, 0xd5, 0x57, 0x5f, 0xfb, 0x9b, 0xff, 0x7f, 0xf7, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf6, 0xfe, 0x9f, 0xdf, 0x7e, 0x7e, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x46, 0xff, 0xd7, 0x7f, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xeb, 0x9d, 0xf7, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x9f, 0xf9, 0xf7, 0xbf, 0xfd, 0xf3, 0xdf, 0x6f, 0xff, 0xef, 0xff, 0xf7, 0xfe, 0xee, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xfe, 0xf7, 0xff, 0xfe, 0xef, 0xaf, 0x37, 0xec, 0xf7, 0xef, 0x1f, 0xff, 0xff, 0xb4, 0xdf, 0x0f, 0xfd, 0xff, 0xff, 0x9f, 0x9b, 0xff, 0xfb, 0xef, 0xbe, 0xfe, 0xdb, 0xdf, 0xff, 0xbf, 0xfe, 0xed, 0xff, 0x7f, 0xf5, 0xff, 0xef, 0xf5, 0xff, 0xff, 0x7f, 0xe6, 0xef, 0xef, 0x7f, 0xff, 0xdc, 0xff, 0xff, 0x7e, 0xff, 0xfb, 0xfe, 0xff, 0xeb, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xbf, 0xf9, 0xef, 0xf6, 0xff, 0xc5, 0xbf, 0xbc, 0xfa, 0xff, 0x7f, 0xbf, 0xfb, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xee, 0xff, 0xfc, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xfd, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xaf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xb5, 0x7f, 0xff, 0xff, 0xff, 0x6f, 0xf4, 0x3f, 0xfe, 0xff, 0x5e, 0xfe, 0xbf, 0xfe, 0xdf, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x9a, 0xff, 0xff, 0xde, 0x5f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xdf, 0x5f, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xbc, 0xe7, 0x9f, 0xff, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0x9f, 0xf9, 0xfb, 0xf7, 0xdf, 0xb7, 0xdf, 0xfd, 0xf7, 0xcf, 0x3f, 0xff, 0xff, 0xe7, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x6f, 0xfe, 0xbf, 0x7c, 0xfb, 0xef, 0x8f, 0xff, 0xfe, 0xdb, 0xeb, 0x1b, 0x7f, 0xf4, 0xf7, 0xdf, 0x7f, 0xff, 0xbd, 0xf7, 0xff, 0x9b, 0xff, 0xf7, 0xff, 0xf7, 0xf7, 0x7f, 0xfe, 0xff, 0xff, 0xdf, 0xfa, 0x7f, 0xfb, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0xff, 0xfb, 0xbf, 0xff, 0xfa, 0xfa, 0xef, 0x3f, 0x7f, 0xdd, 0xfd, 0xd6, 0x6f, 0xff, 0xbd, 0xf7, 0xdf, 0x7f, 0xff, 0xbf, 0xf9, 0xfe, 0x7c, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf1, 0x87, 0x6f, 0xfe, 0xf9, 0xe3, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xff, 0x6f, 0xfe, 0x7f, 0xff, 0xfe, 0xd9, 0xde, 0xbd, 0xff, 0xfe, 0xf7, 0xb7, 0xff, 0xfe, 0xfd, 0xf7, 0xcf, 0x7f, 0xff, 0xfd, 0xff, 0x9b, 0xff, 0xdf, 0x7f, 0xfa, 0xf9, 0xa7, 0xdf, 0x7e, 0xfa, 0xf9, 0xef, 0x3f, 0xfd, 0xf6, 0xd3, 0x4f, 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xfd, 0xdf, 0xdf, 0x7f, 0xff, 0xff, 0xd7, 0xdf, 0x7f, 0xff, 0xfb, 0xfe, 0xbd, 0xff, 0xfe, 0xfb, 0xef, 0xbe, 0xff, 0xbf, 0xf9, 0x7f, 0xfe, 0xff, 0xff, 0xbd, 0xff, 0xeb, 0x7f, 0xfd, 0xf7, 0xfb, 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x6f, 0xde, 0xff, 0x7b, 0xfd, 0xf7, 0xff, 0x6f, 0xff, 0xfd, 0xf7, 0xbe, 0xff, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xf3, 0xff, 0xde, 0xff, 0xff, 0xbf, 0xbf, 0xbb, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xdf, 0x7f, 0xfd, 0xf9, 0xf7, 0x9f, 0x7f, 0xff, 0xfd, 0xef, 0xb7, 0xff, 0xfc, 0xeb, 0xef, 0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xef, 0xb6, 0xdf, 0x7e, 0xbb, 0xed, 0xb7, 0xdf, 0x7a, 0xfb, 0xdb, 0x6d, 0xbd, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xfb, 0xed, 0xb7, 0xdf, 0x7f, 0xfb, 0xfb, 0xef, 0xbf, 0xfd, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xdd, 0x7b, 0xff, 0xfd, 0xf7, 0xbe, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xbb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 0xdd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xaf, 0xbf, 0xfe, 0xfa, 0xfb, 0xef, 0xbe, 0xfe, 0xfa, 0xd7, 0x5f, 0x7f, 0xfd, 0xfd, 0xd7, 0x5f, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xf3, 0xe6, 0xff, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xbf, 0xf9, 0xff, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7e, 0xdd, 0xe5, 0x2e, 0xbf, 0xee, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0x6f, 0xde, 0xff, 0xf6, 0xfb, 0xef, 0xbf, 0xff, 0xda, 0xfb, 0x67, 0x57, 0xb9, 0xfd, 0xf5, 0xdf, 0x7e, 0xff, 0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf7, 0xff, 0xe6, 0xfe, 0x5f, 0xef, 0xbf, 0xef, 0xbe, 0xff, 0xeb, 0xff, 0xf6, 0xbf, 0xf7, 0xff, 0x7e, 0xef, 0xed, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0x71, 0xf7, 0xd7, 0x73, 0xcf, 0x79, 0xf7, 0xb7, 0xff, 0xfe, 0xfb, 0xab, 0xaf, 0xbf, 0xfb, 0xfa, 0xfb, 0xef, 0x6f, 0xfe, 0xff }; /* rom names */ #define AFSK_ROM_SWROMIE 0 #define AFSK_ROM_SWROMOE 16 /* rom locations */ static const unsigned long afsk_roms[32] = { 45961, 46129, 45629, 45797, 45297, 45465, 44965, 45133, 46127, 45963, 45795, 45631, 45463, 45299, 45131, 44967, 31023, 30855, 30857, 31021, 31355, 31187, 31189, 31353, 31687, 31519, 31521, 31685, 32019, 31851, 31853, 32017 }; baycomusb-0.10.orig/fpga/fsk_firmware.h0100644000175100017510000023670607340435103016172 0ustar abaaba/*****************************************************************************/ /* * fsk_firmware.h -- HDLC packet radio modem for EPP using FPGA utility. * * Copyright (C) 1998 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define FSK_FIRMWAREDATE "20010821" /* firmware */ static const unsigned char fsk_firmware[] = { 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xee, 0x7f, 0xde, 0xfd, 0xf5, 0xd7, 0x5f, 0x7e, 0xb7, 0xed, 0xbd, 0xef, 0xfe, 0xf2, 0xee, 0xaf, 0xbf, 0xfe, 0xf6, 0xfb, 0x9b, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xed, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0x8f, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0x7f, 0xfc, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 0xfe, 0xff, 0xc6, 0x5f, 0x6f, 0xfd, 0xf5, 0xd6, 0x5f, 0x7f, 0x7d, 0xe3, 0xaf, 0x37, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0x9b, 0xff, 0x5f, 0xf5, 0xf5, 0xd5, 0x5f, 0x5f, 0xfd, 0xf5, 0xd7, 0xa7, 0xfa, 0xfa, 0xaa, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xff, 0xc6, 0xff, 0x3f, 0xff, 0xbc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff, 0x6d, 0xbf, 0xcf, 0xfe, 0xfb, 0xed, 0xbf, 0xff, 0xfe, 0xb6, 0xdf, 0x6f, 0xfb, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xeb, 0xaf, 0xbe, 0xfa, 0xfa, 0xeb, 0xef, 0xbe, 0xff, 0xf5, 0xd7, 0x5f, 0x7d, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0x9b, 0xff, 0xff, 0xfe, 0xbb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0x7f, 0xff, 0xfd, 0x77, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xdf, 0x7f, 0x7f, 0xbd, 0xf7, 0xdf, 0x7f, 0xef, 0xfd, 0xe9, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0x7d, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6f, 0xf4, 0xff, 0xed, 0xb7, 0xdf, 0x7e, 0xdb, 0xed, 0xb7, 0xdf, 0xfe, 0x76, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xfd, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xdd, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xfe, 0xfe, 0xfb, 0xee, 0xe6, 0xbf, 0xdf, 0x7f, 0xff, 0xfd, 0xe7, 0xdf, 0x7f, 0xdf, 0xfd, 0xee, 0xbb, 0xff, 0xff, 0xfb, 0xaf, 0xbb, 0xff, 0xbe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3, 0xcf, 0x3b, 0x7f, 0x7c, 0x71, 0xcf, 0x5f, 0xfe, 0xfd, 0xe3, 0x9e, 0x3f, 0xfe, 0xe9, 0xe7, 0xff, 0x6f, 0xfe, 0xff, 0x7c, 0xd7, 0x8f, 0x7f, 0xff, 0x7c, 0xe7, 0x9f, 0x77, 0xfe, 0xfb, 0xff, 0xbf, 0xfb, 0xfe, 0xbb, 0xef, 0xff, 0x9b, 0xdd, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xe7, 0x9b, 0x7f, 0xde, 0x79, 0xe7, 0x9d, 0x7f, 0xee, 0xdd, 0x66, 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xfe, 0xdf, 0xdf, 0xff, 0xfd, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xff, 0x3e, 0xfb, 0xef, 0x7f, 0xf5, 0xfd, 0xf7, 0xcf, 0x7f, 0xff, 0xfd, 0xf7, 0xf7, 0x6f, 0xfe, 0xff, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xf5, 0xd6, 0xdb, 0xdf, 0x3e, 0x7b, 0xfd, 0xb7, 0xdf, 0xfe, 0xfb, 0xed, 0xfb, 0x9b, 0xff, 0xef, 0xdf, 0xff, 0xff, 0xff, 0x77, 0xfb, 0xff, 0xdf, 0xff, 0xff, 0xdf, 0xf1, 0xef, 0xbf, 0xdf, 0xfe, 0xff, 0xff, 0xa6, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff, 0xef, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xbf, 0xbf, 0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xf3, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbe, 0xf9, 0xff, 0xfd, 0xfe, 0xbf, 0xff, 0xf8, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x7f, 0xff, 0xff, 0xfe, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7b, 0xff, 0xfd, 0xf7, 0xbf, 0xfe, 0xfa, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xe6, 0xff, 0xda, 0xff, 0xf7, 0xd7, 0xff, 0xbf, 0xff, 0xbf, 0xfd, 0xc6, 0xfe, 0x5f, 0xfe, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbb, 0xf9, 0xff, 0x7e, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xef, 0x3f, 0xff, 0xfe, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xfd, 0x6f, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0xfd, 0x5f, 0xff, 0xf3, 0xfd, 0xf7, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xfb, 0xff, 0xff, 0xef, 0xff, 0xc6, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xfb, 0xef, 0xbb, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xbf, 0xf9, 0xff, 0x72, 0x9f, 0x7f, 0xff, 0xdd, 0xfa, 0x7f, 0x0f, 0xfb, 0xfb, 0x7f, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x6f, 0xfe, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0x7f, 0xfd, 0xbf, 0xfb, 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xef, 0xff, 0xde, 0xfd, 0x9b, 0xff, 0xef, 0xdf, 0xff, 0xbf, 0xff, 0xf7, 0xff, 0x7e, 0xf9, 0xf9, 0xff, 0x7f, 0xfc, 0xf3, 0x8f, 0x3f, 0x77, 0xfd, 0xff, 0x66, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xdf, 0x6b, 0xff, 0xbf, 0xf7, 0x95, 0xd6, 0xde, 0x7f, 0xff, 0xfd, 0xf7, 0xfb, 0xff, 0xaf, 0xf9, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0xf7, 0x7f, 0xde, 0xbf, 0xbd, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 0xd7, 0xfd, 0xbf, 0xfb, 0x6d, 0xf6, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0xff, 0xff, 0xec, 0xf1, 0x17, 0x7e, 0xfe, 0xf9, 0xe2, 0x8f, 0x3f, 0xfe, 0xba, 0xff, 0x99, 0xfd, 0xff, 0xbf, 0xfd, 0xf6, 0xdb, 0xff, 0xdf, 0xcd, 0xf7, 0xdd, 0xcf, 0xfa, 0xf3, 0xef, 0xbf, 0xff, 0xfe, 0xfe, 0xff, 0xa6, 0xff, 0xff, 0x7a, 0xff, 0xf5, 0xf7, 0xdf, 0x1f, 0x7f, 0xdf, 0xf7, 0x9d, 0x3f, 0xfe, 0xfc, 0xf3, 0xcf, 0xfd, 0xfd, 0xbf, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xeb, 0xff, 0x7f, 0xdd, 0xfb, 0xef, 0xbf, 0xef, 0xfe, 0xfb, 0xfe, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xde, 0xf5, 0xff, 0x9f, 0xff, 0xfd, 0xff, 0xdf, 0xfe, 0xff, 0x1b, 0xfe, 0xff, 0xff, 0xfb, 0xfb, 0xbf, 0xef, 0xfe, 0xfb, 0x4a, 0x7e, 0xf9, 0xfd, 0xf7, 0x9f, 0x7f, 0xff, 0xfd, 0xff, 0x3f, 0x66, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xef, 0xbb, 0x6f, 0xff, 0xc5, 0x9f, 0xff, 0x5f, 0x7e, 0xf9, 0xe5, 0x97, 0xff, 0xff, 0xb7, 0xf9, 0xff, 0xff, 0xff, 0xbf, 0x95, 0xf6, 0xfe, 0xff, 0xe5, 0xff, 0xfb, 0xcf, 0xd6, 0x5b, 0x6f, 0xbd, 0xf5, 0xfa, 0xff, 0x6f, 0xd6, 0xff, 0xff, 0xff, 0xfb, 0xac, 0xbf, 0xff, 0x7e, 0xfe, 0x9c, 0xfe, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xff, 0x5f, 0x9b, 0xfb, 0xff, 0xff, 0xf7, 0xdb, 0x7f, 0xbf, 0xbd, 0xf6, 0xbb, 0xd5, 0x5e, 0x79, 0xad, 0xb4, 0xd7, 0x4b, 0x5b, 0xef, 0xef, 0x66, 0xfe, 0xff, 0xff, 0xbe, 0xfb, 0xef, 0x6f, 0xbf, 0xd5, 0xfb, 0xb5, 0x57, 0xff, 0xb3, 0xef, 0xff, 0xfb, 0xde, 0xfd, 0xb3, 0xb1, 0xff, 0xff, 0xbf, 0xb5, 0x96, 0xfa, 0xdb, 0x6b, 0xff, 0x7d, 0xad, 0xd5, 0xfe, 0xff, 0xff, 0x7f, 0xff, 0x57, 0xbf, 0x66, 0xee, 0xff, 0xff, 0x5f, 0x7b, 0xaf, 0xfd, 0xf6, 0xdb, 0x7f, 0x7f, 0x43, 0x2d, 0xb5, 0xd7, 0x5e, 0x7b, 0xed, 0xb5, 0xbf, 0x9b, 0xf7, 0xff, 0xff, 0xbd, 0xb7, 0xdd, 0xf6, 0xff, 0xff, 0x3f, 0xfb, 0xff, 0x5a, 0xdf, 0x7d, 0xf7, 0xfd, 0xf7, 0xcf, 0xf6, 0xe6, 0xfd, 0xff, 0x7f, 0xfe, 0xd9, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x37, 0xde, 0x67, 0x9f, 0x5d, 0xf6, 0xf9, 0xef, 0xbd, 0xb1, 0xff, 0xfb, 0x0f, 0x3f, 0xee, 0xf0, 0xfb, 0xef, 0xbf, 0xd7, 0xed, 0x85, 0xd7, 0x5f, 0x2f, 0xbd, 0xf4, 0xdb, 0xf6, 0x62, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xe7, 0xec, 0xb7, 0xcf, 0x3e, 0x7b, 0xfe, 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x77, 0xfb, 0x6d, 0xb7, 0xdb, 0xde, 0xff, 0xef, 0xa6, 0xfe, 0xff, 0x7f, 0xbc, 0xf0, 0xc2, 0xfb, 0xef, 0xff, 0xf7, 0xc7, 0x3f, 0x5e, 0x6b, 0xed, 0xb5, 0xd7, 0x5e, 0xff, 0xab, 0x79, 0xf7, 0xff, 0xbf, 0x2f, 0xbe, 0xf8, 0x6b, 0xbb, 0x7d, 0xfe, 0xb3, 0xdf, 0x7f, 0xff, 0xfd, 0xd7, 0xdf, 0x17, 0x7f, 0x63, 0xee, 0xf7, 0xff, 0x77, 0xdf, 0x7f, 0xbf, 0xdf, 0x7e, 0xeb, 0x75, 0xfe, 0xfb, 0xff, 0xff, 0xfb, 0xef, 0xff, 0x7f, 0xfe, 0x9a, 0xfb, 0xff, 0xcf, 0x3f, 0xff, 0xfc, 0xb3, 0x8f, 0x3f, 0xfa, 0xfc, 0xe7, 0x1f, 0x7d, 0xf4, 0xd1, 0x45, 0x8f, 0x7f, 0xbe, 0xe6, 0xff, 0xdf, 0x7f, 0xbe, 0xfc, 0xfa, 0xef, 0xbf, 0xbf, 0xfe, 0xcf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xf9, 0x7f, 0xff, 0xff, 0xaf, 0xbf, 0xfe, 0xfe, 0xef, 0xaf, 0xff, 0xff, 0xff, 0xd7, 0x5f, 0x7f, 0x7d, 0xf5, 0xd7, 0xbf, 0x6f, 0xf6, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xff, 0xfe, 0xeb, 0xbf, 0xef, 0xfd, 0xfb, 0xd5, 0x57, 0x5f, 0x75, 0xb5, 0xcf, 0xf7, 0x9b, 0xff, 0x7f, 0xff, 0xf7, 0xdf, 0x7f, 0xef, 0xfd, 0xfe, 0xff, 0xbb, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0x1b, 0x7f, 0x3f, 0xb5, 0xec, 0xff, 0xd7, 0x5f, 0xfb, 0xcd, 0xb6, 0xbe, 0xfe, 0xaf, 0xe9, 0xff, 0xaf, 0xbf, 0xfc, 0xf2, 0xeb, 0x2f, 0xbf, 0xe8, 0xb2, 0xd7, 0x5f, 0x77, 0xfd, 0xf5, 0xd7, 0x5d, 0x3d, 0xdd, 0x6b, 0xee, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0x1d, 0xf8, 0xee, 0xff, 0x1f, 0xfe, 0xfb, 0xbe, 0xe7, 0x9e, 0x7f, 0xf7, 0xe7, 0xff, 0x1b, 0xff, 0xf7, 0x7f, 0xfd, 0xf9, 0xf6, 0x2f, 0xdf, 0x6f, 0xaf, 0xbf, 0xda, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xf8, 0x6e, 0xe6, 0xbf, 0xeb, 0xbf, 0xff, 0xf7, 0x3b, 0xff, 0xff, 0xff, 0xf3, 0xb5, 0xfd, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xaf, 0xf9, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xef, 0xfb, 0x6f, 0x8d, 0xef, 0xfd, 0xef, 0x97, 0x5f, 0xef, 0xbf, 0xfd, 0xc6, 0xff, 0x6f, 0xfe, 0xfd, 0xbf, 0xdf, 0xff, 0xff, 0xfb, 0xbf, 0xfe, 0xf7, 0xf7, 0xff, 0xff, 0xd5, 0xd5, 0xef, 0xbf, 0xfd, 0xfd, 0xfd, 0x9b, 0xff, 0xff, 0xff, 0xef, 0xff, 0xed, 0xef, 0xff, 0xee, 0xbb, 0xc7, 0xf7, 0xff, 0xff, 0xf3, 0xdf, 0x7f, 0xf7, 0xed, 0xff, 0xe6, 0xbf, 0x7f, 0x7f, 0xff, 0xff, 0x3e, 0xff, 0xcf, 0x3f, 0xff, 0xfe, 0xbf, 0xfe, 0x7e, 0xcf, 0xed, 0xb5, 0xcf, 0xef, 0xbf, 0xf9, 0xff, 0x7f, 0xff, 0xff, 0xbd, 0xfd, 0xff, 0xfa, 0xed, 0xff, 0x77, 0xff, 0x7f, 0x7f, 0xef, 0xb9, 0xe7, 0x9f, 0xff, 0x6b, 0xfe, 0xaf, 0xff, 0xfc, 0xbf, 0xff, 0x3c, 0xff, 0xbf, 0xfb, 0x9a, 0xf5, 0xff, 0xf9, 0xe7, 0x1f, 0x7b, 0x7e, 0x91, 0xf7, 0x9a, 0xff, 0xef, 0xbf, 0xfd, 0xff, 0xfe, 0xc7, 0xff, 0xff, 0xfe, 0x57, 0xff, 0x7f, 0xbd, 0xad, 0xdd, 0xcf, 0xfe, 0xfd, 0xfe, 0xe6, 0xff, 0xff, 0x2f, 0xff, 0xed, 0xff, 0xff, 0xf3, 0xb7, 0xe4, 0x77, 0xfa, 0xf9, 0xf7, 0xf9, 0x75, 0x96, 0x4f, 0xbf, 0xbf, 0xf1, 0xf7, 0xdf, 0x6b, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x77, 0xff, 0xf6, 0xff, 0xfb, 0x3f, 0x7f, 0xfd, 0xf5, 0x57, 0xff, 0x67, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x1b, 0xfe, 0xff, 0xfc, 0xff, 0x7f, 0xaa, 0xaf, 0xbc, 0xfe, 0xee, 0xff, 0xcb, 0xad, 0x3f, 0xdd, 0xfc, 0xf9, 0xe5, 0xff, 0x3f, 0x66, 0xff, 0x5f, 0xff, 0xff, 0x9f, 0xda, 0xbf, 0xff, 0xa7, 0xfc, 0xff, 0x74, 0xea, 0x63, 0xf7, 0xbd, 0xf7, 0xf8, 0xff, 0xb7, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x97, 0xf9, 0xf2, 0xfb, 0xe5, 0xff, 0xff, 0xfd, 0xd7, 0xd3, 0xaf, 0xf9, 0xc7, 0x9c, 0xff, 0x6f, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x7f, 0xff, 0xfe, 0xfb, 0xff, 0x7f, 0x9f, 0xf5, 0xf6, 0x5b, 0x66, 0x3d, 0xdd, 0x5f, 0x9b, 0xfb, 0xff, 0xfd, 0xf7, 0xdf, 0x0b, 0xa6, 0xd8, 0x67, 0x5e, 0xf5, 0xde, 0xfb, 0x6f, 0xbf, 0xdd, 0x6a, 0xb1, 0xed, 0xef, 0x66, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xe6, 0x5d, 0xaf, 0x9d, 0x7b, 0xdd, 0x77, 0xff, 0x7d, 0xd7, 0x5c, 0x73, 0xdf, 0xbd, 0xb3, 0xb1, 0xff, 0xef, 0xbf, 0xf5, 0xd7, 0xb7, 0x7a, 0xef, 0xeb, 0x62, 0x95, 0xbd, 0x52, 0xd9, 0xfd, 0xf5, 0xd7, 0xde, 0xf0, 0x66, 0xe6, 0xff, 0xf7, 0x5f, 0x3d, 0xef, 0xd4, 0x97, 0xfb, 0x7b, 0x55, 0x7b, 0xa7, 0xb5, 0xfa, 0xde, 0x6b, 0x0f, 0x9d, 0x3a, 0x9b, 0xf5, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0x76, 0xcb, 0xff, 0xf7, 0xbb, 0xf9, 0xde, 0xfb, 0x6f, 0xbb, 0xf6, 0xb2, 0x8b, 0xb7, 0xe6, 0xfd, 0x9f, 0x7f, 0xfe, 0xf9, 0x77, 0xdf, 0xff, 0xff, 0x99, 0xcf, 0x3c, 0xfb, 0xfc, 0xf3, 0x8f, 0x3f, 0xfa, 0xcc, 0xb5, 0xb1, 0xff, 0xe3, 0x8f, 0x3f, 0xdf, 0xee, 0x73, 0xed, 0x3f, 0xde, 0xf1, 0xe7, 0x1d, 0x7f, 0xb8, 0xb1, 0x46, 0x9b, 0xff, 0x66, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xe7, 0xb9, 0xc7, 0xbe, 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xfd, 0xf7, 0xef, 0xf7, 0xaf, 0xa6, 0xfe, 0x1f, 0x3f, 0xbc, 0xf4, 0xd6, 0xbd, 0xef, 0xbf, 0xf0, 0x8d, 0x13, 0x5e, 0xf8, 0xe3, 0x87, 0x1f, 0x5e, 0xf8, 0xbb, 0x79, 0xff, 0xef, 0x8f, 0x2f, 0x9e, 0xd8, 0xef, 0xaf, 0x2f, 0xf6, 0xf3, 0xc5, 0x13, 0x7f, 0x7c, 0xf3, 0xcc, 0x17, 0x7b, 0x63, 0xfe, 0xff, 0xfb, 0xf3, 0xeb, 0xaf, 0x93, 0xfc, 0xfe, 0xeb, 0xd5, 0xee, 0xbf, 0xe5, 0x9f, 0x7d, 0xfe, 0xb9, 0xef, 0xff, 0x9b, 0xff, 0xff, 0xcf, 0x3e, 0xfa, 0xe8, 0xa3, 0xcf, 0x0e, 0xf2, 0xfc, 0xe7, 0x1e, 0x7d, 0xfe, 0xf0, 0xe7, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0xdf, 0x3f, 0xff, 0xfd, 0xfb, 0xe9, 0xbf, 0xdf, 0xf9, 0xef, 0x17, 0xff, 0xff, 0xfd, 0xe6, 0x9f, 0x7f, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xfa, 0xfb, 0xf9, 0xff, 0xff, 0xf5, 0xff, 0xdf, 0xef, 0xff, 0xfd, 0xd7, 0xf7, 0x6f, 0xfe, 0xff, 0xfd, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0x6f, 0xfc, 0xff, 0xff, 0xd7, 0x7f, 0xfe, 0xf9, 0xdf, 0xff, 0x9b, 0xff, 0xff, 0xfd, 0xf6, 0xdf, 0x7f, 0xfd, 0xbd, 0xd7, 0xff, 0xf3, 0xff, 0xfb, 0xef, 0xb7, 0xfe, 0xfe, 0x7b, 0xdf, 0xff, 0xe6, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfe, 0xdb, 0x3f, 0xbf, 0xfc, 0xe8, 0xb7, 0xff, 0xff, 0xfa, 0xeb, 0xaf, 0xff, 0xcf, 0xbf, 0xe9, 0xff, 0xaf, 0xbf, 0xfa, 0xb2, 0xeb, 0xaf, 0x3f, 0xde, 0xd8, 0xd6, 0x5f, 0x7b, 0xf5, 0xc4, 0x97, 0x5f, 0x7c, 0xfd, 0x6b, 0xfe, 0xf7, 0x5d, 0xe3, 0xff, 0xf7, 0x3b, 0xf8, 0xff, 0xff, 0x7e, 0x27, 0xbc, 0x7f, 0xff, 0x7d, 0xf6, 0xd3, 0x7f, 0xff, 0x1b, 0xff, 0xdf, 0x7b, 0x76, 0xff, 0xff, 0xed, 0xd3, 0xff, 0xf7, 0xdf, 0xfd, 0xd7, 0xff, 0xff, 0x77, 0xb0, 0xff, 0xb3, 0x7f, 0xe6, 0xff, 0xff, 0xff, 0xd6, 0xf7, 0xff, 0xae, 0xfa, 0xc4, 0xfd, 0xbf, 0xdf, 0xee, 0xbf, 0xff, 0xfa, 0xff, 0xff, 0x9f, 0xbf, 0xe9, 0xff, 0xef, 0xff, 0xbf, 0x17, 0xbd, 0xfb, 0xef, 0xae, 0xfe, 0xf5, 0xff, 0xe7, 0x1f, 0x6f, 0x3c, 0xbf, 0xfe, 0xff, 0x6f, 0xfe, 0xdf, 0xbf, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xf7, 0xff, 0xff, 0xf5, 0xd7, 0xbf, 0x7f, 0xbf, 0xff, 0x9a, 0xff, 0xfd, 0xff, 0xfb, 0xbf, 0xe5, 0xec, 0xbb, 0xef, 0x38, 0xc3, 0xff, 0xff, 0xfc, 0xd7, 0xdf, 0x7d, 0xdb, 0xdd, 0xff, 0xe6, 0xff, 0xdf, 0xfe, 0xfd, 0xff, 0xe6, 0xff, 0x7f, 0xbf, 0xfc, 0xf5, 0xbf, 0x5f, 0x3f, 0xfe, 0xf1, 0xc7, 0x1f, 0xfd, 0xaf, 0xb9, 0xff, 0x7f, 0xff, 0xff, 0xe5, 0xfe, 0xcf, 0xfd, 0xfc, 0xfc, 0xff, 0xdf, 0xff, 0x6d, 0xfd, 0xbf, 0xbf, 0xff, 0xe6, 0x6f, 0xfa, 0x1f, 0x6f, 0x8d, 0xff, 0x8f, 0x5f, 0xff, 0xfd, 0xa3, 0xba, 0x7f, 0xfc, 0xfb, 0x7f, 0xec, 0xf3, 0x9f, 0x7f, 0xff, 0x9b, 0xfe, 0xcf, 0x7f, 0xff, 0xef, 0x5f, 0xbf, 0xfd, 0xf5, 0x6b, 0xef, 0xb1, 0xbb, 0xfd, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x3f, 0xfb, 0x3e, 0xfb, 0xfd, 0xa7, 0xf7, 0xfe, 0xe7, 0xff, 0x7e, 0x7e, 0xf9, 0xf7, 0xdf, 0x67, 0xfe, 0xbf, 0xf1, 0xff, 0xff, 0xe7, 0x3f, 0x7f, 0xbd, 0xff, 0xeb, 0x37, 0xdf, 0xfd, 0x1f, 0xdf, 0x77, 0x7f, 0xfc, 0xb1, 0xc7, 0xfa, 0x65, 0xfa, 0xff, 0xfb, 0xfb, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x97, 0xff, 0xff, 0xb9, 0xdf, 0xff, 0xfd, 0xef, 0x7f, 0xff, 0x1b, 0xfe, 0xff, 0xfc, 0xfa, 0xff, 0x2f, 0xf5, 0xfe, 0x96, 0xeb, 0x7f, 0xff, 0x7f, 0xf7, 0xff, 0x7a, 0xff, 0xab, 0xf7, 0x3f, 0x66, 0xff, 0xbf, 0xef, 0xfe, 0xff, 0x76, 0x5e, 0xef, 0xbf, 0x5d, 0xd5, 0xff, 0x7f, 0x7e, 0xbd, 0xf4, 0xd7, 0x4b, 0xff, 0xb7, 0xf9, 0x9f, 0xfa, 0xef, 0xff, 0xe7, 0xce, 0x73, 0xf9, 0xbc, 0xf3, 0xff, 0xf5, 0xf4, 0x5a, 0x6f, 0xb5, 0xf5, 0x56, 0xff, 0x6f, 0xd6, 0xb3, 0xfe, 0xfe, 0xff, 0xec, 0x33, 0xfd, 0xfe, 0xfb, 0x7d, 0x6f, 0x9d, 0xff, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0x5f, 0x9b, 0xfb, 0xff, 0xfd, 0x7e, 0xdf, 0x6b, 0x65, 0xff, 0x56, 0xdb, 0xf6, 0xe2, 0xfb, 0xef, 0xb4, 0xd2, 0x4a, 0x2b, 0xcd, 0xee, 0x66, 0xfe, 0xbf, 0xef, 0xc6, 0xff, 0xdf, 0x8d, 0xe7, 0xbe, 0x6a, 0xdf, 0x7b, 0x5f, 0x95, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xb3, 0xb1, 0xff, 0xea, 0xef, 0xff, 0xd4, 0xb6, 0x1a, 0xfa, 0xbf, 0x7e, 0x75, 0xf5, 0xd7, 0xeb, 0xaf, 0xff, 0xff, 0xfa, 0xff, 0x66, 0xe6, 0xbf, 0xf6, 0xde, 0x7f, 0xef, 0xbd, 0xd6, 0x0e, 0x7b, 0xff, 0x7b, 0xe5, 0x9f, 0xd2, 0x4a, 0x7b, 0xad, 0xb4, 0x3f, 0x9a, 0xf6, 0x7f, 0xff, 0x6f, 0xbf, 0xff, 0xff, 0xef, 0xfd, 0xf7, 0xbb, 0xff, 0xfe, 0xdb, 0x7f, 0xf7, 0xdd, 0x77, 0xdf, 0xf7, 0xe6, 0xfd, 0x9f, 0xff, 0xf6, 0x5f, 0xdf, 0x9f, 0x79, 0xfe, 0xf9, 0xcf, 0x3c, 0xff, 0xbc, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xb5, 0x91, 0xff, 0xe3, 0xed, 0xb6, 0xef, 0x5e, 0xeb, 0xcf, 0x37, 0xd6, 0xf1, 0xe7, 0x9f, 0x5f, 0x2f, 0xfd, 0xf4, 0xd7, 0xff, 0x66, 0xe6, 0xff, 0x6f, 0xbf, 0xfd, 0xf7, 0xff, 0x7f, 0xbf, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xb3, 0xcf, 0x76, 0xfb, 0xec, 0x3b, 0x9b, 0xfb, 0xff, 0xf7, 0xdb, 0xff, 0xfe, 0xff, 0xfb, 0xfb, 0x7f, 0xff, 0xff, 0xed, 0xb7, 0xed, 0xb5, 0xdf, 0x76, 0xdb, 0xef, 0xa6, 0xfe, 0x1f, 0xaf, 0xbd, 0xf6, 0xde, 0x1b, 0x2f, 0xbd, 0xf0, 0x8d, 0x97, 0x5e, 0x7a, 0xed, 0xb5, 0xd6, 0x5e, 0xfb, 0xab, 0x79, 0xdf, 0xef, 0xbf, 0xad, 0xbe, 0xfa, 0xe2, 0x8f, 0x27, 0xfe, 0xf3, 0xc4, 0x3f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0x7f, 0x6f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xed, 0xf7, 0xfa, 0xfa, 0xff, 0x77, 0x3f, 0xfd, 0x7f, 0xff, 0xfb, 0xf7, 0xbf, 0xff, 0xff, 0x9b, 0xff, 0xff, 0x87, 0x3e, 0xff, 0xe8, 0xf3, 0xcf, 0x3e, 0x77, 0xb4, 0x47, 0x1f, 0x7f, 0xf4, 0xd1, 0x47, 0x1f, 0x7d, 0xfe, 0xe6, 0xff, 0xdf, 0x27, 0xff, 0xfd, 0xfb, 0xeb, 0x3f, 0xbf, 0x7c, 0xe7, 0xbf, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xaf, 0x7f, 0xfb, 0xef, 0xff, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xdf, 0xff, 0xcb, 0xbf, 0xff, 0xff, 0xeb, 0x9f, 0x4d, 0xff, 0xff, 0xfd, 0x57, 0x5f, 0x7d, 0xf5, 0xd5, 0xff, 0x9b, 0xff, 0xff, 0xb5, 0xf6, 0xda, 0x7f, 0xff, 0xfd, 0xff, 0x7b, 0xdf, 0xfe, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x66, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0x4b, 0x3f, 0xf9, 0xfd, 0xff, 0x9f, 0x7e, 0xff, 0xfd, 0xa7, 0x9f, 0xfe, 0xbf, 0xe9, 0xff, 0xaf, 0xbf, 0xfe, 0xba, 0xab, 0xaf, 0xbb, 0xfe, 0x72, 0xc7, 0x5f, 0x6f, 0xbd, 0xe5, 0xd7, 0x5f, 0x6f, 0xf4, 0x6d, 0xfe, 0xff, 0xfc, 0xf3, 0x6f, 0xfd, 0xf2, 0xff, 0xe3, 0xc7, 0xfe, 0xbe, 0x6b, 0xc7, 0xfe, 0xad, 0xf7, 0xd6, 0xbf, 0xff, 0x1b, 0xff, 0xf7, 0xf7, 0xdf, 0xff, 0xff, 0xf7, 0x9e, 0xcb, 0xbe, 0xef, 0xdb, 0x6f, 0xbf, 0xff, 0xfe, 0xfa, 0xa3, 0xef, 0x7b, 0xe6, 0xff, 0xea, 0xa7, 0x7f, 0xef, 0xff, 0xff, 0xd7, 0xff, 0xf6, 0xff, 0xff, 0xbe, 0x9d, 0xff, 0xdf, 0xff, 0xff, 0xef, 0xbf, 0xf9, 0xdf, 0x6f, 0xf3, 0xcd, 0x3f, 0xd7, 0xff, 0xff, 0xbe, 0x77, 0xfd, 0xf5, 0x9f, 0xdd, 0x7b, 0xbd, 0xd7, 0xd7, 0xbf, 0x67, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdb, 0xff, 0xff, 0xfb, 0x7f, 0xfb, 0x9b, 0xfb, 0xbd, 0xdd, 0xde, 0x9e, 0xeb, 0xfe, 0x9b, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xdf, 0x9f, 0xfd, 0xdf, 0xbf, 0xf6, 0x5d, 0xff, 0xbf, 0xf7, 0xdd, 0x7f, 0xbf, 0xdd, 0xff, 0xe6, 0xff, 0xff, 0xfb, 0xdf, 0xe7, 0xfa, 0xbb, 0xff, 0xbf, 0xff, 0xff, 0x67, 0xff, 0x3f, 0xce, 0xed, 0xf7, 0xde, 0xef, 0xbf, 0xf9, 0xeb, 0x2f, 0x1f, 0x7d, 0xfc, 0xd7, 0xfb, 0xfd, 0xbb, 0x9d, 0xf7, 0xf7, 0x7b, 0xdf, 0xef, 0xf9, 0xed, 0x9f, 0xff, 0x6b, 0xfe, 0xff, 0x7f, 0xbf, 0xff, 0xdf, 0xfb, 0xf7, 0xff, 0xe3, 0xfb, 0x13, 0xcc, 0x4d, 0xff, 0x9f, 0x2b, 0xbe, 0x7c, 0xff, 0x9b, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xf7, 0xff, 0xfd, 0xdf, 0x7b, 0xff, 0x7f, 0x5f, 0x7f, 0xfe, 0xb3, 0x5e, 0x7f, 0xff, 0xfe, 0xe6, 0xfe, 0xfd, 0xbf, 0xbf, 0xfc, 0xfb, 0xfd, 0xfa, 0xff, 0xef, 0xff, 0xd1, 0x7f, 0x7f, 0xdd, 0x75, 0xd3, 0xef, 0xff, 0xbb, 0xb1, 0xbf, 0xff, 0x7f, 0x7f, 0xfd, 0xf5, 0xf7, 0x7d, 0xf6, 0xdd, 0xbb, 0xf7, 0xff, 0xff, 0x7e, 0xfd, 0xb7, 0xd5, 0xff, 0x6f, 0xf6, 0xff, 0x7f, 0xce, 0xff, 0xef, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xe6, 0xfd, 0x7f, 0xff, 0xff, 0xfe, 0xfe, 0xbf, 0x1a, 0xfe, 0xff, 0xbf, 0x9e, 0xff, 0xff, 0xbf, 0xf3, 0xfb, 0xff, 0x77, 0xff, 0x7d, 0x9f, 0x9d, 0x7a, 0xf3, 0xc9, 0xf7, 0x3f, 0x66, 0xff, 0xff, 0xff, 0xd7, 0xf7, 0xfb, 0xfb, 0xf9, 0xfd, 0xf7, 0xd7, 0x77, 0xde, 0xff, 0x3f, 0x5d, 0x7e, 0xff, 0xfe, 0xb7, 0xf9, 0x5f, 0xff, 0xeb, 0xf5, 0xa7, 0x5e, 0x7b, 0xb9, 0xf5, 0xd7, 0x9f, 0xf7, 0xb7, 0xd2, 0xf9, 0xff, 0xff, 0xbf, 0xfe, 0x6f, 0xd6, 0xf7, 0xfe, 0x7f, 0xff, 0x9f, 0xa7, 0x9f, 0x7e, 0xfe, 0xff, 0x6f, 0xfe, 0x79, 0xf6, 0xdf, 0xff, 0xff, 0xef, 0x5f, 0x9b, 0xfb, 0xbb, 0xd9, 0xbf, 0xfb, 0x4b, 0xb7, 0xd5, 0xff, 0xde, 0xd7, 0x77, 0x3e, 0xe3, 0x3d, 0xdb, 0x4e, 0x3b, 0xed, 0xef, 0x66, 0xfe, 0x2b, 0xff, 0xd7, 0xf8, 0xbe, 0x78, 0xf7, 0xfe, 0x5b, 0x75, 0x53, 0xc5, 0x7a, 0xb5, 0xdc, 0x70, 0x45, 0xfd, 0xb3, 0xb1, 0xff, 0xfb, 0x7f, 0x7f, 0xff, 0x5d, 0x5f, 0xf8, 0xff, 0x7e, 0xfd, 0xf7, 0xf2, 0xd9, 0xff, 0xfd, 0x75, 0xd6, 0xfb, 0x66, 0xee, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xb6, 0xd6, 0xde, 0x7f, 0x55, 0x7b, 0xbb, 0xbc, 0x7a, 0xde, 0x61, 0xe7, 0x15, 0x3c, 0x9a, 0xf7, 0xff, 0xdb, 0x6f, 0x3f, 0xdf, 0xfb, 0xef, 0x6f, 0xf7, 0xfb, 0xed, 0xfe, 0xff, 0xef, 0xbf, 0xfc, 0xe2, 0xeb, 0xf7, 0xe6, 0xfd, 0xff, 0xfd, 0xf6, 0xdb, 0xef, 0xff, 0xff, 0xf7, 0xf9, 0x9f, 0x3c, 0xf3, 0xed, 0xb3, 0xcf, 0x3a, 0xd3, 0xf8, 0xbd, 0xb1, 0x7f, 0xfb, 0xec, 0xb3, 0xf8, 0x5c, 0xfb, 0xed, 0x36, 0xfe, 0xfd, 0xd6, 0xda, 0x77, 0xb6, 0xd9, 0xe6, 0x97, 0xff, 0x66, 0xe6, 0xcf, 0xef, 0xbf, 0xff, 0xff, 0xfe, 0xbf, 0xbf, 0xff, 0xf7, 0xf5, 0xff, 0xff, 0xfb, 0xe7, 0xf3, 0xe7, 0x9f, 0x3f, 0x9b, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xb7, 0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xaf, 0xa6, 0xde, 0xef, 0xbf, 0xbf, 0xfa, 0xeb, 0x7b, 0xaf, 0xb5, 0xf1, 0xb5, 0x1f, 0xde, 0xa8, 0xe9, 0x87, 0x1e, 0xfe, 0xfa, 0xbb, 0x79, 0xff, 0xe6, 0x8f, 0x24, 0xfe, 0xc8, 0xea, 0xaf, 0x3f, 0x76, 0xd5, 0xc7, 0x17, 0xdf, 0x7c, 0xf3, 0xc7, 0x7f, 0x7f, 0x63, 0xfe, 0xf7, 0xee, 0xbb, 0xeb, 0xad, 0xba, 0xff, 0x3a, 0xd9, 0xff, 0x6f, 0xf7, 0xe5, 0xff, 0x7f, 0xb7, 0xf5, 0x7f, 0xff, 0x9b, 0xff, 0xef, 0xcf, 0x3e, 0xf2, 0xec, 0xa3, 0x8f, 0x3e, 0xfb, 0xfc, 0xc7, 0x1f, 0x1d, 0xfe, 0xb1, 0x67, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0xfb, 0xff, 0xbf, 0xfe, 0xff, 0xef, 0xbf, 0xff, 0xfc, 0xf5, 0xf7, 0x5f, 0x26, 0xf1, 0xc5, 0xd7, 0xff, 0xfc, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xfb, 0xef, 0x7f, 0xfd, 0xfd, 0xd7, 0x77, 0x7f, 0xff, 0xf7, 0xff, 0xff, 0x6f, 0xfe, 0xdf, 0xfb, 0xef, 0xab, 0xef, 0xff, 0xfe, 0xef, 0x8f, 0xcf, 0xff, 0xfd, 0xe5, 0xd7, 0x7f, 0xfd, 0xf5, 0xff, 0xff, 0x9b, 0xff, 0xef, 0xbf, 0xfe, 0xfa, 0x6f, 0xff, 0xfd, 0xff, 0xfe, 0xdf, 0x7e, 0x7b, 0xad, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xe6, 0xfe, 0xd3, 0x6f, 0xff, 0xfc, 0xf3, 0xd3, 0x6f, 0xbe, 0xff, 0xff, 0xb7, 0xdf, 0xfc, 0xea, 0xab, 0xa7, 0xfe, 0xff, 0xbf, 0xe9, 0xff, 0xae, 0xbe, 0xfe, 0xea, 0xab, 0xad, 0xbe, 0xfe, 0xb2, 0x97, 0x5d, 0x7d, 0xf5, 0xc5, 0x57, 0x5b, 0x7a, 0xf5, 0x6b, 0xfe, 0xfd, 0xf3, 0xcc, 0xbd, 0xff, 0xfd, 0xd3, 0xec, 0xd7, 0x76, 0x7e, 0xfd, 0xd1, 0xdf, 0x7f, 0xfc, 0x79, 0xe7, 0xff, 0x1b, 0xff, 0x7d, 0xff, 0xff, 0xef, 0xdf, 0x77, 0xdf, 0xf7, 0xfe, 0xef, 0x7f, 0xbf, 0xff, 0xb6, 0x9f, 0x7f, 0xff, 0xfe, 0x7f, 0x66, 0xff, 0xff, 0xff, 0xfa, 0xd5, 0xef, 0xff, 0xff, 0xfe, 0xf7, 0xfb, 0xff, 0x7d, 0xfc, 0xff, 0xed, 0xf7, 0x7f, 0xff, 0xb7, 0xf9, 0xdf, 0x6e, 0xff, 0xbd, 0xbf, 0xee, 0xfb, 0xaf, 0x8b, 0x77, 0x39, 0x75, 0xda, 0x16, 0x6f, 0xfc, 0xe5, 0xfc, 0xfb, 0x6f, 0xfe, 0xff, 0xfd, 0xbf, 0xfa, 0xbf, 0xfd, 0xbf, 0xff, 0xff, 0x77, 0xbf, 0xfd, 0xff, 0x77, 0xdf, 0x5f, 0xfd, 0xbf, 0xfb, 0x9b, 0xfd, 0xbf, 0x7f, 0xfe, 0xfb, 0xe0, 0x2c, 0xbd, 0xfc, 0xba, 0xf3, 0xde, 0x7f, 0xfd, 0xff, 0xdf, 0x7f, 0xf7, 0xdd, 0xff, 0xe6, 0xdf, 0xd3, 0xff, 0x3d, 0xfb, 0x7a, 0xff, 0xd7, 0xff, 0xff, 0xfd, 0xbf, 0xaf, 0xfb, 0xbb, 0xeb, 0x87, 0xdf, 0xde, 0xbf, 0xd9, 0x6f, 0x7b, 0xfd, 0xef, 0xf5, 0xff, 0xe7, 0xff, 0x77, 0x4f, 0x9f, 0xde, 0xff, 0xff, 0xfb, 0xf7, 0xdf, 0xb7, 0xf7, 0x6b, 0xfe, 0xfd, 0xf9, 0x8f, 0xf7, 0xff, 0xfe, 0xff, 0xfc, 0xdf, 0xfe, 0xfe, 0xf7, 0xf9, 0xfb, 0x9f, 0xfc, 0xbf, 0x39, 0xff, 0x9a, 0xf3, 0xff, 0xff, 0xf7, 0xe7, 0xff, 0xff, 0xbd, 0xed, 0xff, 0xff, 0xff, 0xf7, 0xfb, 0xff, 0xd7, 0xff, 0x7b, 0xfb, 0xff, 0xe6, 0xff, 0xcb, 0x2c, 0xf3, 0xde, 0xfb, 0xcc, 0xb7, 0xbc, 0xee, 0xb7, 0xff, 0x3f, 0xbf, 0xf7, 0xf6, 0xdf, 0xe9, 0x8e, 0xbf, 0xe1, 0xbf, 0xfb, 0xed, 0x9f, 0xdf, 0xee, 0xf9, 0xe6, 0xb6, 0xff, 0xfc, 0xbe, 0xcb, 0xfc, 0xff, 0xf4, 0xfb, 0xbf, 0x7f, 0x67, 0xfe, 0xff, 0xee, 0xfd, 0xef, 0xcf, 0xfe, 0xfe, 0xfb, 0xed, 0x7f, 0xfd, 0xbf, 0xfb, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0xff, 0x1a, 0xfe, 0xbf, 0xff, 0xfe, 0xfa, 0xef, 0xff, 0xe7, 0xfb, 0xde, 0x77, 0xff, 0xe7, 0xff, 0x5f, 0x5e, 0xff, 0x67, 0xf7, 0xbf, 0x66, 0xf7, 0xfb, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xf9, 0xbf, 0x5f, 0x9d, 0xdf, 0xd3, 0xff, 0xf7, 0xf7, 0xff, 0xdf, 0xfb, 0xb7, 0xf9, 0x5d, 0x7f, 0xfe, 0xbf, 0xf3, 0xce, 0x3a, 0xbf, 0xef, 0xd7, 0xff, 0xff, 0xd4, 0xd9, 0xaf, 0xf7, 0x2f, 0x1e, 0xff, 0x6f, 0xd6, 0xb7, 0x9e, 0x3a, 0xf3, 0x8c, 0xbf, 0xce, 0x3e, 0xfb, 0xff, 0xff, 0xfd, 0xff, 0xf6, 0xf9, 0xff, 0xb7, 0x5d, 0x5e, 0x9b, 0xfb, 0xfb, 0xd9, 0x57, 0x57, 0x4d, 0xa6, 0xd9, 0x55, 0xde, 0xf5, 0x5e, 0xb7, 0x6f, 0xf7, 0xd3, 0x6e, 0xda, 0xed, 0xee, 0x66, 0xfa, 0x3b, 0xe5, 0xdc, 0x77, 0xff, 0x6d, 0xe7, 0x9e, 0x37, 0xdd, 0xd7, 0xdf, 0x7d, 0x3f, 0xd4, 0x58, 0xdf, 0x8d, 0xb3, 0xb1, 0xff, 0xff, 0x7f, 0xbb, 0xe5, 0x8c, 0x3f, 0xaa, 0xab, 0x6f, 0xe5, 0x75, 0xf6, 0x4b, 0x7b, 0xfd, 0xf7, 0x5f, 0xfb, 0x66, 0xee, 0xbf, 0xff, 0xfe, 0xfb, 0xb8, 0xb2, 0xc7, 0xd2, 0xff, 0x5f, 0x7b, 0xad, 0x9f, 0xf2, 0xfe, 0xf9, 0xa1, 0x3d, 0x3c, 0x9a, 0xf7, 0xff, 0xf3, 0x6f, 0xff, 0xdf, 0xfc, 0xff, 0x6f, 0xbf, 0xfb, 0xff, 0xc7, 0xdb, 0x7e, 0xbf, 0xfd, 0xd3, 0xcb, 0x77, 0xa6, 0xfd, 0xff, 0xf9, 0xff, 0xdf, 0x6f, 0xfe, 0x79, 0xf6, 0x1b, 0xff, 0x7f, 0xfe, 0xec, 0xf7, 0xce, 0xba, 0xea, 0xb8, 0xbd, 0xb1, 0x7f, 0xfb, 0xed, 0xb7, 0xcf, 0xfc, 0x7b, 0x8d, 0xb6, 0xff, 0xfd, 0xf6, 0x9b, 0x67, 0xbf, 0xd9, 0xa7, 0x18, 0xeb, 0x66, 0xe6, 0xcf, 0x6f, 0xff, 0xfc, 0xf6, 0xff, 0x7f, 0xbf, 0xfd, 0xf7, 0xdf, 0x77, 0xfe, 0xf9, 0xe7, 0xbf, 0xe7, 0x9e, 0x3f, 0x9b, 0xfb, 0xfb, 0xf7, 0xbf, 0xff, 0xfe, 0xff, 0xef, 0xdf, 0xbf, 0xff, 0xff, 0xf7, 0xb7, 0xff, 0x7e, 0xfd, 0xef, 0xff, 0xef, 0xe6, 0xfe, 0xfb, 0xaf, 0xdf, 0xff, 0xea, 0x6b, 0xbf, 0xbf, 0xfe, 0xf7, 0xd6, 0x7e, 0x78, 0xed, 0xad, 0x77, 0x5e, 0xf8, 0xbb, 0x79, 0xff, 0x67, 0x8b, 0xff, 0x9e, 0xc9, 0xef, 0x9f, 0x2f, 0x7a, 0xf5, 0x55, 0x17, 0x5f, 0x35, 0xb3, 0xc6, 0x13, 0x7f, 0x6f, 0xfa, 0xf7, 0xef, 0x7e, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xe9, 0x7f, 0x7f, 0xfd, 0xef, 0xdf, 0xfb, 0xff, 0xf9, 0xe5, 0xff, 0x9b, 0xfe, 0xef, 0xcf, 0x3f, 0xff, 0xf8, 0xa3, 0xcf, 0x3f, 0xfa, 0xd4, 0x47, 0x9f, 0x7f, 0xfe, 0xf1, 0xc7, 0x1f, 0x7d, 0xfe, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xfa, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xe7, 0xf7, 0xff, 0xfc, 0xbf, 0xe1, 0xff, 0xfe, 0xff, 0xff, 0xbf, 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xf6, 0xff, 0xfb, 0xef, 0xbb, 0xff, 0xff, 0xfb, 0xef, 0xbf, 0xef, 0x7f, 0xff, 0xfd, 0xdf, 0x5f, 0xff, 0xff, 0xfd, 0xff, 0x9b, 0xff, 0xef, 0xbf, 0xff, 0xf7, 0x7b, 0xaf, 0xff, 0xff, 0xff, 0xdb, 0x7e, 0xfb, 0xed, 0xbf, 0xf7, 0xde, 0xfb, 0xed, 0xff, 0xe6, 0xff, 0x8f, 0x3f, 0xff, 0xf9, 0xf4, 0xfb, 0xed, 0xad, 0xfd, 0xfe, 0xf5, 0x9e, 0x7c, 0xb9, 0xc9, 0x97, 0xdb, 0xfe, 0xbf, 0xd9, 0xff, 0xaf, 0xbf, 0xfe, 0x7a, 0xeb, 0x0e, 0xbf, 0xfe, 0xba, 0xd7, 0x5b, 0x7f, 0xe9, 0xf5, 0x56, 0x5d, 0x77, 0xfd, 0x6f, 0xfe, 0xdb, 0xaf, 0xbf, 0xca, 0xff, 0xdd, 0x6f, 0xe1, 0xb3, 0xf0, 0xfc, 0xbf, 0xfb, 0xcd, 0x7b, 0xf6, 0xe9, 0x45, 0xff, 0x1b, 0x7f, 0xfc, 0xdf, 0xbf, 0xfd, 0xbe, 0xf7, 0xb7, 0xf7, 0x7f, 0xb7, 0xff, 0x8f, 0xe7, 0xf7, 0xf3, 0xdf, 0x0f, 0xfd, 0x7e, 0x66, 0xfb, 0xff, 0xf7, 0x7b, 0xff, 0xff, 0x7f, 0xd7, 0xff, 0xf7, 0xdf, 0xff, 0xe6, 0xfd, 0xfb, 0x77, 0xde, 0xfb, 0xfb, 0xbf, 0xf9, 0x7f, 0x7f, 0xef, 0xeb, 0xff, 0xdf, 0xda, 0xf3, 0x27, 0xff, 0x7d, 0xf7, 0xc7, 0xdb, 0xfe, 0xfd, 0xf5, 0xe7, 0xff, 0x67, 0xf2, 0xff, 0xaf, 0xfe, 0xdf, 0xff, 0xfd, 0xbd, 0xbf, 0xef, 0xfb, 0xbd, 0x7f, 0xff, 0xdf, 0xbf, 0xff, 0xfc, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfc, 0xbf, 0xff, 0x0e, 0xfd, 0xff, 0xfa, 0x97, 0x5e, 0x6f, 0xef, 0xff, 0x9f, 0x6e, 0xff, 0xef, 0xff, 0xe6, 0xff, 0xf3, 0xcf, 0xbf, 0xfe, 0xff, 0xfe, 0xac, 0x3d, 0x79, 0xff, 0xf7, 0xfd, 0x7f, 0xbb, 0xfd, 0x97, 0xff, 0xef, 0xaf, 0xf9, 0xe7, 0xfb, 0xee, 0xfe, 0xf7, 0xfb, 0xcf, 0xfd, 0xef, 0xff, 0xbb, 0xc7, 0xff, 0xdf, 0x7f, 0x3b, 0xef, 0x7f, 0xef, 0x6f, 0xfe, 0x3f, 0xfb, 0xec, 0xbf, 0xc7, 0x15, 0xef, 0xae, 0xf3, 0x9d, 0x77, 0xee, 0xbe, 0xbb, 0x9f, 0xbf, 0xff, 0xfd, 0xfe, 0x9b, 0xfd, 0xcf, 0xbf, 0xfd, 0xdf, 0xeb, 0xae, 0x9f, 0xff, 0x9a, 0xe7, 0xde, 0xfa, 0xff, 0xff, 0xe7, 0xff, 0x3f, 0xdf, 0xff, 0xe6, 0xff, 0xff, 0x35, 0xf7, 0xfa, 0xff, 0xa8, 0xbe, 0x9f, 0xfc, 0x4f, 0xdb, 0x6f, 0xf7, 0xf9, 0xff, 0xfa, 0xf5, 0xfe, 0xbf, 0xf1, 0xff, 0xeb, 0xee, 0xa7, 0xfb, 0xff, 0xdb, 0xef, 0xff, 0xff, 0xff, 0x73, 0xcf, 0x5f, 0xbf, 0xfd, 0xf7, 0x7e, 0x7f, 0x6f, 0xfe, 0xdf, 0xfa, 0xea, 0xfb, 0xfe, 0x7e, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xfe, 0xd7, 0x77, 0xbf, 0xff, 0xbd, 0xff, 0x7f, 0x1a, 0xfe, 0xa5, 0xbe, 0xfa, 0xca, 0xff, 0xbf, 0xd5, 0xf9, 0x6e, 0xdd, 0xf3, 0xfc, 0xf7, 0xdf, 0x7f, 0xff, 0x7d, 0xfb, 0x3f, 0x66, 0x3f, 0xeb, 0xaf, 0xbe, 0xfb, 0xff, 0x7b, 0x7c, 0xfd, 0x56, 0xf7, 0xff, 0xff, 0x7f, 0xf7, 0xef, 0x7f, 0xdf, 0xfb, 0xb7, 0xf9, 0xff, 0xe2, 0xeb, 0xa5, 0xfd, 0xcd, 0x7e, 0xde, 0xf9, 0xd6, 0xbd, 0x4e, 0x1e, 0xf9, 0x4f, 0xbd, 0xf4, 0xf7, 0xff, 0x6f, 0xd6, 0x3f, 0xfe, 0x7a, 0xeb, 0xdf, 0xf6, 0xfe, 0x2f, 0xeb, 0xdd, 0xcf, 0x37, 0xd9, 0xf7, 0x59, 0x7f, 0xfd, 0xfd, 0x5f, 0x9b, 0xeb, 0x2f, 0xbc, 0x24, 0xfa, 0x4b, 0x7b, 0xdd, 0xfd, 0x5e, 0xdc, 0xee, 0xb6, 0xaf, 0xfe, 0xfb, 0xca, 0x7b, 0xff, 0xef, 0x66, 0xfe, 0x8b, 0xaf, 0x9e, 0x5a, 0xf2, 0xbb, 0xf1, 0x97, 0x5a, 0xd7, 0xfd, 0xeb, 0x79, 0x3f, 0xde, 0xf3, 0xde, 0xfd, 0xb3, 0xb1, 0xff, 0xd2, 0xeb, 0xa8, 0xb7, 0xca, 0x3e, 0xf7, 0xac, 0xfe, 0xad, 0x7b, 0xde, 0x5b, 0x7f, 0x75, 0xbd, 0xf7, 0xf9, 0x66, 0xe6, 0xbf, 0x5a, 0x62, 0x6b, 0x21, 0xfd, 0xc1, 0x77, 0x6d, 0x7c, 0x89, 0xfb, 0x6d, 0xd4, 0xfe, 0x7b, 0xef, 0x7d, 0x3e, 0x9a, 0xf6, 0xff, 0xff, 0x8f, 0xff, 0xdf, 0xfc, 0xfb, 0x6e, 0x37, 0xbb, 0x7f, 0xff, 0xfb, 0x7f, 0xbe, 0xff, 0xf7, 0xff, 0xf7, 0xe6, 0xfd, 0x9f, 0x79, 0xf6, 0xfb, 0x67, 0xde, 0xf5, 0xf7, 0xd9, 0x8f, 0xff, 0xfb, 0xec, 0x37, 0xcf, 0xfc, 0xeb, 0xff, 0xbd, 0xb1, 0xff, 0x73, 0x4d, 0xbe, 0xd7, 0x5c, 0xb3, 0xdd, 0x3e, 0xda, 0xf9, 0xee, 0x58, 0x77, 0xff, 0xf1, 0x77, 0xdf, 0xff, 0x66, 0xe6, 0xdf, 0x7b, 0xef, 0xff, 0xff, 0xdf, 0x3f, 0xff, 0xfd, 0xf3, 0xdd, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff, 0x3f, 0x9b, 0x7b, 0xfd, 0xfa, 0xfb, 0xef, 0xff, 0xfd, 0xfb, 0xde, 0xff, 0x7e, 0x7f, 0xdf, 0x7f, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xef, 0xa6, 0xfe, 0x6f, 0xf5, 0xbc, 0xf7, 0xc2, 0xaf, 0x7f, 0xbe, 0xf1, 0x87, 0x3f, 0x4f, 0x79, 0xed, 0x8d, 0xdf, 0x5e, 0xff, 0xab, 0x79, 0xff, 0xea, 0x8f, 0x67, 0x96, 0xca, 0xe2, 0xbf, 0x7f, 0xf6, 0xf3, 0xdf, 0x17, 0x5f, 0xf5, 0xf1, 0xd7, 0x97, 0x7f, 0x6f, 0xfe, 0xbf, 0xfe, 0x37, 0xfb, 0x3f, 0xbf, 0xfc, 0xbf, 0xbf, 0x7d, 0xfe, 0xf7, 0x54, 0xde, 0x6f, 0xff, 0xfd, 0xf4, 0xff, 0x9b, 0xff, 0xaf, 0xcf, 0x3f, 0xfe, 0xf8, 0xb3, 0xcf, 0x3d, 0xfb, 0xfc, 0xe7, 0x1f, 0x7d, 0xfe, 0xb9, 0xc3, 0x1f, 0x7d, 0xfe, 0xe6, 0xfd, 0xcf, 0x7f, 0xfe, 0xf8, 0xf3, 0xcb, 0x7f, 0xbe, 0xfd, 0xf7, 0xbf, 0x5f, 0xff, 0xfd, 0xef, 0xda, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xf6, 0xff, 0xbf, 0xbf, 0xff, 0xfe, 0xff, 0x3f, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xff, 0xaf, 0x2f, 0xbe, 0xf9, 0xff, 0xeb, 0x6f, 0xff, 0xff, 0xf5, 0xdf, 0xdf, 0xfe, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xaf, 0xfd, 0xf7, 0xfb, 0xeb, 0x2f, 0xff, 0xf7, 0xdf, 0xff, 0xfe, 0x7b, 0xed, 0xbf, 0xdf, 0xde, 0xfb, 0xfb, 0xff, 0xe6, 0xff, 0xdb, 0x7f, 0xbf, 0xff, 0xff, 0xfb, 0x2d, 0xbf, 0xfd, 0xfd, 0xa7, 0xfb, 0x6b, 0xf7, 0xfd, 0xa7, 0x9f, 0xfe, 0xbf, 0xe9, 0xff, 0x2d, 0xbd, 0xfe, 0xea, 0xab, 0xaf, 0x9f, 0xf6, 0x98, 0x56, 0x5d, 0x7a, 0xd5, 0xf1, 0x97, 0x5c, 0x7f, 0xec, 0x6b, 0xde, 0xbd, 0xf8, 0xfa, 0x76, 0x3f, 0x77, 0xfe, 0xb1, 0xf3, 0xff, 0xff, 0xd9, 0xc7, 0xde, 0x33, 0xfc, 0xdd, 0xfb, 0x7f, 0x1b, 0xff, 0x97, 0xff, 0xbe, 0xff, 0xf9, 0xf7, 0x8c, 0xb6, 0xcf, 0x7e, 0x3f, 0x5f, 0xc7, 0xe7, 0xf7, 0x77, 0xe7, 0xef, 0x7f, 0x66, 0xff, 0x7f, 0xfb, 0xfe, 0xef, 0x5d, 0xd7, 0xf7, 0xdf, 0x7f, 0x7f, 0xfb, 0xbe, 0xff, 0xff, 0xeb, 0xff, 0xfe, 0xff, 0xbf, 0xf9, 0x7f, 0xfa, 0x8a, 0xaf, 0xbf, 0xfe, 0x5a, 0xeb, 0xbf, 0xf7, 0xbf, 0xf1, 0xe5, 0x5d, 0x7f, 0xed, 0xef, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0x7d, 0xfb, 0xeb, 0x7f, 0xdf, 0xbd, 0xf5, 0xff, 0xfe, 0x7d, 0xff, 0xff, 0xdf, 0xff, 0xfe, 0x7f, 0xf3, 0xff, 0x9b, 0xff, 0x0e, 0xbd, 0xff, 0xff, 0x7b, 0xef, 0x7b, 0xfe, 0xfa, 0xdf, 0x7d, 0xfe, 0xfc, 0xb1, 0xf7, 0x6f, 0xf7, 0xdd, 0xff, 0x66, 0xef, 0xfb, 0x7c, 0xff, 0xff, 0xff, 0xdf, 0xaf, 0xff, 0xf7, 0xd5, 0xaf, 0xee, 0x72, 0xfd, 0xed, 0xd7, 0x5f, 0xff, 0xbf, 0xb9, 0xff, 0xfb, 0xbf, 0xff, 0xd6, 0xff, 0x7f, 0x7f, 0x7b, 0xff, 0xfb, 0xdf, 0xff, 0xfe, 0xfd, 0xbd, 0xef, 0xbd, 0xfb, 0x6f, 0x7e, 0x3f, 0xff, 0xda, 0xd7, 0xff, 0x7f, 0xf7, 0xfc, 0xfe, 0xbf, 0x1f, 0x57, 0x5b, 0xf9, 0xb6, 0xff, 0xbf, 0xfb, 0xff, 0x9b, 0xff, 0xbd, 0xff, 0xff, 0xfb, 0x7f, 0x7f, 0xbb, 0xfd, 0xbf, 0xbf, 0xdb, 0x9f, 0xbb, 0xff, 0xdb, 0xf7, 0x9f, 0xfd, 0xef, 0xe6, 0xdf, 0xe4, 0x2f, 0xbf, 0xce, 0xbf, 0xdd, 0x37, 0xfb, 0xfd, 0x27, 0xdb, 0x7f, 0xff, 0xbd, 0xf7, 0xdc, 0x7e, 0xfe, 0xbf, 0xd1, 0x7f, 0x9f, 0xad, 0xb7, 0xff, 0xfe, 0xff, 0xa7, 0x7f, 0xf7, 0xfc, 0xf5, 0xcf, 0xfe, 0xff, 0xfc, 0xf5, 0x0f, 0xf7, 0x63, 0xfe, 0xbf, 0xff, 0xfb, 0xf7, 0xbf, 0xf7, 0xdf, 0xfd, 0xfd, 0xbf, 0x3f, 0xff, 0xfa, 0xf7, 0xaf, 0x79, 0xf7, 0xfb, 0xff, 0x1b, 0xfe, 0x3c, 0xbc, 0x5f, 0xef, 0x7f, 0xa5, 0xe7, 0xff, 0xde, 0x3f, 0xff, 0xfc, 0xff, 0xdf, 0x3f, 0xff, 0xaf, 0xfb, 0xbf, 0x66, 0x7f, 0xdd, 0xef, 0xe5, 0xfb, 0x7f, 0xea, 0xf9, 0xff, 0x9f, 0xff, 0xfc, 0xf9, 0xff, 0xff, 0xdf, 0xfc, 0xeb, 0xff, 0xb7, 0xf9, 0x5f, 0xff, 0xdb, 0x7f, 0xb3, 0xcc, 0x3f, 0xeb, 0xef, 0xff, 0xb3, 0xce, 0xbc, 0x73, 0xcd, 0x9f, 0x6f, 0xfe, 0xff, 0x6f, 0xd6, 0xf7, 0xff, 0xfc, 0xd7, 0x8c, 0xe6, 0xcf, 0xf8, 0xff, 0xf9, 0xce, 0x3f, 0xdf, 0xdc, 0xf3, 0xe7, 0x9f, 0xff, 0x5e, 0x9b, 0xfb, 0x7b, 0xbf, 0xf1, 0xd2, 0x5f, 0xaf, 0xfd, 0x75, 0x5a, 0xbd, 0xff, 0xb4, 0xfb, 0xf6, 0xba, 0xef, 0xfc, 0x7b, 0xee, 0x66, 0xfe, 0xff, 0xef, 0xbd, 0xfe, 0xdf, 0xab, 0xff, 0x8e, 0x67, 0xff, 0xfa, 0xeb, 0x8f, 0xff, 0xfe, 0xf8, 0xef, 0x8f, 0xb3, 0xb1, 0xff, 0x7f, 0xfb, 0xa5, 0xb2, 0xfe, 0xff, 0x6b, 0xa9, 0xff, 0xfe, 0xfb, 0xee, 0xff, 0xdb, 0x9e, 0xfb, 0xed, 0x8b, 0x66, 0xee, 0xff, 0x8d, 0x7e, 0x6b, 0xad, 0xd7, 0xfb, 0x6a, 0xf8, 0xff, 0xfe, 0x7b, 0xef, 0xdf, 0xfe, 0xee, 0xfb, 0x6f, 0xb6, 0x9b, 0xf7, 0x7f, 0xfb, 0x2f, 0xbf, 0xfc, 0x7f, 0xf3, 0xff, 0xff, 0xdb, 0x7d, 0xff, 0xdd, 0x7f, 0xde, 0x75, 0xb7, 0xfd, 0x77, 0xe6, 0xfd, 0xff, 0xf7, 0xfe, 0x9b, 0x6f, 0x9f, 0x79, 0xf6, 0xdf, 0xff, 0xfa, 0xfb, 0xaf, 0xf7, 0xff, 0xfa, 0xf3, 0xcf, 0xbd, 0xb1, 0x5f, 0xd3, 0xed, 0xbf, 0xdd, 0x4e, 0xf3, 0xcd, 0xbe, 0xc7, 0xdb, 0x6f, 0xba, 0x69, 0xaf, 0xdb, 0xee, 0xbb, 0xeb, 0x66, 0xe6, 0xdf, 0x6f, 0xff, 0xfd, 0xf6, 0xdf, 0x3f, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xb7, 0xdf, 0xfe, 0x3b, 0x9b, 0xfb, 0xfb, 0xef, 0xbb, 0xff, 0xbe, 0xfb, 0xee, 0xbb, 0xbf, 0xdf, 0x7f, 0xf7, 0xfd, 0x7f, 0xdf, 0x77, 0xdf, 0xbd, 0xef, 0xe6, 0x7e, 0x8b, 0xff, 0xfe, 0xf3, 0xef, 0x9d, 0x7f, 0xf6, 0xfe, 0xef, 0xbf, 0xff, 0xfc, 0xef, 0xef, 0xbf, 0xff, 0xfe, 0xbb, 0x61, 0x7f, 0xf6, 0xbf, 0xff, 0xda, 0x7b, 0xe7, 0x9f, 0xef, 0xfe, 0xf7, 0xdf, 0x7f, 0x5b, 0xf5, 0xf7, 0xde, 0x7f, 0x7f, 0x6f, 0xfe, 0xff, 0xde, 0xf7, 0xbb, 0xff, 0xf7, 0x5f, 0xff, 0xeb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xff, 0xff, 0x9b, 0xff, 0x6f, 0xcf, 0x3f, 0xff, 0xdc, 0x73, 0xcb, 0x3d, 0xfa, 0xfc, 0xe7, 0x9f, 0x7b, 0x74, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0x8f, 0x7f, 0xff, 0xfd, 0xe7, 0xdb, 0x7e, 0xfe, 0xfe, 0xef, 0xbf, 0xff, 0xfe, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xbf, 0xe1, 0xff, 0xfe, 0xff, 0x7f, 0xbf, 0xbf, 0xf7, 0xfe, 0xef, 0xff, 0xfb, 0xef, 0xbf, 0x5f, 0xd7, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xf3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xfb, 0x6f, 0xff, 0xf7, 0xff, 0x7f, 0xfe, 0xbd, 0xf7, 0xdf, 0xff, 0xfe, 0xfb, 0xef, 0x3f, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0xe6, 0xff, 0x5b, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf7, 0xfd, 0xeb, 0x2f, 0xbf, 0x7c, 0xbf, 0xed, 0xff, 0xff, 0xfd, 0xbf, 0xf9, 0xf7, 0xaf, 0xbe, 0xf6, 0xe8, 0xab, 0x8f, 0xbe, 0xfa, 0xfa, 0xd7, 0x5f, 0x7d, 0xc5, 0x75, 0x93, 0x5e, 0x7b, 0xed, 0x6d, 0xfe, 0x3f, 0xff, 0xe3, 0x8f, 0xbf, 0xff, 0xf3, 0xbf, 0xbb, 0x7f, 0x9e, 0xdb, 0x67, 0xff, 0xdf, 0xfe, 0x9b, 0xae, 0xbf, 0x1b, 0xe9, 0xfb, 0x9f, 0xbf, 0xfd, 0xad, 0xf7, 0xf5, 0xef, 0xff, 0xdd, 0xbb, 0xbf, 0xfc, 0xff, 0xed, 0xbf, 0xfb, 0xfe, 0x7f, 0xe6, 0xff, 0x3f, 0xb7, 0x5f, 0xbf, 0xdf, 0xff, 0xff, 0xfd, 0x7f, 0x7d, 0xfe, 0xee, 0xbb, 0xff, 0x7e, 0xfb, 0xef, 0xa9, 0xbb, 0xf9, 0xf7, 0x73, 0xcb, 0xaf, 0xbf, 0xdc, 0x7c, 0xcf, 0x2f, 0x7b, 0xfc, 0xe1, 0x87, 0x59, 0x7e, 0xbc, 0xf5, 0xc7, 0xff, 0x67, 0xfa, 0xbf, 0xbb, 0xf6, 0xdb, 0x67, 0xff, 0xbf, 0x7d, 0x6b, 0xdf, 0x6f, 0xbf, 0xfd, 0xb5, 0xbf, 0x5f, 0x7d, 0xfb, 0xff, 0x9b, 0xff, 0xbf, 0x7f, 0xfc, 0x39, 0xef, 0x7a, 0xdd, 0xf7, 0xbf, 0xff, 0x7f, 0xbc, 0xff, 0xf3, 0xff, 0x3f, 0xfb, 0xef, 0xff, 0xe6, 0x5f, 0xdf, 0xad, 0xbf, 0xfd, 0xf5, 0xeb, 0xed, 0xb7, 0xa9, 0xbf, 0xe7, 0xff, 0xfb, 0xbb, 0xe5, 0xff, 0xed, 0xff, 0xbf, 0xd9, 0xfb, 0xf7, 0x7f, 0xe5, 0xd6, 0xbf, 0xff, 0x6f, 0xbf, 0xbf, 0xe7, 0xf7, 0xff, 0xfe, 0xfb, 0xb7, 0xbf, 0xfe, 0xfb, 0x6e, 0xe6, 0x5b, 0xed, 0xbc, 0xf3, 0xcf, 0x3f, 0xff, 0xff, 0x73, 0x9f, 0x5f, 0xfc, 0x7f, 0xc5, 0x1f, 0x7f, 0xfd, 0x71, 0xff, 0x9b, 0xfe, 0xdf, 0xfb, 0xde, 0xfa, 0xdf, 0x77, 0xfd, 0xff, 0xf6, 0x57, 0x7f, 0xdf, 0xf7, 0x7a, 0xdb, 0xfa, 0xdf, 0xfb, 0xee, 0xe6, 0xdf, 0x6f, 0xdf, 0xea, 0xde, 0xb1, 0xe7, 0x77, 0xfb, 0xd8, 0xff, 0xfb, 0xfb, 0xe3, 0xfd, 0x76, 0x53, 0xf3, 0xff, 0xbf, 0xe1, 0xff, 0xfb, 0x3d, 0x87, 0xb1, 0xfc, 0xed, 0xbf, 0xdf, 0xcf, 0xff, 0xff, 0x5e, 0x5b, 0xff, 0x9d, 0x77, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xde, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xf7, 0xf7, 0x5f, 0xff, 0xfe, 0xff, 0xff, 0x9b, 0x7b, 0xeb, 0xf8, 0xcb, 0xcf, 0x5f, 0xfd, 0xe4, 0xcd, 0xaf, 0x7f, 0xfc, 0xeb, 0xab, 0xaf, 0xfd, 0xfa, 0xff, 0x5f, 0xff, 0x86, 0x7f, 0x7a, 0xaf, 0xff, 0xfb, 0xcf, 0x2b, 0xaf, 0xb3, 0xf7, 0xf7, 0xff, 0xf3, 0xc9, 0xb3, 0xde, 0x3f, 0x79, 0xff, 0xaf, 0xd9, 0x9f, 0xff, 0xeb, 0xef, 0xfc, 0xfd, 0xf2, 0xfb, 0xfc, 0x7f, 0xef, 0xff, 0x7f, 0xf9, 0xcd, 0x3f, 0x9f, 0xff, 0xff, 0x6d, 0xfe, 0xa7, 0xff, 0xfa, 0xef, 0xfc, 0xa5, 0xfe, 0xfa, 0x7b, 0x7f, 0xff, 0x3f, 0xff, 0xba, 0xd3, 0xac, 0x3b, 0xf5, 0xfc, 0x9b, 0xf7, 0xfd, 0xbf, 0xce, 0xfa, 0xff, 0xed, 0xa7, 0xfe, 0xff, 0xf7, 0xff, 0xef, 0x3f, 0xef, 0xe7, 0xf9, 0x67, 0xff, 0xd7, 0xe6, 0xfe, 0x7a, 0xb5, 0xbd, 0x66, 0xd7, 0x68, 0xa6, 0xbd, 0x66, 0x37, 0xd3, 0xf6, 0xfa, 0xbb, 0x86, 0x3f, 0x6f, 0x3b, 0xbb, 0xb9, 0xff, 0xef, 0xa9, 0xa7, 0xde, 0x2b, 0x6a, 0xa9, 0xe5, 0x56, 0xb7, 0xd4, 0xbf, 0xeb, 0xb7, 0xed, 0xff, 0x78, 0xe3, 0x6c, 0xae, 0xff, 0xbf, 0x4b, 0x2a, 0xfb, 0x97, 0xfa, 0xfa, 0xab, 0x7d, 0x7d, 0xf5, 0xdf, 0xef, 0x5a, 0xff, 0xfe, 0xf5, 0xbf, 0x99, 0xf9, 0xff, 0xbe, 0xb6, 0xda, 0x9b, 0xad, 0xbd, 0xda, 0x1e, 0xf6, 0x5f, 0x7f, 0xeb, 0xef, 0x90, 0xfe, 0x7e, 0xa7, 0xef, 0xa6, 0xfd, 0xdf, 0xff, 0xf3, 0xfd, 0xff, 0xfe, 0x7f, 0xef, 0xcd, 0x6e, 0xbf, 0xff, 0xe7, 0xfd, 0xef, 0xdf, 0xfd, 0xc2, 0x9d, 0x79, 0xff, 0x67, 0xff, 0x7d, 0xfe, 0xf9, 0x7f, 0x9e, 0x7f, 0xf6, 0xb3, 0xce, 0x7e, 0xfb, 0xef, 0xf3, 0xff, 0x3a, 0x7a, 0x6f, 0xe8, 0xff, 0x3c, 0x3b, 0x8d, 0x3f, 0xd7, 0xfe, 0x73, 0x8d, 0x76, 0xf4, 0x91, 0xc6, 0xb8, 0x63, 0xbd, 0x9b, 0x66, 0xbb, 0x99, 0xf9, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfc, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xe7, 0xbf, 0xc7, 0xce, 0xe6, 0xfe, 0xbe, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xff, 0xee, 0xbf, 0xff, 0xff, 0xf7, 0xf7, 0x7d, 0xff, 0xde, 0xfb, 0xed, 0xbb, 0xa9, 0xff, 0xe2, 0xeb, 0x37, 0xfc, 0xf7, 0xde, 0xdb, 0x2f, 0xdc, 0xf1, 0xc5, 0x1f, 0xff, 0x7c, 0xe3, 0xcf, 0x9b, 0xfe, 0x6e, 0xde, 0xbd, 0xf9, 0x6a, 0x8f, 0x35, 0xfe, 0xfb, 0xe6, 0x8b, 0x7f, 0x7c, 0xf1, 0xcd, 0x7f, 0xeb, 0xfc, 0xf7, 0xcd, 0xdf, 0x9b, 0xf7, 0x2f, 0xff, 0xfe, 0xf3, 0xef, 0xed, 0xbf, 0xff, 0x72, 0x9f, 0xff, 0xee, 0xfd, 0xee, 0xb7, 0xff, 0xf7, 0xfd, 0xef, 0xe6, 0xff, 0xeb, 0xe3, 0xcf, 0x0e, 0xfb, 0xf8, 0xe3, 0x8f, 0x2e, 0xf7, 0xf8, 0xc5, 0x8e, 0x7f, 0x7e, 0xb8, 0xc7, 0x9f, 0xbb, 0xf9, 0xff, 0xfa, 0xdb, 0x37, 0xde, 0xf8, 0xf6, 0x8f, 0xff, 0xff, 0xf9, 0x64, 0x9f, 0xef, 0x7c, 0x9f, 0xee, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xf3, 0xf8, 0xb3, 0xbf, 0xff, 0xfb, 0xff, 0x7b, 0x1f, 0x7d, 0xed, 0xff, 0xff, 0xdf, 0xfb, 0xf5, 0xff, 0x9b, 0xff, 0xa7, 0xff, 0xbf, 0x3b, 0xee, 0x6f, 0xff, 0xfe, 0xaf, 0x9a, 0xf3, 0xde, 0xbd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x86, 0xff, 0x6b, 0xff, 0xbd, 0xc7, 0xdb, 0x7b, 0xbf, 0xfd, 0xef, 0x37, 0xfe, 0xde, 0xeb, 0xef, 0x3f, 0xfe, 0xfe, 0xfb, 0xbd, 0xf9, 0xff, 0xf6, 0xdb, 0x4f, 0x3f, 0xfd, 0xf4, 0x9f, 0x2b, 0xff, 0xef, 0xff, 0xb7, 0xd7, 0x6e, 0xf2, 0xed, 0x17, 0x7f, 0x6f, 0xfa, 0xe7, 0xeb, 0x8e, 0x95, 0xfa, 0xb2, 0x43, 0xaf, 0xb5, 0xec, 0xb5, 0x97, 0x1f, 0x6e, 0xfd, 0x34, 0x57, 0x5d, 0x3f, 0x9b, 0xff, 0xcf, 0x9f, 0xf3, 0x73, 0xc5, 0x7f, 0xbf, 0xf0, 0xff, 0x9d, 0x7f, 0x56, 0xfc, 0xe5, 0xef, 0x5f, 0xbe, 0xbf, 0xef, 0xc6, 0xdb, 0xdd, 0xfe, 0x7f, 0xbf, 0x99, 0x77, 0xe7, 0xfd, 0xf9, 0xef, 0x1f, 0xff, 0x6b, 0xff, 0xbe, 0xf5, 0xff, 0xf9, 0x9f, 0xb9, 0x3f, 0x77, 0x7f, 0x37, 0xfd, 0x7f, 0xff, 0xf7, 0x7d, 0x7e, 0xdd, 0xfc, 0xeb, 0x7f, 0xbb, 0xff, 0xd6, 0x7f, 0xff, 0x6f, 0xce, 0xbf, 0xfe, 0x74, 0xef, 0x8f, 0xf5, 0xcf, 0xfb, 0xeb, 0xdf, 0xff, 0xff, 0xdd, 0xbf, 0xfd, 0x7f, 0xfe, 0xd5, 0x7f, 0x19, 0xfd, 0xaf, 0xf7, 0xfb, 0xfd, 0xf7, 0xff, 0xef, 0xdf, 0xf9, 0xbd, 0xfd, 0xfd, 0xfd, 0xff, 0xfd, 0xff, 0xe3, 0xec, 0xff, 0xe6, 0xbf, 0xdf, 0xfb, 0x7d, 0x9e, 0xf3, 0xff, 0x8e, 0xe9, 0xf7, 0xf6, 0xde, 0xff, 0xf7, 0xdf, 0xff, 0xfd, 0xf7, 0xff, 0xbf, 0xd1, 0xfb, 0xfe, 0xff, 0x2f, 0x3f, 0xfe, 0xf6, 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0x5f, 0x7f, 0xfb, 0xff, 0xbf, 0xff, 0x6f, 0xee, 0xbf, 0xff, 0xcf, 0xfd, 0xff, 0x97, 0xdf, 0xdf, 0xfe, 0xee, 0xbb, 0xfb, 0xff, 0x7f, 0xdf, 0xbf, 0xbf, 0xdf, 0xba, 0x9b, 0xbe, 0xfd, 0xd3, 0xaf, 0xb8, 0x36, 0xfe, 0x9f, 0xfa, 0xfc, 0xfd, 0x9d, 0x6e, 0xd4, 0xff, 0xeb, 0x1b, 0x37, 0xcc, 0xbf, 0xe6, 0xff, 0xbf, 0xff, 0x7f, 0xff, 0xdb, 0xfe, 0xff, 0xbf, 0xfd, 0xff, 0xb6, 0xbf, 0xfd, 0xff, 0xbb, 0xbf, 0x7e, 0xff, 0xbb, 0xb9, 0xf7, 0xff, 0xfc, 0xbf, 0x9b, 0xee, 0xbf, 0xfd, 0x3e, 0xd7, 0xff, 0x65, 0x5f, 0xfa, 0x67, 0xdd, 0xd7, 0xd9, 0xff, 0x6f, 0xee, 0x9b, 0xfc, 0xf3, 0xef, 0xff, 0xbf, 0xfe, 0xdf, 0x6f, 0xfb, 0xfb, 0xf1, 0xf3, 0xfb, 0x7c, 0xbf, 0xf7, 0xe3, 0xff, 0x9b, 0xfd, 0xff, 0xff, 0xfe, 0xec, 0xff, 0xff, 0xff, 0xff, 0xec, 0xfd, 0x7b, 0xff, 0xf6, 0xff, 0xef, 0xdd, 0xff, 0xfe, 0xff, 0x86, 0x7f, 0x9e, 0xff, 0xff, 0xfb, 0x2f, 0x2f, 0xaf, 0xf2, 0xfb, 0x7d, 0xf6, 0xeb, 0x65, 0x3f, 0xd5, 0xff, 0xf2, 0xff, 0x8f, 0xd9, 0xcf, 0xff, 0xff, 0x75, 0xff, 0xc5, 0x7e, 0xaa, 0xf5, 0xff, 0xff, 0x7d, 0xfe, 0x5f, 0x4f, 0xf9, 0xfd, 0xf4, 0xff, 0x6d, 0xfe, 0xf3, 0xf1, 0x3b, 0xdf, 0xfc, 0xff, 0x9a, 0x7a, 0xa9, 0x75, 0xe7, 0xff, 0x8f, 0xd7, 0x5e, 0xfa, 0x3f, 0xfd, 0xff, 0x9b, 0xf5, 0xf9, 0xfe, 0x9e, 0xf7, 0xff, 0xef, 0x77, 0xfe, 0xfa, 0xd7, 0xbf, 0xff, 0x96, 0x75, 0x96, 0x9f, 0x6f, 0xfc, 0xd7, 0xe6, 0xfe, 0xdf, 0xe6, 0xfd, 0x7d, 0x7f, 0x69, 0x22, 0xfd, 0xff, 0xf7, 0xb3, 0xfe, 0xfe, 0xef, 0xb4, 0xf7, 0xe2, 0xaa, 0xbb, 0x99, 0xff, 0xbf, 0x79, 0xff, 0xcf, 0x7b, 0xdf, 0xab, 0xf7, 0x7e, 0x7d, 0xdd, 0xbf, 0xff, 0x0e, 0xb7, 0xd4, 0x33, 0xef, 0x6c, 0xec, 0x7f, 0x5f, 0xfa, 0xf7, 0xf1, 0xad, 0xfe, 0x7a, 0xe8, 0xdf, 0x7f, 0xfd, 0xff, 0xb2, 0x5f, 0x7d, 0x3b, 0xfc, 0xb8, 0x99, 0xfb, 0x7f, 0xb3, 0xfe, 0x37, 0x7b, 0xff, 0xbd, 0x52, 0xda, 0xff, 0x5f, 0xfd, 0xfb, 0xdf, 0xd7, 0x5e, 0x69, 0xe5, 0x8f, 0xe6, 0xfd, 0xef, 0xfc, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xed, 0xb7, 0xdb, 0x3f, 0xfb, 0xf7, 0xe7, 0xbd, 0x79, 0xff, 0x7f, 0xff, 0xff, 0xc6, 0xff, 0xff, 0xdf, 0xff, 0xfe, 0xf7, 0xcf, 0x7e, 0xfb, 0xbd, 0xaf, 0xff, 0xbe, 0x7b, 0x6f, 0xec, 0xdf, 0x1d, 0xfb, 0xdd, 0xbf, 0xff, 0x5e, 0xf3, 0xed, 0x75, 0xff, 0xd9, 0x76, 0xdf, 0x7f, 0x8f, 0xd9, 0xb7, 0xb9, 0x99, 0xf9, 0xf6, 0xdf, 0x6f, 0xef, 0xff, 0xff, 0xdf, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xfe, 0xbf, 0xdf, 0xce, 0xe6, 0xbe, 0xef, 0xfd, 0xfb, 0xfa, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xbb, 0xa9, 0xdf, 0xe7, 0xef, 0x7f, 0xbc, 0xff, 0xde, 0x8f, 0xad, 0x7d, 0xbf, 0xe5, 0x17, 0xfe, 0x7c, 0xef, 0xf5, 0x3e, 0xfe, 0x6a, 0xde, 0xff, 0xdb, 0x6a, 0xbf, 0xef, 0xbe, 0xfb, 0xe7, 0xab, 0x7f, 0x74, 0xf1, 0xcd, 0x3f, 0xdd, 0x7d, 0xf5, 0xc5, 0xdf, 0x9b, 0xff, 0xff, 0xfa, 0x7e, 0xef, 0xfb, 0xef, 0xff, 0xfa, 0xff, 0xf7, 0x4f, 0xff, 0xb7, 0xf5, 0xdf, 0x7f, 0xff, 0xdd, 0xfe, 0xe6, 0xff, 0xff, 0xa3, 0xcf, 0x2f, 0xfe, 0xf8, 0xf3, 0xc3, 0x3f, 0x77, 0xd0, 0xc5, 0x1f, 0x79, 0xf6, 0xf1, 0xc5, 0x9e, 0xbf, 0xf9, 0xff, 0xf7, 0xff, 0x77, 0x9f, 0xfd, 0xfb, 0xff, 0x76, 0xff, 0xfd, 0xfe, 0x97, 0x5f, 0x7f, 0xfb, 0x75, 0xdf, 0xff, 0x6f, 0xfe, 0xff, 0xfd, 0xfe, 0xfc, 0xe3, 0xff, 0xfe, 0x7f, 0xde, 0xdb, 0x97, 0x7f, 0xed, 0xd5, 0xdf, 0x7f, 0x7d, 0xfd, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xbf, 0xb7, 0xda, 0xbf, 0xff, 0xff, 0xfa, 0xda, 0x73, 0x57, 0xfd, 0xff, 0x9f, 0x7f, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0x5f, 0xef, 0xfd, 0xc7, 0xd6, 0x6f, 0x7f, 0xb5, 0xe6, 0x3c, 0xdf, 0xdc, 0xf3, 0xef, 0xb7, 0xd7, 0xde, 0xfb, 0x8f, 0xf9, 0xff, 0x72, 0xcb, 0x2f, 0xff, 0xdf, 0xf6, 0xdf, 0xff, 0x7f, 0x7a, 0xe9, 0xff, 0x5e, 0x7e, 0xf9, 0xe5, 0xb7, 0xff, 0x6f, 0xfa, 0xaf, 0xeb, 0xa7, 0xb5, 0xfe, 0xda, 0xeb, 0xaf, 0xbe, 0xdc, 0xf5, 0xd7, 0x5f, 0x6c, 0xdd, 0xe5, 0x16, 0x5d, 0xfe, 0x9b, 0xfd, 0x3d, 0x5f, 0xaf, 0x73, 0xed, 0xcf, 0x9e, 0xec, 0xff, 0xff, 0x3b, 0xf6, 0xf9, 0x7f, 0x1f, 0x7e, 0x7a, 0xf7, 0xff, 0xc6, 0xfe, 0xe7, 0xff, 0xaf, 0xff, 0xff, 0xff, 0x1e, 0xdf, 0xdf, 0x5f, 0x5e, 0xd4, 0xbf, 0xfb, 0xfd, 0xcc, 0xfd, 0xff, 0x9f, 0xf9, 0x7f, 0xff, 0xfd, 0xbf, 0x7f, 0xff, 0x6f, 0xff, 0x77, 0xfa, 0xdf, 0xfd, 0xde, 0xed, 0xff, 0xfe, 0xbf, 0x7b, 0xff, 0x6e, 0xfa, 0xbf, 0xde, 0x7c, 0xfa, 0xff, 0xf6, 0xb6, 0xf3, 0xeb, 0x1f, 0x7f, 0xf9, 0xf1, 0xc7, 0xf3, 0x7f, 0x9f, 0xd1, 0xff, 0x99, 0x7f, 0x9e, 0xfd, 0xff, 0x97, 0xff, 0xff, 0xdf, 0xfb, 0xfb, 0x6f, 0x7f, 0xff, 0x7e, 0xfb, 0xff, 0xff, 0xde, 0xfe, 0xff, 0x66, 0xff, 0xff, 0xbf, 0x7f, 0xfe, 0xbf, 0xcb, 0x6f, 0xbf, 0xf5, 0xf3, 0xf6, 0xf5, 0xff, 0xfd, 0xff, 0xfd, 0xff, 0xfb, 0xbf, 0x79, 0xff, 0xb6, 0x7f, 0xff, 0xb5, 0xfc, 0xed, 0xfb, 0xfd, 0xbf, 0xfb, 0xff, 0xb7, 0xff, 0x7e, 0xbb, 0x4d, 0xff, 0xff, 0x6f, 0xfa, 0xbf, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xbf, 0xeb, 0x7f, 0xef, 0xef, 0xf7, 0x77, 0x3f, 0x7f, 0xfd, 0xfd, 0xbe, 0xbe, 0x9b, 0xbb, 0xd7, 0xfb, 0xef, 0xbf, 0xf3, 0x83, 0xdd, 0xf3, 0xbf, 0xbf, 0xfd, 0x79, 0x70, 0xcd, 0xe6, 0x8e, 0xfb, 0xf7, 0xff, 0xe6, 0xbe, 0xf5, 0xff, 0xff, 0xbf, 0xd7, 0xdf, 0xfe, 0xfc, 0xbf, 0xff, 0x7b, 0xaf, 0x7f, 0xff, 0xed, 0xb7, 0xfd, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xdd, 0xaf, 0x5f, 0xee, 0xff, 0xe9, 0xfe, 0xfb, 0xdf, 0x7f, 0xbe, 0x6f, 0x5e, 0xf5, 0xef, 0xff, 0xff, 0x67, 0xfc, 0x7f, 0xf6, 0xf7, 0xef, 0xbf, 0xff, 0xee, 0xef, 0xe9, 0x5f, 0xff, 0xff, 0xef, 0xef, 0xe3, 0x3f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xf7, 0xfd, 0xab, 0xdf, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x9f, 0xe6, 0x7f, 0x1e, 0xbf, 0xbf, 0x9f, 0xff, 0xeb, 0xac, 0xf2, 0xf2, 0xb7, 0xf7, 0x5f, 0xfd, 0xe7, 0xf7, 0xff, 0xdf, 0xff, 0xaf, 0xd9, 0xcd, 0xf7, 0xff, 0xef, 0xe7, 0xff, 0x7e, 0xea, 0xe5, 0x7f, 0xff, 0xfd, 0xd4, 0xfe, 0x7d, 0xfd, 0xff, 0xf7, 0xff, 0x6d, 0x7e, 0xf3, 0xf5, 0x3b, 0xfb, 0x7c, 0xbf, 0x9c, 0xea, 0xaf, 0x75, 0xcf, 0xbf, 0xd4, 0xd4, 0x73, 0x2f, 0xbf, 0xf6, 0xfc, 0x9b, 0xf6, 0x7c, 0xff, 0xff, 0xfe, 0xdf, 0x89, 0xa6, 0xff, 0x7e, 0xf7, 0xfb, 0x4f, 0x3d, 0x71, 0xee, 0x33, 0xef, 0x9d, 0x57, 0xe6, 0xfe, 0xdd, 0xa5, 0xfd, 0xff, 0xd7, 0xc9, 0xa5, 0xdb, 0x1e, 0xff, 0xf0, 0x5e, 0x3b, 0xe9, 0xad, 0x9f, 0xd6, 0xff, 0x9b, 0x99, 0x2e, 0xff, 0x79, 0xf6, 0xff, 0xbf, 0xaa, 0xa9, 0xe6, 0xda, 0xff, 0xbd, 0x57, 0x43, 0xfa, 0xdf, 0xc6, 0x73, 0xff, 0x6c, 0xa6, 0x7f, 0x1f, 0xda, 0xeb, 0xdd, 0xbc, 0xfc, 0xfa, 0xef, 0x5f, 0x7f, 0xfd, 0xd5, 0xff, 0xdf, 0x6e, 0x1d, 0xf7, 0xba, 0x99, 0xf8, 0x7f, 0xb3, 0xff, 0xda, 0x5e, 0xaf, 0x97, 0x56, 0xde, 0xd7, 0x5f, 0x7f, 0x8d, 0xbf, 0x57, 0x73, 0xe9, 0xfd, 0xef, 0xc6, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xfe, 0xfb, 0xef, 0x7e, 0xfb, 0xed, 0xfe, 0xff, 0x6f, 0xfc, 0xf7, 0xff, 0x9d, 0x79, 0xdf, 0x6f, 0xfe, 0xfd, 0xfc, 0x5f, 0x6f, 0xbd, 0xf5, 0xc6, 0xf7, 0xff, 0x3f, 0xfa, 0xce, 0x37, 0xef, 0xff, 0x7b, 0x67, 0xe8, 0xcf, 0x5d, 0xfb, 0xec, 0x77, 0xef, 0x6a, 0xbb, 0xef, 0x7f, 0xff, 0xfd, 0xc6, 0x99, 0x6a, 0xfe, 0xad, 0xf6, 0xbd, 0x99, 0xfb, 0xf6, 0xff, 0x3f, 0xaf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xef, 0xb7, 0x77, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xcf, 0xe6, 0xbe, 0xaf, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xfd, 0xfb, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbb, 0xa9, 0xff, 0xc7, 0xeb, 0xbf, 0xfd, 0xfd, 0xca, 0x6b, 0xaf, 0x7f, 0xfd, 0xf5, 0x3f, 0xfe, 0xfd, 0xf5, 0xad, 0xd7, 0xee, 0x6e, 0xde, 0xff, 0xfb, 0xea, 0xab, 0xfe, 0xbe, 0xf8, 0x6a, 0x89, 0x5f, 0x75, 0xf5, 0xcc, 0x7e, 0x7b, 0x74, 0xf1, 0xd7, 0xdb, 0x9b, 0xfe, 0xff, 0xfe, 0xde, 0xfb, 0xff, 0x6f, 0xf7, 0xef, 0x7a, 0xdf, 0x7f, 0xff, 0xf9, 0x75, 0x56, 0x7b, 0x6f, 0xfd, 0xff, 0xa6, 0xff, 0xff, 0xe3, 0x87, 0x2e, 0xff, 0xf8, 0xf3, 0x8f, 0x3e, 0x77, 0xf2, 0xe5, 0x9f, 0x39, 0xf6, 0xf9, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xfa, 0x8b, 0x7f, 0xff, 0xff, 0xfd, 0x1f, 0x5f, 0xaf, 0xff, 0xf5, 0xff, 0xff, 0x6f, 0xf8, 0xff, 0xff, 0xff, 0xf9, 0x77, 0xbf, 0xfe, 0xfa, 0xff, 0xff, 0xb7, 0xdd, 0xfd, 0xd7, 0xff, 0x7f, 0xfd, 0xfd, 0xef, 0x9b, 0xff, 0x7f, 0xff, 0x9e, 0xbf, 0xfe, 0xaf, 0xff, 0xfb, 0xf7, 0xda, 0xe3, 0xdf, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xbd, 0x86, 0xff, 0x7f, 0xef, 0x81, 0x07, 0xdf, 0x6b, 0xff, 0xff, 0xa7, 0x37, 0xff, 0xd4, 0x7b, 0xaf, 0xb7, 0xff, 0xfe, 0xfb, 0xb7, 0xf9, 0xff, 0xfe, 0xcb, 0xef, 0xef, 0xbc, 0xf4, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xb6, 0xff, 0x7f, 0xfa, 0xfd, 0xa7, 0xff, 0x6b, 0xf2, 0xf7, 0xab, 0xad, 0xbe, 0xf6, 0xea, 0xeb, 0x8d, 0xbd, 0xfc, 0x75, 0xd7, 0x5b, 0x7d, 0xad, 0x74, 0xd7, 0x4b, 0xfd, 0x9a, 0xeb, 0x57, 0xff, 0xcb, 0xdd, 0xdf, 0x5f, 0xcf, 0xff, 0xf3, 0xfe, 0xeb, 0x35, 0xf7, 0xc7, 0xff, 0xfb, 0xfd, 0xff, 0xff, 0xe6, 0xf7, 0xfb, 0xff, 0xfb, 0xfd, 0xb5, 0xfb, 0xfe, 0xf5, 0x7c, 0xff, 0xfe, 0xfb, 0x3d, 0xed, 0x5f, 0xfd, 0xfe, 0xbf, 0x9f, 0x59, 0xf7, 0xdf, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xfd, 0xef, 0xfe, 0xff, 0xff, 0xba, 0xfb, 0x9f, 0xff, 0xfe, 0xfe, 0xff, 0x6f, 0xf8, 0xbe, 0xfc, 0xf3, 0xef, 0xaf, 0xb7, 0xde, 0x7a, 0xeb, 0x57, 0xff, 0xdd, 0xe7, 0xe3, 0x7f, 0x7f, 0xed, 0xf9, 0x9e, 0x1b, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xdb, 0x6f, 0xbf, 0xfe, 0xab, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xde, 0xff, 0xbf, 0xe6, 0xed, 0xfb, 0xef, 0xbf, 0xfe, 0xf9, 0xfd, 0x1f, 0xbf, 0xfc, 0xbf, 0xf7, 0xdf, 0xdf, 0xbf, 0xbd, 0xcf, 0x7f, 0xff, 0xaf, 0xf1, 0xef, 0xda, 0xfb, 0xcf, 0x9d, 0xe7, 0xff, 0xfa, 0xcf, 0x7f, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xff, 0xed, 0xff, 0xfd, 0x6f, 0xfc, 0xff, 0xf7, 0xfe, 0xaf, 0xbf, 0xfd, 0x7f, 0x5b, 0xef, 0x6e, 0xff, 0xd7, 0xdf, 0x7b, 0xf5, 0xff, 0xfd, 0xcf, 0xfe, 0x1b, 0xff, 0xfb, 0x3b, 0xee, 0xff, 0xff, 0xff, 0x2d, 0xfe, 0xff, 0xb7, 0xf7, 0xbf, 0x9f, 0xff, 0xff, 0x5e, 0xb9, 0xef, 0xff, 0xa6, 0xbf, 0xfd, 0x7f, 0xf7, 0xff, 0xff, 0x3f, 0x7f, 0xff, 0xdf, 0xfd, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xaf, 0xd9, 0xbf, 0xfb, 0xbd, 0xbe, 0xdf, 0xcf, 0xff, 0xdd, 0x7f, 0x7e, 0xcd, 0xf6, 0xff, 0x7d, 0x6f, 0x7d, 0xf6, 0xbf, 0xff, 0x6f, 0xd6, 0xfd, 0xf4, 0xda, 0x67, 0xfe, 0xdf, 0xef, 0xd7, 0xef, 0x77, 0xef, 0xee, 0xf7, 0xbf, 0x7f, 0xdf, 0xda, 0xef, 0xfb, 0x98, 0x7f, 0xaf, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xfe, 0xdf, 0xfb, 0xef, 0xff, 0xbf, 0xee, 0xfd, 0xef, 0xfb, 0xff, 0xff, 0xff, 0x86, 0xff, 0xfb, 0x75, 0xff, 0x9e, 0xef, 0xaf, 0xff, 0xbf, 0x9a, 0xf5, 0xdf, 0x7e, 0xff, 0x3f, 0xd7, 0x5f, 0xff, 0xff, 0x8f, 0xd9, 0xff, 0x3e, 0xff, 0xef, 0xf3, 0xff, 0xee, 0x7b, 0xa9, 0x66, 0xfd, 0xff, 0xff, 0xff, 0x7b, 0xfd, 0xed, 0xff, 0xff, 0x6d, 0xfe, 0xbf, 0xcf, 0xff, 0xff, 0xef, 0xfe, 0xcf, 0x5e, 0xf9, 0x5f, 0xff, 0x3d, 0xbf, 0xf4, 0x7f, 0xcd, 0x3d, 0xf7, 0xff, 0x9b, 0xf5, 0xef, 0xff, 0xdf, 0x7f, 0xfb, 0xaf, 0xa7, 0xfe, 0x3a, 0xd7, 0xff, 0xe7, 0x3f, 0x75, 0xf6, 0xd9, 0x6f, 0xff, 0xd7, 0xe6, 0xf6, 0x6f, 0x76, 0xef, 0x3e, 0xda, 0x6b, 0xef, 0x95, 0xf6, 0xb5, 0xfb, 0xfe, 0xbb, 0xbf, 0x76, 0xdb, 0x42, 0xab, 0xbb, 0x99, 0xff, 0x5e, 0xfd, 0xe6, 0x8b, 0xf6, 0x9f, 0x9d, 0xa6, 0x5a, 0x55, 0xb6, 0x5b, 0x64, 0x3d, 0xbd, 0xbc, 0xd3, 0xec, 0x6c, 0xec, 0xff, 0xfe, 0x1d, 0xeb, 0xed, 0xfd, 0xfe, 0x3a, 0xab, 0x5f, 0xfd, 0x7f, 0xb5, 0xf7, 0x77, 0xff, 0x6f, 0xfd, 0xba, 0x99, 0xfb, 0xef, 0xff, 0xfd, 0xda, 0x7a, 0xef, 0xbd, 0xd1, 0xda, 0xd7, 0x7f, 0x7f, 0xfd, 0xfd, 0xf7, 0x5e, 0xfb, 0xed, 0x8f, 0xe6, 0x3d, 0xff, 0xbf, 0xdb, 0xff, 0xff, 0xff, 0xf6, 0xef, 0xef, 0xee, 0xff, 0xfd, 0xb7, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xbd, 0x69, 0xff, 0x7f, 0xbf, 0xff, 0xfc, 0x97, 0x7f, 0xdf, 0xff, 0xd7, 0xf3, 0xff, 0xfa, 0xfb, 0xcd, 0x27, 0xff, 0xff, 0x7b, 0x6f, 0xec, 0xdf, 0x3e, 0xf7, 0xed, 0xb7, 0xff, 0xee, 0xfb, 0xef, 0x76, 0xf8, 0x9d, 0xf6, 0xd8, 0x6b, 0xaf, 0xfd, 0xf7, 0xbd, 0x99, 0xf9, 0xf3, 0xfb, 0x6b, 0xaf, 0xbd, 0xf7, 0xdf, 0xff, 0xbf, 0xfd, 0xff, 0xbf, 0xff, 0xff, 0x7b, 0xef, 0xbf, 0xff, 0xcf, 0xe6, 0xfe, 0xfe, 0xbf, 0xf6, 0xdf, 0xbf, 0xff, 0xfe, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xbb, 0xa9, 0xff, 0x7a, 0x1f, 0xaf, 0xbd, 0xf6, 0xdf, 0xdb, 0xbf, 0x7f, 0xf1, 0xf7, 0xde, 0x7f, 0xef, 0xad, 0xbd, 0xf6, 0xfe, 0x6a, 0xde, 0xb7, 0xfb, 0xef, 0xaf, 0xae, 0xbe, 0xfa, 0x63, 0xbf, 0x57, 0x6c, 0xf3, 0xce, 0x3e, 0x7d, 0x75, 0xb5, 0xd7, 0xdf, 0x9b, 0xff, 0xbd, 0xfb, 0xef, 0x7a, 0xef, 0xad, 0xb3, 0xff, 0xfa, 0xd7, 0x6d, 0xef, 0xfd, 0xf5, 0xd7, 0xdd, 0xef, 0xdd, 0xff, 0xe6, 0xfd, 0xff, 0x73, 0xcf, 0x3e, 0x7e, 0xfc, 0xb3, 0xcf, 0x3f, 0xe5, 0xf1, 0xe7, 0x9f, 0x7f, 0xf6, 0xd1, 0xc7, 0x8f, 0xbf, 0xf9, 0xff, 0xfa, 0xdf, 0xbf, 0xbf, 0x7f, 0xfe, 0xcd, 0xbf, 0x7f, 0xf9, 0xff, 0xd7, 0x7f, 0xff, 0xfd, 0xf7, 0xf7, 0xef, 0x6f, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xf3, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfd, 0xfb, 0xff, 0xbd, 0xfe, 0xfa, 0xeb, 0xd3, 0xff, 0xfd, 0xf5, 0xd7, 0xd7, 0x7f, 0xff, 0xbd, 0xff, 0x86, 0xbf, 0x7f, 0xff, 0xfd, 0xf7, 0x5f, 0xfb, 0x3d, 0xbf, 0xff, 0xb7, 0xd7, 0x7f, 0xff, 0xfd, 0xb7, 0xff, 0xde, 0xfb, 0xbf, 0xf9, 0xff, 0x72, 0xdb, 0xff, 0xbf, 0xff, 0xf7, 0x97, 0x4f, 0x3f, 0xef, 0xbd, 0xf7, 0x9e, 0xfe, 0xfb, 0xe7, 0x7f, 0xff, 0x6f, 0xfe, 0x7f, 0xeb, 0xae, 0x3f, 0x7c, 0xfa, 0xcb, 0x0f, 0xba, 0xde, 0xe5, 0xd7, 0x5f, 0x77, 0xed, 0xf5, 0x57, 0x4f, 0xff, 0x9a, 0x7f, 0xfb, 0xbf, 0xee, 0xdf, 0xf7, 0x2f, 0xdd, 0xfd, 0xeb, 0xfd, 0xbf, 0xfd, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x7e, 0xdf, 0xf6, 0xfb, 0xbf, 0xff, 0xf7, 0xde, 0xde, 0xcd, 0x9f, 0xfb, 0xf7, 0xbe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xf9, 0xf7, 0xff, 0x77, 0xf7, 0xff, 0xfd, 0xed, 0x7f, 0xbf, 0xd7, 0xff, 0xef, 0x7b, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xff, 0x6f, 0xf8, 0xd7, 0xeb, 0xec, 0xf3, 0xbf, 0xbd, 0x96, 0x7e, 0xff, 0xdf, 0x4f, 0xbd, 0xf5, 0xdf, 0xfb, 0xf7, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x6e, 0xdf, 0xf6, 0x3f, 0xbe, 0xaf, 0xc6, 0xf3, 0xfb, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0xef, 0xa7, 0xbe, 0xff, 0xff, 0xfa, 0xff, 0xfe, 0xff, 0xff, 0xee, 0xdf, 0xdb, 0xef, 0xdf, 0xf7, 0xfd, 0xff, 0xff, 0xaf, 0xc9, 0xff, 0xfe, 0x73, 0xf3, 0xff, 0xff, 0xfe, 0xeb, 0xff, 0x7e, 0xfd, 0xff, 0xf7, 0xfe, 0x3d, 0xfe, 0xed, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xfe, 0xbf, 0x7f, 0xd7, 0xf2, 0x5f, 0xff, 0xfa, 0xeb, 0xfb, 0xf7, 0x7b, 0x7a, 0xff, 0xfd, 0xff, 0xfd, 0x9b, 0xff, 0xaf, 0x3f, 0xf2, 0xdf, 0xff, 0x8f, 0xcf, 0xef, 0xfc, 0xff, 0xef, 0xbe, 0xdf, 0xff, 0xff, 0x1e, 0xee, 0xff, 0xfb, 0xe6, 0xde, 0xff, 0xdf, 0xf7, 0xef, 0xff, 0xef, 0xff, 0xbe, 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xdf, 0xff, 0xff, 0xbb, 0xf1, 0x7f, 0xbb, 0xe9, 0xbb, 0xf7, 0xc7, 0xbf, 0xcd, 0x7f, 0xff, 0xbd, 0x6e, 0xd6, 0xf9, 0xf7, 0xfd, 0xff, 0xd5, 0xef, 0x6f, 0xfe, 0x7b, 0xfe, 0xff, 0xcf, 0xf7, 0xdf, 0xf6, 0x53, 0xff, 0x7f, 0x7a, 0xfd, 0xf7, 0xd7, 0x3e, 0xb7, 0xff, 0xf7, 0xff, 0x98, 0xff, 0xbf, 0xfd, 0xff, 0xda, 0xff, 0xbf, 0xbd, 0xfe, 0xff, 0x57, 0xfd, 0xff, 0xfd, 0xbf, 0xee, 0xff, 0xfd, 0xde, 0xff, 0xa6, 0x7f, 0xbe, 0xf5, 0xfe, 0xff, 0xfa, 0xbf, 0xff, 0xf3, 0x9b, 0xff, 0xff, 0xf3, 0xff, 0x37, 0xd5, 0x7f, 0xdf, 0xfd, 0x8d, 0xd9, 0xcf, 0x2f, 0xbf, 0xff, 0xff, 0xcf, 0xdf, 0xfb, 0xf5, 0xf1, 0xff, 0xff, 0xfc, 0x7f, 0xcd, 0xff, 0xef, 0x5f, 0xff, 0x6c, 0xde, 0xf3, 0x5d, 0xf7, 0xfb, 0xff, 0x97, 0xfa, 0xff, 0xab, 0x5f, 0xaf, 0x3f, 0xfd, 0xff, 0x4b, 0xfd, 0x9f, 0xff, 0xff, 0x1b, 0xf5, 0x7f, 0xf7, 0xcf, 0x7b, 0xea, 0xad, 0xff, 0xce, 0xfa, 0xd7, 0x7b, 0xe7, 0xff, 0x77, 0xd6, 0xd3, 0xcf, 0xff, 0xf7, 0xe6, 0xfe, 0xdd, 0x73, 0xfe, 0x56, 0x9b, 0x78, 0xbf, 0xd9, 0xf7, 0xb5, 0xf5, 0xee, 0x2f, 0xdd, 0x3e, 0xfb, 0x5f, 0xff, 0xbb, 0x91, 0xbf, 0xbf, 0xfc, 0xe7, 0xfd, 0xf6, 0xab, 0x7d, 0xf5, 0x7e, 0xf5, 0x95, 0x38, 0x4d, 0x7f, 0xed, 0xcf, 0xd2, 0xff, 0x6e, 0xec, 0x7f, 0x5f, 0x7d, 0xe8, 0xef, 0xb3, 0xdf, 0x3e, 0xab, 0xff, 0x7b, 0xff, 0xaf, 0xd7, 0x5f, 0xff, 0xfb, 0xf5, 0xbf, 0x1b, 0xf9, 0x7f, 0xf3, 0xdd, 0xfa, 0x7b, 0xbd, 0xe0, 0xd7, 0x5a, 0x7d, 0xde, 0xff, 0xff, 0xb5, 0xd7, 0xfe, 0x7f, 0xed, 0xef, 0x86, 0xfd, 0xef, 0xbe, 0xcb, 0xff, 0x3f, 0xde, 0xf6, 0xef, 0xfd, 0xee, 0xff, 0xfd, 0xff, 0x9f, 0x7f, 0xbb, 0xed, 0xff, 0xbd, 0x79, 0xf7, 0xef, 0xbd, 0xf9, 0xff, 0xff, 0xe7, 0xff, 0x7d, 0xfe, 0xf3, 0xff, 0x7b, 0xff, 0xf9, 0xef, 0xdf, 0x7c, 0x7e, 0x6f, 0xae, 0xdf, 0x7d, 0xf7, 0xef, 0xbf, 0xd7, 0x5c, 0xbb, 0x8f, 0x75, 0xbe, 0xad, 0xd6, 0xda, 0x7f, 0xaf, 0xf5, 0xf6, 0xbf, 0x99, 0xf9, 0xfe, 0xce, 0xfb, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xde, 0x7f, 0xff, 0xb7, 0xf7, 0x4f, 0x66, 0xf6, 0xaf, 0xbb, 0xfe, 0xbf, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xbb, 0xb9, 0xff, 0x47, 0x1f, 0xaf, 0xff, 0x76, 0x47, 0x7f, 0x7f, 0x7c, 0xeb, 0xff, 0x52, 0xff, 0xfb, 0xed, 0xad, 0xd7, 0xfe, 0x68, 0xde, 0xf7, 0xfb, 0xef, 0xab, 0xff, 0xbe, 0xf9, 0xea, 0xbf, 0x5f, 0xfc, 0xf3, 0xc5, 0x57, 0x7d, 0x7d, 0xb1, 0x55, 0xcf, 0x9b, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xeb, 0xbe, 0xbe, 0xfe, 0xf7, 0xf5, 0xfb, 0x6f, 0xfd, 0xff, 0xdf, 0x4d, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0x73, 0xcf, 0x3e, 0xfe, 0xe8, 0xf3, 0xcf, 0x3f, 0xf5, 0xfc, 0x47, 0x1e, 0x7d, 0xf6, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xf7, 0xdf, 0xff, 0xbf, 0xff, 0xf7, 0xeb, 0x7f, 0xee, 0x3f, 0xff, 0xd5, 0xff, 0xff, 0xfd, 0xf5, 0xf7, 0xdf, 0x6f, 0xfe, 0xff, 0xfd, 0xf7, 0xff, 0xaf, 0xbf, 0xfd, 0xff, 0xff, 0x7f, 0x3f, 0xfd, 0xf5, 0xd7, 0x7f, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xbf, 0xff, 0xfb, 0xff, 0xfa, 0x77, 0x5d, 0xf5, 0xf5, 0xd7, 0x5f, 0x7f, 0xff, 0xff, 0xe6, 0xff, 0x7f, 0xff, 0xfd, 0xf6, 0xfb, 0x6b, 0xaf, 0xff, 0xf7, 0xb6, 0xf7, 0x5f, 0x7f, 0xed, 0xb5, 0xd7, 0xfe, 0xfb, 0xbf, 0xf9, 0xdf, 0xf3, 0xcf, 0xff, 0xff, 0xfd, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xe7, 0xf7, 0x5f, 0xde, 0xbb, 0xe9, 0xff, 0xff, 0x6f, 0xfa, 0xff, 0xeb, 0xaf, 0x3f, 0xf4, 0xda, 0xeb, 0xae, 0x3f, 0xf6, 0xf5, 0x57, 0x5f, 0x7b, 0xe5, 0x75, 0x57, 0x5f, 0x7f, 0x9b, 0xbf, 0x7c, 0xff, 0xee, 0xcf, 0x3b, 0xfd, 0xbf, 0xfb, 0xff, 0x1f, 0xff, 0xef, 0x9e, 0xe3, 0xf7, 0xfd, 0xff, 0xf9, 0xfb, 0xc6, 0xff, 0xfb, 0xf7, 0xfd, 0xff, 0xff, 0xde, 0xfa, 0xfb, 0xbf, 0xfd, 0xfd, 0xfd, 0x7d, 0xef, 0xff, 0xfd, 0x5f, 0x3f, 0xbf, 0xf9, 0xf7, 0xff, 0xb7, 0xff, 0xdf, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xea, 0xfe, 0xff, 0x7f, 0xff, 0x5f, 0xff, 0xfb, 0xef, 0x6e, 0xfa, 0xbf, 0xf6, 0xea, 0xae, 0xfe, 0xff, 0x9f, 0xfc, 0xff, 0x79, 0x6f, 0xfd, 0xe7, 0xd7, 0x5b, 0x7f, 0xff, 0xb1, 0xdf, 0x99, 0xff, 0x6f, 0xbf, 0x6d, 0xff, 0xbf, 0xfe, 0xf7, 0xff, 0xff, 0xf7, 0xf7, 0xde, 0xff, 0xeb, 0xb7, 0xff, 0xfe, 0x6e, 0x7f, 0xe6, 0xff, 0xff, 0xbf, 0xb7, 0xef, 0x7b, 0xcf, 0xbf, 0xff, 0xbf, 0xf7, 0xc7, 0x5f, 0xff, 0xff, 0xf7, 0xcf, 0x7f, 0xfe, 0xb3, 0xf9, 0xff, 0xbe, 0x7f, 0xef, 0xff, 0xdf, 0xff, 0x73, 0x7f, 0x5f, 0xfd, 0xff, 0xbf, 0xff, 0xff, 0xda, 0xbd, 0x7f, 0xff, 0x65, 0xf6, 0xbf, 0xff, 0xf7, 0xfb, 0x7f, 0xdf, 0x75, 0x7e, 0xff, 0xe6, 0xfa, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xfd, 0x6f, 0xbc, 0x99, 0xbf, 0xef, 0xef, 0xff, 0xfe, 0xd3, 0xde, 0xfb, 0xe7, 0xff, 0xee, 0xff, 0xfd, 0xff, 0xff, 0xf9, 0xff, 0x7f, 0xfe, 0x7f, 0xe6, 0xff, 0xfb, 0xfb, 0x9f, 0xff, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xf7, 0xe7, 0xef, 0xff, 0xff, 0xdf, 0xfe, 0xbf, 0xf9, 0x5f, 0xff, 0xee, 0xfe, 0x53, 0xef, 0xff, 0xff, 0x7f, 0xff, 0xbd, 0xee, 0xbe, 0xff, 0xf6, 0xef, 0x76, 0x9d, 0xff, 0x6d, 0xf8, 0xbb, 0xf6, 0xf9, 0x2b, 0xff, 0xff, 0xf5, 0x77, 0xdf, 0x5b, 0xf5, 0xff, 0xb5, 0xff, 0xff, 0xfb, 0xf8, 0xf3, 0xff, 0x9b, 0xff, 0xfd, 0xff, 0xf6, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0xdf, 0x9e, 0x7f, 0x7f, 0xfb, 0xfd, 0xff, 0x86, 0x7f, 0xbe, 0xff, 0xfe, 0xcb, 0xef, 0xff, 0x7f, 0xe6, 0xcf, 0x5f, 0xfe, 0xff, 0x7d, 0x9f, 0xdf, 0x5f, 0xfe, 0xfd, 0x8f, 0xd9, 0xcf, 0x37, 0xff, 0xef, 0xd6, 0xff, 0x7e, 0xfa, 0xf5, 0xff, 0xb7, 0xfe, 0x5f, 0xdf, 0xaf, 0xe7, 0xdd, 0x7f, 0xff, 0x6d, 0xfe, 0xf3, 0xfd, 0x6f, 0xe9, 0xaf, 0x96, 0xf4, 0x63, 0xea, 0xf9, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xcf, 0xbd, 0xfe, 0xff, 0x9b, 0xf5, 0x7f, 0xff, 0x9f, 0xfe, 0xeb, 0xcd, 0x3e, 0xdb, 0x7a, 0xfe, 0xff, 0xff, 0xfd, 0xfd, 0xff, 0xdb, 0xff, 0xff, 0xd7, 0xe6, 0xfe, 0xdf, 0xa6, 0xbd, 0xf7, 0x9e, 0x5c, 0x35, 0xc7, 0xf7, 0xbf, 0xff, 0x5e, 0xbf, 0xed, 0xbd, 0xd5, 0xec, 0xb3, 0xbb, 0x99, 0xff, 0xbf, 0xa9, 0xef, 0xfe, 0x7a, 0xef, 0xbb, 0xff, 0xfe, 0xb7, 0xde, 0xd7, 0x65, 0x7b, 0xf7, 0xbf, 0xbf, 0xff, 0x6c, 0xec, 0x7f, 0x5f, 0x6a, 0xab, 0xed, 0xed, 0xf4, 0x72, 0xeb, 0xfd, 0xfd, 0xff, 0xf5, 0xdf, 0xdf, 0xf9, 0xfd, 0xed, 0xbf, 0x99, 0xfb, 0x7f, 0xb3, 0x86, 0x5a, 0x2c, 0xef, 0xb0, 0x8f, 0xca, 0xf6, 0xfe, 0x7d, 0xed, 0xf7, 0xf7, 0xde, 0xfb, 0xe7, 0xcf, 0xe6, 0xfd, 0xef, 0x7c, 0xff, 0x6d, 0x37, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0xad, 0x79, 0xff, 0x6f, 0x9f, 0x7f, 0xf6, 0x99, 0x6f, 0xbf, 0x7d, 0xfe, 0xf3, 0xcf, 0x7f, 0xfe, 0xff, 0xbf, 0xff, 0x7f, 0x7f, 0x6d, 0xe4, 0xdf, 0xb5, 0xe3, 0x8f, 0x3b, 0xd7, 0x6a, 0x8b, 0x4f, 0x7f, 0xfc, 0xe9, 0xf7, 0xdf, 0x6b, 0xf7, 0xbd, 0xf6, 0xbf, 0x99, 0xf9, 0xfe, 0xfe, 0xff, 0xff, 0xfd, 0xf7, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xcf, 0xe6, 0xfe, 0xaf, 0xff, 0xff, 0xef, 0xef, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xab, 0xa9, 0xf7, 0xc7, 0x0d, 0x7f, 0xfc, 0xf4, 0x4e, 0x29, 0x7f, 0x7c, 0xe1, 0xed, 0xd7, 0xfe, 0xef, 0xfd, 0xb5, 0x17, 0xfe, 0x6e, 0xde, 0xff, 0xfb, 0xe3, 0x9f, 0x6f, 0xde, 0xf8, 0x62, 0xbf, 0x5f, 0x3c, 0xf3, 0x55, 0x7f, 0xff, 0x7d, 0xb7, 0x44, 0xdf, 0x98, 0xff, 0xff, 0xfe, 0xfa, 0xf3, 0xef, 0x2f, 0xb7, 0xfa, 0xff, 0xd5, 0xcf, 0x6f, 0xfd, 0x7f, 0xff, 0x5f, 0x6f, 0x9b, 0xff, 0xe6, 0xff, 0xff, 0xb3, 0xc3, 0x0f, 0xfe, 0xe8, 0xa2, 0xcf, 0x3d, 0x65, 0xf0, 0xe3, 0x9f, 0x7f, 0xfe, 0xf1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xf7, 0xcf, 0x37, 0xde, 0xfc, 0xba, 0xfb, 0x7f, 0xff, 0xf9, 0xf6, 0xd3, 0x5f, 0xff, 0xff, 0xff, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0x7b, 0xf8, 0x31, 0xbf, 0xbe, 0xfb, 0xff, 0x7b, 0x8e, 0x7d, 0xf5, 0xd7, 0xff, 0xff, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0x76, 0xff, 0xac, 0xbb, 0xfa, 0xaf, 0xbf, 0xfe, 0xf7, 0xfa, 0x75, 0xcf, 0xff, 0xf5, 0xff, 0xff, 0x7f, 0xfd, 0xff, 0x86, 0xff, 0x7f, 0xbf, 0xf5, 0xd7, 0xde, 0x6b, 0xaf, 0xfd, 0xe7, 0xbf, 0xde, 0x58, 0x7b, 0xed, 0xbf, 0xdf, 0x5e, 0xfb, 0xb7, 0xf9, 0xdf, 0xc2, 0xff, 0x4f, 0xff, 0xff, 0xc3, 0xcb, 0xff, 0xff, 0xfb, 0xff, 0xa5, 0xdf, 0x7e, 0xfb, 0xcd, 0xf7, 0xff, 0x6f, 0xfe, 0x7f, 0xab, 0xaf, 0xbb, 0xfe, 0xea, 0xcb, 0xad, 0x3e, 0xe6, 0xe5, 0xd7, 0x5f, 0x7e, 0xdc, 0x75, 0xd7, 0x5c, 0xfb, 0x9a, 0xfe, 0xf7, 0xfe, 0xec, 0xf3, 0xed, 0xff, 0xfe, 0xbf, 0xf3, 0x97, 0x6d, 0xfc, 0xd4, 0xd9, 0xb6, 0x49, 0xff, 0xfb, 0xff, 0xc6, 0xff, 0x7f, 0x97, 0xdf, 0xde, 0xef, 0xfe, 0xfe, 0x7b, 0xfe, 0xd7, 0xf6, 0xff, 0xbf, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0x9f, 0xf9, 0xff, 0xff, 0xfe, 0xe7, 0xdf, 0x7e, 0xbf, 0xfd, 0xf5, 0x77, 0xef, 0xfa, 0xef, 0xff, 0xbf, 0xff, 0xfb, 0xff, 0xff, 0x6d, 0xfe, 0xbf, 0xff, 0xff, 0xeb, 0x4f, 0xb7, 0xff, 0xb2, 0xff, 0x1f, 0xee, 0x71, 0xf5, 0xdd, 0x4f, 0x77, 0xfe, 0xf9, 0xff, 0x9b, 0xff, 0x7f, 0xef, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0x77, 0xff, 0xb7, 0xfd, 0xff, 0xb7, 0xff, 0xff, 0x6f, 0xff, 0xe6, 0xff, 0xbf, 0x3f, 0xbf, 0xff, 0xef, 0xdf, 0xaf, 0xff, 0xb7, 0xff, 0xf7, 0x4f, 0x77, 0xdc, 0xee, 0xff, 0x7f, 0xff, 0xbf, 0xd9, 0xdf, 0xfe, 0xe3, 0xff, 0xbf, 0xfc, 0xf7, 0xf3, 0xfb, 0xff, 0xfb, 0xff, 0xc7, 0x57, 0x7f, 0xf7, 0xe5, 0xbf, 0xff, 0x6b, 0xee, 0xff, 0xfe, 0xff, 0xbf, 0xff, 0xfd, 0xf7, 0xcb, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xbf, 0xbf, 0xef, 0xff, 0x9b, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0xfb, 0xdf, 0x8f, 0xfe, 0xbf, 0xe7, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xbf, 0x7f, 0xf3, 0xff, 0xa6, 0xff, 0xff, 0xfd, 0xa7, 0xfa, 0xfe, 0xf6, 0xfe, 0xfb, 0xff, 0xcd, 0xff, 0xb7, 0xff, 0xdf, 0xff, 0xef, 0xdf, 0xff, 0xbf, 0xb9, 0x6f, 0xff, 0xcf, 0xff, 0xfd, 0x7c, 0xfb, 0xfe, 0x7f, 0xdb, 0xdb, 0xcf, 0x9f, 0x7f, 0xda, 0xfb, 0x75, 0xbb, 0xff, 0x6d, 0xec, 0xff, 0x7a, 0xf8, 0xbf, 0x07, 0xff, 0xdd, 0xf7, 0x7f, 0xff, 0xbb, 0xff, 0xf7, 0xdb, 0x6f, 0xfe, 0xf9, 0xf5, 0x7f, 0x99, 0xfd, 0xb7, 0xfb, 0xef, 0xff, 0xff, 0xef, 0xf9, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xfe, 0xf9, 0x5f, 0x7f, 0xff, 0xff, 0xfd, 0xe6, 0x7f, 0xbe, 0xef, 0xfe, 0xfa, 0xcf, 0x2b, 0x7f, 0xd5, 0xfb, 0xdf, 0x1f, 0xdf, 0xfd, 0xef, 0xdf, 0x7f, 0xff, 0xfd, 0xaf, 0xf9, 0xcf, 0xf7, 0xbf, 0xef, 0xfe, 0xfd, 0xf7, 0x7f, 0xf9, 0xf2, 0xf7, 0xdd, 0x97, 0xff, 0xff, 0xfb, 0xef, 0xb7, 0xff, 0x6d, 0xde, 0xf3, 0x9d, 0xfb, 0xef, 0xe9, 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xd4, 0x53, 0x4f, 0x3d, 0xff, 0x7f, 0x1a, 0xf5, 0x79, 0xb3, 0xfe, 0x3c, 0xef, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x7f, 0x9d, 0x75, 0xd6, 0x5b, 0xe7, 0xff, 0x57, 0xe6, 0xfe, 0x5d, 0xf6, 0xfd, 0x54, 0x9e, 0x7d, 0xa5, 0xff, 0xf7, 0xbf, 0xdf, 0xdf, 0xfb, 0xaf, 0xbe, 0xd5, 0x5e, 0xab, 0xbb, 0x91, 0x3f, 0xbf, 0x7d, 0xef, 0xda, 0x77, 0xdf, 0xab, 0xff, 0xff, 0xff, 0xdd, 0xf2, 0xcc, 0x33, 0xcf, 0xb4, 0xdf, 0xec, 0x6c, 0xec, 0x6f, 0x5b, 0xff, 0xcf, 0xf5, 0xef, 0xff, 0x7a, 0xff, 0xf5, 0xfd, 0xbd, 0xfd, 0xd7, 0x5f, 0xff, 0xff, 0xf5, 0xa7, 0x19, 0xfb, 0x7f, 0xf1, 0xf7, 0xce, 0x6f, 0xff, 0xbd, 0x9e, 0x4f, 0xff, 0xde, 0x0f, 0xef, 0xf7, 0xdf, 0xfe, 0x7b, 0xed, 0x4d, 0xc6, 0xfd, 0xef, 0xfc, 0xfb, 0xff, 0xbf, 0xfd, 0xfc, 0xef, 0xbd, 0xef, 0xff, 0xff, 0xe7, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xad, 0x79, 0xf7, 0x5f, 0xff, 0xf7, 0xf6, 0x9f, 0x7f, 0xfe, 0x7f, 0xfe, 0xf3, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x7b, 0x6f, 0xae, 0xdf, 0xbd, 0xfb, 0xad, 0xbb, 0xff, 0x7e, 0xfb, 0xcf, 0x7f, 0xbc, 0xfd, 0xf7, 0xdf, 0x77, 0xff, 0xfd, 0xf7, 0xb8, 0x99, 0xfb, 0xf6, 0xff, 0x6f, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xee, 0x66, 0xb6, 0xef, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xbb, 0xb9, 0xff, 0xe7, 0x7f, 0xad, 0xfc, 0xf6, 0xdf, 0xef, 0x2f, 0xfc, 0xe3, 0xf7, 0xdf, 0xde, 0x7f, 0xaf, 0xff, 0xde, 0xfe, 0x6a, 0xd8, 0xff, 0xdb, 0xee, 0x89, 0xbf, 0xbe, 0x5b, 0xf6, 0x8b, 0xff, 0x7d, 0xfb, 0xd7, 0x77, 0xdf, 0x7d, 0xf5, 0xd7, 0xdf, 0x98, 0xff, 0xfe, 0xbe, 0xff, 0xee, 0xfb, 0xef, 0xff, 0x5e, 0x7a, 0xbf, 0x6f, 0xff, 0xdd, 0xf5, 0xd7, 0xff, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xf3, 0xc7, 0x2e, 0xfe, 0xf8, 0xe3, 0x8f, 0x3c, 0x7f, 0xf0, 0x67, 0x1f, 0x7d, 0xf4, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xf7, 0xff, 0xa7, 0x9f, 0xfe, 0xfe, 0xcf, 0x7f, 0xfe, 0xff, 0xc6, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfe, 0xe8, 0xa3, 0xff, 0xff, 0xf6, 0xff, 0xfb, 0x1f, 0x7f, 0xf7, 0xdf, 0x7f, 0x7f, 0xfd, 0xfd, 0xff, 0x9b, 0xff, 0x77, 0xff, 0x9f, 0xba, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xfa, 0x71, 0x5f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xfd, 0x7f, 0xef, 0xb1, 0xc6, 0xdf, 0x7f, 0x6f, 0xff, 0xe7, 0x3e, 0xb6, 0x5d, 0xfb, 0xef, 0xbf, 0xd7, 0xfe, 0xfb, 0xbf, 0xf9, 0xff, 0xfe, 0xda, 0xff, 0xbe, 0xfd, 0xf3, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xb7, 0xdf, 0x7e, 0xfb, 0xff, 0xbf, 0xff, 0x6f, 0xce, 0xbf, 0xeb, 0x2f, 0xbe, 0xf4, 0xda, 0xeb, 0xaf, 0xbf, 0xfa, 0xd5, 0x57, 0x5f, 0x7f, 0xf5, 0xd1, 0xd7, 0x5f, 0x7f, 0x9b, 0xff, 0x3f, 0x3b, 0xec, 0xe3, 0xb3, 0xfa, 0xd7, 0x7f, 0xfb, 0xdf, 0x77, 0x7f, 0x56, 0xd8, 0x67, 0xff, 0x7f, 0xff, 0xfe, 0xc6, 0xfe, 0xf7, 0xe7, 0xbb, 0xf6, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xfb, 0xee, 0x9f, 0xf9, 0xdf, 0xfb, 0xef, 0xfe, 0xff, 0xff, 0xbf, 0xff, 0xbf, 0xff, 0x79, 0xf7, 0xfb, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x65, 0xf6, 0xbf, 0xfe, 0xf8, 0xe3, 0xb7, 0xff, 0x7e, 0xf7, 0x7b, 0xff, 0xfe, 0xef, 0xe7, 0xdf, 0x7f, 0xff, 0xff, 0x77, 0xff, 0x99, 0xff, 0xbf, 0x7f, 0xe7, 0xfd, 0xff, 0xed, 0xfb, 0xef, 0xe7, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x77, 0x7f, 0x7f, 0x66, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xee, 0xe7, 0xf5, 0xf7, 0xff, 0xdf, 0xfe, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0x9f, 0xf9, 0xff, 0xfd, 0xff, 0xeb, 0xff, 0xbf, 0xfe, 0x7f, 0xff, 0xbf, 0xfb, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xee, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x7e, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x6f, 0x9b, 0xff, 0xff, 0xcf, 0x7f, 0xf7, 0xfd, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe6, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xbe, 0xf9, 0xff, 0xfb, 0xff, 0xfd, 0xef, 0xff, 0xbb, 0xbf, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfc, 0x7b, 0xf7, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0x5f, 0x7f, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xfc, 0xfb, 0xff, 0xff, 0xff, 0x9a, 0xff, 0xff, 0xfd, 0xfb, 0xff, 0xbf, 0xef, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xdf, 0xff, 0xff, 0xf3, 0xf7, 0xfe, 0x66, 0xff, 0xdd, 0x3f, 0x3d, 0xfc, 0x93, 0x5f, 0x3f, 0xff, 0xfc, 0xe1, 0x9b, 0xf7, 0xfa, 0x79, 0xe6, 0x9f, 0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xff, 0xde, 0x9f, 0xff, 0xed, 0xf7, 0xcf, 0xff, 0xff, 0x7e, 0xef, 0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xff, 0x6f, 0xfe, 0xff, 0xf7, 0xdb, 0x61, 0x8f, 0xdf, 0xfe, 0xfb, 0xeb, 0x57, 0x7f, 0xfd, 0xf7, 0xcf, 0x7f, 0xff, 0xfd, 0xf4, 0xfd, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf5, 0xff, 0xef, 0xff, 0xf5, 0xfc, 0xff, 0xff, 0xff, 0xbb, 0xfe, 0x7f, 0xff, 0xfe, 0xa6, 0xff, 0xef, 0xbf, 0xff, 0xfd, 0xfa, 0xef, 0x3f, 0x7f, 0xff, 0xf6, 0xd7, 0x7f, 0xff, 0xe5, 0xf7, 0xdf, 0x6f, 0xdf, 0xbf, 0xf9, 0xfe, 0xfc, 0xf3, 0xcf, 0x77, 0xff, 0xfc, 0xf3, 0xcf, 0xfe, 0xfe, 0xf9, 0xe7, 0xbf, 0x7f, 0xfe, 0xf9, 0xef, 0xf7, 0x6f, 0xfe, 0xbf, 0xf5, 0xfe, 0xff, 0xef, 0xbf, 0xff, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xfc, 0xf7, 0xdf, 0x3f, 0xff, 0xfd, 0xff, 0x9b, 0xff, 0xdf, 0x5f, 0xfa, 0xfb, 0xa5, 0xdf, 0x7a, 0xfa, 0xf9, 0xff, 0x3f, 0xfd, 0xf6, 0xd3, 0x4f, 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xfd, 0xf7, 0xdf, 0xbf, 0xdf, 0xed, 0xd7, 0xdf, 0x3d, 0xbb, 0xfd, 0xe7, 0xbf, 0xfb, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xbf, 0x79, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 0xfd, 0xff, 0xfb, 0xbf, 0xbf, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x6f, 0xfb, 0xfd, 0xff, 0xdf, 0x6d, 0xfb, 0xf5, 0xf7, 0xbf, 0xff, 0xfe, 0x7b, 0x6b, 0xbf, 0xf5, 0xd6, 0x9b, 0xfb, 0x9b, 0xff, 0xff, 0xfd, 0xff, 0xdd, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xdf, 0x77, 0xbc, 0x7d, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xef, 0xfe, 0xbf, 0xb9, 0xff, 0xb7, 0xdf, 0x6e, 0xfb, 0xed, 0xb7, 0xdd, 0x7e, 0x7b, 0xdb, 0x6f, 0xbf, 0xf5, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7e, 0xff, 0xed, 0xf7, 0xdf, 0x7e, 0xef, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xdb, 0x6f, 0xbf, 0xfd, 0x9b, 0xff, 0x7f, 0xfb, 0xfd, 0xb7, 0xdf, 0x7f, 0xdf, 0xfd, 0xf7, 0xbf, 0xff, 0xfe, 0xfb, 0xee, 0xbf, 0xf7, 0xfe, 0x7b, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xee, 0xfb, 0xef, 0xb6, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xef, 0xbf, 0xfa, 0xfa, 0xd7, 0x5f, 0x7f, 0xfd, 0xfd, 0xd7, 0x5f, 0x7d, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfa, 0xef, 0xbf, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xf7, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xef, 0xfc, 0xf3, 0xcf, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xf3, 0xe6, 0xfd, 0x5f, 0x77, 0xfd, 0x75, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xbf, 0xf9, 0xff, 0xdf, 0x7c, 0xfd, 0xcd, 0xd7, 0x5c, 0x7e, 0xfd, 0xe5, 0x2e, 0xbf, 0xee, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0x6f, 0xce, 0xff, 0x72, 0xfb, 0x6f, 0xb7, 0xbf, 0xdb, 0xfb, 0xef, 0x57, 0xbb, 0xfd, 0xd5, 0xdf, 0x7f, 0xfd, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xfe, 0x7f, 0xef, 0xbf, 0xe7, 0xfe, 0xff, 0xeb, 0xff, 0xef, 0xaf, 0xf7, 0xff, 0x7f, 0xdf, 0xfd, 0xf7, 0xdf, 0xfe, 0xbf, 0xf9, 0xbf, 0x7b, 0xf7, 0xd7, 0x73, 0x7f, 0x7b, 0xf7, 0xb7, 0xfb, 0xfa, 0xfb, 0xeb, 0xaf, 0xb7, 0xff, 0xfa, 0xbb, 0xef, 0x6f, 0xfe, 0xff }; /* rom names */ #define FSK_ROM_CROM0_R_0 0 #define FSK_ROM_CROM0_R_1 16 #define FSK_ROM_CROM0_R_2 32 #define FSK_ROM_CROM0_R_3 48 #define FSK_ROM_CROM0_R_4 64 #define FSK_ROM_CROM0_R_5 80 #define FSK_ROM_CROM0_R_6 96 #define FSK_ROM_CROM0_R_7 112 #define FSK_ROM_CROM1_R_0 128 #define FSK_ROM_CROM1_R_1 144 #define FSK_ROM_CROM1_R_2 160 #define FSK_ROM_CROM1_R_3 176 #define FSK_ROM_CROM1_R_4 192 #define FSK_ROM_CROM1_R_5 208 #define FSK_ROM_CROM1_R_6 224 #define FSK_ROM_CROM1_R_7 240 #define FSK_ROM_DIVROMRX0 256 #define FSK_ROM_DIVROMRX1 272 #define FSK_ROM_DIVROMRX2 288 #define FSK_ROM_DIVROMTX0 304 #define FSK_ROM_DIVROMTX1 320 #define FSK_ROM_DIVROMTX2 336 #define FSK_ROM_SWROMID 352 #define FSK_ROM_SWROMIE 368 #define FSK_ROM_SWROMIS 384 #define FSK_ROM_SWROMOE 400 #define FSK_ROM_SWROMOS 416 #define FSK_ROM_SWROMIC 432 #define FSK_ROM_SWROMOC 448 #define FSK_ROM_MDISCROMRXC 464 #define FSK_ROM_MDISCROMTXC 480 #define FSK_ROM_MDISCROMTXD 496 #define FSK_ROM_MDMINROM 512 /* rom locations */ static const unsigned long fsk_roms[528] = { 22037, 21373, 21705, 21041, 22205, 21541, 21873, 21209, 22203, 21539, 21871, 21207, 22039, 21375, 21707, 21043, 39954, 40120, 40122, 39956, 39290, 39456, 39458, 39292, 39622, 39788, 39790, 39624, 38958, 39124, 39126, 38960, 34009, 33677, 34175, 33843, 34177, 33845, 34011, 33679, 33345, 33013, 33511, 33179, 33513, 33181, 33347, 33015, 22057, 22223, 21393, 21559, 22225, 22059, 21561, 21395, 21725, 21891, 21061, 21227, 21893, 21727, 21229, 21063, 16091, 15759, 16257, 15925, 15427, 15095, 15593, 15261, 16259, 15927, 16093, 15761, 15595, 15263, 15429, 15097, 28043, 28209, 28211, 28045, 27379, 27545, 27547, 27381, 27711, 27877, 27879, 27713, 27047, 27213, 27215, 27049, 34029, 33697, 33365, 33033, 34197, 33865, 33533, 33201, 34195, 33863, 33531, 33199, 34031, 33699, 33367, 33035, 40005, 39341, 39673, 39009, 40171, 39507, 39839, 39175, 40173, 39509, 39841, 39177, 40007, 39343, 39675, 39011, 19051, 18883, 18885, 19049, 19715, 19547, 19549, 19713, 19383, 19215, 19217, 19381, 20047, 19879, 19881, 20045, 36968, 37300, 37632, 37964, 36800, 37132, 37464, 37796, 36802, 37134, 37466, 37798, 36966, 37298, 37630, 37962, 31023, 30857, 31355, 31189, 31687, 31521, 32019, 31853, 30855, 31021, 31187, 31353, 31519, 31685, 31851, 32017, 19071, 19403, 18903, 19235, 19735, 20067, 19567, 19899, 18905, 19237, 19069, 19401, 19569, 19901, 19733, 20065, 13105, 12939, 13437, 13271, 12937, 13103, 13269, 13435, 13769, 13603, 14101, 13935, 13601, 13767, 13933, 14099, 25057, 25389, 25721, 26053, 24889, 25221, 25553, 25885, 24891, 25223, 25555, 25887, 25055, 25387, 25719, 26051, 31043, 30877, 30875, 31041, 31707, 31541, 31539, 31705, 31375, 31209, 31207, 31373, 32039, 31873, 31871, 32037, 37019, 36851, 36853, 37017, 37351, 37183, 37185, 37349, 37683, 37515, 37517, 37681, 38015, 37847, 37849, 38013, 67025, 67689, 67357, 68021, 66859, 67523, 67191, 67855, 66857, 67521, 67189, 67853, 67023, 67687, 67355, 68019, 61069, 61733, 61401, 62065, 60903, 61567, 61235, 61899, 60901, 61565, 61233, 61897, 61067, 61731, 61399, 62063, 76007, 76173, 75343, 75509, 76175, 76009, 75511, 75345, 75675, 75841, 75011, 75177, 75843, 75677, 75179, 75013, 36918, 36752, 37250, 37084, 37582, 37416, 37914, 37748, 36750, 36916, 37082, 37248, 37414, 37580, 37746, 37912, 36908, 37240, 37572, 37904, 36740, 37072, 37404, 37736, 36742, 37074, 37406, 37738, 36906, 37238, 37570, 37902, 27962, 28128, 28130, 27964, 27298, 27464, 27466, 27300, 27630, 27796, 27798, 27632, 26966, 27132, 27134, 26968, 64024, 63360, 64190, 63526, 64192, 63528, 64026, 63362, 63692, 63028, 63858, 63194, 63860, 63196, 63694, 63030, 58048, 57716, 57384, 57052, 58214, 57882, 57550, 57218, 58216, 57884, 57552, 57220, 58050, 57718, 57386, 57054, 28023, 27359, 28191, 27527, 27691, 27027, 27859, 27195, 28189, 27525, 28025, 27361, 27857, 27193, 27693, 27029, 21986, 21654, 21322, 20990, 22152, 21820, 21488, 21156, 22154, 21822, 21490, 21158, 21988, 21656, 21324, 20992, 21976, 21644, 22144, 21812, 22142, 21810, 21978, 21646, 21312, 20980, 21480, 21148, 21478, 21146, 21314, 20982, 52103, 52269, 52271, 52105, 51771, 51937, 51939, 51773, 51439, 51605, 51607, 51441, 51107, 51273, 51275, 51109, 52083, 52251, 51751, 51919, 52249, 52085, 51917, 51753, 51419, 51587, 51087, 51255, 51585, 51421, 51253, 51089, 33978, 33314, 34144, 33480, 33646, 32982, 33812, 33148, 34146, 33482, 33980, 33316, 33814, 33150, 33648, 32984, 42934, 43266, 42768, 43100, 43598, 43930, 43432, 43764, 42766, 43098, 42932, 43264, 43430, 43762, 43596, 43928, 52072, 51408, 52238, 51574, 52240, 51576, 52074, 51410, 51740, 51076, 51906, 51242, 51908, 51244, 51742, 51078, 64014, 63682, 63350, 63018, 64180, 63848, 63516, 63184, 64182, 63850, 63518, 63186, 64016, 63684, 63352, 63020 }; baycomusb-0.10.orig/fpga/fsk_fpga.h0100644000175100017510000002265507340435103015267 0ustar abaaba/*****************************************************************************/ /* * fsk_fpga.h -- HDLC packet radio modem for EPP using FPGA utility. * * Copyright (C) 1998 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define FPGA_PART "XCS10_PC84" #define FPGA_BOUND 344 #define FPGA_FRAMELEN 166 #define FPGA_NUMFRAMES 572 /*#define FPGA_CONFIGSIZE ((FPGA_FRAMELEN*FPGA_NUMFRAMES+56)/8)*/ #define FPGA_CONFIGSIZE 11876 #define FPGA_BOUNDSIZE ((FPGA_BOUND+7)/8) /* safe boundary */ static const unsigned char fpga_safebound[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* IO pin names */ #define FPGA_PIN_CLK24_T 86 #define FPGA_PIN_CLK24_O 87 #define FPGA_PIN_CLK24_I 88 #define FPGA_PIN_CLKMODEM_T 175 #define FPGA_PIN_CLKMODEM_O 176 #define FPGA_PIN_CLKMODEM_I 177 #define FPGA_PIN_ANADDR0_T 232 #define FPGA_PIN_ANADDR0_O 233 #define FPGA_PIN_ANADDR0_I 234 #define FPGA_PIN_ANADDR1_T 229 #define FPGA_PIN_ANADDR1_O 230 #define FPGA_PIN_ANADDR1_I 231 #define FPGA_PIN_ANADDR2_T 220 #define FPGA_PIN_ANADDR2_O 221 #define FPGA_PIN_ANADDR2_I 222 #define FPGA_PIN_ANADDR3_T 217 #define FPGA_PIN_ANADDR3_O 218 #define FPGA_PIN_ANADDR3_I 219 #define FPGA_PIN_ANRD_T 2 #define FPGA_PIN_ANRD_O 3 #define FPGA_PIN_ANRD_I 4 #define FPGA_PIN_ANWR_T 5 #define FPGA_PIN_ANWR_O 6 #define FPGA_PIN_ANWR_I 7 #define FPGA_PIN_ANDATA0_T 316 #define FPGA_PIN_ANDATA0_O 317 #define FPGA_PIN_ANDATA0_I 318 #define FPGA_PIN_ANDATA1_T 313 #define FPGA_PIN_ANDATA1_O 314 #define FPGA_PIN_ANDATA1_I 315 #define FPGA_PIN_ANDATA2_T 304 #define FPGA_PIN_ANDATA2_O 305 #define FPGA_PIN_ANDATA2_I 306 #define FPGA_PIN_ANDATA3_T 301 #define FPGA_PIN_ANDATA3_O 302 #define FPGA_PIN_ANDATA3_I 303 #define FPGA_PIN_ANDATA4_T 283 #define FPGA_PIN_ANDATA4_O 284 #define FPGA_PIN_ANDATA4_I 285 #define FPGA_PIN_ANDATA5_T 271 #define FPGA_PIN_ANDATA5_O 272 #define FPGA_PIN_ANDATA5_I 273 #define FPGA_PIN_ANDATA6_T 262 #define FPGA_PIN_ANDATA6_O 263 #define FPGA_PIN_ANDATA6_I 264 #define FPGA_PIN_ANDATA7_T 259 #define FPGA_PIN_ANDATA7_O 260 #define FPGA_PIN_ANDATA7_I 261 #define FPGA_PIN_ANPA0_T 256 #define FPGA_PIN_ANPA0_O 257 #define FPGA_PIN_ANPA0_I 258 #define FPGA_PIN_ANPA3_T 253 #define FPGA_PIN_ANPA3_O 254 #define FPGA_PIN_ANPA3_I 255 #define FPGA_PIN_ANPA4_T 244 #define FPGA_PIN_ANPA4_O 245 #define FPGA_PIN_ANPA4_I 246 #define FPGA_PIN_ANPA5_T 241 #define FPGA_PIN_ANPA5_O 242 #define FPGA_PIN_ANPA5_I 243 #define FPGA_PIN_ANPA6_T -1 #define FPGA_PIN_ANPA6_O -1 #define FPGA_PIN_ANPA6_I -1 #define FPGA_PIN_ANPA7_T -1 #define FPGA_PIN_ANPA7_O -1 #define FPGA_PIN_ANPA7_I -1 #define FPGA_PIN_ANPB0_T 340 #define FPGA_PIN_ANPB0_O 341 #define FPGA_PIN_ANPB0_I 342 #define FPGA_PIN_ANPB1_T 337 #define FPGA_PIN_ANPB1_O 338 #define FPGA_PIN_ANPB1_I 339 #define FPGA_PIN_ANPB2_T 328 #define FPGA_PIN_ANPB2_O 329 #define FPGA_PIN_ANPB2_I 330 #define FPGA_PIN_ANPB3_T 325 #define FPGA_PIN_ANPB3_O 326 #define FPGA_PIN_ANPB3_I 327 #define FPGA_PIN_ANPB5_T 298 #define FPGA_PIN_ANPB5_O 299 #define FPGA_PIN_ANPB5_I 300 #define FPGA_PIN_ANPB6_T 295 #define FPGA_PIN_ANPB6_O 296 #define FPGA_PIN_ANPB6_I 297 #define FPGA_PIN_ANPB7_T 286 #define FPGA_PIN_ANPB7_O 287 #define FPGA_PIN_ANPB7_I 288 #define FPGA_PIN_ANPC0_T -1 #define FPGA_PIN_ANPC0_O -1 #define FPGA_PIN_ANPC0_I -1 #define FPGA_PIN_ANPC1_T -1 #define FPGA_PIN_ANPC1_O -1 #define FPGA_PIN_ANPC1_I -1 #define FPGA_PIN_ANPC2_T -1 #define FPGA_PIN_ANPC2_O -1 #define FPGA_PIN_ANPC2_I -1 #define FPGA_PIN_ANPC4_T 14 #define FPGA_PIN_ANPC4_O 15 #define FPGA_PIN_ANPC4_I 16 #define FPGA_PIN_MDATAOUT0_T 47 #define FPGA_PIN_MDATAOUT0_O 48 #define FPGA_PIN_MDATAOUT0_I 49 #define FPGA_PIN_MDATAOUT1_T 44 #define FPGA_PIN_MDATAOUT1_O 45 #define FPGA_PIN_MDATAOUT1_I 46 #define FPGA_PIN_MDATAOUT2_T 41 #define FPGA_PIN_MDATAOUT2_O 42 #define FPGA_PIN_MDATAOUT2_I 43 #define FPGA_PIN_MDATAOUT3_T 38 #define FPGA_PIN_MDATAOUT3_O 39 #define FPGA_PIN_MDATAOUT3_I 40 #define FPGA_PIN_MDATAOUT4_T 29 #define FPGA_PIN_MDATAOUT4_O 30 #define FPGA_PIN_MDATAOUT4_I 31 #define FPGA_PIN_MDATAOUT5_T 26 #define FPGA_PIN_MDATAOUT5_O 27 #define FPGA_PIN_MDATAOUT5_I 28 #define FPGA_PIN_MDATAOUT6_T 17 #define FPGA_PIN_MDATAOUT6_O 18 #define FPGA_PIN_MDATAOUT6_I 19 #define FPGA_PIN_MDATAIN_T 68 #define FPGA_PIN_MDATAIN_O 69 #define FPGA_PIN_MDATAIN_I 70 #define FPGA_PIN_MDATAINDAC_T 71 #define FPGA_PIN_MDATAINDAC_O 72 #define FPGA_PIN_MDATAINDAC_I 73 #define FPGA_PIN_PTT_T 190 #define FPGA_PIN_PTT_O 191 #define FPGA_PIN_PTT_I 192 #define FPGA_PIN_RSSIIN_T 59 #define FPGA_PIN_RSSIIN_O 60 #define FPGA_PIN_RSSIIN_I 61 #define FPGA_PIN_RSSIINDAC_T 56 #define FPGA_PIN_RSSIINDAC_O 57 #define FPGA_PIN_RSSIINDAC_I 58 #define FPGA_PIN_MRXC_T 211 #define FPGA_PIN_MRXC_O 212 #define FPGA_PIN_MRXC_I 213 #define FPGA_PIN_MRXD_T 199 #define FPGA_PIN_MRXD_O 200 #define FPGA_PIN_MRXD_I 201 #define FPGA_PIN_MTXC_T 202 #define FPGA_PIN_MTXC_O 203 #define FPGA_PIN_MTXC_I 204 #define FPGA_PIN_MTXD_T 167 #define FPGA_PIN_MTXD_O 168 #define FPGA_PIN_MTXD_I 169 #define FPGA_PIN_MRTS_T 178 #define FPGA_PIN_MRTS_O 179 #define FPGA_PIN_MRTS_I 180 #define FPGA_PIN_MCTS_T 164 #define FPGA_PIN_MCTS_O 165 #define FPGA_PIN_MCTS_I 166 #define FPGA_PIN_MNDCD_T 152 #define FPGA_PIN_MNDCD_O 153 #define FPGA_PIN_MNDCD_I 154 #define FPGA_PIN_MRES_T 143 #define FPGA_PIN_MRES_O 144 #define FPGA_PIN_MRES_I 145 #define FPGA_PIN_LEDDCD_T 131 #define FPGA_PIN_LEDDCD_O 132 #define FPGA_PIN_LEDDCD_I 133 #define FPGA_PIN_LEDPTT_T 140 #define FPGA_PIN_LEDPTT_O 141 #define FPGA_PIN_LEDPTT_I 142 #define FPGA_PIN_T7FD0_T 128 #define FPGA_PIN_T7FD0_O 129 #define FPGA_PIN_T7FD0_I 130 #define FPGA_PIN_T7FD1_T 125 #define FPGA_PIN_T7FD1_O 126 #define FPGA_PIN_T7FD1_I 127 #define FPGA_PIN_T7FD2_T 122 #define FPGA_PIN_T7FD2_O 123 #define FPGA_PIN_T7FD2_I 124 #define FPGA_PIN_T7FD3_T 113 #define FPGA_PIN_T7FD3_O 114 #define FPGA_PIN_T7FD3_I 115 #define FPGA_PIN_T7FTXD_T 89 #define FPGA_PIN_T7FTXD_O 90 #define FPGA_PIN_T7FTXD_I 91 #define FPGA_PIN_T7FRXD_T 83 #define FPGA_PIN_T7FRXD_O 84 #define FPGA_PIN_T7FRXD_I 85 #define FPGA_PIN_T7F25KHZ_T 80 #define FPGA_PIN_T7F25KHZ_O 81 #define FPGA_PIN_T7F25KHZ_I 82 baycomusb-0.10.orig/fpga/sample_firmware.h0100644000175100017510000022417207325134422016665 0ustar abaaba/*****************************************************************************/ /* * sample_firmware.h -- HDLC packet radio modem for EPP using FPGA utility. * * Copyright (C) 1998 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ /* automatically generated, do not edit */ #define SAMPLE_FIRMWAREDATE "20001009" /* firmware */ static const unsigned char sample_firmware[] = { 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xfe, 0x7f, 0xde, 0xfd, 0xe5, 0xd7, 0x5f, 0x7e, 0xfd, 0xed, 0x37, 0xef, 0xfe, 0xf2, 0xee, 0xaf, 0xbf, 0xfe, 0xfa, 0xfb, 0x9b, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 0xfe, 0xff, 0xc6, 0x5f, 0x6f, 0xfd, 0xf5, 0xd6, 0x5f, 0x7f, 0x7d, 0xe3, 0xaf, 0x37, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0x9b, 0xff, 0x5f, 0xf5, 0xf5, 0xd5, 0x5f, 0x5f, 0xfd, 0xf5, 0xd7, 0xaf, 0xfa, 0xfa, 0xaa, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff, 0x6d, 0xbf, 0xdf, 0xfe, 0xfb, 0xed, 0xbf, 0xff, 0xfe, 0xb6, 0xdf, 0x6f, 0xfb, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbe, 0xfa, 0xf5, 0xd7, 0x5f, 0x7f, 0xf5, 0xf5, 0x57, 0x5e, 0x7f, 0x9b, 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0x7e, 0xff, 0xfd, 0xf7, 0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xd7, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0x7d, 0xef, 0xbf, 0xff, 0xbe, 0xfb, 0xef, 0xbf, 0xf7, 0xfe, 0xbf, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xfb, 0xbd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xee, 0x6f, 0xf4, 0xff, 0xed, 0xb7, 0xd7, 0x7e, 0xfb, 0xed, 0xb4, 0xdf, 0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0x5b, 0x6f, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xbd, 0xfd, 0xf7, 0xbf, 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xe6, 0xbf, 0xdf, 0x7f, 0x7f, 0x7d, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xfe, 0xbf, 0xee, 0xff, 0xfb, 0xef, 0xbf, 0xe7, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3, 0xef, 0x3f, 0xff, 0xfc, 0xfb, 0xcf, 0x7f, 0xbe, 0xf8, 0xe7, 0x9f, 0x77, 0xfe, 0xb9, 0xe7, 0xff, 0x6f, 0xfe, 0xff, 0xdc, 0xf7, 0xcf, 0x7f, 0xff, 0x7c, 0xf7, 0xdd, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xee, 0xfb, 0xef, 0xfe, 0x9b, 0xdd, 0xcf, 0x3f, 0xff, 0xbc, 0xf3, 0xcf, 0x3f, 0xff, 0xdc, 0xe7, 0x9b, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xdd, 0x66, 0xff, 0xbd, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xfe, 0xdf, 0xdf, 0xff, 0xfd, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xb9, 0xff, 0xfa, 0xfb, 0xef, 0xbd, 0xff, 0xbe, 0xfb, 0xef, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xf7, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0x5f, 0xff, 0x2f, 0xeb, 0xff, 0xb7, 0xdf, 0x7e, 0xfb, 0xad, 0xff, 0x9b, 0xff, 0x7f, 0xfe, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0x7f, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xfb, 0xef, 0xb6, 0xff, 0xfe, 0xff, 0xcf, 0xaf, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf3, 0xff, 0xbf, 0xff, 0x7f, 0xfb, 0xff, 0xef, 0xff, 0xdc, 0xdf, 0xcb, 0xec, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0x7f, 0xfd, 0xfd, 0xf7, 0xdf, 0x7f, 0xdf, 0xfd, 0xf7, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xfb, 0xff, 0xe6, 0xff, 0xbb, 0xf9, 0xf7, 0xff, 0x7f, 0xff, 0xfd, 0xee, 0xff, 0xfd, 0xff, 0x5f, 0xec, 0xff, 0xff, 0xfd, 0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0x69, 0xfe, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xbf, 0xff, 0xe6, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xbd, 0xff, 0xff, 0xdf, 0x7f, 0x7d, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfc, 0xff, 0xcf, 0xff, 0xff, 0xfa, 0xff, 0x6b, 0x7f, 0xf6, 0xff, 0xc7, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xf7, 0x7f, 0xfe, 0xff, 0xef, 0xff, 0xfb, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xff, 0x9a, 0xff, 0xb7, 0xf7, 0xdf, 0xff, 0xe7, 0xf7, 0xf7, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xfd, 0xff, 0xbf, 0xee, 0xea, 0xfb, 0xfb, 0xbf, 0xdc, 0xfe, 0xbf, 0xff, 0xdb, 0xfb, 0xef, 0xbf, 0xff, 0xf7, 0xbf, 0xf9, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0x9f, 0x7f, 0xbf, 0xdf, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x67, 0xfc, 0x3f, 0x7e, 0xff, 0xb3, 0xff, 0xdd, 0x7b, 0xfe, 0xf7, 0x9f, 0x7d, 0xfe, 0xff, 0xfb, 0xff, 0x7f, 0xff, 0xff, 0xbf, 0x9b, 0xff, 0xdf, 0xfe, 0x7f, 0xfa, 0xff, 0xff, 0xb5, 0xff, 0xfd, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0xdf, 0xcf, 0xbf, 0xeb, 0xfe, 0xff, 0xbf, 0x36, 0xb3, 0xea, 0xfb, 0x4f, 0xfd, 0xfc, 0xed, 0xff, 0xff, 0x7e, 0xff, 0xbf, 0xf9, 0xff, 0xdd, 0x7f, 0xbf, 0xdd, 0x6f, 0xfb, 0x6f, 0xbf, 0xfe, 0xaf, 0xb7, 0xff, 0xbf, 0x7f, 0xfd, 0xff, 0xc7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfe, 0xf3, 0xff, 0xff, 0xfe, 0xfa, 0xef, 0xff, 0x7f, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x1b, 0xfe, 0xef, 0xfc, 0xce, 0xeb, 0xeb, 0xef, 0xbf, 0xfb, 0xff, 0x9f, 0xfe, 0xff, 0xe7, 0x77, 0x3e, 0x52, 0xcf, 0xf3, 0x3f, 0x66, 0xff, 0xdb, 0xff, 0x95, 0xf7, 0xff, 0xfb, 0x6f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xd7, 0xf3, 0xfd, 0xb7, 0xf9, 0xff, 0x7e, 0xe9, 0x3f, 0xd6, 0xff, 0x3e, 0xfb, 0xff, 0xfd, 0xf9, 0xff, 0xd2, 0xff, 0xff, 0xb7, 0xae, 0xbf, 0xff, 0x6f, 0xd6, 0xbf, 0xff, 0xfe, 0xb3, 0xa9, 0xbf, 0xcf, 0xfe, 0xfb, 0xbf, 0xff, 0xbf, 0x75, 0xf6, 0xff, 0xef, 0xfa, 0xfb, 0x5f, 0x9b, 0xfb, 0xbf, 0xfd, 0xf4, 0xd7, 0xf9, 0xf6, 0xbd, 0x6f, 0x7e, 0x1d, 0xed, 0xdf, 0xef, 0xfd, 0xff, 0x57, 0xfe, 0xf3, 0xef, 0x66, 0xfe, 0x6f, 0xff, 0xda, 0x1b, 0xfe, 0xbd, 0xef, 0xbf, 0x6a, 0xdf, 0xba, 0xff, 0x7b, 0xfd, 0xfe, 0x97, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0xfb, 0x6b, 0xf5, 0xd7, 0xbe, 0xef, 0xeb, 0xef, 0xff, 0xf9, 0xef, 0xd7, 0x5f, 0xc7, 0xff, 0xff, 0xbf, 0xf9, 0x66, 0xe6, 0xff, 0xf6, 0x66, 0x3d, 0xbf, 0xff, 0xff, 0xdf, 0xeb, 0xbf, 0xae, 0xff, 0xb5, 0xdf, 0xea, 0xff, 0xfb, 0x6f, 0xbe, 0x9b, 0xf6, 0xff, 0xff, 0x6f, 0xb7, 0xfd, 0xfc, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xb7, 0xff, 0x7f, 0xfb, 0xfd, 0xff, 0xfb, 0xf7, 0xe6, 0xfd, 0xff, 0x7f, 0xfe, 0xdd, 0x6f, 0xfe, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x37, 0xff, 0x7a, 0xfb, 0xef, 0xbd, 0xb1, 0xff, 0xfb, 0x4f, 0x3f, 0xef, 0x5e, 0xbb, 0xed, 0xbf, 0xff, 0xfd, 0xb6, 0xd8, 0x6f, 0xff, 0xdd, 0x77, 0xdb, 0xfc, 0x66, 0xe6, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xdf, 0x6f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7e, 0xfb, 0xef, 0xff, 0xdf, 0xff, 0x3f, 0x9b, 0xfb, 0xff, 0xf7, 0xdb, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xa6, 0x5e, 0xfb, 0xfd, 0xfe, 0xfa, 0xff, 0xef, 0xff, 0xb5, 0xff, 0xdf, 0xf7, 0x7f, 0x7b, 0xed, 0xff, 0x3b, 0xff, 0xfd, 0xab, 0x79, 0xff, 0xee, 0xab, 0x7d, 0xfe, 0xeb, 0x6f, 0xab, 0x6e, 0xff, 0xff, 0xe7, 0x77, 0xff, 0xf5, 0xfb, 0x4f, 0xbf, 0x7f, 0x63, 0xfe, 0xbf, 0xff, 0xeb, 0xdf, 0xaf, 0xbf, 0xff, 0xff, 0xf9, 0xff, 0x3e, 0xff, 0xf7, 0xd6, 0xfd, 0x67, 0xf9, 0xf4, 0xfe, 0x9a, 0xff, 0xef, 0xaf, 0x0f, 0xff, 0xe8, 0xa0, 0x83, 0x3e, 0xfe, 0xfc, 0x67, 0x1f, 0x7f, 0xf4, 0xf9, 0x47, 0x1f, 0x79, 0xbe, 0xe6, 0xff, 0xef, 0x6b, 0xff, 0xf9, 0xfa, 0xcf, 0xbf, 0xff, 0xfd, 0xef, 0xb7, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xed, 0xf6, 0xbf, 0x6e, 0x7a, 0xed, 0x7f, 0xff, 0xff, 0xe7, 0xf7, 0x5f, 0x7f, 0xfd, 0xff, 0xff, 0xbf, 0x6f, 0xfe, 0xff, 0xbe, 0x77, 0xfe, 0xff, 0xa7, 0xad, 0xfb, 0xff, 0xef, 0x7e, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xf7, 0xfd, 0xf7, 0x9b, 0xff, 0xbf, 0xbd, 0x26, 0xd7, 0x7f, 0xf2, 0xc5, 0xf6, 0xf7, 0xff, 0xff, 0x7e, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xe6, 0xff, 0xdb, 0xef, 0xff, 0xb7, 0xf4, 0xd7, 0x6f, 0x3e, 0xf9, 0xc5, 0xff, 0xff, 0x7b, 0xbf, 0xff, 0xff, 0xff, 0xdd, 0xaf, 0xa9, 0xff, 0x8e, 0xb7, 0xfc, 0xfa, 0xeb, 0xaf, 0x9f, 0xfe, 0xf8, 0x96, 0x5f, 0x7e, 0xb9, 0xf5, 0xd7, 0x5f, 0x7d, 0xfd, 0x6b, 0xfe, 0xbf, 0xfb, 0xf7, 0xcf, 0xdf, 0xfb, 0xfc, 0xcc, 0xf7, 0x7e, 0xfa, 0xf1, 0xd7, 0x7f, 0xff, 0xfb, 0xdf, 0xf7, 0xff, 0x19, 0xff, 0xfb, 0x5f, 0x7f, 0xbd, 0xff, 0xea, 0xeb, 0x7f, 0xff, 0xd6, 0x57, 0xbf, 0xfd, 0xfe, 0xff, 0xf7, 0xb9, 0xff, 0x7f, 0xe6, 0xff, 0x7d, 0xff, 0xfc, 0xfe, 0xbf, 0xee, 0xff, 0xdf, 0x7f, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x6f, 0xcf, 0xa5, 0xe9, 0xff, 0x3c, 0xeb, 0xbf, 0x27, 0xfa, 0x78, 0xe2, 0xaf, 0xfd, 0xbb, 0xf7, 0x7f, 0x4f, 0x7f, 0xf5, 0x7d, 0xf7, 0xfe, 0x6f, 0xfe, 0xff, 0xff, 0xf7, 0xfd, 0xdf, 0xbf, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xd6, 0xff, 0xdf, 0x7f, 0xef, 0xfb, 0xaf, 0xff, 0x9b, 0xff, 0xff, 0x3f, 0xee, 0xf8, 0xff, 0xbf, 0xbe, 0xf6, 0x7f, 0x5f, 0x7f, 0xf7, 0xdf, 0xf1, 0xf7, 0x3f, 0xfb, 0xdd, 0xfe, 0xe6, 0xff, 0xbf, 0x7f, 0xbf, 0xff, 0xf7, 0xfb, 0xef, 0xf7, 0xc7, 0xf9, 0xd7, 0xff, 0x7f, 0x6d, 0xff, 0xd7, 0x1b, 0xf5, 0xaf, 0xf9, 0xff, 0xff, 0xbf, 0xbf, 0xff, 0x7f, 0x73, 0xdb, 0xff, 0xef, 0xfd, 0xef, 0xfb, 0xfb, 0xfd, 0xff, 0xff, 0xff, 0xf9, 0x6f, 0xfe, 0xfe, 0xff, 0x98, 0x73, 0xc7, 0x3f, 0xff, 0xf8, 0x23, 0xff, 0x76, 0x7e, 0xf9, 0xa7, 0xff, 0xed, 0xff, 0xff, 0xff, 0x9b, 0xfb, 0xff, 0xfd, 0xde, 0xec, 0x5b, 0x7f, 0x7b, 0xff, 0x77, 0x7f, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xa7, 0xff, 0xbf, 0xfa, 0xe3, 0xf7, 0xfa, 0xff, 0xff, 0xce, 0x3f, 0xea, 0xbc, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xe1, 0xff, 0xb7, 0x6f, 0xff, 0xfb, 0xfe, 0xda, 0xef, 0xff, 0x6f, 0xfd, 0xf4, 0x8b, 0x2d, 0x3f, 0xfd, 0xbf, 0xef, 0xff, 0x67, 0xfe, 0xff, 0xfb, 0xfb, 0xff, 0xbe, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x7f, 0xff, 0xf7, 0xdf, 0xff, 0xef, 0xff, 0xff, 0xff, 0x1b, 0xfe, 0x7f, 0xbf, 0xfb, 0x7e, 0xde, 0x7f, 0xe6, 0xfd, 0xf6, 0xff, 0xff, 0xfe, 0x93, 0xdf, 0x12, 0x52, 0xe7, 0xf5, 0x3f, 0x66, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xbf, 0xfc, 0xff, 0xf7, 0xf5, 0xff, 0xff, 0xfe, 0xeb, 0x75, 0xfe, 0xcb, 0xff, 0xb7, 0xf9, 0xff, 0xff, 0xdb, 0xa9, 0xff, 0x5f, 0x77, 0xdd, 0xaf, 0x67, 0xff, 0xb5, 0xff, 0xff, 0xfa, 0xf5, 0xfd, 0x5c, 0xff, 0x6f, 0xd6, 0xff, 0xff, 0x7c, 0xe2, 0xdf, 0xff, 0xdf, 0x77, 0xfa, 0xdd, 0x67, 0xfd, 0xff, 0xaf, 0x5f, 0x4f, 0xbf, 0xfd, 0x5f, 0x9b, 0xfb, 0xff, 0xff, 0xf2, 0xb2, 0xdd, 0x7f, 0xc6, 0x7d, 0xfe, 0xf6, 0xef, 0xff, 0xff, 0xb5, 0xd7, 0x6d, 0x92, 0xdf, 0xee, 0x66, 0xfe, 0xff, 0x3f, 0xbd, 0x78, 0xff, 0xff, 0xff, 0xef, 0xfb, 0xfd, 0x78, 0xff, 0x7e, 0xed, 0xd5, 0xda, 0x4f, 0xff, 0xb3, 0xb1, 0xff, 0x5f, 0xed, 0xad, 0xef, 0xf5, 0x7d, 0xf7, 0xa5, 0x7f, 0xed, 0x3f, 0xbe, 0x5f, 0xff, 0xbd, 0x75, 0xd4, 0xff, 0x66, 0xee, 0xff, 0xff, 0x13, 0xca, 0xff, 0xff, 0xbd, 0x37, 0xfb, 0xfc, 0xff, 0x9f, 0xff, 0xd7, 0xd8, 0x5f, 0xa1, 0xbe, 0xbf, 0x9b, 0xf7, 0xff, 0xff, 0xcf, 0xbf, 0xdd, 0xbc, 0xff, 0xee, 0xbf, 0xfd, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xff, 0xdf, 0xf6, 0xe6, 0xfd, 0xff, 0x7f, 0xe6, 0x9f, 0x7f, 0xfe, 0xff, 0xd7, 0xdf, 0xdf, 0xf8, 0xff, 0xff, 0xf7, 0xff, 0x7a, 0xfb, 0xed, 0xa5, 0xb1, 0xff, 0x7b, 0xed, 0xb5, 0xd5, 0xfc, 0xf7, 0xdd, 0xbb, 0xf9, 0xfd, 0xb6, 0xdf, 0x6e, 0xbe, 0xdd, 0xc7, 0xd8, 0xf7, 0x66, 0xe6, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x3f, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xf9, 0xe7, 0xff, 0xff, 0xff, 0x3f, 0x9b, 0xfb, 0xff, 0xef, 0xbf, 0xff, 0xfe, 0xbe, 0xef, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xef, 0xa6, 0xfe, 0xff, 0x65, 0xfd, 0xfd, 0xeb, 0xdf, 0x7f, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xab, 0xf5, 0x3b, 0x5e, 0xfb, 0xab, 0x79, 0xff, 0xff, 0x8f, 0xfe, 0xff, 0xfd, 0xef, 0xbf, 0x7f, 0xf7, 0xd5, 0xec, 0xbf, 0xcb, 0x7c, 0xf9, 0xcf, 0x7f, 0x7d, 0x6f, 0xfe, 0xff, 0xff, 0xfe, 0xef, 0xbf, 0xff, 0xef, 0xff, 0xff, 0x5f, 0xef, 0xff, 0xf7, 0xff, 0x7f, 0x7f, 0xdd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xcf, 0x3e, 0xfb, 0xd8, 0xf3, 0xcf, 0x3f, 0xff, 0xf4, 0xc7, 0x9f, 0x7d, 0xfc, 0xd1, 0x47, 0x9e, 0x7d, 0xfe, 0xe6, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xbf, 0xfc, 0xff, 0xbf, 0xff, 0xff, 0xf3, 0xc7, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xf7, 0xdf, 0x2f, 0x7f, 0xff, 0xed, 0xff, 0xdf, 0x7f, 0xfd, 0xff, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xf7, 0xfa, 0xeb, 0xff, 0xfd, 0xf7, 0xf7, 0xdb, 0xde, 0xfe, 0xff, 0xbd, 0xbf, 0xff, 0xfb, 0xed, 0xff, 0xe6, 0xff, 0xff, 0x6f, 0xbf, 0xf4, 0xef, 0xfe, 0x7f, 0x7f, 0xfd, 0xe8, 0x7f, 0xff, 0xff, 0xb7, 0xed, 0xff, 0xbf, 0xfe, 0xbf, 0xe9, 0xff, 0xaf, 0xbf, 0xde, 0xda, 0xe9, 0xaf, 0xbf, 0xfe, 0xf0, 0x96, 0x1f, 0x7e, 0xf9, 0xc5, 0xd6, 0x5f, 0x7e, 0xfd, 0x6b, 0xfe, 0xef, 0xff, 0xe0, 0xcf, 0xff, 0xfb, 0xf4, 0xb2, 0xfd, 0xf7, 0xf7, 0xdf, 0xe7, 0xbf, 0xdf, 0xf7, 0xe7, 0xde, 0xff, 0x1b, 0xbf, 0xfb, 0xaf, 0xff, 0xfa, 0xff, 0xbf, 0xff, 0xaa, 0xcf, 0xbf, 0xef, 0xff, 0xfd, 0xfb, 0xff, 0xfd, 0xef, 0xff, 0x7e, 0xe6, 0xff, 0xff, 0x5f, 0xfd, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xbf, 0x7f, 0x7b, 0xdd, 0xdf, 0xf7, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xf9, 0xff, 0xff, 0xef, 0xaf, 0xb7, 0xfe, 0x72, 0xef, 0x2f, 0x7f, 0xbf, 0xff, 0xd7, 0xff, 0xff, 0xdf, 0xf8, 0xd7, 0xff, 0x6b, 0xfe, 0xff, 0xff, 0xfe, 0xdf, 0x78, 0xbb, 0xfe, 0xfe, 0x6b, 0xfe, 0xfe, 0xdf, 0xf5, 0xff, 0xfd, 0xff, 0xd7, 0x6f, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xeb, 0xbf, 0x7b, 0xde, 0xfb, 0xcb, 0xfd, 0xff, 0xfc, 0xff, 0xcf, 0x39, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff, 0x9e, 0xff, 0xdd, 0xfb, 0xfd, 0x3d, 0xff, 0xff, 0xff, 0xdf, 0xf7, 0xe7, 0xe5, 0xf7, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xf6, 0xff, 0xbd, 0xb7, 0xef, 0xff, 0xdb, 0xfd, 0xff, 0xf7, 0xf7, 0xbe, 0xf6, 0x6f, 0xfe, 0x7f, 0xff, 0xff, 0xa1, 0xff, 0x3f, 0xfb, 0xfd, 0xf7, 0xff, 0x97, 0xef, 0xcf, 0xe1, 0x9b, 0xff, 0xff, 0xf1, 0xff, 0x9b, 0xff, 0x7f, 0xed, 0xff, 0xf7, 0xbf, 0xbf, 0x7f, 0xef, 0xd7, 0xfe, 0xff, 0xff, 0xff, 0xed, 0x67, 0xff, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xff, 0xbf, 0xef, 0xfd, 0xef, 0xf7, 0xaf, 0xbf, 0xde, 0x77, 0xdb, 0xfd, 0x7e, 0xfd, 0xf6, 0xfb, 0xfd, 0x9e, 0xab, 0xf1, 0xff, 0x7f, 0x6f, 0xff, 0xff, 0xf7, 0xfb, 0xef, 0xbf, 0xfb, 0xe9, 0xf7, 0xff, 0x7f, 0xff, 0xf5, 0xdf, 0xbf, 0xff, 0x67, 0xfe, 0xff, 0xdf, 0xfa, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xaf, 0x5f, 0x7f, 0xfe, 0xff, 0xdf, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xfe, 0xaf, 0xfe, 0xff, 0x5b, 0xae, 0x75, 0xfc, 0xf9, 0xff, 0xff, 0x72, 0xfc, 0xef, 0xe7, 0x7f, 0xf3, 0x4d, 0xfd, 0x3f, 0x66, 0xff, 0xdf, 0xff, 0xbf, 0xff, 0x7e, 0xde, 0x79, 0xff, 0xf7, 0x77, 0xf6, 0xff, 0xaf, 0xfd, 0xdf, 0x7f, 0x53, 0xff, 0xb7, 0xf9, 0xff, 0xfa, 0xff, 0xb9, 0xd7, 0x9a, 0x77, 0xde, 0xff, 0xd7, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0x2f, 0xf5, 0xd7, 0xfe, 0x6f, 0xd6, 0xff, 0xff, 0x3f, 0xf3, 0xe9, 0xf7, 0x9b, 0xef, 0xff, 0xd9, 0x7f, 0xff, 0xff, 0xcf, 0xff, 0x4f, 0xfd, 0xf1, 0x5f, 0x9b, 0xfb, 0xaf, 0xd9, 0xff, 0x93, 0x6d, 0x71, 0xdb, 0x7d, 0xb7, 0xd5, 0x6e, 0x7f, 0xed, 0xe7, 0xf7, 0xcc, 0xfb, 0xef, 0xef, 0x66, 0xfe, 0x7f, 0xf5, 0xbf, 0xf7, 0xde, 0xfd, 0xf7, 0xcb, 0x5f, 0xbd, 0x70, 0x4d, 0xfb, 0xfd, 0xdf, 0x5a, 0xef, 0xfb, 0xb3, 0xb1, 0xff, 0xfa, 0xff, 0xad, 0xb7, 0xb6, 0xfd, 0x76, 0xdd, 0x73, 0xfd, 0xf7, 0xd2, 0x6b, 0x63, 0xb7, 0xb7, 0xfd, 0xff, 0x66, 0xe6, 0xff, 0xf7, 0x3f, 0x7e, 0xf8, 0xfd, 0xfd, 0x77, 0xdc, 0x7d, 0x7f, 0xff, 0xb5, 0xde, 0xf9, 0x4b, 0xa7, 0xef, 0xbf, 0x9b, 0xf6, 0xff, 0xf3, 0xcf, 0xb7, 0xfd, 0xbc, 0xdb, 0xee, 0xfb, 0xfe, 0xfd, 0xe7, 0x7f, 0x6f, 0xbe, 0xf7, 0x96, 0xfb, 0xf7, 0x66, 0xfd, 0xff, 0xfd, 0xf7, 0xd9, 0x7f, 0xfe, 0xff, 0xdf, 0xdf, 0xff, 0xfa, 0xff, 0xff, 0xb7, 0xcf, 0x3e, 0xf3, 0xfe, 0xad, 0xb1, 0xff, 0xbb, 0xef, 0x3e, 0xda, 0xfe, 0xf7, 0xdf, 0x75, 0xdb, 0xdd, 0xf6, 0xdb, 0x7f, 0xde, 0xd1, 0xe7, 0xda, 0xeb, 0x64, 0xe6, 0xff, 0x7f, 0xff, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xdf, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe, 0x3b, 0x9b, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xfe, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xbf, 0xef, 0xa6, 0xfe, 0xff, 0xaf, 0xf7, 0xd6, 0xde, 0x9f, 0x7f, 0xfe, 0xfd, 0xf5, 0xd7, 0x7f, 0xeb, 0xf3, 0x8f, 0x3f, 0xfe, 0xfd, 0xab, 0x79, 0xff, 0xef, 0xcb, 0x67, 0xf6, 0xfa, 0xef, 0xbd, 0xff, 0xfe, 0xf7, 0xe5, 0x77, 0xff, 0xa4, 0xf3, 0xcf, 0x3f, 0x7f, 0x6f, 0xfe, 0xbf, 0x6e, 0xfa, 0xff, 0xaf, 0xff, 0xfd, 0xff, 0xff, 0x7d, 0x6f, 0xff, 0xf7, 0xdb, 0xfd, 0xee, 0xfd, 0x77, 0xff, 0x9b, 0xff, 0xaf, 0x8f, 0x3e, 0xff, 0xe8, 0xf3, 0xcf, 0x3d, 0xff, 0xdc, 0x67, 0x1f, 0x7f, 0xe6, 0xf9, 0xc7, 0x1e, 0x3b, 0xfe, 0xe6, 0xff, 0xeb, 0x2f, 0xfe, 0xff, 0xfb, 0xff, 0x7f, 0xfe, 0xf9, 0xf7, 0x37, 0x7f, 0xff, 0xef, 0xc5, 0x3f, 0xff, 0xab, 0xbf, 0xf9, 0xff, 0xfa, 0xeb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xf7, 0xff, 0x7f, 0xfd, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xf7, 0xdf, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xbd, 0xfc, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xd7, 0x7e, 0x7e, 0xef, 0xf7, 0xf7, 0xfe, 0x7b, 0xbf, 0xff, 0xe6, 0xff, 0xdb, 0xff, 0xbd, 0xfd, 0xe6, 0xfb, 0x6f, 0xbf, 0xff, 0xde, 0xff, 0xff, 0x7b, 0x33, 0xfd, 0xff, 0xff, 0xfd, 0xbf, 0xe9, 0xff, 0xae, 0xbf, 0xfe, 0xfa, 0xeb, 0x0d, 0x3d, 0xd4, 0xf2, 0x07, 0x1f, 0x7e, 0xf5, 0xf5, 0xd7, 0x5f, 0x7b, 0xfc, 0x6f, 0xfe, 0xbf, 0xf7, 0xff, 0x83, 0xce, 0xfa, 0xec, 0xb0, 0x5f, 0xff, 0xff, 0xff, 0xdf, 0x67, 0xbf, 0xee, 0xed, 0xff, 0xff, 0x1b, 0xff, 0xf7, 0xff, 0xf7, 0x7e, 0xff, 0xaf, 0xaf, 0xff, 0xfe, 0xfd, 0xef, 0xdf, 0xff, 0xef, 0xf5, 0xff, 0xdf, 0xbf, 0x7f, 0xe6, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xdf, 0xff, 0xbf, 0xfd, 0x7f, 0xbf, 0xfb, 0xef, 0xaf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0x7b, 0xaf, 0xef, 0xdf, 0xfe, 0x7b, 0xaf, 0xed, 0x77, 0xdd, 0xf5, 0xff, 0xff, 0x5f, 0x7d, 0xfd, 0xff, 0xff, 0x65, 0xfe, 0xbf, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xbf, 0xff, 0xaf, 0x7f, 0x7f, 0xdd, 0xff, 0xff, 0xef, 0xf6, 0xed, 0x7f, 0xfd, 0x9b, 0x7e, 0x9f, 0xff, 0xbd, 0xff, 0xfb, 0xed, 0x3f, 0xb6, 0xff, 0xf3, 0x3f, 0xff, 0xdf, 0x7e, 0xd7, 0xeb, 0xff, 0xf7, 0xff, 0xa6, 0x7f, 0x7f, 0xff, 0xff, 0xfd, 0xf7, 0xe9, 0x6f, 0xbf, 0xfa, 0xb5, 0xd7, 0xdf, 0x7d, 0xff, 0x31, 0xb7, 0xfb, 0xff, 0xb7, 0xf9, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xdf, 0xed, 0xff, 0xbf, 0xbf, 0xff, 0x5f, 0xd9, 0xff, 0x77, 0xbd, 0xff, 0xff, 0x6f, 0xfe, 0x7f, 0xff, 0xfc, 0xff, 0xf7, 0x1f, 0xde, 0xbf, 0xfa, 0xff, 0xff, 0xf7, 0xf9, 0xff, 0xff, 0xff, 0xb7, 0xcb, 0xff, 0x9b, 0xff, 0x7f, 0xbf, 0xdd, 0xff, 0xff, 0x7d, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0x7f, 0xee, 0xff, 0x7b, 0xff, 0xff, 0xbe, 0xdf, 0xa6, 0xfe, 0xcb, 0x2f, 0xfd, 0xd7, 0xbf, 0xef, 0xfc, 0xff, 0xbe, 0xb5, 0xd5, 0x7f, 0xf7, 0xbf, 0xf7, 0xfa, 0xff, 0xbf, 0xbb, 0xd1, 0x6f, 0xf3, 0xcf, 0xa3, 0xb7, 0xfc, 0xfb, 0xbf, 0xbf, 0xdf, 0xd5, 0xd7, 0xcf, 0xff, 0xff, 0xfd, 0xfe, 0xff, 0xff, 0x6e, 0xfe, 0x57, 0xdb, 0xfb, 0xff, 0xff, 0xbb, 0xfe, 0xff, 0xeb, 0xbf, 0xff, 0xfe, 0xf6, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xfe, 0xff, 0xa6, 0x9b, 0xef, 0x2b, 0xf5, 0xd7, 0x51, 0xff, 0x7f, 0xf3, 0xcf, 0xf7, 0xdd, 0xff, 0x59, 0xc9, 0xf3, 0x3f, 0x66, 0xff, 0xdf, 0xef, 0xfe, 0xfb, 0x6f, 0xfd, 0xf9, 0xd7, 0xff, 0x9f, 0xfc, 0xeb, 0x7f, 0xf7, 0xff, 0xda, 0xf3, 0xff, 0xb7, 0xf9, 0x9f, 0xfa, 0xdb, 0x75, 0xbf, 0x5e, 0x7f, 0xb9, 0x7f, 0xff, 0x2f, 0xf5, 0x7f, 0x5f, 0xff, 0xff, 0xdf, 0x3f, 0xfe, 0x6f, 0xd6, 0xb3, 0xfe, 0xf4, 0xd7, 0xff, 0xf7, 0x9f, 0xfe, 0xbf, 0xff, 0x7f, 0xfd, 0xfb, 0xfe, 0xff, 0xe7, 0xfd, 0xdb, 0x5f, 0x9b, 0xfb, 0xff, 0x95, 0xf5, 0x57, 0x69, 0x72, 0xdb, 0xfe, 0x77, 0xb5, 0xfe, 0x3f, 0x69, 0xb5, 0xd7, 0x7f, 0xb7, 0xfb, 0xef, 0x66, 0xfe, 0x7b, 0xe6, 0xfe, 0x7f, 0xdf, 0xff, 0xb7, 0xfe, 0x6f, 0xd7, 0xfa, 0x43, 0xff, 0xef, 0xf5, 0x5f, 0xef, 0xfe, 0xb3, 0xb1, 0xff, 0xda, 0x7b, 0xff, 0xaf, 0xfe, 0xfd, 0xea, 0xdf, 0x7f, 0xbb, 0xf4, 0x56, 0xdb, 0x7f, 0xfd, 0xff, 0xfd, 0xff, 0x66, 0xee, 0xff, 0xf6, 0xce, 0x3b, 0xf5, 0xfd, 0xfd, 0xfa, 0xdf, 0x7f, 0xed, 0x39, 0xb5, 0xf0, 0x5e, 0xeb, 0xef, 0x6f, 0xbe, 0x9b, 0xf7, 0xff, 0xff, 0xcd, 0xb7, 0xfd, 0xb6, 0xf3, 0x6f, 0xfb, 0xbf, 0xf5, 0xde, 0xfb, 0xff, 0xff, 0xf7, 0xb7, 0xdf, 0xf6, 0xe6, 0xfd, 0xff, 0x7d, 0xe6, 0x99, 0x7f, 0xff, 0xf9, 0xe7, 0xdf, 0xdf, 0xb8, 0xfb, 0xfd, 0x3f, 0xdf, 0xff, 0xfb, 0xff, 0xbd, 0xb1, 0xff, 0xfb, 0x8c, 0x37, 0xff, 0x3e, 0xf7, 0xef, 0x75, 0xef, 0xf9, 0x76, 0x9f, 0x6a, 0xff, 0xbd, 0xb6, 0xdd, 0xff, 0x66, 0xe6, 0xff, 0xef, 0xbf, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xf7, 0xf5, 0xff, 0xfe, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xbb, 0xff, 0xff, 0x7b, 0x7f, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xa6, 0xfe, 0x7b, 0xbf, 0xdc, 0xf2, 0xfa, 0x9f, 0xfd, 0xff, 0x79, 0x9f, 0x7f, 0xff, 0x7a, 0xed, 0xb7, 0xf6, 0xfe, 0xfc, 0xab, 0x79, 0xff, 0xee, 0x9f, 0x7d, 0xb2, 0xfa, 0xef, 0xdf, 0xf7, 0x76, 0xf3, 0xef, 0x37, 0xd9, 0xed, 0xd5, 0xd5, 0xbb, 0x7f, 0x6f, 0xfe, 0xbf, 0xfe, 0xf7, 0xbf, 0xae, 0xdf, 0xdb, 0xff, 0xdf, 0x5f, 0xbe, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xbd, 0xe5, 0xff, 0x9b, 0xff, 0xaf, 0xcf, 0x3f, 0xff, 0xec, 0xf3, 0xcf, 0x3f, 0xff, 0xd4, 0xe7, 0x1e, 0x7f, 0xf6, 0xd9, 0xe7, 0x1f, 0x7d, 0xfe, 0xe6, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xcf, 0x3f, 0xff, 0x7c, 0xff, 0xf7, 0xd7, 0xff, 0xfc, 0xbf, 0xf9, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x5f, 0xff, 0xfd, 0xfd, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0x7b, 0xff, 0xfd, 0xfd, 0xdf, 0xf3, 0xde, 0x7e, 0xef, 0xbf, 0xdf, 0x7e, 0xfb, 0xfb, 0xff, 0xe6, 0xff, 0xdb, 0x4f, 0xbf, 0xff, 0xf6, 0xd7, 0x6b, 0xbf, 0xfd, 0xff, 0x96, 0xff, 0x7f, 0xb9, 0xff, 0xbf, 0xfe, 0xff, 0xbf, 0xe9, 0xff, 0x8f, 0xba, 0xee, 0xfa, 0xe3, 0x2f, 0x37, 0xee, 0xe8, 0x97, 0x5f, 0x7b, 0xbd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0x6b, 0xfe, 0x3f, 0xfb, 0xc3, 0xcf, 0x07, 0xfe, 0x7f, 0xf2, 0xd9, 0x7f, 0xf6, 0xbe, 0xe7, 0x9b, 0xff, 0x77, 0xff, 0x67, 0xff, 0x1b, 0xff, 0xf7, 0xbf, 0x7e, 0xce, 0xcb, 0xfb, 0xbf, 0xf9, 0x7d, 0xef, 0xfd, 0x77, 0xd5, 0x3f, 0xff, 0xfd, 0xff, 0xfe, 0x5f, 0x66, 0xff, 0xff, 0xfb, 0xef, 0xfc, 0xff, 0xff, 0xbe, 0xdd, 0xf7, 0xfb, 0xff, 0xff, 0x7f, 0xfd, 0xff, 0xfb, 0xae, 0xff, 0xaf, 0xf9, 0xff, 0x7b, 0xef, 0xb9, 0xf7, 0xfa, 0xf8, 0xff, 0x4f, 0x5b, 0xff, 0xf9, 0x3f, 0xd7, 0xff, 0xef, 0xe7, 0xd7, 0xf6, 0x6f, 0xfe, 0xef, 0xff, 0xfe, 0xff, 0xef, 0xbb, 0xbf, 0xff, 0xff, 0x7f, 0xdd, 0xff, 0xff, 0xdf, 0xee, 0xff, 0xfe, 0xad, 0xff, 0x9b, 0xff, 0x6f, 0x7d, 0xbe, 0xfa, 0xef, 0xfd, 0x7b, 0xf4, 0x3f, 0xdf, 0x7d, 0xff, 0xef, 0xff, 0xdf, 0x7d, 0xf7, 0xff, 0xdf, 0xe6, 0xbf, 0xff, 0xaf, 0xfd, 0xff, 0xff, 0xff, 0xaf, 0xb3, 0xf9, 0xd9, 0xb7, 0xef, 0xff, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xbf, 0xff, 0x7f, 0x7c, 0xfd, 0xfd, 0xff, 0x3f, 0xe6, 0xf9, 0xfd, 0xe7, 0xfe, 0xff, 0xff, 0xef, 0xef, 0xff, 0xe7, 0x6e, 0x7e, 0x5f, 0xff, 0xe8, 0xa3, 0xcf, 0x3d, 0xff, 0xfe, 0xf3, 0x9f, 0x7e, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xfd, 0x7f, 0xff, 0xf9, 0xfb, 0xda, 0xbf, 0xbb, 0xfb, 0x7c, 0xe7, 0x6d, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xb7, 0xf7, 0xef, 0xe6, 0xff, 0x5f, 0xad, 0xd7, 0xdd, 0x77, 0xe1, 0xbd, 0xef, 0x7d, 0xef, 0xd6, 0x77, 0xfb, 0xbf, 0xf6, 0xfb, 0xfe, 0xf6, 0xbf, 0xf1, 0xf7, 0xfa, 0xef, 0xaf, 0xaf, 0xfe, 0xfa, 0xed, 0xfe, 0xfc, 0xff, 0xf5, 0xef, 0xff, 0x7b, 0xec, 0xf5, 0xff, 0xff, 0x67, 0xfe, 0xfd, 0xff, 0xfb, 0xff, 0xff, 0xfe, 0x7f, 0xfc, 0xff, 0xfe, 0xff, 0xd7, 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x1b, 0xfe, 0x7f, 0xfe, 0xf2, 0x6f, 0xfd, 0x6f, 0xe6, 0xf9, 0x4f, 0x5d, 0xff, 0xc8, 0xfb, 0xb7, 0xff, 0x78, 0xc9, 0xf3, 0xbf, 0x66, 0xff, 0xdf, 0x6f, 0xff, 0x9d, 0xff, 0xdb, 0xff, 0xff, 0xce, 0xdd, 0xbf, 0xff, 0x7f, 0xff, 0xff, 0xf2, 0xff, 0xf9, 0xb7, 0xf9, 0xff, 0xff, 0xef, 0xf5, 0xff, 0xff, 0x1e, 0x9f, 0xa9, 0xfe, 0x3d, 0xff, 0xbf, 0x4b, 0xff, 0xff, 0xd7, 0xbf, 0xeb, 0x6f, 0xd6, 0xff, 0xcf, 0x7e, 0xfa, 0xdf, 0xbf, 0xcf, 0xef, 0xeb, 0x9f, 0xcf, 0xff, 0xeb, 0xff, 0xff, 0x4f, 0xff, 0xeb, 0x5f, 0x9b, 0xfb, 0xff, 0xff, 0x66, 0x5a, 0x69, 0xef, 0xff, 0xfd, 0xdf, 0xff, 0xce, 0xb7, 0xfb, 0x37, 0xd3, 0x7e, 0xbb, 0xff, 0xef, 0x66, 0xfe, 0xff, 0xef, 0xbd, 0x66, 0xf2, 0xbb, 0xff, 0xd7, 0xf9, 0xcd, 0x59, 0xeb, 0x7f, 0xaf, 0xb4, 0xd7, 0xe4, 0xff, 0xb3, 0xb1, 0xff, 0xff, 0xeb, 0xaf, 0xbf, 0xda, 0xfe, 0xf7, 0xff, 0xd7, 0x27, 0xf4, 0xfa, 0x5a, 0x2f, 0xed, 0xf7, 0xbf, 0xff, 0x66, 0xe2, 0xff, 0xff, 0xdf, 0x6f, 0xaf, 0xaf, 0xff, 0x37, 0x9f, 0xdf, 0x62, 0xbd, 0xfe, 0xf8, 0x4a, 0x6b, 0xef, 0xef, 0x3e, 0x9a, 0xf7, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xfe, 0xf3, 0x6e, 0xbf, 0xfd, 0xed, 0xb7, 0xdb, 0xfe, 0xff, 0xf7, 0xb7, 0x5b, 0x76, 0xe6, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0x4f, 0xfd, 0xff, 0xf7, 0xd9, 0xcf, 0xfe, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xbd, 0xb1, 0x5f, 0xfb, 0xee, 0xbf, 0xff, 0x6e, 0xfb, 0xdd, 0xbe, 0xdb, 0xc5, 0x37, 0x9f, 0x77, 0xff, 0xfd, 0x76, 0xdf, 0xff, 0x62, 0xe6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xda, 0x6f, 0xff, 0xbf, 0xf3, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfe, 0x3f, 0x9b, 0x7b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xfe, 0xef, 0xfe, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0xe6, 0xfe, 0xeb, 0xed, 0xb5, 0xf7, 0xea, 0xeb, 0x7f, 0xfe, 0x71, 0xcf, 0xdf, 0xff, 0x7e, 0xaf, 0xb7, 0xd6, 0xfe, 0xfd, 0xbb, 0x61, 0xff, 0xf2, 0xbb, 0xef, 0xb6, 0xe8, 0xf3, 0xbf, 0x7f, 0xde, 0xf3, 0xef, 0xbf, 0x7f, 0xed, 0xf5, 0xdf, 0xbf, 0x7f, 0x6f, 0xfe, 0xbb, 0xfe, 0xfe, 0xfb, 0xaf, 0xb6, 0xfe, 0x6f, 0xcd, 0x7d, 0xad, 0xfd, 0xf7, 0xf7, 0x7d, 0xff, 0xfd, 0xdf, 0xff, 0x9b, 0xff, 0xae, 0x87, 0x2f, 0xfe, 0xe8, 0xa2, 0xc3, 0x3f, 0xfb, 0xf4, 0x67, 0x9f, 0x7d, 0xf6, 0xd9, 0x67, 0x9f, 0x7f, 0xfe, 0xe6, 0xbf, 0xcb, 0xbf, 0xff, 0xfe, 0xfa, 0xcb, 0x7f, 0xff, 0xf9, 0xff, 0x1f, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0x5f, 0xff, 0xbf, 0xe1, 0xff, 0xfa, 0xed, 0xb7, 0xbf, 0x7e, 0xfa, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xf5, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0x9c, 0xbb, 0xee, 0xbf, 0xab, 0x8c, 0xff, 0xef, 0x6f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xfd, 0xff, 0x1b, 0xfa, 0x3f, 0xc3, 0x06, 0xdb, 0x6b, 0x20, 0xcb, 0xf7, 0xdb, 0xf7, 0x7e, 0xfe, 0xf9, 0xbd, 0xdf, 0x7e, 0xfb, 0xfd, 0xff, 0xe6, 0xff, 0xfe, 0x6f, 0xaf, 0xfd, 0xff, 0xcb, 0x2f, 0xbd, 0x9d, 0xcd, 0x7f, 0xff, 0x5f, 0xfb, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0x2f, 0x3e, 0xe8, 0xe2, 0x8b, 0x27, 0xb7, 0xfe, 0xf2, 0x06, 0x5f, 0x7f, 0xf9, 0xe5, 0xd7, 0x5c, 0x7f, 0xfd, 0x6f, 0xfe, 0xdf, 0xfc, 0xec, 0x7b, 0xff, 0x7f, 0x6f, 0xf3, 0xf3, 0x5f, 0xfe, 0xff, 0xe7, 0x67, 0xff, 0xe7, 0xff, 0x67, 0xff, 0x1b, 0xff, 0x9d, 0xf6, 0xff, 0xff, 0xff, 0x77, 0xb6, 0x7f, 0xbf, 0xd5, 0xfe, 0xff, 0x6e, 0xbf, 0xff, 0xf7, 0x3b, 0xdf, 0x5f, 0xe6, 0xdf, 0xff, 0xff, 0xfb, 0xaf, 0xbf, 0x9d, 0xba, 0xe6, 0xf3, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfe, 0xbb, 0x6f, 0xff, 0xaf, 0xc9, 0x9f, 0x6e, 0xef, 0xc7, 0xf7, 0xfe, 0xfe, 0xd9, 0xff, 0xff, 0xff, 0xbe, 0xfe, 0x7f, 0xe7, 0xff, 0xf1, 0xd7, 0x7f, 0x6f, 0xfe, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xfa, 0xf7, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x7e, 0xf3, 0xdb, 0x99, 0xff, 0xff, 0x3b, 0xfe, 0xff, 0xfb, 0xbf, 0xdf, 0xbf, 0xdb, 0xfa, 0xee, 0xfb, 0x5f, 0x71, 0xff, 0x3e, 0xfd, 0xff, 0xf7, 0xe6, 0xff, 0xbf, 0x6f, 0xff, 0xff, 0xdf, 0xf7, 0xfd, 0x3d, 0xfd, 0xf4, 0xf7, 0xff, 0x7d, 0xf9, 0x7f, 0xff, 0xd7, 0xdb, 0x9f, 0xe9, 0xb7, 0xff, 0xf9, 0xfd, 0xfb, 0xf7, 0xff, 0xfd, 0xef, 0xff, 0x7f, 0xbd, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x6f, 0xf6, 0xef, 0xef, 0xfd, 0xff, 0xfb, 0x0e, 0xff, 0xff, 0x7f, 0xff, 0xb7, 0x7f, 0xce, 0xeb, 0xff, 0x7b, 0xbd, 0xd1, 0xff, 0x9b, 0xdf, 0xff, 0xf6, 0xfe, 0xdf, 0xff, 0xbf, 0xff, 0x73, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf9, 0xef, 0x9f, 0xf5, 0xff, 0xe6, 0xff, 0xef, 0xfe, 0xdd, 0xfa, 0xfb, 0xe5, 0x2e, 0xbb, 0xfe, 0xff, 0xfb, 0x7f, 0xb7, 0xdd, 0xff, 0xdb, 0x7f, 0xde, 0xb3, 0xf1, 0x77, 0xdb, 0xeb, 0x1b, 0x5f, 0xde, 0xfb, 0xeb, 0xff, 0xdf, 0xef, 0xf7, 0xdf, 0x7f, 0xfb, 0x7f, 0xf0, 0x4f, 0xfd, 0x6f, 0xf6, 0xb7, 0xfa, 0xff, 0xf7, 0xd5, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd5, 0x67, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0x1a, 0xfe, 0x65, 0xfe, 0x57, 0xeb, 0x6f, 0xfc, 0xb1, 0x5b, 0xef, 0xd7, 0xf9, 0xfc, 0xb7, 0xbc, 0xf7, 0xeb, 0xe3, 0xf7, 0x3f, 0x66, 0x7f, 0xfa, 0xf9, 0x97, 0x9f, 0xfe, 0xff, 0xb5, 0xfe, 0xfb, 0xb5, 0xfa, 0xfe, 0x4e, 0xff, 0x7d, 0xde, 0xeb, 0xff, 0xb7, 0xf9, 0xff, 0xee, 0xff, 0xe5, 0xfe, 0xce, 0xfe, 0xfb, 0xe9, 0x7f, 0x3d, 0xd5, 0xd7, 0xcb, 0x7f, 0x3f, 0xa7, 0x7c, 0xff, 0x6f, 0xd6, 0xbf, 0xff, 0xff, 0xef, 0xcf, 0xf7, 0xfe, 0x7b, 0xfa, 0x5f, 0x7f, 0xbd, 0xf5, 0xe6, 0xdf, 0xcf, 0x95, 0xf5, 0x5f, 0x9b, 0xfb, 0xef, 0xff, 0x77, 0x9b, 0x6d, 0xf3, 0x99, 0x57, 0xdb, 0xf7, 0xfe, 0xdf, 0x6f, 0xad, 0xf2, 0xff, 0xab, 0xdf, 0xee, 0x66, 0xfe, 0xbb, 0xbf, 0x8e, 0x57, 0xbe, 0xbc, 0xbf, 0xde, 0xfa, 0x8d, 0x7f, 0xff, 0x7b, 0xcb, 0xfc, 0x7f, 0xed, 0xbd, 0xb3, 0xb1, 0xff, 0xfe, 0xff, 0xeb, 0xf7, 0xfa, 0xef, 0xbb, 0xa8, 0x54, 0xff, 0xfd, 0xd7, 0x5f, 0x2e, 0xef, 0xf7, 0xda, 0xf6, 0x66, 0xe6, 0xbf, 0xff, 0xeb, 0x6f, 0xe1, 0xff, 0xff, 0x5b, 0x69, 0xdf, 0x7e, 0xff, 0xb5, 0xff, 0xca, 0xeb, 0xa5, 0xbc, 0x3f, 0x9b, 0xf6, 0xff, 0xff, 0xcd, 0x3f, 0xff, 0x7e, 0xf3, 0xcd, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf2, 0xdf, 0xd6, 0xe6, 0xfd, 0xff, 0x7f, 0xe6, 0xfb, 0xef, 0x9d, 0x79, 0xfc, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0xb7, 0xdf, 0x3f, 0xef, 0xcf, 0xa5, 0x91, 0x7f, 0xfb, 0x4d, 0xbf, 0xdf, 0x54, 0xe3, 0x8f, 0x3f, 0xfc, 0xe5, 0xf6, 0xdf, 0x6f, 0xdd, 0xbd, 0xe6, 0xda, 0xff, 0x62, 0xe6, 0xdb, 0x6f, 0xff, 0xbd, 0xf6, 0xff, 0x7f, 0xef, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xf9, 0xef, 0xbf, 0xf7, 0xfe, 0x3f, 0x9b, 0x7b, 0xfd, 0xf7, 0xbb, 0xaf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0xfd, 0xf5, 0xff, 0xef, 0xa6, 0xfe, 0xeb, 0x2f, 0xf6, 0xdf, 0xeb, 0x8b, 0x2f, 0xfc, 0xf1, 0xef, 0xdf, 0x7f, 0xeb, 0xf7, 0xb7, 0x1f, 0xff, 0xff, 0xab, 0x79, 0xff, 0xf2, 0x89, 0x7d, 0xbe, 0xc8, 0xe2, 0x89, 0x2f, 0xf6, 0xf3, 0xe7, 0x5f, 0xef, 0x7c, 0xd7, 0xce, 0x56, 0x7f, 0x6f, 0xee, 0xbf, 0xfe, 0x32, 0xff, 0xae, 0xb7, 0xfc, 0x6a, 0xff, 0xf7, 0xff, 0xbd, 0xf7, 0xfe, 0x7f, 0xaf, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xaf, 0x97, 0x1f, 0xff, 0xc8, 0xa1, 0x87, 0x3e, 0xf2, 0xfc, 0x67, 0x9f, 0x7d, 0x6e, 0xf2, 0xe7, 0x16, 0x7f, 0xfe, 0xe6, 0xff, 0xfb, 0xaf, 0xff, 0xf9, 0xf2, 0xeb, 0xaf, 0xff, 0xf9, 0xf7, 0xff, 0x7f, 0xff, 0xbf, 0xf6, 0xbf, 0x5f, 0xfe, 0xbf, 0x79, 0xff, 0xfa, 0xe9, 0xf7, 0xbf, 0x7e, 0xfa, 0xe9, 0xaf, 0x7f, 0xff, 0xf7, 0xdf, 0xef, 0x7f, 0xff, 0xef, 0xbf, 0xff, 0x6f, 0xfe, 0xbf, 0x1e, 0x7a, 0xfe, 0x2f, 0xa7, 0x9e, 0xfb, 0xff, 0x6f, 0xff, 0xff, 0xf7, 0xf3, 0x75, 0xdf, 0x5f, 0xf7, 0xff, 0x9b, 0xff, 0xaf, 0xbb, 0x06, 0xde, 0x6b, 0xe0, 0x81, 0xf6, 0xda, 0xf7, 0x7e, 0xff, 0xad, 0x3f, 0xf6, 0xf4, 0x53, 0xeb, 0xff, 0xe6, 0xff, 0xd7, 0x7f, 0xff, 0xdf, 0xff, 0x7f, 0xff, 0x7f, 0xf9, 0xeb, 0xaf, 0xfe, 0xff, 0xf9, 0xe5, 0xf6, 0x5f, 0xfe, 0xbf, 0xe9, 0xbe, 0xaf, 0xbf, 0xfa, 0xfa, 0xe3, 0xaf, 0x9d, 0xfe, 0xaa, 0x57, 0x5f, 0x7d, 0xf5, 0xd5, 0x16, 0x5d, 0x6e, 0xf9, 0x6b, 0xee, 0xff, 0xff, 0xbe, 0xff, 0xb6, 0xdf, 0xff, 0xb3, 0xef, 0x7f, 0xea, 0x3f, 0xff, 0xff, 0xf7, 0xf5, 0xdf, 0xfe, 0xfb, 0x1b, 0xbf, 0xf6, 0xfb, 0xe9, 0xb7, 0xbf, 0xfc, 0xba, 0x79, 0xff, 0xf5, 0xef, 0xbb, 0xff, 0xff, 0xbf, 0xfd, 0xf7, 0xaf, 0x7f, 0xe6, 0x7f, 0xff, 0xfc, 0xfb, 0xef, 0x5b, 0xff, 0xb6, 0xfb, 0x7e, 0xf7, 0xfb, 0xff, 0xff, 0x7f, 0x5f, 0xff, 0xed, 0xfd, 0xb7, 0xf9, 0xff, 0xfb, 0xef, 0x8d, 0xb7, 0xbe, 0xe8, 0xef, 0x7b, 0x7f, 0xf8, 0xf1, 0xfd, 0x5e, 0xa7, 0xbf, 0xf1, 0x5e, 0xff, 0x6b, 0xfa, 0xff, 0xff, 0xef, 0xf7, 0x66, 0xe3, 0xbf, 0xff, 0xfd, 0xdf, 0x5f, 0xd7, 0xff, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xef, 0xbf, 0xef, 0xfb, 0xbf, 0x2f, 0xbd, 0xfc, 0xff, 0xdb, 0xff, 0xef, 0xf9, 0xff, 0xff, 0x17, 0x7f, 0xfd, 0xff, 0xe6, 0xef, 0xfd, 0x7f, 0xff, 0xfd, 0xdf, 0xf2, 0x8f, 0xbf, 0xff, 0xee, 0xff, 0x9f, 0xf7, 0xf3, 0xff, 0xd7, 0x8b, 0xef, 0xbf, 0xe9, 0x7f, 0x7f, 0xfd, 0x77, 0xff, 0xef, 0x7b, 0xff, 0xbd, 0xe7, 0xf3, 0xdf, 0x5e, 0xf7, 0xf7, 0xaf, 0xff, 0xf7, 0xff, 0x6f, 0xfa, 0xbf, 0xff, 0xbf, 0x3f, 0xff, 0x7f, 0xfd, 0xfd, 0xff, 0x1f, 0xfb, 0xe6, 0xfa, 0x83, 0xbf, 0xf3, 0xe7, 0xbb, 0xff, 0x9b, 0xf7, 0xee, 0xfe, 0xff, 0x1f, 0xff, 0xdb, 0x7f, 0xff, 0xcf, 0xde, 0xf3, 0xfa, 0xfd, 0xdb, 0xeb, 0xff, 0xbb, 0xfb, 0xff, 0xa6, 0xfe, 0x6f, 0xbf, 0xfa, 0x7d, 0x7b, 0x5f, 0xf7, 0xdf, 0xff, 0xe5, 0xdf, 0x5f, 0x7f, 0x7d, 0xff, 0xd7, 0x7f, 0xff, 0xbb, 0xf1, 0xff, 0xb8, 0xed, 0xff, 0x7f, 0xd7, 0xfb, 0x1f, 0xbb, 0xff, 0xfd, 0x73, 0xdf, 0xff, 0x7f, 0xfd, 0xe7, 0xdd, 0xff, 0x67, 0xf6, 0xff, 0x7f, 0xec, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xef, 0x7f, 0xbd, 0xfd, 0xfb, 0xff, 0xfb, 0xff, 0xfd, 0xf9, 0xbf, 0x1a, 0xfe, 0x7f, 0xe5, 0xf1, 0xee, 0xcf, 0xff, 0xff, 0xf2, 0x3f, 0x7f, 0x73, 0xad, 0xf7, 0xfd, 0x7f, 0xf3, 0xfd, 0xff, 0xbf, 0x66, 0xff, 0xff, 0xf9, 0xbf, 0xfb, 0xfe, 0xff, 0xac, 0xbf, 0x5e, 0xdf, 0xda, 0x78, 0x7e, 0xbf, 0xee, 0x54, 0xf9, 0xff, 0xb7, 0xf9, 0xff, 0xff, 0x2b, 0xef, 0xff, 0x96, 0x7f, 0xaa, 0xef, 0xff, 0xef, 0xdf, 0xff, 0xde, 0x7e, 0x3f, 0x75, 0xbe, 0xf3, 0x6f, 0xd6, 0xff, 0xff, 0xfa, 0xfb, 0xef, 0xe7, 0xdf, 0x7a, 0xfb, 0xff, 0xcf, 0xbf, 0xff, 0x67, 0x7b, 0xe7, 0xff, 0xef, 0x5f, 0x9b, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xef, 0x85, 0x2e, 0xde, 0x9f, 0x7e, 0xdb, 0xcf, 0xbc, 0xfd, 0xea, 0xb6, 0xaf, 0xee, 0x66, 0xfe, 0xff, 0xff, 0xfe, 0xfe, 0x6e, 0xbd, 0xa6, 0x9e, 0xf7, 0xd7, 0x5f, 0xff, 0x2d, 0xeb, 0xdf, 0xd3, 0xef, 0xb5, 0xb3, 0xb1, 0xff, 0x7f, 0xeb, 0xb5, 0xff, 0x5e, 0xef, 0xeb, 0xab, 0xff, 0xf9, 0xdf, 0x7f, 0xd9, 0x2b, 0x7f, 0xf7, 0x75, 0xfe, 0x66, 0xe2, 0xff, 0x1f, 0xfa, 0xef, 0xef, 0xf7, 0xff, 0x5a, 0xfd, 0x7f, 0xfd, 0xaf, 0xbe, 0xb2, 0x7a, 0xf9, 0xf9, 0xb7, 0xbe, 0x9b, 0xf7, 0xff, 0xdb, 0xcf, 0xbf, 0xfd, 0x7b, 0xff, 0xf7, 0x3f, 0xbf, 0xff, 0xe2, 0xdb, 0x6e, 0xb9, 0xff, 0xfe, 0x6b, 0x77, 0xe6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x9f, 0xfd, 0xfc, 0xdf, 0xdf, 0x3c, 0xff, 0xf8, 0x37, 0x8f, 0x3c, 0xff, 0xec, 0xb5, 0xb1, 0x5f, 0x7b, 0xed, 0xb7, 0xd3, 0xfe, 0xa3, 0xef, 0xbf, 0xdb, 0xe9, 0xc7, 0x1b, 0x6b, 0xfd, 0xf9, 0xd7, 0x1f, 0xe7, 0x64, 0xe6, 0xdf, 0xff, 0xbf, 0xfd, 0xf7, 0xff, 0xff, 0xdf, 0xfd, 0xf6, 0xbf, 0x6f, 0xde, 0xff, 0xff, 0xfd, 0xff, 0x3f, 0x3f, 0x9b, 0xfb, 0xfb, 0xff, 0xdf, 0xff, 0xfe, 0xff, 0xff, 0xeb, 0x7f, 0x7f, 0xfd, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xde, 0xeb, 0xaf, 0xff, 0xf6, 0xff, 0xdf, 0xff, 0xf5, 0xfe, 0x9f, 0x17, 0xfe, 0xf8, 0xf3, 0xa6, 0x77, 0xde, 0xfa, 0xbb, 0x61, 0xf7, 0xf2, 0xcb, 0xbd, 0xba, 0xfd, 0xe7, 0xbf, 0xad, 0xd6, 0xf3, 0xc5, 0x36, 0xff, 0xfd, 0xf1, 0xcc, 0x33, 0x7f, 0x6f, 0xfa, 0xb7, 0xde, 0x7a, 0xeb, 0xf4, 0xfb, 0xff, 0xff, 0xfb, 0x7e, 0x7e, 0xf5, 0xde, 0x9f, 0x5f, 0x77, 0xff, 0xff, 0xff, 0x9b, 0xfe, 0xaf, 0x87, 0x1e, 0xff, 0xf8, 0xe3, 0xc7, 0x3f, 0xfa, 0xd4, 0x47, 0x8f, 0x3f, 0xfc, 0xd1, 0xcf, 0xb6, 0x7f, 0xfe, 0xe6, 0xbf, 0xcb, 0x6f, 0xfe, 0xfe, 0xf7, 0xdf, 0x2f, 0xbe, 0xff, 0xf7, 0x97, 0xef, 0x7f, 0xff, 0xf7, 0xff, 0xdf, 0xfe, 0xbf, 0xe1, 0x6f, 0xf2, 0xe9, 0xb7, 0xff, 0x7f, 0xf7, 0xe9, 0xff, 0xff, 0xff, 0xf5, 0xf6, 0xcf, 0xff, 0xfd, 0xff, 0xb7, 0xff, 0x6f, 0xfe, 0xbb, 0x9f, 0x7a, 0xee, 0x7f, 0xef, 0x9f, 0xfa, 0xef, 0x4f, 0xff, 0xf9, 0xff, 0xde, 0x57, 0xdf, 0x5f, 0xfd, 0xff, 0x1b, 0xfa, 0x2f, 0x83, 0x0c, 0xdb, 0xdf, 0xf0, 0x81, 0xf6, 0xdf, 0xd3, 0x5e, 0xeb, 0xaf, 0x3e, 0xd5, 0xfc, 0x73, 0xef, 0xff, 0xe6, 0xdf, 0xff, 0xff, 0xbf, 0xf5, 0xff, 0xdb, 0x6f, 0xb7, 0xff, 0xeb, 0xf7, 0xdf, 0x7e, 0xfb, 0xff, 0x27, 0xff, 0xff, 0xbf, 0xd9, 0xff, 0x8f, 0xbf, 0xfe, 0xea, 0x6b, 0xad, 0xbf, 0xde, 0xba, 0xd7, 0x5b, 0x7e, 0xfd, 0xf5, 0xd7, 0x5b, 0x7f, 0xed, 0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x83, 0xbb, 0xab, 0xb9, 0xdc, 0xff, 0x7f, 0xff, 0xf9, 0xf9, 0x07, 0x7f, 0xb7, 0xf5, 0x67, 0xff, 0x1b, 0xff, 0x77, 0xfe, 0x6f, 0xfe, 0xfe, 0xee, 0xf7, 0xff, 0x3f, 0xff, 0xdd, 0xed, 0x6f, 0xed, 0xff, 0xfb, 0x3f, 0xdf, 0x5f, 0xa6, 0xeb, 0xff, 0xff, 0xf7, 0xd4, 0xdd, 0x5f, 0xff, 0xfc, 0xff, 0x97, 0xab, 0xfe, 0xff, 0xf6, 0xfa, 0xdb, 0xbb, 0xff, 0xbf, 0xf9, 0xf7, 0xfe, 0xef, 0xaf, 0x3f, 0xfe, 0xff, 0xca, 0xbe, 0x7f, 0xfd, 0xef, 0xfe, 0x5b, 0xff, 0xbb, 0xf7, 0xc3, 0xff, 0x67, 0xfe, 0xff, 0xce, 0x7d, 0xda, 0xde, 0xff, 0x4f, 0xfb, 0xf7, 0x5b, 0xff, 0x77, 0x7f, 0xd7, 0xf7, 0xff, 0xdf, 0xfb, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfc, 0xef, 0xef, 0xbe, 0xbf, 0xfe, 0x5b, 0xd9, 0x3b, 0xbf, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xfd, 0xff, 0xe6, 0xef, 0x7f, 0xff, 0xff, 0xdf, 0xf7, 0xfd, 0xcf, 0xfd, 0xff, 0xea, 0xf3, 0xd7, 0xf9, 0xff, 0xff, 0xff, 0x1d, 0xff, 0xbf, 0xe9, 0xdf, 0xf7, 0xdf, 0xfe, 0xde, 0xfd, 0x77, 0xef, 0x7e, 0xb7, 0xef, 0xf7, 0xf7, 0xff, 0xfd, 0x6f, 0xdf, 0x7e, 0xfa, 0x6e, 0xfe, 0xff, 0xff, 0x7f, 0xd7, 0xff, 0xfd, 0xe1, 0xfc, 0xfe, 0x9f, 0xff, 0xff, 0x7f, 0xff, 0x1b, 0xf5, 0xff, 0xfe, 0xbb, 0x9b, 0xdb, 0xfe, 0xf7, 0xfb, 0xfd, 0xff, 0xff, 0xbf, 0xfd, 0xff, 0xd7, 0xff, 0xf7, 0xff, 0xff, 0xbd, 0xfb, 0xf9, 0xff, 0xff, 0xe6, 0xff, 0xcb, 0x37, 0xff, 0xee, 0xf3, 0xcb, 0x24, 0xdf, 0xdd, 0xd7, 0xbe, 0x7b, 0xef, 0x77, 0x57, 0x5f, 0xff, 0xfd, 0xbb, 0xf1, 0xff, 0xfb, 0xe7, 0xb1, 0xff, 0xbe, 0xdf, 0x6f, 0xff, 0xfd, 0xfc, 0x7e, 0xef, 0xff, 0xfb, 0xe1, 0xf3, 0x7f, 0xff, 0x6e, 0xf6, 0xff, 0x7e, 0xbd, 0xf3, 0xaf, 0xfc, 0xef, 0xeb, 0xff, 0xbd, 0xff, 0xff, 0xbf, 0xff, 0x5f, 0xf7, 0xf5, 0x5f, 0xff, 0x9b, 0xfe, 0x67, 0xe2, 0xcb, 0x3f, 0xbf, 0x7e, 0xf8, 0xfd, 0xcf, 0x3e, 0xf5, 0xdb, 0x7f, 0xef, 0x7f, 0xf3, 0xed, 0xdf, 0xff, 0x86, 0xff, 0xff, 0xff, 0xd7, 0xfc, 0xfb, 0xff, 0xf9, 0xfe, 0x96, 0xdd, 0xff, 0xff, 0xcd, 0xf3, 0xbf, 0xdf, 0xff, 0xfc, 0xaf, 0xd9, 0xff, 0xff, 0xff, 0xf9, 0xfd, 0xff, 0x7f, 0x7d, 0xff, 0x67, 0xff, 0xfd, 0x7f, 0xeb, 0xff, 0xef, 0xff, 0x7f, 0xff, 0x6d, 0xfe, 0xff, 0x9e, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x67, 0xea, 0xff, 0xcd, 0xf9, 0xff, 0x3f, 0x53, 0x7a, 0xfd, 0xff, 0xdf, 0x9b, 0xf5, 0xbf, 0xf3, 0xfe, 0xfd, 0xff, 0xbc, 0x77, 0xcb, 0x7c, 0xff, 0x19, 0xff, 0xff, 0xfb, 0x44, 0xdb, 0xff, 0xff, 0x57, 0x66, 0xfe, 0x7b, 0xef, 0xfd, 0x5c, 0x9a, 0x79, 0xfb, 0xfd, 0xb7, 0xbd, 0x5f, 0x4e, 0xfb, 0xf7, 0xbf, 0xfd, 0x4c, 0xff, 0xbb, 0xb9, 0xff, 0xde, 0x7b, 0xff, 0x9a, 0x57, 0xde, 0x9b, 0x35, 0x7d, 0xf7, 0xa5, 0xd0, 0xfe, 0xff, 0xf7, 0xb7, 0x57, 0xff, 0x6c, 0xee, 0xbf, 0xfe, 0xfa, 0xef, 0xad, 0xbf, 0xfe, 0xff, 0xdb, 0xdf, 0xad, 0xbb, 0xf5, 0xff, 0x5b, 0x7d, 0xff, 0xf5, 0xba, 0x99, 0xfb, 0xaf, 0xbf, 0xfe, 0x3f, 0xfa, 0xaf, 0xff, 0x5b, 0xfa, 0xf7, 0xca, 0x0f, 0xed, 0x6f, 0x94, 0x5f, 0x7f, 0xfd, 0x0f, 0xe6, 0xbd, 0xfd, 0xf6, 0xdb, 0xfd, 0xff, 0xff, 0x7f, 0xdb, 0x6f, 0xef, 0xff, 0xed, 0xff, 0xdf, 0x7f, 0xfb, 0xed, 0xff, 0xbd, 0x79, 0x9f, 0x7f, 0xff, 0x7d, 0xf6, 0xff, 0xff, 0xbf, 0xfd, 0xf4, 0xe3, 0x9f, 0xfc, 0xff, 0xbf, 0xb7, 0xbf, 0xfe, 0x7f, 0x6f, 0xec, 0xff, 0xee, 0x7b, 0x8c, 0xbb, 0xff, 0x7e, 0xb3, 0x8f, 0x73, 0xfc, 0xf1, 0xf7, 0xdb, 0x7f, 0xf5, 0xdd, 0xf7, 0x3a, 0x99, 0xf9, 0xff, 0xff, 0x7f, 0xef, 0xff, 0xff, 0xdb, 0xff, 0xaf, 0x7d, 0xff, 0xfd, 0xdf, 0xfe, 0xfb, 0xff, 0xfd, 0xff, 0xce, 0xe6, 0xfe, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xbb, 0xa9, 0xff, 0xfa, 0xeb, 0xbf, 0xfc, 0xfe, 0x7b, 0x1f, 0x6f, 0xff, 0xe3, 0xed, 0xdf, 0xfe, 0xff, 0xf7, 0xf7, 0xfe, 0xff, 0x6e, 0xde, 0xbd, 0xfa, 0xea, 0x9f, 0xed, 0xb6, 0xfb, 0xe7, 0xbb, 0xdf, 0xec, 0xf5, 0xd7, 0xbf, 0xfb, 0xec, 0xf5, 0xff, 0xdf, 0x9b, 0xff, 0xbf, 0xff, 0x5e, 0xbf, 0xef, 0xbf, 0xdf, 0xfd, 0xff, 0xbd, 0xdd, 0xf7, 0xdd, 0xfe, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xef, 0xb0, 0xc3, 0x3d, 0x3e, 0xf8, 0xf4, 0xcf, 0x3f, 0xfd, 0xd9, 0x67, 0x9f, 0x7f, 0xfe, 0xd9, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfe, 0xfb, 0x9b, 0xbf, 0xff, 0xf3, 0xfd, 0xdf, 0xdf, 0xff, 0xfb, 0xfd, 0x3f, 0xff, 0x6f, 0xfe, 0xff, 0x6f, 0xbe, 0xfd, 0xbf, 0xd7, 0x6e, 0xff, 0xef, 0xdf, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xe7, 0x9f, 0xff, 0xef, 0xba, 0xc7, 0xff, 0xfa, 0xfb, 0xff, 0xff, 0xfd, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xff, 0x86, 0xff, 0x6f, 0xf2, 0xc9, 0xf7, 0x5b, 0x6c, 0xfe, 0xbd, 0xf6, 0xbd, 0xd7, 0x7e, 0xfb, 0xff, 0xb7, 0xf7, 0xfe, 0xfe, 0xb7, 0xf9, 0x9f, 0xf2, 0x8b, 0x6f, 0xbf, 0xbc, 0xf2, 0xda, 0x2d, 0x7f, 0xe9, 0xe5, 0x7f, 0xff, 0xcf, 0xff, 0xe9, 0xff, 0xff, 0x6f, 0x7a, 0xff, 0xeb, 0xaf, 0xbb, 0xfe, 0xea, 0xab, 0xaf, 0xbf, 0xca, 0xf5, 0x57, 0x4f, 0x7d, 0xfd, 0x55, 0xd7, 0x1e, 0xfd, 0x9b, 0xad, 0xd7, 0x7a, 0xeb, 0xbe, 0xf5, 0xdf, 0x3f, 0xed, 0xe1, 0xff, 0x3b, 0xfc, 0xe9, 0xe7, 0x3b, 0xfb, 0xff, 0xfb, 0xff, 0xe6, 0xf7, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xe6, 0xee, 0xee, 0xef, 0xdf, 0x5f, 0xff, 0xf4, 0x7d, 0xff, 0xd5, 0xbf, 0x97, 0xe9, 0xff, 0xff, 0xfd, 0xf7, 0xfc, 0x75, 0xdf, 0x7f, 0xeb, 0xff, 0xdf, 0xbd, 0xff, 0xf1, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0x6f, 0xdc, 0xfe, 0xde, 0xeb, 0xeb, 0xaf, 0xbf, 0xc8, 0xf3, 0x8f, 0xf9, 0x77, 0xf9, 0xff, 0x9f, 0x53, 0x7f, 0xfc, 0xbf, 0x7f, 0x19, 0xf7, 0xff, 0xef, 0xbf, 0xfb, 0xd5, 0x5f, 0xef, 0xbb, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0x7f, 0xdf, 0xaf, 0xff, 0xf7, 0xff, 0xe6, 0xfd, 0xeb, 0x2f, 0xbf, 0xed, 0xd9, 0xa7, 0xaf, 0xbb, 0xff, 0x7e, 0xf6, 0xfd, 0x3f, 0xff, 0xb0, 0xff, 0xef, 0xff, 0xaf, 0xf1, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xde, 0xf3, 0xfd, 0xf7, 0xbb, 0xff, 0xd7, 0xff, 0xfd, 0xdf, 0xef, 0xff, 0xff, 0x6f, 0xec, 0xe7, 0xdd, 0x77, 0xef, 0xfd, 0xbb, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0x1b, 0xbf, 0xcf, 0x5f, 0xef, 0xbf, 0x7f, 0xff, 0xf7, 0xef, 0x7f, 0xc7, 0xbf, 0xb7, 0xff, 0xfb, 0x71, 0xff, 0xfe, 0xff, 0xff, 0xe6, 0xfe, 0xdb, 0x7e, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0xb7, 0xcf, 0xdb, 0xff, 0xfb, 0xfd, 0xfd, 0xff, 0xef, 0xff, 0xbf, 0xf9, 0xff, 0x53, 0xff, 0xfe, 0xff, 0xbf, 0xbb, 0xab, 0xff, 0xff, 0xfd, 0xe7, 0xfc, 0x5b, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x6e, 0xfe, 0x7b, 0xfb, 0xdf, 0x69, 0xff, 0x7f, 0xdf, 0xfb, 0xef, 0xfb, 0xda, 0xf5, 0xff, 0xdf, 0xff, 0xfa, 0xff, 0xff, 0x7f, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xfd, 0xf7, 0x9f, 0xff, 0xd7, 0xfb, 0x7f, 0xef, 0xff, 0xff, 0xef, 0x86, 0xff, 0xef, 0xf9, 0xe7, 0xfc, 0x7b, 0xf9, 0xff, 0xd7, 0xf9, 0x9f, 0x3f, 0x7e, 0x7f, 0xf7, 0xb7, 0xff, 0xf3, 0xff, 0x8f, 0xd9, 0xff, 0xfe, 0xff, 0xec, 0xbf, 0x9f, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xf7, 0xd9, 0x7e, 0x9f, 0xff, 0xfa, 0xff, 0x6d, 0xfe, 0xff, 0xfc, 0x7e, 0xce, 0xef, 0xbf, 0xff, 0xfa, 0xbf, 0x55, 0xff, 0xf7, 0xff, 0xb7, 0xd2, 0x4e, 0xe9, 0xff, 0xff, 0x9b, 0xf5, 0xcf, 0xb6, 0xcf, 0xe8, 0xef, 0xef, 0xbf, 0xfe, 0x7d, 0xd6, 0xbf, 0xe7, 0xff, 0xf9, 0x8f, 0x1f, 0xfd, 0xff, 0xd7, 0xe6, 0xfe, 0x7b, 0x3b, 0xbd, 0x5c, 0xbf, 0x7d, 0xbf, 0xd9, 0xff, 0xbf, 0xff, 0x7f, 0x3b, 0xe3, 0x3d, 0xbb, 0xfe, 0xff, 0xbb, 0x99, 0xff, 0xd3, 0xaf, 0x2f, 0xbe, 0xfe, 0xef, 0x7b, 0xf5, 0xff, 0xef, 0xff, 0xf7, 0xc4, 0x7b, 0xeb, 0xbf, 0xff, 0xff, 0x6c, 0xec, 0xbf, 0xdf, 0xfa, 0x6b, 0xac, 0xff, 0xfb, 0xfb, 0x7f, 0x55, 0xff, 0x9f, 0xf5, 0xf7, 0xda, 0x7e, 0xbd, 0xff, 0xbf, 0x99, 0xf8, 0x3f, 0x85, 0xf8, 0x32, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xd7, 0xfe, 0x66, 0xfd, 0xbd, 0xf5, 0x5f, 0xcf, 0xff, 0xef, 0xe6, 0xfd, 0xff, 0xfc, 0xfb, 0x6f, 0xff, 0xff, 0xf6, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x9b, 0x7f, 0xbb, 0xe5, 0xff, 0xbd, 0x79, 0xff, 0x67, 0x1e, 0xf7, 0xf7, 0xfb, 0x7f, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xfe, 0xff, 0xf8, 0xe7, 0xcf, 0xfc, 0x7f, 0x6f, 0xec, 0xff, 0x7e, 0xd3, 0xef, 0xb4, 0xdf, 0x3e, 0xfb, 0xed, 0x7f, 0xaf, 0x3d, 0xf6, 0x9f, 0x7f, 0xfc, 0xf9, 0xf7, 0xbf, 0x99, 0xf9, 0xf7, 0xdb, 0xff, 0xff, 0xfd, 0xfb, 0xdb, 0x3f, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xde, 0x7f, 0xef, 0xff, 0xff, 0xcf, 0xe6, 0xbe, 0xff, 0xfd, 0xfe, 0xef, 0xff, 0xff, 0xfd, 0xfb, 0xff, 0x7f, 0xff, 0xfb, 0xf7, 0xf7, 0x7f, 0x7f, 0xff, 0xff, 0xbb, 0xa9, 0xff, 0xc7, 0xbf, 0x7f, 0xbe, 0xff, 0xfb, 0xef, 0x3f, 0xff, 0xed, 0xff, 0xdf, 0x7f, 0x6b, 0xf3, 0xd7, 0xff, 0xff, 0x6a, 0xde, 0xff, 0xe8, 0xeb, 0xef, 0xbf, 0xfa, 0xfb, 0xea, 0xdf, 0x7f, 0xbd, 0xbb, 0xd5, 0x3b, 0xdf, 0xfd, 0xf3, 0xff, 0xdf, 0x9b, 0xff, 0x7f, 0xb7, 0x7e, 0xff, 0xfb, 0xef, 0xff, 0xce, 0xff, 0xdf, 0xfb, 0xff, 0xfd, 0xff, 0xbf, 0xff, 0xe7, 0xff, 0xff, 0xe6, 0xff, 0xef, 0x63, 0xc3, 0x3d, 0x3b, 0xe8, 0xa0, 0xcf, 0x3f, 0xf7, 0xf9, 0x47, 0x9f, 0x7f, 0xfe, 0xb9, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xfe, 0xcb, 0xaf, 0xff, 0xfe, 0xfb, 0xff, 0x7f, 0xfe, 0xfd, 0xcf, 0xff, 0xff, 0xff, 0xfd, 0xcf, 0xff, 0xff, 0x6f, 0xfe, 0xdf, 0x7e, 0xb3, 0xe9, 0xef, 0x9b, 0x5e, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xef, 0x9f, 0xff, 0xef, 0xe9, 0xeb, 0xff, 0xff, 0xdb, 0xdf, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x6f, 0xe3, 0xc9, 0xfe, 0x9e, 0x7c, 0xe1, 0xfd, 0xfd, 0xb7, 0xbf, 0xdf, 0xfb, 0xef, 0xb5, 0xff, 0xfe, 0xfe, 0xbf, 0xf9, 0xff, 0xff, 0xdf, 0xef, 0x7f, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0x9f, 0x7e, 0xfa, 0xff, 0x7f, 0xfb, 0x6f, 0xfa, 0xff, 0xeb, 0xaf, 0x9f, 0xfa, 0x6a, 0xe3, 0x8f, 0xbe, 0xee, 0xf5, 0xd7, 0x5e, 0x7d, 0xdd, 0xd5, 0xd7, 0x5f, 0xff, 0x9a, 0xfd, 0xbf, 0xbf, 0xef, 0xf1, 0x7f, 0xfd, 0xff, 0xfb, 0xf3, 0xff, 0x7f, 0xfe, 0xd7, 0x73, 0x7f, 0x7f, 0xfe, 0xff, 0xff, 0xc6, 0xff, 0xff, 0xfb, 0x6f, 0xff, 0xf7, 0xff, 0xf7, 0xbf, 0xb6, 0xff, 0xf7, 0xff, 0xdf, 0xfd, 0xff, 0xd7, 0xff, 0xff, 0x9f, 0xf9, 0xff, 0xfd, 0xff, 0xbf, 0xff, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xbb, 0xff, 0xff, 0xfd, 0xbf, 0xef, 0xff, 0xff, 0x6b, 0xfe, 0xbf, 0xde, 0xda, 0xdb, 0x8f, 0xaf, 0xfd, 0xf4, 0xeb, 0xfc, 0x67, 0xff, 0xb7, 0xdf, 0x7b, 0xff, 0x7f, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xab, 0xfd, 0xbb, 0xfa, 0xb7, 0xee, 0xff, 0xf7, 0xfd, 0x7e, 0xff, 0xff, 0xfb, 0x7f, 0xef, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0x1f, 0xf6, 0xde, 0xdf, 0xe7, 0xbc, 0xb7, 0xf5, 0x72, 0xff, 0xcb, 0xdb, 0xff, 0xfd, 0xdb, 0xff, 0xff, 0xbf, 0xc9, 0xff, 0xff, 0xff, 0x8f, 0xef, 0xfd, 0xfe, 0x7f, 0xff, 0x7f, 0xfb, 0x6f, 0xd7, 0xef, 0xee, 0xef, 0xcf, 0xff, 0xff, 0x6d, 0xfe, 0xff, 0xf7, 0xff, 0x7f, 0xfd, 0xbf, 0xbf, 0xe7, 0xbf, 0xcf, 0xff, 0xff, 0xff, 0xfb, 0xfe, 0xef, 0xdb, 0xfe, 0xbe, 0x9b, 0xff, 0xfd, 0x5a, 0xff, 0xff, 0xe1, 0xe3, 0xcf, 0xef, 0xa6, 0xfe, 0xdd, 0xf7, 0xfb, 0xdf, 0xff, 0xfc, 0x79, 0xfe, 0xff, 0xa6, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xf7, 0xfb, 0xff, 0xb7, 0xdb, 0xff, 0xf7, 0xff, 0xff, 0x7f, 0xff, 0xff, 0x9f, 0xff, 0xbf, 0xf9, 0xbf, 0x77, 0xfd, 0x75, 0xff, 0xfe, 0xfb, 0xfd, 0xbf, 0xff, 0xd3, 0x6f, 0xff, 0xff, 0xde, 0xfb, 0xef, 0xdf, 0xff, 0x6f, 0xfc, 0xff, 0xd7, 0xff, 0xef, 0x9f, 0x7e, 0xfb, 0xf7, 0xff, 0xff, 0xba, 0xef, 0x7e, 0xff, 0xee, 0xff, 0xff, 0xf7, 0xff, 0x99, 0xde, 0xff, 0xfe, 0xff, 0xbb, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7d, 0xfd, 0xff, 0xe6, 0xff, 0x6b, 0x79, 0xf2, 0xfa, 0xff, 0x1f, 0xef, 0xe6, 0xfb, 0xdf, 0xff, 0xd3, 0x79, 0x87, 0xdf, 0xdc, 0xf9, 0xfd, 0xaf, 0xd9, 0xff, 0x7f, 0xfd, 0xec, 0xff, 0x9f, 0xff, 0xbb, 0xfc, 0xff, 0xf7, 0xff, 0xf7, 0xcb, 0xfd, 0x97, 0xfd, 0x7a, 0xff, 0x6d, 0xd6, 0xbf, 0xfe, 0x6a, 0x8d, 0xff, 0xf3, 0x59, 0x36, 0x2b, 0xfc, 0xfe, 0xff, 0xcd, 0xb7, 0xff, 0xce, 0xf9, 0xef, 0xfa, 0x1b, 0xf7, 0xff, 0x27, 0xfe, 0xee, 0xf7, 0xf9, 0xa6, 0xcf, 0xfa, 0xf7, 0xff, 0x67, 0xff, 0xed, 0xff, 0xd3, 0xfe, 0x3b, 0x57, 0xe6, 0xfe, 0x69, 0x36, 0xdb, 0x56, 0xf7, 0xdf, 0xe6, 0xfe, 0xff, 0x55, 0xfb, 0xde, 0x3d, 0xff, 0xdf, 0xdf, 0xed, 0xff, 0x9b, 0xb1, 0x2f, 0x5f, 0xb9, 0xe7, 0xdd, 0xff, 0xff, 0xf9, 0xf6, 0x7e, 0xfd, 0xff, 0xf7, 0xc5, 0xfd, 0xff, 0xfd, 0xfb, 0xff, 0x6c, 0xee, 0xbf, 0xd6, 0xfb, 0x6a, 0x7b, 0x7f, 0x1f, 0xfa, 0x6b, 0x5f, 0xe7, 0xb7, 0xb5, 0xf7, 0xff, 0x6f, 0x3d, 0xff, 0xbf, 0x19, 0xf8, 0xff, 0x85, 0xff, 0xdf, 0xff, 0x7c, 0xf7, 0x57, 0xda, 0xdf, 0xfa, 0xc3, 0xaf, 0xbc, 0xfa, 0xf6, 0xc3, 0xef, 0xef, 0xc6, 0xbd, 0xff, 0x76, 0xff, 0xc7, 0xf7, 0xef, 0xf8, 0xd9, 0xf7, 0xbf, 0xfd, 0xec, 0xfb, 0xef, 0x3f, 0xfe, 0xfe, 0xfb, 0x9d, 0x79, 0x5f, 0x7f, 0x9f, 0xff, 0xff, 0x9f, 0x6f, 0xbe, 0xff, 0xfe, 0xf7, 0xff, 0x7e, 0xf3, 0xcd, 0xf7, 0xdf, 0x7f, 0x7f, 0x67, 0xae, 0xfb, 0x4e, 0xc3, 0xef, 0x37, 0xdf, 0x7d, 0xfb, 0xed, 0x75, 0xff, 0xdd, 0xf7, 0xda, 0x7f, 0xff, 0xbd, 0xf6, 0x3f, 0x99, 0xfb, 0xff, 0xff, 0xff, 0x9f, 0xfd, 0xf6, 0xee, 0x37, 0xdf, 0xfd, 0xee, 0xfb, 0xef, 0xbe, 0xff, 0xfe, 0xbb, 0xef, 0xcf, 0x66, 0xd6, 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xaf, 0xff, 0xfb, 0xeb, 0xff, 0xfd, 0xff, 0xdf, 0xf7, 0xdf, 0xff, 0xf7, 0xfd, 0xbb, 0xa9, 0xff, 0x7f, 0x6f, 0xef, 0x9d, 0xde, 0xc7, 0x7f, 0xff, 0xf5, 0xef, 0xbd, 0xff, 0xfe, 0x7b, 0xaf, 0xbf, 0xff, 0xee, 0x6e, 0xd8, 0xf7, 0x7b, 0xe7, 0xbb, 0x3f, 0xff, 0xfb, 0xaa, 0xab, 0x5d, 0x75, 0xf5, 0x5f, 0x57, 0xdb, 0x7d, 0xd5, 0xd5, 0xdf, 0x9b, 0xff, 0xaf, 0xfb, 0xef, 0xfa, 0xff, 0x7f, 0xff, 0xde, 0xff, 0xff, 0x5f, 0x7f, 0xfd, 0xf7, 0xde, 0xff, 0xef, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xf3, 0x8f, 0x0e, 0xff, 0xfc, 0xe3, 0x83, 0x0e, 0x75, 0xd0, 0x41, 0x87, 0x1d, 0x76, 0xd0, 0x41, 0x87, 0xbf, 0xf9, 0xef, 0xfa, 0xff, 0xbf, 0xbf, 0xf8, 0xe7, 0xff, 0x7f, 0xff, 0xff, 0xe7, 0xd7, 0x7f, 0x7c, 0xff, 0xf7, 0xbf, 0xff, 0x6f, 0xf8, 0xbf, 0xfe, 0xff, 0xef, 0xa6, 0xff, 0xff, 0x7a, 0xe9, 0x55, 0xb7, 0xbf, 0x74, 0xdb, 0xcb, 0xaf, 0xbd, 0xe4, 0xea, 0x9b, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xea, 0xff, 0xff, 0xae, 0xb7, 0xfa, 0xf3, 0xd6, 0x3f, 0x77, 0xdd, 0x75, 0xd7, 0x5f, 0xbd, 0xe6, 0xfe, 0x7f, 0xff, 0xfd, 0x27, 0xf3, 0x7f, 0xef, 0x85, 0x16, 0x34, 0xf9, 0xe2, 0x93, 0x2d, 0xb6, 0xd8, 0x42, 0x8b, 0xbf, 0xf9, 0xff, 0xf6, 0xff, 0x6f, 0xff, 0xff, 0xf7, 0x9b, 0xff, 0x3f, 0xfa, 0xdf, 0xbf, 0x9f, 0xfa, 0xff, 0xdd, 0xff, 0xf7, 0x6b, 0xfa, 0xff, 0x83, 0xaf, 0xb9, 0xfe, 0xfa, 0xe3, 0xaf, 0xbf, 0xde, 0xf5, 0x17, 0x5f, 0x6f, 0xfd, 0xf5, 0xc6, 0x5e, 0xf7, 0x9a, 0xef, 0xc7, 0xfe, 0xc8, 0xd2, 0xdc, 0x2a, 0x1f, 0xf3, 0xb3, 0x9f, 0x7b, 0x7c, 0xdf, 0xd7, 0xbf, 0xff, 0xf9, 0xf9, 0xff, 0xe6, 0xf7, 0xdf, 0xef, 0xbd, 0x7e, 0x3d, 0xf7, 0xfd, 0xb7, 0xce, 0x77, 0xd3, 0xff, 0xbf, 0xbd, 0xfb, 0xff, 0xdf, 0xbf, 0x9f, 0xf9, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x5f, 0xff, 0xbe, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xef, 0xff, 0x6f, 0xfc, 0xf7, 0xfe, 0xfa, 0xf1, 0xaf, 0xfd, 0xfe, 0x7f, 0xbf, 0xfd, 0xff, 0xf5, 0xb4, 0xdf, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xe8, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdd, 0xfd, 0xfe, 0xfb, 0x75, 0xf7, 0xff, 0xdf, 0xe6, 0xfd, 0xe2, 0x2f, 0xff, 0xfe, 0xdb, 0xef, 0xba, 0xfd, 0xfb, 0x7f, 0xf7, 0xdd, 0x7f, 0xed, 0xff, 0xff, 0xff, 0xef, 0xbd, 0xe1, 0x7f, 0xde, 0xff, 0xcf, 0x3c, 0xfd, 0xf7, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7f, 0xff, 0xd5, 0xff, 0xfc, 0x6f, 0xbc, 0xff, 0xf2, 0xf7, 0xed, 0xbf, 0xff, 0xf5, 0xbb, 0xfb, 0xfb, 0xbd, 0xef, 0xdf, 0xff, 0xdf, 0xe7, 0x6f, 0xff, 0xfe, 0x1b, 0xef, 0xff, 0xff, 0xff, 0x58, 0xe9, 0xc7, 0x1f, 0xfe, 0xfe, 0xb7, 0xfd, 0xf7, 0xff, 0xfb, 0xff, 0xef, 0xf7, 0xff, 0xff, 0xa6, 0x7b, 0xfd, 0xfe, 0xfd, 0xee, 0xff, 0xdf, 0xdf, 0xbf, 0xef, 0xfd, 0xff, 0xff, 0xab, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xbf, 0xd9, 0xbf, 0xfb, 0xcb, 0xbf, 0xbf, 0xfe, 0xfd, 0xfd, 0xb5, 0xf5, 0x9d, 0xf6, 0xfb, 0x5f, 0x3b, 0xf9, 0x76, 0xff, 0xff, 0x6a, 0xf6, 0x7f, 0xec, 0xbb, 0xc5, 0x3e, 0xff, 0xff, 0xef, 0xf6, 0x53, 0xff, 0xff, 0xff, 0xd7, 0x7f, 0xff, 0xfd, 0xef, 0xff, 0x99, 0x7e, 0xbf, 0x7b, 0xff, 0xfd, 0xed, 0xff, 0xff, 0xff, 0xcf, 0xf7, 0xdf, 0xf7, 0xf7, 0xdf, 0xef, 0x5f, 0xff, 0xff, 0xff, 0x86, 0xff, 0xaf, 0xff, 0xfc, 0x91, 0xef, 0xbf, 0xf9, 0xd6, 0xfb, 0xf7, 0x74, 0xff, 0xfd, 0xef, 0xff, 0x7c, 0xff, 0xff, 0x8f, 0xd9, 0xff, 0xee, 0xbf, 0xff, 0xfe, 0x9b, 0xef, 0xdf, 0xf5, 0x7e, 0x9d, 0xed, 0x7f, 0xeb, 0xff, 0x9f, 0xdf, 0xff, 0xff, 0x6d, 0xfe, 0xe7, 0xfe, 0x7f, 0x6e, 0x7f, 0xfd, 0xcd, 0xf7, 0xdf, 0xf5, 0x7e, 0x3b, 0xef, 0xff, 0x6b, 0x7f, 0xfb, 0xff, 0xff, 0x9b, 0xf5, 0xe9, 0xa7, 0x9f, 0xfb, 0xff, 0xf9, 0xff, 0xff, 0x75, 0x67, 0x9f, 0x67, 0xff, 0xfb, 0xfe, 0xff, 0xfe, 0xff, 0xd7, 0xe6, 0xfe, 0x6f, 0xa5, 0x99, 0xff, 0xe7, 0x9f, 0x7f, 0xbc, 0xb4, 0xaf, 0x32, 0x5e, 0x79, 0x69, 0xaf, 0xd2, 0xfe, 0xff, 0xbb, 0x99, 0xff, 0xde, 0x69, 0xe7, 0xfe, 0x5f, 0x7f, 0xfd, 0xa5, 0x7f, 0xeb, 0xbd, 0xd7, 0x4a, 0xfb, 0xfb, 0xb5, 0xff, 0xff, 0x6c, 0xec, 0xbf, 0xb6, 0xfa, 0xea, 0xdf, 0x73, 0xdf, 0x2d, 0xab, 0x75, 0x7f, 0xbf, 0xb5, 0xd7, 0x5f, 0xfd, 0xfd, 0xff, 0xbf, 0x99, 0xf8, 0xff, 0xfd, 0xf6, 0xfa, 0xdf, 0x7d, 0xe7, 0xd5, 0x1a, 0xd7, 0xdf, 0x8b, 0x8d, 0xf5, 0xb6, 0x5f, 0xff, 0xff, 0xef, 0xe6, 0xfd, 0xff, 0xff, 0xf3, 0xff, 0xbb, 0xec, 0xb2, 0xef, 0x6d, 0xff, 0xbf, 0xed, 0xfb, 0x7b, 0xef, 0xff, 0xfe, 0xff, 0xbd, 0x79, 0xff, 0x7f, 0xff, 0xf9, 0xff, 0xdb, 0x6f, 0xff, 0x7d, 0xf6, 0xaf, 0xcf, 0xfe, 0xff, 0xec, 0xb7, 0xff, 0xff, 0x7f, 0x6f, 0xec, 0xff, 0xbe, 0xfb, 0x6d, 0x75, 0xd3, 0xe5, 0x37, 0xcd, 0x73, 0xdf, 0x79, 0xf6, 0x9f, 0x6c, 0xdc, 0xfd, 0xf7, 0xbf, 0x99, 0xf9, 0xff, 0xff, 0x6f, 0xff, 0xbf, 0xf7, 0xfe, 0xff, 0xff, 0x7c, 0xff, 0xb7, 0xef, 0xfe, 0xf9, 0xff, 0xfb, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xab, 0xaf, 0xbf, 0xff, 0xbf, 0xff, 0x7f, 0xfb, 0xdf, 0x77, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xa9, 0xff, 0x5e, 0x7b, 0xbf, 0xf7, 0xd1, 0xc7, 0x9f, 0xbf, 0x74, 0xb5, 0x97, 0xf7, 0x7e, 0xfd, 0xfb, 0xbf, 0xff, 0xff, 0x6a, 0xde, 0xb7, 0xfb, 0xee, 0xd9, 0xff, 0xfe, 0xfb, 0xef, 0x9f, 0x7e, 0xfd, 0xb3, 0xd7, 0x3b, 0x7f, 0x6d, 0xf5, 0xff, 0xdf, 0x9b, 0xff, 0xaf, 0xb7, 0xde, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x37, 0xb7, 0xed, 0x7f, 0xff, 0xde, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xa3, 0x8f, 0x3f, 0xf7, 0xdc, 0x73, 0xcf, 0x3f, 0xff, 0xb9, 0x67, 0x9f, 0x7f, 0xf6, 0xd1, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0x3f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0x7e, 0xfd, 0xef, 0xdf, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xfb, 0xcf, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf3, 0xff, 0xfe, 0xfd, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x7f, 0xff, 0xfd, 0xfc, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 0xde, 0xfb, 0xef, 0xbf, 0xd7, 0xfe, 0xff, 0xbf, 0xf9, 0xf7, 0xf3, 0xdb, 0xef, 0xff, 0xf8, 0xf4, 0x9b, 0xfb, 0xff, 0x7a, 0xe7, 0xf7, 0xff, 0x7f, 0xff, 0xef, 0xff, 0xff, 0x6e, 0xf2, 0xff, 0xeb, 0x2e, 0xb7, 0xfa, 0xba, 0x6b, 0xaf, 0x3e, 0xe8, 0xd5, 0x93, 0x5d, 0x7d, 0xb5, 0xe1, 0xc7, 0x5e, 0xff, 0x9a, 0xff, 0x7f, 0xbf, 0xfc, 0xf3, 0xff, 0xbf, 0x0f, 0xfc, 0xf3, 0x9f, 0x7f, 0xbf, 0xd9, 0xff, 0x1f, 0x5e, 0xfe, 0xff, 0xff, 0xc6, 0xff, 0xfb, 0xaf, 0xef, 0x7a, 0xbf, 0x7d, 0xfe, 0xbd, 0xfb, 0xf3, 0xdb, 0x5b, 0xff, 0xe7, 0xfd, 0xf7, 0xff, 0xff, 0x9e, 0xf9, 0xff, 0xdf, 0xff, 0x6f, 0xff, 0xff, 0xfb, 0xa9, 0xdf, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xef, 0xe6, 0xf7, 0xff, 0xff, 0x6f, 0xfe, 0x37, 0xff, 0xbc, 0xdb, 0x27, 0x3f, 0xfe, 0xfb, 0xe2, 0xfd, 0x7b, 0xfd, 0xf9, 0xc7, 0xcf, 0xfd, 0xdf, 0xff, 0x6f, 0x9b, 0xff, 0xff, 0xfe, 0xef, 0xfb, 0xdb, 0xdf, 0xff, 0x77, 0xfd, 0xff, 0x7e, 0xf7, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xef, 0x9d, 0xff, 0xfd, 0xb9, 0x6e, 0xab, 0xf6, 0xfe, 0xff, 0xf7, 0xff, 0x7a, 0x7c, 0xb3, 0xff, 0xff, 0xff, 0xbf, 0xd9, 0x4f, 0x5e, 0xff, 0xfb, 0xf7, 0xff, 0xfc, 0x63, 0x5f, 0xfb, 0xfb, 0xff, 0xff, 0xd7, 0x7f, 0xfd, 0xdf, 0xbf, 0x6f, 0x6f, 0xfe, 0xbf, 0xfd, 0xff, 0xff, 0xfe, 0xff, 0xf6, 0x7f, 0xfe, 0xff, 0xcd, 0xd7, 0xff, 0xf7, 0xeb, 0xaf, 0xf7, 0xff, 0x7f, 0x9b, 0xff, 0x7f, 0xf7, 0x5f, 0xcc, 0xfd, 0x57, 0xdf, 0x7f, 0xa7, 0x7d, 0xff, 0x3f, 0xbe, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xef, 0xa6, 0xff, 0xfe, 0xff, 0xbf, 0xfd, 0xbf, 0xef, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x5f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbd, 0xf9, 0xff, 0xf7, 0xff, 0xbf, 0xaf, 0xfa, 0xba, 0xed, 0xb4, 0xfd, 0xbf, 0xf7, 0x7f, 0xff, 0xc7, 0xf9, 0xff, 0xff, 0xff, 0x6d, 0xfc, 0xff, 0x6c, 0xb7, 0x7f, 0xbf, 0xff, 0xfe, 0xf8, 0xdf, 0xff, 0xff, 0xfd, 0xaf, 0xbf, 0x7f, 0xf5, 0xdf, 0xff, 0xff, 0x99, 0xfe, 0xdf, 0xff, 0xef, 0xfe, 0xf7, 0xbf, 0xff, 0xff, 0xbe, 0xff, 0x5b, 0xfb, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0xff, 0x9f, 0xbf, 0xe4, 0xcb, 0xef, 0xbf, 0xbc, 0xe7, 0xff, 0xff, 0xf7, 0xf9, 0xac, 0x8d, 0x1f, 0x5e, 0xff, 0xff, 0x8f, 0xd9, 0xff, 0xef, 0xbb, 0xfc, 0xd6, 0xfd, 0x77, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xd9, 0xaf, 0x8f, 0xdd, 0xff, 0xff, 0x6d, 0xde, 0xff, 0xf5, 0xfb, 0xff, 0x7f, 0xf3, 0x9d, 0x5f, 0xfd, 0x55, 0x7f, 0xff, 0x5f, 0xb6, 0xff, 0x49, 0xfb, 0xff, 0xff, 0x1b, 0xf5, 0xdf, 0xbf, 0xff, 0x3d, 0xff, 0x79, 0xff, 0xdf, 0x7f, 0xd7, 0xff, 0xff, 0xbf, 0xd3, 0xff, 0x73, 0xfe, 0xff, 0xd7, 0xe6, 0xbe, 0x99, 0xb7, 0xd5, 0xff, 0x47, 0xdd, 0xb6, 0xc5, 0xb7, 0xb5, 0xd7, 0xfe, 0x5f, 0xcf, 0xfc, 0xda, 0xed, 0xff, 0xbb, 0x91, 0x7f, 0xe7, 0x7a, 0x76, 0xff, 0x6f, 0xff, 0xb9, 0xf7, 0x7e, 0xed, 0xbd, 0xfb, 0xdf, 0xfa, 0xd7, 0xfc, 0xfa, 0xff, 0x6c, 0xec, 0xaf, 0xff, 0xfa, 0xff, 0xdf, 0x72, 0x1f, 0x3a, 0xaa, 0xfc, 0x7f, 0x7d, 0xbf, 0xb7, 0xdf, 0x7b, 0xff, 0xff, 0xbf, 0x19, 0xf9, 0xff, 0xd7, 0xf7, 0xff, 0x5f, 0x7d, 0xb3, 0x52, 0xda, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xef, 0x86, 0xfd, 0xdf, 0xfe, 0xfb, 0x6d, 0xfb, 0xee, 0x7c, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x9f, 0xff, 0xff, 0xfe, 0xff, 0xbd, 0x79, 0xff, 0x6f, 0xfd, 0x75, 0xf6, 0xd7, 0x6f, 0x9e, 0xf9, 0xdf, 0xff, 0xff, 0xfe, 0xe3, 0xf9, 0xe7, 0xdf, 0xfe, 0x7f, 0x6f, 0xa6, 0xff, 0x38, 0xfb, 0xae, 0x71, 0xcf, 0xf5, 0x73, 0xed, 0x77, 0xff, 0xdd, 0xf7, 0x1a, 0x6f, 0xff, 0xdd, 0xf7, 0xbb, 0x99, 0xf9, 0xff, 0xcf, 0xff, 0xff, 0xfd, 0xf6, 0xfe, 0x7f, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xde, 0xf9, 0xff, 0xfb, 0x7f, 0x4e, 0x66, 0xf6, 0xff, 0xfb, 0xff, 0xbf, 0xbb, 0xaf, 0xff, 0xee, 0xbf, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xdf, 0xff, 0xff, 0xdf, 0xbb, 0xb9, 0xff, 0xcf, 0x6b, 0x6d, 0xfc, 0xfd, 0xd7, 0x1b, 0xbf, 0x7f, 0xff, 0xf5, 0xff, 0xff, 0xfc, 0xef, 0xbf, 0xff, 0xfb, 0x6a, 0xde, 0xff, 0xf9, 0xea, 0x8b, 0xff, 0xf6, 0x7b, 0xe6, 0xbf, 0x7f, 0x7d, 0xf5, 0xef, 0x7f, 0xff, 0xed, 0xd7, 0xff, 0xcf, 0x9b, 0xff, 0xbf, 0xb7, 0xff, 0xfa, 0xff, 0xff, 0xf7, 0xde, 0x3f, 0xf7, 0x7b, 0x7f, 0xfd, 0xf7, 0xfe, 0x59, 0xf7, 0xbf, 0xff, 0xe6, 0xff, 0xcf, 0xb2, 0x8f, 0x3c, 0xbf, 0xfc, 0x30, 0xcf, 0x3f, 0xf7, 0xd9, 0x47, 0x1f, 0x7b, 0xfe, 0xd1, 0xe7, 0x1f, 0xbf, 0xf9, 0xff, 0xff, 0xfd, 0xa7, 0xff, 0x7f, 0xe7, 0xd9, 0xff, 0x7f, 0xff, 0xfd, 0xbf, 0x5f, 0x7f, 0xfb, 0xf5, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0x3f, 0xff, 0xe8, 0xff, 0xcf, 0x3f, 0xfe, 0xff, 0x7f, 0x7f, 0xff, 0xef, 0xd7, 0xff, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xeb, 0xbe, 0xfa, 0xff, 0xfa, 0xe3, 0xfc, 0xff, 0xf3, 0xff, 0x7f, 0xfd, 0xfd, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0x6f, 0xec, 0xb1, 0xf6, 0x1f, 0x7f, 0xbc, 0xfd, 0xf7, 0xb6, 0xff, 0x5e, 0xfe, 0xed, 0xbf, 0xff, 0xfe, 0xff, 0xb7, 0xf9, 0xff, 0xf2, 0xfb, 0xff, 0xbf, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xe9, 0xff, 0xbf, 0x7e, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xf2, 0xbf, 0xcb, 0xad, 0xbf, 0xfe, 0xfa, 0xeb, 0x8f, 0xbf, 0xf6, 0xd5, 0xd7, 0x5f, 0x7c, 0xbd, 0xf5, 0xd7, 0x5f, 0xfd, 0x9b, 0xff, 0x3f, 0xfa, 0xbc, 0xf3, 0xc1, 0x2b, 0xfd, 0xd4, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xc7, 0x93, 0x7e, 0xfc, 0xff, 0xff, 0xc6, 0x7f, 0xef, 0xbf, 0xdf, 0xde, 0xb2, 0xf9, 0xda, 0xdf, 0xaf, 0xff, 0xbf, 0xff, 0x7d, 0xbd, 0xff, 0xd7, 0xff, 0xff, 0x9f, 0xe9, 0xf7, 0xfe, 0xfb, 0xef, 0xdf, 0xfb, 0xf3, 0xf7, 0xf7, 0xdf, 0x5f, 0xdf, 0x3f, 0xfe, 0x7f, 0xfd, 0xdf, 0xff, 0xff, 0x67, 0xf6, 0xfe, 0xd3, 0xea, 0xcb, 0xbf, 0xfb, 0xfe, 0xf7, 0xcb, 0xff, 0x7d, 0xfe, 0xff, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0x7f, 0xfa, 0xb9, 0xff, 0xeb, 0xdf, 0xbf, 0xba, 0xff, 0xfe, 0xbf, 0xf7, 0xff, 0xfb, 0xef, 0xfe, 0xdf, 0x7f, 0xe6, 0x7f, 0x7f, 0xff, 0x63, 0xfe, 0xf6, 0xe7, 0xff, 0xf7, 0xff, 0xfe, 0xbf, 0xfb, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xf9, 0xdf, 0x7f, 0xff, 0xef, 0xff, 0xff, 0xdf, 0xbf, 0xff, 0xbf, 0xfb, 0xff, 0xbf, 0x5f, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xbe, 0xef, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xf7, 0x9f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xe9, 0xcf, 0x3e, 0x7f, 0x5f, 0x9d, 0xaf, 0xff, 0xff, 0xff, 0xc5, 0xef, 0x7f, 0xfe, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xfb, 0xef, 0xbf, 0xf9, 0xeb, 0x3f, 0xfd, 0xfd, 0xeb, 0xdf, 0xfb, 0xff, 0x59, 0xef, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xbf, 0xb9, 0xff, 0xf9, 0xd5, 0xb7, 0xdf, 0xff, 0xfa, 0xef, 0xfd, 0xef, 0xbf, 0xef, 0xff, 0xfd, 0xf5, 0xff, 0xd7, 0xff, 0xff, 0x6f, 0xfc, 0xff, 0xf6, 0xfa, 0xf7, 0xff, 0xfb, 0xfe, 0xdf, 0x5f, 0x7f, 0xfb, 0xe3, 0x97, 0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0x9b, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xf7, 0xef, 0xef, 0xff, 0xff, 0xf5, 0x7f, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x86, 0xff, 0xbb, 0xff, 0xfe, 0x9a, 0xeb, 0xff, 0xff, 0xd5, 0xcb, 0xfd, 0xbf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd9, 0xff, 0xd7, 0xdf, 0xef, 0xfe, 0x9b, 0xff, 0xff, 0xfc, 0x57, 0xbf, 0xfe, 0xff, 0xdf, 0xff, 0xef, 0xbf, 0xff, 0xff, 0x6d, 0xfe, 0xbf, 0x9f, 0x56, 0xee, 0xbf, 0xf3, 0xcf, 0x7a, 0x9d, 0xdf, 0xfe, 0xfb, 0x7f, 0xb6, 0xff, 0xfe, 0xeb, 0xff, 0xff, 0x9b, 0xf5, 0xff, 0x33, 0xcb, 0xfe, 0xff, 0xf9, 0xbf, 0xde, 0xee, 0x67, 0xbf, 0xfe, 0x9e, 0xdd, 0x6f, 0xbf, 0xfd, 0xff, 0xd7, 0xe6, 0xfe, 0xdb, 0x77, 0xfd, 0x76, 0x93, 0xdd, 0xf5, 0x89, 0x66, 0xad, 0xff, 0xff, 0x7f, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xbb, 0x99, 0xff, 0xe7, 0x9e, 0xef, 0xc9, 0x59, 0xbf, 0x79, 0xa7, 0x55, 0xef, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6c, 0xec, 0xbf, 0xff, 0x3e, 0xeb, 0xbf, 0x7f, 0xff, 0xda, 0x6a, 0xdf, 0xe7, 0x9f, 0xff, 0xd6, 0xfa, 0xff, 0xbf, 0xff, 0xbf, 0x99, 0xfb, 0xff, 0xb7, 0xd3, 0xdf, 0x3f, 0x7f, 0xff, 0xfe, 0xdb, 0xf7, 0xea, 0xff, 0x3f, 0xbe, 0xf8, 0xeb, 0xc7, 0xff, 0xef, 0xe6, 0xfd, 0xdf, 0x7a, 0xef, 0x6f, 0xf7, 0xef, 0xff, 0xf3, 0x67, 0xef, 0xff, 0xed, 0xb7, 0xef, 0x7f, 0xfb, 0xff, 0xff, 0xbd, 0x79, 0xff, 0x6f, 0xfd, 0xfd, 0xf7, 0xff, 0x6f, 0xff, 0xf9, 0xf7, 0xe3, 0xff, 0xfe, 0xff, 0xcd, 0xbf, 0xff, 0xfe, 0x7f, 0x6f, 0xec, 0xff, 0x38, 0x33, 0xed, 0x3b, 0xdf, 0xbd, 0xfb, 0xef, 0x73, 0xbe, 0xdd, 0xb7, 0xda, 0x6b, 0xf7, 0x7d, 0xf7, 0x3f, 0x98, 0xf9, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xf6, 0xfe, 0xff, 0x9f, 0x7f, 0xe7, 0xff, 0xff, 0xbe, 0xfb, 0xef, 0xff, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xdf, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xbb, 0xa9, 0xff, 0xcf, 0xaf, 0xef, 0xfd, 0xfb, 0xc7, 0xfb, 0xff, 0xfd, 0xe5, 0xe7, 0x1f, 0xdf, 0xeb, 0xf1, 0xc7, 0xff, 0xff, 0x6a, 0xde, 0xff, 0x79, 0x67, 0xab, 0x77, 0xfe, 0xfb, 0xee, 0xbf, 0xf5, 0x7c, 0xfb, 0xe7, 0x5e, 0xcd, 0xbe, 0xfb, 0xff, 0xdf, 0x9b, 0xff, 0xbf, 0xfe, 0xfb, 0xba, 0xff, 0xfe, 0xb7, 0xfe, 0xfa, 0xbf, 0xef, 0xbf, 0xb7, 0xf7, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xe6, 0xff, 0xef, 0xf3, 0x8f, 0x3e, 0xf7, 0xdc, 0xa3, 0x8f, 0x3e, 0xff, 0xf9, 0xe7, 0x1f, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfc, 0xf7, 0xef, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xcf, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xff, 0x6f, 0xff, 0xfd, 0xf7, 0xd3, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf7, 0xcb, 0xff, 0xaf, 0xfd, 0xf6, 0xdb, 0x2f, 0x3e, 0xf3, 0xff, 0xfd, 0xdf, 0xfc, 0xf7, 0xff, 0x7f, 0xff, 0x6f, 0xfa, 0xff, 0xcb, 0xa6, 0xbd, 0xde, 0xd2, 0xc3, 0xae, 0xb5, 0xba, 0xf5, 0xd7, 0x5f, 0x7e, 0xf9, 0xf5, 0xc7, 0x5f, 0xff, 0x9a, 0xff, 0xed, 0xff, 0xde, 0xd3, 0x8b, 0x8f, 0xbf, 0xdf, 0xe7, 0x97, 0x7f, 0xea, 0xff, 0x88, 0x9f, 0x7d, 0xfe, 0x7f, 0xff, 0xc6, 0xff, 0xfe, 0xfb, 0xef, 0x7e, 0xfb, 0xdf, 0xff, 0xb9, 0xef, 0xfd, 0xf3, 0xff, 0x77, 0xef, 0x52, 0xd7, 0xff, 0xff, 0x9f, 0xf9, 0xf7, 0xdf, 0x6f, 0xef, 0x9f, 0xbf, 0xfb, 0xfd, 0xff, 0xcf, 0xfe, 0xf7, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0x5f, 0xfb, 0x7a, 0xff, 0xff, 0xfa, 0xfc, 0xee, 0x5e, 0x7f, 0xfd, 0xe5, 0xdf, 0x5f, 0x7f, 0xfd, 0xbf, 0xff, 0x9b, 0x7f, 0xff, 0xbb, 0xf7, 0xfb, 0xff, 0xfb, 0xef, 0x7f, 0xff, 0xdf, 0x7f, 0xf7, 0xfa, 0xff, 0xbd, 0x7d, 0xf7, 0xf7, 0xff, 0xe6, 0xff, 0xff, 0xbf, 0x7f, 0xde, 0xf9, 0xfb, 0xff, 0xbb, 0xef, 0xf4, 0xf7, 0xff, 0x7d, 0xfd, 0x6d, 0xd7, 0xff, 0xff, 0xbf, 0x79, 0xbf, 0xf7, 0xc3, 0xeb, 0xbf, 0x77, 0xf7, 0xbf, 0x2f, 0xbf, 0xfb, 0xff, 0xbf, 0xff, 0x7f, 0xf5, 0x79, 0xf7, 0xff, 0x6f, 0xfe, 0xef, 0xdf, 0xdf, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xee, 0xbf, 0xdf, 0xbf, 0xff, 0xff, 0xfd, 0xfd, 0xff, 0x9b, 0xff, 0xcf, 0x3f, 0x6e, 0x7f, 0xb7, 0x8e, 0xfd, 0x5f, 0xfe, 0xee, 0xdd, 0xfd, 0xf2, 0xfd, 0xeb, 0xdc, 0xf9, 0xfe, 0xff, 0xe6, 0xff, 0xab, 0xdf, 0xff, 0xff, 0xfd, 0xb7, 0xff, 0xbb, 0xff, 0xfb, 0xf7, 0xbf, 0x77, 0xef, 0xfb, 0xf7, 0xbf, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0x37, 0xff, 0x7e, 0xff, 0xef, 0xbf, 0xfd, 0xfb, 0xef, 0xdf, 0x7f, 0xb6, 0xdd, 0xe4, 0xff, 0xff, 0x6e, 0xfc, 0xbf, 0x7e, 0xdd, 0x37, 0xde, 0xfe, 0x7f, 0xf3, 0xcf, 0xff, 0xbb, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xcd, 0xff, 0xbf, 0x99, 0xff, 0xe7, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xfa, 0xff, 0xff, 0x7f, 0xff, 0xf5, 0xd7, 0x7f, 0xff, 0xff, 0xfb, 0xe6, 0xfc, 0xbf, 0xff, 0xf2, 0xce, 0x7f, 0xbe, 0xf5, 0xd5, 0x9b, 0xdf, 0x7c, 0xf3, 0xf9, 0x3f, 0x9f, 0xf7, 0xf3, 0xf9, 0xbf, 0xf9, 0xff, 0xef, 0x3f, 0xec, 0xf3, 0xcf, 0x77, 0xfd, 0xfc, 0xd7, 0xbf, 0xfe, 0xfa, 0xff, 0xaf, 0xff, 0xfd, 0xfa, 0xff, 0x6d, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xaf, 0xbf, 0xfe, 0xf7, 0xbf, 0xfc, 0x4d, 0x35, 0xdf, 0xff, 0xff, 0x7d, 0x3f, 0xd5, 0x7f, 0x1b, 0xf5, 0xff, 0xff, 0xff, 0x7e, 0xeb, 0xac, 0xff, 0x9d, 0xfe, 0xf7, 0x59, 0x67, 0x9f, 0xfd, 0xf4, 0xdf, 0x6f, 0xfd, 0x57, 0xe6, 0xbe, 0x7d, 0xaf, 0xfd, 0x25, 0xdf, 0x7f, 0xff, 0xbf, 0x66, 0xb5, 0xff, 0x4c, 0x7b, 0xcd, 0xb4, 0xf2, 0x63, 0xb7, 0xbb, 0x91, 0xff, 0xff, 0xab, 0x7f, 0xd6, 0xfb, 0xef, 0xff, 0xaf, 0x5d, 0xcd, 0xbc, 0xd3, 0x4e, 0x3b, 0xed, 0xfc, 0xf3, 0xff, 0x6c, 0xec, 0xff, 0xdf, 0x7a, 0xff, 0xff, 0x97, 0xfe, 0x7f, 0x69, 0x5b, 0x7f, 0x7d, 0xf5, 0xd5, 0x53, 0x5f, 0x2d, 0xfd, 0xbf, 0x19, 0xfb, 0xff, 0xac, 0x92, 0x4f, 0x3f, 0xac, 0xfc, 0xc7, 0xdb, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xd8, 0xfe, 0x8b, 0xed, 0x6f, 0xc6, 0xfd, 0xdf, 0x7f, 0xeb, 0xbd, 0xf7, 0xdf, 0xff, 0xf1, 0xc7, 0x3f, 0xff, 0xfc, 0xfb, 0xcf, 0xbe, 0xff, 0xfe, 0xe3, 0xbd, 0x79, 0xf7, 0xe7, 0x9f, 0xf5, 0xff, 0xf9, 0xe7, 0xbf, 0xff, 0xff, 0xbf, 0xfe, 0xfb, 0xff, 0xef, 0xff, 0xdf, 0x7c, 0x7f, 0x6f, 0xae, 0xff, 0xfc, 0xf3, 0xce, 0x35, 0xff, 0xfc, 0xfb, 0xef, 0x7f, 0x9f, 0xfd, 0xf7, 0xdf, 0x77, 0xaf, 0xbd, 0xf6, 0xbf, 0x99, 0xfb, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xdf, 0xf7, 0xdf, 0xff, 0xe6, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xbb, 0xef, 0xef, 0x66, 0xf6, 0xbf, 0xff, 0xee, 0xbf, 0xef, 0xbf, 0xfd, 0xfe, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbb, 0xa9, 0xff, 0xc3, 0x1d, 0xff, 0xfe, 0xf1, 0xc7, 0x7b, 0xef, 0x7d, 0xef, 0xbf, 0xf7, 0xde, 0x6b, 0xaf, 0xbd, 0xf6, 0xfe, 0x6a, 0xde, 0xdf, 0xf8, 0xe7, 0x99, 0x6f, 0xfe, 0xdb, 0xea, 0xbb, 0xdf, 0x7d, 0xf5, 0xdd, 0x77, 0xdf, 0x7d, 0xd5, 0x57, 0xdf, 0x98, 0xfe, 0xbf, 0xde, 0xdc, 0xbf, 0xdf, 0xff, 0xff, 0xfe, 0xfa, 0xd7, 0x7b, 0x7f, 0xfd, 0x75, 0xd7, 0x7f, 0xff, 0xfd, 0xff, 0xa6, 0xff, 0xef, 0xb0, 0x83, 0x1d, 0x3e, 0xdc, 0xf0, 0x83, 0x0e, 0x75, 0xf0, 0x41, 0x07, 0x1d, 0x74, 0xf8, 0xc1, 0x87, 0xbf, 0xf9, 0xff, 0xf3, 0x9d, 0x77, 0xff, 0x7f, 0xf7, 0xc9, 0xbf, 0xff, 0xfd, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xfd, 0xf7, 0xff, 0x6f, 0xfe, 0xff, 0x1c, 0x7f, 0xd8, 0xe7, 0xcb, 0x1f, 0xba, 0xed, 0x75, 0x2f, 0xbd, 0xf6, 0xda, 0x6d, 0x2f, 0xbd, 0xf6, 0xfa, 0x9b, 0xff, 0xbf, 0xeb, 0xae, 0x7f, 0xfe, 0x79, 0xeb, 0x9d, 0xbf, 0xfa, 0x75, 0xd7, 0x5f, 0xff, 0xfc, 0x75, 0xd7, 0x5d, 0xff, 0xe6, 0xff, 0x6f, 0xbd, 0xb5, 0x05, 0x9e, 0x7f, 0xfd, 0xc9, 0x17, 0xbf, 0xf0, 0xe2, 0x8b, 0x4f, 0xbe, 0xf8, 0xc2, 0x8b, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x3f, 0xfa, 0xfd, 0xa7, 0x9f, 0x7e, 0xfa, 0xed, 0xff, 0xfe, 0x6f, 0xfe, 0xff, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0x2f, 0xba, 0xd6, 0xf5, 0xd6, 0x5e, 0x77, 0xdd, 0xf5, 0x57, 0x5f, 0xff, 0x9b, 0xff, 0x7f, 0xef, 0xfd, 0x7f, 0xff, 0x77, 0xff, 0xf8, 0xef, 0xfe, 0xff, 0xfd, 0xf6, 0xdf, 0xff, 0x9f, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xf5, 0xdf, 0xff, 0xf7, 0xff, 0xfb, 0xa7, 0xdf, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xe9, 0xff, 0xdf, 0xfd, 0xf7, 0xdf, 0x7f, 0x7f, 0xfe, 0x7f, 0xdf, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0x63, 0xfe, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xef, 0xfb, 0xef, 0x7b, 0x9f, 0x7f, 0xf7, 0xdf, 0x9f, 0xfd, 0xbf, 0x7f, 0x9f, 0x9b, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xfb, 0xdb, 0xbf, 0x7f, 0x77, 0xfd, 0xff, 0xdf, 0x7f, 0xfd, 0xfd, 0xdf, 0xff, 0x7f, 0xe6, 0xff, 0xef, 0x7e, 0xff, 0xfe, 0xe7, 0xff, 0xef, 0xbf, 0xfd, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf2, 0xff, 0x4f, 0xf7, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xae, 0xfd, 0xfd, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x9b, 0xef, 0xfe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xe6, 0xfb, 0xfe, 0xf7, 0xff, 0xff, 0xcf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xd9, 0xff, 0xfb, 0xfe, 0xfd, 0xfa, 0xef, 0xbb, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfc, 0x3f, 0xfe, 0xff, 0x7f, 0xff, 0x7d, 0xfe, 0x9f, 0x6f, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xdd, 0x5f, 0x6d, 0x7f, 0xff, 0xfb, 0xf7, 0xdf, 0xfb, 0xff, 0xbf, 0xff, 0xfe, 0x66, 0xef, 0xdf, 0x37, 0x3f, 0xfc, 0xf3, 0x5f, 0x3f, 0xff, 0xbc, 0xe7, 0x1f, 0xff, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xdf, 0xdf, 0xdf, 0xef, 0xfd, 0xf7, 0xdf, 0x7f, 0xdf, 0x7f, 0xef, 0xbf, 0x7f, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xf9, 0xef, 0xaf, 0xb7, 0x3e, 0xfb, 0xcd, 0x7f, 0xff, 0xfd, 0xbe, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xee, 0xff, 0xff, 0xff, 0xa6, 0xff, 0x2b, 0xbf, 0xff, 0xfe, 0xfa, 0xeb, 0xbf, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbf, 0xf9, 0xfe, 0xfc, 0xf3, 0xcf, 0x3d, 0x77, 0xfc, 0xf2, 0xcf, 0x7e, 0xee, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf8, 0xe7, 0xff, 0x6f, 0xfe, 0x7e, 0xfe, 0xfd, 0xe9, 0xdf, 0x7f, 0xff, 0xfe, 0xfb, 0x57, 0x3f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 0x9b, 0xff, 0xdf, 0x5b, 0xfa, 0xf9, 0xa5, 0xdf, 0x7a, 0xfa, 0xf9, 0xef, 0x3f, 0xfd, 0xf6, 0xd3, 0x4f, 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0x9d, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xdf, 0x7f, 0xef, 0xfb, 0xef, 0xbf, 0xff, 0xee, 0xfb, 0xef, 0xbf, 0xff, 0xbf, 0xf9, 0xfd, 0xb6, 0xfb, 0xff, 0xbb, 0x7f, 0xf6, 0xff, 0xff, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xee, 0x6f, 0x5e, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0x7b, 0xed, 0xf5, 0xbf, 0xbc, 0xfe, 0x7b, 0xef, 0xbd, 0xff, 0x7e, 0xfb, 0xff, 0x9b, 0xff, 0x8f, 0x5f, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xbd, 0x7f, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xe6, 0xff, 0x9f, 0x7f, 0xff, 0xfd, 0xf7, 0xdd, 0x7f, 0xff, 0xf5, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xef, 0xb7, 0xd7, 0x7e, 0xbb, 0xed, 0xb6, 0xdf, 0x7e, 0xfb, 0xdb, 0x6f, 0xbf, 0xf5, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0x6f, 0xfe, 0xff, 0xb7, 0xdf, 0x7e, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xef, 0xfb, 0xef, 0xbf, 0xfd, 0xf6, 0xfb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x77, 0xfb, 0xbd, 0xb7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 0xfe, 0x7b, 0xef, 0xbd, 0xff, 0xfe, 0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xaf, 0xbe, 0xfe, 0xfa, 0xeb, 0xef, 0xbf, 0xfe, 0xfa, 0xd7, 0x5f, 0x7f, 0xed, 0xf5, 0xd7, 0x5f, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xfa, 0xef, 0xbf, 0xfb, 0xfe, 0xba, 0xef, 0xbf, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xf3, 0xe6, 0xff, 0x5b, 0x77, 0xfd, 0xb5, 0xd7, 0x5b, 0x7b, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xbf, 0xf9, 0xff, 0xdc, 0x7c, 0xfd, 0xcd, 0xd7, 0x5c, 0x7c, 0xdd, 0xe5, 0x2e, 0xbf, 0xee, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0x6f, 0xee, 0xbf, 0x7f, 0xfb, 0x6f, 0xb7, 0xbf, 0xdb, 0xfb, 0xe7, 0x57, 0xb9, 0xfd, 0xf5, 0xdf, 0x7f, 0xff, 0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xe6, 0xfe, 0xdf, 0xee, 0xbf, 0xf7, 0xfe, 0xff, 0xef, 0xff, 0xee, 0xbf, 0xf7, 0xff, 0x7e, 0xff, 0xed, 0xf7, 0xdf, 0xfe, 0xbf, 0xf9, 0xbf, 0x31, 0xf7, 0xd7, 0x77, 0x7f, 0xf9, 0xf7, 0xb7, 0xfb, 0xfe, 0xfb, 0xab, 0xaf, 0xbf, 0xfb, 0xfa, 0xbb, 0xef, 0x6f, 0xfe, 0xff }; /* rom names */ #define SAMPLE_ROM_MULROM 0 /* rom locations */ static const unsigned long sample_roms[16] = { 40015, 39683, 40181, 39849, 40183, 39851, 40017, 39685, 39351, 39019, 39517, 39185, 39519, 39187, 39353, 39021 }; baycomusb-0.10.orig/directx/0042755000175100017510000000000007340500005014050 5ustar abaababaycomusb-0.10.orig/directx/Makefile.in0100644000175100017510000002164707340500005016122 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 @DIRECTX_TRUE@BUILT_SOURCES = libddraw.a libdsound.a libdinput.a libdplayx.a @DIRECTX_TRUE@noinst_LIBRARIES = libdinput1.a @DIRECTX_TRUE@libdinput1_a_SOURCES = dinput.c EXTRA_DIST = libddraw.def libdinput.def libdplayx.def libdsound.def dinput.c fixdirectx.sh deunion.pl include/directx.h include/mmsystem.h include/objbase.h CLEANFILES = libddraw.a libdinput.a libdplayx.a libdsound.a mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libdinput1_a_LIBADD = @DIRECTX_TRUE@libdinput1_a_OBJECTS = dinput.$(OBJEXT) CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(libdinput1_a_SOURCES) OBJECTS = $(libdinput1_a_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps directx/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstLIBRARIES: clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) distclean-noinstLIBRARIES: maintainer-clean-noinstLIBRARIES: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: libdinput1.a: $(libdinput1_a_OBJECTS) $(libdinput1_a_DEPENDENCIES) -rm -f libdinput1.a $(AR) cru libdinput1.a $(libdinput1_a_OBJECTS) $(libdinput1_a_LIBADD) $(RANLIB) libdinput1.a 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = directx distdir: $(DISTFILES) $(mkinstalldirs) $(distdir)/include @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 $(LIBRARIES) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: 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 "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-noinstLIBRARIES distclean-compile \ distclean-tags distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ 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-noinstLIBRARIES distclean-noinstLIBRARIES \ clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile 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 libddraw.a libdsound.a libdplayx.a: libddraw.def libdsound.def libdplayx.def for i in ddraw dsound dplayx; do \ $(DLLTOOL) --as $(AS) -k --dllname $$i.dll --output-lib lib$$i.a --def $(srcdir)/lib$$i.def; \ done libdinput.a: libdinput1.a libdinput.def $(DLLTOOL) --as $(AS) -k --dllname dinput.dll --output-lib $@ --def $(srcdir)/libdinput.def $(AR) xv libdinput1.a dinput.$(OBJEXT) $(AR) rv $@ dinput.$(OBJEXT) $(RM) -f $< # 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: baycomusb-0.10.orig/directx/include/0042755000175100017510000000000007340500005015473 5ustar abaababaycomusb-0.10.orig/directx/include/directx.h0100644000175100017510000000306207325134424017315 0ustar abaaba #ifndef _directx_h_ #define _directx_h /* Include all of the DirectX 5.0 headers and adds any necessary tweaks */ #include #include #ifndef WIN32 #define WIN32 #endif #undef WINNT /* Far pointers don't exist in 32-bit code */ #ifndef FAR #define FAR #endif /* Error codes not yet included in Win32 API header files */ #ifndef MAKE_HRESULT #define MAKE_HRESULT(sev,fac,code) \ ((HRESULT)(((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code)))) #endif #ifndef S_OK #define S_OK (HRESULT)0x00000000L #endif #ifndef SUCCEEDED #define SUCCEEDED(x) ((HRESULT)(x) >= 0) #endif #ifndef FAILED #define FAILED(x) ((HRESULT)(x)<0) #endif #ifndef E_FAIL #define E_FAIL (HRESULT)0x80000008L #endif #ifndef E_NOINTERFACE #define E_NOINTERFACE (HRESULT)0x80004002L #endif #ifndef E_OUTOFMEMORY #define E_OUTOFMEMORY (HRESULT)0x8007000EL #endif #ifndef E_INVALIDARG #define E_INVALIDARG (HRESULT)0x80070057L #endif #ifndef E_NOTIMPL #define E_NOTIMPL (HRESULT)0x80004001L #endif #ifndef REGDB_E_CLASSNOTREG #define REGDB_E_CLASSNOTREG (HRESULT)0x80040154L #endif /* Severity codes */ #ifndef SEVERITY_ERROR #define SEVERITY_ERROR 1 #endif /* Error facility codes */ #ifndef FACILITY_WIN32 #define FACILITY_WIN32 7 #endif #ifndef FIELD_OFFSET #define FIELD_OFFSET(type, field) ((LONG)&(((type *)0)->field)) #endif /* DirectX 6.0 header includes (if it isn't included, I haven't tested it yet) */ #ifdef __GNUC__ #define NONAMELESSUNION #endif #include #include #include #endif /* _directx_h */ baycomusb-0.10.orig/directx/include/mmsystem.h0100644000175100017510000001522607325134424017536 0ustar abaaba #ifndef _mmsystem_h #define _mmsystem_h /* Multimedia header file -- not really part of DirectX, but not included in the Win32 API headers. */ /* Result code definition */ typedef UINT MMRESULT; typedef DWORD MCIERROR; /* Various error values */ #define MAXERRORLENGTH 256 /* Maximum length of error message */ #define MMSYSERR_NOERROR 0 #define TIMERR_NOERROR MMSYSERR_NOERROR #define TIMERR_NOCANDO 97 /* Wave out device handle */ typedef HANDLE HWAVEOUT; /* MCI device handle */ typedef UINT MCIDEVICEID; /* Have the system choose a wave device */ #define WAVE_MAPPER ((UINT)-1) /* Specify the type of wave event callback */ #define CALLBACK_FUNCTION 0x00030000 #define CALLBACK_EVENT 0x00050000 /* Messages sent to the waveOut callback function */ #define WOM_DONE 0x3BD /* The wave buffer header used by waveOut functions */ typedef struct WAVEHDR { LPSTR lpData; DWORD dwBufferLength; DWORD dwBytesRecorded; DWORD dwUser; DWORD dwFlags; DWORD dwLoops; struct WAVEHDR *lpNext; DWORD reserved; } WAVEHDR; /* WAVEHDR.dwFlags */ #define WHDR_DONE 0x00000001 #define WHDR_BEGINLOOP 0x00000004 #define WHDR_ENDLOOP 0x00000008 #define WHDR_INQUEUE 0x00000010 /* Structure used in querying the capabilities of a wave device */ typedef struct { WORD wMid; WORD wPid; UINT vDriverVersion; CHAR szPname[32]; DWORD dwFormats; WORD wReserved1; DWORD dwSupport; } WAVEOUTCAPS; /* The only kind of sound data we handle here */ #define WAVE_FORMAT_PCM 1 /* Old wave format structure */ typedef struct { WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; } WAVEFORMAT, *LPWAVEFORMAT; /* PCM wave format structure */ typedef struct { WAVEFORMAT wf; WORD wBitsPerSample; } PCMWAVEFORMAT; /* Wave format structure (used by dsound.h) */ typedef struct { WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPerSample; WORD cbSize; } WAVEFORMATEX, *LPWAVEFORMATEX; /* Constants used as arguments and flags to mciSendCommand() */ /* CD device type */ #define MCI_STRING_OFFSET 512 #define MCI_DEVTYPE_CD_AUDIO (MCI_STRING_OFFSET + 4) /* MCI commands */ #define MCI_OPEN 0x0803 #define MCI_CLOSE 0x0804 #define MCI_PLAY 0x0806 #define MCI_STOP 0x0808 #define MCI_PAUSE 0x0809 #define MCI_SET 0x080D #define MCI_STATUS 0x0814 #define MCI_RESUME 0x0855 /* Flags for MCI commands */ #define MCI_NOTIFY 0x00000001 #define MCI_WAIT 0x00000002 #define MCI_FROM 0x00000004 #define MCI_TO 0x00000008 #define MCI_TRACK 0x00000010 /* Flags for MCI Play command */ #define MCI_OPEN_SHAREABLE 0x00000100 #define MCI_OPEN_ELEMENT 0x00000200 #define MCI_OPEN_TYPE_ID 0x00001000 #define MCI_OPEN_TYPE 0x00002000 /* Flags for MCI Status command */ #define MCI_STATUS_ITEM 0x00000100 #define MCI_STATUS_LENGTH 0x00000001 #define MCI_STATUS_POSITION 0x00000002 #define MCI_STATUS_NUMBER_OF_TRACKS 0x00000003 #define MCI_STATUS_MODE 0x00000004 #define MCI_STATUS_MEDIA_PRESENT 0x00000005 #define MCI_STATUS_TIME_FORMAT 0x00000006 #define MCI_STATUS_READY 0x00000007 #define MCI_STATUS_CURRENT_TRACK 0x00000008 /* Flags for MCI Set command */ #define MCI_SET_DOOR_OPEN 0x00000100 #define MCI_SET_DOOR_CLOSED 0x00000200 #define MCI_SET_TIME_FORMAT 0x00000400 /* MCI device status flags */ #define MCI_MODE_NOT_READY (MCI_STRING_OFFSET + 12) #define MCI_MODE_STOP (MCI_STRING_OFFSET + 13) #define MCI_MODE_PLAY (MCI_STRING_OFFSET + 14) #define MCI_MODE_RECORD (MCI_STRING_OFFSET + 15) #define MCI_MODE_SEEK (MCI_STRING_OFFSET + 16) #define MCI_MODE_PAUSE (MCI_STRING_OFFSET + 17) #define MCI_MODE_OPEN (MCI_STRING_OFFSET + 18) /* Constants used to specify MCI time formats */ #define MCI_FORMAT_MILLISECONDS 0 #define MCI_FORMAT_HMS 1 #define MCI_FORMAT_MSF 2 #define MCI_FORMAT_FRAMES 3 #define MCI_FORMAT_BYTES 8 #define MCI_FORMAT_SAMPLES 9 #define MCI_FORMAT_TMSF 10 #define MCI_MSF_MINUTE(msf) ((BYTE)(msf)) #define MCI_MSF_SECOND(msf) ((BYTE)(((WORD)(msf)) >> 8)) #define MCI_MSF_FRAME(msf) ((BYTE)((msf)>>16)) #define MCI_MAKE_MSF(m, s, f) \ ((DWORD)(((BYTE)(m)|((WORD)(s)<<8))|(((DWORD)(BYTE)(f))<<16))) /* Structures passed as arguments to mciSendCommand() */ typedef struct { DWORD dwCallback; MCIDEVICEID wDeviceID; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpstrAlias; } MCI_OPEN_PARMS; typedef struct { DWORD dwCallback; DWORD dwTimeFormat; DWORD dwAudio; } MCI_SET_PARMS; typedef struct { DWORD dwCallback; DWORD dwFrom; DWORD dwTo; } MCI_PLAY_PARMS; typedef struct { DWORD dwCallback; DWORD dwReturn; DWORD dwItem; DWORD dwTrack; } MCI_STATUS_PARMS; /* Convert a string to a 4 byte multimedia code */ #ifndef mmioFOURCC #define mmioFOURCC(c0, c1, c2, c3) \ ((DWORD)(c0)|((DWORD)(c1)<<8)|((DWORD)(c2)<<16)|((DWORD)(c3)<<24)) #endif /* timer callback function prototype */ typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2); /* What type of timer to set */ #define TIME_ONESHOT 0x0000 /* program timer for single event */ #define TIME_PERIODIC 0x0001 /* program for continuous periodic event */ /* Multimedia timer function declarations */ extern MMRESULT WINAPI timeSetEvent(UINT uDelay, UINT uResolution, TIMECALLBACK *fptc, DWORD dwUser, UINT fuEvent); extern MMRESULT WINAPI timeKillEvent(UINT uTimerID); extern MMRESULT WINAPI timeBeginPeriod(UINT uPeriod); extern MMRESULT WINAPI timeEndPeriod(UINT uPeriod); /* The waveOut* function declarations */ extern MMRESULT WINAPI waveOutOpen(HWAVEOUT *phwo, UINT uDeviceID, WAVEFORMATEX *pwfx, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); extern MMRESULT WINAPI waveOutClose(HWAVEOUT hwo); extern MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh); extern MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh); extern MMRESULT WINAPI waveOutWrite(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh); extern MMRESULT WINAPI waveOutPause(HWAVEOUT hwo); extern MMRESULT WINAPI waveOutRestart(HWAVEOUT hwo); extern MMRESULT WINAPI waveOutReset(HWAVEOUT hwo); extern MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT hwo); #define waveOutGetDevCaps waveOutGetDevCapsA extern MMRESULT WINAPI waveOutGetDevCapsA(UINT uDeviceID, WAVEOUTCAPS *pwoc, UINT cbwoc); #define waveOutGetErrorText waveOutGetErrorTextA extern MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText); /* The MCI command interface */ #define mciSendCommand mciSendCommandA extern MCIERROR WINAPI mciSendCommandA(MCIDEVICEID mciId, UINT uMsg, DWORD dwParam1, DWORD dwParam2); #define mciGetErrorString mciGetErrorStringA extern int WINAPI mciGetErrorStringA(DWORD hErr, LPCSTR lpBuf, DWORD dwLen); #endif /* _mmsystem_h */ baycomusb-0.10.orig/directx/include/objbase.h0100644000175100017510000000320707325134424017261 0ustar abaaba /* Various object oriented things... I think :-) */ #ifndef _objbase_h #define _objbase_h /* IUnknown needs to be a typedef */ typedef void IUnknown; #define LPUNKNOWN void * #if 0 #define DEFINE_GUID(name, a, b, c, d, e, f, g, h, i, j, k) \ static const GUID name = { a, b, c, { d, e, f, g, h, i, j, k } } #endif #if defined(__cplusplus) && !defined(CINTERFACE) #define REFGUID const GUID & #define REFIID REFGUID #define REFCLSID REFGUID #define STDMETHOD(method) virtual HRESULT __stdcall method #define STDMETHOD_(type,method) virtual type __stdcall method #define PURE = 0 #define THIS_ #define THIS void #define DECLARE_INTERFACE(iface) struct iface #define DECLARE_INTERFACE_(iface, baseiface) \ struct iface : public baseiface #else /* Not C++ */ #if 0 #define REFGUID const GUID * const #define REFIID REFGUID #define REFCLSID REFGUID #define STDMETHOD(method) HRESULT (__stdcall *method) #define STDMETHOD_(type,method) type (__stdcall *method) #define PURE #define THIS_ void *This, #define THIS void *This #endif #define DECLARE_INTERFACE(iface) \ typedef struct iface##Vtbl iface##Vtbl; \ typedef struct iface { \ iface##Vtbl *lpVtbl; \ } iface; \ struct iface##Vtbl #define DECLARE_INTERFACE_(iface, baseiface) \ DECLARE_INTERFACE(iface) #endif /* C++ */ static inline int IsEqualGUID(GUID g1, GUID g2) { return !memcmp(&g1, &g2, sizeof(GUID)); } extern WINAPI HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv); extern WINAPI HRESULT CoInitialize(LPVOID pvReserved); extern WINAPI void CoUninitialize(void); #endif /* _objbase_h */ baycomusb-0.10.orig/directx/Makefile.am0100644000175100017510000000167707325134424016125 0ustar abaaba INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 if DIRECTX BUILT_SOURCES = libddraw.a libdsound.a libdinput.a libdplayx.a noinst_LIBRARIES = libdinput1.a libdinput1_a_SOURCES = dinput.c endif libddraw.a libdsound.a libdplayx.a: libddraw.def libdsound.def libdplayx.def for i in ddraw dsound dplayx; do \ $(DLLTOOL) --as $(AS) -k --dllname $$i.dll --output-lib lib$$i.a --def $(srcdir)/lib$$i.def; \ done libdinput.a: libdinput1.a libdinput.def $(DLLTOOL) --as $(AS) -k --dllname dinput.dll --output-lib $@ --def $(srcdir)/libdinput.def $(AR) xv libdinput1.a dinput.$(OBJEXT) $(AR) rv $@ dinput.$(OBJEXT) $(RM) -f $< EXTRA_DIST = libddraw.def libdinput.def libdplayx.def libdsound.def dinput.c \ fixdirectx.sh deunion.pl include/directx.h include/mmsystem.h include/objbase.h CLEANFILES = libddraw.a libdinput.a libdplayx.a libdsound.a baycomusb-0.10.orig/directx/libddraw.def0100644000175100017510000000006507325134424016327 0ustar abaabaEXPORTS DirectDrawCreate@12 DirectDrawEnumerateA@8 baycomusb-0.10.orig/directx/libdinput.def0100644000175100017510000000003707325134424016530 0ustar abaabaEXPORTS DirectInputCreateA@16 baycomusb-0.10.orig/directx/libdplayx.def0100644000175100017510000000004307325134424016523 0ustar abaabaEXPORTS DirectPlayLobbyCreateA@20 baycomusb-0.10.orig/directx/libdsound.def0100644000175100017510000000032107325134424016515 0ustar abaabaEXPORTS DirectSoundCaptureEnumerateW@8 DirectSoundCaptureEnumerateA@8 DirectSoundCaptureCreate@12 DllGetClassObject DllCanUnloadNow DirectSoundEnumerateW@8 DirectSoundEnumerateA@8 DirectSoundCreate@12 baycomusb-0.10.orig/directx/dinput.c0100644000175100017510000003333107325134424015530 0ustar abaaba #include /* * This file contains experimentally determined values for the c_cfDI* * constants used in DirectX 5.0 */ /* Keyboard */ static DIOBJECTDATAFORMAT KBD_fmt[] = { { &GUID_Key, 0, 0x8000000C, 0x00000000 }, { &GUID_Key, 1, 0x8000010C, 0x00000000 }, { &GUID_Key, 2, 0x8000020C, 0x00000000 }, { &GUID_Key, 3, 0x8000030C, 0x00000000 }, { &GUID_Key, 4, 0x8000040C, 0x00000000 }, { &GUID_Key, 5, 0x8000050C, 0x00000000 }, { &GUID_Key, 6, 0x8000060C, 0x00000000 }, { &GUID_Key, 7, 0x8000070C, 0x00000000 }, { &GUID_Key, 8, 0x8000080C, 0x00000000 }, { &GUID_Key, 9, 0x8000090C, 0x00000000 }, { &GUID_Key, 10, 0x80000A0C, 0x00000000 }, { &GUID_Key, 11, 0x80000B0C, 0x00000000 }, { &GUID_Key, 12, 0x80000C0C, 0x00000000 }, { &GUID_Key, 13, 0x80000D0C, 0x00000000 }, { &GUID_Key, 14, 0x80000E0C, 0x00000000 }, { &GUID_Key, 15, 0x80000F0C, 0x00000000 }, { &GUID_Key, 16, 0x8000100C, 0x00000000 }, { &GUID_Key, 17, 0x8000110C, 0x00000000 }, { &GUID_Key, 18, 0x8000120C, 0x00000000 }, { &GUID_Key, 19, 0x8000130C, 0x00000000 }, { &GUID_Key, 20, 0x8000140C, 0x00000000 }, { &GUID_Key, 21, 0x8000150C, 0x00000000 }, { &GUID_Key, 22, 0x8000160C, 0x00000000 }, { &GUID_Key, 23, 0x8000170C, 0x00000000 }, { &GUID_Key, 24, 0x8000180C, 0x00000000 }, { &GUID_Key, 25, 0x8000190C, 0x00000000 }, { &GUID_Key, 26, 0x80001A0C, 0x00000000 }, { &GUID_Key, 27, 0x80001B0C, 0x00000000 }, { &GUID_Key, 28, 0x80001C0C, 0x00000000 }, { &GUID_Key, 29, 0x80001D0C, 0x00000000 }, { &GUID_Key, 30, 0x80001E0C, 0x00000000 }, { &GUID_Key, 31, 0x80001F0C, 0x00000000 }, { &GUID_Key, 32, 0x8000200C, 0x00000000 }, { &GUID_Key, 33, 0x8000210C, 0x00000000 }, { &GUID_Key, 34, 0x8000220C, 0x00000000 }, { &GUID_Key, 35, 0x8000230C, 0x00000000 }, { &GUID_Key, 36, 0x8000240C, 0x00000000 }, { &GUID_Key, 37, 0x8000250C, 0x00000000 }, { &GUID_Key, 38, 0x8000260C, 0x00000000 }, { &GUID_Key, 39, 0x8000270C, 0x00000000 }, { &GUID_Key, 40, 0x8000280C, 0x00000000 }, { &GUID_Key, 41, 0x8000290C, 0x00000000 }, { &GUID_Key, 42, 0x80002A0C, 0x00000000 }, { &GUID_Key, 43, 0x80002B0C, 0x00000000 }, { &GUID_Key, 44, 0x80002C0C, 0x00000000 }, { &GUID_Key, 45, 0x80002D0C, 0x00000000 }, { &GUID_Key, 46, 0x80002E0C, 0x00000000 }, { &GUID_Key, 47, 0x80002F0C, 0x00000000 }, { &GUID_Key, 48, 0x8000300C, 0x00000000 }, { &GUID_Key, 49, 0x8000310C, 0x00000000 }, { &GUID_Key, 50, 0x8000320C, 0x00000000 }, { &GUID_Key, 51, 0x8000330C, 0x00000000 }, { &GUID_Key, 52, 0x8000340C, 0x00000000 }, { &GUID_Key, 53, 0x8000350C, 0x00000000 }, { &GUID_Key, 54, 0x8000360C, 0x00000000 }, { &GUID_Key, 55, 0x8000370C, 0x00000000 }, { &GUID_Key, 56, 0x8000380C, 0x00000000 }, { &GUID_Key, 57, 0x8000390C, 0x00000000 }, { &GUID_Key, 58, 0x80003A0C, 0x00000000 }, { &GUID_Key, 59, 0x80003B0C, 0x00000000 }, { &GUID_Key, 60, 0x80003C0C, 0x00000000 }, { &GUID_Key, 61, 0x80003D0C, 0x00000000 }, { &GUID_Key, 62, 0x80003E0C, 0x00000000 }, { &GUID_Key, 63, 0x80003F0C, 0x00000000 }, { &GUID_Key, 64, 0x8000400C, 0x00000000 }, { &GUID_Key, 65, 0x8000410C, 0x00000000 }, { &GUID_Key, 66, 0x8000420C, 0x00000000 }, { &GUID_Key, 67, 0x8000430C, 0x00000000 }, { &GUID_Key, 68, 0x8000440C, 0x00000000 }, { &GUID_Key, 69, 0x8000450C, 0x00000000 }, { &GUID_Key, 70, 0x8000460C, 0x00000000 }, { &GUID_Key, 71, 0x8000470C, 0x00000000 }, { &GUID_Key, 72, 0x8000480C, 0x00000000 }, { &GUID_Key, 73, 0x8000490C, 0x00000000 }, { &GUID_Key, 74, 0x80004A0C, 0x00000000 }, { &GUID_Key, 75, 0x80004B0C, 0x00000000 }, { &GUID_Key, 76, 0x80004C0C, 0x00000000 }, { &GUID_Key, 77, 0x80004D0C, 0x00000000 }, { &GUID_Key, 78, 0x80004E0C, 0x00000000 }, { &GUID_Key, 79, 0x80004F0C, 0x00000000 }, { &GUID_Key, 80, 0x8000500C, 0x00000000 }, { &GUID_Key, 81, 0x8000510C, 0x00000000 }, { &GUID_Key, 82, 0x8000520C, 0x00000000 }, { &GUID_Key, 83, 0x8000530C, 0x00000000 }, { &GUID_Key, 84, 0x8000540C, 0x00000000 }, { &GUID_Key, 85, 0x8000550C, 0x00000000 }, { &GUID_Key, 86, 0x8000560C, 0x00000000 }, { &GUID_Key, 87, 0x8000570C, 0x00000000 }, { &GUID_Key, 88, 0x8000580C, 0x00000000 }, { &GUID_Key, 89, 0x8000590C, 0x00000000 }, { &GUID_Key, 90, 0x80005A0C, 0x00000000 }, { &GUID_Key, 91, 0x80005B0C, 0x00000000 }, { &GUID_Key, 92, 0x80005C0C, 0x00000000 }, { &GUID_Key, 93, 0x80005D0C, 0x00000000 }, { &GUID_Key, 94, 0x80005E0C, 0x00000000 }, { &GUID_Key, 95, 0x80005F0C, 0x00000000 }, { &GUID_Key, 96, 0x8000600C, 0x00000000 }, { &GUID_Key, 97, 0x8000610C, 0x00000000 }, { &GUID_Key, 98, 0x8000620C, 0x00000000 }, { &GUID_Key, 99, 0x8000630C, 0x00000000 }, { &GUID_Key, 100, 0x8000640C, 0x00000000 }, { &GUID_Key, 101, 0x8000650C, 0x00000000 }, { &GUID_Key, 102, 0x8000660C, 0x00000000 }, { &GUID_Key, 103, 0x8000670C, 0x00000000 }, { &GUID_Key, 104, 0x8000680C, 0x00000000 }, { &GUID_Key, 105, 0x8000690C, 0x00000000 }, { &GUID_Key, 106, 0x80006A0C, 0x00000000 }, { &GUID_Key, 107, 0x80006B0C, 0x00000000 }, { &GUID_Key, 108, 0x80006C0C, 0x00000000 }, { &GUID_Key, 109, 0x80006D0C, 0x00000000 }, { &GUID_Key, 110, 0x80006E0C, 0x00000000 }, { &GUID_Key, 111, 0x80006F0C, 0x00000000 }, { &GUID_Key, 112, 0x8000700C, 0x00000000 }, { &GUID_Key, 113, 0x8000710C, 0x00000000 }, { &GUID_Key, 114, 0x8000720C, 0x00000000 }, { &GUID_Key, 115, 0x8000730C, 0x00000000 }, { &GUID_Key, 116, 0x8000740C, 0x00000000 }, { &GUID_Key, 117, 0x8000750C, 0x00000000 }, { &GUID_Key, 118, 0x8000760C, 0x00000000 }, { &GUID_Key, 119, 0x8000770C, 0x00000000 }, { &GUID_Key, 120, 0x8000780C, 0x00000000 }, { &GUID_Key, 121, 0x8000790C, 0x00000000 }, { &GUID_Key, 122, 0x80007A0C, 0x00000000 }, { &GUID_Key, 123, 0x80007B0C, 0x00000000 }, { &GUID_Key, 124, 0x80007C0C, 0x00000000 }, { &GUID_Key, 125, 0x80007D0C, 0x00000000 }, { &GUID_Key, 126, 0x80007E0C, 0x00000000 }, { &GUID_Key, 127, 0x80007F0C, 0x00000000 }, { &GUID_Key, 128, 0x8000800C, 0x00000000 }, { &GUID_Key, 129, 0x8000810C, 0x00000000 }, { &GUID_Key, 130, 0x8000820C, 0x00000000 }, { &GUID_Key, 131, 0x8000830C, 0x00000000 }, { &GUID_Key, 132, 0x8000840C, 0x00000000 }, { &GUID_Key, 133, 0x8000850C, 0x00000000 }, { &GUID_Key, 134, 0x8000860C, 0x00000000 }, { &GUID_Key, 135, 0x8000870C, 0x00000000 }, { &GUID_Key, 136, 0x8000880C, 0x00000000 }, { &GUID_Key, 137, 0x8000890C, 0x00000000 }, { &GUID_Key, 138, 0x80008A0C, 0x00000000 }, { &GUID_Key, 139, 0x80008B0C, 0x00000000 }, { &GUID_Key, 140, 0x80008C0C, 0x00000000 }, { &GUID_Key, 141, 0x80008D0C, 0x00000000 }, { &GUID_Key, 142, 0x80008E0C, 0x00000000 }, { &GUID_Key, 143, 0x80008F0C, 0x00000000 }, { &GUID_Key, 144, 0x8000900C, 0x00000000 }, { &GUID_Key, 145, 0x8000910C, 0x00000000 }, { &GUID_Key, 146, 0x8000920C, 0x00000000 }, { &GUID_Key, 147, 0x8000930C, 0x00000000 }, { &GUID_Key, 148, 0x8000940C, 0x00000000 }, { &GUID_Key, 149, 0x8000950C, 0x00000000 }, { &GUID_Key, 150, 0x8000960C, 0x00000000 }, { &GUID_Key, 151, 0x8000970C, 0x00000000 }, { &GUID_Key, 152, 0x8000980C, 0x00000000 }, { &GUID_Key, 153, 0x8000990C, 0x00000000 }, { &GUID_Key, 154, 0x80009A0C, 0x00000000 }, { &GUID_Key, 155, 0x80009B0C, 0x00000000 }, { &GUID_Key, 156, 0x80009C0C, 0x00000000 }, { &GUID_Key, 157, 0x80009D0C, 0x00000000 }, { &GUID_Key, 158, 0x80009E0C, 0x00000000 }, { &GUID_Key, 159, 0x80009F0C, 0x00000000 }, { &GUID_Key, 160, 0x8000A00C, 0x00000000 }, { &GUID_Key, 161, 0x8000A10C, 0x00000000 }, { &GUID_Key, 162, 0x8000A20C, 0x00000000 }, { &GUID_Key, 163, 0x8000A30C, 0x00000000 }, { &GUID_Key, 164, 0x8000A40C, 0x00000000 }, { &GUID_Key, 165, 0x8000A50C, 0x00000000 }, { &GUID_Key, 166, 0x8000A60C, 0x00000000 }, { &GUID_Key, 167, 0x8000A70C, 0x00000000 }, { &GUID_Key, 168, 0x8000A80C, 0x00000000 }, { &GUID_Key, 169, 0x8000A90C, 0x00000000 }, { &GUID_Key, 170, 0x8000AA0C, 0x00000000 }, { &GUID_Key, 171, 0x8000AB0C, 0x00000000 }, { &GUID_Key, 172, 0x8000AC0C, 0x00000000 }, { &GUID_Key, 173, 0x8000AD0C, 0x00000000 }, { &GUID_Key, 174, 0x8000AE0C, 0x00000000 }, { &GUID_Key, 175, 0x8000AF0C, 0x00000000 }, { &GUID_Key, 176, 0x8000B00C, 0x00000000 }, { &GUID_Key, 177, 0x8000B10C, 0x00000000 }, { &GUID_Key, 178, 0x8000B20C, 0x00000000 }, { &GUID_Key, 179, 0x8000B30C, 0x00000000 }, { &GUID_Key, 180, 0x8000B40C, 0x00000000 }, { &GUID_Key, 181, 0x8000B50C, 0x00000000 }, { &GUID_Key, 182, 0x8000B60C, 0x00000000 }, { &GUID_Key, 183, 0x8000B70C, 0x00000000 }, { &GUID_Key, 184, 0x8000B80C, 0x00000000 }, { &GUID_Key, 185, 0x8000B90C, 0x00000000 }, { &GUID_Key, 186, 0x8000BA0C, 0x00000000 }, { &GUID_Key, 187, 0x8000BB0C, 0x00000000 }, { &GUID_Key, 188, 0x8000BC0C, 0x00000000 }, { &GUID_Key, 189, 0x8000BD0C, 0x00000000 }, { &GUID_Key, 190, 0x8000BE0C, 0x00000000 }, { &GUID_Key, 191, 0x8000BF0C, 0x00000000 }, { &GUID_Key, 192, 0x8000C00C, 0x00000000 }, { &GUID_Key, 193, 0x8000C10C, 0x00000000 }, { &GUID_Key, 194, 0x8000C20C, 0x00000000 }, { &GUID_Key, 195, 0x8000C30C, 0x00000000 }, { &GUID_Key, 196, 0x8000C40C, 0x00000000 }, { &GUID_Key, 197, 0x8000C50C, 0x00000000 }, { &GUID_Key, 198, 0x8000C60C, 0x00000000 }, { &GUID_Key, 199, 0x8000C70C, 0x00000000 }, { &GUID_Key, 200, 0x8000C80C, 0x00000000 }, { &GUID_Key, 201, 0x8000C90C, 0x00000000 }, { &GUID_Key, 202, 0x8000CA0C, 0x00000000 }, { &GUID_Key, 203, 0x8000CB0C, 0x00000000 }, { &GUID_Key, 204, 0x8000CC0C, 0x00000000 }, { &GUID_Key, 205, 0x8000CD0C, 0x00000000 }, { &GUID_Key, 206, 0x8000CE0C, 0x00000000 }, { &GUID_Key, 207, 0x8000CF0C, 0x00000000 }, { &GUID_Key, 208, 0x8000D00C, 0x00000000 }, { &GUID_Key, 209, 0x8000D10C, 0x00000000 }, { &GUID_Key, 210, 0x8000D20C, 0x00000000 }, { &GUID_Key, 211, 0x8000D30C, 0x00000000 }, { &GUID_Key, 212, 0x8000D40C, 0x00000000 }, { &GUID_Key, 213, 0x8000D50C, 0x00000000 }, { &GUID_Key, 214, 0x8000D60C, 0x00000000 }, { &GUID_Key, 215, 0x8000D70C, 0x00000000 }, { &GUID_Key, 216, 0x8000D80C, 0x00000000 }, { &GUID_Key, 217, 0x8000D90C, 0x00000000 }, { &GUID_Key, 218, 0x8000DA0C, 0x00000000 }, { &GUID_Key, 219, 0x8000DB0C, 0x00000000 }, { &GUID_Key, 220, 0x8000DC0C, 0x00000000 }, { &GUID_Key, 221, 0x8000DD0C, 0x00000000 }, { &GUID_Key, 222, 0x8000DE0C, 0x00000000 }, { &GUID_Key, 223, 0x8000DF0C, 0x00000000 }, { &GUID_Key, 224, 0x8000E00C, 0x00000000 }, { &GUID_Key, 225, 0x8000E10C, 0x00000000 }, { &GUID_Key, 226, 0x8000E20C, 0x00000000 }, { &GUID_Key, 227, 0x8000E30C, 0x00000000 }, { &GUID_Key, 228, 0x8000E40C, 0x00000000 }, { &GUID_Key, 229, 0x8000E50C, 0x00000000 }, { &GUID_Key, 230, 0x8000E60C, 0x00000000 }, { &GUID_Key, 231, 0x8000E70C, 0x00000000 }, { &GUID_Key, 232, 0x8000E80C, 0x00000000 }, { &GUID_Key, 233, 0x8000E90C, 0x00000000 }, { &GUID_Key, 234, 0x8000EA0C, 0x00000000 }, { &GUID_Key, 235, 0x8000EB0C, 0x00000000 }, { &GUID_Key, 236, 0x8000EC0C, 0x00000000 }, { &GUID_Key, 237, 0x8000ED0C, 0x00000000 }, { &GUID_Key, 238, 0x8000EE0C, 0x00000000 }, { &GUID_Key, 239, 0x8000EF0C, 0x00000000 }, { &GUID_Key, 240, 0x8000F00C, 0x00000000 }, { &GUID_Key, 241, 0x8000F10C, 0x00000000 }, { &GUID_Key, 242, 0x8000F20C, 0x00000000 }, { &GUID_Key, 243, 0x8000F30C, 0x00000000 }, { &GUID_Key, 244, 0x8000F40C, 0x00000000 }, { &GUID_Key, 245, 0x8000F50C, 0x00000000 }, { &GUID_Key, 246, 0x8000F60C, 0x00000000 }, { &GUID_Key, 247, 0x8000F70C, 0x00000000 }, { &GUID_Key, 248, 0x8000F80C, 0x00000000 }, { &GUID_Key, 249, 0x8000F90C, 0x00000000 }, { &GUID_Key, 250, 0x8000FA0C, 0x00000000 }, { &GUID_Key, 251, 0x8000FB0C, 0x00000000 }, { &GUID_Key, 252, 0x8000FC0C, 0x00000000 }, { &GUID_Key, 253, 0x8000FD0C, 0x00000000 }, { &GUID_Key, 254, 0x8000FE0C, 0x00000000 }, { &GUID_Key, 255, 0x8000FF0C, 0x00000000 }, }; const DIDATAFORMAT c_dfDIKeyboard = { 24, 16, 0x00000002, 256, 256, KBD_fmt }; /* Mouse */ static DIOBJECTDATAFORMAT PTR_fmt[] = { { &GUID_XAxis, 0, 0x00FFFF03, 0x00000000 }, { &GUID_YAxis, 4, 0x00FFFF03, 0x00000000 }, { &GUID_ZAxis, 8, 0x80FFFF03, 0x00000000 }, { NULL, 12, 0x00FFFF0C, 0x00000000 }, { NULL, 13, 0x00FFFF0C, 0x00000000 }, { NULL, 14, 0x80FFFF0C, 0x00000000 }, { NULL, 15, 0x80FFFF0C, 0x00000000 }, }; const DIDATAFORMAT c_dfDIMouse = { 24, 16, 0x00000002, 16, 7, PTR_fmt }; /* Joystick */ static DIOBJECTDATAFORMAT JOY_fmt[] = { { &GUID_XAxis, 0, 0x80FFFF03, 0x00000100 }, { &GUID_YAxis, 4, 0x80FFFF03, 0x00000100 }, { &GUID_ZAxis, 8, 0x80FFFF03, 0x00000100 }, { &GUID_RxAxis, 12, 0x80FFFF03, 0x00000100 }, { &GUID_RyAxis, 16, 0x80FFFF03, 0x00000100 }, { &GUID_RzAxis, 20, 0x80FFFF03, 0x00000100 }, { &GUID_Slider, 24, 0x80FFFF03, 0x00000100 }, { &GUID_Slider, 28, 0x80FFFF03, 0x00000100 }, { &GUID_POV, 32, 0x80FFFF10, 0x00000000 }, { &GUID_POV, 36, 0x80FFFF10, 0x00000000 }, { &GUID_POV, 40, 0x80FFFF10, 0x00000000 }, { &GUID_POV, 44, 0x80FFFF10, 0x00000000 }, { NULL, 48, 0x80FFFF0C, 0x00000000 }, { NULL, 49, 0x80FFFF0C, 0x00000000 }, { NULL, 50, 0x80FFFF0C, 0x00000000 }, { NULL, 51, 0x80FFFF0C, 0x00000000 }, { NULL, 52, 0x80FFFF0C, 0x00000000 }, { NULL, 53, 0x80FFFF0C, 0x00000000 }, { NULL, 54, 0x80FFFF0C, 0x00000000 }, { NULL, 55, 0x80FFFF0C, 0x00000000 }, { NULL, 56, 0x80FFFF0C, 0x00000000 }, { NULL, 57, 0x80FFFF0C, 0x00000000 }, { NULL, 58, 0x80FFFF0C, 0x00000000 }, { NULL, 59, 0x80FFFF0C, 0x00000000 }, { NULL, 60, 0x80FFFF0C, 0x00000000 }, { NULL, 61, 0x80FFFF0C, 0x00000000 }, { NULL, 62, 0x80FFFF0C, 0x00000000 }, { NULL, 63, 0x80FFFF0C, 0x00000000 }, { NULL, 64, 0x80FFFF0C, 0x00000000 }, { NULL, 65, 0x80FFFF0C, 0x00000000 }, { NULL, 66, 0x80FFFF0C, 0x00000000 }, { NULL, 67, 0x80FFFF0C, 0x00000000 }, { NULL, 68, 0x80FFFF0C, 0x00000000 }, { NULL, 69, 0x80FFFF0C, 0x00000000 }, { NULL, 70, 0x80FFFF0C, 0x00000000 }, { NULL, 71, 0x80FFFF0C, 0x00000000 }, { NULL, 72, 0x80FFFF0C, 0x00000000 }, { NULL, 73, 0x80FFFF0C, 0x00000000 }, { NULL, 74, 0x80FFFF0C, 0x00000000 }, { NULL, 75, 0x80FFFF0C, 0x00000000 }, { NULL, 76, 0x80FFFF0C, 0x00000000 }, { NULL, 77, 0x80FFFF0C, 0x00000000 }, { NULL, 78, 0x80FFFF0C, 0x00000000 }, { NULL, 79, 0x80FFFF0C, 0x00000000 }, }; const DIDATAFORMAT c_dfDIJoystick = { 24, 16, 0x00000001, 80, 44, JOY_fmt }; baycomusb-0.10.orig/directx/fixdirectx.sh0100755000175100017510000000070107325134424016564 0ustar abaaba#!/bin/sh # # A script to fix the DirectX includes so that gcc can compile them... #cd `dirname $0` for file in include/directx6/*.h do echo "Stripping $file..." tr -d '\r' <$file >$file.new && mv $file.new $file done # Fix the few remaining headers that have anonymous unions for file in include/directx6/d3dtypes.h do if [ -f $file ]; then echo "Fixing $file..." perl ./deunion.pl <$file >$file.new && mv $file.new $file fi done baycomusb-0.10.orig/directx/deunion.pl0100755000175100017510000000133707325134424016063 0ustar abaaba#!/usr/bin/perl # # Ack! gcc doesn't support unnamed unions -- we have to fake them. # # Expected format: # #struct blah #{ # union # { # type1 blah1; # type2 blah2; # }; #} $lineno = 0; $union = 0; $ucount = 1; while ( ($line = ) ) { ++$lineno; $line =~ s/\r//; if ( $line =~ /\sunion\s/ ) { if ( $union ) { die("Nested union at line $lineno -- Exiting.\n"); } $union = 1; } if ( $union ) { if ( $line =~ /}/ ) { if ( $line =~ /};/ ) { chomp($line); $gnuline = $line; $gnuline =~ s/};/} u$ucount;/; $line = "#if defined(NONAMELESSUNION)\n$gnuline\n#else\n$line\n#endif\n"; $ucount++; } $union = 0; } } else { if ( $line =~ /^}/ ) { $ucount = 1; } } print $line; } baycomusb-0.10.orig/kerneldrv/0042755000175100017510000000000007340500006014403 5ustar abaababaycomusb-0.10.orig/kerneldrv/Makefile.in0100644000175100017510000001440407340500006016446 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ EXTRA_DIST = baycom_usb.c baycom_usb.h baycom_usb_old.c baycom_usb_old.h baycom_usb_2.2.c baycom_usb_2.2.h baycomusb.diff usb-devio-zeropkt.diff #KINCLPATH =/usr/src/linux-2.2.18-10 #KCFLAGS =-D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-strength-reduce \ # -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=686 -DMODULE -DMODVERSIONS $(KINCLUDES) KINCLPATH = /lib/modules/2.4.2-2jnx/build/ KCC = gcc KINCLUDES = -I$(KINCLPATH)/include -include $(KINCLPATH)/include/linux/modversions.h KCFLAGS = -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -Wno-unused -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE -DMODVERSIONS -g $(KINCLUDES) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 kerneldrv/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 = kerneldrv 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 kdrv: baycom_usb.o baycom_usb.o: baycom_usb.c baycom_usb.h $(KCC) $(KCFLAGS) -c -o $@ $< # 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: baycomusb-0.10.orig/kerneldrv/Makefile.am0100644000175100017510000000152607325134424016450 0ustar abaabaEXTRA_DIST = baycom_usb.c baycom_usb.h baycom_usb_old.c baycom_usb_old.h baycom_usb_2.2.c baycom_usb_2.2.h baycomusb.diff usb-devio-zeropkt.diff #KINCLPATH =/usr/src/linux-2.2.18-10 #KCFLAGS =-D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-strength-reduce \ # -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=686 -DMODULE -DMODVERSIONS $(KINCLUDES) KINCLPATH =/lib/modules/2.4.2-2jnx/build/ KCC =gcc KINCLUDES =-I$(KINCLPATH)/include -include $(KINCLPATH)/include/linux/modversions.h KCFLAGS =-D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -Wno-unused \ -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE -DMODVERSIONS -g $(KINCLUDES) kdrv: baycom_usb.o baycom_usb.o: baycom_usb.c baycom_usb.h $(KCC) $(KCFLAGS) -c -o $@ $< baycomusb-0.10.orig/kerneldrv/baycom_usb.c0100644000175100017510000010600107325134424016675 0ustar abaaba/*****************************************************************************/ /* * baycom_usb.c -- baycom USB radio modem driver. * * Copyright (C) 2000-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 09.07.2000 Started */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "baycom_usb.h" #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) /* prototypes for ax25_encapsulate and ax25_rebuild_header */ #include #endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */ #define __KERNEL_SYSCALLS__ #include /* --------------------------------------------------------------------- */ #if LINUX_VERSION_CODE < 0x20400 #if 0 static int exec_usermodehelper(const char *path, char *argv[], char *envp[]) { int i; exit_files(current); set_fs(KERNEL_DS); /* Allow execve args to be in kernel space. */ current->uid = current->euid = current->fsuid = 0; if (execve(path, argv, envp) < 0) return -errno; return 0; } #endif extern int exec_usermodehelper(char *program_path, char *argv[], char *envp[]); #if 0 #define rw_semaphore semaphore #define init_rwsem init_MUTEX #define down_read down #define down_write down #define up_read up #define up_write up #endif struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) { int i; for (i = 0; i < dev->actconfig->bNumInterfaces; i++) if (dev->actconfig->interface[i].altsetting[0].bInterfaceNumber == ifnum) return &dev->actconfig->interface[i]; return NULL; } #endif /* --------------------------------------------------------------------- */ #define BAYCOMUSB_VENDORID 0xbac0 #define BAYCOMUSB_PRODUCTID_EMPTY 0x6134 #define BAYCOMUSB_PRODUCTID_FPGALD 0x6135 #define BAYCOMUSB_PRODUCTID_MODEM 0x6136 #define BAYCOMUSB_PRODUCTID_AUDIO 0x6137 #define MODE_NONE 0 #define MODE_FSK 1 #define MODE_EXTERNAL 2 #define MODE_AFSK 3 #define MODE_AUDIO 4 #define MODE_BSCAN 5 #define MAXFLEN 512 #define NUMRX 1 #define NUMTX 1 /* --------------------------------------------------------------------- */ static unsigned int txqueuelen = 1; MODULE_PARM(txqueuelen, "i"); MODULE_PARM_DESC(txqueuelen, "transmit queue length"); /* --------------------------------------------------------------------- */ struct baycomusb_priv { struct rw_semaphore devsem; /* protects from disconnect */ spinlock_t lock; /* protects tx */ struct usb_device *usbdev; struct usb_interface *usbiface; struct net_device netdev; #if LINUX_VERSION_CODE < 0x20400 char ifname[IFNAMSIZ]; #endif struct { urb_t *urb[NUMRX]; void *buf[NUMRX]; } rx; struct { unsigned int flgrun, flgready; urb_t *urb[NUMTX]; struct sk_buff *skb[NUMTX]; } tx; urb_t *irqurb; unsigned char irqbuf[20]; unsigned int mode; unsigned int bitrate; int slotcnt; struct channel_params { unsigned int txdelay; /* the transmitter keyup delay in in flags */ unsigned int slottime; /* the slottime in ms; usually 100ms */ unsigned int ppersist; /* the p-persistence 0..255 */ unsigned int fulldup; /* setting this just makes them send even if DCD is on */ } chpar; struct { unsigned int wr; unsigned int rd; unsigned char buf[64]; } uart; struct net_device_stats stats; }; /* --------------------------------------------------------------------- */ static const char *bc_drvname = "baycomusb"; static int baycomusb_open(struct inode *inode, struct file *file); static int baycomusb_release(struct inode *inode, struct file *file); static int baycomusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); static ssize_t baycomusb_write(struct file *file, const char *buffer, size_t count, loff_t *ppos); static ssize_t baycomusb_read(struct file *file, char *buffer, size_t count, loff_t *ppos); static void *baycomusb_probe(struct usb_device *usbdev, unsigned int ifnum, const struct usb_device_id *id); static void baycomusb_disconnect(struct usb_device *usbdev, void *ptr); static struct file_operations baycomusb_fops = { read: baycomusb_read, write: baycomusb_write, ioctl: baycomusb_ioctl, open: baycomusb_open, release: baycomusb_release, }; static struct usb_driver baycomusb_driver = { name: "baycomusb", probe: baycomusb_probe, disconnect: baycomusb_disconnect, fops: &baycomusb_fops, minor: BAYCOMUSB_MINOR_BASE }; /* --------------------------------------------------------------------- */ #define min(a, b) (((a) < (b)) ? (a) : (b)) #define max(a, b) (((a) > (b)) ? (a) : (b)) /* --------------------------------------------------------------------- */ #define KISS_VERBOSE /* --------------------------------------------------------------------- */ #define PARAM_TXDELAY 1 #define PARAM_PERSIST 2 #define PARAM_SLOTTIME 3 #define PARAM_TXTAIL 4 #define PARAM_FULLDUP 5 #define PARAM_HARDWARE 6 #define PARAM_RETURN 255 /* --------------------------------------------------------------------- */ /* * eppconfig_path should be setable via /proc/sys. */ static char baycomusb_path[256] = "/usr/sbin/baycomusb"; static char *envp[] = { "HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL }; static int errno; struct bayusbpar { unsigned int busnr; unsigned int devnr; unsigned char ifname[IFNAMSIZ]; }; static int exec_baycomusb(void *__p) { struct bayusbpar *p = (struct bayusbpar *)__p; char devarg[64]; char ifarg[128]; char *argv[] = { baycomusb_path, "-s", devarg, ifarg, NULL}; int i; /* set up arguments */ sprintf(devarg, "--device=%u:%u", p->busnr, p->devnr); if (!p->ifname[0]) { ifarg[0] = 0; argv[3] = NULL; } else sprintf(ifarg, "--ifname=%s", p->ifname); printk(KERN_DEBUG "%s: %s -s %s %s\n", bc_drvname, baycomusb_path, devarg, ifarg); i = exec_usermodehelper(baycomusb_path, argv, envp); if (i < 0) { printk(KERN_ERR "%s: failed to exec %s -s %s %s, errno = %d\n", bc_drvname, baycomusb_path, devarg, ifarg, i); return i; } return 0; } static int run_baycomusb(struct usb_device *usbdev, struct net_device *dev) { int i, pid, r; mm_segment_t fs; struct bayusbpar p; p.busnr = usbdev->bus->busnum; p.devnr = usbdev->devnum; p.ifname[0] = 0; if (dev) { strncpy(p.ifname, dev->name, sizeof(p.ifname)); p.ifname[sizeof(p.ifname)-1] = 0; } pid = kernel_thread(exec_baycomusb, &p, 0); if (pid < 0) { printk(KERN_ERR "%s: fork failed, errno %d\n", bc_drvname, -pid); return pid; } fs = get_fs(); set_fs(KERNEL_DS); /* Allow i to be in kernel space. */ r = waitpid(pid, &i, __WCLONE); set_fs(fs); if (r != pid) { printk(KERN_ERR "%s: waitpid(%d) failed, returning %d\n", bc_drvname, pid, r); return -1; } printk(KERN_DEBUG "%s: baycomusb returned %d\n", bc_drvname, i); return i; } /* ---------------------------------------------------------------------- */ static void inline do_kiss_params(struct baycomusb_priv *priv, unsigned char *data, unsigned long len) { #ifdef KISS_VERBOSE #define PKP(a,b) printk(KERN_INFO "%s: channel params: " a "\n", bc_drvname, b) #else /* KISS_VERBOSE */ #define PKP(a,b) #endif /* KISS_VERBOSE */ if (len < 2) return; switch(data[0]) { case PARAM_TXDELAY: priv->chpar.txdelay = (data[1] * priv->bitrate + 799) / 800; if (!priv->chpar.txdelay) priv->chpar.txdelay = 1; PKP("TX delay = %ums", 10 * data[1]); break; case PARAM_PERSIST: priv->chpar.ppersist = data[1]; PKP("p persistence = %u", priv->chpar.ppersist); break; case PARAM_SLOTTIME: priv->chpar.slottime = 10 * data[1]; PKP("slot time = %ums", priv->chpar.slottime); break; case PARAM_TXTAIL: PKP("TX tail = %ums", 10 * data[1]); break; case PARAM_FULLDUP: priv->chpar.fulldup = !!data[1]; PKP("%s duplex", priv->chpar.fulldup ? "full" : "half"); break; default: break; } #undef PKP } /* ---------------------------------------------------------------------- */ static unsigned short random_seed; static inline unsigned short random_num(void) { random_seed = 28629 * random_seed + 157; return random_seed; } /* --------------------------------------------------------------------- */ static void txsubmitready(struct baycomusb_priv *priv) { unsigned long flags; unsigned int strt, i; struct sk_buff *skb; int err; spin_lock_irqsave(&priv->lock, flags); strt = priv->tx.flgready & ~priv->tx.flgrun; priv->tx.flgrun |= strt; spin_unlock_irqrestore(&priv->lock, flags); if (!strt) return; for (i = 0; i < NUMTX; i++) { if (!(strt & (1 << i))) continue; priv->tx.urb[i]->dev = priv->usbdev; if ((err = usb_submit_urb(priv->tx.urb[i]))) { printk(KERN_ERR "%s: txsubmitready: submit error %d\n", bc_drvname, err); spin_lock_irqsave(&priv->lock, flags); priv->tx.flgready &= ~(1 << i); priv->tx.flgrun &= ~(1 << i); skb = priv->tx.skb[i]; priv->tx.skb[i] = NULL; spin_unlock_irqrestore(&priv->lock, flags); dev_kfree_skb(skb); netif_start_queue((&priv->netdev)); } } } static void baycomusb_irq(struct urb *urb) { struct baycomusb_priv *priv = urb->context; unsigned int strtable, i; if (urb->status) { return; } if (urb->actual_length < 5) { return; } spin_lock(&priv->lock); for (i = 5; i < urb->actual_length; i++) { priv->uart.buf[priv->uart.wr] = priv->irqbuf[i]; priv->uart.wr = (priv->uart.wr + 1) % sizeof(priv->uart.buf); if (priv->uart.wr == priv->uart.rd) priv->uart.rd = (priv->uart.rd + 1) % sizeof(priv->uart.buf); } strtable = priv->tx.flgready & ~priv->tx.flgrun; spin_unlock(&priv->lock); if (!strtable) priv->slotcnt = priv->chpar.slottime; else { priv->slotcnt -= 8; /* 8ms IRQ interval */ if (priv->slotcnt <= 0) { priv->slotcnt = priv->chpar.slottime; if (!(priv->irqbuf[0] & 0x08) && (random_num() % 256) > priv->chpar.ppersist) txsubmitready(priv); } } #if 0 printk(KERN_DEBUG "baycom_usb: irq: %02x %02x %02x %02x %02x %s TX: %02x/%02x \n", priv->irqbuf[0], priv->irqbuf[1], priv->irqbuf[2], priv->irqbuf[3], priv->irqbuf[4], netif_queue_stopped((&priv->netdev)) ? "XOFF" : "XON ", priv->tx.flgrun, priv->tx.flgready); #endif } static void baycomusb_txpacket(struct urb *urb) { struct baycomusb_priv *priv = urb->context; struct sk_buff *skb; unsigned int flgrdy, i; for (i = 0; i < NUMTX && priv->tx.urb[i] != urb; i++); if (i >= NUMTX) { printk(KERN_ERR "%s: txpacket unknown urb %p\n", bc_drvname, urb); return; } spin_lock(&priv->lock); skb = priv->tx.skb[i]; priv->tx.skb[i] = NULL; priv->tx.flgrun &= ~(1 << i); priv->tx.flgready &= ~(1 << i); flgrdy = priv->tx.flgready; spin_unlock(&priv->lock); if (skb) dev_kfree_skb(skb); if (urb->status == USB_ST_URB_KILLED) return; if (urb->status) { printk(KERN_DEBUG "%s: txpacket status %d\n", bc_drvname, urb->status); priv->stats.tx_errors++; } else priv->stats.tx_packets++; if (flgrdy != ((1 << NUMTX)-1)) netif_wake_queue((&priv->netdev)); /* double paren for kcomp.h define */ } static void baycomusb_rxpacket(struct urb *urb) { struct baycomusb_priv *priv = urb->context; struct sk_buff *skb; unsigned int pktlen, i; unsigned char *cp; int err; if (urb->status == USB_ST_URB_KILLED) return; for (i = 0; i < NUMRX && priv->rx.urb[i] != urb; i++); if (i >= NUMRX) { printk(KERN_ERR "%s: rxpacket unknown urb %p\n", bc_drvname, urb); return; } if (urb->status) { printk(KERN_DEBUG "%s: rxpacket status %d\n", bc_drvname, urb->status); priv->stats.rx_errors++; } else if (urb->actual_length > 2) { pktlen = urb->actual_length-2; /* remove CRC */ if (!(skb = dev_alloc_skb(pktlen+1))) { printk(KERN_DEBUG "%s: memory squeeze, dropping packet\n", priv->netdev.name); priv->stats.rx_dropped++; } else { cp = skb_put(skb, pktlen+1); *cp++ = 0; /* KISS kludge */ memcpy(cp, urb->transfer_buffer, pktlen); skb->dev = &priv->netdev; skb->protocol = htons(ETH_P_AX25); skb->mac.raw = skb->data; skb->pkt_type = PACKET_HOST; netif_rx(skb); priv->stats.rx_packets++; } } urb->dev = priv->usbdev; if ((err = usb_submit_urb(urb))) printk(KERN_DEBUG "%s: rxpacket error %d resubmitting rx urb\n", bc_drvname, err); } /* --------------------------------------------------------------------- */ /* * Open/initialize the board. This is called (in the current kernel) * sometime after booting when the 'ifconfig' program is run. * * This routine should set everything up anew at each open, even * registers that "should" only need to be set once at boot, so that * there is non-reboot way to recover if something goes wrong. */ static int baycomusb_opennet(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; int ret = -ENOMEM; unsigned int i; printk(KERN_DEBUG "opennet: dev %p priv %p usbdev %p\n", dev, priv, priv->usbdev); for (i = 0; i < NUMTX; i++) { if (!(priv->tx.urb[i] = usb_alloc_urb(0))) goto out; priv->tx.urb[i]->dev = priv->usbdev; priv->tx.urb[i]->pipe = usb_sndbulkpipe(priv->usbdev, 2); priv->tx.urb[i]->complete = baycomusb_txpacket; priv->tx.urb[i]->context = priv; priv->tx.urb[i]->transfer_flags = (NUMTX > 1) ? USB_QUEUE_BULK : 0; } for (i = 0; i < NUMRX; i++) { if (!(priv->rx.urb[i] = usb_alloc_urb(0)) || !(priv->rx.buf[i] = kmalloc(MAXFLEN+2, GFP_KERNEL))) goto out; priv->rx.urb[i]->dev = priv->usbdev; priv->rx.urb[i]->pipe = usb_rcvbulkpipe(priv->usbdev, 2); priv->rx.urb[i]->transfer_buffer = priv->rx.buf[i]; priv->rx.urb[i]->transfer_buffer_length = MAXFLEN+2; priv->rx.urb[i]->complete = baycomusb_rxpacket; priv->rx.urb[i]->context = priv; priv->rx.urb[i]->transfer_flags = (NUMRX > 1) ? USB_QUEUE_BULK : 0; } for (i = 0; i < NUMRX; i++) { printk(KERN_DEBUG "%s: submitting RX URB %u\n", bc_drvname, i); if ((ret = usb_submit_urb(priv->rx.urb[i]))) { printk(KERN_ERR "%s: error %d submitting receiver urb\n", bc_drvname, ret); ret = -EIO; goto out2; } } #if LINUX_VERSION_CODE < 0x20400 dev->start = 1; #endif netif_start_queue(dev); MOD_INC_USE_COUNT; return 0; out2: for (i = 0; i < NUMRX; i++) usb_unlink_urb(priv->rx.urb[i]); out: for (i = 0; i < NUMRX; i++) { if (priv->rx.urb[i]) usb_free_urb(priv->rx.urb[i]); if (priv->rx.buf[i]) kfree(priv->rx.buf[i]); priv->rx.urb[i] = NULL; priv->rx.buf[i] = NULL; } for (i = 0; i < NUMTX; i++) { if (priv->tx.urb[i]) usb_free_urb(priv->tx.urb[i]); priv->tx.urb[i] = NULL; } return ret; } /* --------------------------------------------------------------------- */ static int baycomusb_closenet(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; unsigned int i; unsigned long flags; netif_stop_queue(dev); spin_lock_irqsave(&priv->lock, flags); priv->tx.flgrun = 0; priv->tx.flgready = 0; spin_unlock_irqrestore(&priv->lock, flags); for (i = 0; i < NUMTX; i++) { usb_unlink_urb(priv->tx.urb[i]); usb_free_urb(priv->tx.urb[i]); priv->tx.urb[i] = NULL; priv->tx.skb[i] = NULL; } for (i = 0; i < NUMRX; i++) { printk(KERN_DEBUG "%s: unlinking RX URB %u\n", bc_drvname, i); usb_unlink_urb(priv->rx.urb[i]); usb_free_urb(priv->rx.urb[i]); kfree(priv->rx.buf[i]); priv->rx.urb[i] = NULL; priv->rx.buf[i] = NULL; } #if LINUX_VERSION_CODE < 0x20400 dev->start = 0; #endif MOD_DEC_USE_COUNT; return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_ioctlnet(struct net_device *dev, struct ifreq *ifr, int cmd) { struct baycomusb_priv *priv = dev->priv; if (cmd != SIOCDEVPRIVATE) return -ENOIOCTLCMD; return -ENOIOCTLCMD; } /* --------------------------------------------------------------------- */ static int baycomusb_set_mac_address(struct net_device *dev, void *addr) { struct sockaddr *sa = (struct sockaddr *)addr; /* addr is an AX.25 shifted ASCII mac address */ memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); return 0; } static struct net_device_stats *baycomusb_get_stats(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; /* * Get the current statistics. This may be called with the * card open or closed. */ return &priv->stats; } /* --------------------------------------------------------------------- */ static int baycomusb_send_packet(struct sk_buff *skb, struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; unsigned long flags; unsigned int txd, newrdy, i; struct sk_buff *skb2; if (skb->data[0] != 0) { do_kiss_params(priv, skb->data, skb->len); dev_kfree_skb(skb); return 0; } if (skb->len < 2) { dev_kfree_skb(skb); return 0; } if (skb_headroom(skb) < 1) { printk(KERN_ERR "%s: tx packet headroom < 1\n", bc_drvname); dev_kfree_skb(skb); return 0; } if (!(skb2 = skb_unshare(skb, GFP_ATOMIC))) { printk(KERN_ERR "%s: skb unshare failed\n", bc_drvname); return 0; } skb = skb2; txd = priv->chpar.txdelay; skb->data[-1] = txd; skb->data[0] = txd >> 8; spin_lock_irqsave(&priv->lock, flags); for (i = 0; i < NUMTX; i++) if (!(priv->tx.flgready & (1 << i))) break; if (i < NUMTX) { priv->tx.urb[i]->transfer_buffer = skb->data - 1; priv->tx.urb[i]->transfer_buffer_length = skb->len + 1; priv->tx.skb[i] = skb; priv->tx.flgready |= (1 << i); } newrdy = priv->tx.flgready; spin_unlock_irqrestore(&priv->lock, flags); if (newrdy == ((1 << NUMTX)-1)) netif_stop_queue(dev); if (i >= NUMTX) { printk(KERN_DEBUG "%s: send_packet: queue overrun!\n", bc_drvname); netif_stop_queue(dev); dev_kfree_skb(skb); return 0; } /* check for half duplex; start channel access state machine */ if (priv->chpar.fulldup || (priv->irqbuf[0] & 0x04)) txsubmitready(priv); return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_netinit(struct net_device *dev) { static char ax25_bcast[AX25_ADDR_LEN] = { 'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1 }; static char ax25_nocall[AX25_ADDR_LEN] = { 'L' << 1, 'I' << 1, 'N' << 1, 'U' << 1, 'X' << 1, ' ' << 1, '1' << 1 }; struct baycomusb_priv *priv = dev->priv; const struct channel_params dfltchpar = { 20, 100, 40, 0 }; /* * initialize the private struct */ priv->chpar = dfltchpar; priv->chpar.txdelay = (dfltchpar.txdelay * priv->bitrate + 799) / 800; if (!priv->chpar.txdelay) priv->chpar.txdelay = 1; /* * initialize the device struct */ dev->open = baycomusb_opennet; dev->stop = baycomusb_closenet; dev->do_ioctl = baycomusb_ioctlnet; dev->hard_start_xmit = baycomusb_send_packet; dev->get_stats = baycomusb_get_stats; /* Fill in the fields of the device structure */ dev_init_buffers(dev); #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) dev->hard_header = ax25_encapsulate; dev->rebuild_header = ax25_rebuild_header; #else /* CONFIG_AX25 || CONFIG_AX25_MODULE */ dev->hard_header = NULL; dev->rebuild_header = NULL; #endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */ dev->set_mac_address = baycomusb_set_mac_address; dev->type = ARPHRD_AX25; /* AF_AX25 device */ dev->hard_header_len = AX25_MAX_HEADER_LEN + AX25_BPQ_HEADER_LEN + 2; /* +2 to make room for TxDelay word */ dev->mtu = AX25_DEF_PACLEN; /* eth_mtu is the default */ dev->addr_len = AX25_ADDR_LEN; /* sizeof an ax.25 address */ memcpy(dev->broadcast, ax25_bcast, AX25_ADDR_LEN); memcpy(dev->dev_addr, ax25_nocall, AX25_ADDR_LEN); dev->tx_queue_len = txqueuelen; /* New style flags */ dev->flags = 0; return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_open(struct inode *inode, struct file *file) { struct baycomusb_priv *priv; if (MINOR(inode->i_rdev) != BAYCOMUSB_MINOR_BASE) return -ENODEV; if (!(priv = kmalloc(sizeof(struct baycomusb_priv), GFP_KERNEL))) return -ENOMEM; memset(priv, 0, sizeof(struct baycomusb_priv)); init_rwsem(&priv->devsem); spin_lock_init(&priv->lock); priv->netdev.priv = priv; #if LINUX_VERSION_CODE < 0x20400 priv->netdev.name = priv->ifname; #endif file->private_data = priv; MOD_INC_USE_COUNT; return 0; } static int baycomusb_release(struct inode *inode, struct file *file) { struct baycomusb_priv *priv = file->private_data; lock_kernel(); /* lock against hub thread simultaneously calling disconnect */ down_write(&priv->devsem); if (priv->usbdev) { if (priv->mode != MODE_AUDIO) unregister_netdev(&priv->netdev); usb_unlink_urb(priv->irqurb); usb_free_urb(priv->irqurb); usb_driver_release_interface(&baycomusb_driver, priv->usbiface); priv->usbdev = NULL; } up_write(&priv->devsem); kfree(priv); unlock_kernel(); MOD_DEC_USE_COUNT; return 0; } /* * the following 3 routines should only be called when holding the kernel lock; * to prevent the hub thread from changing the topology */ static struct usb_bus *baycomusb_findbus(int busnr) { struct list_head *list; struct usb_bus *bus; for (list = usb_bus_list.next; list != &usb_bus_list; list = list->next) { bus = list_entry(list, struct usb_bus, bus_list); if (bus->busnum == busnr) return bus; } return NULL; } static struct usb_device *finddev(struct usb_device *dev, int devnr) { unsigned int i; struct usb_device *d2; if (!dev) return NULL; if (dev->devnum == devnr) return dev; for (i = 0; i < dev->maxchild; i++) { if (!dev->children[i]) continue; if ((d2 = finddev(dev->children[i], devnr))) return d2; } return NULL; } static struct usb_device *baycomusb_finddevice(struct usb_bus *bus, int devnr) { return finddev(bus->root_hub, devnr); } static int start_netdev(struct baycomusb_priv *priv, struct baycomusb_startnetdev *stnetdev) { struct usb_bus *bus; struct usb_device *dev; unsigned char mode, buf[3]; unsigned int bitrate = 0; if (priv->usbdev) return -EBUSY; if (!(bus = baycomusb_findbus(stnetdev->busnr))) return -ENODEV; if (!(dev = baycomusb_finddevice(bus, stnetdev->devnr))) return -ENODEV; if ((dev->descriptor.idVendor != BAYCOMUSB_VENDORID || (dev->descriptor.idProduct != BAYCOMUSB_PRODUCTID_MODEM && dev->descriptor.idProduct != BAYCOMUSB_PRODUCTID_AUDIO))) return -ENODEV; /* We don't handle multiple configurations */ if (dev->descriptor.bNumConfigurations != 1) return -ENODEV; /* check if interface still free */ if (!(priv->usbiface = usb_ifnum_to_if(dev, 0))) return -ENODEV; if (usb_interface_claimed(priv->usbiface)) return -EBUSY; /* check if already configured */ if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0xc8, 0xc0, 0, 0, &mode, 1, 500) != 1) { printk(KERN_DEBUG "%s: uninitialized modem found at %03d:%03d\n", bc_drvname, dev->bus->busnum, dev->devnum); return -EIO; } printk(KERN_DEBUG "%s: initialized modem found at %03d:%03d, mode %u\n", bc_drvname, dev->bus->busnum, dev->devnum, (unsigned int)mode); if (mode != MODE_FSK && mode != MODE_EXTERNAL && mode != MODE_AFSK && mode != MODE_AUDIO) return -EIO; if (mode != MODE_AUDIO) { if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0xd1, 0xc0, 0, 0, buf, 3, 500) != 3) { printk(KERN_DEBUG "%s: cannot retrieve bitrate from device %03d:%03d\n", bc_drvname, dev->bus->busnum, dev->devnum); return -EIO; } bitrate = (buf[2] << 16) | (buf[1] << 8) | buf[0]; } printk(KERN_DEBUG "%s: modem at %03d:%03d has bitrate %u\n", bc_drvname, dev->bus->busnum, dev->devnum, bitrate); if (usb_set_configuration(dev, dev->config[0].bConfigurationValue) < 0) { printk(KERN_WARNING "%s: usb_set_configuration failed\n", bc_drvname); return -EIO; } if (usb_set_interface(dev, 0, 1) < 0) { printk(KERN_WARNING "%s: usb_set_interface failed\n", bc_drvname); return -EIO; } strncpy(priv->netdev.name, stnetdev->ifname, IFNAMSIZ); priv->netdev.name[IFNAMSIZ-1] = 0; priv->mode = mode; priv->bitrate = bitrate; priv->netdev.init = baycomusb_netinit; priv->usbdev = dev; priv->irqurb = usb_alloc_urb(0); priv->irqurb->dev = dev; priv->irqurb->pipe = usb_rcvintpipe(dev, 1); priv->irqurb->transfer_buffer = priv->irqbuf; priv->irqurb->transfer_buffer_length = sizeof(priv->irqbuf); priv->irqurb->complete = baycomusb_irq; priv->irqurb->context = priv; priv->irqurb->interval = 8; priv->irqurb->start_frame = -1; if (usb_submit_urb(priv->irqurb)) { printk(KERN_WARNING "%s: cannot start irq URB\n", bc_drvname); usb_free_urb(priv->irqurb); return -EIO; } if (priv->mode != MODE_AUDIO) { if (register_netdev(&priv->netdev)) { printk(KERN_WARNING "%s: cannot register net device %s\n", bc_drvname, priv->netdev.name); usb_unlink_urb(priv->irqurb); usb_free_urb(priv->irqurb); return -EEXIST; } } usb_driver_claim_interface(&baycomusb_driver, priv->usbiface, priv); return 0; } static int baycomusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct baycomusb_priv *priv = file->private_data; union { struct baycomusb_startnetdev stnetdev; struct baycomusb_status stat; struct baycomusb_receiveuart rxuart; struct baycomusb_transmituart txuart; struct baycomusb_modemdisc mdisc; struct baycomusb_t7fcontrol t7f; struct baycomusb_forceptt fptt; struct baycomusb_setleds leds; } u; unsigned char buf[8]; unsigned long flags; int r, i; switch (cmd) { case BAYCOMUSB_STARTNETDEV: if (copy_from_user(&u.stnetdev, (void *)arg, sizeof(u.stnetdev))) return -EFAULT; lock_kernel(); down_write(&priv->devsem); r = start_netdev(priv, &u.stnetdev); up_write(&priv->devsem); unlock_kernel(); return r; case BAYCOMUSB_GETSTATUS: if (!priv->usbdev) return -ENODEV; spin_lock_irqsave(&priv->lock, flags); u.stat.ptt = !!(priv->irqbuf[0] & 0x04); u.stat.dcd = !!(priv->irqbuf[0] & 0x08); u.stat.rssi = priv->irqbuf[3]; u.stat.uartchars = (sizeof(priv->uart.buf) + priv->uart.rd - priv->uart.wr) % sizeof(priv->uart.buf); spin_unlock_irqrestore(&priv->lock, flags); if (copy_to_user((void *)arg, &u.stat, sizeof(u.stat))) return -EFAULT; return 0; case BAYCOMUSB_RECEIVEUART: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (!priv->usbdev) return -ENODEV; u.rxuart.len = 0; memset(u.rxuart.buffer, 0, sizeof(u.rxuart.buffer)); spin_lock_irqsave(&priv->lock, flags); while (u.rxuart.len < sizeof(u.rxuart.buffer) && priv->uart.rd != priv->uart.wr) { if (priv->uart.wr >= priv->uart.rd) i = priv->uart.wr - priv->uart.rd; else i = sizeof(u.rxuart.buffer) - priv->uart.rd; if (i + u.rxuart.len > sizeof(u.rxuart.buffer)) i = sizeof(u.rxuart.buffer) - u.rxuart.len; memcpy(&u.rxuart.buffer[u.rxuart.len], &priv->uart.buf[priv->uart.rd], i); u.rxuart.len += i; priv->uart.rd = (priv->uart.rd + (unsigned int)i) % sizeof(priv->uart.buf); } spin_unlock_irqrestore(&priv->lock, flags); if (copy_to_user((void *)arg, &u.rxuart, sizeof(u.rxuart))) return -EFAULT; return 0; case BAYCOMUSB_TRANSMITUART: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.txuart, (void *)arg, sizeof(u.txuart))) return -EFAULT; spin_lock_irqsave(&priv->lock, flags); i = priv->irqbuf[0]; priv->irqbuf[0] &= ~0x20; spin_unlock_irqrestore(&priv->lock, flags); if (!(i & 0x20)) return -EBUSY; down_read(&priv->devsem); if (priv->usbdev) i = usb_control_msg(priv->usbdev, usb_sndctrlpipe(priv->usbdev, 0), 0xd3, 0x40, u.txuart.txchar, 0, NULL, 0, 500); else i = -ENODEV; up_read(&priv->devsem); return i; case BAYCOMUSB_MODEMDISC: if (priv->mode == MODE_EXTERNAL) return -EIO; if (copy_from_user(&u.mdisc, (void *)arg, sizeof(u.mdisc))) return -EFAULT; if ((u.mdisc.setdirection != -1 || u.mdisc.setoutput != -1) && !capable(CAP_NET_ADMIN)) return -EACCES; down_read(&priv->devsem); if (!priv->usbdev) { up_read(&priv->devsem); return -ENODEV; } if (u.mdisc.setoutput != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, u.mdisc.setoutput, 1, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } if (u.mdisc.setdirection != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, u.mdisc.setdirection, 2, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, 0, 0, buf, 3, 500); up_read(&priv->devsem); if (i < 0) return i; if (i != 3) return -EIO; u.mdisc.input = buf[0]; u.mdisc.output = buf[1]; u.mdisc.direction = buf[2]; if (copy_to_user((void *)arg, &u.mdisc, sizeof(u.mdisc))) return -EFAULT; return 0; case BAYCOMUSB_T7FCONTROL: if (copy_from_user(&u.t7f, (void *)arg, sizeof(u.t7f))) return -EFAULT; if (u.t7f.setoutput != -1 && !capable(CAP_NET_ADMIN)) return -EACCES; down_read(&priv->devsem); if (!priv->usbdev) { up_read(&priv->devsem); return -ENODEV; } if (u.t7f.setoutput != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd5, 0xc0, u.t7f.setoutput, 1, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd5, 0xc0, 0, 0, buf, 2, 500); up_read(&priv->devsem); if (i < 0) return i; if (i != 2) return -EIO; u.t7f.input = buf[0]; u.t7f.output = buf[1]; if (copy_to_user((void *)arg, &u.t7f, sizeof(u.t7f))) return -EFAULT; return 0; case BAYCOMUSB_FORCEPTT: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.fptt, (void *)arg, sizeof(u.fptt))) return -EFAULT; down_read(&priv->devsem); if (priv->usbdev) i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd0, 0xc0, u.fptt.ptt, 1, NULL, 0, 500); else i = -ENODEV; up_read(&priv->devsem); if (i < 0) return i; return 0; case BAYCOMUSB_SETLEDS: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.leds, (void *)arg, sizeof(u.leds))) return -EFAULT; down_read(&priv->devsem); if (priv->usbdev) i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd2, 0x40, u.leds.leds, 0, NULL, 0, 500); else i = -ENODEV; up_read(&priv->devsem); if (i < 0) return i; return 0; default: return -ENOIOCTLCMD; } return 0; } static ssize_t baycomusb_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct baycomusb_priv *priv = file->private_data; return -EIO; } static ssize_t baycomusb_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct baycomusb_priv *priv = file->private_data; return -EIO; } /* --------------------------------------------------------------------- */ static void *baycomusb_probe(struct usb_device *usbdev, unsigned int ifnum, const struct usb_device_id *id) { return NULL; } static void baycomusb_disconnect(struct usb_device *usbdev, void *ptr) { struct baycomusb_priv *priv = ptr; down_write(&priv->devsem); if (priv->usbdev) { if (priv->mode != MODE_AUDIO) unregister_netdev(&priv->netdev); usb_unlink_urb(priv->irqurb); usb_free_urb(priv->irqurb); usb_driver_release_interface(&baycomusb_driver, priv->usbiface); priv->usbdev = NULL; } up_write(&priv->devsem); } /* --------------------------------------------------------------------- */ static struct usb_device_id baycom_usb_table[] = { { USB_DEVICE(BAYCOMUSB_VENDORID, BAYCOMUSB_PRODUCTID_MODEM) }, { USB_DEVICE(BAYCOMUSB_VENDORID, BAYCOMUSB_PRODUCTID_AUDIO) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE(usb, baycom_usb_table); MODULE_AUTHOR("Thomas M. Sailer, t.sailer@alumni.ethz.ch"); MODULE_DESCRIPTION("Baycom USB ham radio modem driver"); static int __init baycomusb_init(void) { if (usb_register(&baycomusb_driver) < 0) return -1; printk(KERN_INFO "%s: Baycom USB driver registered.\n" KERN_INFO "%s: (C) 2000-2001 by Thomas Sailer, \n", bc_drvname, bc_drvname); return 0; } static void __exit baycomusb_cleanup(void) { usb_deregister(&baycomusb_driver); } module_init(baycomusb_init); module_exit(baycomusb_cleanup); /* --------------------------------------------------------------------- */ baycomusb-0.10.orig/kerneldrv/baycom_usb.h0100644000175100017510000000546207325134424016713 0ustar abaaba/*****************************************************************************/ /* * baycom_usb.h -- baycom USB radio modem driver, ioctl structures etc. * * Copyright (C) 2000-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 09.07.2000 Started */ /*****************************************************************************/ #ifndef _BAYCOM_USB_H #define _BAYCOM_USB_H #include #include /* -------------------------------------------------------------------- */ #define BAYCOMUSB_MINOR_BASE 240 struct baycomusb_startnetdev { unsigned int busnr; unsigned int devnr; char ifname[IFNAMSIZ]; }; #define BAYCOMUSB_STARTNETDEV _IOWR('u', 0, struct baycomusb_startnetdev) struct baycomusb_status { int ptt; int dcd; unsigned int rssi; unsigned int uartchars; }; #define BAYCOMUSB_GETSTATUS _IOWR('u', 1, struct baycomusb_status) struct baycomusb_receiveuart { unsigned int len; unsigned char buffer[64]; }; #define BAYCOMUSB_RECEIVEUART _IOWR('u', 2, struct baycomusb_receiveuart) struct baycomusb_transmituart { unsigned char txchar; }; #define BAYCOMUSB_TRANSMITUART _IOW('u', 3, struct baycomusb_transmituart) struct baycomusb_modemdisc { int setdirection; int setoutput; unsigned int input; unsigned int output; unsigned int direction; }; #define BAYCOMUSB_MODEMDISC _IOWR('u', 4, struct baycomusb_modemdisc) struct baycomusb_t7fcontrol { int setoutput; unsigned int input; unsigned int output; }; #define BAYCOMUSB_T7FCONTROL _IOWR('u', 5, struct baycomusb_t7fcontrol) struct baycomusb_forceptt { int ptt; }; #define BAYCOMUSB_FORCEPTT _IOW('u', 6, struct baycomusb_forceptt) struct baycomusb_setleds { int leds; }; #define BAYCOMUSB_SETLEDS _IOW('u', 7, struct baycomusb_setleds) /* -------------------------------------------------------------------- */ #endif /* _BAYCOM_USB_H */ baycomusb-0.10.orig/kerneldrv/baycom_usb_old.c0100644000175100017510000007522007325134424017543 0ustar abaaba/*****************************************************************************/ /* * baycom_usb.c -- baycom USB radio modem driver. * * Copyright (C) 2000 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 09.07.2000 Started */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "baycom_usb.h" #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) /* prototypes for ax25_encapsulate and ax25_rebuild_header */ #include #endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */ #define __KERNEL_SYSCALLS__ #include /* --------------------------------------------------------------------- */ #if LINUX_VERSION_CODE < 0x20400 #if 0 static int exec_usermodehelper(const char *path, char *argv[], char *envp[]) { int i; exit_files(current); set_fs(KERNEL_DS); /* Allow execve args to be in kernel space. */ current->uid = current->euid = current->fsuid = 0; if (execve(path, argv, envp) < 0) return -errno; return 0; } #endif extern int exec_usermodehelper(char *program_path, char *argv[], char *envp[]); #define rw_semaphore semaphore #define init_rwsem init_MUTEX #define down_read down #define down_write down #define up_read up #define up_write up struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) { int i; for (i = 0; i < dev->actconfig->bNumInterfaces; i++) if (dev->actconfig->interface[i].altsetting[0].bInterfaceNumber == ifnum) return &dev->actconfig->interface[i]; return NULL; } #endif /* --------------------------------------------------------------------- */ #define BAYCOMUSB_VENDORID 0xbac0 #define BAYCOMUSB_PRODUCTID 0x6134 #define MODE_NONE 0 #define MODE_FSK 1 #define MODE_EXTERNAL 2 #define MODE_AFSK 3 #define MODE_AUDIO 4 #define MODE_BSCAN 5 #define MAXFLEN 512 #define NUMRX 1 #define NUMTX 1 /* --------------------------------------------------------------------- */ struct baycomusb_priv { struct rw_semaphore devsem; /* protects from disconnect */ spinlock_t lock; /* protects tx */ struct usb_device *usbdev; struct { urb_t *urb[NUMRX]; void *buf[NUMRX]; } rx; struct { unsigned int flgrun, flgready; urb_t *urb[NUMTX]; struct sk_buff *skb[NUMTX]; } tx; urb_t *irqurb; unsigned char irqbuf[20]; unsigned int mode; unsigned int bitrate; int slotcnt; struct channel_params { unsigned int txdelay; /* the transmitter keyup delay in in flags */ unsigned int slottime; /* the slottime in ms; usually 100ms */ unsigned int ppersist; /* the p-persistence 0..255 */ unsigned int fulldup; /* setting this just makes them send even if DCD is on */ } chpar; struct { unsigned int wr; unsigned int rd; unsigned char buf[64]; } uart; struct net_device_stats stats; }; /* --------------------------------------------------------------------- */ static const char *bc_drvname = "baycomusb"; /* --------------------------------------------------------------------- */ #define min(a, b) (((a) < (b)) ? (a) : (b)) #define max(a, b) (((a) > (b)) ? (a) : (b)) /* --------------------------------------------------------------------- */ #define KISS_VERBOSE /* --------------------------------------------------------------------- */ #define PARAM_TXDELAY 1 #define PARAM_PERSIST 2 #define PARAM_SLOTTIME 3 #define PARAM_TXTAIL 4 #define PARAM_FULLDUP 5 #define PARAM_HARDWARE 6 #define PARAM_RETURN 255 /* --------------------------------------------------------------------- */ /* * eppconfig_path should be setable via /proc/sys. */ static char baycomusb_path[256] = "/usr/sbin/baycomusb"; static char *envp[] = { "HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL }; static int errno; struct bayusbpar { unsigned int busnr; unsigned int devnr; unsigned char ifname[IFNAMSIZ]; }; static int exec_baycomusb(void *__p) { struct bayusbpar *p = (struct bayusbpar *)__p; char devarg[64]; char ifarg[128]; char *argv[] = { baycomusb_path, "-s", devarg, ifarg, NULL}; int i; /* set up arguments */ sprintf(devarg, "--device=%u:%u", p->busnr, p->devnr); if (!p->ifname[0]) { ifarg[0] = 0; argv[3] = NULL; } else sprintf(ifarg, "--ifname=%s", p->ifname); printk(KERN_DEBUG "%s: %s -s %s %s\n", bc_drvname, baycomusb_path, devarg, ifarg); i = exec_usermodehelper(baycomusb_path, argv, envp); if (i < 0) { printk(KERN_ERR "%s: failed to exec %s -s %s %s, errno = %d\n", bc_drvname, baycomusb_path, devarg, ifarg, i); return i; } return 0; } static int run_baycomusb(struct usb_device *usbdev, struct net_device *dev) { int i, pid, r; mm_segment_t fs; struct bayusbpar p; p.busnr = usbdev->bus->busnum; p.devnr = usbdev->devnum; p.ifname[0] = 0; if (dev) { strncpy(p.ifname, dev->name, sizeof(p.ifname)); p.ifname[sizeof(p.ifname)-1] = 0; } pid = kernel_thread(exec_baycomusb, &p, 0); if (pid < 0) { printk(KERN_ERR "%s: fork failed, errno %d\n", bc_drvname, -pid); return pid; } fs = get_fs(); set_fs(KERNEL_DS); /* Allow i to be in kernel space. */ r = waitpid(pid, &i, __WCLONE); set_fs(fs); if (r != pid) { printk(KERN_ERR "%s: waitpid(%d) failed, returning %d\n", bc_drvname, pid, r); return -1; } printk(KERN_DEBUG "%s: baycomusb returned %d\n", bc_drvname, i); return i; } /* ---------------------------------------------------------------------- */ static void inline do_kiss_params(struct baycomusb_priv *priv, unsigned char *data, unsigned long len) { #ifdef KISS_VERBOSE #define PKP(a,b) printk(KERN_INFO "%s: channel params: " a "\n", bc_drvname, b) #else /* KISS_VERBOSE */ #define PKP(a,b) #endif /* KISS_VERBOSE */ if (len < 2) return; switch(data[0]) { case PARAM_TXDELAY: priv->chpar.txdelay = (data[1] * priv->bitrate + 799) / 800; if (!priv->chpar.txdelay) priv->chpar.txdelay = 1; PKP("TX delay = %ums", 10 * data[1]); break; case PARAM_PERSIST: priv->chpar.ppersist = data[1]; PKP("p persistence = %u", priv->chpar.ppersist); break; case PARAM_SLOTTIME: priv->chpar.slottime = 10 * data[1]; PKP("slot time = %ums", priv->chpar.slottime); break; case PARAM_TXTAIL: PKP("TX tail = %ums", 10 * data[1]); break; case PARAM_FULLDUP: priv->chpar.fulldup = !!data[1]; PKP("%s duplex", priv->chpar.fulldup ? "full" : "half"); break; default: break; } #undef PKP } /* ---------------------------------------------------------------------- */ static unsigned short random_seed; static inline unsigned short random_num(void) { random_seed = 28629 * random_seed + 157; return random_seed; } /* --------------------------------------------------------------------- */ static void txsubmitready(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; unsigned long flags; unsigned int strt, i; struct sk_buff *skb; int err; spin_lock_irqsave(&priv->lock, flags); strt = priv->tx.flgready & ~priv->tx.flgrun; priv->tx.flgrun |= strt; spin_unlock_irqrestore(&priv->lock, flags); if (!strt) return; for (i = 0; i < NUMTX; i++) { if (!(strt & (1 << i))) continue; if ((err = usb_submit_urb(priv->tx.urb[i]))) { printk(KERN_ERR "%s: txsubmitready: submit error %d\n", bc_drvname, err); spin_lock_irqsave(&priv->lock, flags); priv->tx.flgready &= ~(1 << i); priv->tx.flgrun &= ~(1 << i); skb = priv->tx.skb[i]; priv->tx.skb[i] = NULL; spin_unlock_irqrestore(&priv->lock, flags); dev_kfree_skb(skb); netif_start_queue(dev); } } } static void baycomusb_irq(struct urb *urb) { struct net_device *dev = urb->context; struct baycomusb_priv *priv = dev->priv; unsigned int strtable, i; if (urb->status) { return; } if (urb->actual_length < 5) { return; } spin_lock(&priv->lock); for (i = 5; i < urb->actual_length; i++) { priv->uart.buf[priv->uart.wr] = priv->irqbuf[i]; priv->uart.wr = (priv->uart.wr + 1) % sizeof(priv->uart.buf); if (priv->uart.wr == priv->uart.rd) priv->uart.rd = (priv->uart.rd + 1) % sizeof(priv->uart.buf); } strtable = priv->tx.flgready & ~priv->tx.flgrun; spin_unlock(&priv->lock); if (!strtable) priv->slotcnt = priv->chpar.slottime; else { priv->slotcnt -= 8; /* 8ms IRQ interval */ if (priv->slotcnt <= 0) { priv->slotcnt = priv->chpar.slottime; if (!(priv->irqbuf[0] & 0x08) && (random_num() % 256) > priv->chpar.ppersist) txsubmitready(dev); } } } static void baycomusb_txpacket(struct urb *urb) { struct net_device *dev = urb->context; struct baycomusb_priv *priv = dev->priv; struct sk_buff *skb; unsigned int flgrdy, i; for (i = 0; i < NUMTX && priv->tx.urb[i] != urb; i++); if (i >= NUMTX) { printk(KERN_ERR "%s: txpacket unknown urb %p\n", bc_drvname, urb); return; } spin_lock(&priv->lock); skb = priv->tx.skb[i]; priv->tx.skb[i] = NULL; priv->tx.flgrun &= ~(1 << i); priv->tx.flgready &= ~(1 << i); flgrdy = priv->tx.flgready; spin_unlock(&priv->lock); if (skb) dev_kfree_skb(skb); if (urb->status == USB_ST_URB_KILLED) return; if (urb->status) { printk(KERN_DEBUG "%s: txpacket status %d\n", bc_drvname, urb->status); priv->stats.tx_errors++; } else priv->stats.tx_packets++; if (flgrdy != ((1 << NUMTX)-1)) netif_wake_queue(dev); } static void baycomusb_rxpacket(struct urb *urb) { struct net_device *dev = urb->context; struct baycomusb_priv *priv = dev->priv; struct sk_buff *skb; unsigned int pktlen, i; unsigned char *cp; int err; if (urb->status == USB_ST_URB_KILLED) return; for (i = 0; i < NUMRX && priv->rx.urb[i] != urb; i++); if (i >= NUMRX) { printk(KERN_ERR "%s: rxpacket unknown urb %p\n", bc_drvname, urb); return; } if (urb->status) { printk(KERN_DEBUG "%s: rxpacket status %d\n", bc_drvname, urb->status); priv->stats.rx_errors++; } else if (urb->actual_length > 2) { pktlen = urb->actual_length-2; /* remove CRC */ if (!(skb = dev_alloc_skb(pktlen+1))) { printk(KERN_DEBUG "%s: memory squeeze, dropping packet\n", dev->name); priv->stats.rx_dropped++; } else { cp = skb_put(skb, pktlen+1); *cp++ = 0; /* KISS kludge */ memcpy(cp, urb->transfer_buffer, pktlen); skb->dev = dev; skb->protocol = htons(ETH_P_AX25); skb->mac.raw = skb->data; skb->pkt_type = PACKET_HOST; netif_rx(skb); priv->stats.rx_packets++; } } if ((err = usb_submit_urb(urb))) printk(KERN_DEBUG "%s: rxpacket error %d resubmitting rx urb\n", bc_drvname, err); } /* --------------------------------------------------------------------- */ /* * Open/initialize the board. This is called (in the current kernel) * sometime after booting when the 'ifconfig' program is run. * * This routine should set everything up anew at each open, even * registers that "should" only need to be set once at boot, so that * there is non-reboot way to recover if something goes wrong. */ static int baycomusb_open(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; int ret = -ENOMEM; unsigned int i; for (i = 0; i < NUMTX; i++) { if (!(priv->tx.urb[i] = usb_alloc_urb(0))) goto out; priv->tx.urb[i]->dev = priv->usbdev; priv->tx.urb[i]->pipe = usb_sndbulkpipe(priv->usbdev, 2); priv->tx.urb[i]->complete = baycomusb_txpacket; priv->tx.urb[i]->context = dev; priv->tx.urb[i]->transfer_flags = (NUMTX > 1) ? USB_QUEUE_BULK : 0; } for (i = 0; i < NUMRX; i++) { if (!(priv->rx.urb[i] = usb_alloc_urb(0)) || !(priv->rx.buf[i] = kmalloc(MAXFLEN+2, GFP_KERNEL))) goto out; priv->rx.urb[i]->dev = priv->usbdev; priv->rx.urb[i]->pipe = usb_rcvbulkpipe(priv->usbdev, 2); priv->rx.urb[i]->transfer_buffer = priv->rx.buf[i]; priv->rx.urb[i]->transfer_buffer_length = MAXFLEN+2; priv->rx.urb[i]->complete = baycomusb_rxpacket; priv->rx.urb[i]->context = dev; priv->rx.urb[i]->transfer_flags = (NUMRX > 1) ? USB_QUEUE_BULK : 0; } for (i = 0; i < NUMRX; i++) if ((ret = usb_submit_urb(priv->rx.urb[i]))) { printk(KERN_ERR "%s: error %d submitting receiver urb\n", bc_drvname, ret); ret = -EIO; goto out2; } #if LINUX_VERSION_CODE < 0x20400 dev->start = 1; #endif netif_start_queue(dev); MOD_INC_USE_COUNT; return 0; out2: for (i = 0; i < NUMRX; i++) usb_unlink_urb(priv->rx.urb[i]); out: for (i = 0; i < NUMRX; i++) { if (priv->rx.urb[i]) usb_free_urb(priv->rx.urb[i]); if (priv->rx.buf[i]) kfree(priv->rx.buf[i]); priv->rx.urb[i] = NULL; priv->rx.buf[i] = NULL; } for (i = 0; i < NUMTX; i++) { if (priv->tx.urb[i]) usb_free_urb(priv->tx.urb[i]); priv->tx.urb[i] = NULL; } return ret; } /* --------------------------------------------------------------------- */ static int baycomusb_close(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; unsigned int i; unsigned long flags; netif_stop_queue(dev); spin_lock_irqsave(&priv->lock, flags); priv->tx.flgrun = 0; priv->tx.flgready = 0; spin_unlock_irqrestore(&priv->lock, flags); for (i = 0; i < NUMTX; i++) { usb_unlink_urb(priv->tx.urb[i]); usb_free_urb(priv->tx.urb[i]); priv->tx.urb[i] = NULL; priv->tx.skb[i] = NULL; } for (i = 0; i < NUMRX; i++) { usb_unlink_urb(priv->rx.urb[i]); usb_free_urb(priv->rx.urb[i]); kfree(priv->rx.buf[i]); priv->rx.urb[i] = NULL; priv->rx.buf[i] = NULL; } #if LINUX_VERSION_CODE < 0x20400 dev->start = 0; #endif MOD_DEC_USE_COUNT; return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { struct baycomusb_priv *priv = dev->priv; union { struct baycomusb_status stat; struct baycomusb_device dev; struct baycomusb_receiveuart rxuart; struct baycomusb_transmituart txuart; struct baycomusb_modemdisc mdisc; struct baycomusb_t7fcontrol t7f; struct baycomusb_forceptt fptt; struct baycomusb_setleds leds; } u; unsigned char buf[8]; unsigned long flags; int i; if (cmd != SIOCDEVPRIVATE) return -ENOIOCTLCMD; if (get_user(cmd, (int *)ifr->ifr_data)) return -EFAULT; switch (cmd) { case BAYCOMUSB_GETSTATUS: u.stat.cmd = cmd; spin_lock_irqsave(&priv->lock, flags); u.stat.ptt = !!(priv->irqbuf[0] & 0x04); u.stat.dcd = !!(priv->irqbuf[0] & 0x08); u.stat.rssi = priv->irqbuf[3]; u.stat.uartchars = (sizeof(priv->uart.buf) + priv->uart.rd - priv->uart.wr) % sizeof(priv->uart.buf); spin_unlock_irqrestore(&priv->lock, flags); if (copy_to_user(ifr->ifr_data, &u.stat, sizeof(u.stat))) return -EFAULT; return 0; case BAYCOMUSB_GETDEVICE: u.dev.cmd = cmd; u.dev.bitrate = priv->bitrate; u.dev.busnr = priv->usbdev->bus->busnum; u.dev.devnr = priv->usbdev->devnum; memset(u.dev.serial, 0, sizeof(u.dev.serial)); down_read(&priv->devsem); i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xc9, 0xc0, 0, 0, u.dev.serial, sizeof(u.dev.serial)-1, 500); up_read(&priv->devsem); if (i < 0 || i >= sizeof(u.dev.serial)) i = 0; u.dev.serial[i] = 0; if (copy_to_user(ifr->ifr_data, &u.dev, sizeof(u.dev))) return -EFAULT; return 0; case BAYCOMUSB_RECEIVEUART: if (!capable(CAP_NET_ADMIN)) return -EACCES; u.rxuart.cmd = cmd; u.rxuart.len = 0; memset(u.rxuart.buffer, 0, sizeof(u.rxuart.buffer)); spin_lock_irqsave(&priv->lock, flags); while (u.rxuart.len < sizeof(u.rxuart.buffer) && priv->uart.rd != priv->uart.wr) { if (priv->uart.wr >= priv->uart.rd) i = priv->uart.wr - priv->uart.rd; else i = sizeof(u.rxuart.buffer) - priv->uart.rd; if (i + u.rxuart.len > sizeof(u.rxuart.buffer)) i = sizeof(u.rxuart.buffer) - u.rxuart.len; memcpy(&u.rxuart.buffer[u.rxuart.len], &priv->uart.buf[priv->uart.rd], i); u.rxuart.len += i; priv->uart.rd = (priv->uart.rd + (unsigned int)i) % sizeof(priv->uart.buf); } spin_unlock_irqrestore(&priv->lock, flags); if (copy_to_user(ifr->ifr_data, &u.rxuart, sizeof(u.rxuart))) return -EFAULT; return 0; case BAYCOMUSB_TRANSMITUART: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.txuart, ifr->ifr_data, sizeof(u.txuart))) return -EFAULT; spin_lock_irqsave(&priv->lock, flags); i = priv->irqbuf[0]; priv->irqbuf[0] &= ~0x20; spin_unlock_irqrestore(&priv->lock, flags); if (!(i & 0x20)) return -EBUSY; down_read(&priv->devsem); i = usb_control_msg(priv->usbdev, usb_sndctrlpipe(priv->usbdev, 0), 0xd3, 0x40, u.txuart.txchar, 0, NULL, 0, 500); up_read(&priv->devsem); return i; case BAYCOMUSB_MODEMDISC: if (priv->mode == MODE_EXTERNAL) return -EIO; if (copy_from_user(&u.mdisc, ifr->ifr_data, sizeof(u.mdisc))) return -EFAULT; if ((u.mdisc.setdirection != -1 || u.mdisc.setoutput != -1) && !capable(CAP_NET_ADMIN)) return -EACCES; down_read(&priv->devsem); if (u.mdisc.setoutput != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, u.mdisc.setoutput, 1, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } if (u.mdisc.setdirection != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, u.mdisc.setdirection, 2, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, 0, 0, buf, 3, 500); up_read(&priv->devsem); if (i < 0) return i; if (i != 3) return -EIO; u.mdisc.input = buf[0]; u.mdisc.output = buf[1]; u.mdisc.direction = buf[2]; if (copy_to_user(ifr->ifr_data, &u.mdisc, sizeof(u.mdisc))) return -EFAULT; return 0; case BAYCOMUSB_T7FCONTROL: if (copy_from_user(&u.t7f, ifr->ifr_data, sizeof(u.t7f))) return -EFAULT; if (u.t7f.setoutput != -1 && !capable(CAP_NET_ADMIN)) return -EACCES; down_read(&priv->devsem); if (u.t7f.setoutput != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd5, 0xc0, u.t7f.setoutput, 1, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd5, 0xc0, 0, 0, buf, 2, 500); up_read(&priv->devsem); if (i < 0) return i; if (i != 2) return -EIO; u.t7f.input = buf[0]; u.t7f.output = buf[1]; if (copy_to_user(ifr->ifr_data, &u.t7f, sizeof(u.t7f))) return -EFAULT; return 0; case BAYCOMUSB_FORCEPTT: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.fptt, ifr->ifr_data, sizeof(u.fptt))) return -EFAULT; down_read(&priv->devsem); i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd0, 0xc0, u.fptt.ptt, 1, NULL, 0, 500); up_read(&priv->devsem); if (i < 0) return i; return 0; case BAYCOMUSB_SETLEDS: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.leds, ifr->ifr_data, sizeof(u.leds))) return -EFAULT; down_read(&priv->devsem); i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd2, 0x40, u.leds.leds, 0, NULL, 0, 500); up_read(&priv->devsem); if (i < 0) return i; return 0; default: return -ENOIOCTLCMD; } return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_set_mac_address(struct net_device *dev, void *addr) { struct sockaddr *sa = (struct sockaddr *)addr; /* addr is an AX.25 shifted ASCII mac address */ memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); return 0; } static struct net_device_stats *baycomusb_get_stats(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; /* * Get the current statistics. This may be called with the * card open or closed. */ return &priv->stats; } /* --------------------------------------------------------------------- */ static int baycomusb_send_packet(struct sk_buff *skb, struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; unsigned long flags; unsigned int txd, newrdy, i; struct sk_buff *skb2; if (skb->data[0] != 0) { do_kiss_params(priv, skb->data, skb->len); dev_kfree_skb(skb); return 0; } if (skb->len < 2) { dev_kfree_skb(skb); return 0; } if (skb_headroom(skb) < 1) { printk(KERN_ERR "%s: tx packet headroom < 1\n", bc_drvname); dev_kfree_skb(skb); return 0; } if (!(skb2 = skb_unshare(skb, GFP_ATOMIC))) { printk(KERN_ERR "%s: skb unshare failed\n", bc_drvname); return 0; } skb = skb2; txd = priv->chpar.txdelay; skb->data[-1] = txd; skb->data[0] = txd >> 8; spin_lock_irqsave(&priv->lock, flags); for (i = 0; i < NUMTX; i++) if (!(priv->tx.flgready & (1 << i))) break; if (i < NUMTX) { priv->tx.urb[i]->transfer_buffer = skb->data - 1; priv->tx.urb[i]->transfer_buffer_length = skb->len + 1; priv->tx.skb[i] = skb; priv->tx.flgready |= (1 << i); } newrdy = priv->tx.flgready; spin_unlock_irqrestore(&priv->lock, flags); if (newrdy == ((1 << NUMTX)-1)) netif_stop_queue(dev); if (i >= NUMTX) { printk(KERN_DEBUG "%s: send_packet: queue overrun!\n", bc_drvname); netif_stop_queue(dev); dev_kfree_skb(skb); return 0; } /* check for half duplex; start channel access state machine */ if (priv->chpar.fulldup || (priv->irqbuf[0] & 0x04)) txsubmitready(dev); return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_netinit(struct net_device *dev) { static char ax25_bcast[AX25_ADDR_LEN] = { 'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1 }; static char ax25_nocall[AX25_ADDR_LEN] = { 'L' << 1, 'I' << 1, 'N' << 1, 'U' << 1, 'X' << 1, ' ' << 1, '1' << 1 }; struct baycomusb_priv *priv = dev->priv; const struct channel_params dfltchpar = { 20, 100, 40, 0 }; /* * initialize the private struct */ priv->chpar = dfltchpar; priv->chpar.txdelay = (dfltchpar.txdelay * priv->bitrate + 799) / 800; if (!priv->chpar.txdelay) priv->chpar.txdelay = 1; /* * initialize the device struct */ dev->open = baycomusb_open; dev->stop = baycomusb_close; dev->do_ioctl = baycomusb_ioctl; dev->hard_start_xmit = baycomusb_send_packet; dev->get_stats = baycomusb_get_stats; /* Fill in the fields of the device structure */ dev_init_buffers(dev); #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) dev->hard_header = ax25_encapsulate; dev->rebuild_header = ax25_rebuild_header; #else /* CONFIG_AX25 || CONFIG_AX25_MODULE */ dev->hard_header = NULL; dev->rebuild_header = NULL; #endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */ dev->set_mac_address = baycomusb_set_mac_address; dev->type = ARPHRD_AX25; /* AF_AX25 device */ dev->hard_header_len = AX25_MAX_HEADER_LEN + AX25_BPQ_HEADER_LEN + 2; /* +2 to make room for TxDelay word */ dev->mtu = AX25_DEF_PACLEN; /* eth_mtu is the default */ dev->addr_len = AX25_ADDR_LEN; /* sizeof an ax.25 address */ memcpy(dev->broadcast, ax25_bcast, AX25_ADDR_LEN); memcpy(dev->dev_addr, ax25_nocall, AX25_ADDR_LEN); dev->tx_queue_len = 16; /* New style flags */ dev->flags = 0; return 0; } /* --------------------------------------------------------------------- */ static void *baycomusb_probe(struct usb_device *usbdev, unsigned int ifnum); static void baycomusb_disconnect(struct usb_device *usbdev, void *ptr); static struct usb_driver baycomusb_driver = { "baycomusb", baycomusb_probe, baycomusb_disconnect, { NULL, NULL } }; static void *baycomusb_probe(struct usb_device *usbdev, unsigned int ifnum) { static unsigned int netifnumber = 0; struct net_device *dev; struct baycomusb_priv *priv; unsigned int bitrate = 0; unsigned char mode, buf[3]; int actlen; if ((usbdev->descriptor.idVendor != BAYCOMUSB_VENDORID || usbdev->descriptor.idProduct != BAYCOMUSB_PRODUCTID)) return NULL; /* We don't handle multiple configurations */ if (usbdev->descriptor.bNumConfigurations != 1) return NULL; /* we do all probing for the first interface */ if (ifnum) return NULL; /* check if already configured */ if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0xc8, 0xc0, 0, 0, &mode, 1, 500) != 1) { printk(KERN_DEBUG "%s: uninitialized modem found at %03d:%03d\n", bc_drvname, usbdev->bus->busnum, usbdev->devnum); /* run usermode helper to download firmware to modem */ #if 0 run_baycomusb(usbdev, NULL); #endif return NULL; } printk(KERN_DEBUG "%s: initialized modem found at %03d:%03d, mode %u\n", bc_drvname, usbdev->bus->busnum, usbdev->devnum, (unsigned int)mode); if (mode != MODE_FSK && mode != MODE_EXTERNAL && mode != MODE_AFSK && mode != MODE_AUDIO) return NULL; if (mode != MODE_AUDIO) { if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0xd1, 0xc0, 0, 0, buf, 3, 500) != 3) { printk(KERN_DEBUG "%s: cannot retrieve bitrate from device %03d:%03d\n", bc_drvname, usbdev->bus->busnum, usbdev->devnum); return NULL; } bitrate = (buf[2] << 16) | (buf[1] << 8) | buf[0]; } printk(KERN_DEBUG "%s: modem at %03d:%03d has bitrate %u\n", bc_drvname, usbdev->bus->busnum, usbdev->devnum, bitrate); if (usb_set_configuration(usbdev, usbdev->config[0].bConfigurationValue) < 0) { printk(KERN_WARNING "%s: usb_set_configuration failed\n", bc_drvname); return NULL; } if (usb_set_interface(usbdev, 0, 1) < 0) { printk(KERN_WARNING "%s: usb_set_interface failed\n", bc_drvname); return NULL; } if (mode != MODE_AUDIO) { /* kludge: the first OUT2 packet seems to arrive corrupted, so send this special "magic" packet */ buf[0] = 0x55; if (usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 2), buf, 1, &actlen, 500) || actlen != 1) { printk(KERN_ERR "%s: usb_bulk_msg error device %03d:%03d\n", bc_drvname, usbdev->bus->busnum, usbdev->devnum); } } dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); memset(dev, 0, sizeof(struct net_device)); priv = dev->priv = kmalloc(sizeof(struct baycomusb_priv), GFP_KERNEL); memset(priv, 0, sizeof(struct baycomusb_priv)); dev->init = baycomusb_netinit; #if LINUX_VERSION_CODE < 0x20400 dev->name = kmalloc(IFNAMSIZ, GFP_KERNEL); #endif sprintf(dev->name, "bcux%d", netifnumber++); init_rwsem(&priv->devsem); spin_lock_init(&priv->lock); priv->usbdev = usbdev; priv->mode = mode; priv->bitrate = bitrate; if (register_netdev(dev)) { printk(KERN_WARNING "%s: cannot register net device %s\n", bc_drvname, dev->name); kfree(dev->priv); kfree(dev); return NULL; } priv->irqurb = usb_alloc_urb(0); priv->irqurb->dev = usbdev; priv->irqurb->pipe = usb_rcvintpipe(usbdev, 1); priv->irqurb->transfer_buffer = priv->irqbuf; priv->irqurb->transfer_buffer_length = sizeof(priv->irqbuf); priv->irqurb->complete = baycomusb_irq; priv->irqurb->context = dev; priv->irqurb->interval = 8; priv->irqurb->start_frame = -1; if (usb_submit_urb(priv->irqurb)) { printk(KERN_WARNING "%s: cannot start irq URB\n", bc_drvname); usb_free_urb(priv->irqurb); unregister_netdev(dev); kfree(dev->priv); kfree(dev); return NULL; } #if 0 /* run usermode helper to perform final configuration */ run_baycomusb(usbdev, dev); #endif MOD_INC_USE_COUNT; return dev; } static void baycomusb_disconnect(struct usb_device *usbdev, void *ptr) { struct net_device *dev = ptr; struct baycomusb_priv *priv = dev->priv; down_write(&priv->devsem); unregister_netdev(dev); up_write(&priv->devsem); usb_unlink_urb(priv->irqurb); usb_free_urb(priv->irqurb); kfree(dev->priv); #if LINUX_VERSION_CODE < 0x20400 kfree(dev->name); #endif kfree(dev); MOD_DEC_USE_COUNT; } /* --------------------------------------------------------------------- */ MODULE_AUTHOR("Thomas M. Sailer, sailer@ife.ee.ethz.ch"); MODULE_DESCRIPTION("Baycom USB ham radio modem driver"); static int __init baycomusb_init(void) { if (usb_register(&baycomusb_driver) < 0) return -1; printk(KERN_INFO "%s: Baycom USB driver registered.\n" KERN_INFO "%s: (C) 2000 by Thomas Sailer, \n", bc_drvname, bc_drvname); return 0; } static void __exit baycomusb_cleanup(void) { usb_deregister(&baycomusb_driver); } module_init(baycomusb_init); module_exit(baycomusb_cleanup); /* --------------------------------------------------------------------- */ baycomusb-0.10.orig/kerneldrv/baycom_usb_old.h0100644000175100017510000000547507325134424017555 0ustar abaaba/*****************************************************************************/ /* * baycom_usb.h -- baycom USB radio modem driver, ioctl structures etc. * * Copyright (C) 2000 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 09.07.2000 Started */ /*****************************************************************************/ #ifndef _BAYCOM_USB_H #define _BAYCOM_USB_H #include /* -------------------------------------------------------------------- */ struct baycomusb_status { int cmd; int ptt; int dcd; unsigned int rssi; unsigned int uartchars; }; #define BAYCOMUSB_GETSTATUS _IOWR('u', 0, struct baycomusb_status) struct baycomusb_device { int cmd; int busnr; int devnr; unsigned int bitrate; unsigned char serial[16]; }; #define BAYCOMUSB_GETDEVICE _IOWR('u', 1, struct baycomusb_device) struct baycomusb_receiveuart { int cmd; unsigned int len; unsigned char buffer[64]; }; #define BAYCOMUSB_RECEIVEUART _IOWR('u', 2, struct baycomusb_receiveuart) struct baycomusb_transmituart { int cmd; unsigned char txchar; }; #define BAYCOMUSB_TRANSMITUART _IOW('u', 3, struct baycomusb_transmituart) struct baycomusb_modemdisc { int cmd; int setdirection; int setoutput; unsigned int input; unsigned int output; unsigned int direction; }; #define BAYCOMUSB_MODEMDISC _IOWR('u', 4, struct baycomusb_modemdisc) struct baycomusb_t7fcontrol { int cmd; int setoutput; unsigned int input; unsigned int output; }; #define BAYCOMUSB_T7FCONTROL _IOWR('u', 5, struct baycomusb_t7fcontrol) struct baycomusb_forceptt { int cmd; int ptt; }; #define BAYCOMUSB_FORCEPTT _IOW('u', 6, struct baycomusb_forceptt) struct baycomusb_setleds { int cmd; int leds; }; #define BAYCOMUSB_SETLEDS _IOW('u', 7, struct baycomusb_setleds) /* -------------------------------------------------------------------- */ #endif /* _BAYCOM_USB_H */ baycomusb-0.10.orig/kerneldrv/baycom_usb_2.2.c0100644000175100017510000010460007325134424017261 0ustar abaaba/*****************************************************************************/ /* * baycom_usb.c -- baycom USB radio modem driver. * * Copyright (C) 2000 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 09.07.2000 Started */ /*****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "baycom_usb.h" #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) /* prototypes for ax25_encapsulate and ax25_rebuild_header */ #include #endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */ #define __KERNEL_SYSCALLS__ #include /* --------------------------------------------------------------------- */ #if LINUX_VERSION_CODE < 0x20400 #if 0 static int exec_usermodehelper(const char *path, char *argv[], char *envp[]) { int i; exit_files(current); set_fs(KERNEL_DS); /* Allow execve args to be in kernel space. */ current->uid = current->euid = current->fsuid = 0; if (execve(path, argv, envp) < 0) return -errno; return 0; } #endif extern int exec_usermodehelper(char *program_path, char *argv[], char *envp[]); #define rw_semaphore semaphore #define init_rwsem init_MUTEX #define down_read down #define down_write down #define up_read up #define up_write up struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) { int i; for (i = 0; i < dev->actconfig->bNumInterfaces; i++) if (dev->actconfig->interface[i].altsetting[0].bInterfaceNumber == ifnum) return &dev->actconfig->interface[i]; return NULL; } #endif /* --------------------------------------------------------------------- */ #define BAYCOMUSB_VENDORID 0xbac0 #define BAYCOMUSB_PRODUCTID_EMPTY 0x6134 #define BAYCOMUSB_PRODUCTID_MODEM 0x6135 #define BAYCOMUSB_PRODUCTID_AUDIO 0x6136 #define MODE_NONE 0 #define MODE_FSK 1 #define MODE_EXTERNAL 2 #define MODE_AFSK 3 #define MODE_AUDIO 4 #define MODE_BSCAN 5 #define MAXFLEN 512 #define NUMRX 1 #define NUMTX 1 /* --------------------------------------------------------------------- */ static unsigned int txqueuelen = 1; MODULE_PARM(txqueuelen, "i"); MODULE_PARM_DESC(txqueuelen, "transmit queue length"); /* --------------------------------------------------------------------- */ struct baycomusb_priv { struct rw_semaphore devsem; /* protects from disconnect */ spinlock_t lock; /* protects tx */ struct usb_device *usbdev; struct usb_interface *usbiface; struct net_device netdev; #if LINUX_VERSION_CODE < 0x20400 char ifname[IFNAMSIZ]; #endif struct { urb_t *urb[NUMRX]; void *buf[NUMRX]; } rx; struct { unsigned int flgrun, flgready; urb_t *urb[NUMTX]; struct sk_buff *skb[NUMTX]; } tx; urb_t *irqurb; unsigned char irqbuf[20]; unsigned int mode; unsigned int bitrate; int slotcnt; struct channel_params { unsigned int txdelay; /* the transmitter keyup delay in in flags */ unsigned int slottime; /* the slottime in ms; usually 100ms */ unsigned int ppersist; /* the p-persistence 0..255 */ unsigned int fulldup; /* setting this just makes them send even if DCD is on */ } chpar; struct { unsigned int wr; unsigned int rd; unsigned char buf[64]; } uart; struct net_device_stats stats; }; /* --------------------------------------------------------------------- */ static const char *bc_drvname = "baycomusb"; static int baycomusb_open(struct inode *inode, struct file *file); static int baycomusb_release(struct inode *inode, struct file *file); static int baycomusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); static ssize_t baycomusb_write(struct file *file, const char *buffer, size_t count, loff_t *ppos); static ssize_t baycomusb_read(struct file *file, char *buffer, size_t count, loff_t *ppos); static void *baycomusb_probe(struct usb_device *usbdev, unsigned int ifnum); static void baycomusb_disconnect(struct usb_device *usbdev, void *ptr); static struct file_operations baycomusb_fops = { read: baycomusb_read, write: baycomusb_write, ioctl: baycomusb_ioctl, open: baycomusb_open, release: baycomusb_release, }; static struct usb_driver baycomusb_driver = { name: "baycomusb", probe: baycomusb_probe, disconnect: baycomusb_disconnect, fops: &baycomusb_fops, minor: BAYCOMUSB_MINOR_BASE }; /* --------------------------------------------------------------------- */ #define min(a, b) (((a) < (b)) ? (a) : (b)) #define max(a, b) (((a) > (b)) ? (a) : (b)) /* --------------------------------------------------------------------- */ #define KISS_VERBOSE /* --------------------------------------------------------------------- */ #define PARAM_TXDELAY 1 #define PARAM_PERSIST 2 #define PARAM_SLOTTIME 3 #define PARAM_TXTAIL 4 #define PARAM_FULLDUP 5 #define PARAM_HARDWARE 6 #define PARAM_RETURN 255 /* --------------------------------------------------------------------- */ /* * eppconfig_path should be setable via /proc/sys. */ static char baycomusb_path[256] = "/usr/sbin/baycomusb"; static char *envp[] = { "HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL }; static int errno; struct bayusbpar { unsigned int busnr; unsigned int devnr; unsigned char ifname[IFNAMSIZ]; }; static int exec_baycomusb(void *__p) { struct bayusbpar *p = (struct bayusbpar *)__p; char devarg[64]; char ifarg[128]; char *argv[] = { baycomusb_path, "-s", devarg, ifarg, NULL}; int i; /* set up arguments */ sprintf(devarg, "--device=%u:%u", p->busnr, p->devnr); if (!p->ifname[0]) { ifarg[0] = 0; argv[3] = NULL; } else sprintf(ifarg, "--ifname=%s", p->ifname); printk(KERN_DEBUG "%s: %s -s %s %s\n", bc_drvname, baycomusb_path, devarg, ifarg); i = exec_usermodehelper(baycomusb_path, argv, envp); if (i < 0) { printk(KERN_ERR "%s: failed to exec %s -s %s %s, errno = %d\n", bc_drvname, baycomusb_path, devarg, ifarg, i); return i; } return 0; } static int run_baycomusb(struct usb_device *usbdev, struct net_device *dev) { int i, pid, r; mm_segment_t fs; struct bayusbpar p; p.busnr = usbdev->bus->busnum; p.devnr = usbdev->devnum; p.ifname[0] = 0; if (dev) { strncpy(p.ifname, dev->name, sizeof(p.ifname)); p.ifname[sizeof(p.ifname)-1] = 0; } pid = kernel_thread(exec_baycomusb, &p, 0); if (pid < 0) { printk(KERN_ERR "%s: fork failed, errno %d\n", bc_drvname, -pid); return pid; } fs = get_fs(); set_fs(KERNEL_DS); /* Allow i to be in kernel space. */ r = waitpid(pid, &i, __WCLONE); set_fs(fs); if (r != pid) { printk(KERN_ERR "%s: waitpid(%d) failed, returning %d\n", bc_drvname, pid, r); return -1; } printk(KERN_DEBUG "%s: baycomusb returned %d\n", bc_drvname, i); return i; } /* ---------------------------------------------------------------------- */ static void inline do_kiss_params(struct baycomusb_priv *priv, unsigned char *data, unsigned long len) { #ifdef KISS_VERBOSE #define PKP(a,b) printk(KERN_INFO "%s: channel params: " a "\n", bc_drvname, b) #else /* KISS_VERBOSE */ #define PKP(a,b) #endif /* KISS_VERBOSE */ if (len < 2) return; switch(data[0]) { case PARAM_TXDELAY: priv->chpar.txdelay = (data[1] * priv->bitrate + 799) / 800; if (!priv->chpar.txdelay) priv->chpar.txdelay = 1; PKP("TX delay = %ums", 10 * data[1]); break; case PARAM_PERSIST: priv->chpar.ppersist = data[1]; PKP("p persistence = %u", priv->chpar.ppersist); break; case PARAM_SLOTTIME: priv->chpar.slottime = 10 * data[1]; PKP("slot time = %ums", priv->chpar.slottime); break; case PARAM_TXTAIL: PKP("TX tail = %ums", 10 * data[1]); break; case PARAM_FULLDUP: priv->chpar.fulldup = !!data[1]; PKP("%s duplex", priv->chpar.fulldup ? "full" : "half"); break; default: break; } #undef PKP } /* ---------------------------------------------------------------------- */ static unsigned short random_seed; static inline unsigned short random_num(void) { random_seed = 28629 * random_seed + 157; return random_seed; } /* --------------------------------------------------------------------- */ static void txsubmitready(struct baycomusb_priv *priv) { unsigned long flags; unsigned int strt, i; struct sk_buff *skb; int err; spin_lock_irqsave(&priv->lock, flags); strt = priv->tx.flgready & ~priv->tx.flgrun; priv->tx.flgrun |= strt; spin_unlock_irqrestore(&priv->lock, flags); if (!strt) return; for (i = 0; i < NUMTX; i++) { if (!(strt & (1 << i))) continue; if ((err = usb_submit_urb(priv->tx.urb[i]))) { printk(KERN_ERR "%s: txsubmitready: submit error %d\n", bc_drvname, err); spin_lock_irqsave(&priv->lock, flags); priv->tx.flgready &= ~(1 << i); priv->tx.flgrun &= ~(1 << i); skb = priv->tx.skb[i]; priv->tx.skb[i] = NULL; spin_unlock_irqrestore(&priv->lock, flags); dev_kfree_skb(skb); netif_start_queue((&priv->netdev)); } } } static void baycomusb_irq(struct urb *urb) { struct baycomusb_priv *priv = urb->context; unsigned int strtable, i; if (urb->status) { return; } if (urb->actual_length < 5) { return; } spin_lock(&priv->lock); for (i = 5; i < urb->actual_length; i++) { priv->uart.buf[priv->uart.wr] = priv->irqbuf[i]; priv->uart.wr = (priv->uart.wr + 1) % sizeof(priv->uart.buf); if (priv->uart.wr == priv->uart.rd) priv->uart.rd = (priv->uart.rd + 1) % sizeof(priv->uart.buf); } strtable = priv->tx.flgready & ~priv->tx.flgrun; spin_unlock(&priv->lock); if (!strtable) priv->slotcnt = priv->chpar.slottime; else { priv->slotcnt -= 8; /* 8ms IRQ interval */ if (priv->slotcnt <= 0) { priv->slotcnt = priv->chpar.slottime; if (!(priv->irqbuf[0] & 0x08) && (random_num() % 256) > priv->chpar.ppersist) txsubmitready(priv); } } #if 0 printk(KERN_DEBUG "baycom_usb: irq: %02x %02x %02x %02x %02x\n", priv->irqbuf[0], priv->irqbuf[1], priv->irqbuf[2], priv->irqbuf[3], priv->irqbuf[4]); #endif } static void baycomusb_txpacket(struct urb *urb) { struct baycomusb_priv *priv = urb->context; struct sk_buff *skb; unsigned int flgrdy, i; for (i = 0; i < NUMTX && priv->tx.urb[i] != urb; i++); if (i >= NUMTX) { printk(KERN_ERR "%s: txpacket unknown urb %p\n", bc_drvname, urb); return; } spin_lock(&priv->lock); skb = priv->tx.skb[i]; priv->tx.skb[i] = NULL; priv->tx.flgrun &= ~(1 << i); priv->tx.flgready &= ~(1 << i); flgrdy = priv->tx.flgready; spin_unlock(&priv->lock); if (skb) dev_kfree_skb(skb); if (urb->status == USB_ST_URB_KILLED) return; if (urb->status) { printk(KERN_DEBUG "%s: txpacket status %d\n", bc_drvname, urb->status); priv->stats.tx_errors++; } else priv->stats.tx_packets++; if (flgrdy != ((1 << NUMTX)-1)) netif_wake_queue((&priv->netdev)); /* double paren for kcomp.h define */ } static void baycomusb_rxpacket(struct urb *urb) { struct baycomusb_priv *priv = urb->context; struct sk_buff *skb; unsigned int pktlen, i; unsigned char *cp; int err; if (urb->status == USB_ST_URB_KILLED) return; for (i = 0; i < NUMRX && priv->rx.urb[i] != urb; i++); if (i >= NUMRX) { printk(KERN_ERR "%s: rxpacket unknown urb %p\n", bc_drvname, urb); return; } if (urb->status) { printk(KERN_DEBUG "%s: rxpacket status %d\n", bc_drvname, urb->status); priv->stats.rx_errors++; } else if (urb->actual_length > 2) { pktlen = urb->actual_length-2; /* remove CRC */ if (!(skb = dev_alloc_skb(pktlen+1))) { printk(KERN_DEBUG "%s: memory squeeze, dropping packet\n", priv->netdev.name); priv->stats.rx_dropped++; } else { cp = skb_put(skb, pktlen+1); *cp++ = 0; /* KISS kludge */ memcpy(cp, urb->transfer_buffer, pktlen); skb->dev = &priv->netdev; skb->protocol = htons(ETH_P_AX25); skb->mac.raw = skb->data; skb->pkt_type = PACKET_HOST; netif_rx(skb); priv->stats.rx_packets++; } } if ((err = usb_submit_urb(urb))) printk(KERN_DEBUG "%s: rxpacket error %d resubmitting rx urb\n", bc_drvname, err); } /* --------------------------------------------------------------------- */ /* * Open/initialize the board. This is called (in the current kernel) * sometime after booting when the 'ifconfig' program is run. * * This routine should set everything up anew at each open, even * registers that "should" only need to be set once at boot, so that * there is non-reboot way to recover if something goes wrong. */ static int baycomusb_opennet(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; int ret = -ENOMEM; unsigned int i; printk(KERN_DEBUG "opennet: dev %p priv %p usbdev %p\n", dev, priv, priv->usbdev); for (i = 0; i < NUMTX; i++) { if (!(priv->tx.urb[i] = usb_alloc_urb(0))) goto out; priv->tx.urb[i]->dev = priv->usbdev; priv->tx.urb[i]->pipe = usb_sndbulkpipe(priv->usbdev, 2); priv->tx.urb[i]->complete = baycomusb_txpacket; priv->tx.urb[i]->context = priv; priv->tx.urb[i]->transfer_flags = (NUMTX > 1) ? USB_QUEUE_BULK : 0; } for (i = 0; i < NUMRX; i++) { if (!(priv->rx.urb[i] = usb_alloc_urb(0)) || !(priv->rx.buf[i] = kmalloc(MAXFLEN+2, GFP_KERNEL))) goto out; priv->rx.urb[i]->dev = priv->usbdev; priv->rx.urb[i]->pipe = usb_rcvbulkpipe(priv->usbdev, 2); priv->rx.urb[i]->transfer_buffer = priv->rx.buf[i]; priv->rx.urb[i]->transfer_buffer_length = MAXFLEN+2; priv->rx.urb[i]->complete = baycomusb_rxpacket; priv->rx.urb[i]->context = priv; priv->rx.urb[i]->transfer_flags = (NUMRX > 1) ? USB_QUEUE_BULK : 0; } for (i = 0; i < NUMRX; i++) { printk(KERN_DEBUG "%s: submitting RX URB %u\n", bc_drvname, i); if ((ret = usb_submit_urb(priv->rx.urb[i]))) { printk(KERN_ERR "%s: error %d submitting receiver urb\n", bc_drvname, ret); ret = -EIO; goto out2; } } #if LINUX_VERSION_CODE < 0x20400 dev->start = 1; #endif netif_start_queue(dev); MOD_INC_USE_COUNT; return 0; out2: for (i = 0; i < NUMRX; i++) usb_unlink_urb(priv->rx.urb[i]); out: for (i = 0; i < NUMRX; i++) { if (priv->rx.urb[i]) usb_free_urb(priv->rx.urb[i]); if (priv->rx.buf[i]) kfree(priv->rx.buf[i]); priv->rx.urb[i] = NULL; priv->rx.buf[i] = NULL; } for (i = 0; i < NUMTX; i++) { if (priv->tx.urb[i]) usb_free_urb(priv->tx.urb[i]); priv->tx.urb[i] = NULL; } return ret; } /* --------------------------------------------------------------------- */ static int baycomusb_closenet(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; unsigned int i; unsigned long flags; netif_stop_queue(dev); spin_lock_irqsave(&priv->lock, flags); priv->tx.flgrun = 0; priv->tx.flgready = 0; spin_unlock_irqrestore(&priv->lock, flags); for (i = 0; i < NUMTX; i++) { usb_unlink_urb(priv->tx.urb[i]); usb_free_urb(priv->tx.urb[i]); priv->tx.urb[i] = NULL; priv->tx.skb[i] = NULL; } for (i = 0; i < NUMRX; i++) { printk(KERN_DEBUG "%s: unlinking RX URB %u\n", bc_drvname, i); usb_unlink_urb(priv->rx.urb[i]); usb_free_urb(priv->rx.urb[i]); kfree(priv->rx.buf[i]); priv->rx.urb[i] = NULL; priv->rx.buf[i] = NULL; } #if LINUX_VERSION_CODE < 0x20400 dev->start = 0; #endif MOD_DEC_USE_COUNT; return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_ioctlnet(struct net_device *dev, struct ifreq *ifr, int cmd) { struct baycomusb_priv *priv = dev->priv; if (cmd != SIOCDEVPRIVATE) return -ENOIOCTLCMD; return -ENOIOCTLCMD; } /* --------------------------------------------------------------------- */ static int baycomusb_set_mac_address(struct net_device *dev, void *addr) { struct sockaddr *sa = (struct sockaddr *)addr; /* addr is an AX.25 shifted ASCII mac address */ memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); return 0; } static struct net_device_stats *baycomusb_get_stats(struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; /* * Get the current statistics. This may be called with the * card open or closed. */ return &priv->stats; } /* --------------------------------------------------------------------- */ static int baycomusb_send_packet(struct sk_buff *skb, struct net_device *dev) { struct baycomusb_priv *priv = dev->priv; unsigned long flags; unsigned int txd, newrdy, i; struct sk_buff *skb2; if (skb->data[0] != 0) { do_kiss_params(priv, skb->data, skb->len); dev_kfree_skb(skb); return 0; } if (skb->len < 2) { dev_kfree_skb(skb); return 0; } if (skb_headroom(skb) < 1) { printk(KERN_ERR "%s: tx packet headroom < 1\n", bc_drvname); dev_kfree_skb(skb); return 0; } if (!(skb2 = skb_unshare(skb, GFP_ATOMIC))) { printk(KERN_ERR "%s: skb unshare failed\n", bc_drvname); return 0; } skb = skb2; txd = priv->chpar.txdelay; skb->data[-1] = txd; skb->data[0] = txd >> 8; spin_lock_irqsave(&priv->lock, flags); for (i = 0; i < NUMTX; i++) if (!(priv->tx.flgready & (1 << i))) break; if (i < NUMTX) { priv->tx.urb[i]->transfer_buffer = skb->data - 1; priv->tx.urb[i]->transfer_buffer_length = skb->len + 1; priv->tx.skb[i] = skb; priv->tx.flgready |= (1 << i); } newrdy = priv->tx.flgready; spin_unlock_irqrestore(&priv->lock, flags); if (newrdy == ((1 << NUMTX)-1)) netif_stop_queue(dev); if (i >= NUMTX) { printk(KERN_DEBUG "%s: send_packet: queue overrun!\n", bc_drvname); netif_stop_queue(dev); dev_kfree_skb(skb); return 0; } /* check for half duplex; start channel access state machine */ if (priv->chpar.fulldup || (priv->irqbuf[0] & 0x04)) txsubmitready(priv); return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_netinit(struct net_device *dev) { static char ax25_bcast[AX25_ADDR_LEN] = { 'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1 }; static char ax25_nocall[AX25_ADDR_LEN] = { 'L' << 1, 'I' << 1, 'N' << 1, 'U' << 1, 'X' << 1, ' ' << 1, '1' << 1 }; struct baycomusb_priv *priv = dev->priv; const struct channel_params dfltchpar = { 20, 100, 40, 0 }; /* * initialize the private struct */ priv->chpar = dfltchpar; priv->chpar.txdelay = (dfltchpar.txdelay * priv->bitrate + 799) / 800; if (!priv->chpar.txdelay) priv->chpar.txdelay = 1; /* * initialize the device struct */ dev->open = baycomusb_opennet; dev->stop = baycomusb_closenet; dev->do_ioctl = baycomusb_ioctlnet; dev->hard_start_xmit = baycomusb_send_packet; dev->get_stats = baycomusb_get_stats; /* Fill in the fields of the device structure */ dev_init_buffers(dev); #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) dev->hard_header = ax25_encapsulate; dev->rebuild_header = ax25_rebuild_header; #else /* CONFIG_AX25 || CONFIG_AX25_MODULE */ dev->hard_header = NULL; dev->rebuild_header = NULL; #endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */ dev->set_mac_address = baycomusb_set_mac_address; dev->type = ARPHRD_AX25; /* AF_AX25 device */ dev->hard_header_len = AX25_MAX_HEADER_LEN + AX25_BPQ_HEADER_LEN + 2; /* +2 to make room for TxDelay word */ dev->mtu = AX25_DEF_PACLEN; /* eth_mtu is the default */ dev->addr_len = AX25_ADDR_LEN; /* sizeof an ax.25 address */ memcpy(dev->broadcast, ax25_bcast, AX25_ADDR_LEN); memcpy(dev->dev_addr, ax25_nocall, AX25_ADDR_LEN); dev->tx_queue_len = txqueuelen; /* New style flags */ dev->flags = 0; return 0; } /* --------------------------------------------------------------------- */ static int baycomusb_open(struct inode *inode, struct file *file) { struct baycomusb_priv *priv; if (MINOR(inode->i_rdev) != BAYCOMUSB_MINOR_BASE) return -ENODEV; if (!(priv = kmalloc(sizeof(struct baycomusb_priv), GFP_KERNEL))) return -ENOMEM; memset(priv, 0, sizeof(struct baycomusb_priv)); init_rwsem(&priv->devsem); spin_lock_init(&priv->lock); priv->netdev.priv = priv; #if LINUX_VERSION_CODE < 0x20400 priv->netdev.name = priv->ifname; #endif file->private_data = priv; MOD_INC_USE_COUNT; return 0; } static int baycomusb_release(struct inode *inode, struct file *file) { struct baycomusb_priv *priv = file->private_data; lock_kernel(); /* lock against hub thread simultaneously calling disconnect */ down_write(&priv->devsem); if (priv->usbdev) { if (priv->mode != MODE_AUDIO) unregister_netdev(&priv->netdev); usb_unlink_urb(priv->irqurb); usb_free_urb(priv->irqurb); usb_driver_release_interface(&baycomusb_driver, priv->usbiface); priv->usbdev = NULL; } up_write(&priv->devsem); kfree(priv); unlock_kernel(); MOD_DEC_USE_COUNT; return 0; } /* * the following 3 routines should only be called when holding the kernel lock; * to prevent the hub thread from changing the topology */ static struct usb_bus *baycomusb_findbus(int busnr) { struct list_head *list; struct usb_bus *bus; for (list = usb_bus_list.next; list != &usb_bus_list; list = list->next) { bus = list_entry(list, struct usb_bus, bus_list); if (bus->busnum == busnr) return bus; } return NULL; } static struct usb_device *finddev(struct usb_device *dev, int devnr) { unsigned int i; struct usb_device *d2; if (!dev) return NULL; if (dev->devnum == devnr) return dev; for (i = 0; i < dev->maxchild; i++) { if (!dev->children[i]) continue; if ((d2 = finddev(dev->children[i], devnr))) return d2; } return NULL; } static struct usb_device *baycomusb_finddevice(struct usb_bus *bus, int devnr) { return finddev(bus->root_hub, devnr); } static int start_netdev(struct baycomusb_priv *priv, struct baycomusb_startnetdev *stnetdev) { struct usb_bus *bus; struct usb_device *dev; unsigned char mode, buf[3]; unsigned int bitrate = 0; if (priv->usbdev) return -EBUSY; if (!(bus = baycomusb_findbus(stnetdev->busnr))) return -ENODEV; if (!(dev = baycomusb_finddevice(bus, stnetdev->devnr))) return -ENODEV; if ((dev->descriptor.idVendor != BAYCOMUSB_VENDORID || (dev->descriptor.idProduct != BAYCOMUSB_PRODUCTID_MODEM && dev->descriptor.idProduct != BAYCOMUSB_PRODUCTID_AUDIO))) return -ENODEV; /* We don't handle multiple configurations */ if (dev->descriptor.bNumConfigurations != 1) return -ENODEV; /* check if interface still free */ if (!(priv->usbiface = usb_ifnum_to_if(dev, 0))) return -ENODEV; if (usb_interface_claimed(priv->usbiface)) return -EBUSY; /* check if already configured */ if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0xc8, 0xc0, 0, 0, &mode, 1, 500) != 1) { printk(KERN_DEBUG "%s: uninitialized modem found at %03d:%03d\n", bc_drvname, dev->bus->busnum, dev->devnum); return -EIO; } printk(KERN_DEBUG "%s: initialized modem found at %03d:%03d, mode %u\n", bc_drvname, dev->bus->busnum, dev->devnum, (unsigned int)mode); if (mode != MODE_FSK && mode != MODE_EXTERNAL && mode != MODE_AFSK && mode != MODE_AUDIO) return -EIO; if (mode != MODE_AUDIO) { if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0xd1, 0xc0, 0, 0, buf, 3, 500) != 3) { printk(KERN_DEBUG "%s: cannot retrieve bitrate from device %03d:%03d\n", bc_drvname, dev->bus->busnum, dev->devnum); return -EIO; } bitrate = (buf[2] << 16) | (buf[1] << 8) | buf[0]; } printk(KERN_DEBUG "%s: modem at %03d:%03d has bitrate %u\n", bc_drvname, dev->bus->busnum, dev->devnum, bitrate); if (usb_set_configuration(dev, dev->config[0].bConfigurationValue) < 0) { printk(KERN_WARNING "%s: usb_set_configuration failed\n", bc_drvname); return -EIO; } if (usb_set_interface(dev, 0, 1) < 0) { printk(KERN_WARNING "%s: usb_set_interface failed\n", bc_drvname); return -EIO; } strncpy(priv->netdev.name, stnetdev->ifname, IFNAMSIZ); priv->netdev.name[IFNAMSIZ-1] = 0; priv->mode = mode; priv->bitrate = bitrate; priv->netdev.init = baycomusb_netinit; priv->usbdev = dev; priv->irqurb = usb_alloc_urb(0); priv->irqurb->dev = dev; priv->irqurb->pipe = usb_rcvintpipe(dev, 1); priv->irqurb->transfer_buffer = priv->irqbuf; priv->irqurb->transfer_buffer_length = sizeof(priv->irqbuf); priv->irqurb->complete = baycomusb_irq; priv->irqurb->context = priv; priv->irqurb->interval = 8; priv->irqurb->start_frame = -1; if (usb_submit_urb(priv->irqurb)) { printk(KERN_WARNING "%s: cannot start irq URB\n", bc_drvname); usb_free_urb(priv->irqurb); return -EIO; } if (priv->mode != MODE_AUDIO) { if (register_netdev(&priv->netdev)) { printk(KERN_WARNING "%s: cannot register net device %s\n", bc_drvname, priv->netdev.name); usb_unlink_urb(priv->irqurb); usb_free_urb(priv->irqurb); return -EEXIST; } } usb_driver_claim_interface(&baycomusb_driver, priv->usbiface, priv); return 0; } static int baycomusb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct baycomusb_priv *priv = file->private_data; union { struct baycomusb_startnetdev stnetdev; struct baycomusb_status stat; struct baycomusb_receiveuart rxuart; struct baycomusb_transmituart txuart; struct baycomusb_modemdisc mdisc; struct baycomusb_t7fcontrol t7f; struct baycomusb_forceptt fptt; struct baycomusb_setleds leds; } u; unsigned char buf[8]; unsigned long flags; int r, i; switch (cmd) { case BAYCOMUSB_STARTNETDEV: if (copy_from_user(&u.stnetdev, (void *)arg, sizeof(u.stnetdev))) return -EFAULT; lock_kernel(); down_write(&priv->devsem); r = start_netdev(priv, &u.stnetdev); up_write(&priv->devsem); unlock_kernel(); return r; case BAYCOMUSB_GETSTATUS: if (!priv->usbdev) return -ENODEV; spin_lock_irqsave(&priv->lock, flags); u.stat.ptt = !!(priv->irqbuf[0] & 0x04); u.stat.dcd = !!(priv->irqbuf[0] & 0x08); u.stat.rssi = priv->irqbuf[3]; u.stat.uartchars = (sizeof(priv->uart.buf) + priv->uart.rd - priv->uart.wr) % sizeof(priv->uart.buf); spin_unlock_irqrestore(&priv->lock, flags); if (copy_to_user((void *)arg, &u.stat, sizeof(u.stat))) return -EFAULT; return 0; case BAYCOMUSB_RECEIVEUART: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (!priv->usbdev) return -ENODEV; u.rxuart.len = 0; memset(u.rxuart.buffer, 0, sizeof(u.rxuart.buffer)); spin_lock_irqsave(&priv->lock, flags); while (u.rxuart.len < sizeof(u.rxuart.buffer) && priv->uart.rd != priv->uart.wr) { if (priv->uart.wr >= priv->uart.rd) i = priv->uart.wr - priv->uart.rd; else i = sizeof(u.rxuart.buffer) - priv->uart.rd; if (i + u.rxuart.len > sizeof(u.rxuart.buffer)) i = sizeof(u.rxuart.buffer) - u.rxuart.len; memcpy(&u.rxuart.buffer[u.rxuart.len], &priv->uart.buf[priv->uart.rd], i); u.rxuart.len += i; priv->uart.rd = (priv->uart.rd + (unsigned int)i) % sizeof(priv->uart.buf); } spin_unlock_irqrestore(&priv->lock, flags); if (copy_to_user((void *)arg, &u.rxuart, sizeof(u.rxuart))) return -EFAULT; return 0; case BAYCOMUSB_TRANSMITUART: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.txuart, (void *)arg, sizeof(u.txuart))) return -EFAULT; spin_lock_irqsave(&priv->lock, flags); i = priv->irqbuf[0]; priv->irqbuf[0] &= ~0x20; spin_unlock_irqrestore(&priv->lock, flags); if (!(i & 0x20)) return -EBUSY; down_read(&priv->devsem); if (priv->usbdev) i = usb_control_msg(priv->usbdev, usb_sndctrlpipe(priv->usbdev, 0), 0xd3, 0x40, u.txuart.txchar, 0, NULL, 0, 500); else i = -ENODEV; up_read(&priv->devsem); return i; case BAYCOMUSB_MODEMDISC: if (priv->mode == MODE_EXTERNAL) return -EIO; if (copy_from_user(&u.mdisc, (void *)arg, sizeof(u.mdisc))) return -EFAULT; if ((u.mdisc.setdirection != -1 || u.mdisc.setoutput != -1) && !capable(CAP_NET_ADMIN)) return -EACCES; down_read(&priv->devsem); if (!priv->usbdev) { up_read(&priv->devsem); return -ENODEV; } if (u.mdisc.setoutput != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, u.mdisc.setoutput, 1, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } if (u.mdisc.setdirection != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, u.mdisc.setdirection, 2, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd4, 0xc0, 0, 0, buf, 3, 500); up_read(&priv->devsem); if (i < 0) return i; if (i != 3) return -EIO; u.mdisc.input = buf[0]; u.mdisc.output = buf[1]; u.mdisc.direction = buf[2]; if (copy_to_user((void *)arg, &u.mdisc, sizeof(u.mdisc))) return -EFAULT; return 0; case BAYCOMUSB_T7FCONTROL: if (copy_from_user(&u.t7f, (void *)arg, sizeof(u.t7f))) return -EFAULT; if (u.t7f.setoutput != -1 && !capable(CAP_NET_ADMIN)) return -EACCES; down_read(&priv->devsem); if (!priv->usbdev) { up_read(&priv->devsem); return -ENODEV; } if (u.t7f.setoutput != -1) { i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd5, 0xc0, u.t7f.setoutput, 1, NULL, 0, 500); if (i < 0) { up_read(&priv->devsem); return i; } } i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd5, 0xc0, 0, 0, buf, 2, 500); up_read(&priv->devsem); if (i < 0) return i; if (i != 2) return -EIO; u.t7f.input = buf[0]; u.t7f.output = buf[1]; if (copy_to_user((void *)arg, &u.t7f, sizeof(u.t7f))) return -EFAULT; return 0; case BAYCOMUSB_FORCEPTT: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.fptt, (void *)arg, sizeof(u.fptt))) return -EFAULT; down_read(&priv->devsem); if (priv->usbdev) i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd0, 0xc0, u.fptt.ptt, 1, NULL, 0, 500); else i = -ENODEV; up_read(&priv->devsem); if (i < 0) return i; return 0; case BAYCOMUSB_SETLEDS: if (!capable(CAP_NET_ADMIN)) return -EACCES; if (copy_from_user(&u.leds, (void *)arg, sizeof(u.leds))) return -EFAULT; down_read(&priv->devsem); if (priv->usbdev) i = usb_control_msg(priv->usbdev, usb_rcvctrlpipe(priv->usbdev, 0), 0xd2, 0x40, u.leds.leds, 0, NULL, 0, 500); else i = -ENODEV; up_read(&priv->devsem); if (i < 0) return i; return 0; default: return -ENOIOCTLCMD; } return 0; } static ssize_t baycomusb_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct baycomusb_priv *priv = file->private_data; return -EIO; } static ssize_t baycomusb_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct baycomusb_priv *priv = file->private_data; return -EIO; } /* --------------------------------------------------------------------- */ static void *baycomusb_probe(struct usb_device *usbdev, unsigned int ifnum) { return NULL; } static void baycomusb_disconnect(struct usb_device *usbdev, void *ptr) { struct baycomusb_priv *priv = ptr; down_write(&priv->devsem); if (priv->usbdev) { if (priv->mode != MODE_AUDIO) unregister_netdev(&priv->netdev); usb_unlink_urb(priv->irqurb); usb_free_urb(priv->irqurb); usb_driver_release_interface(&baycomusb_driver, priv->usbiface); priv->usbdev = NULL; } up_write(&priv->devsem); } /* --------------------------------------------------------------------- */ MODULE_AUTHOR("Thomas M. Sailer, sailer@ife.ee.ethz.ch"); MODULE_DESCRIPTION("Baycom USB ham radio modem driver"); static int __init baycomusb_init(void) { if (usb_register(&baycomusb_driver) < 0) return -1; printk(KERN_INFO "%s: Baycom USB driver registered.\n" KERN_INFO "%s: (C) 2000 by Thomas Sailer, \n", bc_drvname, bc_drvname); return 0; } static void __exit baycomusb_cleanup(void) { usb_deregister(&baycomusb_driver); } module_init(baycomusb_init); module_exit(baycomusb_cleanup); /* --------------------------------------------------------------------- */ baycomusb-0.10.orig/kerneldrv/baycom_usb_2.2.h0100644000175100017510000000545307325134424017274 0ustar abaaba/*****************************************************************************/ /* * baycom_usb.h -- baycom USB radio modem driver, ioctl structures etc. * * Copyright (C) 2000 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 09.07.2000 Started */ /*****************************************************************************/ #ifndef _BAYCOM_USB_H #define _BAYCOM_USB_H #include #include /* -------------------------------------------------------------------- */ #define BAYCOMUSB_MINOR_BASE 240 struct baycomusb_startnetdev { unsigned int busnr; unsigned int devnr; char ifname[IFNAMSIZ]; }; #define BAYCOMUSB_STARTNETDEV _IOWR('u', 0, struct baycomusb_startnetdev) struct baycomusb_status { int ptt; int dcd; unsigned int rssi; unsigned int uartchars; }; #define BAYCOMUSB_GETSTATUS _IOWR('u', 1, struct baycomusb_status) struct baycomusb_receiveuart { unsigned int len; unsigned char buffer[64]; }; #define BAYCOMUSB_RECEIVEUART _IOWR('u', 2, struct baycomusb_receiveuart) struct baycomusb_transmituart { unsigned char txchar; }; #define BAYCOMUSB_TRANSMITUART _IOW('u', 3, struct baycomusb_transmituart) struct baycomusb_modemdisc { int setdirection; int setoutput; unsigned int input; unsigned int output; unsigned int direction; }; #define BAYCOMUSB_MODEMDISC _IOWR('u', 4, struct baycomusb_modemdisc) struct baycomusb_t7fcontrol { int setoutput; unsigned int input; unsigned int output; }; #define BAYCOMUSB_T7FCONTROL _IOWR('u', 5, struct baycomusb_t7fcontrol) struct baycomusb_forceptt { int ptt; }; #define BAYCOMUSB_FORCEPTT _IOW('u', 6, struct baycomusb_forceptt) struct baycomusb_setleds { int leds; }; #define BAYCOMUSB_SETLEDS _IOW('u', 7, struct baycomusb_setleds) /* -------------------------------------------------------------------- */ #endif /* _BAYCOM_USB_H */ baycomusb-0.10.orig/kerneldrv/baycomusb.diff0100644000175100017510000000353007325134424017227 0ustar abaabadiff -urN -X dontdiff pristine-linux-2.4.2-ac22/drivers/usb/Config.in linux-2.4.2-ac22/drivers/usb/Config.in --- pristine-linux-2.4.2-ac22/drivers/usb/Config.in Fri Mar 23 12:01:48 2001 +++ linux-2.4.2-ac22/drivers/usb/Config.in Fri Mar 23 12:18:18 2001 @@ -66,6 +66,11 @@ dep_tristate ' USB ADMtek Pegasus-based ethernet device support (EXPERIMENTAL)' CONFIG_USB_PEGASUS $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL dep_tristate ' USB KLSI KL5USB101-based ethernet device support (EXPERIMENTAL)' CONFIG_USB_KAWETH $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL dep_tristate ' USB-to-USB Networking (NetChip, Prolific, ...) (EXPERIMENTAL)' CONFIG_USB_USBNET $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL + if [ "$CONFIG_HAMRADIO" = "y" ]; then + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + dep_tristate ' Baycom USB Modem (EXPERIMENTAL)' CONFIG_USB_BAYCOMUSB $CONFIG_USB $CONFIG_NET + fi + fi comment 'USB port drivers' dep_tristate ' USS720 parport driver' CONFIG_USB_USS720 $CONFIG_USB $CONFIG_PARPORT diff -urN -X dontdiff pristine-linux-2.4.2-ac22/drivers/usb/Makefile linux-2.4.2-ac22/drivers/usb/Makefile --- pristine-linux-2.4.2-ac22/drivers/usb/Makefile Fri Mar 23 12:01:48 2001 +++ linux-2.4.2-ac22/drivers/usb/Makefile Fri Mar 23 12:17:45 2001 @@ -64,6 +64,8 @@ obj-$(CONFIG_USB_PEGASUS) += pegasus.o obj-$(CONFIG_USB_PLUSB) += plusb.o obj-$(CONFIG_USB_USBNET) += usbnet.o +obj-$(CONFIG_USB_BAYCOMUSB) += baycom_usb.o + # Object files in subdirectories diff -urN -X dontdiff pristine-linux-2.4.2-ac22/drivers/usb/usb.c linux-2.4.2-ac22/drivers/usb/usb.c --- pristine-linux-2.4.2-ac22/drivers/usb/usb.c Fri Mar 23 12:01:53 2001 +++ linux-2.4.2-ac22/drivers/usb/usb.c Fri Mar 23 12:12:16 2001 @@ -2367,3 +2367,5 @@ EXPORT_SYMBOL(usb_bulk_msg); EXPORT_SYMBOL(usb_devfs_handle); + +EXPORT_SYMBOL(usb_bus_list); baycomusb-0.10.orig/kerneldrv/usb-devio-zeropkt.diff0100644000175100017510000000274007325134424020636 0ustar abaaba--- drivers/usb/devio.c.orig Wed Jul 11 12:43:07 2001 +++ drivers/usb/devio.c Wed Jul 11 12:44:10 2001 @@ -760,7 +760,8 @@ if (copy_from_user(&uurb, arg, sizeof(uurb))) return -EFAULT; - if (uurb.flags & ~(USBDEVFS_URB_ISO_ASAP|USBDEVFS_URB_DISABLE_SPD|USBDEVFS_URB_QUEUE_BULK)) + if (uurb.flags & ~(USBDEVFS_URB_ISO_ASAP|USBDEVFS_URB_DISABLE_SPD|USBDEVFS_URB_QUEUE_BULK| + USBDEVFS_URB_NO_FSBR|USBDEVFS_URB_ZERO_PACKET)) return -EINVAL; if (!uurb.buffer) return -EINVAL; --- include/linux/usbdevice_fs.h.orig Thu Jul 12 19:27:00 2001 +++ include/linux/usbdevice_fs.h Thu Jul 12 19:27:30 2001 @@ -3,8 +3,8 @@ /* * usbdevice_fs.h -- USB device file system. * - * Copyright (C) 2000 - * Thomas Sailer (sailer@ife.ee.ethz.ch) + * Copyright (C) 2000-2001 + * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 @@ -78,9 +78,11 @@ unsigned char slow; }; -#define USBDEVFS_URB_DISABLE_SPD 1 -#define USBDEVFS_URB_ISO_ASAP 2 -#define USBDEVFS_URB_QUEUE_BULK 0x10 +#define USBDEVFS_USB_DISABLE_SPD 0x0001 +#define USBDEVFS_USB_ISO_ASAP 0x0002 +#define USBDEVFS_USB_QUEUE_BULK 0x0010 +#define USBDEVFS_USB_NO_FSBR 0x0020 +#define USBDEVFS_USB_ZERO_PACKET 0x0040 #define USBDEVFS_URB_TYPE_ISO 0 #define USBDEVFS_URB_TYPE_INTERRUPT 1 baycomusb-0.10.orig/wdmdrv/0042755000175100017510000000000007340500006013712 5ustar abaababaycomusb-0.10.orig/wdmdrv/Makefile.in0100644000175100017510000001310107340500006015746 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ EXTRA_DIST = baycmusb.inf bcusbprg.inf bcusbprgold.inf baycmusb.sys bcioctl.c bcusb.h bcusb.rc dabusb.c mkfile pwr.c resource.h sources usbdevio.h list.h mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 wdmdrv/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 = wdmdrv 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: baycomusb-0.10.orig/wdmdrv/Makefile.am0100644000175100017510000000023207325134424015750 0ustar abaabaEXTRA_DIST = baycmusb.inf bcusbprg.inf bcusbprgold.inf baycmusb.sys bcioctl.c bcusb.h bcusb.rc dabusb.c mkfile pwr.c resource.h sources usbdevio.h list.h baycomusb-0.10.orig/wdmdrv/baycmusb.inf0100644000175100017510000000400207325134424016216 0ustar abaaba[Version] Signature="$CHICAGO$" ClassGUID={36fc9e60-c465-11cf-8056-444553540000} Class=USB provider=%MSFT% ;LayoutFile=layout.inf DriverVer=07/21/2000,1.0.0.1 [SourceDisksNames] 1="USBFLEX Installation Disk",,,"" [SourceDisksFiles] baycmusb.sys = 1,, [Manufacturer] %MfgName%=Baycom [Baycom] %USB\VID_BAC0&PID_6134.DeviceDesc%=USBFLEX_Dev, USB\VID_BAC0&PID_6134 %USB\VID_BAC0&PID_6135.DeviceDesc%=USBFLEX_Dev, USB\VID_BAC0&PID_6135 %USB\VID_BAC0&PID_6136.DeviceDesc%=USBFLEX_Dev, USB\VID_BAC0&PID_6136 %USB\VID_BAC0&PID_6137.DeviceDesc%=USBFLEX_Dev, USB\VID_BAC0&PID_6137 ;%USB\VID_BAC0&PID_6137&MI_00.DeviceDesc%=USBFLEX_Dev, USB\VID_BAC0&PID_6137&MI_00 ;[PreCopySection] ;HKR,,NoSetupUI,,1 [DestinationDirs] USBFLEX.Files.Ext = 10,System32\Drivers [USBFLEX_Dev] CopyFiles=USBFLEX.Files.Ext AddReg=USBFLEX.AddReg [USBFLEX_Dev.NT] CopyFiles=USBFLEX.Files.Ext AddReg=USBFLEX.AddReg [USBFLEX_Dev.NT.Services] Addservice = USBFLEX, 0x00000002, USBFLEX.AddService [USBFLEX.AddService] DisplayName = %USBFLEX.SvcDesc% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\System32\Drivers\baycmusb.sys LoadOrderGroup = Base [USBFLEX.AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,baycmusb.sys ;HKLM,"System\Currentcontrolset\Services\USBFLEX\Parameters","TotalBuffers",0x10001,256 [USBFLEX.Files.Ext] baycmusb.sys ;---------------------------------------------------------------; [Strings] MSFT="Baycom" MfgName="Baycom Hard- und Software GBR" USB\VID_BAC0&PID_6134.DeviceDesc="USBFLEX Radio Modem (uninit)" USB\VID_BAC0&PID_6135.DeviceDesc="USBFLEX Radio Modem (blank)" USB\VID_BAC0&PID_6136.DeviceDesc="USBFLEX Radio Modem (packet)" USB\VID_BAC0&PID_6137.DeviceDesc="USBFLEX Radio Modem (audio)" ;USB\VID_BAC0&PID_6137&MI_00.DeviceDesc="USBFLEX Radio Modem (audio)" USBFLEX.SvcDesc="baycmusb.sys USBFLEX Modem Driver" baycomusb-0.10.orig/wdmdrv/bcusbprg.inf0100644000175100017510000000302507325134424016224 0ustar abaaba[Version] Signature="$CHICAGO$" ClassGUID={36fc9e60-c465-11cf-8056-444553540000} Class=USB provider=%MSFT% ;LayoutFile=layout.inf DriverVer=07/21/2000,1.0.0.1 [SourceDisksNames] 1="USBFLEX Programming Installation Disk",,,"" [SourceDisksFiles] baycmusb.sys = 1,, [Manufacturer] %MfgName%=Baycom [Baycom] %USB\VID_0547&PID_2131.DeviceDesc%=USBFLEXPRG_Dev, USB\VID_0547&PID_2131 ;[PreCopySection] ;HKR,,NoSetupUI,,1 [DestinationDirs] USBFLEXPRG.Files.Ext = 10,System32\Drivers [USBFLEXPRG_Dev] CopyFiles=USBFLEXPRG.Files.Ext AddReg=USBFLEXPRG.AddReg [USBFLEXPRG_Dev.NT] CopyFiles=USBFLEXPRG.Files.Ext AddReg=USBFLEXPRG.AddReg [USBFLEXPRG_Dev.NT.Services] Addservice = USBFLEXPRG, 0x00000002, USBFLEXPRG.AddService [USBFLEXPRG.AddService] DisplayName = %USBFLEXPRG.SvcDesc% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\System32\Drivers\baycmusb.sys LoadOrderGroup = Base [USBFLEXPRG.AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,baycmusb.sys ;HKLM,"System\Currentcontrolset\Services\USBFLEX\Parameters","TotalBuffers",0x10001,256 [USBFLEXPRG.Files.Ext] baycmusb.sys ;---------------------------------------------------------------; [Strings] MSFT="Baycom" MfgName="Baycom Hard- und Software GBR" USB\VID_0547&PID_2131.DeviceDesc="Blank AnchorChips Device" USBFLEXPRG.SvcDesc="baycmusb.sys USBFLEX Programming Modem Driver" baycomusb-0.10.orig/wdmdrv/bcusbprgold.inf0100644000175100017510000000356607325134424016735 0ustar abaaba[Version] Signature="$CHICAGO$" ClassGUID={36fc9e60-c465-11cf-8056-444553540000} Class=USB provider=%MSFT% ;LayoutFile=layout.inf DriverVer=07/21/2000,1.0.0.1 [SourceDisksNames] 1="USBFLEX Installation Disk",,,"" [SourceDisksFiles] baycmusb.sys = 1,, [Manufacturer] %MfgName%=Baycom [Baycom] %USB\VID_0547&PID_2131.DeviceDesc%=USBFLEX_Dev, USB\VID_0547&PID_2131 %USB\VID_BAC0&PID_6134.DeviceDesc%=USBFLEX_Dev, USB\VID_BAC0&PID_6134 %USB\VID_BAC0&PID_6135.DeviceDesc%=USBFLEX_Dev, USB\VID_BAC0&PID_6135 %USB\VID_BAC0&PID_6136&MI_00.DeviceDesc%=USBFLEX_Dev, USB\VID_BAC0&PID_6136&MI_00 ;[PreCopySection] ;HKR,,NoSetupUI,,1 [DestinationDirs] USBFLEX.Files.Ext = 10,System32\Drivers [USBFLEX_Dev] CopyFiles=USBFLEX.Files.Ext AddReg=USBFLEX.AddReg [USBFLEX_Dev.NT] CopyFiles=USBFLEX.Files.Ext AddReg=USBFLEX.AddReg [USBFLEX_Dev.NT.Services] Addservice = USBFLEX, 0x00000002, USBFLEX.AddService [USBFLEX.AddService] DisplayName = %USBFLEX.SvcDesc% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ; SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\System32\Drivers\baycmusb.sys LoadOrderGroup = Base [USBFLEX.AddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,baycmusb.sys ;HKLM,"System\Currentcontrolset\Services\USBFLEX\Parameters","TotalBuffers",0x10001,256 [USBFLEX.Files.Ext] baycmusb.sys ;---------------------------------------------------------------; [Strings] MSFT="Baycom" MfgName="Baycom Hard- und Software GBR" USB\VID_0547&PID_2131.DeviceDesc="Blank AnchorChips Device" USB\VID_BAC0&PID_6134.DeviceDesc="USBFLEX Radio Modem (blank)" USB\VID_BAC0&PID_6135.DeviceDesc="USBFLEX Radio Modem (packet)" USB\VID_BAC0&PID_6136&MI_00.DeviceDesc="USBFLEX Radio Modem (audio)" USBFLEX.SvcDesc="baycomusb.sys USBFLEX Modem Driver" baycomusb-0.10.orig/wdmdrv/baycmusb.sys0100755000175100017510000004024007331546502016270 0ustar abaabaMZÿÿ¸@غ´ Í!¸LÍ!This program cannot be run in DOS mode. $u¥rÅË!ÅË!ÅË!ÅÊ!ÇË!ÅË!ÄË!œ7Ø!îË!“Í!ÄË!:4Á!ÆË!RichÅË!PELõ¯f;à  à1` À€0  =À “ à2P7°À:Ü 1T€0 .text¤-ÀÀ-À h.rdataK€0`€0@HINITà2 à2 â.rsrc°7À7@B.reloc<À:@À:@B‹D$SVW‹p(N8ÿ˜0‹=Ð0‹Øƒû jFjPÿ×…Ûu SƒÆjVÿ×_‹Ã^[ÂÌ‹D$SVW‹p(‹=Œ0FPÿ×^Sÿ×N8ÿ”0ƒø jjSÿÐ0_^[ÂÌjjÿt$ÿÐ0¸À U‹ìƒì‹ESVW‹@(j‰EEðjPÿ¤0‹] jY‹Ó‹s`FÜ‹øó¥€`‹C`ƒè$MðÇ@<‰H Æ@à‹E‹Hÿ0=u3ÀPPPPEðPÿœ0‹C_^[ÉÂSVW‹|$W‹w(èSWè ^@Sÿ¨0Sÿ¸0ÿvÿ 0Wÿ´0_^3À[ÂÌV‹t$ WVÿt$è6ÿÿÿ‹ø…ÿ}‰~ëÿt$ èƒf‹ø‰~2Ò‹Îÿ¬0‹Ç_^Â3ÀÂÌbaycomusb e:\wdmdrv\dabusb.c: IRP_MN_REMOVE_DEVICE U‹ìQQSV‹u W‹}‹F`W‹_(‰Eø¶@‰EüèXþÿÿ‹Eüƒø‡Òt)ƒè„±H„×HtDjY+ÁuW‰K<èVWè“ ‹v`‹U jFÜY‹øó¥€`‹Kÿ0ÿu‹ðèºýÿÿ‹ÆéhPè+YWè¢ýÿÿƒc<WèWèD ‹v`‹U jFÜY‹øó¥€`‹Kÿ0ÿu‹ðèkýÿÿ3ÀƒÃPPPjSÿœ0ÿuè^þÿÿë–VWÇC<èŽþÿÿ‹ðWé{ÿÿÿƒø tuƒø„Kÿÿÿƒø…Bÿÿÿƒ{<sþF#ƒF`$‹K‹Öÿ0ëÇWÇC<èüüÿÿWèeWè¢ 3ÀPPPCjPÿœ0‹v`‹U jFÜY‹øó¥€`‹Kÿ0ë%VWèKýÿÿ‹Ø‹Eø2ҋ΋@€Hÿ¬0Wèüÿÿ‹Ã_^[ÉÂÂÌbaycomusb e:\wdmdrv\dabusb.c: dabusb_pnp_add_device: can't kmalloc buf\Device\baycomusb%d\DosDevices\baycomusb%dU‹ìƒì VW3öhWdm jPV‰uüÿØ0‹ø‰uø;þ‰}ôuh0èG)Y¸ÀéÌS‹Ô0VhxWÿÓƒÄ EàWPÿ 1EàjPEèPÿÌ0Eü¿”PVV‹5ì0Eèj"PWÿuÿÖ…À‰Eð}eEèPÿ¸0ÿEøƒ}ø }HÿuøhxÿuôÿÓƒÄ EàÿuôPÿ 1EàjPEèPÿÌ0EüPjjEèj"PWÿuÿÖ…À‰Eð|¥ƒ}ðŒ‹EüjeY‹p(€`‹Eü‹þfH 3Àó«‹} W‰>ÿuüÿÄ0‰FF`PWèDƒ¦¸jFxZ‹ƒù}‰Ž¸ƒÀJuí‹=¤0jFjPÿ×jFjPÿ×j†¤jPÿ×jF(jPÿ×jFH_WWPÿÀ0†Pÿ¼0ÿuø†ˆ‰†ŒhŒ‰ÿuôÿÓƒÄ EàÿuôPÿ 1EàƒÆ@WPVÿÌ0EèPVÿè0‰EðEèPÿ¸0ÿuüèjúÿÿWÿuüèÿuôÿÈ0‹Eð[_^ÉÂSVW‹|$W‹_(èmWèª2Ò‹t$‹Îƒfƒfÿ¬0‹¼ÿ˜0jWè‹F_^[ÂÌbaycomusb e:\wdmdrv\dabusb.c: dabusb_open exit: stop pending U‹ìS‹]VW‹s(޼‰Mÿ”0‹} ƒø~ ÇG€ë"ƒ~<whüÇGVÀèŸ&YëjSè,ƒt ‹Mÿ˜0ƒg2Ò‹Ïÿ¬0‹G_^[]ÂÌbaycomusb e:\wdmdrv\dabusb.c: BaycomUSB Driver V0.09 (c) DF&TS compiled Jul 31 2001 15:17:39 h° è&‹D$Y‹HÇ@8: Ç@@²Ç@4,Ç€¤„Ç€Ø,ÇA¤Ç@pjÇ@t3ÀÂÌbaycomusb e:\wdmdrv\bcioctl.c: call_usbd: NT-Status: %08X URB-Status: %08X U‹ìƒì‹ESVW‹x(3Û9_<„ýƒ\„óSEèSPÿ¤0‹GSŠ@0þÀPÿä0‹ð;óu ¸šÀéÌ‹F`‹M ƒè$‹ÖƉXÇ@ "‰^ ‰H‹F`ƒè$MèÇ@Ô ‰H Æ@à‹Oÿ0‹ø;û|XÿuP‹};ûtjÿhðØÿÿSWèÏ$‰Eø‰Uü÷ßÿEø#øEèW‹=œ0SSjPÿ×=uVÿà0SSSEèSPÿ׋~VÿÜ0;û|‹E 9X}‹E ÿpWhd è\$ƒÄ ‹Çë¸VÀ_^[É Ìjjÿt$ÿÐ0¸À baycomusb e:\wdmdrv\bcioctl.c: async_cancel_all: IoCancelIrp failed Q‹D$ƒd$SU‹@(VW¨ˆ‰D$‹L$3ÿÿ„0‹u;õt‹>‹^‰_‰;‹~ð‰ ‰N‹L$ŠÐÿ€0…ÿt Wÿà0„Àu¾hê ÇD$Àèy#Yë©‹D$_^][YÂU‹ì‹ES3Û€}VW‰ur€}€ulf‹ufƒþrbfƒþw\hWdm jPSÿØ0;ij·M$‰H‹M,‰H ‹M(fƒþfÇ@ fÇP‰HujYë 3Éfƒþ•ÁAAˆHKŠM ˆHJf‰XL麶}‹Çj ƒà`^;Æt*ƒø@t ¸ À饋ǃà+ÃtHtHujë(jë$jë j‹Ç^#Æ+ÃtHt HtHt ëÅjëjëj^hWdm jPSÿØ0;Ãu¸ÀëPÁïöE‹ÏuƒÉ·U$‰P‹U,‰P ‹U(‰PŠUˆPIf‹Uf‰PJf‹U f‰pfÇPˆXHf‰PL‰H‹M‰X$‰3À_^[]Â(U‹ì‹E ‹MVW‹}‹@(ƒ'öÁ€tƒáƒÉëƒáƒ¼ˆÄ´ˆÄu¸ ÀëRhWdm jHjÿØ0…Àu¸Àë83ÉöEujYfÇ@ fÇH‹ƒ`$‰P‹U‰P‹U ‰P ‹U‰P‰H‰3À_^]Âbaycomusb e:\wdmdrv\bcioctl.c: abort_pipes: out of memory baycomusb e:\wdmdrv\bcioctl.c: abort_pipes: pipe %u abort error 0x%08x, 0x%08x baycomusb e:\wdmdrv\bcioctl.c: abort_pipes: pipe %u reset error 0x%08x, 0x%08x SU‹l$ VhWdm j‹](jÿØ0‹ð…öuh–è Y¸Àé¥WÃÄÇD$ ƒ;tzj3ÀY‹þó«fÇfÇF‹jdVU‰FèÔúÿÿ…À|ƒ~}ÿvPhÒè( ƒÄ j3ÀY‹þó«fÇfÇF‹jdVU‰Fè—úÿÿ…À|ƒ~}ÿvPh"èëƒÄ ƒÃÿL$…tÿÿÿVÿÈ03À_^][ÂÌ‹D$‹L$S‹\$‹@(VW3ÿöÁ€‰;tƒáƒÉëƒá9¼ˆÄ´ˆÄu¸ Àë;hWdm jWÿØ0‹Ð;×u¸Àë j3ÀY‹úó«f‹D$fÇf‰B‹‰B‰3À_^[Âbaycomusb e:\wdmdrv\bcioctl.c: failure to get configuration descriptor U‹ìQ‹ES‹È0V‹@(W‰Eü3ÿWÿuèc‹ð…öt¶F;E tVÿÓ3öGÿrÚ…öuhÐè¸Y¸ Àë(ÿuèþýÿÿ‹Uüj Y3ÀºÄjó«YºDó«VÿÓ3À_^[ÉÂÌSUV½Wdm W‹=Ø0U3ÛjPSÿ׋ð;óu3ÀéµUjSÿ׋è;넜ŠD$jdVfÇF ÿt$fÇPÇF ‰^ ‰nÆFKˆFJf‰^L‰^$èªøÿÿ…À} UÿÈ0ëY·}UƒÇÿÈ0hWdm WSÿØ0‹è;ët8ŠD$jdVfÇF ÿt$fÇP‰~‰^ ‰nÆFKˆFJf‰^L‰^$èJøÿÿ…À| ‹ÝVÿÈ0‹Ã_^][Âbaycomusb e:\wdmdrv\bcioctl.c: failure to get configuration descriptor baycomusb e:\wdmdrv\bcioctl.c: invalid interface %u altsetting %u baycomusb e:\wdmdrv\bcioctl.c: USBD_CreateConfigurationRequestEx failed baycomusb e:\wdmdrv\bcioctl.c: Error in configuration request: ntstatus %d urb status %d U‹ìƒìSV‹uWV‹^(è¯ûÿÿj 3ÀY»Äó«j»DYó«ÿ³„Vèµýÿÿ‹ø…ÿ‰}üu h|è"Yë[jÿjÿjÿÿuÿu WWÿ1…À‰Eìuÿuÿu hÄèôƒÄ ë$ƒeôƒeøEìPWÿ1‹ð…öuhèÌYWÿÈ0¸ ÀéšjdVÿuèCöÿÿ3ɉE;Á|Y9N|T9N$‰MvPowerIrp 0x%x Exit dabusb_SelfSuspendOrActivate(),refusing on pending s->SelfPowerIrp Exit dabusb_SelfSuspendOrActivate(),refusing to self-suspend on OpenPipeCount %d Exit dabusb_SelfSuspendOrActivate(),refusing to self-activate, no pipes open Exit dabusb_SelfSuspendOrActivate(), refusing on s->PowerDownLevel == %d dabusb_SelfSuspendOrActivate() status 0x%x on setting dev state %s ¶D$VW‹|$ Phˆ!‹w(èO ƒ~<YYwh¼!è= Y¸VÀé ‹† 3É;Át Phè!é€8޵th4"ë%8L$t‹†¼;ÁtPh€"ëY9޼u hÔ"èâ ëK‹¶¸ƒþt4;ñt0ƒþs+8L$uj^VWè|üÿÿÿ4µ”1‹øWhp#è¨ ƒÄ ‹ÇëVh$#è– YY3À_^ÂÌdabusb_SetDevicePowerState() PowerDeviceD3 (OFF) dabusb_SetDevicePowerState() %s dabusb_SetDevicePowerState() PowerDeviceD0 (ON) Bogus DeviceState = %x U‹ìQ‹E€eÿV‹u W‹x(ƒþtC~2ƒþ~ƒþu(h$è¹ Y‰w\ë6ÿ4µ”1hÄ$è¢ Y‰w\YëVh%è YYëhè$è‚ YÆEÿŠEÿ_^É dabusb_QueryCapabilities() ntStatus from IoCallDriver to PCI = 0x%x dabusb_QueryCapabilities() failed U‹ìƒì‹EjŠ@0Pÿä0‹Ð…Ò‰Uüu ¸šÀé°S‹] VWj3ÀY‹ûó«ƒKÿƒK ÿfÇ@fÇC‹r`PPƒî$EìPÆÆF ÿ¤0‹}üMì‹×‹G`Ç@ø<ƒè$‰H ‹MÆ@à‰^ÇG»Àÿ0‹ðVh¨%èj YþYu3ÀPPPEìjPÿœ0‹w…ö} hð%è> YWÿÜ0‹Æ_^[ÉÂÌenter dabusb_PowerIrp_Complete exit dabusb_PowerIrp_Complete Exit IRP_MN_SET_POWER D0 complete Vhð&èÀ‹D$‹t$Y€x!‹V(t‹H`€IÇB\ƒ`Vè:Ûÿÿh'èŒY3À^ ÌEnter dabusb_PoRequestCompletion() dabusb_PoRequestCompletion() Exit IRP_MN_SET_POWER U‹ìQ‹ESVW‹X(‹Eh˜'‹³ ‹‰uü‰Eè‹v`YjFÜYÿuü‹øó¥€`ÿ1ÿuüÿsÿ1ÿuèyÚÿÿh¼'è˃£ ‹EY_^[ÉÂÌ dabusb_ProcessPowerIrp() IRP_MJ_POWER dabusb_ProcessPowerIrp() Enter IRP_MN_WAIT_WAKE Exit dabusb_ProcessPowerIrp(), ntStatus STATUS_INVALID_DEVICE_STATE dabusb_ProcessPowerIrp() done waiting for PDO to finish IRP_MN_WAIT_WAKE dabusb_ProcessPowerIrp() Exit IRP_MN_WAIT_WAKE dabusb_ProcessPowerIrp() Enter IRP_MN_SET_POWER dabusb_ProcessPowerIrp() Set Power, type SystemPowerState = %s dabusb_ProcessPowerIrp() PowerSystemWorking, will set D0, not use state map dabusb_ProcessPowerIrp() IRP_MN_WAIT_WAKE pending, will use state map dabusb_ProcessPowerIrp() Not EnabledForWakeup and the system's not in working state, settting PowerDeviceD3 (off ) dabusb_ProcessPowerIrp() Set Power, desiredDevicePowerState = %s dabusb_ProcessPowerIrp() Exit IRP_MN_SET_POWER dabusb_ProcessPowerIrp() Set Power, type DevicePowerState = %s dabusb_ProcessPowerIrp() Set PowerIrp Completion Routine, fGoingToD0 =%d dabusb_ProcessPowerIrp() Exit IRP_MN_SET_POWER dabusb_ProcessPowerIrp() IRP_MN_QUERY_POWER %d %s %s dabusb_ProcessPowerIrp() UNKNOWN POWER MESSAGE (%x) Exit dabusb_ProcessPowerIrp() ntStatus = 0x%x U‹ìƒìƒeüSVWhd(è-‹E‹] Y‹p(‹{`P‰uøèûÕÿÿ¶G‹Èƒé„ÿII„ŽItBPhp,èòYY‹s`jYFÜS‹øó¥€`ÿ1‹EøSÿpÿ1‰EüÿuèdÕÿÿéx‹G Áàÿ°”1ÿ°t1ÿwh8,蜃ă¾¼t Sÿ1¸£À2ҋˉEü‰Cÿ¬0ëªh„)èh‹GYƒè„™H…‹G ÿ4…”1h|+è@YYÿw ÿuèL÷ÿÿ‹s`ˆEjFÜY‹øó¥€`€}t(¶EPh¼+è ‹C`YYƒè$‹MÇ@Q'‰H Æ@àSÿ1‹EøSÿpÿ1€}‰EüuÿuèpÔÿÿh,éy‹ ÿ4½t1h¸)è®YƒÿYuhø)뀾´t ‹|¾phH*ëj_h*èYÿ4½”1h+èm;~\YYt#j‰ž ÿuhð'Wjÿ6ÿ1‰Eüé‹s`jYFÜS‹øó¥€`ÿ1‹EøSÿpÿ1ÿu‰Eüè·ÓÿÿhL+éÀhŒ(èÿ‹†Y‹N\‰†¸ƒù„·;Á¯jEèjPƆ´ÿ¤0‹s`jYFÜS‹øó¥€`‹C`ƒè$MèÇ@<‰H Æ@àÿ1‹uøSÿvÿ1=‰Eüu3ÀPPPEèjPÿœ0h)èhYjÿuèõóÿÿÿu€¦´èòÒÿÿhT)èDYÿuüh¨,è6‹EüYYë'¾„À2ҋˉsÿ¬0hÀ(èYÿuè®Òÿÿ‹Æ_^[ÉÂÌÿ%°0ÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ È‹L$ u ‹D$÷áÂS÷á‹Ø‹D$÷d$Ø‹D$÷áÓ[ÂÖ5ê5464ö3Þ34l4F4–4®4Ä4Z4~4ö45&5Ð4V5Ð3Š5”5¬5¸5Æ5Þ4D5þ56626D6X6h6v5¼6”6õ¯f;=õ¯f;`>õ¯f;0p@´2 2ˆ2p2X2@2,222ð1à1Ð1À1¬1PowerDeviceMaximumPowerDeviceD3PowerDeviceD2PowerDeviceD1PowerDeviceD0PowerDeviceUnspecifiedPowerSystemMaximumPowerSystemShutdownPowerSystemHibernatePowerSystemSleeping3PowerSystemSleeping2PowerSystemSleeping1PowerSystemWorkingPowerSystemUnspecified<3~6Œ003Œ6€0Ä3æ61Ö5ê5464ö3Þ34l4F4–4®4Ä4Z4~4ö45&5Ð4V5Ð3Š5”5¬5¸5Æ5Þ4D5þ56626D6X6h6v5¼6”6•KeSetEvent&InterlockedDecrement(InterlockedIncrementuKeClearEventœKeWaitForSingleObjectoIofCallDriver{KeInitializeEvent?IoDeleteDeviceAIoDetachDeviceÚRtlFreeUnicodeString@IoDeleteSymbolicLinkpIofCompleteRequestDbgPrint ExFreePool=IoCreateSymbolicLink~KeInitializeSpinLock}KeInitializeSemaphore2IoAttachDeviceToDeviceStack:IoCreateDeviceÉRtlAnsiStringToUnicodeStringÜRtlInitAnsiString+sprintfExAllocatePoolWithTagDIoFreeIrp7IoCancelIrp.IoAllocateIrp KfReleaseSpinLockKfAcquireSpinLocktKeCancelTimer—KeSetTimer€KeInitializeTimerExzKeInitializeDpcºPoRequestPowerIrp·PoCallDriver½PoStartNextPowerIrpNTOSKRNL.EXEHAL.DLL_USBD_CreateConfigurationRequestEx@8_USBD_ParseConfigurationDescriptorEx@28USBD.SYS€0€H`7PP4VS_VERSION_INFO½ïþ?°StringFileInfoŒ040904b0Comments\CompanyNameBaycom Hard- und Software GBR< FileDescriptionbaycomusb6 FileVersion1, 0, 0, 4.InternalNamedriverPLegalCopyrightCopyright © 1999-2001(LegalTrademarksDOriginalFilenamebaycomusb.sys PrivateBuild0ProductNameUSBFLEX0ProductVersion1.01a SpecialBuildDVarFileInfo$Translation °¤Ï2Õ2 3!313F3n3”3§3¾3è3ï3ø3ÿ3?4ø45G5b5±5Ý5ú56»6Ì6ã6é6ú6 7787I7^7n7¾7ñ7+888L8c8r8}8Š8¤8Ú8æ8Q9m9“9¡9:#:*:1:;:E:L:S:Z:Ü:ì:*;:;v;‹;Ÿ;·;Þ;W<~<‰<’<å<œ=I>‡?’?ë?p(0D0™0"1[1§1 22*2o2ñ3 44<4G4T4Â4Ñ4â4Ð56 66J6t6†6§6µ6Ñ6â6ë677'7F7W7ô7ý7 8|8Š8«8ê8;9²9ý9 =+>?N?Y?ö?  0ú01!1,1R1h1r1Á3Ö3ø3 4"414c4k4}4Z5l5q5ƒ5‘5$6r6„6¡6©6É6Õ6â6S7‡78/8;8H8æ >.>;>Q>`>e>v>Š>”>¡>¦>Â>Í>í>ú> ??O?q?~?‹?¦?«?Ï?Ý?û?0(00t1x1|1€1„1ˆ1Œ11”1˜1œ1 1¤1¨1.\lib\i386\baycmusb.sysÀ?;<Rz ÓÌ? >J„¨ Ó,¤ Ó²I: u Ó U° # ÓÔ / ƒ² P Ó” ÒrßR~ƒÓœà®U ÓH’ÒÓê2XÓjCÓ®*ÓØ¸ÓÏEÜ ¬ Ó´#Û5%sÒ&ÜÓQ'Fð's ÓØ,C ÓNB10õ¯f;E:\wdmdrv\lib\i386\baycmusb.pdbbaycomusb-0.10.orig/wdmdrv/bcioctl.c0100644000175100017510000012327107325615172015514 0ustar abaaba/* * Include files needed for WDM driver support */ #include #include "stdarg.h" #include "stdio.h" /* * Include files needed for USB support */ #include "usbdi.h" #include "usbdlib.h" /* * Include file for the baycomusb Device */ #include "bcusb.h" #include "usbdevio.h" #if 0 #define VLOG(x) do { x; } while (0) #else #define VLOG(x) do { } while (0) #endif #if 1 #define ELOG(x) do { x; } while (0) #else #define ELOG(x) do { } while (0) #endif /* * Helper structures for synchronous calls to USBD with timeout */ #define USBDEVFS_INTERNAL_CONTROL CTL_CODE(FILE_DEVICE_USBDEVIO,256,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_INTERNAL_BULK CTL_CODE(FILE_DEVICE_USBDEVIO,257,METHOD_BUFFERED,FILE_ANY_ACCESS) struct internal_ctrlbulk { unsigned int timeout; /* in milliseconds */ PURB urb; }; /* * Synchronous call to usbd; note: no timeout */ NTSTATUS call_usbd(PDEVICE_OBJECT fdo, PURB urb) { NTSTATUS ret; pdabusb_t s; PIRP irp; KEVENT event; IO_STATUS_BLOCK ioStatus; PIO_STACK_LOCATION ns; s = fdo->DeviceExtension; if(s->device_state == _removed || s->CurrentDevicePowerState == PowerDeviceD3) return STATUS_DELETE_PENDING; KeInitializeEvent(&event, NotificationEvent, FALSE); irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB, s->sdo, NULL, 0, NULL, 0, TRUE, /* INTERNAL */ &event, &ioStatus); ns = IoGetNextIrpStackLocation(irp); ASSERT(ns != NULL); ns->Parameters.Others.Argument1 = urb; ret = IoCallDriver(s->sdo, irp); if (ret == STATUS_PENDING) { KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, NULL); ret = ioStatus.Status; } if(!NT_SUCCESS(ret) || !USBD_SUCCESS(urb->UrbHeader.Status)) ELOG(printk(MODSTR"call_usbd: NT-Status: %08X URB-Status: %08X\n", ret, urb->UrbHeader.Status)); return ret; } /* * Synchronous call to usbd; with timeout */ static NTSTATUS callusbdtimeoutcompletion(PDEVICE_OBJECT devobj, PIRP irp, PKEVENT event) { KeSetEvent(event, 0, FALSE); return STATUS_MORE_PROCESSING_REQUIRED; } NTSTATUS call_usbd_timeout(PDEVICE_OBJECT fdo, PURB urb, unsigned int tmo) { NTSTATUS ret; pdabusb_t s; PIRP irp; KEVENT event; IO_STATUS_BLOCK ioStatus; PIO_STACK_LOCATION ns; LARGE_INTEGER timeout; s = fdo->DeviceExtension; if(s->device_state == _removed || s->CurrentDevicePowerState == PowerDeviceD3) return STATUS_DELETE_PENDING; KeInitializeEvent(&event, NotificationEvent, FALSE); irp = IoAllocateIrp((CCHAR)(s->sdo->StackSize+1), FALSE); if (!irp) return STATUS_INSUFFICIENT_RESOURCES; ns = IoGetNextIrpStackLocation(irp); ns->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; ns->Parameters.DeviceIoControl.OutputBufferLength = 0; ns->Parameters.DeviceIoControl.InputBufferLength = 0; ns->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; irp->AssociatedIrp.SystemBuffer = NULL; ns->Parameters.Others.Argument1 = urb; IoSetCompletionRoutine(irp, callusbdtimeoutcompletion, &event, TRUE, TRUE, TRUE); ret = IoCallDriver(s->sdo, irp); if (!NT_SUCCESS(ret)) goto out; if (ret != STATUS_PENDING) goto out; if (tmo) timeout.QuadPart = -10000 * (LONGLONG)tmo; ret = KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, tmo ? &timeout : NULL); if (ret == STATUS_TIMEOUT) { IoCancelIrp(irp); KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); } ret = irp->IoStatus.Status; /* STATUS_TIMEOUT is not an error condition... */ #if 0 if (ret == STATUS_CANCELLED) ret = STATUS_TIMEOUT; #endif out: IoFreeIrp(irp); if(!NT_SUCCESS(ret) || !USBD_SUCCESS(urb->UrbHeader.Status)) ELOG(printk(MODSTR"call_usbd: NT-Status: %08X URB-Status: %08X\n", ret, urb->UrbHeader.Status)); return ret; } /* * create URB's for control and bulk transfers */ static NTSTATUS make_control_urb(PURB *rurb, PDEVICE_OBJECT fdo, unsigned int flags, unsigned char requesttype, unsigned char request, unsigned short value, unsigned short index, unsigned short length, void *data, PMDL mdl) { pdabusb_t s = fdo->DeviceExtension; USHORT func; PURB urb; unsigned int flg; *rurb = NULL; if (request == 6 && requesttype == 0x80 && value >= 1 && value <= 3) { if (!(urb = kmalloc(sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST)))) return STATUS_NO_MEMORY; UsbBuildGetDescriptorRequest(urb, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), (value == 1) ? USB_DEVICE_DESCRIPTOR_TYPE : (value == 2) ? USB_CONFIGURATION_DESCRIPTOR_TYPE : USB_STRING_DESCRIPTOR_TYPE, index, 0, data, mdl, length, NULL); *rurb = urb; return STATUS_SUCCESS; } switch (requesttype & 0x60) { case 0x20: /* CLASS */ switch (requesttype & 0x1f) { case 0: func = URB_FUNCTION_CLASS_DEVICE; break; case 1: func = URB_FUNCTION_CLASS_INTERFACE; break; case 2: func = URB_FUNCTION_CLASS_ENDPOINT; break; case 3: func = URB_FUNCTION_CLASS_OTHER; break; default: return STATUS_INVALID_PARAMETER; } break; case 0x40: /* VENDOR */ switch (requesttype & 0x1f) { case 0: func = URB_FUNCTION_VENDOR_DEVICE; break; case 1: func = URB_FUNCTION_VENDOR_INTERFACE; break; case 2: func = URB_FUNCTION_VENDOR_ENDPOINT; break; case 3: func = URB_FUNCTION_VENDOR_OTHER; break; default: return STATUS_INVALID_PARAMETER; } break; default: return STATUS_INVALID_PARAMETER; } if (!(urb = kmalloc(sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST)))) return STATUS_NO_MEMORY; flg = ((requesttype & 0x80) ? USBD_TRANSFER_DIRECTION_IN : USBD_TRANSFER_DIRECTION_OUT); if (!(flags & USBDEVFS_URB_DISABLE_SPD)) flg |= USBD_SHORT_TRANSFER_OK; UsbBuildVendorRequest(urb, func, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), flg, 0, request, value, index, data, mdl, length, NULL); *rurb = urb; return STATUS_SUCCESS; } static NTSTATUS make_bulk_urb(PURB *rurb, PDEVICE_OBJECT fdo, unsigned int flags, unsigned int ep, unsigned int dlen, void *data, PMDL mdl) { pdabusb_t s = fdo->DeviceExtension; PURB urb, urb2 = NULL; unsigned int maxpktsz = 0, flg; *rurb = NULL; if (ep & 0x80) ep = (ep & 15) | 16; else ep &= 15; if (!s->eptopipeh[ep]) return STATUS_INVALID_PARAMETER; #if 0 /* URB link does not work by design, according to Microsoft */ if (ep < 16) maxpktsz = s->epmaxpkt[ep]; /* manually append NULL packet to conserve packet boundaries for BULK OUT */ if ((maxpktsz > 0) && (dlen > 0) && !(dlen % maxpktsz)) { VLOG(printk(MODSTR"make_bulk_urb: add zero length URB\n")); if (!(urb2 = kmalloc(sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER)))) return STATUS_NO_MEMORY; UsbBuildInterruptOrBulkTransferRequest(urb2, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), s->eptopipeh[ep], data, mdl, 0, USBD_SHORT_TRANSFER_OK, NULL); } #endif if (!(urb = kmalloc(sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER)))) { if (urb2) kfree(urb2); return STATUS_NO_MEMORY; } flg = 0; if (!(flags & USBDEVFS_URB_DISABLE_SPD)) flg |= USBD_SHORT_TRANSFER_OK; UsbBuildInterruptOrBulkTransferRequest(urb, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), s->eptopipeh[ep], data, mdl, dlen, flg, urb2); *rurb = urb; return STATUS_SUCCESS; } static NTSTATUS make_iso_urb(PURB *rurb, PDEVICE_OBJECT fdo, struct usbdevfs_isotransfer *iso, void *data, PMDL mdl) { pdabusb_t s = fdo->DeviceExtension; PURB urb; unsigned int ep, sz, i; *rurb = NULL; if (!iso || !data) return STATUS_INVALID_PARAMETER; ep = iso->ep; if (ep & 0x80) ep = (ep & 15) | 16; else ep &= 15; if (!s->eptopipeh[ep]) return STATUS_INVALID_PARAMETER; if (iso->number_of_packets < 1 || iso->number_of_packets > 256) return STATUS_INVALID_PARAMETER; sz = GET_ISO_URB_SIZE(iso->number_of_packets); if (!(urb = kmalloc(sz))) return STATUS_NO_MEMORY; memset(urb, 0, sz); urb->UrbIsochronousTransfer.Hdr.Function = URB_FUNCTION_ISOCH_TRANSFER; urb->UrbIsochronousTransfer.Hdr.Length = (USHORT)sz; urb->UrbIsochronousTransfer.PipeHandle = s->eptopipeh[ep]; urb->UrbIsochronousTransfer.TransferFlags = (ep & 0x10) ? USBD_TRANSFER_DIRECTION_IN : USBD_TRANSFER_DIRECTION_OUT; urb->UrbIsochronousTransfer.TransferBuffer = data; urb->UrbIsochronousTransfer.TransferBufferMDL = mdl; urb->UrbIsochronousTransfer.TransferBufferLength = iso->len; if (iso->flags & USBDEVFS_URB_ISO_ASAP) urb->UrbIsochronousTransfer.TransferFlags |= USBD_START_ISO_TRANSFER_ASAP; urb->UrbIsochronousTransfer.NumberOfPackets = iso->number_of_packets; urb->UrbIsochronousTransfer.UrbLink = NULL; urb->UrbIsochronousTransfer.StartFrame = iso->start_frame; for (i = 0; i < iso->number_of_packets; i++) { urb->UrbIsochronousTransfer.IsoPacket[i].Offset = iso->iso_frame_desc[i].offset; urb->UrbIsochronousTransfer.IsoPacket[i].Length = iso->iso_frame_desc[i].length; } *rurb = urb; return STATUS_SUCCESS; } static NTSTATUS make_resetep_urb(PURB *rurb, PDEVICE_OBJECT fdo, USHORT func, unsigned int ep) { pdabusb_t s = fdo->DeviceExtension; PURB urb; *rurb = NULL; if (ep & 0x80) ep = (ep & 15) | 16; else ep &= 15; if (!s->eptopipeh[ep]) return STATUS_INVALID_PARAMETER; if (!(urb = kmalloc(sizeof(struct _URB_PIPE_REQUEST)))) return STATUS_NO_MEMORY; RtlZeroMemory(urb, sizeof(struct _URB_PIPE_REQUEST)); urb->UrbHeader.Length = sizeof(struct _URB_PIPE_REQUEST); urb->UrbHeader.Function = func; urb->UrbPipeRequest.PipeHandle = s->eptopipeh[ep]; *rurb = urb; return STATUS_SUCCESS; } /* * completion handler */ #define COMPL_CONTROL 0 #define COMPL_BULK 1 #define COMPL_ISO 2 #define COMPL_ERRRETURN 3 #define COMPL_INTERNALCTRL 4 #define COMPL_INTERNALBULK 5 struct completionstate { PDEVICE_OBJECT fdo; unsigned int ctype; KDPC timeout_dpc; KTIMER timeout_timer; PIRP irp; PURB urb; NTSTATUS status; unsigned int cookie; struct list_head cancel_list; }; static void async_timeout(PKDPC dpc, PVOID dc, PVOID SystemArgument1, PVOID SystemArgument2) { struct completionstate *st = (struct completionstate *)dc; PDEVICE_OBJECT fdo = st->fdo; pdabusb_t s = fdo->DeviceExtension; if (!IoCancelIrp(st->irp)) ELOG(printk(MODSTR"async_timeout: IoCancelIrp failed\n")); ELOG(printk(MODSTR"async_timeout: st 0x%08x ctype %d\n", (unsigned int)st, st->ctype)); } static NTSTATUS async_complete(PDEVICE_OBJECT DevObj, PIRP irp, PVOID dc) { struct completionstate *st = (struct completionstate *)dc; PDEVICE_OBJECT fdo = st->fdo; pdabusb_t s = fdo->DeviceExtension; PURB urb = st->urb; NTSTATUS ret = STATUS_SUCCESS; struct usbdevfs_ctrltransfer *ctrl; struct usbdevfs_bulktransfer *bulk; struct usbdevfs_isotransfer *iso; unsigned int *uip; unsigned int i; KIRQL irql; KeCancelTimer(&st->timeout_timer); /* take out of cookie list */ KeAcquireSpinLock(&s->cancel_list_lock, &irql); list_del(&st->cancel_list); INIT_LIST_HEAD(&st->cancel_list); KeReleaseSpinLock(&s->cancel_list_lock, irql); #if 1 VLOG(printk(MODSTR"async_complete: st 0x%08x ntstat 0x%08x, usbd stat: 0x%08x len: %u\n", (unsigned int)st, irp->IoStatus.Status, urb->UrbHeader.Status, (st->ctype == COMPL_CONTROL) ? urb->UrbControlVendorClassRequest.TransferBufferLength : (st->ctype == COMPL_BULK) ? urb->UrbBulkOrInterruptTransfer.TransferBufferLength : 0)); #else if (!NT_SUCCESS(irp->IoStatus.Status) || !USBD_SUCCESS(urb->UrbHeader.Status)) ELOG(printk(MODSTR"async_complete: ntstat 0x%08x, usbd stat: 0x%08x\n", irp->IoStatus.Status, urb->UrbHeader.Status)); #endif /* If the lower driver returned PENDING, mark our stack location as pending also. */ if (irp->PendingReturned) IoMarkIrpPending(irp); /* completion type specific processing */ irp->IoStatus.Information = 0; switch (st->ctype) { case COMPL_CONTROL: ctrl = (struct usbdevfs_ctrltransfer *)irp->AssociatedIrp.SystemBuffer; ctrl->usberr = urb->UrbHeader.Status; ctrl->len = urb->UrbControlVendorClassRequest.TransferBufferLength; irp->IoStatus.Information = sizeof(struct usbdevfs_ctrltransfer); if (NT_SUCCESS(irp->IoStatus.Status) && USBD_SUCCESS(urb->UrbHeader.Status)) { if (ctrl->requesttype & 0x80) irp->IoStatus.Information = sizeof(struct usbdevfs_ctrltransfer) + ctrl->len; } else { s->lastusberror = urb->UrbHeader.Status; ret = STATUS_UNSUCCESSFUL; } break; case COMPL_BULK: bulk = (struct usbdevfs_bulktransfer *)irp->AssociatedIrp.SystemBuffer; bulk->usberr = urb->UrbHeader.Status; bulk->len = urb->UrbBulkOrInterruptTransfer.TransferBufferLength; if (urb->UrbBulkOrInterruptTransfer.UrbLink) kfree(urb->UrbBulkOrInterruptTransfer.UrbLink); urb->UrbBulkOrInterruptTransfer.UrbLink = NULL; if (NT_SUCCESS(irp->IoStatus.Status) && USBD_SUCCESS(urb->UrbHeader.Status)) { if (bulk->ep & 0x80) irp->IoStatus.Information = sizeof(struct usbdevfs_bulktransfer) + bulk->len; } else { s->lastusberror = urb->UrbHeader.Status; ret = STATUS_UNSUCCESSFUL; } break; case COMPL_ISO: iso = (struct usbdevfs_isotransfer *)irp->AssociatedIrp.SystemBuffer; iso->usberr = urb->UrbHeader.Status; iso->error_count = urb->UrbIsochronousTransfer.ErrorCount; for (i = 0; i < iso->number_of_packets; i++) { iso->iso_frame_desc[i].usberr = urb->UrbIsochronousTransfer.IsoPacket[i].Status; iso->iso_frame_desc[i].length = urb->UrbIsochronousTransfer.IsoPacket[i].Length; } if (urb->UrbIsochronousTransfer.UrbLink) kfree(urb->UrbIsochronousTransfer.UrbLink); urb->UrbIsochronousTransfer.UrbLink = NULL; if (NT_SUCCESS(irp->IoStatus.Status) && USBD_SUCCESS(urb->UrbHeader.Status)) { if (iso->ep & 0x80) irp->IoStatus.Information = iso->len; } else { s->lastusberror = urb->UrbHeader.Status; ret = STATUS_UNSUCCESSFUL; } break; case COMPL_ERRRETURN: uip = (unsigned int *)irp->AssociatedIrp.SystemBuffer; *uip = urb->UrbHeader.Status; irp->IoStatus.Information = sizeof(unsigned int); if (!NT_SUCCESS(irp->IoStatus.Status) || !USBD_SUCCESS(urb->UrbHeader.Status)) { s->lastusberror = urb->UrbHeader.Status; ret = STATUS_UNSUCCESSFUL; } break; case COMPL_INTERNALCTRL: irp->IoStatus.Information = urb->UrbControlVendorClassRequest.TransferBufferLength; if (!NT_SUCCESS(irp->IoStatus.Status) || !USBD_SUCCESS(urb->UrbHeader.Status)) ret = STATUS_UNSUCCESSFUL; break; case COMPL_INTERNALBULK: irp->IoStatus.Information = urb->UrbBulkOrInterruptTransfer.TransferBufferLength; if (!NT_SUCCESS(irp->IoStatus.Status) || !USBD_SUCCESS(urb->UrbHeader.Status)) ret = STATUS_UNSUCCESSFUL; break; default: ELOG(printk(MODSTR"unknown completion type: %d\n", st->ctype)); ret = STATUS_UNSUCCESSFUL; } irp->IoStatus.Status = ret; kfree(urb); kfree(st); dabusb_decrement_io_count(fdo); return (ret == STATUS_SUCCESS) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; }; static NTSTATUS async_usbd(PDEVICE_OBJECT fdo, PIRP irp, PURB urb, unsigned int tmo, unsigned int ctype, unsigned int cookie) { pdabusb_t s = fdo->DeviceExtension; struct completionstate *st = NULL; NTSTATUS ret; PIO_STACK_LOCATION ns; LARGE_INTEGER timeout; KIRQL irql; if(s->device_state == _removed || s->CurrentDevicePowerState == PowerDeviceD3) { ret = STATUS_DELETE_PENDING; goto out; } if (!urb) { ret = STATUS_INVALID_PARAMETER; goto out; } if (!(st = kmalloc(sizeof(struct completionstate)))) { ret = STATUS_INSUFFICIENT_RESOURCES; goto out; } dabusb_increment_io_count(fdo); /* set up callusbd state structure */ st->fdo = fdo; st->urb = urb; st->irp = irp; st->ctype = ctype; KeInitializeDpc(&st->timeout_dpc, async_timeout, st); KeInitializeTimerEx(&st->timeout_timer, NotificationTimer); INIT_LIST_HEAD(&st->cancel_list); st->cookie = cookie; /* setup next IRP location */ ns = IoGetNextIrpStackLocation(irp); ASSERT(ns != NULL); ns->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; ns->Parameters.Others.Argument1 = urb; ns->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB; IoSetCompletionRoutine(irp, async_complete, st, TRUE, TRUE, TRUE); /* set timer if requested */ if (tmo) { timeout.QuadPart = -10000 * (LONGLONG)tmo; VLOG(printk(MODSTR"async_usbd: timeout %ums setting timeout %d\n", tmo, timeout.QuadPart)); KeSetTimer(&st->timeout_timer, timeout, &st->timeout_dpc); } /* put into cookie list */ KeAcquireSpinLock(&s->cancel_list_lock, &irql); list_add_tail(&st->cancel_list, &s->cancel_list); KeReleaseSpinLock(&s->cancel_list_lock, irql); ret = IoCallDriver(s->sdo, irp); if (ret == STATUS_PENDING) return ret; if (NT_SUCCESS(ret)) VLOG(printk(MODSTR"async_usbd: IoCallDriver successfully returned 0x%08x\n", ret)); else ELOG(printk(MODSTR"async_usbd: IoCallDriver error 0x%08x\n", ret)); KeCancelTimer(&st->timeout_timer); KeAcquireSpinLock(&s->cancel_list_lock, &irql); list_del(&st->cancel_list); INIT_LIST_HEAD(&st->cancel_list); KeReleaseSpinLock(&s->cancel_list_lock, irql); kfree(urb); kfree(st); irp->IoStatus.Status = ret; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); dabusb_decrement_io_count(fdo); return ret; out: if (urb) kfree(urb); if (st) kfree(st); irp->IoStatus.Status = ret; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); return ret; } static NTSTATUS async_cancel(PDEVICE_OBJECT fdo, unsigned int cookie) { pdabusb_t s = fdo->DeviceExtension; struct completionstate *st; struct list_head *list; KIRQL irql; PIRP irp; unsigned int killed = 0, killerr = 0; if (!cookie) { VLOG(printk(MODSTR"async_cancel: invalid cookie %u\n", cookie)); return STATUS_INVALID_PARAMETER; } for (;;) { irp = NULL; KeAcquireSpinLock(&s->cancel_list_lock, &irql); for (list = s->cancel_list.next; list != &s->cancel_list;) { st = list_entry(list, struct completionstate, cancel_list); list = list->next; if (st->cookie == cookie) { irp = st->irp; list_del(&st->cancel_list); INIT_LIST_HEAD(&st->cancel_list); break; } } KeReleaseSpinLock(&s->cancel_list_lock, irql); if (!irp) break; /* race with normal/timeout completion?? */ if (IoCancelIrp(irp)) killed++; else killerr++; VLOG(printk(MODSTR"async_cancel: found killable irp: %p killed: %u killerr: %u\n", irp, killed, killerr)); } if (killerr) { VLOG(printk(MODSTR"async_cancel: unsuccessful\n")); return STATUS_UNSUCCESSFUL; } else if (killed) { VLOG(printk(MODSTR"async_cancel: success\n")); return STATUS_SUCCESS; } VLOG(printk(MODSTR"async_cancel: no killable irps with cookie %u found\n", cookie)); return STATUS_INVALID_PARAMETER_1; } NTSTATUS async_cancel_all(PDEVICE_OBJECT fdo) { pdabusb_t s = fdo->DeviceExtension; struct completionstate *st; struct list_head *list; KIRQL irql; PIRP irp; NTSTATUS ret = STATUS_SUCCESS; VLOG(printk(MODSTR"async_cancel_all: entering\n")); for (;;) { irp = NULL; KeAcquireSpinLock(&s->cancel_list_lock, &irql); list = s->cancel_list.next; if (list != &s->cancel_list) { st = list_entry(list, struct completionstate, cancel_list); list_del(&st->cancel_list); INIT_LIST_HEAD(&st->cancel_list); irp = st->irp; } KeReleaseSpinLock(&s->cancel_list_lock, irql); if (!irp) break; VLOG(printk(MODSTR"async_cancel_all: cancelling IRP 0x%08x\n", (unsigned long)irp)); if (!IoCancelIrp(irp)) { ret = STATUS_UNSUCCESSFUL; ELOG(printk(MODSTR"async_cancel_all: IoCancelIrp failed\n")); } } VLOG(printk(MODSTR"async_cancel_all: leaving 0x%08x\n", ret)); return ret; } /* * Synchronous calls */ int usb_control_msg(PDEVICE_OBJECT fdo, unsigned char requesttype, unsigned char request, unsigned short value, unsigned short index, unsigned short length, void *data, unsigned int timeout) { pdabusb_t s = fdo->DeviceExtension; PURB urb; NTSTATUS ret; ret = make_control_urb(&urb, fdo, 0, requesttype, request, value, index, length, data, NULL); if (!NT_SUCCESS(ret)) return ret; //ret = call_usbd(fdo, urb); ret = call_usbd_timeout(fdo, urb, timeout); if (NT_SUCCESS(ret)) { if (USBD_SUCCESS(urb->UrbHeader.Status)) ret = urb->UrbControlVendorClassRequest.TransferBufferLength; else ret = STATUS_UNSUCCESSFUL; } kfree(urb); return ret; } int usb_bulk_msg(PDEVICE_OBJECT fdo, unsigned int ep, unsigned int dlen, void *data, unsigned int timeout) { pdabusb_t s = fdo->DeviceExtension; PURB urb; NTSTATUS ret; ret = make_bulk_urb(&urb, fdo, 0, ep, dlen, data, NULL); if (!NT_SUCCESS(ret)) return ret; //ret = call_usbd(fdo, urb); ret = call_usbd_timeout(fdo, urb, timeout); if (NT_SUCCESS(ret)) { if (USBD_SUCCESS(urb->UrbHeader.Status)) ret = urb->UrbControlVendorClassRequest.TransferBufferLength; else ret = STATUS_UNSUCCESSFUL; } kfree(urb); return ret; } NTSTATUS abort_pipes(PDEVICE_OBJECT fdo) { pdabusb_t s = fdo->DeviceExtension; PURB urb; unsigned int i; NTSTATUS ret; VLOG(printk(MODSTR"abort_pipes: enter\n")); if (!(urb = kmalloc(sizeof(struct _URB_PIPE_REQUEST)))) { ELOG(printk(MODSTR"abort_pipes: out of memory\n")); return STATUS_NO_MEMORY; } for (i = 0; i < 32; i++) { if (!s->eptopipeh[i]) continue; VLOG(printk(MODSTR"abort_pipes: aborting pipe %u\n", i)); RtlZeroMemory(urb, sizeof(struct _URB_PIPE_REQUEST)); urb->UrbHeader.Length = sizeof(struct _URB_PIPE_REQUEST); urb->UrbHeader.Function = URB_FUNCTION_ABORT_PIPE; urb->UrbPipeRequest.PipeHandle = s->eptopipeh[i]; ret = call_usbd_timeout(fdo, urb, 100); if (!NT_SUCCESS(ret) || !USBD_SUCCESS(urb->UrbHeader.Status)) ELOG(printk(MODSTR"abort_pipes: pipe %u abort error 0x%08x, 0x%08x\n", ret, urb->UrbHeader.Status)); RtlZeroMemory(urb, sizeof(struct _URB_PIPE_REQUEST)); urb->UrbHeader.Length = sizeof(struct _URB_PIPE_REQUEST); urb->UrbHeader.Function = URB_FUNCTION_RESET_PIPE; urb->UrbPipeRequest.PipeHandle = s->eptopipeh[i]; ret = call_usbd_timeout(fdo, urb, 100); if (!NT_SUCCESS(ret) || !USBD_SUCCESS(urb->UrbHeader.Status)) ELOG(printk(MODSTR"abort_pipes: pipe %u reset error 0x%08x, 0x%08x\n", ret, urb->UrbHeader.Status)); } kfree(urb); VLOG(printk(MODSTR"abort_pipes: exit\n")); return STATUS_SUCCESS; } int usb_resetep(PDEVICE_OBJECT fdo, unsigned int ep) { pdabusb_t s = fdo->DeviceExtension; PURB urb; NTSTATUS ret; ret = make_resetep_urb(&urb, fdo, URB_FUNCTION_RESET_PIPE, ep); if (!NT_SUCCESS(ret)) return ret; //ret = call_usbd(fdo, urb); ret = call_usbd_timeout(fdo, urb, 100); if (NT_SUCCESS(ret)) { if (USBD_SUCCESS(urb->UrbHeader.Status)) ret = urb->UrbControlVendorClassRequest.TransferBufferLength; else ret = STATUS_UNSUCCESSFUL; } kfree(urb); return ret; } static PUSB_CONFIGURATION_DESCRIPTOR getcfgdesc(PDEVICE_OBJECT fdo, unsigned int index) { pdabusb_t s = fdo->DeviceExtension; PUSB_CONFIGURATION_DESCRIPTOR cfgdesc; PURB urb; NTSTATUS ret; unsigned int sz; if (!(urb = kmalloc(sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST)))) return NULL; sz = sizeof(USB_CONFIGURATION_DESCRIPTOR) + 16; if (!(cfgdesc = kmalloc(sz))) { kfree(urb); return NULL; } UsbBuildGetDescriptorRequest(urb, sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, index, 0, cfgdesc, NULL, sizeof(USB_CONFIGURATION_DESCRIPTOR), /* Get only the configuration descriptor */ NULL); //ret = call_usbd(fdo, urb); ret = call_usbd_timeout(fdo, urb, 100); if (!NT_SUCCESS(ret)) { kfree(cfgdesc); kfree(urb); return NULL; } sz = cfgdesc->wTotalLength + 16; kfree(cfgdesc); if (!(cfgdesc = kmalloc(sz))) { kfree(urb); return NULL; } UsbBuildGetDescriptorRequest(urb, sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, index, 0, cfgdesc, NULL, sz, NULL); //ret = call_usbd(fdo, urb); ret = call_usbd_timeout(fdo, urb, 100); if (!NT_SUCCESS(ret)) { kfree(cfgdesc); kfree(urb); return NULL; } kfree(urb); return cfgdesc; } int usb_setconfiguration(PDEVICE_OBJECT fdo, unsigned int configuration) { pdabusb_t s = fdo->DeviceExtension; PUSB_CONFIGURATION_DESCRIPTOR cfgdesc; USBD_INTERFACE_LIST_ENTRY iflist; PURB urb; NTSTATUS ret; int ret2; unsigned int index; for (index = 0; index < 256; index++) { cfgdesc = getcfgdesc(fdo, index); if (!cfgdesc) break; if (cfgdesc->bConfigurationValue == configuration) break; kfree(cfgdesc); cfgdesc = NULL; } if (!cfgdesc) { ELOG(printk(MODSTR"failure to get configuration descriptor\n")); return STATUS_INVALID_PARAMETER; } abort_pipes(fdo); memset(&s->eptopipeh, 0, sizeof(s->eptopipeh)); memset(&s->epmaxpkt, 0, sizeof(s->epmaxpkt)); kfree(cfgdesc); return STATUS_SUCCESS; } int usb_setinterface(PDEVICE_OBJECT fdo, unsigned int intf, unsigned int altsetting) { pdabusb_t s = fdo->DeviceExtension; PURB urb; PUSB_CONFIGURATION_DESCRIPTOR cfgdesc; PUSBD_INTERFACE_INFORMATION ifobj; USBD_INTERFACE_LIST_ENTRY iflist[2]; NTSTATUS ret; unsigned int i, j, ep; abort_pipes(fdo); memset(&s->eptopipeh, 0, sizeof(s->eptopipeh)); memset(&s->epmaxpkt, 0, sizeof(s->epmaxpkt)); cfgdesc = getcfgdesc(fdo, s->cfgindex); if (!cfgdesc) { ELOG(printk(MODSTR"failure to get configuration descriptor\n")); return STATUS_INVALID_PARAMETER; } iflist[0].InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(cfgdesc, cfgdesc, intf, altsetting, -1, -1, -1); if (!iflist[0].InterfaceDescriptor) { ELOG(printk(MODSTR"invalid interface %u altsetting %u\n", intf, altsetting)); kfree(cfgdesc); return STATUS_INVALID_PARAMETER; } iflist[1].InterfaceDescriptor = NULL; iflist[1].Interface = NULL; urb = USBD_CreateConfigurationRequestEx(cfgdesc, &iflist[0]); if (!urb) { ELOG(printk(MODSTR "USBD_CreateConfigurationRequestEx failed\n")); kfree(cfgdesc); return STATUS_INVALID_PARAMETER; } //ret = call_usbd(fdo, urb); ret = call_usbd_timeout(fdo, urb, 100); if (!NT_SUCCESS(ret) || !USBD_SUCCESS(urb->UrbHeader.Status)) { kfree(cfgdesc); kfree(urb); ELOG(printk(MODSTR"Error in configuration request: ntstatus %d urb status %d\n", ret, urb->UrbHeader.Status)); return NT_SUCCESS(ret) ? STATUS_UNSUCCESSFUL : ret; } ifobj = (PUSBD_INTERFACE_INFORMATION)(&(urb->UrbSelectConfiguration.Interface)); /* save in our EP->pipehandle translation table */ for (i = 0; i < ifobj->NumberOfPipes; i++) { ep = ifobj->Pipes[i].EndpointAddress & 15; if (ifobj->Pipes[i].EndpointAddress & 0x80) ep |= 16; else s->epmaxpkt[ep] = ifobj->Pipes[i].MaximumPacketSize; s->eptopipeh[ep] = ifobj->Pipes[i].PipeHandle; } kfree(cfgdesc); kfree(urb); return STATUS_SUCCESS; } int usb_claiminterface(PDEVICE_OBJECT fdo, unsigned int intf) { return STATUS_SUCCESS; } int usb_releaseinterface(PDEVICE_OBJECT fdo, unsigned int intf) { return STATUS_SUCCESS; } NTSTATUS baycomusb_internal_ioctl(IN PDEVICE_OBJECT fdo, IN PIRP irp) { pdabusb_t s = fdo->DeviceExtension; NTSTATUS ret = STATUS_INVALID_PARAMETER; PIO_STACK_LOCATION irpSp; struct internal_ctrlbulk *cb; irpSp = IoGetCurrentIrpStackLocation(irp); VLOG(printk(MODSTR"ioctlinternal>>>> code 0x%08x\n", irpSp->Parameters.DeviceIoControl.IoControlCode)); switch (irpSp->Parameters.DeviceIoControl.IoControlCode) { case USBDEVFS_INTERNAL_CONTROL: cb = irpSp->Parameters.Others.Argument1; ret = async_usbd(fdo, irp, cb->urb, cb->timeout, COMPL_INTERNALCTRL, 0); break; case USBDEVFS_INTERNAL_BULK: cb = irpSp->Parameters.Others.Argument1; ret = async_usbd(fdo, irp, cb->urb, cb->timeout, COMPL_INTERNALBULK, 0); break; default: return baycomusb_ioctl(fdo, irp); } VLOG(printk(MODSTR"ioctlinternal<<<< async: status 0x%08x retstatus 0x%08x info %d usberr 0x%08x\n", irp->IoStatus.Status, ret, irp->IoStatus.Information, s->lastusberror)); return ret; } NTSTATUS baycomusb_ioctl(IN PDEVICE_OBJECT fdo, IN PIRP irp) { pdabusb_t s = fdo->DeviceExtension; NTSTATUS ret = STATUS_INVALID_PARAMETER; PIO_STACK_LOCATION irpSp; struct usbdevfs_ctrltransfer *ctrl; struct usbdevfs_bulktransfer *bulk; struct usbdevfs_isotransfer *iso; struct usbdevfs_setinterface *setif; struct usbdevfs_setconfig *setcfg; struct usbdevfs_resetep *rstep; PURB urb = NULL; PULONG ulptr; unsigned int i, j, k; irpSp = IoGetCurrentIrpStackLocation(irp); VLOG(printk(MODSTR"ioctl>>>> code 0x%08x\n", irpSp->Parameters.DeviceIoControl.IoControlCode)); switch (irpSp->Parameters.DeviceIoControl.IoControlCode) { case USBDEVFS_CONTROL: ctrl = (struct usbdevfs_ctrltransfer *)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_ctrltransfer) || irpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct usbdevfs_ctrltransfer) || ((ctrl->requesttype & 0x80) && irpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct usbdevfs_ctrltransfer) + ctrl->len) || (!(ctrl->requesttype & 0x80) && irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_ctrltransfer) + ctrl->len)) goto outseterr; VLOG(printk(MODSTR" >>>> rq 0x%02x rqt 0x%02x val 0x%04x idx 0x%04x len %u tmo %u flg 0x%x\n", ctrl->request, ctrl->requesttype, ctrl->value, ctrl->index, ctrl->len, ctrl->timeout, ctrl->flags)); /* async version */ ret = make_control_urb(&urb, fdo, ctrl->flags, ctrl->requesttype, ctrl->request, ctrl->value, ctrl->index, (unsigned short)ctrl->len, (void *)(ctrl + 1), NULL); if (!NT_SUCCESS(ret)) goto outseterr; ret = async_usbd(fdo, irp, urb, ctrl->timeout, COMPL_CONTROL, ctrl->cookie); goto outasyncok; case USBDEVFS_BULK: bulk = (struct usbdevfs_bulktransfer *)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_bulktransfer) || irpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct usbdevfs_bulktransfer) || ((bulk->ep & 0x80) && irpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct usbdevfs_bulktransfer) + bulk->len) || (!(bulk->ep & 0x80) && irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_bulktransfer) + bulk->len)) goto outseterr; VLOG(printk(MODSTR" >>>> ep 0x%02x len %u tmo %u flg 0x%x\n", bulk->ep, bulk->len, bulk->timeout, bulk->flags)); /* async version */ ret = make_bulk_urb(&urb, fdo, bulk->flags, bulk->ep, bulk->len, (void *)(bulk + 1), NULL); if (!NT_SUCCESS(ret)) goto outseterr; ret = async_usbd(fdo, irp, urb, bulk->timeout, COMPL_BULK, bulk->cookie); goto outasyncok; case USBDEVFS_ISO: iso = (struct usbdevfs_isotransfer *)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_isotransfer) || irpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct usbdevfs_isotransfer)) goto outseterr; i = sizeof(struct usbdevfs_isotransfer) + iso->number_of_packets * sizeof(struct usbdevfs_isopacketdesc); if (irpSp->Parameters.DeviceIoControl.InputBufferLength < i || irpSp->Parameters.DeviceIoControl.OutputBufferLength < i) goto outseterr; if (iso->len > irpSp->Parameters.DeviceIoControl.InputBufferLength || iso->len > irpSp->Parameters.DeviceIoControl.OutputBufferLength) goto outseterr; for (i = j = 0; j < iso->number_of_packets; j++) { k = iso->iso_frame_desc[j].offset + iso->iso_frame_desc[j].length; if (k < iso->iso_frame_desc[j].offset) goto outseterr; if (i < k) i = k; } if (i > iso->len) goto outseterr; VLOG(printk(MODSTR" >>>> ep 0x%02x len %u flg 0x%x\n", iso->ep, i, iso->flags)); /* async version */ ret = make_iso_urb(&urb, fdo, iso, iso, NULL); if (!NT_SUCCESS(ret)) goto outseterr; ret = async_usbd(fdo, irp, urb, iso->timeout, COMPL_ISO, iso->cookie); goto outasyncok; case USBDEVFS_RESETEP: rstep = (struct usbdevfs_resetep *)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_resetep) || irpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(unsigned int)) goto outseterr; VLOG(printk(MODSTR" >>>> ep 0x%02x\n", rstep->ep)); /* async version */ ret = make_resetep_urb(&urb, fdo, URB_FUNCTION_RESET_PIPE, rstep->ep); if (!NT_SUCCESS(ret)) goto outseterr; ret = async_usbd(fdo, irp, urb, 1000, COMPL_ERRRETURN, 0); goto outasyncok; case USBDEVFS_ABORTEP: rstep = (struct usbdevfs_resetep *)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_resetep) || irpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(unsigned int)) goto outseterr; VLOG(printk(MODSTR" >>>> ep 0x%02x\n", rstep->ep)); /* async version */ ret = make_resetep_urb(&urb, fdo, URB_FUNCTION_ABORT_PIPE, rstep->ep); if (!NT_SUCCESS(ret)) goto outseterr; ret = async_usbd(fdo, irp, urb, 1000, COMPL_ERRRETURN, 0); goto outasyncok; case USBDEVFS_SETINTERFACE: setif = (struct usbdevfs_setinterface *)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_setinterface)) { ret = STATUS_INVALID_PARAMETER; break; } VLOG(printk(MODSTR" >>>> interface %u altsetting %u\n", setif->interf, setif->altsetting)); ret = usb_setinterface(fdo, setif->interf, setif->altsetting); if (!NT_SUCCESS(ret)) goto outseterr; irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = ret; goto outcompl; case USBDEVFS_SETCONFIGURATION: setcfg = (struct usbdevfs_setconfig *)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct usbdevfs_setconfig)) { ret = STATUS_INVALID_PARAMETER; break; } ret = usb_setconfiguration(fdo, setcfg->config); if (!NT_SUCCESS(ret)) goto outseterr; irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = ret; goto outcompl; case USBDEVFS_CLAIMINTERFACE: irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = 0; goto outcompl; case USBDEVFS_RELEASEINTERFACE: irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = 0; goto outcompl; case USBDEVFS_GETLASTERROR: ulptr = (PULONG)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(*ulptr)) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; goto outcompl; } *ulptr = s->lastusberror; irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = sizeof(*ulptr); goto outcompl; case USBDEVFS_CANCELTRANSFER: ulptr = (PULONG)irp->AssociatedIrp.SystemBuffer; if (irpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(*ulptr)) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; goto outcompl; } irp->IoStatus.Status = async_cancel(fdo, *ulptr); irp->IoStatus.Information = 0; goto outcompl; default: ret = STATUS_NOT_IMPLEMENTED; goto outseterr; } goto outseterr; outseterr: irp->IoStatus.Status = ret; irp->IoStatus.Information = 0; outcompl: IoCompleteRequest(irp, IO_NO_INCREMENT); VLOG(printk(MODSTR"ioctl<<<< status 0x%08x info %d usberr 0x%08x\n", irp->IoStatus.Status, irp->IoStatus.Information, s->lastusberror)); return irp->IoStatus.Status; outasyncok: VLOG(printk(MODSTR"ioctl<<<< async: status 0x%08x retstatus 0x%08x info %d usberr 0x%08x\n", irp->IoStatus.Status, ret, irp->IoStatus.Information, s->lastusberror)); return ret; } baycomusb-0.10.orig/wdmdrv/bcusb.h0100644000175100017510000001076607325134424015200 0ustar abaaba#include "list.h" #define MODNAME "baycomusb" #define MODSTR MODNAME" "__FILE__": " #define VERSTR "0.09" #undef CONNECTEVENT #define EVENTNAME L"\\BaseNamedObjects\\baycomusbconnevent" enum { _removed, _remove_pending, _stopped, _stop_pending, _started } dabusb_device_state; typedef struct { // physical device object PDEVICE_OBJECT pdo; // Device object we call when submitting Urbs/Irps to the USB stack PDEVICE_OBJECT sdo; // set when PendingIoCount goes to 0; flags device can be removed KEVENT RemoveEvent; // set when PendingIoCount goes to 1 ( 1st increment was on add device ) // this indicates no IO requests outstanding, either user, system, or otherwise KEVENT NoPendingIoEvent; KEVENT release_ok; // incremented when device is added and any IO request is received; // decremented when any io request is completed or passed on, and when device is removed LONG pending_io_count; // 0 = removed, 1 = removing, 2 = loaded/stopped, 3 = started ULONG device_state; // DosDevice Name UNICODE_STRING deviceLinkUnicodeString; // open counter KSEMAPHORE open_sem; /* * power stuff */ // power management DEVICE_POWER_STATE CurrentDevicePowerState; //Bus drivers set the appropriate values in this structure in response //to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might //alter the capabilities set by the bus driver. DEVICE_CAPABILITIES DeviceCapabilities; // used to save the currently-being-handled system-requested power irp request PIRP PowerIrp; // set to signal driver-generated power request is finished KEVENT SelfRequestedPowerIrpEvent; // flag set when IRP_MN_WAIT_WAKE is received and we're in a power state // where we can signal a wait BOOLEAN EnabledForWakeup; // used to flag that we're currently handling a self-generated power request BOOLEAN SelfPowerIrp; // default power state to power down to on self-suspend ULONG PowerDownLevel; LONG opened; /* last USB error */ ULONG lastusberror; /* Pointer to pipe handles for ep->pipeh mapping */ void *eptopipeh[32]; unsigned int epmaxpkt[16]; /* we only need output maxpkt sizes */ /* configuration number */ unsigned int cfgindex; /* List of pending completion structs to cancel */ struct list_head cancel_list; KSPIN_LOCK cancel_list_lock; } dabusb_t, *pdabusb_t; #define KERN_EMERG "<0>" /* system is unusable */ #define KERN_ALERT "<1>" /* action must be taken immediately */ #define KERN_CRIT "<2>" /* critical conditions */ #define KERN_ERR "<3>" /* error conditions */ #define KERN_WARNING "<4>" /* warning conditions */ #define KERN_NOTICE "<5>" /* normal but significant condition */ #define KERN_INFO "<6>" /* informational */ #define KERN_DEBUG "<7>" /* debug-level messages */ #define printk DbgPrint #define kmalloc(size) ExAllocatePool(NonPagedPool,size) #define kfree ExFreePool #define mdelay(x) udelay(1000*(x)) #define b(x) printk(MODSTR "breakpoint: %d",x); DbgBreakPoint() // --------------- power.c --------------- NTSTATUS dabusb_dispatch_power( IN PDEVICE_OBJECT fdo, IN PIRP Irp); // --------------- bcioctl.c ------------- NTSTATUS baycomusb_ioctl(IN PDEVICE_OBJECT fdo, IN PIRP irp); NTSTATUS baycomusb_internal_ioctl(IN PDEVICE_OBJECT fdo, IN PIRP irp); VOID dabusb_increment_io_count( IN PDEVICE_OBJECT fdo); LONG dabusb_decrement_io_count( IN PDEVICE_OBJECT fdo); NTSTATUS OnRequestComplete(IN PDEVICE_OBJECT fdo, IN PIRP irp, IN PKEVENT pev ); NTSTATUS async_cancel_all(PDEVICE_OBJECT fdo); NTSTATUS abort_pipes(PDEVICE_OBJECT fdo); int usb_control_msg(PDEVICE_OBJECT fdo, unsigned char requesttype, unsigned char request, unsigned short value, unsigned short index, unsigned short length, void *data, unsigned int timeout); int usb_bulk_msg(PDEVICE_OBJECT fdo, unsigned int ep, unsigned int dlen, void *data, unsigned int timeout); int usb_resetep(PDEVICE_OBJECT fdo, unsigned int ep); int usb_setconfiguration(PDEVICE_OBJECT fdo, unsigned int configuration); int usb_setinterface(PDEVICE_OBJECT fdo, unsigned int intf, unsigned int altsetting); NTSTATUS dabusb_SelfSuspendOrActivate(IN PDEVICE_OBJECT fdo, IN BOOLEAN fSuspend); NTSTATUS dabusb_QueryCapabilities(IN PDEVICE_OBJECT Lowerfdo, IN PDEVICE_CAPABILITIES DeviceCapabilities); baycomusb-0.10.orig/wdmdrv/bcusb.rc0100644000175100017510000000504107325134424015343 0ustar abaaba//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Deutsch (Deutschland) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 LANGUAGE LANG_GERMAN, SUBLANG_GERMAN #pragma code_page(1252) #endif //_WIN32 #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x0L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Baycom Hard- und Software GBR\0" VALUE "FileDescription", "baycomusb\0" VALUE "FileVersion", "1, 0, 0, 4\0" VALUE "InternalName", "driver\0" VALUE "LegalCopyright", "Copyright © 1999-2001\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "baycomusb.sys\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "USBFLEX\0" VALUE "ProductVersion", "1.01a\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // !_MAC #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED baycomusb-0.10.orig/wdmdrv/dabusb.c0100644000175100017510000003572307325615142015336 0ustar abaaba// $Id: dabusb.c,v 1.40 2000/01/08 09:00:11 fliegl Exp $ // // Include files needed for WDM driver support // #include #include "stdarg.h" #include "stdio.h" // // Include files needed for USB support // #include "usbdi.h" #include "usbdlib.h" // // Include file for the dabusb Device // #include "bcusb.h" #if 0 #define VLOG(x) do { x; } while (0) #else #define VLOG(x) do { } while (0) #endif #if 1 #define ELOG(x) do { x; } while (0) #else #define ELOG(x) do { } while (0) #endif /* --------------------------------------------------------------------- */ #ifdef CONNECTEVENT /* IoCreateSynchronizationObject does not exist in W98 WDM */ static PKEVENT sync_event; static HANDLE sync_event_handle; #endif /* --------------------------------------------------------------------- */ LONG dabusb_decrement_io_count(PDEVICE_OBJECT fdo) { pdabusb_t s = fdo->DeviceExtension; LONG ioCount; ioCount = InterlockedDecrement(&s->pending_io_count); if (ioCount <= 1) { /* trigger no pending io */ KeSetEvent(&s->NoPendingIoEvent, 1, FALSE); } if (ioCount == 0) { /* trigger remove-device event */ KeSetEvent(&s->RemoveEvent, 1, FALSE); } return ioCount; } VOID dabusb_increment_io_count(PDEVICE_OBJECT fdo) { pdabusb_t s = fdo->DeviceExtension; LONG ioCount; KeClearEvent(&s->RemoveEvent); KeClearEvent(&s->NoPendingIoEvent); ioCount = InterlockedIncrement(&s->pending_io_count); if (ioCount <= 1) { /* trigger no pending io */ KeSetEvent(&s->NoPendingIoEvent, 1, FALSE); } } /* --------------------------------------------------------------------- */ NTSTATUS OnRequestComplete(IN PDEVICE_OBJECT fdo, IN PIRP irp, IN PKEVENT pev ) { KeSetEvent(pev, 0, FALSE); return STATUS_MORE_PROCESSING_REQUIRED; } NTSTATUS ForwardAndWait(IN PDEVICE_OBJECT fdo, IN PIRP irp ) { KEVENT event; pdabusb_t s = (pdabusb_t) fdo->DeviceExtension; NTSTATUS ret; ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); // // Initialize a kernel event object to use in waiting for the lower-level // driver to finish processing the object. // KeInitializeEvent(&event, NotificationEvent, FALSE); IoCopyCurrentIrpStackLocationToNext(irp); IoSetCompletionRoutine(irp, (PIO_COMPLETION_ROUTINE) OnRequestComplete, (PVOID) &event, TRUE, TRUE, TRUE); ret = IoCallDriver(s->sdo, irp); if (ret == STATUS_PENDING) { KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); ret = irp->IoStatus.Status; } return ret; } // ----------------------------------------------------------- static NTSTATUS dabusb_StartDevice(PDEVICE_OBJECT fdo) { NTSTATUS ret = STATUS_SUCCESS; unsigned char mode; VLOG(printk(MODSTR "enter dabusb_StartDevice\n")); //usb_control_msg(fdo, 0xc0, 0xc8, 0, 0, 1, &mode, 500); VLOG(printk(MODSTR "exit dabusb_StartDevice (%x)\n", ret)); return ret; } NTSTATUS dabusb_RemoveDevice( IN PDEVICE_OBJECT fdo) { pdabusb_t s = fdo->DeviceExtension; NTSTATUS ret = STATUS_SUCCESS; VLOG(printk(MODSTR "enter dabusb_RemoveDevice\n")); async_cancel_all(fdo); abort_pipes(fdo); IoDeleteSymbolicLink(&s->deviceLinkUnicodeString); RtlFreeUnicodeString(&s->deviceLinkUnicodeString); IoDetachDevice(s->sdo); IoDeleteDevice (fdo); VLOG(printk(MODSTR "exit dabusb_RemoveDevice (%x)\n", ret)); return ret; } NTSTATUS dabusb_HandleStartDevice( IN PDEVICE_OBJECT fdo, IN PIRP irp ) { NTSTATUS ret; PIO_STACK_LOCATION stack; // // First let all lower-level drivers handle this request. // ret = ForwardAndWait(fdo, irp); if (!NT_SUCCESS(ret)) { irp->IoStatus.Status = ret; IoCompleteRequest(irp, IO_NO_INCREMENT); return ret; } // // now do whatever we need to do to start the device // ret = dabusb_StartDevice(fdo); irp->IoStatus.Status = ret; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); return ret; } NTSTATUS dabusb_dispatch_pnp( IN PDEVICE_OBJECT fdo, IN PIRP irp ) { PIO_STACK_LOCATION irpStack; pdabusb_t s = fdo->DeviceExtension; ULONG fcn; NTSTATUS ret = STATUS_SUCCESS; PDEVICE_CAPABILITIES DeviceCapabilities; irpStack = IoGetCurrentIrpStackLocation (irp); ASSERT(irpStack->MajorFunction == IRP_MJ_PNP); fcn = irpStack->MinorFunction; VLOG(printk(MODSTR "dabusb_dispatch_pnp enter: fcn %lu\n", fcn)); dabusb_increment_io_count(fdo); switch (fcn) { case IRP_MN_QUERY_CAPABILITIES: VLOG(printk(MODSTR "IRP_MN_QUERY_CAPABILITIES\n")); ret = ForwardAndWait(fdo, irp); DeviceCapabilities = irpStack->Parameters.DeviceCapabilities.Capabilities; DeviceCapabilities->SurpriseRemovalOK = TRUE; IoCompleteRequest(irp, IO_NO_INCREMENT); dabusb_decrement_io_count(fdo); VLOG(printk(MODSTR "dabusb_dispatch_pnp exit: 0x%x\n", ret)); return ret; case IRP_MN_QUERY_PNP_DEVICE_STATE: VLOG(printk(MODSTR"IRP_MN_QUERY_PNP_DEVICE_STATE\n")); break; case IRP_MN_QUERY_DEVICE_RELATIONS: VLOG(printk(MODSTR"IRP_MN_QUERY_DEVICE_RELATIONS\n")); break; case IRP_MN_START_DEVICE: VLOG(printk(MODSTR "IRP_MN_START_DEVICE\n")); s->device_state = _started; VLOG(printk(MODSTR "device state: started\n")); ret = dabusb_HandleStartDevice(fdo,irp); dabusb_decrement_io_count(fdo); VLOG(printk(MODSTR "dabusb_dispatch_pnp exit: 0x%x\n", ret)); return ret; case IRP_MN_STOP_DEVICE: VLOG(printk(MODSTR "IRP_MN_STOP_DEVICE\n")); s->device_state = _stopped; VLOG(printk(MODSTR "device state: stopped\n")); async_cancel_all(fdo); abort_pipes(fdo); break; case IRP_MN_SURPRISE_REMOVAL: VLOG(printk(MODSTR "IRP_MN_SURPRISE_REMOVAL\n")); goto queryrm_or_surpriserm; case IRP_MN_QUERY_REMOVE_DEVICE: VLOG(printk(MODSTR "IRP_MN_QUERY_REMOVE_DEVICE\n")); queryrm_or_surpriserm: if (s->device_state < _started) { IoSkipCurrentIrpStackLocation (irp); ret = IoCallDriver (s->sdo, irp); dabusb_decrement_io_count(fdo); VLOG(printk(MODSTR "dabusb_dispatch_pnp exit: 0x%x\n", ret)); return ret; } s->device_state = _remove_pending; VLOG(printk(MODSTR "device state: remove_pending\n")); dabusb_decrement_io_count(fdo); async_cancel_all(fdo); abort_pipes(fdo); KeWaitForSingleObject(&s->NoPendingIoEvent, Suspended, KernelMode, FALSE, NULL); IoCopyCurrentIrpStackLocationToNext(irp); ret = IoCallDriver(s->sdo, irp); VLOG(printk(MODSTR "dabusb_dispatch_pnp exit: 0x%x\n", ret)); return ret; case IRP_MN_REMOVE_DEVICE: printk( MODSTR "IRP_MN_REMOVE_DEVICE\n"); dabusb_decrement_io_count(fdo); s->device_state = _removed; VLOG(printk(MODSTR "device state: removed\n")); async_cancel_all(fdo); abort_pipes(fdo); IoCopyCurrentIrpStackLocationToNext(irp); ret = IoCallDriver(s->sdo, irp); dabusb_decrement_io_count(fdo); KeWaitForSingleObject(&s->RemoveEvent, Suspended, KernelMode, FALSE, NULL); VLOG(printk(MODSTR "IRP_MN_REMOVE_DEVICE: KeWaitForSingleObject succeeded\n")); dabusb_RemoveDevice(fdo); VLOG(printk(MODSTR "dabusb_dispatch_pnp exit: 0x%x\n", ret)); return ret; /* All other PNP IRP's are just passed down the stack by the default handler */ default: VLOG(printk(MODSTR "Passing down unhandled PnP IOCTL MJ=0x%x MN=0x%x\n", irpStack->MajorFunction, irpStack->MinorFunction)); break; } if (!NT_SUCCESS(ret)) { // if anything went wrong, return failure without passing Irp down irp->IoStatus.Status = ret; IoCompleteRequest(irp, IO_NO_INCREMENT); dabusb_decrement_io_count(fdo); VLOG(printk(MODSTR "dabusb_dispatch_pnp exit: 0x%x\n", ret)); return ret; } IoCopyCurrentIrpStackLocationToNext(irp); // // All PNP_POWER messages get passed to the TopOfStackDeviceObject // we were given in PnPAddDevice // ret = IoCallDriver(s->sdo, irp); dabusb_decrement_io_count(fdo); VLOG(printk(MODSTR "dabusb_dispatch_pnp exit: 0x%x\n", ret)); return ret; } VOID dabusb_unload(IN PDRIVER_OBJECT drvobj) { VLOG(printk(MODSTR "dabusb_unload enter\n")); #ifdef CONNECTEVENT /* release userspace synchronisation object */ if (sync_event) if (!NT_SUCCESS(ZwClose(sync_event_handle))) printk(MODSTR "ZwClose of SynchronisationEvent failed\n"); sync_event = NULL; sync_event_handle = NULL; #endif VLOG(printk(MODSTR "dabusb_unload exit\n")); } NTSTATUS dabusb_pnp_add_device(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) { NTSTATUS ret = STATUS_SUCCESS; PDEVICE_OBJECT fdo = NULL; UNICODE_STRING deviceNameUnicodeString; ANSI_STRING ansibuf; pdabusb_t s; PCHAR buf = kmalloc(80); int instance = 0; unsigned int i; if(!buf) { printk(MODSTR"dabusb_pnp_add_device: can't kmalloc buf"); return STATUS_NO_MEMORY; } VLOG(printk(MODSTR"enter dabusb_PnPAddDevice (%x)\n", ret)); do { sprintf(buf,"\\Device\\"MODNAME"%d",instance); RtlInitAnsiString(&ansibuf, buf); RtlAnsiStringToUnicodeString(&deviceNameUnicodeString, &ansibuf, TRUE); ret = IoCreateDevice(DriverObject, sizeof(dabusb_t), &deviceNameUnicodeString, FILE_DEVICE_UNKNOWN, 0, FALSE, &fdo); if (NT_SUCCESS(ret)) break; RtlFreeUnicodeString(&deviceNameUnicodeString); instance++; } while (instance < 10); VLOG(printk(MODSTR "dabusb_pnp_add_device instance: %s\n", buf)); if (NT_SUCCESS(ret)) { s = fdo->DeviceExtension; fdo->Flags &= ~DO_DEVICE_INITIALIZING; fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE; memset(s, 0, sizeof(dabusb_t)); s->pdo = pdo; s->sdo = IoAttachDeviceToDeviceStack(fdo, pdo); // Get a copy of the physical device's capabilities into a // DEVICE_CAPABILITIES struct in our device extension; // We are most interested in learning which system power states // are to be mapped to which device power states for handling // IRP_MJ_SET_POWER Irps. dabusb_QueryCapabilities(pdo, &s->DeviceCapabilities); // We want to determine what level to auto-powerdown to; This is the lowest // sleeping level that is LESS than D3; // If all are set to D3, auto powerdown/powerup will be disabled. s->PowerDownLevel = PowerDeviceUnspecified; // init to disabled for (i = PowerSystemSleeping1; i <= PowerSystemSleeping3; i++) { if (s->DeviceCapabilities.DeviceState[i] < PowerDeviceD3) s->PowerDownLevel = s->DeviceCapabilities.DeviceState[i]; } VLOG(printk(MODSTR "s->PowerDownLevel: %x\n",s->PowerDownLevel)); /* this event is triggered when there is no pending io of any kind and device is removed */ KeInitializeEvent(&s->RemoveEvent, SynchronizationEvent, FALSE); /* this event is triggered when there is no pending io (pending io count == 1) */ KeInitializeEvent(&s->NoPendingIoEvent, SynchronizationEvent, FALSE); /* this event is triggered when self-requested power irps complete */ KeInitializeEvent(&s->SelfRequestedPowerIrpEvent, NotificationEvent, FALSE); KeInitializeEvent(&s->release_ok, SynchronizationEvent, FALSE); KeInitializeSemaphore(&s->open_sem, 1, 1); KeInitializeSpinLock(&s->cancel_list_lock); INIT_LIST_HEAD(&s->cancel_list); sprintf(buf, "\\DosDevices\\"MODNAME"%d", instance); RtlInitAnsiString(&ansibuf, buf); RtlAnsiStringToUnicodeString(&s->deviceLinkUnicodeString, &ansibuf, TRUE); ret = IoCreateSymbolicLink(&s->deviceLinkUnicodeString, &deviceNameUnicodeString); RtlFreeUnicodeString(&deviceNameUnicodeString); ASSERT(s->sdo != NULL); dabusb_increment_io_count(fdo); // try to power down device until IO actually requested dabusb_SelfSuspendOrActivate(fdo, TRUE); #ifdef CONNECTEVENT /* signal user space */ KeSetEvent(sync_event, 0, FALSE); #endif } kfree(buf); VLOG(printk(MODSTR "exit dabusb_PnPAddDevice (%x)\n", ret)); return ret; } NTSTATUS dabusb_release(IN PDEVICE_OBJECT fdo, IN PIRP irp) { pdabusb_t s = fdo->DeviceExtension; VLOG(printk(MODSTR"dabusb_release enter\n")); async_cancel_all(fdo); abort_pipes(fdo); irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); //KeReleaseSemaphore(&s->open_sem, LOW_REALTIME_PRIORITY, 1, FALSE); InterlockedDecrement(&s->opened); // try to power down device if this is the last pipe dabusb_SelfSuspendOrActivate(fdo, TRUE); VLOG(printk(MODSTR"dabusb_release exit\n")); return irp->IoStatus.Status; } NTSTATUS dabusb_open(IN PDEVICE_OBJECT fdo, IN PIRP irp) { pdabusb_t s = fdo->DeviceExtension; VLOG(printk(MODSTR"dabusb_open enter\n")); if (InterlockedIncrement(&s->opened) > 1) { irp->IoStatus.Status = STATUS_DEVICE_BUSY; VLOG(printk(MODSTR"dabusb_open exit: device busy\n")); goto done; } if (s->device_state <= _stop_pending) { irp->IoStatus.Status = STATUS_DELETE_PENDING; ELOG(printk(MODSTR"dabusb_open exit: stop pending\n")); goto done; } /* try to power up device if its not in D0 */ dabusb_SelfSuspendOrActivate(fdo, FALSE); done:; if (irp->IoStatus.Status != STATUS_SUCCESS) InterlockedDecrement(&s->opened); irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); VLOG(printk(MODSTR "dabusb_open: exit 0x%x\n", irp->IoStatus.Status)); return irp->IoStatus.Status; } NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS ret = STATUS_SUCCESS; PDEVICE_OBJECT deviceObject = NULL; UNICODE_STRING eventname; printk(MODSTR "BaycomUSB Driver V"VERSTR" (c) DF&TS compiled "__DATE__" "__TIME__"\n"); #ifdef CONNECTEVENT /* create userspace synchronisation object */ RtlInitUnicodeString(&eventname, EVENTNAME); sync_event = IoCreateNotificationEvent(&eventname, &sync_event_handle); if (!sync_event) printk(MODSTR "cannot create SynchronizationEvent\n"); #endif DriverObject->MajorFunction[IRP_MJ_CREATE] = dabusb_open; DriverObject->MajorFunction[IRP_MJ_CLOSE] = dabusb_release; //DriverObject->MajorFunction[IRP_MJ_READ] = dabusb_read; DriverObject->DriverUnload = dabusb_unload; DriverObject->MajorFunction[IRP_MJ_PNP] = dabusb_dispatch_pnp; DriverObject->MajorFunction[IRP_MJ_POWER] = dabusb_dispatch_power; DriverObject->DriverExtension->AddDevice = dabusb_pnp_add_device; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = baycomusb_ioctl; DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = baycomusb_internal_ioctl; return ret; } baycomusb-0.10.orig/wdmdrv/mkfile0100644000175100017510000000132407325134424015111 0ustar abaaba############################################################################# # $Id: makefile,v 1.3 1999/08/26 13:47:50 fliegl Exp $ # Microsoft Confidential # Copyright (C) Microsoft Corporation 1995 # All Rights Reserved. # # MAKEFILE for WDM device driver kit # ############################################################################# # # DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source # file to this component. This file merely indirects to the real make file # that is shared by all the driver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV)\makefile.def baycomusb-0.10.orig/wdmdrv/pwr.c0100644000175100017510000007304407325134424014703 0ustar abaaba/* $Id: pwr.c,v 1.1.2.4 2001/06/18 14:42:41 deti Exp $ Power Management module */ #include #include "stdarg.h" #include "stdio.h" // // Include files needed for USB support // #include "usbdi.h" #include "usbdlib.h" // // Include file for the dabusb Device // #include "bcusb.h" //#define deti #define dabusb_StringForDevState( devState ) szDevicePowerState[ devState ] #define dabusb_StringForSysState( sysState ) szSystemPowerState[ sysState ] static const PCHAR szSystemPowerState[] = { "PowerSystemUnspecified", "PowerSystemWorking", "PowerSystemSleeping1", "PowerSystemSleeping2", "PowerSystemSleeping3", "PowerSystemHibernate", "PowerSystemShutdown", "PowerSystemMaximum" }; static const PCHAR szDevicePowerState[] = { "PowerDeviceUnspecified", "PowerDeviceD0", "PowerDeviceD1", "PowerDeviceD2", "PowerDeviceD3", "PowerDeviceMaximum" }; NTSTATUS dabusb_PoSelfRequestCompletion( IN PDEVICE_OBJECT fdo, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus ) /*++ Routine Description: This routine is called when the driver completes a self-originated power IRP that was generated by a call to dabusb_SelfSuspendOrActivate(). We power down whenever the last pipe is closed and power up when the first pipe is opened. For power-up , we set an event in our FDO extension to signal this IRP done so the power request can be treated as a synchronous call. We need to know the device is powered up before opening the first pipe, for example. For power-down, we do not set the event, as no caller waits for powerdown complete. Arguments: fdo - Pointer to the device object for the class device. ( Physical Device Object ) Context - Driver defined context, in this case our FDO ( functional device object ) Return Value: The function value is the final status from the operation. --*/ { PDEVICE_OBJECT deviceObject = Context; pdabusb_t s = deviceObject->DeviceExtension; NTSTATUS ntStatus = IoStatus->Status; // we should not be in the midst of handling a system-generated power irp ASSERT( NULL == s->PowerIrp ); // We only need to set the event if we're powering up; // No caller waits on power down complete if ( (ULONG) PowerState.DeviceState < s->PowerDownLevel ) { // Trigger Self-requested power irp completed event; // The caller is waiting for completion KeSetEvent(&s->SelfRequestedPowerIrpEvent, 1, FALSE); } dabusb_decrement_io_count(deviceObject); printk( "Exit dabusb_PoSelfRequestCompletion() FAILED, ntStatus = 0x%x\n", ntStatus ); return ntStatus; } NTSTATUS dabusb_SelfRequestPowerIrp( IN PDEVICE_OBJECT fdo, IN POWER_STATE PowerState ) /*++ Routine Description: This routine is called by dabusb_SelfSuspendOrActivate() to actually make the system request for a powerdown/up to PowerState. It first checks to see if we are already in Powerstate and immediately returns SUCCESS with no further processing if so Arguments: fdo - Pointer to the device object PowerState. power state requested, e.g PowerDeviceD0. Return Value: The function value is the final status from the operation. --*/ { NTSTATUS ntStatus = STATUS_SUCCESS; pdabusb_t s; PIRP pIrp = NULL; s = fdo->DeviceExtension; // This should have been reset in completion routine ASSERT( !s->SelfPowerIrp ); #ifndef deti if ( s->CurrentDevicePowerState == PowerState.DeviceState ) #endif return STATUS_SUCCESS; // nothing to do printk( "Enter dabusb_SelfRequestPowerIrp() will request power irp to state %s\n", dabusb_StringForDevState( PowerState.DeviceState )); dabusb_increment_io_count(fdo); // flag we're handling a self-generated power irp s->SelfPowerIrp = TRUE; // actually request the Irp ntStatus = PoRequestPowerIrp(s->pdo, IRP_MN_SET_POWER, PowerState, dabusb_PoSelfRequestCompletion, fdo, NULL); if ( ntStatus == STATUS_PENDING ) { // status pending is the return code we wanted // We only need to wait for completion if we're powering up if ( (ULONG) PowerState.DeviceState < s->PowerDownLevel ) { NTSTATUS waitStatus; waitStatus = KeWaitForSingleObject( &s->SelfRequestedPowerIrpEvent, Suspended, KernelMode, FALSE, NULL); } ntStatus = STATUS_SUCCESS; s->SelfPowerIrp = FALSE; printk( "dabusb_SelfRequestPowerIrp() SUCCESS\n IRP 0x%x to state %s\n", pIrp, dabusb_StringForDevState(PowerState.DeviceState) ); } else { // The return status was not STATUS_PENDING; any other codes must be considered in error here; // i.e., it is not possible to get a STATUS_SUCCESS or any other non-error return from this call; printk( "dabusb_SelfRequestPowerIrp() to state %s FAILED, status = 0x%x\n", dabusb_StringForDevState( PowerState.DeviceState ),ntStatus); } return ntStatus; } NTSTATUS dabusb_SelfSuspendOrActivate( IN PDEVICE_OBJECT fdo, IN BOOLEAN fSuspend ) /*++ Routine Description: Called on dabusb_PnPAddDevice() to power down until needed (i.e., till a pipe is actually opened). Called on dabusb_Create() to power up device to D0 before opening 1st pipe. Called on dabusb_Close() to power down device if this is the last pipe. Arguments: fdo - Pointer to the device object fSuspend; TRUE to Suspend, FALSE to acivate. Return Value: If the operation is not attemtped, SUCCESS is returned. If the operation is attemtped, the value is the final status from the operation. --*/ { NTSTATUS ntStatus = STATUS_SUCCESS; POWER_STATE PowerState; pdabusb_t s; s = fdo->DeviceExtension; printk( "Enter dabusb_SelfSuspendOrActivate(),fSuspend = %d\n", fSuspend); // Can't accept request if: // 1) device is removed, // 2) has never been started, // 3) is stopped, // 4) has a remove request pending, // 5) has a stop device pending if ( s->device_state<=_stop_pending ) { ntStatus = STATUS_DELETE_PENDING; printk( "ABORTING dabusb_SelfSuspendOrActivate()\n"); return ntStatus; } // don't do anything if any System-generated Device Pnp irps are pending if ( NULL != s->PowerIrp ) { printk( "Exit dabusb_SelfSuspendOrActivate(),refusing on pending s->PowerIrp 0x%x\n", s->PowerIrp); return ntStatus; } // don't do anything if any self-generated Device Pnp irps are pending if ( s->SelfPowerIrp ) { printk( "Exit dabusb_SelfSuspendOrActivate(),refusing on pending s->SelfPowerIrp\n" ); return ntStatus; } // don't auto-suspend if any pipes are open if ( fSuspend && s->opened ) { printk( "Exit dabusb_SelfSuspendOrActivate(),refusing to self-suspend on OpenPipeCount %d\n", s->opened); return ntStatus; } // don't auto-activate if no pipes are open if ( !fSuspend && !s->opened ) { printk( "Exit dabusb_SelfSuspendOrActivate(),refusing to self-activate, no pipes open\n"); return ntStatus; } // dont do anything if registry CurrentControlSet\Services\BulkUsb\Parameters\PowerDownLevel // has been set to zero, PowerDeviceD0 ( 1 ), or a bogus high value if ( ( s->PowerDownLevel == PowerDeviceD0 ) || ( s->PowerDownLevel == PowerDeviceUnspecified) || ( s->PowerDownLevel >= PowerDeviceMaximum ) ) { printk( "Exit dabusb_SelfSuspendOrActivate(), refusing on s->PowerDownLevel == %d\n", s->PowerDownLevel); return ntStatus; } if ( fSuspend ) PowerState.DeviceState = s->PowerDownLevel; else PowerState.DeviceState = PowerDeviceD0; // power up all the way; we're probably just about to do some IO ntStatus = dabusb_SelfRequestPowerIrp( fdo, PowerState ); printk( "dabusb_SelfSuspendOrActivate() status 0x%x on setting dev state %s\n", ntStatus, dabusb_StringForDevState(PowerState.DeviceState ) ); return ntStatus; } BOOLEAN dabusb_SetDevicePowerState( IN PDEVICE_OBJECT fdo, IN DEVICE_POWER_STATE DeviceState ) /*++ Routine Description: This routine is called when An IRP_MN_SET_POWER of type 'DevicePowerState' has been received by dabusb_ProcessPowerIrp(). Arguments: fdo - Pointer to the device object for the class device. DeviceState - Device specific power state to set the device in to. Return Value: For requests to DeviceState D0 ( fully on ), returns TRUE to signal caller that we must set a completion routine and finish there. --*/ { NTSTATUS ntStatus = STATUS_SUCCESS; pdabusb_t s; BOOLEAN fRes = FALSE; s = (pdabusb_t) fdo->DeviceExtension; switch (DeviceState) { case PowerDeviceD3: // // Device will be going OFF, // TODO: add any needed device-dependent code to save state here. // ( We have nothing to do in this sample ) // printk( "dabusb_SetDevicePowerState() PowerDeviceD3 (OFF)\n"); s->CurrentDevicePowerState = DeviceState; break; case PowerDeviceD1: case PowerDeviceD2: // // power states D1,D2 translate to USB suspend printk( "dabusb_SetDevicePowerState() %s\n", dabusb_StringForDevState(DeviceState) ); s->CurrentDevicePowerState = DeviceState; break; case PowerDeviceD0: printk( "dabusb_SetDevicePowerState() PowerDeviceD0 (ON)\n"); // We'll need to finish the rest in the completion routine; // signal caller we're going to D0 and will need to set a completion routine fRes = TRUE; // Caller will pass on to PDO ( Physical Device object ) break; default: printk( " Bogus DeviceState = %x\n", DeviceState); } return fRes; } NTSTATUS dabusb_QueryCapabilities( IN PDEVICE_OBJECT Lowerfdo, IN PDEVICE_CAPABILITIES DeviceCapabilities ) /*++ Routine Description: This routine generates an internal IRP from this driver to the lower portion of the driver stack to obtain information on the Device Object's capabilities. We are most interested in learning which system power states are to be mapped to which device power states for honoring IRP_MJ_SET_POWER Irps. This is a blocking call which waits for the IRP completion routine to set an event on finishing. Arguments: Lowerfdo - fdo beneath this driver in the stack. Return Value: NTSTATUS value from the IoCallDriver() call. --*/ { PIO_STACK_LOCATION nextStack; PIRP irp; NTSTATUS ntStatus; KEVENT event; // This is a DDK-defined DBG-only macro that ASSERTS we are not running pageable code // at higher than APC_LEVEL. PAGED_CODE(); // Build an IRP for us to generate an internal query request to the PDO irp = IoAllocateIrp(Lowerfdo->StackSize, FALSE); if (!irp) { return STATUS_INSUFFICIENT_RESOURCES; } // // Preinit the device capability structures appropriately. // RtlZeroMemory( DeviceCapabilities, sizeof(DEVICE_CAPABILITIES) ); DeviceCapabilities->Size = sizeof(DEVICE_CAPABILITIES); DeviceCapabilities->Version = 1; DeviceCapabilities->Address = -1; DeviceCapabilities->UINumber = -1; // IoGetNextIrpStackLocation gives a higher level driver access to the next-lower // driver's I/O stack location in an IRP so the caller can set it up for the lower driver. nextStack = IoGetNextIrpStackLocation(irp); nextStack->MajorFunction= IRP_MJ_PNP; nextStack->MinorFunction= IRP_MN_QUERY_CAPABILITIES; // init an event to tell us when the completion routine's been called KeInitializeEvent(&event, NotificationEvent, FALSE); // Set a completion routine so it can signal our event when // the next lower driver is done with the Irp IoSetCompletionRoutine(irp, OnRequestComplete, &event, // pass the event as Context to completion routine TRUE, // invoke on success TRUE, // invoke on error TRUE); // invoke on cancellation of the Irp // set our pointer to the DEVICE_CAPABILITIES struct nextStack->Parameters.DeviceCapabilities.Capabilities = DeviceCapabilities; // preset the irp to report not supported irp->IoStatus.Status = STATUS_NOT_SUPPORTED; ntStatus = IoCallDriver(Lowerfdo, irp); printk( " dabusb_QueryCapabilities() ntStatus from IoCallDriver to PCI = 0x%x\n", ntStatus); if (ntStatus == STATUS_PENDING) { // wait for irp to complete KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, NULL); ntStatus = irp->IoStatus.Status; } // failed? this is probably a bug if(!NT_SUCCESS(ntStatus)) printk( "dabusb_QueryCapabilities() failed\n"); IoFreeIrp(irp); return ntStatus; } NTSTATUS dabusb_PowerIrp_Complete( IN PDEVICE_OBJECT Nullfdo, IN PIRP Irp, IN PVOID Context ) /*++ Routine Description: This routine is called when An IRP_MN_SET_POWER of type 'DevicePowerState' has been received by dabusb_ProcessPowerIrp(), and that routine has determined 1) the request is for full powerup ( to PowerDeviceD0 ), and 2) We are not already in that state A call is then made to PoRequestPowerIrp() with this routine set as the completion routine. Arguments: fdo - Pointer to the device object for the class device. Irp - Irp completed. Context - Driver defined context. Return Value: The function value is the final status from the operation. --*/ { NTSTATUS ntStatus = STATUS_SUCCESS; PDEVICE_OBJECT deviceObject; PIO_STACK_LOCATION irpStack; pdabusb_t s; printk( "enter dabusb_PowerIrp_Complete\n"); deviceObject = (PDEVICE_OBJECT) Context; s = (pdabusb_t) deviceObject->DeviceExtension; // If the lower driver returned PENDING, mark our stack location as pending also. if (Irp->PendingReturned) { IoMarkIrpPending(Irp); } irpStack = IoGetCurrentIrpStackLocation (Irp); // We can assert that we're a device powerup-to D0 request, // because that was the only type of request we set a completion routine // for in the first place ASSERT(irpStack->MajorFunction == IRP_MJ_POWER); ASSERT(irpStack->MinorFunction == IRP_MN_SET_POWER); ASSERT(irpStack->Parameters.Power.Type==DevicePowerState); ASSERT(irpStack->Parameters.Power.State.DeviceState==PowerDeviceD0); // Now that we know we've let the lower drivers do what was needed to power up, // we can set our device extension flags accordingly s->CurrentDevicePowerState = PowerDeviceD0; Irp->IoStatus.Status = ntStatus; dabusb_decrement_io_count(deviceObject); printk( "exit dabusb_PowerIrp_Complete Exit IRP_MN_SET_POWER D0 complete\n"); return ntStatus; } NTSTATUS dabusb_PoRequestCompletion( IN PDEVICE_OBJECT fdo, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus ) /*++ Routine Description: This is the completion routine set in a call to PoRequestPowerIrp() that was made in dabusb_ProcessPowerIrp() in response to receiving an IRP_MN_SET_POWER of type 'SystemPowerState' when the device was not in a compatible device power state. In this case, a pointer to the IRP_MN_SET_POWER Irp is saved into the FDO device extension (s->PowerIrp), and then a call must be made to PoRequestPowerIrp() to put the device into a proper power state, and this routine is set as the completion routine. We decrement our pending io count and pass the saved IRP_MN_SET_POWER Irp on to the next driver Arguments: fdo - Pointer to the device object for the class device. Note that we must get our own device object from the Context Context - Driver defined context, in this case our own functional device object ( FDO ) Return Value: The function value is the final status from the operation. --*/ { PIRP irp; pdabusb_t s; PDEVICE_OBJECT deviceObject = Context; NTSTATUS ntStatus; s = deviceObject->DeviceExtension; // Get the Irp we saved for later processing in dabusb_ProcessPowerIrp() // when we decided to request the Power Irp that this routine // is the completion routine for. irp = s->PowerIrp; // We will return the status set by the PDO for the power request we're completing ntStatus = IoStatus->Status; printk( "Enter dabusb_PoRequestCompletion()\n"); // we should not be in the midst of handling a self-generated power irp ASSERT( !s->SelfPowerIrp ); // we must pass down to the next driver in the stack IoCopyCurrentIrpStackLocationToNext(irp); // Calling PoStartNextPowerIrp() indicates that the driver is finished // with the previous power IRP, if any, and is ready to handle the next power IRP. // It must be called for every power IRP.Although power IRPs are completed only once, // typically by the lowest-level driver for a device, PoStartNextPowerIrp must be called // for every stack location. Drivers must call PoStartNextPowerIrp while the current IRP // stack location points to the current driver. Therefore, this routine must be called // before IoCompleteRequest, IoSkipCurrentStackLocation, and PoCallDriver. PoStartNextPowerIrp(irp); // PoCallDriver is used to pass any power IRPs to the PDO instead of IoCallDriver. // When passing a power IRP down to a lower-level driver, the caller should use // IoSkipCurrentIrpStackLocation or IoCopyCurrentIrpStackLocationToNext to copy the IRP to // the next stack location, then call PoCallDriver. Use IoCopyCurrentIrpStackLocationToNext // if processing the IRP requires setting a completion routine, or IoSkipCurrentStackLocation // if no completion routine is needed. //beep(500); PoCallDriver(s->sdo, irp); //beep(1000); dabusb_decrement_io_count(deviceObject); printk( "dabusb_PoRequestCompletion() Exit IRP_MN_SET_POWER\n"); s->PowerIrp = NULL; return ntStatus; } NTSTATUS dabusb_dispatch_power( IN PDEVICE_OBJECT fdo, IN PIRP Irp ) /*++ Routine Description: This is our FDO's dispatch table function for IRP_MJ_POWER. It processes the Power IRPs sent to the PDO for this device. For every power IRP, drivers must call PoStartNextPowerIrp and use PoCallDriver to pass the IRP all the way down the driver stack to the underlying PDO. Arguments: fdo - pointer to our device object (FDO) Irp - pointer to an I/O Request Packet Return Value: NT status code --*/ { PIO_STACK_LOCATION irpStack; NTSTATUS ntStatus = STATUS_SUCCESS; pdabusb_t s; BOOLEAN fGoingToD0 = FALSE; POWER_STATE sysPowerState, desiredDevicePowerState; KEVENT event; printk( " dabusb_ProcessPowerIrp() IRP_MJ_POWER\n"); s = (pdabusb_t) fdo->DeviceExtension; irpStack = IoGetCurrentIrpStackLocation (Irp); dabusb_increment_io_count(fdo); switch (irpStack->MinorFunction) { #if 1 case IRP_MN_WAIT_WAKE: printk( "dabusb_ProcessPowerIrp() Enter IRP_MN_WAIT_WAKE\n"); //beep(500); // A driver sends IRP_MN_WAIT_WAKE to indicate that the system should // wait for its device to signal a wake event. The exact nature of the event // is device-dependent. // Drivers send this IRP for two reasons: // 1) To allow a device to wake the system // 2) To wake a device that has been put into a sleep state to save power // but still must be able to communicate with its driver under certain circumstances. // When a wake event occurs, the driver completes the IRP and returns // STATUS_SUCCESS. If the device is sleeping when the event occurs, // the driver must first wake up the device before completing the IRP. // In a completion routine, the driver calls PoRequestPowerIrp to send a // PowerDeviceD0 request. When the device has powered up, the driver can // handle the IRP_MN_WAIT_WAKE request. // s->DeviceCapabilities.DeviceWake specifies the lowest device power state (least powered) // from which the device can signal a wake event s->PowerDownLevel = s->DeviceCapabilities.DeviceWake; if ( ( PowerDeviceD0 == s->CurrentDevicePowerState ) || ( s->DeviceCapabilities.DeviceWake > s->CurrentDevicePowerState ) ) { // // STATUS_INVALID_DEVICE_STATE is returned if the device in the PowerD0 state // or a state below which it can support waking, or if the SystemWake state // is below a state which can be supported. A pending IRP_MN_WAIT_WAKE will complete // with this error if the device's state is changed to be incompatible with the wake // request. // If a driver fails this IRP, it should complete the IRP immediately without // passing the IRP to the next-lower driver. ntStatus = STATUS_INVALID_DEVICE_STATE; Irp->IoStatus.Status = ntStatus; IoCompleteRequest (Irp,IO_NO_INCREMENT ); printk( "Exit dabusb_ProcessPowerIrp(), ntStatus STATUS_INVALID_DEVICE_STATE\n" ); dabusb_decrement_io_count(fdo); return ntStatus; } // flag we're enabled for wakeup s->EnabledForWakeup = TRUE; // init an event for our completion routine to signal when PDO is done with this Irp KeInitializeEvent(&event, NotificationEvent, FALSE); // If not failing outright, pass this on to our PDO for further handling IoCopyCurrentIrpStackLocationToNext(Irp); // Set a completion routine so it can signal our event when // the PDO is done with the Irp IoSetCompletionRoutine(Irp, OnRequestComplete, &event, // pass the event to the completion routine as the Context TRUE, // invoke on success TRUE, // invoke on error TRUE); // invoke on cancellation PoStartNextPowerIrp(Irp); ntStatus = PoCallDriver(s->sdo, Irp); // if PDO is not done yet, wait for the event to be set in our completion routine if (ntStatus == STATUS_PENDING) { // wait for irp to complete NTSTATUS waitStatus = KeWaitForSingleObject( &event, Suspended, KernelMode, FALSE, NULL); printk( "dabusb_ProcessPowerIrp() done waiting for PDO to finish IRP_MN_WAIT_WAKE\n"); } // now tell the device to actually wake up dabusb_SelfSuspendOrActivate( fdo, FALSE ); // flag we're done with wakeup irp s->EnabledForWakeup = FALSE; dabusb_decrement_io_count(fdo); printk( "dabusb_ProcessPowerIrp() Exit IRP_MN_WAIT_WAKE\n"); break; case IRP_MN_SET_POWER: { // The system power policy manager sends this IRP to set the system power state. // A device power policy manager sends this IRP to set the device power state for a device. printk( "dabusb_ProcessPowerIrp() Enter IRP_MN_SET_POWER\n"); // Set Irp->IoStatus.Status to STATUS_SUCCESS to indicate that the device // has entered the requested state. Drivers cannot fail this IRP. switch (irpStack->Parameters.Power.Type) { case SystemPowerState: // Get input system power state sysPowerState.SystemState = irpStack->Parameters.Power.State.SystemState; printk( "dabusb_ProcessPowerIrp() Set Power, type SystemPowerState = %s\n", dabusb_StringForSysState( sysPowerState.SystemState ) ); // If system is in working state always set our device to D0 // regardless of the wait state or system-to-device state power map if ( sysPowerState.SystemState == PowerSystemWorking) { desiredDevicePowerState.DeviceState = PowerDeviceD0; printk( "dabusb_ProcessPowerIrp() PowerSystemWorking, will set D0, not use state map\n"); //beep(2000); } else { // set to corresponding system state if IRP_MN_WAIT_WAKE pending if ( s->EnabledForWakeup ) { // got a WAIT_WAKE IRP pending? // Find the device power state equivalent to the given system state. // We get this info from the DEVICE_CAPABILITIES struct in our device // extension (initialized in dabusb_PnPAddDevice() ) desiredDevicePowerState.DeviceState = s->DeviceCapabilities.DeviceState[ sysPowerState.SystemState ]; printk( "dabusb_ProcessPowerIrp() IRP_MN_WAIT_WAKE pending, will use state map\n"); } else { // if no wait pending and the system's not in working state, just turn off desiredDevicePowerState.DeviceState = PowerDeviceD3; printk( "dabusb_ProcessPowerIrp() Not EnabledForWakeup and the system's not in working state,\n settting PowerDeviceD3 (off )\n"); } } // // We've determined the desired device state; are we already in this state? // printk( "dabusb_ProcessPowerIrp() Set Power, desiredDevicePowerState = %s\n", dabusb_StringForDevState( desiredDevicePowerState.DeviceState ) ); #ifdef deti s->CurrentDevicePowerState = desiredDevicePowerState.DeviceState; s->device_state = _removed; #else if (desiredDevicePowerState.DeviceState != s->CurrentDevicePowerState) { // No, request that we be put into this state // by requesting a new Power Irp from the Pnp manager s->PowerIrp = Irp; ntStatus = PoRequestPowerIrp(s->pdo, IRP_MN_SET_POWER, desiredDevicePowerState, // completion routine will pass the Irp down to the PDO dabusb_PoRequestCompletion, fdo, NULL); //beep(2000); } else #endif { // Yes, just pass it on to PDO (Physical Device Object) IoCopyCurrentIrpStackLocationToNext(Irp); PoStartNextPowerIrp(Irp); ntStatus = PoCallDriver(s->sdo, Irp); dabusb_decrement_io_count(fdo); printk( "dabusb_ProcessPowerIrp() Exit IRP_MN_SET_POWER\n"); } break; case DevicePowerState: printk( "dabusb_ProcessPowerIrp() Set Power, type DevicePowerState = %s\n", dabusb_StringForDevState( irpStack->Parameters.Power.State.DeviceState ) ); // For requests to D1, D2, or D3 ( sleep or off states ), // sets s->CurrentDevicePowerState to DeviceState immediately. // This enables any code checking state to consider us as sleeping or off // already, as this will imminently become our state. // For requests to DeviceState D0 ( fully on ), sets fGoingToD0 flag TRUE // to flag that we must set a completion routine and update // s->CurrentDevicePowerState there. // In the case of powering up to fully on, we really want to make sure // the process is completed before updating our CurrentDevicePowerState, // so no IO will be attempted or accepted before we're really ready. //beep(500); fGoingToD0 = dabusb_SetDevicePowerState(fdo, irpStack->Parameters.Power.State.DeviceState ); // returns TRUE for D0 //beep(1000); IoCopyCurrentIrpStackLocationToNext(Irp); if (fGoingToD0) { printk( "dabusb_ProcessPowerIrp() Set PowerIrp Completion Routine, fGoingToD0 =%d\n", fGoingToD0); IoSetCompletionRoutine(Irp, dabusb_PowerIrp_Complete, // Always pass FDO to completion routine as its Context; // This is because the DriverObject passed by the system to the routine // is the Physical Device Object ( PDO ) not the Functional Device Object ( FDO ) fdo, TRUE, // invoke on success TRUE, // invoke on error TRUE); // invoke on cancellation of the Irp } PoStartNextPowerIrp(Irp); ntStatus = PoCallDriver(s->sdo, Irp); if ( !fGoingToD0 ) // completion routine will decrement dabusb_decrement_io_count(fdo); printk( "dabusb_ProcessPowerIrp() Exit IRP_MN_SET_POWER\n"); break; } /* case irpStack->Parameters.Power.Type */ } break; /* IRP_MN_SET_POWER */ case IRP_MN_QUERY_POWER: // // A power policy manager sends this IRP to determine whether it can change // the system or device power state, typically to go to sleep. // printk( "dabusb_ProcessPowerIrp() IRP_MN_QUERY_POWER %d %s %s\n", irpStack->Parameters.Power.Type, dabusb_StringForSysState( irpStack->Parameters.Power.State.SystemState), dabusb_StringForDevState( irpStack->Parameters.Power.State.DeviceState )); if(!s->opened) { // We do nothing special here, just let the PDO handle it IoCopyCurrentIrpStackLocationToNext(Irp); PoStartNextPowerIrp(Irp); ntStatus = PoCallDriver(s->sdo, Irp); } else { PoStartNextPowerIrp(Irp); ntStatus=STATUS_DEVICE_NOT_READY; Irp->IoStatus.Status=ntStatus; IoCompleteRequest (Irp,IO_NO_INCREMENT ); } dabusb_decrement_io_count(fdo); break; /* IRP_MN_QUERY_POWER */ #endif default: printk( "dabusb_ProcessPowerIrp() UNKNOWN POWER MESSAGE (%x)\n", irpStack->MinorFunction); // // All unhandled power messages are passed on to the PDO // IoCopyCurrentIrpStackLocationToNext(Irp); PoStartNextPowerIrp(Irp); ntStatus = PoCallDriver(s->sdo, Irp); dabusb_decrement_io_count(fdo); } /* irpStack->MinorFunction */ printk( "Exit dabusb_ProcessPowerIrp() ntStatus = 0x%x\n", ntStatus ); return ntStatus; } baycomusb-0.10.orig/wdmdrv/resource.h0100644000175100017510000000063207325134424015720 0ustar abaaba//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by dabusb.rc // // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif baycomusb-0.10.orig/wdmdrv/sources0100644000175100017510000000111307325134424015321 0ustar abaaba# $Id: sources,v 1.16 1999/12/13 14:15:47 fliegl Exp $ TARGETNAME=baycmusb TARGETPATH=.\lib TARGETTYPE=DRIVER DRIVERTYPE=WDM C_DEFINES=$(C_DEFINES) /DDRIVER #!IFNDEF MSC_WARNING_LEVEL #MSC_WARNING_LEVEL=/W3 #!ENDIF MSC_WARNING_LEVEL=$(MSC_WARNING_LEVEL) /WX /FR USE_MAPSYM=1 # Put the path as it exists in your system to the updated LIB files below. #TARGETLIBS= $(BASEDIR)\lib\*\free\usbd.lib TARGETLIBS= $(DDK_LIB_PATH)\usbd.lib #LINKER_FLAGS = $(LINKER_FLAGS) /map # INCLUDES=$(BASEDIR)\inc; SOURCES= bcusb.rc \ dabusb.c \ bcioctl.c \ pwr.c baycomusb-0.10.orig/wdmdrv/usbdevio.h0100644000175100017510000001213607325134424015713 0ustar abaaba/*****************************************************************************/ /* * usbdevio.h -- USB device file system. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * History: * 0.1 04.01.2000 Created * */ /*****************************************************************************/ #ifndef _USBDEVIO_H #define _USBDEVIO_H /* --------------------------------------------------------------------- */ #define USBDEVFS_URB_DISABLE_SPD 0x0001 #define USBDEVFS_URB_ISO_ASAP 0x0002 #define USBDEVFS_URB_QUEUE_BULK 0x0010 #define USBDEVFS_URB_NO_FSBR 0x0020 #define USBDEVFS_URB_ZERO_PACKET 0x0040 /* --------------------------------------------------------------------- */ /* usbdevio ioctl codes */ struct usbdevfs_ctrltransfer { unsigned int usberr; /* set by kernel */ unsigned int timeout; /* in milliseconds */ unsigned int cookie; /* needed to cancel request */ unsigned int flags; unsigned char requesttype; unsigned char request; unsigned short value; unsigned short index; unsigned int len; /* updated by kernel */ /* data follows */ }; struct usbdevfs_bulktransfer { unsigned int usberr; /* set by kernel */ unsigned int timeout; /* in milliseconds */ unsigned int cookie; /* needed to cancel request */ unsigned int flags; unsigned int ep; unsigned int len; /* updated by kernel */ /* data follows */ }; struct usbdevfs_isopacketdesc { unsigned int offset; unsigned int length; unsigned int usberr; /* set by kernel */ }; struct usbdevfs_isotransfer { unsigned int usberr; /* set by kernel */ unsigned int timeout; /* in milliseconds */ unsigned int cookie; /* needed to cancel request */ unsigned int flags; unsigned int ep; unsigned int start_frame; unsigned int number_of_packets; unsigned int len; /* updated by kernel */ unsigned int error_count; /* set by kernel */ /* variable length */ struct usbdevfs_isopacketdesc iso_frame_desc[0]; /* data follows */ }; struct usbdevfs_setinterface { unsigned int usberr; /* set by kernel */ unsigned int timeout; /* in milliseconds */ unsigned int interf; unsigned int altsetting; }; struct usbdevfs_setconfig { unsigned int usberr; /* set by kernel */ unsigned int timeout; /* in milliseconds */ unsigned int config; }; struct usbdevfs_resetep { unsigned int usberr; /* set by kernel */ unsigned int timeout; /* in milliseconds */ unsigned int ep; }; struct usbdevfs_disconnectsignal { unsigned int signr; void *context; }; /* --------------------------------------------------------------------- */ #define FILE_DEVICE_USBDEVIO 0x80fe #define USBDEVFS_CONTROL CTL_CODE(FILE_DEVICE_USBDEVIO,20,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_BULK CTL_CODE(FILE_DEVICE_USBDEVIO,21,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_ISO CTL_CODE(FILE_DEVICE_USBDEVIO,22,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_RESETEP CTL_CODE(FILE_DEVICE_USBDEVIO,23,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_ABORTEP CTL_CODE(FILE_DEVICE_USBDEVIO,24,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_SETINTERFACE CTL_CODE(FILE_DEVICE_USBDEVIO,25,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_SETCONFIGURATION CTL_CODE(FILE_DEVICE_USBDEVIO,26,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_SUBMITURB CTL_CODE(FILE_DEVICE_USBDEVIO,27,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_DISCARDURB CTL_CODE(FILE_DEVICE_USBDEVIO,28,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_REAPURB CTL_CODE(FILE_DEVICE_USBDEVIO,29,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_REAPURBNDELAY CTL_CODE(FILE_DEVICE_USBDEVIO,30,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_DISCSIGNAL CTL_CODE(FILE_DEVICE_USBDEVIO,31,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_CLAIMINTERFACE CTL_CODE(FILE_DEVICE_USBDEVIO,32,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_RELEASEINTERFACE CTL_CODE(FILE_DEVICE_USBDEVIO,33,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_GETLASTERROR CTL_CODE(FILE_DEVICE_USBDEVIO,34,METHOD_BUFFERED,FILE_ANY_ACCESS) #define USBDEVFS_CANCELTRANSFER CTL_CODE(FILE_DEVICE_USBDEVIO,35,METHOD_BUFFERED,FILE_ANY_ACCESS) /* --------------------------------------------------------------------- */ #endif /* _USBDEVIO_H */ baycomusb-0.10.orig/wdmdrv/list.h0100644000175100017510000000442707331304622015046 0ustar abaaba#ifndef _LINUX_LIST_H #define _LINUX_LIST_H /* * Simple doubly linked list implementation. * * Some of the internal functions ("__xxx") are useful when * manipulating whole lists rather than single entries, as * sometimes we already know the next/prev entries and we can * generate better code by using them directly rather than * using the generic single-entry routines. */ struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) /* * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static _inline void __list_add(struct list_head * new, struct list_head * prev, struct list_head * next) { next->prev = new; new->next = next; new->prev = prev; prev->next = new; } /* * Insert a new entry after the specified head.. */ static _inline void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } /* * Insert a new entry before the specified head.. */ static _inline void list_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } /* * Delete a list entry by making the prev/next entries * point to each other. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static _inline void __list_del(struct list_head * prev, struct list_head * next) { next->prev = prev; prev->next = next; } static _inline void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); } static _inline int list_empty(struct list_head *head) { return head->next == head; } /* * Splice in "list" into "head" */ static _inline void list_splice(struct list_head *list, struct list_head *head) { struct list_head *first = list->next; if (first != list) { struct list_head *last = list->prev; struct list_head *at = head->next; first->prev = head; head->next = first; last->next = at; at->prev = last; } } #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) #endif baycomusb-0.10.orig/misc/0042755000175100017510000000000007340500006013342 5ustar abaababaycomusb-0.10.orig/misc/Makefile.in0100644000175100017510000002024207340500006015402 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = -I$(top_srcdir)/diag -I$(top_srcdir)/usbdrv noinst_HEADERS = sysdeps.h getopt.h EXTRA_DIST = getopt.c getopt1.c openpty.c vsnprintf.c noinst_LIBRARIES = libmisc.a libmisc_a_SOURCES = syslog.c snprintpkt.c lprintf.c libmisc_a_LIBADD = @LIBOBJS@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libmisc_a_DEPENDENCIES = @LIBOBJS@ libmisc_a_OBJECTS = syslog.$(OBJEXT) snprintpkt.$(OBJEXT) \ lprintf.$(OBJEXT) CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ HEADERS = $(noinst_HEADERS) DIST_COMMON = Makefile.am Makefile.in getopt.c getopt1.c openpty.c \ vsnprintf.c DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(libmisc_a_SOURCES) OBJECTS = $(libmisc_a_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps misc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstLIBRARIES: clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) distclean-noinstLIBRARIES: maintainer-clean-noinstLIBRARIES: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: libmisc.a: $(libmisc_a_OBJECTS) $(libmisc_a_DEPENDENCIES) -rm -f libmisc.a $(AR) cru libmisc.a $(libmisc_a_OBJECTS) $(libmisc_a_LIBADD) $(RANLIB) libmisc.a 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = misc 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 $(LIBRARIES) $(HEADERS) 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-noinstLIBRARIES mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-noinstLIBRARIES distclean-compile \ distclean-tags distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ 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-noinstLIBRARIES distclean-noinstLIBRARIES \ clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile 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: baycomusb-0.10.orig/misc/Makefile.am0100644000175100017510000000041107330254300015367 0ustar abaabaINCLUDES = -I$(top_srcdir)/diag -I$(top_srcdir)/usbdrv noinst_HEADERS = \ sysdeps.h \ getopt.h EXTRA_DIST = getopt.c getopt1.c openpty.c vsnprintf.c noinst_LIBRARIES = libmisc.a libmisc_a_SOURCES = syslog.c snprintpkt.c lprintf.c libmisc_a_LIBADD = @LIBOBJS@ baycomusb-0.10.orig/misc/getopt.c0100644000175100017510000005061407325134424015023 0ustar abaaba/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* NOTE!!! AIX requires this to be the first thing in the file. Do not put ANYTHING before it! */ #if !defined (__GNUC__) && defined (_AIX) #pragma alloca #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not __GNUC__ */ #if defined (HAVE_ALLOCA_H) || (defined(sparc) && (defined(sun) || (!defined(USG) && !defined(SVR4) && !defined(__svr4__)))) #include #else #ifndef _AIX char *alloca (); #endif #endif /* alloca.h */ #endif /* not __GNUC__ */ #if !__STDC__ && !defined(const) && IN_GCC #define const #endif /* This tells Alpha OSF/1 not to define a getopt prototype in . */ #ifndef _NO_PROTO #define _NO_PROTO #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #undef alloca /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #else /* Not GNU C library. */ #define __alloca alloca #endif /* GNU C library. */ /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a long-named option. Because this is not POSIX.2 compliant, it is being phased out. */ /* #define GETOPT_COMPAT */ /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = 0; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* XXX 1003.2 says this must be 1 before any call. */ int optind = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return EOF with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index strchr #define my_bcopy(src, dst, n) memcpy ((dst), (src), (n)) #else /* Avoid depending on library functions or files whose names are inconsistent. */ char *getenv (); static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } static void my_bcopy (from, to, size) const char *from; char *to; int size; { int i; for (i = 0; i < size; i++) to[i] = from[i]; } #endif /* GNU C library. */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange (argv) char **argv; { int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *); char **temp = (char **) __alloca (nonopts_size); /* Interchange the two blocks of data in ARGV. */ my_bcopy ((char *) &argv[first_nonopt], (char *) temp, nonopts_size); my_bcopy ((char *) &argv[last_nonopt], (char *) &argv[first_nonopt], (optind - last_nonopt) * sizeof (char *)); my_bcopy ((char *) temp, (char *) &argv[first_nonopt + optind - last_nonopt], nonopts_size); /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns `EOF'. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { int option_index; optarg = 0; /* Initialize the internal data when the first call is made. Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ if (optind == 0) { first_nonopt = last_nonopt = optind = 1; nextchar = NULL; /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (getenv ("POSIXLY_CORRECT") != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; } if (nextchar == NULL || *nextchar == '\0') { if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Now skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && (argv[optind][0] != '-' || argv[optind][1] == '\0') #ifdef GETOPT_COMPAT && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0') #endif /* GETOPT_COMPAT */ ) optind++; last_nonopt = optind; } /* Special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return EOF; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if ((argv[optind][0] != '-' || argv[optind][1] == '\0') #ifdef GETOPT_COMPAT && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0') #endif /* GETOPT_COMPAT */ ) { if (ordering == REQUIRE_ORDER) return EOF; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Start decoding its characters. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } if (longopts != NULL && ((argv[optind][0] == '-' && (argv[optind][1] == '-' || long_only)) #ifdef GETOPT_COMPAT || argv[optind][0] == '+' #endif /* GETOPT_COMPAT */ )) { const struct option *p; char *s = nextchar; int exact = 0; int ambig = 0; const struct option *pfound = NULL; int indfound; while (*s && *s != '=') s++; /* Test all options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, s - nextchar)) { if (s - nextchar == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, "%s: option `%s' is ambiguous\n", argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*s) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = s + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, "%s: option `--%s' doesn't allow an argument\n", argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, "%s: option `%c%s' doesn't allow an argument\n", argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, "%s: option `%s' requires an argument\n", argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' #ifdef GETOPT_COMPAT || argv[optind][0] == '+' #endif /* GETOPT_COMPAT */ || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, "%s: unrecognized option `--%s'\n", argv[0], nextchar); else /* +option or -option */ fprintf (stderr, "%s: unrecognized option `%c%s'\n", argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; return '?'; } } /* Look at and handle the next option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { #if 0 if (c < 040 || c >= 0177) fprintf (stderr, "%s: unrecognized option, character code 0%o\n", argv[0], c); else fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); #else /* 1003.2 specifies the format of this message. */ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); #endif } optopt = c; return '?'; } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = 0; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { #if 0 fprintf (stderr, "%s: option `-%c' requires an argument\n", argv[0], c); #else /* 1003.2 specifies the format of this message. */ fprintf (stderr, "%s: option requires an argument -- %c\n", argv[0], c); #endif } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* _LIBC or not __GNU_LIBRARY__. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == EOF) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ baycomusb-0.10.orig/misc/getopt1.c0100644000175100017510000001005607325134424015100 0ustar abaaba/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "getopt.h" #if !__STDC__ && !defined(const) && IN_GCC #define const #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #else char *getenv (); #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* _LIBC or not __GNU_LIBRARY__. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == EOF) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ baycomusb-0.10.orig/misc/openpty.c0100644000175100017510000000651107325134424015214 0ustar abaaba/*****************************************************************************/ /* * openpty.c -- openpty. * * From glibc2, Copyright (C) Free Software Foundation * Modified by Thomas Sailer, sailer@ife.ee.ethz.ch * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp) { char line[11]; const char *cp1, *cp2; int master, slave, ttygid; struct group *gr; strcpy (line, "/dev/ptyXX"); if (gr = getgrnam("tty")) ttygid = gr->gr_gid; else ttygid = -1; for (cp1 = "pqrs"; *cp1; cp1++) { line[8] = *cp1; for (cp2 = "0123456789abcdef"; *cp2; cp2++) { line[9] = *cp2; if ((master = open(line, O_RDWR, 0)) == -1) { if (errno == ENOENT) return (-1); /* out of ptys */ } else { line[5] = 't'; (void)chown(line, getuid(), ttygid); (void)chmod(line, S_IRUSR|S_IWUSR|S_IWGRP); #ifdef HAVE_REVOKE revoke(line); #endif if ((slave = open(line, O_RDWR, 0)) != -1) { *amaster = master; *aslave = slave; if (name) strcpy(name, line); if (termp) (void)tcsetattr(slave, TCSAFLUSH, termp); if (winp) (void)ioctl(slave, TIOCSWINSZ, (char *)winp); return 0; } (void)close(master); line[5] = 'p'; } } } errno = ENOENT; /* out of ptys */ return -1; } baycomusb-0.10.orig/misc/vsnprintf.c0100644000175100017510000001015207325134424015543 0ustar abaaba/* * This file is derived from GLIB by Thomas Sailer, * * * GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include static unsigned int printf_string_upper_bound (const char *format, va_list args) { unsigned int len = 1; while (*format) { int long_int = 0; int extra_long = 0; char c; c = *format++; if (c == '%') { int done = 0; while (*format && !done) { switch (*format++) { char *string_arg; case '*': len += va_arg (args, int); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* add specified format length, since it might exceed the * size we assume it to have. */ format -= 1; len += strtol (format, (char**) &format, 10); break; case 'h': /* ignore short int flag, since all args have at least the * same size as an int */ break; case 'l': if (long_int) extra_long = 1; /* linux specific */ else long_int = 1; break; case 'q': case 'L': long_int = 1; extra_long = 1; break; case 's': string_arg = va_arg (args, char *); if (string_arg) len += strlen (string_arg); else { /* add enough padding to hold "(null)" identifier */ len += 16; } done = 1; break; case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': if (long_int) (void) va_arg (args, long); else (void) va_arg (args, int); len += extra_long ? 64 : 32; done = 1; break; case 'D': case 'O': case 'U': (void) va_arg (args, long); len += 32; done = 1; break; case 'e': case 'E': case 'f': case 'g': (void) va_arg (args, double); len += extra_long ? 64 : 32; done = 1; break; case 'c': (void) va_arg (args, int); len += 1; done = 1; break; case 'p': case 'n': (void) va_arg (args, void*); len += 32; done = 1; break; case '%': len += 1; done = 1; break; default: /* ignore unknow/invalid flags */ break; } } } else len += 1; } return len; } /* WARNING: This does only work for i386 (plus a few others, but not eg. alpha) !!!! */ #define VA_COPY(x,y) (x) = (y) static char *strdup_vprintf (const char *format, va_list args1) { char *buffer; va_list args2; VA_COPY (args2, args1); buffer = malloc(printf_string_upper_bound (format, args1)); if (buffer) vsprintf (buffer, format, args2); va_end (args2); return buffer; } int snprintf (char *str, size_t n, char const *fmt, ...) { char *printed; va_list args; int len; va_start(args, fmt); printed = strdup_vprintf (fmt, args); va_end (args); if (!printed) return -1; len = strlen(printed); strncpy(str, printed, n); str[n-1] = '\0'; free(printed); return len >= n ? -1 : len; } int vsnprintf (char *str, size_t n, char const *fmt, va_list args) { char *printed; int len; printed = strdup_vprintf (fmt, args); if (!printed) return -1; len = strlen(printed); strncpy(str, printed, n); str[n-1] = '\0'; free(printed); return len >= n ? -1 : len; } baycomusb-0.10.orig/misc/syslog.c0100644000175100017510000000436007325134424015036 0ustar abaaba/*****************************************************************************/ /* * syslog.c -- Syslog "abstraction" routines. * * Copyright (C) 1998,2000 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef HAVE_UNISTD_H #include #endif #include "baycomusb.h" /* ---------------------------------------------------------------------- */ #if defined(GO32) int syslogprintf(unsigned vl, const char *format, va_list ap) { return 0; } int syslogopen(const char *ident) { return -1; } #elif defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) int syslogprintf(unsigned vl, const char *format, va_list ap) { char buf[512]; vsnprintf(buf, sizeof(buf), format, ap); OutputDebugString(buf); return 0; } int syslogopen(const char *ident) { return -1; } #else #include int syslogprintf(unsigned vl, const char *format, va_list ap) { static const int logprio[] = { LOG_ERR, LOG_INFO }; vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap); return 0; } int syslogopen(const char *ident) { openlog(ident, LOG_PID, LOG_USER); return 0; } #endif /* ---------------------------------------------------------------------- */ baycomusb-0.10.orig/misc/snprintpkt.c0100644000175100017510000001262707325134424015737 0ustar abaaba/*****************************************************************************/ /* * snprintpkt.c -- Print an AX.25 packet (with header) into a buffer. * * Copyright (C) 1996, 2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * Swiss Federal Institute of Technology (ETH), Electronics Lab * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * * This is the Linux realtime sound output driver */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _GNU_SOURCE #include #include #include "sysdeps.h" /* --------------------------------------------------------------------- */ #define ADDCH(c) \ do { \ if (p + 1 >= endp) \ return -1; \ *p++ = (c); \ } while(0) #define ADDSTR(s) \ do { \ int l = strlen(s); \ if (p + l >= endp) \ return -1; \ memcpy(p, s, l); \ p += l; \ } while(0) #ifdef HAVE_SNPRINTF #define ADDF(fmt, args...) \ do { \ int xlen = snprintf(p, endp-p, fmt, ## args); \ if (xlen < 0) \ return -1; \ p += xlen; \ } while(0) #else /* HAVE_SNPRINTF */ #define ADDF(fmt, args...) \ do { \ char xbuf[64]; \ int xlen = sprintf(xbuf, fmt, ## args); \ if (p + xlen >= endp) \ return -1; \ memcpy(p, xbuf, xlen); \ p += xlen; \ } while(0) #endif /* HAVE_SNPRINTF */ int snprintpkt(char *buf, size_t sz, const u_int8_t *pkt, unsigned len) { u_int8_t v1=1 , cmd=0; u_int8_t i, j; char *p = buf; char *endp = buf + sz; if (sz < 2) return -1; *buf = 0; if (!pkt || len < 8) return 0; if (pkt[1] & 1) { /* * FlexNet Header Compression */ v1 = 0; cmd = (pkt[1] & 2) != 0; ADDSTR("fm ? to "); i = (pkt[2] >> 2) & 0x3f; if (i) { ADDCH(i+0x20); } i = ((pkt[2] << 4) | ((pkt[3] >> 4) & 0xf)) & 0x3f; if (i) { ADDCH(i+0x20); } i = ((pkt[3] << 2) | ((pkt[4] >> 6) & 3)) & 0x3f; if (i) { ADDCH(i+0x20); } i = pkt[4] & 0x3f; if (i) { ADDCH(i+0x20); } i = (pkt[5] >> 2) & 0x3f; if (i) { ADDCH(i+0x20); } i = ((pkt[5] << 4) | ((pkt[6] >> 4) & 0xf)) & 0x3f; if (i) { ADDCH(i+0x20); } ADDF("-%u QSO Nr %u", pkt[6] & 0xf, (pkt[0] << 6) | (pkt[1] >> 2)); pkt += 7; len -= 7; } else { /* * normal header */ if (len < 15) return 0; if ((pkt[6] & 0x80) != (pkt[13] & 0x80)) { v1 = 0; cmd = (pkt[6] & 0x80); } ADDSTR("fm "); for(i = 7; i < 13; i++) if ((pkt[i] &0xfe) != 0x40) { ADDCH(pkt[i] >> 1); } ADDF("-%u to ", (pkt[13] >> 1) & 0xf); for(i = 0; i < 6; i++) if ((pkt[i] &0xfe) != 0x40) { ADDCH(pkt[i] >> 1); } ADDF("-%u", (pkt[6] >> 1) & 0xf); pkt += 14; len -= 14; if ((!(pkt[-1] & 1)) && (len >= 7)) { ADDSTR(" via "); } while ((!(pkt[-1] & 1)) && (len >= 7)) { for(i = 0; i < 6; i++) if ((pkt[i] &0xfe) != 0x40) { ADDCH(pkt[i] >> 1); } ADDF("-%u", (pkt[6] >> 1) & 0xf); pkt += 7; len -= 7; if ((!(pkt[-1] & 1)) && (len >= 7)) { ADDCH(','); } } } if (!len) { *p = 0; return p - buf; } i = *pkt++; len--; j = v1 ? ((i & 0x10) ? '!' : ' ') : ((i & 0x10) ? (cmd ? '+' : '-') : (cmd ? '^' : 'v')); if (!(i & 1)) { /* * Info frame */ ADDF(" I%u%u%c", (i >> 5) & 7, (i >> 1) & 7, j); } else if (i & 2) { /* * U frame */ switch (i & (~0x10)) { case 0x03: ADDF(" UI%c", j); break; case 0x2f: ADDF(" SABM%c", j); break; case 0x43: ADDF(" DISC%c", j); break; case 0x0f: ADDF(" DM%c", j); break; case 0x63: ADDF(" UA%c", j); break; case 0x87: ADDF(" FRMR%c", j); break; default: ADDF(" unknown U (0x%x)%c", i & (~0x10), j); break; } } else { /* * supervisory */ switch (i & 0xf) { case 0x1: ADDF(" RR%u%c", (i >> 5) & 7, j); break; case 0x5: ADDF(" RNR%u%c", (i >> 5) & 7, j); break; case 0x9: ADDF(" REJ%u%c", (i >> 5) & 7, j); break; default: ADDF(" unknown S (0x%x)%u%c", i & 0xf, (i >> 5) & 7, j); break; } } if (!len) { ADDCH('\n'); *p = 0; return p - buf; } ADDF(" pid=%02X\n", *pkt++); len--; j = 0; while (len) { i = *pkt++; if ((i >= 32) && (i < 128)) { ADDCH(i); } else if (i == 13) { if (j) { ADDCH('\n'); } j = 0; } else { ADDCH('.'); } if (i >= 32) j = 1; len--; } if (j) { ADDCH('\n'); } *p = 0; return p - buf; } baycomusb-0.10.orig/misc/lprintf.c0100644000175100017510000000562007330254554015177 0ustar abaaba/*****************************************************************************/ /* * lprintf.c -- printf to console, syslog, debuglog. * * Copyright (C) 2000,2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_WINDOWS_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #include "sysdeps.h" /* ---------------------------------------------------------------------- */ unsigned int verboselevel = 0; unsigned int syslogmsg = 0; /* --------------------------------------------------------------------- */ #if defined(WIN32) int lprintf(unsigned int vl, const char *format, ...) { va_list ap; int r; if (vl > verboselevel) return 0; va_start(ap, format); if (syslogmsg) { char buf[512]; r = vsnprintf(buf, sizeof(buf), format, ap); OutputDebugString(buf); } else { r = vfprintf(stderr, format, ap); fflush(stderr); } va_end(ap); return r; } int lerr(unsigned int vl, const char *fn) { unsigned int e = GetLastError(); return lprintf(vl, "baycomusb: Error %d in %s\n", e, fn); } #else /* --------------------------------------------------------------------- */ int lprintf(unsigned int vl, const char *format, ...) { va_list ap; int r; if (vl > verboselevel) return 0; va_start(ap, format); #ifdef HAVE_VSYSLOG if (syslogmsg) { static const int logprio[] = { LOG_ERR, LOG_INFO }; vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap); r = 0; } else #endif { r = vfprintf(stderr, format, ap); fflush(stderr); } va_end(ap); return r; } int lerr(unsigned int vl, const char *fn) { int e = errno; return lprintf(vl, "baycomusb: Error %s (%d) in %s\n", strerror(e), e, fn); } /* ---------------------------------------------------------------------- */ #endif baycomusb-0.10.orig/misc/sysdeps.h0100644000175100017510000001516707330254240015217 0ustar abaaba/*****************************************************************************/ /* * sysdeps.h -- System dependencies. * * Copyright (C) 1998-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifndef _SYSDEPS_H #define _SYSDEPS_H /* ---------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef GETOPT_H #include #endif #ifdef UNISTD_H #include #endif #include #include #include /* ---------------------------------------------------------------------- */ /* * Bittypes */ #ifndef HAVE_BITTYPES #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) typedef int int8_t __attribute__((__mode__(__QI__))); typedef unsigned int u_int8_t __attribute__((__mode__(__QI__))); typedef int int16_t __attribute__((__mode__(__HI__))); typedef unsigned int u_int16_t __attribute__((__mode__(__HI__))); typedef int int32_t __attribute__((__mode__(__SI__))); typedef unsigned int u_int32_t __attribute__((__mode__(__SI__))); typedef int int64_t __attribute__((__mode__(__DI__))); typedef unsigned int u_int64_t __attribute__((__mode__(__DI__))); #else typedef char /* deduced */ int8_t __attribute__((__mode__(__QI__))); typedef unsigned char /* deduced */ u_int8_t __attribute__((__mode__(__QI__))); typedef short /* deduced */ int16_t __attribute__((__mode__(__HI__))); typedef unsigned short /* deduced */ u_int16_t __attribute__((__mode__(__HI__))); typedef long /* deduced */ int32_t __attribute__((__mode__(__SI__))); typedef unsigned long /* deduced */ u_int32_t __attribute__((__mode__(__SI__))); typedef long long /* deduced */ int64_t __attribute__((__mode__(__DI__))); typedef unsigned long long /* deduced */ u_int64_t __attribute__((__mode__(__DI__))); #endif #endif /* !HAVE_BITTYPES */ /* ---------------------------------------------------------------------- */ /* * syslog routines */ #ifdef HAVE_SYS_SYSLOG_H #include #else #define LOG_EMERG 0 /* system is unusable */ #define LOG_ALERT 1 /* action must be taken immediately */ #define LOG_CRIT 2 /* critical conditions */ #define LOG_ERR 3 /* error conditions */ #define LOG_WARNING 4 /* warning conditions */ #define LOG_NOTICE 5 /* normal but significant condition */ #define LOG_INFO 6 /* informational */ #define LOG_DEBUG 7 /* debug-level messages */ /* facility codes */ #define LOG_KERN (0<<3) /* kernel messages */ #define LOG_USER (1<<3) /* random user-level messages */ #define LOG_MAIL (2<<3) /* mail system */ #define LOG_DAEMON (3<<3) /* system daemons */ #define LOG_AUTH (4<<3) /* security/authorization messages */ #define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ #define LOG_LPR (6<<3) /* line printer subsystem */ #define LOG_NEWS (7<<3) /* network news subsystem */ #define LOG_UUCP (8<<3) /* UUCP subsystem */ #define LOG_CRON (9<<3) /* clock daemon */ #define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ #define LOG_FTP (11<<3) /* ftp daemon */ extern inline void closelog(void) {} extern inline void openlog(__const char *__ident, int __option, int __facility) {} extern inline void vsyslog(int __pri, __const char *__fmt, va_list __ap) {} #endif /* ---------------------------------------------------------------------- */ #ifdef __MINGW32__ #include extern inline void usleep(unsigned long x) { Sleep(x / 1000); } #endif /* ---------------------------------------------------------------------- */ #ifdef HAVE_GETTIMEOFDAY #include #include extern inline int gettime(struct timeval *tv) { return gettimeofday(tv, NULL); } extern inline unsigned int gettimems(void) { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; } #elif HAVE_GETSYSTEMTIME #ifdef HAVE_WINDOWS_H #include #endif #if 0 struct timeval { long tv_sec; long tv_usec; }; #endif extern inline int gettime(struct timeval *tv) { SYSTEMTIME tm; FILETIME ft; LARGE_INTEGER li; GetSystemTime(&tm); SystemTimeToFileTime(&tm, &ft); li._STRUCT_NAME(u.)LowPart = ft.dwLowDateTime; li._STRUCT_NAME(u.)HighPart = ft.dwHighDateTime; li.QuadPart /= 10; tv->tv_sec = li.QuadPart / 1000000; tv->tv_usec = li.QuadPart - 1000000 * tv->tv_sec; return 0; } extern inline unsigned int gettimems(void) { SYSTEMTIME tm; FILETIME ft; LARGE_INTEGER li; GetSystemTime(&tm); SystemTimeToFileTime(&tm, &ft); li._STRUCT_NAME(u.)LowPart = ft.dwLowDateTime; li._STRUCT_NAME(u.)HighPart = ft.dwHighDateTime; li.QuadPart /= 10000; return li.QuadPart; } #else #error "Don't know how to get a high resolution time" #endif /* ---------------------------------------------------------------------- */ #ifndef HAVE_RANDOM extern inline long int random(void) { return rand(); } #endif /* ---------------------------------------------------------------------- */ #ifndef HAVE_VSNPRINTF extern int snprintf(char *str, size_t n, char const *fmt, ...) __attribute__ ((format (printf, 3, 4))); extern int vsnprintf(char *str, size_t n, char const *fmt, va_list args); #endif extern int snprintpkt(char *buf, size_t sz, const u_int8_t *pkt, unsigned len); extern int lprintf(unsigned vl, const char *format, ...) __attribute__ ((format (printf, 2, 3))); extern int lerr(unsigned int vl, const char *fn); extern unsigned int verboselevel; extern unsigned int syslogmsg; /* ---------------------------------------------------------------------- */ #endif /* _SYSDEPS_H */ baycomusb-0.10.orig/misc/getopt.h0100644000175100017510000001047407325134424015030 0ustar abaaba/* Declarations for getopt. Copyright (C) 1989, 1990, 1991, 1992, 1993 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _GETOPT_H #define _GETOPT_H 1 #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { #if __STDC__ const char *name; #else char *name; #endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 #if __STDC__ #if defined(__GNU_LIBRARY__) /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #else /* not __GNU_LIBRARY__ */ extern int getopt (); #endif /* not __GNU_LIBRARY__ */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); #else /* not __STDC__ */ extern int getopt (); extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); #endif /* not __STDC__ */ #ifdef __cplusplus } #endif #endif /* _GETOPT_H */ baycomusb-0.10.orig/usbdrv/0042755000175100017510000000000007340500007013715 5ustar abaababaycomusb-0.10.orig/usbdrv/Makefile.in0100644000175100017510000002664707340500007015774 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = @GTK_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv -I$(top_srcdir)/kerneldrv -I$(top_srcdir)/wdmdrv SUBDIRS = noinst_LIBRARIES = libusb.a CLEANFILES = noinst_HEADERS = usbdrv.h usbdevice_fs.h list.h @WIN32_TRUE@libusb_a_SOURCES = usbdrvwinasync.c @WIN32_FALSE@libusb_a_SOURCES = usbdrvlinux.c EXTRA_DIST = usbdrvlinux.c usbdrvwinasync.c mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libusb_a_LIBADD = @WIN32_TRUE@libusb_a_OBJECTS = usbdrvwinasync.$(OBJEXT) @WIN32_FALSE@libusb_a_OBJECTS = usbdrvlinux.$(OBJEXT) CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ HEADERS = $(noinst_HEADERS) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(libusb_a_SOURCES) OBJECTS = $(libusb_a_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps usbdrv/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstLIBRARIES: clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) distclean-noinstLIBRARIES: maintainer-clean-noinstLIBRARIES: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: libusb.a: $(libusb_a_OBJECTS) $(libusb_a_DEPENDENCIES) -rm -f libusb.a $(AR) cru libusb.a $(libusb_a_OBJECTS) $(libusb_a_LIBADD) $(RANLIB) libusb.a # 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = usbdrv 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 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=../$(top_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 $(LIBRARIES) $(HEADERS) all-redirect: all-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: installdirs-recursive installdirs-am: 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: mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-recursive clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-recursive distclean-am: distclean-noinstLIBRARIES distclean-compile \ distclean-tags distclean-generic clean-am distclean: distclean-recursive maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ 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-recursive .PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile 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: baycomusb-0.10.orig/usbdrv/Makefile.am0100644000175100017510000000105507331304742015755 0ustar abaaba## Process this file with automake to produce Makefile.in INCLUDES = @GTK_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \ -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv -I$(top_srcdir)/kerneldrv -I$(top_srcdir)/wdmdrv SUBDIRS = noinst_LIBRARIES = libusb.a CLEANFILES = noinst_HEADERS = \ usbdrv.h \ usbdevice_fs.h \ list.h if WIN32 libusb_a_SOURCES = usbdrvwinasync.c else libusb_a_SOURCES = usbdrvlinux.c endif EXTRA_DIST = usbdrvlinux.c usbdrvwinasync.c baycomusb-0.10.orig/usbdrv/usbdrvlinux.c0100644000175100017510000002706407325134424016463 0ustar abaaba/*****************************************************************************/ /* * usbdrvlinux.c -- Linux USB driver interface. * * Copyright (C) 1999-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: usbdrvlinux.c,v 1.4 2000/01/12 15:54:07 tom Exp $ * * History: * 0.1 23.06.1999 Created * 0.2 07.01.2000 Expanded to usbdevfs capabilities * */ /*****************************************************************************/ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #include "usbdrv.h" /* --------------------------------------------------------------------- */ struct usbdevice { int fd; struct usb_device_descriptor desc; }; static char usb_devicefs_mountpoint[256] = "/proc/bus/usb"; /* --------------------------------------------------------------------- */ /* * Parse and show the different USB descriptors. */ void usb_show_device_descriptor(FILE *f, struct usb_device_descriptor *desc) { fprintf(f, " Length = %2d%s\n", desc->bLength, desc->bLength == USB_DT_DEVICE_SIZE ? "" : " (!!!)"); fprintf(f, " DescriptorType = %02x\n", desc->bDescriptorType); fprintf(f, " USB version = %x.%02x\n", desc->bcdUSB[1], desc->bcdUSB[0]); fprintf(f, " Vendor:Product = %02x%02x:%02x%02x\n", desc->idVendor[1], desc->idVendor[0], desc->idProduct[1], desc->idProduct[0]); fprintf(f, " MaxPacketSize0 = %d\n", desc->bMaxPacketSize0); fprintf(f, " NumConfigurations = %d\n", desc->bNumConfigurations); fprintf(f, " Device version = %x.%02x\n", desc->bcdDevice[1], desc->bcdDevice[0]); fprintf(f, " Device Class:SubClass:Protocol = %02x:%02x:%02x\n", desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol); switch (desc->bDeviceClass) { case 0: fprintf(f, " Per-interface classes\n"); break; case 9: fprintf(f, " Hub device class\n"); break; case 0xff: fprintf(f, " Vendor class\n"); break; default: fprintf(f, " Unknown class\n"); } } /* ---------------------------------------------------------------------- */ void usb_setmountpoint(const char *mnt) { if (!mnt) mnt = "/proc/bus/usb"; strncpy(usb_devicefs_mountpoint, mnt, sizeof(usb_devicefs_mountpoint)); } const char *usb_getmountpoint(void) { return usb_devicefs_mountpoint; } void usb_close(struct usbdevice *dev) { if (!dev) return; close(dev->fd); lprintf(20, "usb_close: fd %d\n", dev->fd); free(dev); } static int parsedev(int fd, unsigned int *bus, unsigned int *dev, int vendorid, int productid, unsigned int index) { char buf[16384]; char *start, *end, *lineend, *cp; int devnum = -1, busnum = -1, vendor = -1, product = -1; int ret; if (lseek(fd, 0, SEEK_SET) == (off_t)-1) return -1; ret = read(fd, buf, sizeof(buf)-1); if (ret == -1) return -1; end = buf + ret; *end = 0; start = buf; ret = 0; while (start < end) { lineend = strchr(start, '\n'); if (!lineend) break; *lineend = 0; switch (start[0]) { case 'T': /* topology line */ if ((cp = strstr(start, "Dev#="))) { devnum = strtoul(cp + 5, NULL, 0); } else devnum = -1; if ((cp = strstr(start, "Bus="))) { busnum = strtoul(cp + 4, NULL, 0); } else busnum = -1; break; case 'P': if ((cp = strstr(start, "Vendor="))) { vendor = strtoul(cp + 7, NULL, 16); } else vendor = -1; if ((cp = strstr(start, "ProdID="))) { product = strtoul(cp + 7, NULL, 16); } else product = -1; if (vendor != -1 && product != -1 && devnum >= 1 && devnum <= 127 && busnum >= 0 && busnum <= 999 && (vendorid == vendor || vendorid == -1) && (productid == product || productid == -1)) { if (index) index--; else { if (!ret) { if (bus) *bus = busnum; if (dev) *dev = devnum; } ret++; } } break; } start = lineend + 1; } return ret; } struct usbdevice *usb_open_bynumber(unsigned int busnum, unsigned int devnum, int vendorid, int productid) { struct usbdevice *dev; struct usb_device_descriptor desc; unsigned int vid, pid; char devsfile[256]; int ret, fd; snprintf(devsfile, sizeof(devsfile), "%s/%03u/%03u", usb_devicefs_mountpoint, busnum, devnum); if ((fd = open(devsfile, O_RDWR)) == -1) return NULL; if ((ret = read(fd, &desc, sizeof(desc))) != sizeof(desc)) { if (ret > 0) errno = EIO; close(fd); return NULL; } vid = desc.idVendor[0] | (desc.idVendor[1] << 8); pid = desc.idProduct[0] | (desc.idProduct[1] << 8); if ((vid != vendorid && vendorid != -1) || (pid != productid && productid != -1)) { errno = -ENOENT; close(fd); return NULL; } if (!(dev = malloc(sizeof(struct usbdevice)))) { close(fd); return NULL; } dev->fd = fd; dev->desc = desc; lprintf(20, "usb_open_bynumber: device %03u:%03u vid %04x pid %04x fd %d\n", busnum, devnum, vid, pid, fd); return dev; } struct usbdevice *usb_open(int vendorid, int productid, unsigned int timeout, unsigned int index) { time_t starttime, curtime; unsigned int busnum, devnum; char devsfile[256]; long timediff; int ret; struct pollfd pfd; snprintf(devsfile, sizeof(devsfile), "%s/devices", usb_devicefs_mountpoint); time(&starttime); if ((pfd.fd = open(devsfile, O_RDONLY)) == -1) return NULL; for (;;) { ret = parsedev(pfd.fd, &busnum, &devnum, vendorid, productid, index); if (ret < 0) { close(pfd.fd); return NULL; } if (ret > 0) break; time(&curtime); timediff = curtime - starttime; timediff = timeout - timediff; if (timediff <= 0) { close(pfd.fd); errno = ETIMEDOUT; return NULL; } if (timediff > 10) timediff = 10; pfd.events = POLLIN; ret = poll(&pfd, 1, timediff * 1000); if (ret < 0) { close(pfd.fd); return NULL; } } close(pfd.fd); return usb_open_bynumber(busnum, devnum, vendorid, productid); } int usb_control_msg(struct usbdevice *dev, unsigned char requesttype, unsigned char request, unsigned short value, unsigned short index, unsigned short length, void *data, unsigned int timeout) { struct usbdevfs_ctrltransfer ctrl; int i; ctrl = (struct usbdevfs_ctrltransfer){ requesttype, request, value, index, length, timeout, data }; for (;;) { i = ioctl(dev->fd, USBDEVFS_CONTROL, &ctrl); if (i != -1 || errno != ENXIO) break; lprintf(20, "usb_control: URB already queued, retrying\n"); usleep(20000); } lprintf(20, "usb_control: rqt 0x%02x rq 0x%02x val 0x%04x idx 0x%04x len %u ret %d\n", requesttype, request, value, index, length, i); if (i < 0) { lprintf(2, "ioctl: USBDEVFS_CONTROL (rqt=0x%x rq=0x%x val=%u idx=%u len=%u) error %s (%d)\n", requesttype, request, value, index, length, strerror(errno), errno); return -1; } return i; } int usb_bulk_msg(struct usbdevice *dev, unsigned int ep, unsigned int dlen, void *data, unsigned int timeout) { struct usbdevfs_bulktransfer bulk; int i; bulk = (struct usbdevfs_bulktransfer){ ep, dlen, timeout, data }; for (;;) { i = ioctl(dev->fd, USBDEVFS_BULK, &bulk); if (i != -1 || errno != ENXIO) break; lprintf(20, "usb_bulk: URB already queued, retrying\n"); usleep(20000); } lprintf(20, "usb_bulk: ep 0x%02x len %u ret %d\n", ep, dlen, i); if (i < 0) { lprintf(2, "ioctl: USBDEVFS_BULK (ep=0x%x len=%u) error %s (%d)\n", ep, dlen, strerror(errno), errno); return -1; } return i; } int usb_resetep(struct usbdevice *dev, unsigned int ep) { int i; i = ioctl(dev->fd, USBDEVFS_RESETEP, &ep); if (i < 0) { lprintf(2, "ioctl: USBDEVFS_RESETEP (ep=0x%x) error %s (%d)\n", ep, strerror(errno), errno); return -1; } return 0; } int usb_setconfiguration(struct usbdevice *dev, unsigned int configuration) { int i; i = ioctl(dev->fd, USBDEVFS_SETCONFIGURATION, &configuration); if (i < 0) { lprintf(2, "ioctl: USBDEVFS_SETCONFIGURATION (cfg=%d) error %s (%d)\n", configuration, strerror(errno), errno); return -1; } return 0; } int usb_setinterface(struct usbdevice *dev, unsigned int intf, unsigned int altsetting) { struct usbdevfs_setinterface setif; int i; setif = (struct usbdevfs_setinterface) { intf, altsetting }; i = ioctl(dev->fd, USBDEVFS_SETINTERFACE, &setif); if (i < 0) { lprintf(2, "ioctl: USBDEVFS_SETINTERFACE (intf=%d,altsetting=%d) error %s (%d)\n", intf, altsetting, strerror(errno), errno); return -1; } return 0; } int usb_getdevicedescriptor(struct usbdevice *dev, struct usb_device_descriptor *desc) { if (desc) memcpy(desc, &dev->desc, sizeof(*desc)); return 0; } int usb_claiminterface(struct usbdevice *dev, unsigned int intf) { return ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE, &intf); } int usb_releaseinterface(struct usbdevice *dev, unsigned int intf) { return ioctl(dev->fd, USBDEVFS_RELEASEINTERFACE, &intf); } int usb_discsignal(struct usbdevice *dev, unsigned int signr, void *context) { struct usbdevfs_disconnectsignal s = { signr, context }; return ioctl(dev->fd, USBDEVFS_DISCSIGNAL, &s); } int usb_submiturb(struct usbdevice *dev, struct usbdevfs_urb *urb) { return ioctl(dev->fd, USBDEVFS_SUBMITURB, urb); } int usb_discardurb(struct usbdevice *dev, struct usbdevfs_urb *urb) { return ioctl(dev->fd, USBDEVFS_DISCARDURB, urb); } struct usbdevfs_urb *usb_reapurb(struct usbdevice *dev, int timeout) { int ret; struct usbdevfs_urb *urb; struct timeval tv1, tv2; long wt; struct pollfd pfd; if (timeout <= 0) { ret = ioctl(dev->fd, timeout ? USBDEVFS_REAPURB : USBDEVFS_REAPURBNDELAY, &urb); if (ret < 0) return NULL; return urb; } gettimeofday(&tv1, NULL); pfd.fd = dev->fd; pfd.events = POLLOUT; for (;;) { ret = ioctl(dev->fd, USBDEVFS_REAPURBNDELAY, &urb); if (ret >= 0) return urb; gettimeofday(&tv2, NULL); wt = timeout + (tv1.tv_sec - tv2.tv_sec) * 1000 + (tv1.tv_usec - tv2.tv_usec) / 1000; if (wt <= 0) return NULL; if (poll(&pfd, 1, wt) < 0) return NULL; } } int usb_getfd(struct usbdevice *dev) { return dev->fd; } /* ---------------------------------------------------------------------- */ baycomusb-0.10.orig/usbdrv/usbdrv.h0100644000175100017510000001334307325134424015403 0ustar abaaba/*****************************************************************************/ /* * usbdrv.h -- Linux USB driver interface. * * Copyright (C) 1999-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * $Id: usbdrv.h,v 1.3 2000/01/11 11:07:50 tom Exp $ * * History: * 0.1 07.01.2000 Created * */ /*****************************************************************************/ #ifndef _USBDRV_H #define _USBDRV_H /* --------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _GNU_SOURCE #include #include /* * needed for the URB definition */ #ifdef WIN32 struct usbdevfs_iso_packet_desc { unsigned int length; unsigned int actual_length; unsigned int status; }; struct usbdevfs_urb { unsigned char type; unsigned char endpoint; int status; unsigned int flags; void *buffer; int buffer_length; int actual_length; int start_frame; int number_of_packets; int error_count; unsigned int signr; /* signal to be sent on error, -1 if none should be sent */ void *usercontext; struct usbdevfs_iso_packet_desc iso_frame_desc[0]; }; #define USBDEVFS_URB_DISABLE_SPD 0x0001 #define USBDEVFS_URB_ISO_ASAP 0x0002 #define USBDEVFS_URB_QUEUE_BULK 0x0010 #define USBDEVFS_URB_NO_FSBR 0x0020 #define USBDEVFS_URB_ZERO_PACKET 0x0040 #define USBDEVFS_URB_TYPE_ISO 0 #define USBDEVFS_URB_TYPE_INTERRUPT 1 #define USBDEVFS_URB_TYPE_CONTROL 2 #define USBDEVFS_URB_TYPE_BULK 3 #else #ifdef HAVE_LINUX_USBDEVICE_FS_H #include #include #else #include "usbdevice_fs.h" #endif #ifndef USBDEVFS_URB_ZERO_PACKET #define USBDEVFS_URB_ZERO_PACKET 0x0040 #endif #endif /* --------------------------------------------------------------------- */ /* * provided externally! */ extern int lprintf(unsigned vl, const char *format, ...) __attribute__ ((format (printf, 2, 3))); /* --------------------------------------------------------------------- */ struct usb_device_descriptor { u_int8_t bLength; u_int8_t bDescriptorType; u_int8_t bcdUSB[2]; u_int8_t bDeviceClass; u_int8_t bDeviceSubClass; u_int8_t bDeviceProtocol; u_int8_t bMaxPacketSize0; u_int8_t idVendor[2]; u_int8_t idProduct[2]; u_int8_t bcdDevice[2]; u_int8_t iManufacturer; u_int8_t iProduct; u_int8_t iSerialNumber; u_int8_t bNumConfigurations; }; #define USB_DT_DEVICE_SIZE sizeof(struct usb_device_descriptor) struct usb_control_request { u_int8_t requesttype; u_int8_t request; u_int8_t value[2]; u_int8_t index[2]; u_int8_t length[2]; } __attribute__ ((packed)); #define USB_CONTROL_REQUEST_SIZE sizeof(struct usb_control_request) /* --------------------------------------------------------------------- */ struct usbdevice; extern void usb_setmountpoint(const char *mnt); extern const char *usb_getmountpoint(void); extern void usb_show_device_descriptor(FILE *f, struct usb_device_descriptor *desc); extern void usb_close(struct usbdevice *dev); extern struct usbdevice *usb_open_bynumber(unsigned int busnum, unsigned int devnum, int vendorid, int productid); extern struct usbdevice *usb_open(int vendorid, int productid, unsigned int timeout, unsigned int index); extern int usb_control_msg(struct usbdevice *dev, unsigned char requesttype, unsigned char request, unsigned short value, unsigned short index, unsigned short length, void *data, unsigned int timeout); extern int usb_bulk_msg(struct usbdevice *dev, unsigned int ep, unsigned int dlen, void *data, unsigned int timeout); extern int usb_resetep(struct usbdevice *dev, unsigned int ep); extern int usb_setconfiguration(struct usbdevice *dev, unsigned int configuration); extern int usb_setinterface(struct usbdevice *dev, unsigned int intf, unsigned int altsetting); extern int usb_getdevicedescriptor(struct usbdevice *dev, struct usb_device_descriptor *desc); extern int usb_claiminterface(struct usbdevice *dev, unsigned int intf); extern int usb_releaseinterface(struct usbdevice *dev, unsigned int intf); extern int usb_discsignal(struct usbdevice *dev, unsigned int signr, void *context); extern int usb_submiturb(struct usbdevice *dev, struct usbdevfs_urb *urb); extern int usb_discardurb(struct usbdevice *dev, struct usbdevfs_urb *urb); extern struct usbdevfs_urb *usb_reapurb(struct usbdevice *dev, int timeout); /* timeout: -1 infinity, 0 nonblocking, otherwise ms */ #if defined(WIN32) extern HANDLE usb_getfd(struct usbdevice *dev); #else extern int usb_getfd(struct usbdevice *dev); #endif /* ---------------------------------------------------------------------- */ #endif /* _USBDRV_H */ baycomusb-0.10.orig/usbdrv/usbdevice_fs.h0100644000175100017510000001455507325134424016545 0ustar abaaba/*****************************************************************************/ /* * usbdevice_fs.h -- USB device file system. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * History: * 0.1 04.01.2000 Created * * $Id: usbdevice_fs.h,v 1.1 2000/01/06 18:40:41 tom Exp $ */ /*****************************************************************************/ #ifndef _LINUX_USBDEVICE_FS_H #define _LINUX_USBDEVICE_FS_H #include /* --------------------------------------------------------------------- */ #define USBDEVICE_SUPER_MAGIC 0x9fa2 /* usbdevfs ioctl codes */ struct usbdevfs_ctrltransfer { __u8 requesttype; __u8 request; __u16 value; __u16 index; __u16 length; __u32 timeout; /* in milliseconds */ void *data; }; /* control transfer to nondefault endpoints */ struct usbdevfs_ctrltransfer_ep { __u8 ep; __u8 requesttype; __u8 request; __u16 value; __u16 index; __u16 length; __u32 timeout; /* in milliseconds */ void *data; }; struct usbdevfs_bulktransfer { unsigned int ep; unsigned int len; unsigned int timeout; /* in milliseconds */ void *data; }; struct usbdevfs_setinterface { unsigned int interface; unsigned int altsetting; }; struct usbdevfs_disconnectsignal { unsigned int signr; void *context; }; #define USBDEVFS_MAXDRIVERNAME 255 struct usbdevfs_getdriver { unsigned int interface; char driver[USBDEVFS_MAXDRIVERNAME + 1]; }; struct usbdevfs_connectinfo { unsigned int devnum; unsigned char slow; }; #define USBDEVFS_USB_DISABLE_SPD 0x0001 #define USBDEVFS_USB_ISO_ASAP 0x0002 #define USBDEVFS_USB_QUEUE_BULK 0x0010 #define USBDEVFS_USB_NO_FSBR 0x0020 #define USBDEVFS_USB_ZERO_PACKET 0x0040 #define USBDEVFS_URB_TYPE_ISO 0 #define USBDEVFS_URB_TYPE_INTERRUPT 1 #define USBDEVFS_URB_TYPE_CONTROL 2 #define USBDEVFS_URB_TYPE_BULK 3 struct usbdevfs_iso_packet_desc { unsigned int length; unsigned int actual_length; unsigned int status; }; struct usbdevfs_urb { unsigned char type; unsigned char endpoint; int status; unsigned int flags; void *buffer; int buffer_length; int actual_length; int start_frame; int number_of_packets; int error_count; unsigned int signr; /* signal to be sent on error, -1 if none should be sent */ void *usercontext; struct usbdevfs_iso_packet_desc iso_frame_desc[0]; }; /* ioctls for talking to drivers in the usbcore module: */ struct usbdevfs_ioctl { int ifno; /* interface 0..N ; negative numbers reserved */ int ioctl_code; /* MUST encode size + direction of data so the * macros in give correct values */ void *data; /* param buffer (in, or out) */ }; /* You can do most things with hubs just through control messages, * except find out what device connects to what port. */ struct usbdevfs_hub_portinfo { char nports; /* number of downstream ports in this hub */ char port [127]; /* e.g. port 3 connects to device 27 */ }; #define USBDEVFS_CONTROL _IOWR('U', 0, struct usbdevfs_ctrltransfer) #define USBDEVFS_CONTROL_EP _IOWR('U', 1, struct usbdevfs_ctrltransfer_ep) #define USBDEVFS_BULK _IOWR('U', 2, struct usbdevfs_bulktransfer) #define USBDEVFS_RESETEP _IOR('U', 3, unsigned int) #define USBDEVFS_SETINTERFACE _IOR('U', 4, struct usbdevfs_setinterface) #define USBDEVFS_SETCONFIGURATION _IOR('U', 5, unsigned int) #define USBDEVFS_GETDRIVER _IOW('U', 8, struct usbdevfs_getdriver) #define USBDEVFS_SUBMITURB _IOR('U', 10, struct usbdevfs_urb) #define USBDEVFS_DISCARDURB _IO('U', 11) #define USBDEVFS_REAPURB _IOW('U', 12, void *) #define USBDEVFS_REAPURBNDELAY _IOW('U', 13, void *) #define USBDEVFS_DISCSIGNAL _IOR('U', 14, struct usbdevfs_disconnectsignal) #define USBDEVFS_CLAIMINTERFACE _IOR('U', 15, unsigned int) #define USBDEVFS_RELEASEINTERFACE _IOR('U', 16, unsigned int) #define USBDEVFS_CONNECTINFO _IOW('U', 17, struct usbdevfs_connectinfo) #define USBDEVFS_IOCTL _IOWR('U', 18, struct usbdevfs_ioctl) #define USBDEVFS_HUB_PORTINFO _IOR('U', 19, struct usbdevfs_hub_portinfo) #define USBDEVFS_RESET _IO('U', 20) #define USBDEVFS_CLEAR_HALT _IOR('U', 21, unsigned int) /* --------------------------------------------------------------------- */ #ifdef __KERNEL__ #include #include /* * inode number macros */ #define ITYPE(x) ((x)&(0xf<<28)) #define ISPECIAL (0<<28) #define IBUS (1<<28) #define IDEVICE (2<<28) #define IBUSNR(x) (((x)>>8)&0xff) #define IDEVNR(x) ((x)&0xff) #define IROOT 1 struct dev_state { struct list_head list; /* state list */ struct rw_semaphore devsem; /* protects modifications to dev (dev == NULL indicating disconnect) */ struct usb_device *dev; struct file *file; spinlock_t lock; /* protects the async urb lists */ struct list_head async_pending; struct list_head async_completed; wait_queue_head_t wait; /* wake up if a request completed */ unsigned int discsignr; struct task_struct *disctask; void *disccontext; unsigned long ifclaimed; }; /* internal methods & data */ extern struct usb_driver usbdevfs_driver; extern struct file_operations usbdevfs_drivers_fops; extern struct file_operations usbdevfs_devices_fops; extern struct file_operations usbdevfs_device_file_operations; extern struct inode_operations usbdevfs_device_inode_operations; extern struct inode_operations usbdevfs_bus_inode_operations; extern struct file_operations usbdevfs_bus_file_operations; extern void usbdevfs_conn_disc_event(void); #endif /* __KERNEL__ */ /* --------------------------------------------------------------------- */ #endif /* _LINUX_USBDEVICE_FS_H */ baycomusb-0.10.orig/usbdrv/list.h0100644000175100017510000000445407331304726015055 0ustar abaaba#ifndef _LINUX_LIST_H #define _LINUX_LIST_H /* * Simple doubly linked list implementation. * * Some of the internal functions ("__xxx") are useful when * manipulating whole lists rather than single entries, as * sometimes we already know the next/prev entries and we can * generate better code by using them directly rather than * using the generic single-entry routines. */ struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) /* * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static __inline__ void __list_add(struct list_head * new, struct list_head * prev, struct list_head * next) { next->prev = new; new->next = next; new->prev = prev; prev->next = new; } /* * Insert a new entry after the specified head.. */ static __inline__ void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } /* * Insert a new entry before the specified head.. */ static __inline__ void list_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } /* * Delete a list entry by making the prev/next entries * point to each other. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static __inline__ void __list_del(struct list_head * prev, struct list_head * next) { next->prev = prev; prev->next = next; } static __inline__ void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); } static __inline__ int list_empty(struct list_head *head) { return head->next == head; } /* * Splice in "list" into "head" */ static __inline__ void list_splice(struct list_head *list, struct list_head *head) { struct list_head *first = list->next; if (first != list) { struct list_head *last = list->prev; struct list_head *at = head->next; first->prev = head; head->next = first; last->next = at; at->prev = last; } } #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) #endif baycomusb-0.10.orig/usbdrv/usbdrvwinasync.c0100644000175100017510000010274407326560114017156 0ustar abaaba/*****************************************************************************/ /* * usbdrvwinasync.c -- Windows USB driver interface using Baycomusb Driver, asynchronous. * * Copyright (C) 1999-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * * History: * 0.1 23.06.1999 Created * 0.2 16.07.2000 Adapted to new interface * */ /*****************************************************************************/ #include //#include "wininc/winioctl.h" #include #include #include #include "sysdeps.h" #include "usbdevio.h" #include "list.h" #define LOGCTRLBULK /* --------------------------------------------------------------------- */ #define DEVICE_TYPE DWORD #define FILE_DEVICE_UNKNOWN 0x00000022 #define CTL_CODE( DeviceType, Function, Method, Access ) ( \ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ ) #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 #define METHOD_NEITHER 3 #define FILE_ANY_ACCESS 0 #define FILE_READ_ACCESS (0x0001) #define FILE_WRITE_ACCESS (0x0002) #define USBD_STATUS DWORD /* --------------------------------------------------------------------- */ #define USBD_STATUS_CRC ((USBD_STATUS)0xC0000001L) #define USBD_STATUS_BTSTUFF ((USBD_STATUS)0xC0000002L) #define USBD_STATUS_DATA_TOGGLE_MISMATCH ((USBD_STATUS)0xC0000003L) #define USBD_STATUS_STALL_PID ((USBD_STATUS)0xC0000004L) #define USBD_STATUS_DEV_NOT_RESPONDING ((USBD_STATUS)0xC0000005L) #define USBD_STATUS_PID_CHECK_FAILURE ((USBD_STATUS)0xC0000006L) #define USBD_STATUS_UNEXPECTED_PID ((USBD_STATUS)0xC0000007L) #define USBD_STATUS_DATA_OVERRUN ((USBD_STATUS)0xC0000008L) #define USBD_STATUS_DATA_UNDERRUN ((USBD_STATUS)0xC0000009L) #define USBD_STATUS_RESERVED1 ((USBD_STATUS)0xC000000AL) #define USBD_STATUS_RESERVED2 ((USBD_STATUS)0xC000000BL) #define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL) #define USBD_STATUS_BUFFER_UNDERRUN ((USBD_STATUS)0xC000000DL) #define USBD_STATUS_NOT_ACCESSED ((USBD_STATUS)0xC000000FL) #define USBD_STATUS_FIFO ((USBD_STATUS)0xC0000010L) #define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS)0xC0000030L) #define USBD_STATUS_NO_MEMORY ((USBD_STATUS)0x80000100L) #define USBD_STATUS_INVALID_URB_FUNCTION ((USBD_STATUS)0x80000200L) #define USBD_STATUS_INVALID_PARAMETER ((USBD_STATUS)0x80000300L) #define USBD_STATUS_ERROR_BUSY ((USBD_STATUS)0x80000400L) #define USBD_STATUS_REQUEST_FAILED ((USBD_STATUS)0x80000500L) #define USBD_STATUS_INVALID_PIPE_HANDLE ((USBD_STATUS)0x80000600L) #define USBD_STATUS_NO_BANDWIDTH ((USBD_STATUS)0x80000700L) #define USBD_STATUS_INTERNAL_HC_ERROR ((USBD_STATUS)0x80000800L) #define USBD_STATUS_ERROR_SHORT_TRANSFER ((USBD_STATUS)0x80000900L) #define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS)0xC0000A00L) #define USBD_STATUS_ISOCH_REQUEST_FAILED ((USBD_STATUS)0xC0000B00L) #define USBD_STATUS_FRAME_CONTROL_OWNED ((USBD_STATUS)0xC0000C00L) #define USBD_STATUS_FRAME_CONTROL_NOT_OWNED ((USBD_STATUS)0xC0000D00L) #define USBD_STATUS_CANCELED ((USBD_STATUS)0x00010000L) #define USBD_STATUS_CANCELING ((USBD_STATUS)0x00020000L) /* --------------------------------------------------------------------- */ #define NTSTATUS DWORD #ifndef HasOverlappedIoCompleted #define HasOverlappedIoCompleted(lpOverlapped) \ ((lpOverlapped)->Internal != STATUS_PENDING) #endif #ifndef STATUS_INVALID_PARAMETER #define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000DL) #endif #ifndef STATUS_INVALID_PARAMETER_1 #define STATUS_INVALID_PARAMETER_1 ((NTSTATUS)0xC00000EFL) #endif /* --------------------------------------------------------------------- */ #include "usbdrv.h" struct usbdevice { HANDLE dev; HANDLE ioevent; CRITICAL_SECTION lock; struct list_head urbs; }; const char usb_devicefs_mountpoint[256] = "\\\\.\\baycomusb"; struct async { struct list_head list; struct usbdevfs_urb *urb; unsigned char type; unsigned char ast; OVERLAPPED ol1, ol2; }; #define AST_OL1PENDING 1 #define AST_OL2PENDING 2 #define AST_OL1ERROR 4 #define AST_OL2ERROR 8 #define AST_KILLED 16 struct async_bulk { struct async head; struct usbdevfs_bulktransfer bulk2; struct usbdevfs_bulktransfer bulk; /* data */ }; struct async_iso { struct async head; struct usbdevfs_isotransfer iso; /* data */ }; struct async_ctrl { struct async head; struct usbdevfs_ctrltransfer ctrl; /* data */ }; /* --------------------------------------------------------------------- */ extern int snprintf(char *str, size_t n, char const *fmt, ...); extern int vsnprintf(char *str, size_t n, char const *fmt, va_list args); /* --------------------------------------------------------------------- */ static void usberrprintf(struct usbdevice *dev, unsigned int usberr, const char *funcname, const char *format, ...) { struct usbe { USBD_STATUS err; const char *str; } usbe[] = { { USBD_STATUS_CRC, "CRC" }, { USBD_STATUS_BTSTUFF, "BTSTUFF" }, { USBD_STATUS_DATA_TOGGLE_MISMATCH, "DATA_TOGGLE_MISMATCH" }, { USBD_STATUS_STALL_PID, "STALL_PID" }, { USBD_STATUS_DEV_NOT_RESPONDING, "DEV_NOT_RESPONDING" }, { USBD_STATUS_PID_CHECK_FAILURE, "PID_CHECK_FAILURE" }, { USBD_STATUS_UNEXPECTED_PID, "UNEXPECTED_PID" }, { USBD_STATUS_DATA_OVERRUN, "DATA_OVERRUN" }, { USBD_STATUS_DATA_UNDERRUN, "DATA_UNDERRUN" }, { USBD_STATUS_RESERVED1, "RESERVED1" }, { USBD_STATUS_RESERVED2, "RESERVED2" }, { USBD_STATUS_BUFFER_OVERRUN, "BUFFER_OVERRUN" }, { USBD_STATUS_BUFFER_UNDERRUN, "BUFFER_UNDERRUN" }, { USBD_STATUS_NOT_ACCESSED, "NOT_ACCESSED" }, { USBD_STATUS_FIFO, "FIFO" }, { USBD_STATUS_ENDPOINT_HALTED, "ENDPOINT_HALTED" }, { USBD_STATUS_NO_MEMORY, "NO_MEMORY" }, { USBD_STATUS_INVALID_URB_FUNCTION, "INVALID_URB_FUNCTION" }, { USBD_STATUS_INVALID_PARAMETER, "INVALID_PARAMETER" }, { USBD_STATUS_ERROR_BUSY, "ERROR_BUSY" }, { USBD_STATUS_REQUEST_FAILED, "REQUEST_FAILED" }, { USBD_STATUS_INVALID_PIPE_HANDLE, "INVALID_PIPE_HANDLE" }, { USBD_STATUS_NO_BANDWIDTH, "NO_BANDWIDTH" }, { USBD_STATUS_INTERNAL_HC_ERROR, "INTERNAL_HC_ERROR" }, { USBD_STATUS_ERROR_SHORT_TRANSFER, "" }, { USBD_STATUS_BAD_START_FRAME, "BAD_START_FRAME" }, { USBD_STATUS_ISOCH_REQUEST_FAILED, "ISOCH_REQUEST_FAILED" }, { USBD_STATUS_FRAME_CONTROL_OWNED, "FRAME_CONTROL_OWNED" }, { USBD_STATUS_FRAME_CONTROL_NOT_OWNED, "FRAME_CONTROL_NOT_OWNED" }, { USBD_STATUS_CANCELED, "CANCELED" }, { USBD_STATUS_CANCELING, "CANCELING" }, { 0, "unknown" } }; struct usbe *ep = usbe; char buf[256]; va_list ap; const char *usberrst = "unknown"; DWORD err; err = GetLastError(); while (ep->err != 0 && ep->err != usberr) ep++; usberrst = ep->str; if (format) { va_start(ap, format); vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); lprintf(2, "%s: (%s) error 0x%08lx usberror %s (0x%08x)\n", funcname, buf, err, usberrst, usberr); } else lprintf(2, "%s: error 0x%08lx usberror %s (0x%08x)\n", funcname, err, usberrst, usberr); } /* --------------------------------------------------------------------- */ /* * Parse and show the different USB descriptors. */ void usb_show_device_descriptor(FILE *f, struct usb_device_descriptor *desc) { fprintf(f, " Length = %2d%s\n", desc->bLength, desc->bLength == USB_DT_DEVICE_SIZE ? "" : " (!!!)"); fprintf(f, " DescriptorType = %02x\n", desc->bDescriptorType); fprintf(f, " USB version = %x.%02x\n", desc->bcdUSB[1], desc->bcdUSB[0]); fprintf(f, " Vendor:Product = %02x%02x:%02x%02x\n", desc->idVendor[1], desc->idVendor[0], desc->idProduct[1], desc->idProduct[0]); fprintf(f, " MaxPacketSize0 = %d\n", desc->bMaxPacketSize0); fprintf(f, " NumConfigurations = %d\n", desc->bNumConfigurations); fprintf(f, " Device version = %x.%02x\n", desc->bcdDevice[1], desc->bcdDevice[0]); fprintf(f, " Device Class:SubClass:Protocol = %02x:%02x:%02x\n", desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol); switch (desc->bDeviceClass) { case 0: fprintf(f, " Per-interface classes\n"); break; case 9: fprintf(f, " Hub device class\n"); break; case 0xff: fprintf(f, " Vendor class\n"); break; default: fprintf(f, " Unknown class\n"); } } /* --------------------------------------------------------------------- */ void usb_setmountpoint(const char *mnt) { if (!mnt) mnt = "\\\\.\\baycomusb"; strncpy(usb_devicefs_mountpoint, mnt, sizeof(usb_devicefs_mountpoint)); } const char *usb_getmountpoint(void) { return usb_devicefs_mountpoint; } void usb_close(struct usbdevice *dev) { struct list_head *list; struct async *async; if (!dev) return; if (!CancelIo(dev->dev)) { lprintf(1, "usb_close: CancelIO error %ld\n", GetLastError()); } EnterCriticalSection(&dev->lock); for (list = dev->urbs.next; list != &dev->urbs;) { async = list_entry(list, struct async, list); list = list->next; if (((async->ast & AST_OL1PENDING) && !HasOverlappedIoCompleted(&async->ol1)) || ((async->ast & AST_OL2PENDING) && !HasOverlappedIoCompleted(&async->ol2))) { lprintf(1, "usb_close: IO not completed!\n"); } list_del(&async->list); free(async); } LeaveCriticalSection(&dev->lock); CloseHandle(dev->dev); CloseHandle(dev->ioevent); DeleteCriticalSection(&dev->lock); free(dev); #ifdef LOGCTRLBULK lprintf(20, "usb_close\n"); #endif /* LOGCTRLBULK */ } struct usbdevice *usb_open_bynumber(unsigned int busnum, unsigned int devnum, int vendorid, int productid) { return NULL; } struct usbdevice *usb_open(int vendorid, int productid, unsigned int timeout, unsigned int index) { struct usbdevice *dev; HANDLE h = INVALID_HANDLE_VALUE; HANDLE hevent = INVALID_HANDLE_VALUE; char name[256]; DWORD err; snprintf(name, sizeof(name), "%s%u", usb_devicefs_mountpoint, index); h = CreateFile(name, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (h == INVALID_HANDLE_VALUE) { err = GetLastError(); lprintf(10, "usb_open: cannot open driver \"%s\" error %ld\n", name, err); errno = ENOENT; return NULL; } hevent = CreateEvent(NULL, TRUE, FALSE, NULL); /* must be manual reset */ if (!hevent) { CloseHandle(h); errno = ENOMEM; return NULL; } if (!(dev = malloc(sizeof(struct usbdevice)))) { CloseHandle(h); CloseHandle(hevent); errno = ENOMEM; return NULL; } dev->dev = h; dev->ioevent = hevent; InitializeCriticalSection(&dev->lock); INIT_LIST_HEAD(&dev->urbs); return dev; } int usb_control_msg(struct usbdevice *dev, unsigned char requesttype, unsigned char request, unsigned short value, unsigned short index, unsigned short length, void *data, unsigned int timeout) { struct usbdevfs_ctrltransfer *ctrl; unsigned int totlen = sizeof(struct usbdevfs_ctrltransfer) + length; OVERLAPPED ol; BOOLEAN res; DWORD val, err; int ret; if (!(ctrl = malloc(totlen))) { lprintf(0, "usb_control_msg: out of memory\n"); errno = ENOMEM; return -1; } ctrl->cookie = 0; ctrl->flags = 0; ctrl->requesttype = requesttype; ctrl->request = request; ctrl->value = value; ctrl->index = index; ctrl->len = length; ctrl->timeout = timeout; if (!(requesttype & 0x80) && length > 0) memcpy((void *)(ctrl + 1), data, length); ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!ol.hEvent) { lprintf(0, "usb_control_msg: cannot create event\n"); free(ctrl); errno = ENOMEM; return -1; } res = DeviceIoControl(dev->dev, USBDEVFS_CONTROL, ctrl, totlen, ctrl, totlen, &val, &ol); if (res != TRUE) { err = GetLastError(); if (err == ERROR_IO_PENDING) res = GetOverlappedResult(dev->dev, &ol, &val, TRUE); } CloseHandle(ol.hEvent); if (res != TRUE) { usberrprintf(dev, ctrl->usberr, "usb_control", "rqt=0x%x rq=0x%x val=%u idx=%u len=%u", requesttype, request, value, index, length); free(ctrl); errno = EIO; return -1; } if ((requesttype & 0x80) && ctrl->len > 0) memcpy(data, (void *)(ctrl + 1), ctrl->len); ret = ctrl->len; free(ctrl); #ifdef LOGCTRLBULK lprintf(20, "usb_control: rqt=0x%x rq=0x%x val=%u idx=%u len=%u ret=%d\n", requesttype, request, value, index, length, ret); #endif /* LOGCTRLBULK */ return ret; } int usb_bulk_msg(struct usbdevice *dev, unsigned int ep, unsigned int dlen, void *data, unsigned int timeout) { struct usbdevfs_bulktransfer *bulk; unsigned int totlen = sizeof(struct usbdevfs_bulktransfer) + dlen; OVERLAPPED ol; BOOLEAN res; DWORD val, err; int ret, ret2; if (!(bulk = malloc(totlen))) { lprintf(0, "usb_bulk_msg: out of memory\n"); errno = ENOMEM; return -1; } bulk->cookie = 0; bulk->flags = 0; bulk->ep = ep; bulk->len = dlen; bulk->timeout = timeout; if (!(ep & 0x80) && dlen > 0) memcpy((void *)(bulk + 1), data, dlen); ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!ol.hEvent) { lprintf(0, "usb_bulk_msg: cannot create event\n"); free(bulk); errno = ENOMEM; return -1; } res = DeviceIoControl(dev->dev, USBDEVFS_BULK, bulk, totlen, bulk, totlen, &val, &ol); if (res != TRUE) { err = GetLastError(); if (err == ERROR_IO_PENDING) res = GetOverlappedResult(dev->dev, &ol, &val, TRUE); } CloseHandle(ol.hEvent); if (res != TRUE) { usberrprintf(dev, bulk->usberr, "usb_bulk", "ep=0x%x len=%u", ep, dlen); free(bulk); errno = EIO; return -1; } if ((ep & 0x80) && bulk->len > 0) memcpy(data, (void *)(bulk + 1), bulk->len); ret = bulk->len; free(bulk); if (!(ep & 0x80) && dlen > 0 && ret == dlen && !(dlen & 0x3f)) { ret2 = usb_bulk_msg(dev, ep, 0, NULL, timeout); if (ret2 < 0) ret = ret2; } #ifdef LOGCTRLBULK lprintf(20, "usb_bulk: ep=0x%x len=%u ret=%d\n", ep, dlen, ret); #endif /* LOGCTRLBULK */ return ret; } int usb_resetep(struct usbdevice *dev, unsigned int ep) { struct usbdevfs_resetep rstep; OVERLAPPED ol; DWORD val, err; BOOLEAN res; ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!ol.hEvent) { lprintf(0, "usb_resetep: cannot create event\n"); errno = ENOMEM; return -1; } rstep.ep = ep; res = DeviceIoControl(dev->dev, USBDEVFS_RESETEP, &rstep, sizeof(rstep), &rstep, sizeof(rstep), &val, &ol); if (res != TRUE) { err = GetLastError(); if (err == ERROR_IO_PENDING) res = GetOverlappedResult(dev->dev, &ol, &val, TRUE); } CloseHandle(ol.hEvent); if (res != TRUE) { usberrprintf(dev, rstep.usberr, "usb_resetep", "ep=0x%x", ep); errno = EIO; return -1; } #ifdef LOGCTRLBULK lprintf(20, "usb_resetep: ep=0x%x\n", ep); #endif /* LOGCTRLBULK */ return 0; } int usb_setconfiguration(struct usbdevice *dev, unsigned int configuration) { struct usbdevfs_setconfig cfg; OVERLAPPED ol; DWORD val, err; BOOLEAN res; ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!ol.hEvent) { lprintf(0, "usb_setconfiguration: cannot create event\n"); errno = ENOMEM; return -1; } cfg.config = configuration; res = DeviceIoControl(dev->dev, USBDEVFS_SETCONFIGURATION, &cfg, sizeof(cfg), &cfg, sizeof(cfg), &val, &ol); if (res != TRUE) { err = GetLastError(); if (err == ERROR_IO_PENDING) res = GetOverlappedResult(dev->dev, &ol, &val, TRUE); } CloseHandle(ol.hEvent); if (res != TRUE) { usberrprintf(dev, cfg.usberr, "usb_setconfiguration", "config=%d", configuration); errno = EIO; return -1; } #ifdef LOGCTRLBULK lprintf(20, "usb_setconfiguration: config=%d\n", configuration); #endif /* LOGCTRLBULK */ return 0; } int usb_setinterface(struct usbdevice *dev, unsigned int intf, unsigned int altsetting) { struct usbdevfs_setinterface setif; OVERLAPPED ol; BOOLEAN res; DWORD val, err; ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!ol.hEvent) { lprintf(0, "usb_setinterface: cannot create event\n"); errno = ENOMEM; return -1; } setif.interf = intf; setif.altsetting = altsetting; res = DeviceIoControl(dev->dev, USBDEVFS_SETINTERFACE, &setif, sizeof(setif), &setif, sizeof(setif), &val, &ol); if (res != TRUE) { err = GetLastError(); if (err == ERROR_IO_PENDING) res = GetOverlappedResult(dev->dev, &ol, &val, TRUE); } CloseHandle(ol.hEvent); if (res != TRUE) { usberrprintf(dev, setif.usberr, "usb_setinterface", "intf=%u altsetting=%u", intf, altsetting); errno = EIO; return -1; } #ifdef LOGCTRLBULK lprintf(20, "usb_setinterface: intf=%u altsetting=%u\n", intf, altsetting); #endif /* LOGCTRLBULK */ return 0; } int usb_getdevicedescriptor(struct usbdevice *dev, struct usb_device_descriptor *desc) { int r = usb_control_msg(dev, 0x80, 6, 1, 0, sizeof(*desc), desc, 0); #if 1 if (r == -1) { Sleep(100); r = usb_control_msg(dev, 0x80, 6, 1, 0, sizeof(*desc), desc, 0); } #endif if (r < sizeof(*desc)) return -1; return 0; } int usb_claiminterface(struct usbdevice *dev, unsigned int intf) { return 0; } int usb_releaseinterface(struct usbdevice *dev, unsigned int intf) { return 0; } int usb_discsignal(struct usbdevice *dev, unsigned int signr, void *context) { return -1; } static int submit_bulk_urb(struct usbdevice *dev, struct usbdevfs_urb *urb) { struct async_bulk *async; unsigned int totlen = sizeof(struct usbdevfs_bulktransfer) + urb->buffer_length; unsigned int asynclen = sizeof(struct async_bulk) + urb->buffer_length; BOOLEAN res; DWORD val, err; urb->status = 0; urb->actual_length = 0; urb->error_count = 0; if (!(async = malloc(asynclen))) { lprintf(0, "usb_submit_bulk_urb: out of memory\n"); errno = ENOMEM; urb->status = -ENOMEM; urb->error_count = 1; return -1; } memset(async, 0, asynclen); async->head.urb = urb; async->head.type = USBDEVFS_URB_TYPE_BULK; async->head.ast = 0; async->head.ol1.hEvent = dev->ioevent; async->head.ol2.hEvent = dev->ioevent; async->bulk.cookie = (unsigned int)urb; async->bulk.ep = urb->endpoint; async->bulk.len = urb->buffer_length; async->bulk.timeout = 0; async->bulk.flags = urb->flags; if (!(async->bulk.ep & 0x80) && urb->buffer_length > 0) memcpy((void *)(&async->bulk + 1), urb->buffer, urb->buffer_length); res = DeviceIoControl(dev->dev, USBDEVFS_BULK, &async->bulk, totlen, &async->bulk, totlen, &val, &async->head.ol1); if (res != TRUE) { err = GetLastError(); if (err != ERROR_IO_PENDING) { errno = EIO; goto err; } async->head.ast |= AST_OL1PENDING; } if (!(urb->endpoint & 0x80) && (urb->flags & USBDEVFS_URB_ZERO_PACKET) && urb->buffer_length > 0 && !(urb->buffer_length & 0x3f)) { async->bulk2.cookie = (unsigned int)urb; async->bulk2.ep = urb->endpoint; async->bulk2.len = 0; async->bulk2.timeout = 0; async->bulk2.flags = urb->flags; res = DeviceIoControl(dev->dev, USBDEVFS_BULK, &async->bulk2, sizeof(struct usbdevfs_bulktransfer), &async->bulk2, sizeof(struct usbdevfs_bulktransfer), &val, &async->head.ol2); if (res != TRUE) { err = GetLastError(); if (err != ERROR_IO_PENDING) async->head.ast |= AST_OL2ERROR; else async->head.ast |= AST_OL2PENDING; } } EnterCriticalSection(&dev->lock); list_add(&async->head.list, &dev->urbs); if (!(async->head.ast & (AST_OL1PENDING|AST_OL2PENDING))) SetEvent(dev->ioevent); LeaveCriticalSection(&dev->lock); #ifdef LOGCTRLBULK lprintf(20, "usb async bulk: ep=0x%x len=%u\n", async->bulk.ep, async->bulk.len); #endif /* LOGCTRLBULK */ return 0; err: urb->status = -errno; urb->error_count = 1; free(async); #ifdef LOGCTRLBULK lprintf(20, "usb_submit_bulk_urb: DeviceIoControl error\n"); #endif /* LOGCTRLBULK */ return -1; } static int submit_iso_urb(struct usbdevice *dev, struct usbdevfs_urb *urb) { struct async_iso *async; unsigned int isopktlen = urb->number_of_packets * sizeof(struct usbdevfs_isopacketdesc); unsigned int isohdrlen = sizeof(struct usbdevfs_isotransfer) + isopktlen; unsigned int isolen = isohdrlen + urb->buffer_length; unsigned int asynclen = sizeof(struct async_iso) + isopktlen + urb->buffer_length; BOOLEAN res; DWORD val, err; unsigned int i, offs; urb->status = 0; urb->actual_length = 0; urb->error_count = 0; if (!(async = malloc(asynclen))) { lprintf(0, "usb_submit_iso_urb: out of memory\n"); errno = ENOMEM; urb->status = -ENOMEM; urb->error_count = 1; return -1; } memset(async, 0, asynclen); async->head.urb = urb; async->head.type = USBDEVFS_URB_TYPE_ISO; async->head.ast = 0; async->head.ol1.hEvent = dev->ioevent; async->iso.cookie = (unsigned int)urb; async->iso.ep = urb->endpoint; async->iso.len = isolen; async->iso.timeout = 0; async->iso.flags = urb->flags; async->iso.start_frame = urb->start_frame; async->iso.number_of_packets = urb->number_of_packets; offs = isohdrlen; for (i = 0; i < urb->number_of_packets; i++) { async->iso.iso_frame_desc[i].offset = offs; offs += urb->iso_frame_desc[i].length; async->iso.iso_frame_desc[i].length = urb->iso_frame_desc[i].length; } if (offs > asynclen) { urb->status = -errno; urb->error_count = 1; free(async); #ifdef LOGCTRLBULK lprintf(20, "usb_submit_iso_urb: buffer_length too small\n"); #endif /* LOGCTRLBULK */ return -1; } if (!(async->iso.ep & 0x80) && urb->buffer_length > 0) memcpy(((unsigned char *)&async->iso) + isohdrlen, urb->buffer, urb->buffer_length); res = DeviceIoControl(dev->dev, USBDEVFS_ISO, &async->iso, isolen, &async->iso, isolen, &val, &async->head.ol1); if (res != TRUE) { err = GetLastError(); if (err != ERROR_IO_PENDING) { errno = EIO; goto err; } async->head.ast |= AST_OL1PENDING; } EnterCriticalSection(&dev->lock); list_add(&async->head.list, &dev->urbs); if (async->head.ast & AST_OL1PENDING) SetEvent(dev->ioevent); LeaveCriticalSection(&dev->lock); #ifdef LOGCTRLBULK lprintf(20, "usb async iso: ep=0x%x len=%u\n", async->iso.ep, async->iso.len); #endif /* LOGCTRLBULK */ return 0; err: urb->status = -errno; urb->error_count = 1; free(async); #ifdef LOGCTRLBULK lprintf(20, "usb_submit_iso_urb: DeviceIoControl error\n"); #endif /* LOGCTRLBULK */ return -1; } static int submit_control_urb(struct usbdevice *dev, struct usbdevfs_urb *urb) { struct async_ctrl *async; struct usb_control_request *creq = urb->buffer; unsigned int totlen = sizeof(struct usbdevfs_ctrltransfer) + urb->buffer_length - 8; unsigned int asynclen = sizeof(struct async_ctrl) + urb->buffer_length - 8; BOOLEAN res; DWORD val, err; urb->status = 0; urb->actual_length = 0; urb->error_count = 0; if (!(async = malloc(asynclen))) { lprintf(0, "usb_submit_control_urb: out of memory\n"); errno = ENOMEM; urb->status = -ENOMEM; urb->error_count = 1; return -1; } memset(async, 0, asynclen); async->head.urb = urb; async->head.type = USBDEVFS_URB_TYPE_CONTROL; async->head.ast = 0; async->head.ol1.hEvent = dev->ioevent; async->head.ol2.hEvent = dev->ioevent; async->ctrl.cookie = (unsigned int)urb; async->ctrl.flags = urb->flags; async->ctrl.timeout = 0; async->ctrl.requesttype = creq->requesttype; async->ctrl.request = creq->request; async->ctrl.value = creq->value[0] | (creq->value[1] << 8); async->ctrl.index = creq->index[0] | (creq->index[1] << 8); async->ctrl.len = creq->length[0] | (creq->length[1] << 8); if (!(async->ctrl.requesttype & 0x80) && urb->buffer_length > 8) memcpy((void *)(&async->ctrl + 1), urb->buffer + 8, urb->buffer_length - 8); res = DeviceIoControl(dev->dev, USBDEVFS_CONTROL, &async->ctrl, totlen, &async->ctrl, totlen, &val, &async->head.ol1); if (res != TRUE) { err = GetLastError(); if (err != ERROR_IO_PENDING) { errno = EIO; goto err; } async->head.ast |= AST_OL1PENDING; } EnterCriticalSection(&dev->lock); list_add(&async->head.list, &dev->urbs); if (!(async->head.ast & AST_OL1PENDING)) SetEvent(dev->ioevent); LeaveCriticalSection(&dev->lock); #ifdef LOGCTRLBULK lprintf(20, "usb async control: rqt=0x%x rq=0x%x val=%u idx=%u len=%u\n", async->ctrl.requesttype, async->ctrl.request, async->ctrl.value, async->ctrl.index, async->ctrl.len); #endif /* LOGCTRLBULK */ return 0; err: urb->status = -errno; urb->error_count = 1; free(async); #ifdef LOGCTRLBULK lprintf(20, "usb_submit_control_urb: DeviceIoControl error\n"); #endif /* LOGCTRLBULK */ return -1; } int usb_submiturb(struct usbdevice *dev, struct usbdevfs_urb *urb) { if (!dev || !urb) return -1; switch (urb->type) { case USBDEVFS_URB_TYPE_BULK: if (urb->buffer_length < 0 || urb->buffer_length > 65536) return -1; return submit_bulk_urb(dev, urb); case USBDEVFS_URB_TYPE_ISO: if (urb->buffer_length < 0 || urb->buffer_length > 65536 || urb->number_of_packets < 1 || urb->number_of_packets > 256) return -1; return submit_iso_urb(dev, urb); case USBDEVFS_URB_TYPE_CONTROL: if (urb->buffer_length < 8 || urb->buffer_length > 65536) return -1; return submit_control_urb(dev, urb); } return -1; } int usb_discardurb(struct usbdevice *dev, struct usbdevfs_urb *urb) { struct list_head *list; struct async *async; OVERLAPPED ol; DWORD val, err; BOOLEAN res; ULONG cookie = (ULONG)urb; if (!dev) return -1; EnterCriticalSection(&dev->lock); for (list = dev->urbs.next; list != &dev->urbs;) { async = list_entry(list, struct async, list); list = list->next; if (async->urb == urb) async->ast |= AST_KILLED; } LeaveCriticalSection(&dev->lock); ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!ol.hEvent) { lprintf(0, "usb_resetep: cannot create event\n"); errno = ENOMEM; return -1; } res = DeviceIoControl(dev->dev, USBDEVFS_CANCELTRANSFER, &cookie, sizeof(cookie), &cookie, sizeof(cookie), &val, &ol); if (res != TRUE) { err = GetLastError(); if (err == ERROR_IO_PENDING) { res = GetOverlappedResult(dev->dev, &ol, &val, TRUE); if (res != TRUE) err = GetLastError(); } } CloseHandle(ol.hEvent); if (res != TRUE) { usberrprintf(dev, err, "usb_discardurb", "urb=%p", urb); errno = EIO; if (err == STATUS_INVALID_PARAMETER_1) errno = EINVAL; return -1; } #ifdef LOGCTRLBULK lprintf(20, "usb_discardurb: urb=%p\n", urb); #endif /* LOGCTRLBULK */ return 0; } static inline void bulk_complete(struct usbdevice *dev, struct async *as) { struct async_bulk *async = (struct async_bulk *)as; struct usbdevfs_urb *urb = async->head.urb; if (async->head.ast & (AST_OL1ERROR|AST_OL2ERROR)) { usberrprintf(dev, async->bulk.usberr ? async->bulk.usberr : async->bulk2.usberr, "usb_reapurb: bulk", "ep=0x%x", async->bulk.ep); urb->status = -EIO; urb->error_count = 1; return; } if ((async->bulk.ep & 0x80) && async->bulk.len > 0) memcpy(urb->buffer, (void *)(&async->bulk + 1), async->bulk.len); urb->actual_length = async->bulk.len; #ifdef LOGCTRLBULK lprintf(20, "usb async bulk complete: ep=0x%x len=%u\n", async->bulk.ep, async->bulk.len); #endif /* LOGCTRLBULK */ } static inline void iso_complete(struct usbdevice *dev, struct async *as) { struct async_iso *async = (struct async_iso *)as; struct usbdevfs_urb *urb = async->head.urb; unsigned int isohdrlen, i; isohdrlen = sizeof(struct usbdevfs_isotransfer) + urb->number_of_packets * sizeof(struct usbdevfs_isopacketdesc); if (async->head.ast & AST_OL1ERROR) { usberrprintf(dev, async->iso.usberr, "usb_reapurb: iso", "ep=0x%x", async->iso.ep); urb->status = -EIO; urb->error_count = 1; return; } if ((async->iso.ep & 0x80) && async->iso.len > isohdrlen) memcpy(urb->buffer, ((unsigned char *)&async->iso) + isohdrlen, async->iso.len - isohdrlen); urb->actual_length = async->iso.len; urb->error_count = async->iso.error_count; for (i = 0; i < urb->number_of_packets; i++) { urb->iso_frame_desc[i].actual_length = async->iso.iso_frame_desc[i].length; urb->iso_frame_desc[i].status = 0; if (async->iso.iso_frame_desc[i].usberr) urb->iso_frame_desc[i].status = -EIO; } #ifdef LOGCTRLBULK lprintf(20, "usb async iso complete: ep=0x%x len=%u\n", async->iso.ep, async->iso.len); #endif /* LOGCTRLBULK */ } static inline void ctrl_complete(struct usbdevice *dev, struct async *as) { struct async_ctrl *async = (struct async_ctrl *)as; struct usbdevfs_urb *urb = async->head.urb; if (async->head.ast & AST_OL1ERROR) { usberrprintf(dev, async->ctrl.usberr, "usb_reapurb: ctrl", "rqt=0x%x rq=0x%x val=%u idx=%u len=%u", async->ctrl.requesttype, async->ctrl.request, async->ctrl.value, async->ctrl.index, async->ctrl.len); urb->status = -EIO; urb->error_count = 1; return; } if ((async->ctrl.requesttype & 0x80) && async->ctrl.len > 0) memcpy(urb->buffer + 8, (void *)(&async->ctrl + 1), async->ctrl.len); urb->actual_length = async->ctrl.len; #ifdef LOGCTRLBULK lprintf(20, "usb async control complete: rqt=0x%x rq=0x%x val=%u idx=%u len=%u\n", async->ctrl.requesttype, async->ctrl.request, async->ctrl.value, async->ctrl.index, async->ctrl.len); #endif /* LOGCTRLBULK */ } static struct usbdevfs_urb *usb_reapurb_nonblock(struct usbdevice *dev) { struct list_head *list; struct async *async; struct usbdevfs_urb *urb = NULL; BOOLEAN res; DWORD val; #ifdef LOGCTRLBULK lprintf(20, "usb_reapurb_nonblock:\n"); #endif /* LOGCTRLBULK */ ResetEvent(dev->ioevent); EnterCriticalSection(&dev->lock); for (list = dev->urbs.next; list != &dev->urbs;) { async = list_entry(list, struct async, list); list = list->next; if ((async->ast & AST_OL1PENDING) && HasOverlappedIoCompleted(&async->ol1)) { async->ast &= ~AST_OL1PENDING; res = GetOverlappedResult(dev->dev, &async->ol1, &val, FALSE); if (!res) async->ast |= AST_OL1ERROR; } if ((async->ast & AST_OL2PENDING) && HasOverlappedIoCompleted(&async->ol2)) { async->ast &= ~AST_OL2PENDING; res = GetOverlappedResult(dev->dev, &async->ol2, &val, FALSE); if (!res) async->ast |= AST_OL2ERROR; } #ifdef LOGCTRLBULK lprintf(20, " async: ast 0x%02x type %u\n", async->ast, async->type); #endif /* LOGCTRLBULK */ if (async->ast & (AST_OL1PENDING|AST_OL2PENDING)) continue; if (async->ast & AST_KILLED) { list_del(&async->list); free(async); continue; } switch (async->type) { case USBDEVFS_URB_TYPE_BULK: bulk_complete(dev, async); break; case USBDEVFS_URB_TYPE_ISO: iso_complete(dev, async); break; case USBDEVFS_URB_TYPE_CONTROL: ctrl_complete(dev, async); break; } urb = async->urb; list_del(&async->list); free(async); break; } LeaveCriticalSection(&dev->lock); #ifdef LOGCTRLBULK lprintf(20, "usb_reapurb_nonblock: return %p\n", urb); #endif /* LOGCTRLBULK */ return urb; } struct usbdevfs_urb *usb_reapurb(struct usbdevice *dev, int timeout) { struct usbdevfs_urb *urb = NULL; SYSTEMTIME st; FILETIME ft; LARGE_INTEGER tm1, tm2; DWORD wt; LONGLONG diff; if (!dev) return NULL; if (timeout > 0) { GetSystemTime(&st); SystemTimeToFileTime(&st, &ft); tm1._STRUCT_NAME(u.)LowPart = ft.dwLowDateTime; tm1._STRUCT_NAME(u.)HighPart = ft.dwHighDateTime; tm1.QuadPart += 10000 * timeout; } for (;;) { urb = usb_reapurb_nonblock(dev); if (urb) return urb; if (timeout == 0) return NULL; else if (timeout < 0) { wt = INFINITE; } else { GetSystemTime(&st); SystemTimeToFileTime(&st, &ft); tm2._STRUCT_NAME(u.)LowPart = ft.dwLowDateTime; tm2._STRUCT_NAME(u.)HighPart = ft.dwHighDateTime; diff = tm1.QuadPart - tm2.QuadPart; if (diff <= 10000) return NULL; wt = diff / 10000; } WaitForSingleObject(dev->ioevent, wt); } } HANDLE usb_getfd(struct usbdevice *dev) { return dev->ioevent; } /* ---------------------------------------------------------------------- */ baycomusb-0.10.orig/trxapi/0042755000175100017510000000000007340500007013717 5ustar abaababaycomusb-0.10.orig/trxapi/Makefile.in0100644000175100017510000002420307340500007015760 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = @ORBIT_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 -I$(top_srcdir)/trxctrl -I$(top_srcdir)/flexdrv @WIN32_TRUE@CLNTSRC1 = win32client.c @WIN32_FALSE@CLNTSRC1 = @ORBITIPC_TRUE@CLNTSRC2 = trxctrl-common.c trxctrl-stubs.c trxctrl.h trxapi.h client.c @ORBITIPC_FALSE@CLNTSRC2 = @ORBITIPC_TRUE@SRVSRC = trxctrl-common.c trxctrl-skels.c trxctrl.h trxapi.h server.c @ORBITIPC_FALSE@SRVSRC = noinst_LIBRARIES = libtrxapi.a libtrxapiserver.a noinst_HEADERS = win32client.h libtrxapi_a_SOURCES = $(CLNTSRC2) $(CLNTSRC1) libtrxapiserver_a_SOURCES = $(SRVSRC) EXTRA_DIST = trxctrl.idl trxctrl-common.c trxctrl-stubs.c trxctrl-skels.c trxctrl.h trxapi.h client.c server.c win32client.c mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libtrxapi_a_LIBADD = @ORBITIPC_FALSE@@WIN32_TRUE@libtrxapi_a_OBJECTS = win32client.$(OBJEXT) @ORBITIPC_FALSE@@WIN32_FALSE@libtrxapi_a_OBJECTS = @ORBITIPC_TRUE@@WIN32_TRUE@libtrxapi_a_OBJECTS = \ @ORBITIPC_TRUE@@WIN32_TRUE@trxctrl-common.$(OBJEXT) \ @ORBITIPC_TRUE@@WIN32_TRUE@trxctrl-stubs.$(OBJEXT) client.$(OBJEXT) \ @ORBITIPC_TRUE@@WIN32_TRUE@win32client.$(OBJEXT) @ORBITIPC_TRUE@@WIN32_FALSE@libtrxapi_a_OBJECTS = \ @ORBITIPC_TRUE@@WIN32_FALSE@trxctrl-common.$(OBJEXT) \ @ORBITIPC_TRUE@@WIN32_FALSE@trxctrl-stubs.$(OBJEXT) client.$(OBJEXT) libtrxapiserver_a_LIBADD = @ORBITIPC_FALSE@libtrxapiserver_a_OBJECTS = @ORBITIPC_TRUE@libtrxapiserver_a_OBJECTS = trxctrl-common.$(OBJEXT) \ @ORBITIPC_TRUE@trxctrl-skels.$(OBJEXT) server.$(OBJEXT) CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ HEADERS = $(noinst_HEADERS) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(libtrxapi_a_SOURCES) $(libtrxapiserver_a_SOURCES) OBJECTS = $(libtrxapi_a_OBJECTS) $(libtrxapiserver_a_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps trxapi/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstLIBRARIES: clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) distclean-noinstLIBRARIES: maintainer-clean-noinstLIBRARIES: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: libtrxapi.a: $(libtrxapi_a_OBJECTS) $(libtrxapi_a_DEPENDENCIES) -rm -f libtrxapi.a $(AR) cru libtrxapi.a $(libtrxapi_a_OBJECTS) $(libtrxapi_a_LIBADD) $(RANLIB) libtrxapi.a libtrxapiserver.a: $(libtrxapiserver_a_OBJECTS) $(libtrxapiserver_a_DEPENDENCIES) -rm -f libtrxapiserver.a $(AR) cru libtrxapiserver.a $(libtrxapiserver_a_OBJECTS) $(libtrxapiserver_a_LIBADD) $(RANLIB) libtrxapiserver.a 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = trxapi 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 client.o: client.c ../config.h trxapi.h ../misc/sysdeps.h trxctrl.h \ ../trxctrl/trx.h ../usbdrv/usbdrv.h ../trxctrl/list.h server.o: server.c ../config.h ../misc/sysdeps.h trxctrl.h \ ../trxctrl/trx.h trxapi.h ../usbdrv/usbdrv.h ../trxctrl/list.h trxctrl-common.o: trxctrl-common.c trxctrl.h trxctrl-skels.o: trxctrl-skels.c trxctrl.h trxctrl-stubs.o: trxctrl-stubs.c trxctrl.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-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 $(LIBRARIES) $(HEADERS) 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-noinstLIBRARIES mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-noinstLIBRARIES distclean-compile \ distclean-tags distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ 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-noinstLIBRARIES distclean-noinstLIBRARIES \ clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile 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 @WIN32_FALSE@trxctrl-common.c trxctrl-skels.c trxctrl-stubs.c trxctrl.h: trxctrl.idl @WIN32_FALSE@ cd $(srcdir); $(ORBIT_IDL) $< # 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: baycomusb-0.10.orig/trxapi/Makefile.am0100644000175100017510000000165007332023536015760 0ustar abaabaINCLUDES = @ORBIT_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \ -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv \ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 \ -I$(top_srcdir)/trxctrl -I$(top_srcdir)/flexdrv if WIN32 CLNTSRC1 = win32client.c else CLNTSRC1 = trxctrl-common.c trxctrl-skels.c trxctrl-stubs.c trxctrl.h: trxctrl.idl cd $(srcdir); $(ORBIT_IDL) $< endif if ORBITIPC CLNTSRC2 = trxctrl-common.c trxctrl-stubs.c trxctrl.h trxapi.h client.c SRVSRC = trxctrl-common.c trxctrl-skels.c trxctrl.h trxapi.h server.c else CLNTSRC2 = SRVSRC = endif noinst_LIBRARIES = libtrxapi.a libtrxapiserver.a noinst_HEADERS = win32client.h libtrxapi_a_SOURCES = $(CLNTSRC2) $(CLNTSRC1) libtrxapiserver_a_SOURCES = $(SRVSRC) EXTRA_DIST = trxctrl.idl trxctrl-common.c trxctrl-stubs.c trxctrl-skels.c trxctrl.h trxapi.h client.c server.c win32client.c baycomusb-0.10.orig/trxapi/trxctrl-common.c0100644000175100017510000014107607340455635017077 0ustar abaaba/* * This file was generated by orbit-idl - DO NOT EDIT! */ #include #include "trxctrl.h" #if ( (TC_IMPL_TC_Trx_frequency_0 == 't') \ && (TC_IMPL_TC_Trx_frequency_1 == 'r') \ && (TC_IMPL_TC_Trx_frequency_2 == 'x') \ && (TC_IMPL_TC_Trx_frequency_3 == 'c') \ && (TC_IMPL_TC_Trx_frequency_4 == 't') \ && (TC_IMPL_TC_Trx_frequency_5 == 'r') \ && (TC_IMPL_TC_Trx_frequency_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_frequency) #define TC_DEF_TC_Trx_frequency 1 static const CORBA_TypeCode anon_subtypes_array7[] = { (CORBA_TypeCode) & TC_CORBA_unsigned_long_long_struct }; const struct CORBA_TypeCode_struct TC_Trx_frequency_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_alias, "frequency", "IDL:Trx/frequency:1.0", 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array7, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_signalstrength_0 == 't') \ && (TC_IMPL_TC_Trx_signalstrength_1 == 'r') \ && (TC_IMPL_TC_Trx_signalstrength_2 == 'x') \ && (TC_IMPL_TC_Trx_signalstrength_3 == 'c') \ && (TC_IMPL_TC_Trx_signalstrength_4 == 't') \ && (TC_IMPL_TC_Trx_signalstrength_5 == 'r') \ && (TC_IMPL_TC_Trx_signalstrength_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_signalstrength) #define TC_DEF_TC_Trx_signalstrength 1 static const CORBA_TypeCode anon_subtypes_array16[] = { (CORBA_TypeCode) & TC_CORBA_float_struct }; const struct CORBA_TypeCode_struct TC_Trx_signalstrength_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_alias, "signalstrength", "IDL:Trx/signalstrength:1.0", 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array16, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_TrxBandDescription_0 == 't') \ && (TC_IMPL_TC_Trx_TrxBandDescription_1 == 'r') \ && (TC_IMPL_TC_Trx_TrxBandDescription_2 == 'x') \ && (TC_IMPL_TC_Trx_TrxBandDescription_3 == 'c') \ && (TC_IMPL_TC_Trx_TrxBandDescription_4 == 't') \ && (TC_IMPL_TC_Trx_TrxBandDescription_5 == 'r') \ && (TC_IMPL_TC_Trx_TrxBandDescription_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_TrxBandDescription) #define TC_DEF_TC_Trx_TrxBandDescription 1 static const char *anon_subnames_array19[] = { "low", "high", "step" }; static const CORBA_TypeCode anon_subtypes_array20[] = { (CORBA_TypeCode) & TC_Trx_frequency_struct, (CORBA_TypeCode) & TC_Trx_frequency_struct, (CORBA_TypeCode) & TC_Trx_frequency_struct }; const struct CORBA_TypeCode_struct TC_Trx_TrxBandDescription_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "TrxBandDescription", "IDL:Trx/TrxBandDescription:1.0", 0, 3, (const char **) anon_subnames_array19, (CORBA_TypeCode *) anon_subtypes_array20, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_0 == 't') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_1 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_2 == 'x') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_3 == 'c') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_4 == 't') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_5 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_6 == 'l') \ ) && !defined(TC_DEF_TC_CORBA_sequence_Trx_TrxBandDescription) #define TC_DEF_TC_CORBA_sequence_Trx_TrxBandDescription 1 static const CORBA_TypeCode anon_subtypes_array24[] = { (CORBA_TypeCode) & TC_Trx_TrxBandDescription_struct }; const struct CORBA_TypeCode_struct TC_CORBA_sequence_Trx_TrxBandDescription_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_sequence, NULL, NULL, 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array24, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_0 == 't') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_1 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_2 == 'x') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_3 == 'c') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_4 == 't') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_5 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_6 == 'l') \ ) && !defined(TC_DEF_TC_CORBA_sequence_Trx_TrxBandDescription) #define TC_DEF_TC_CORBA_sequence_Trx_TrxBandDescription 1 static const CORBA_TypeCode anon_subtypes_array28[] = { (CORBA_TypeCode) & TC_Trx_TrxBandDescription_struct }; const struct CORBA_TypeCode_struct TC_CORBA_sequence_Trx_TrxBandDescription_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_sequence, NULL, NULL, 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array28, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_TrxDescription_0 == 't') \ && (TC_IMPL_TC_Trx_TrxDescription_1 == 'r') \ && (TC_IMPL_TC_Trx_TrxDescription_2 == 'x') \ && (TC_IMPL_TC_Trx_TrxDescription_3 == 'c') \ && (TC_IMPL_TC_Trx_TrxDescription_4 == 't') \ && (TC_IMPL_TC_Trx_TrxDescription_5 == 'r') \ && (TC_IMPL_TC_Trx_TrxDescription_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_TrxDescription) #define TC_DEF_TC_Trx_TrxDescription 1 static const char *anon_subnames_array31[] = { "manufacturer", "model", "copyright", "instid", "rxbands", "txbands", "rssimin", "rssimax" }; static const CORBA_TypeCode anon_subtypes_array32[] = { (CORBA_TypeCode) & TC_CORBA_string_struct, (CORBA_TypeCode) & TC_CORBA_string_struct, (CORBA_TypeCode) & TC_CORBA_string_struct, (CORBA_TypeCode) & TC_CORBA_string_struct, (CORBA_TypeCode) & TC_CORBA_sequence_Trx_TrxBandDescription_struct, (CORBA_TypeCode) & TC_CORBA_sequence_Trx_TrxBandDescription_struct, (CORBA_TypeCode) & TC_Trx_signalstrength_struct, (CORBA_TypeCode) & TC_Trx_signalstrength_struct }; const struct CORBA_TypeCode_struct TC_Trx_TrxDescription_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "TrxDescription", "IDL:Trx/TrxDescription:1.0", 0, 8, (const char **) anon_subnames_array31, (CORBA_TypeCode *) anon_subtypes_array32, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_TrxMode_0 == 't') \ && (TC_IMPL_TC_Trx_TrxMode_1 == 'r') \ && (TC_IMPL_TC_Trx_TrxMode_2 == 'x') \ && (TC_IMPL_TC_Trx_TrxMode_3 == 'c') \ && (TC_IMPL_TC_Trx_TrxMode_4 == 't') \ && (TC_IMPL_TC_Trx_TrxMode_5 == 'r') \ && (TC_IMPL_TC_Trx_TrxMode_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_TrxMode) #define TC_DEF_TC_Trx_TrxMode 1 static const char *anon_subnames_array35[] = { "trxunspec", "trxpacket", "trxaudio" }; const struct CORBA_TypeCode_struct TC_Trx_TrxMode_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_enum, "TrxMode", "IDL:Trx/TrxMode:1.0", 0, 3, (const char **) anon_subnames_array35, NULL, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_TrxState_0 == 't') \ && (TC_IMPL_TC_Trx_TrxState_1 == 'r') \ && (TC_IMPL_TC_Trx_TrxState_2 == 'x') \ && (TC_IMPL_TC_Trx_TrxState_3 == 'c') \ && (TC_IMPL_TC_Trx_TrxState_4 == 't') \ && (TC_IMPL_TC_Trx_TrxState_5 == 'r') \ && (TC_IMPL_TC_Trx_TrxState_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_TrxState) #define TC_DEF_TC_Trx_TrxState 1 static const char *anon_subnames_array39[] = { "mode", "rxfreq", "txfreq", "ptt", "manualptt", "dcd", "rssi" }; static const CORBA_TypeCode anon_subtypes_array40[] = { (CORBA_TypeCode) & TC_Trx_TrxMode_struct, (CORBA_TypeCode) & TC_Trx_frequency_struct, (CORBA_TypeCode) & TC_Trx_frequency_struct, (CORBA_TypeCode) & TC_CORBA_boolean_struct, (CORBA_TypeCode) & TC_CORBA_boolean_struct, (CORBA_TypeCode) & TC_CORBA_boolean_struct, (CORBA_TypeCode) & TC_Trx_signalstrength_struct }; const struct CORBA_TypeCode_struct TC_Trx_TrxState_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "TrxState", "IDL:Trx/TrxState:1.0", 0, 7, (const char **) anon_subnames_array39, (CORBA_TypeCode *) anon_subtypes_array40, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_BaycomUSBAdapterMode_0 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterMode_1 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterMode_2 == 'x') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterMode_3 == 'c') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterMode_4 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterMode_5 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterMode_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_BaycomUSBAdapterMode) #define TC_DEF_TC_Trx_BaycomUSBAdapterMode 1 static const char *anon_subnames_array43[] = { "fsk", "external", "afsk", "audio" }; const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterMode_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_enum, "BaycomUSBAdapterMode", "IDL:Trx/BaycomUSBAdapterMode:1.0", 0, 4, (const char **) anon_subnames_array43, NULL, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_0 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_1 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_2 == 'x') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_3 == 'c') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_4 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_5 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_BaycomUSBAdapterLoopback) #define TC_DEF_TC_Trx_BaycomUSBAdapterLoopback 1 static const char *anon_subnames_array47[] = { "loopback_off", "loopback_scrambler", "loopback_modem" }; const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterLoopback_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_enum, "BaycomUSBAdapterLoopback", "IDL:Trx/BaycomUSBAdapterLoopback:1.0", 0, 3, (const char **) anon_subnames_array47, NULL, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_0 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_1 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_2 == 'x') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_3 == 'c') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_4 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_5 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_BaycomUSBAdapterAudioDev) #define TC_DEF_TC_Trx_BaycomUSBAdapterAudioDev 1 static const CORBA_TypeCode anon_subtypes_array62[] = { (CORBA_TypeCode) & TC_CORBA_char_struct }; static const struct CORBA_TypeCode_struct anonTC_59_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_array, NULL, NULL, 64, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array62, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; static const CORBA_TypeCode anon_subtypes_array57[] = { (CORBA_TypeCode) & anonTC_59_struct }; const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterAudioDev_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_alias, "BaycomUSBAdapterAudioDev", "IDL:Trx/BaycomUSBAdapterAudioDev:1.0", 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array57, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_0 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_1 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_2 == 'x') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_3 == 'c') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_4 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_5 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_BaycomUSBAdapterConfig) #define TC_DEF_TC_Trx_BaycomUSBAdapterConfig 1 static const char *anon_subnames_array65[] = { "mode", "fclk", "bitraterx", "bitratetx", "loopback", "pttmute", "filtmode", "samplerate", "gain", "audiodevin", "audiodevout", "rfsquelch", "audiosquelch" }; static const CORBA_TypeCode anon_subtypes_array66[] = { (CORBA_TypeCode) & TC_Trx_BaycomUSBAdapterMode_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_Trx_BaycomUSBAdapterLoopback_struct, (CORBA_TypeCode) & TC_CORBA_boolean_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_float_struct, (CORBA_TypeCode) & TC_Trx_BaycomUSBAdapterAudioDev_struct, (CORBA_TypeCode) & TC_Trx_BaycomUSBAdapterAudioDev_struct, (CORBA_TypeCode) & TC_Trx_signalstrength_struct, (CORBA_TypeCode) & TC_CORBA_boolean_struct }; const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterConfig_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "BaycomUSBAdapterConfig", "IDL:Trx/BaycomUSBAdapterConfig:1.0", 0, 13, (const char **) anon_subnames_array65, (CORBA_TypeCode *) anon_subtypes_array66, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_0 == 't') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_1 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_2 == 'x') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_3 == 'c') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_4 == 't') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_5 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_6 == 'l') \ ) && !defined(TC_DEF_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev) #define TC_DEF_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev 1 static const CORBA_TypeCode anon_subtypes_array70[] = { (CORBA_TypeCode) & TC_Trx_BaycomUSBAdapterAudioDev_struct }; const struct CORBA_TypeCode_struct TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_sequence, NULL, NULL, 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array70, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_0 == 't') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_1 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_2 == 'x') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_3 == 'c') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_4 == 't') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_5 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_6 == 'l') \ ) && !defined(TC_DEF_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev) #define TC_DEF_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev 1 static const CORBA_TypeCode anon_subtypes_array79[] = { (CORBA_TypeCode) & TC_Trx_BaycomUSBAdapterAudioDev_struct }; const struct CORBA_TypeCode_struct TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_sequence, NULL, NULL, 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array79, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_0 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_1 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_2 == 'x') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_3 == 'c') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_4 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_5 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_BaycomUSBAdapterAudioDevSequence) #define TC_DEF_TC_Trx_BaycomUSBAdapterAudioDevSequence 1 static const CORBA_TypeCode anon_subtypes_array83[] = { (CORBA_TypeCode) & TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_struct }; const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterAudioDevSequence_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_alias, "BaycomUSBAdapterAudioDevSequence", "IDL:Trx/BaycomUSBAdapterAudioDevSequence:1.0", 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array83, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_0 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_1 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_2 == 'x') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_3 == 'c') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_4 == 't') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_5 == 'r') \ && (TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_BaycomUSBAdapterAudioDevs) #define TC_DEF_TC_Trx_BaycomUSBAdapterAudioDevs 1 static const char *anon_subnames_array86[] = { "audiodevsin", "audiodevsout" }; static const CORBA_TypeCode anon_subtypes_array87[] = { (CORBA_TypeCode) & TC_Trx_BaycomUSBAdapterAudioDevSequence_struct, (CORBA_TypeCode) & TC_Trx_BaycomUSBAdapterAudioDevSequence_struct }; const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterAudioDevs_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "BaycomUSBAdapterAudioDevs", "IDL:Trx/BaycomUSBAdapterAudioDevs:1.0", 0, 2, (const char **) anon_subnames_array86, (CORBA_TypeCode *) anon_subtypes_array87, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_ChannelAccessConfig_0 == 't') \ && (TC_IMPL_TC_Trx_ChannelAccessConfig_1 == 'r') \ && (TC_IMPL_TC_Trx_ChannelAccessConfig_2 == 'x') \ && (TC_IMPL_TC_Trx_ChannelAccessConfig_3 == 'c') \ && (TC_IMPL_TC_Trx_ChannelAccessConfig_4 == 't') \ && (TC_IMPL_TC_Trx_ChannelAccessConfig_5 == 'r') \ && (TC_IMPL_TC_Trx_ChannelAccessConfig_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_ChannelAccessConfig) #define TC_DEF_TC_Trx_ChannelAccessConfig 1 static const char *anon_subnames_array90[] = { "txdelay", "slottime", "ppersistence", "txtail", "fullduplex" }; static const CORBA_TypeCode anon_subtypes_array91[] = { (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_boolean_struct }; const struct CORBA_TypeCode_struct TC_Trx_ChannelAccessConfig_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "ChannelAccessConfig", "IDL:Trx/ChannelAccessConfig:1.0", 0, 5, (const char **) anon_subnames_array90, (CORBA_TypeCode *) anon_subtypes_array91, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_IpAddress_0 == 't') \ && (TC_IMPL_TC_Trx_IpAddress_1 == 'r') \ && (TC_IMPL_TC_Trx_IpAddress_2 == 'x') \ && (TC_IMPL_TC_Trx_IpAddress_3 == 'c') \ && (TC_IMPL_TC_Trx_IpAddress_4 == 't') \ && (TC_IMPL_TC_Trx_IpAddress_5 == 'r') \ && (TC_IMPL_TC_Trx_IpAddress_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_IpAddress) #define TC_DEF_TC_Trx_IpAddress 1 static const CORBA_TypeCode anon_subtypes_array105[] = { (CORBA_TypeCode) & TC_CORBA_octet_struct }; static const struct CORBA_TypeCode_struct anonTC_102_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_array, NULL, NULL, 4, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array105, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; static const CORBA_TypeCode anon_subtypes_array100[] = { (CORBA_TypeCode) & anonTC_102_struct }; const struct CORBA_TypeCode_struct TC_Trx_IpAddress_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_alias, "IpAddress", "IDL:Trx/IpAddress:1.0", 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array100, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_InterfaceConfig_0 == 't') \ && (TC_IMPL_TC_Trx_InterfaceConfig_1 == 'r') \ && (TC_IMPL_TC_Trx_InterfaceConfig_2 == 'x') \ && (TC_IMPL_TC_Trx_InterfaceConfig_3 == 'c') \ && (TC_IMPL_TC_Trx_InterfaceConfig_4 == 't') \ && (TC_IMPL_TC_Trx_InterfaceConfig_5 == 'r') \ && (TC_IMPL_TC_Trx_InterfaceConfig_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_InterfaceConfig) #define TC_DEF_TC_Trx_InterfaceConfig 1 static const char *anon_subnames_array108[] = { "ifname", "hwaddr", "ipaddr", "netmask", "broadcast", "gwhwaddr", "gwipaddr", "gwnetmask", "gwipmode" }; static const CORBA_TypeCode anon_subtypes_array109[] = { (CORBA_TypeCode) & TC_CORBA_char_struct, (CORBA_TypeCode) & TC_CORBA_char_struct, (CORBA_TypeCode) & TC_Trx_IpAddress_struct, (CORBA_TypeCode) & TC_Trx_IpAddress_struct, (CORBA_TypeCode) & TC_Trx_IpAddress_struct, (CORBA_TypeCode) & TC_CORBA_char_struct, (CORBA_TypeCode) & TC_Trx_IpAddress_struct, (CORBA_TypeCode) & TC_Trx_IpAddress_struct, (CORBA_TypeCode) & TC_CORBA_char_struct }; const struct CORBA_TypeCode_struct TC_Trx_InterfaceConfig_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "InterfaceConfig", "IDL:Trx/InterfaceConfig:1.0", 0, 9, (const char **) anon_subnames_array108, (CORBA_TypeCode *) anon_subtypes_array109, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_ModemDisconnectRxC_0 == 't') \ && (TC_IMPL_TC_Trx_ModemDisconnectRxC_1 == 'r') \ && (TC_IMPL_TC_Trx_ModemDisconnectRxC_2 == 'x') \ && (TC_IMPL_TC_Trx_ModemDisconnectRxC_3 == 'c') \ && (TC_IMPL_TC_Trx_ModemDisconnectRxC_4 == 't') \ && (TC_IMPL_TC_Trx_ModemDisconnectRxC_5 == 'r') \ && (TC_IMPL_TC_Trx_ModemDisconnectRxC_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_ModemDisconnectRxC) #define TC_DEF_TC_Trx_ModemDisconnectRxC 1 static const char *anon_subnames_array112[] = { "mdisc_rxc_normal", "mdisc_rxc_rxclock" }; const struct CORBA_TypeCode_struct TC_Trx_ModemDisconnectRxC_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_enum, "ModemDisconnectRxC", "IDL:Trx/ModemDisconnectRxC:1.0", 0, 2, (const char **) anon_subnames_array112, NULL, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_ModemDisconnectTxC_0 == 't') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxC_1 == 'r') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxC_2 == 'x') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxC_3 == 'c') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxC_4 == 't') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxC_5 == 'r') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxC_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_ModemDisconnectTxC) #define TC_DEF_TC_Trx_ModemDisconnectTxC 1 static const char *anon_subnames_array116[] = { "mdisc_txc_normal", "mdisc_txc_txclock" }; const struct CORBA_TypeCode_struct TC_Trx_ModemDisconnectTxC_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_enum, "ModemDisconnectTxC", "IDL:Trx/ModemDisconnectTxC:1.0", 0, 2, (const char **) anon_subnames_array116, NULL, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_ModemDisconnectTxD_0 == 't') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxD_1 == 'r') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxD_2 == 'x') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxD_3 == 'c') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxD_4 == 't') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxD_5 == 'r') \ && (TC_IMPL_TC_Trx_ModemDisconnectTxD_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_ModemDisconnectTxD) #define TC_DEF_TC_Trx_ModemDisconnectTxD 1 static const char *anon_subnames_array120[] = { "mdisc_txd_normal", "mdisc_txd_txdata" }; const struct CORBA_TypeCode_struct TC_Trx_ModemDisconnectTxD_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_enum, "ModemDisconnectTxD", "IDL:Trx/ModemDisconnectTxD:1.0", 0, 2, (const char **) anon_subnames_array120, NULL, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_ModemDisconnectConfig_0 == 't') \ && (TC_IMPL_TC_Trx_ModemDisconnectConfig_1 == 'r') \ && (TC_IMPL_TC_Trx_ModemDisconnectConfig_2 == 'x') \ && (TC_IMPL_TC_Trx_ModemDisconnectConfig_3 == 'c') \ && (TC_IMPL_TC_Trx_ModemDisconnectConfig_4 == 't') \ && (TC_IMPL_TC_Trx_ModemDisconnectConfig_5 == 'r') \ && (TC_IMPL_TC_Trx_ModemDisconnectConfig_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_ModemDisconnectConfig) #define TC_DEF_TC_Trx_ModemDisconnectConfig 1 static const char *anon_subnames_array124[] = { "output", "direction", "rxc", "txc", "txd" }; static const CORBA_TypeCode anon_subtypes_array125[] = { (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_Trx_ModemDisconnectRxC_struct, (CORBA_TypeCode) & TC_Trx_ModemDisconnectTxC_struct, (CORBA_TypeCode) & TC_Trx_ModemDisconnectTxD_struct }; const struct CORBA_TypeCode_struct TC_Trx_ModemDisconnectConfig_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "ModemDisconnectConfig", "IDL:Trx/ModemDisconnectConfig:1.0", 0, 5, (const char **) anon_subnames_array124, (CORBA_TypeCode *) anon_subtypes_array125, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_TrxAudioState_0 == 't') \ && (TC_IMPL_TC_Trx_TrxAudioState_1 == 'r') \ && (TC_IMPL_TC_Trx_TrxAudioState_2 == 'x') \ && (TC_IMPL_TC_Trx_TrxAudioState_3 == 'c') \ && (TC_IMPL_TC_Trx_TrxAudioState_4 == 't') \ && (TC_IMPL_TC_Trx_TrxAudioState_5 == 'r') \ && (TC_IMPL_TC_Trx_TrxAudioState_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_TrxAudioState) #define TC_DEF_TC_Trx_TrxAudioState 1 static const char *anon_subnames_array128[] = { "samplerate", "micbufsz", "micbufptr", "spkbufsz", "spkbufptr", "micsigpwr", "spksigpwr", "spknoisepwr" }; static const CORBA_TypeCode anon_subtypes_array129[] = { (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_unsigned_long_struct, (CORBA_TypeCode) & TC_CORBA_float_struct, (CORBA_TypeCode) & TC_CORBA_float_struct, (CORBA_TypeCode) & TC_CORBA_float_struct }; const struct CORBA_TypeCode_struct TC_Trx_TrxAudioState_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "TrxAudioState", "IDL:Trx/TrxAudioState:1.0", 0, 8, (const char **) anon_subnames_array128, (CORBA_TypeCode *) anon_subtypes_array129, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_CORBA_sequence_CORBA_octet_0 == 't') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_1 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_2 == 'x') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_3 == 'c') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_4 == 't') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_5 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_6 == 'l') \ ) && !defined(TC_DEF_TC_CORBA_sequence_CORBA_octet) #define TC_DEF_TC_CORBA_sequence_CORBA_octet 1 static const CORBA_TypeCode anon_subtypes_array133[] = { (CORBA_TypeCode) & TC_CORBA_octet_struct }; const struct CORBA_TypeCode_struct TC_CORBA_sequence_CORBA_octet_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_sequence, NULL, NULL, 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array133, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_CORBA_sequence_CORBA_octet_0 == 't') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_1 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_2 == 'x') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_3 == 'c') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_4 == 't') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_5 == 'r') \ && (TC_IMPL_TC_CORBA_sequence_CORBA_octet_6 == 'l') \ ) && !defined(TC_DEF_TC_CORBA_sequence_CORBA_octet) #define TC_DEF_TC_CORBA_sequence_CORBA_octet 1 static const CORBA_TypeCode anon_subtypes_array142[] = { (CORBA_TypeCode) & TC_CORBA_octet_struct }; const struct CORBA_TypeCode_struct TC_CORBA_sequence_CORBA_octet_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_sequence, NULL, NULL, 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array142, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_TrxAudioSamples_0 == 't') \ && (TC_IMPL_TC_Trx_TrxAudioSamples_1 == 'r') \ && (TC_IMPL_TC_Trx_TrxAudioSamples_2 == 'x') \ && (TC_IMPL_TC_Trx_TrxAudioSamples_3 == 'c') \ && (TC_IMPL_TC_Trx_TrxAudioSamples_4 == 't') \ && (TC_IMPL_TC_Trx_TrxAudioSamples_5 == 'r') \ && (TC_IMPL_TC_Trx_TrxAudioSamples_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_TrxAudioSamples) #define TC_DEF_TC_Trx_TrxAudioSamples 1 static const CORBA_TypeCode anon_subtypes_array146[] = { (CORBA_TypeCode) & TC_CORBA_sequence_CORBA_octet_struct }; const struct CORBA_TypeCode_struct TC_Trx_TrxAudioSamples_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_alias, "TrxAudioSamples", "IDL:Trx/TrxAudioSamples:1.0", 0, 1, NULL, (CORBA_TypeCode *) anon_subtypes_array146, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_TrxAudioParams_0 == 't') \ && (TC_IMPL_TC_Trx_TrxAudioParams_1 == 'r') \ && (TC_IMPL_TC_Trx_TrxAudioParams_2 == 'x') \ && (TC_IMPL_TC_Trx_TrxAudioParams_3 == 'c') \ && (TC_IMPL_TC_Trx_TrxAudioParams_4 == 't') \ && (TC_IMPL_TC_Trx_TrxAudioParams_5 == 'r') \ && (TC_IMPL_TC_Trx_TrxAudioParams_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_TrxAudioParams) #define TC_DEF_TC_Trx_TrxAudioParams 1 static const char *anon_subnames_array149[] = { "rfsquelch", "audiosquelch" }; static const CORBA_TypeCode anon_subtypes_array150[] = { (CORBA_TypeCode) & TC_Trx_signalstrength_struct, (CORBA_TypeCode) & TC_CORBA_boolean_struct }; const struct CORBA_TypeCode_struct TC_Trx_TrxAudioParams_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_struct, "TrxAudioParams", "IDL:Trx/TrxAudioParams:1.0", 0, 2, (const char **) anon_subnames_array149, (CORBA_TypeCode *) anon_subtypes_array150, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_TrxError_0 == 't') \ && (TC_IMPL_TC_Trx_TrxError_1 == 'r') \ && (TC_IMPL_TC_Trx_TrxError_2 == 'x') \ && (TC_IMPL_TC_Trx_TrxError_3 == 'c') \ && (TC_IMPL_TC_Trx_TrxError_4 == 't') \ && (TC_IMPL_TC_Trx_TrxError_5 == 'r') \ && (TC_IMPL_TC_Trx_TrxError_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_TrxError) #define TC_DEF_TC_Trx_TrxError 1 static const char *anon_subnames_array153[] = { "reason" }; static const CORBA_TypeCode anon_subtypes_array154[] = { (CORBA_TypeCode) & TC_CORBA_string_struct }; const struct CORBA_TypeCode_struct TC_Trx_TrxError_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_except, "TrxError", "IDL:Trx/TrxError:1.0", 0, 1, (const char **) anon_subnames_array153, (CORBA_TypeCode *) anon_subtypes_array154, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif #if ( (TC_IMPL_TC_Trx_Control_0 == 't') \ && (TC_IMPL_TC_Trx_Control_1 == 'r') \ && (TC_IMPL_TC_Trx_Control_2 == 'x') \ && (TC_IMPL_TC_Trx_Control_3 == 'c') \ && (TC_IMPL_TC_Trx_Control_4 == 't') \ && (TC_IMPL_TC_Trx_Control_5 == 'r') \ && (TC_IMPL_TC_Trx_Control_6 == 'l') \ ) && !defined(TC_DEF_TC_Trx_Control) #define TC_DEF_TC_Trx_Control 1 const struct CORBA_TypeCode_struct TC_Trx_Control_struct = { {{(ORBit_RootObject_Interface *) & ORBit_TypeCode_epv, TRUE, -1}, ORBIT_PSEUDO_TYPECODE}, CORBA_tk_objref, "Control", "IDL:Trx/Control:1.0", 0, 0, NULL, NULL, NULL, CORBA_OBJECT_NIL, 0, -1, 0, 0 }; #endif gpointer Trx_TrxBandDescription__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_TrxBandDescription *var = mem; return (gpointer) (var + 1); } Trx_TrxBandDescription * Trx_TrxBandDescription__alloc(void) { Trx_TrxBandDescription *retval; retval = ORBit_alloc(sizeof(Trx_TrxBandDescription), (ORBit_free_childvals) Trx_TrxBandDescription__free, GUINT_TO_POINTER(1)); return retval; } #if ( (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_0 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_1 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_2 == 'x') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_3 == 'c') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_4 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_5 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_6 == 'l') \ ) && !defined(ORBIT_DEF_CORBA_sequence_Trx_TrxBandDescription) #define ORBIT_DEF_CORBA_sequence_Trx_TrxBandDescription 1 gpointer CORBA_sequence_Trx_TrxBandDescription__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { CORBA_sequence_Trx_TrxBandDescription *val = mem; if (val->_release) ORBit_free(val->_buffer, free_strings); return (gpointer) (val + 1); } CORBA_sequence_Trx_TrxBandDescription * CORBA_sequence_Trx_TrxBandDescription__alloc(void) { CORBA_sequence_Trx_TrxBandDescription *retval; retval = ORBit_alloc(sizeof(CORBA_sequence_Trx_TrxBandDescription), (ORBit_free_childvals) CORBA_sequence_Trx_TrxBandDescription__free, GUINT_TO_POINTER(1)); retval->_maximum = 0; retval->_length = 0; retval->_buffer = NULL; retval->_release = CORBA_FALSE; return retval; } Trx_TrxBandDescription * CORBA_sequence_Trx_TrxBandDescription_allocbuf(CORBA_unsigned_long len) { Trx_TrxBandDescription *retval = ORBit_alloc(sizeof(Trx_TrxBandDescription) * len, (ORBit_free_childvals) NULL, GUINT_TO_POINTER(len)); return retval; } #endif #if ( (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_0 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_1 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_2 == 'x') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_3 == 'c') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_4 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_5 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_6 == 'l') \ ) && !defined(ORBIT_DEF_CORBA_sequence_Trx_TrxBandDescription) #define ORBIT_DEF_CORBA_sequence_Trx_TrxBandDescription 1 gpointer CORBA_sequence_Trx_TrxBandDescription__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { CORBA_sequence_Trx_TrxBandDescription *val = mem; if (val->_release) ORBit_free(val->_buffer, free_strings); return (gpointer) (val + 1); } CORBA_sequence_Trx_TrxBandDescription * CORBA_sequence_Trx_TrxBandDescription__alloc(void) { CORBA_sequence_Trx_TrxBandDescription *retval; retval = ORBit_alloc(sizeof(CORBA_sequence_Trx_TrxBandDescription), (ORBit_free_childvals) CORBA_sequence_Trx_TrxBandDescription__free, GUINT_TO_POINTER(1)); retval->_maximum = 0; retval->_length = 0; retval->_buffer = NULL; retval->_release = CORBA_FALSE; return retval; } Trx_TrxBandDescription * CORBA_sequence_Trx_TrxBandDescription_allocbuf(CORBA_unsigned_long len) { Trx_TrxBandDescription *retval = ORBit_alloc(sizeof(Trx_TrxBandDescription) * len, (ORBit_free_childvals) NULL, GUINT_TO_POINTER(len)); return retval; } #endif gpointer Trx_TrxDescription__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_TrxDescription *var = mem; if (free_strings) { CORBA_string__free(&(var->manufacturer), NULL, free_strings); } if (free_strings) { CORBA_string__free(&(var->model), NULL, free_strings); } if (free_strings) { CORBA_string__free(&(var->copyright), NULL, free_strings); } if (free_strings) { CORBA_string__free(&(var->instid), NULL, free_strings); } { CORBA_sequence_Trx_TrxBandDescription__free(&(var->rxbands), NULL, free_strings); } { CORBA_sequence_Trx_TrxBandDescription__free(&(var->txbands), NULL, free_strings); } return (gpointer) (var + 1); } Trx_TrxDescription * Trx_TrxDescription__alloc(void) { Trx_TrxDescription *retval; retval = ORBit_alloc(sizeof(Trx_TrxDescription), (ORBit_free_childvals) Trx_TrxDescription__free, GUINT_TO_POINTER(1)); memset(&(retval->manufacturer), '\0', sizeof(retval->manufacturer)); memset(&(retval->model), '\0', sizeof(retval->model)); memset(&(retval->copyright), '\0', sizeof(retval->copyright)); memset(&(retval->instid), '\0', sizeof(retval->instid)); memset(&(retval->rxbands), '\0', sizeof(retval->rxbands)); memset(&(retval->txbands), '\0', sizeof(retval->txbands)); return retval; } gpointer Trx_TrxState__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_TrxState *var = mem; return (gpointer) (var + 1); } Trx_TrxState * Trx_TrxState__alloc(void) { Trx_TrxState *retval; retval = ORBit_alloc(sizeof(Trx_TrxState), (ORBit_free_childvals) Trx_TrxState__free, GUINT_TO_POINTER(1)); return retval; } gpointer Trx_BaycomUSBAdapterAudioDev__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { gpointer retval = ((guchar *) mem) + sizeof(Trx_BaycomUSBAdapterAudioDev); return retval; } Trx_BaycomUSBAdapterAudioDev_slice * Trx_BaycomUSBAdapterAudioDev__alloc(void) { Trx_BaycomUSBAdapterAudioDev_slice *retval; retval = ORBit_alloc(sizeof(Trx_BaycomUSBAdapterAudioDev), (ORBit_free_childvals) NULL, NULL); return retval; } gpointer Trx_BaycomUSBAdapterConfig__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_BaycomUSBAdapterConfig *var = mem; return (gpointer) (var + 1); } Trx_BaycomUSBAdapterConfig * Trx_BaycomUSBAdapterConfig__alloc(void) { Trx_BaycomUSBAdapterConfig *retval; retval = ORBit_alloc(sizeof(Trx_BaycomUSBAdapterConfig), (ORBit_free_childvals) Trx_BaycomUSBAdapterConfig__free, GUINT_TO_POINTER(1)); return retval; } #if ( (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_0 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_1 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_2 == 'x') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_3 == 'c') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_4 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_5 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_6 == 'l') \ ) && !defined(ORBIT_DEF_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev) #define ORBIT_DEF_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev 1 gpointer CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { CORBA_sequence_Trx_BaycomUSBAdapterAudioDev *val = mem; if (val->_release) ORBit_free(val->_buffer, free_strings); return (gpointer) (val + 1); } CORBA_sequence_Trx_BaycomUSBAdapterAudioDev * CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__alloc(void) { CORBA_sequence_Trx_BaycomUSBAdapterAudioDev *retval; retval = ORBit_alloc(sizeof(CORBA_sequence_Trx_BaycomUSBAdapterAudioDev), (ORBit_free_childvals) CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__free, GUINT_TO_POINTER(1)); retval->_maximum = 0; retval->_length = 0; retval->_buffer = NULL; retval->_release = CORBA_FALSE; return retval; } Trx_BaycomUSBAdapterAudioDev * CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(CORBA_unsigned_long len) { Trx_BaycomUSBAdapterAudioDev *retval = ORBit_alloc(sizeof(Trx_BaycomUSBAdapterAudioDev) * len, (ORBit_free_childvals) NULL, GUINT_TO_POINTER(len)); return retval; } #endif gpointer Trx_BaycomUSBAdapterAudioDevSequence__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { return CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__free(mem, dat, free_strings); } Trx_BaycomUSBAdapterAudioDevSequence * Trx_BaycomUSBAdapterAudioDevSequence__alloc(void) { return CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__alloc(); } #if ( (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_0 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_1 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_2 == 'x') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_3 == 'c') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_4 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_5 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_6 == 'l') \ ) && !defined(ORBIT_DEF_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev) #define ORBIT_DEF_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev 1 gpointer CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { CORBA_sequence_Trx_BaycomUSBAdapterAudioDev *val = mem; if (val->_release) ORBit_free(val->_buffer, free_strings); return (gpointer) (val + 1); } CORBA_sequence_Trx_BaycomUSBAdapterAudioDev * CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__alloc(void) { CORBA_sequence_Trx_BaycomUSBAdapterAudioDev *retval; retval = ORBit_alloc(sizeof(CORBA_sequence_Trx_BaycomUSBAdapterAudioDev), (ORBit_free_childvals) CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__free, GUINT_TO_POINTER(1)); retval->_maximum = 0; retval->_length = 0; retval->_buffer = NULL; retval->_release = CORBA_FALSE; return retval; } Trx_BaycomUSBAdapterAudioDev * CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(CORBA_unsigned_long len) { Trx_BaycomUSBAdapterAudioDev *retval = ORBit_alloc(sizeof(Trx_BaycomUSBAdapterAudioDev) * len, (ORBit_free_childvals) NULL, GUINT_TO_POINTER(len)); return retval; } #endif #if ( (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_0 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_1 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_2 == 'x') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_3 == 'c') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_4 == 't') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_5 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_6 == 'l') \ ) && !defined(ORBIT_DEF_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev) #define ORBIT_DEF_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev 1 gpointer CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { CORBA_sequence_Trx_BaycomUSBAdapterAudioDev *val = mem; if (val->_release) ORBit_free(val->_buffer, free_strings); return (gpointer) (val + 1); } CORBA_sequence_Trx_BaycomUSBAdapterAudioDev * CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__alloc(void) { CORBA_sequence_Trx_BaycomUSBAdapterAudioDev *retval; retval = ORBit_alloc(sizeof(CORBA_sequence_Trx_BaycomUSBAdapterAudioDev), (ORBit_free_childvals) CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__free, GUINT_TO_POINTER(1)); retval->_maximum = 0; retval->_length = 0; retval->_buffer = NULL; retval->_release = CORBA_FALSE; return retval; } Trx_BaycomUSBAdapterAudioDev * CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(CORBA_unsigned_long len) { Trx_BaycomUSBAdapterAudioDev *retval = ORBit_alloc(sizeof(Trx_BaycomUSBAdapterAudioDev) * len, (ORBit_free_childvals) NULL, GUINT_TO_POINTER(len)); return retval; } #endif gpointer Trx_BaycomUSBAdapterAudioDevs__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_BaycomUSBAdapterAudioDevs *var = mem; { Trx_BaycomUSBAdapterAudioDevSequence__free(&(var->audiodevsin), NULL, free_strings); } { Trx_BaycomUSBAdapterAudioDevSequence__free(&(var->audiodevsout), NULL, free_strings); } return (gpointer) (var + 1); } Trx_BaycomUSBAdapterAudioDevs * Trx_BaycomUSBAdapterAudioDevs__alloc(void) { Trx_BaycomUSBAdapterAudioDevs *retval; retval = ORBit_alloc(sizeof(Trx_BaycomUSBAdapterAudioDevs), (ORBit_free_childvals) Trx_BaycomUSBAdapterAudioDevs__free, GUINT_TO_POINTER(1)); memset(&(retval->audiodevsin), '\0', sizeof(retval->audiodevsin)); memset(&(retval->audiodevsout), '\0', sizeof(retval->audiodevsout)); return retval; } gpointer Trx_ChannelAccessConfig__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_ChannelAccessConfig *var = mem; return (gpointer) (var + 1); } Trx_ChannelAccessConfig * Trx_ChannelAccessConfig__alloc(void) { Trx_ChannelAccessConfig *retval; retval = ORBit_alloc(sizeof(Trx_ChannelAccessConfig), (ORBit_free_childvals) Trx_ChannelAccessConfig__free, GUINT_TO_POINTER(1)); return retval; } gpointer Trx_IpAddress__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { gpointer retval = ((guchar *) mem) + sizeof(Trx_IpAddress); return retval; } Trx_IpAddress_slice * Trx_IpAddress__alloc(void) { Trx_IpAddress_slice *retval; retval = ORBit_alloc(sizeof(Trx_IpAddress), (ORBit_free_childvals) NULL, NULL); return retval; } gpointer Trx_InterfaceConfig__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_InterfaceConfig *var = mem; return (gpointer) (var + 1); } Trx_InterfaceConfig * Trx_InterfaceConfig__alloc(void) { Trx_InterfaceConfig *retval; retval = ORBit_alloc(sizeof(Trx_InterfaceConfig), (ORBit_free_childvals) Trx_InterfaceConfig__free, GUINT_TO_POINTER(1)); return retval; } gpointer Trx_ModemDisconnectConfig__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_ModemDisconnectConfig *var = mem; return (gpointer) (var + 1); } Trx_ModemDisconnectConfig * Trx_ModemDisconnectConfig__alloc(void) { Trx_ModemDisconnectConfig *retval; retval = ORBit_alloc(sizeof(Trx_ModemDisconnectConfig), (ORBit_free_childvals) Trx_ModemDisconnectConfig__free, GUINT_TO_POINTER(1)); return retval; } gpointer Trx_TrxAudioState__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_TrxAudioState *var = mem; return (gpointer) (var + 1); } Trx_TrxAudioState * Trx_TrxAudioState__alloc(void) { Trx_TrxAudioState *retval; retval = ORBit_alloc(sizeof(Trx_TrxAudioState), (ORBit_free_childvals) Trx_TrxAudioState__free, GUINT_TO_POINTER(1)); return retval; } #if ( (ORBIT_IMPL_CORBA_sequence_CORBA_octet_0 == 't') \ && (ORBIT_IMPL_CORBA_sequence_CORBA_octet_1 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_CORBA_octet_2 == 'x') \ && (ORBIT_IMPL_CORBA_sequence_CORBA_octet_3 == 'c') \ && (ORBIT_IMPL_CORBA_sequence_CORBA_octet_4 == 't') \ && (ORBIT_IMPL_CORBA_sequence_CORBA_octet_5 == 'r') \ && (ORBIT_IMPL_CORBA_sequence_CORBA_octet_6 == 'l') \ ) && !defined(ORBIT_DEF_CORBA_sequence_CORBA_octet) #define ORBIT_DEF_CORBA_sequence_CORBA_octet 1 gpointer CORBA_sequence_CORBA_octet__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { CORBA_sequence_CORBA_octet *val = mem; if (val->_release) ORBit_free(val->_buffer, free_strings); return (gpointer) (val + 1); } CORBA_sequence_CORBA_octet * CORBA_sequence_CORBA_octet__alloc(void) { CORBA_sequence_CORBA_octet *retval; retval = ORBit_alloc(sizeof(CORBA_sequence_CORBA_octet), (ORBit_free_childvals) CORBA_sequence_CORBA_octet__free, GUINT_TO_POINTER(1)); retval->_maximum = 0; retval->_length = 0; retval->_buffer = NULL; retval->_release = CORBA_FALSE; return retval; } CORBA_octet * CORBA_sequence_CORBA_octet_allocbuf(CORBA_unsigned_long len) { CORBA_octet *retval = ORBit_alloc(sizeof(CORBA_octet) * len, (ORBit_free_childvals) NULL, GUINT_TO_POINTER(len)); return retval; } #endif gpointer Trx_TrxAudioSamples__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { return CORBA_sequence_CORBA_octet__free(mem, dat, free_strings); } Trx_TrxAudioSamples * Trx_TrxAudioSamples__alloc(void) { return CORBA_sequence_CORBA_octet__alloc(); } gpointer Trx_TrxAudioParams__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_TrxAudioParams *var = mem; return (gpointer) (var + 1); } Trx_TrxAudioParams * Trx_TrxAudioParams__alloc(void) { Trx_TrxAudioParams *retval; retval = ORBit_alloc(sizeof(Trx_TrxAudioParams), (ORBit_free_childvals) Trx_TrxAudioParams__free, GUINT_TO_POINTER(1)); return retval; } gpointer Trx_TrxError__free(gpointer mem, gpointer dat, CORBA_boolean free_strings) { Trx_TrxError *var = mem; if (free_strings) { CORBA_string__free(&(var->reason), NULL, free_strings); } return (gpointer) (var + 1); } Trx_TrxError * Trx_TrxError__alloc(void) { Trx_TrxError *retval; retval = ORBit_alloc(sizeof(Trx_TrxError), (ORBit_free_childvals) Trx_TrxError__free, GUINT_TO_POINTER(1)); memset(&(retval->reason), '\0', sizeof(retval->reason)); return retval; } CORBA_unsigned_long Trx_Control__classid = 0; baycomusb-0.10.orig/trxapi/trxctrl-stubs.c0100644000175100017510000027546507340455635016761 0ustar abaaba/* * This file was generated by orbit-idl - DO NOT EDIT! */ #include #include "trxctrl.h" void _ORBIT_Trx_TrxError_demarshal(GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev) { guchar *_ORBIT_curptr; register CORBA_unsigned_long _ORBIT_tmpvar_0; CORBA_unsigned_long _ORBIT_tmpvar_1; Trx_TrxError *_ORBIT_exdata = Trx_TrxError__alloc(); _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (_ORBIT_tmpvar_1))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*_ORBIT_exdata).reason = CORBA_string_alloc(_ORBIT_tmpvar_1); memcpy((*_ORBIT_exdata).reason, _ORBIT_curptr, sizeof((*_ORBIT_exdata).reason[_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1); _ORBIT_curptr += sizeof((*_ORBIT_exdata).reason[_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1; } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); _ORBIT_tmpvar_1 = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; (*_ORBIT_exdata).reason = CORBA_string_alloc(_ORBIT_tmpvar_1); memcpy((*_ORBIT_exdata).reason, _ORBIT_curptr, sizeof((*_ORBIT_exdata).reason[_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1); _ORBIT_curptr += sizeof((*_ORBIT_exdata).reason[_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1; } CORBA_exception_set(ev, CORBA_USER_EXCEPTION, TC_Trx_TrxError_struct.repo_id, _ORBIT_exdata); } void Trx_Control_GetDescription(Trx_Control _obj, Trx_TrxDescription ** desc, CORBA_Environment * ev) { register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; register CORBA_unsigned_long _ORBIT_tmpvar_10; CORBA_unsigned_long _ORBIT_tmpvar_11; register CORBA_unsigned_long _ORBIT_tmpvar_12; CORBA_unsigned_long _ORBIT_tmpvar_13; register CORBA_unsigned_long _ORBIT_tmpvar_14; CORBA_unsigned_long _ORBIT_tmpvar_15; register CORBA_unsigned_long _ORBIT_tmpvar_16; CORBA_unsigned_long _ORBIT_tmpvar_17; register CORBA_unsigned_long _ORBIT_tmpvar_18; register CORBA_unsigned_long _ORBIT_tmpvar_19; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> GetDescription(_obj->servant, desc, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[15]; } _ORBIT_operation_name_data = { 15, "GetDescription"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 19 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; *desc = Trx_TrxDescription__alloc(); _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (_ORBIT_tmpvar_11))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**desc)).manufacturer = CORBA_string_alloc(_ORBIT_tmpvar_11); memcpy(((**desc)).manufacturer, _ORBIT_curptr, sizeof(((**desc)).manufacturer[_ORBIT_tmpvar_10]) * _ORBIT_tmpvar_11); _ORBIT_curptr += sizeof(((**desc)).manufacturer[_ORBIT_tmpvar_10]) * _ORBIT_tmpvar_11; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (_ORBIT_tmpvar_13))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**desc)).model = CORBA_string_alloc(_ORBIT_tmpvar_13); memcpy(((**desc)).model, _ORBIT_curptr, sizeof(((**desc)).model[_ORBIT_tmpvar_12]) * _ORBIT_tmpvar_13); _ORBIT_curptr += sizeof(((**desc)).model[_ORBIT_tmpvar_12]) * _ORBIT_tmpvar_13; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (_ORBIT_tmpvar_15))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**desc)).copyright = CORBA_string_alloc(_ORBIT_tmpvar_15); memcpy(((**desc)).copyright, _ORBIT_curptr, sizeof(((**desc)).copyright[_ORBIT_tmpvar_14]) * _ORBIT_tmpvar_15); _ORBIT_curptr += sizeof(((**desc)).copyright[_ORBIT_tmpvar_14]) * _ORBIT_tmpvar_15; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (_ORBIT_tmpvar_17))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**desc)).instid = CORBA_string_alloc(_ORBIT_tmpvar_17); memcpy(((**desc)).instid, _ORBIT_curptr, sizeof(((**desc)).instid[_ORBIT_tmpvar_16]) * _ORBIT_tmpvar_17); _ORBIT_curptr += sizeof(((**desc)).instid[_ORBIT_tmpvar_16]) * _ORBIT_tmpvar_17; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (((**desc)).rxbands._length))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**desc)).rxbands._maximum = ((**desc)).rxbands._length; ((**desc)).rxbands._buffer = CORBA_sequence_Trx_TrxBandDescription_allocbuf(((**desc)).rxbands. _length); ((**desc)).rxbands._release = CORBA_TRUE; for (_ORBIT_tmpvar_18 = 0; _ORBIT_tmpvar_18 < ((**desc)).rxbands._length; _ORBIT_tmpvar_18++) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 8); iiop_byteswap((guchar *) & (((**desc)).rxbands._buffer[_ORBIT_tmpvar_18].low), _ORBIT_curptr, 8); _ORBIT_curptr += 8; iiop_byteswap((guchar *) & (((**desc)).rxbands._buffer[_ORBIT_tmpvar_18].high), _ORBIT_curptr, 8); _ORBIT_curptr += 8; iiop_byteswap((guchar *) & (((**desc)).rxbands._buffer[_ORBIT_tmpvar_18].step), _ORBIT_curptr, 8); _ORBIT_curptr += 8; } (*((guint32 *) & (((**desc)).txbands._length))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**desc)).txbands._maximum = ((**desc)).txbands._length; ((**desc)).txbands._buffer = CORBA_sequence_Trx_TrxBandDescription_allocbuf(((**desc)).txbands. _length); ((**desc)).txbands._release = CORBA_TRUE; for (_ORBIT_tmpvar_19 = 0; _ORBIT_tmpvar_19 < ((**desc)).txbands._length; _ORBIT_tmpvar_19++) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 8); iiop_byteswap((guchar *) & (((**desc)).txbands._buffer[_ORBIT_tmpvar_19].low), _ORBIT_curptr, 8); _ORBIT_curptr += 8; iiop_byteswap((guchar *) & (((**desc)).txbands._buffer[_ORBIT_tmpvar_19].high), _ORBIT_curptr, 8); _ORBIT_curptr += 8; iiop_byteswap((guchar *) & (((**desc)).txbands._buffer[_ORBIT_tmpvar_19].step), _ORBIT_curptr, 8); _ORBIT_curptr += 8; } (*((guint32 *) & (((**desc)).rssimin))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (((**desc)).rssimax))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); _ORBIT_tmpvar_11 = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**desc)).manufacturer = CORBA_string_alloc(_ORBIT_tmpvar_11); memcpy(((**desc)).manufacturer, _ORBIT_curptr, sizeof(((**desc)).manufacturer[_ORBIT_tmpvar_10]) * _ORBIT_tmpvar_11); _ORBIT_curptr += sizeof(((**desc)).manufacturer[_ORBIT_tmpvar_10]) * _ORBIT_tmpvar_11; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); _ORBIT_tmpvar_13 = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**desc)).model = CORBA_string_alloc(_ORBIT_tmpvar_13); memcpy(((**desc)).model, _ORBIT_curptr, sizeof(((**desc)).model[_ORBIT_tmpvar_12]) * _ORBIT_tmpvar_13); _ORBIT_curptr += sizeof(((**desc)).model[_ORBIT_tmpvar_12]) * _ORBIT_tmpvar_13; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); _ORBIT_tmpvar_15 = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**desc)).copyright = CORBA_string_alloc(_ORBIT_tmpvar_15); memcpy(((**desc)).copyright, _ORBIT_curptr, sizeof(((**desc)).copyright[_ORBIT_tmpvar_14]) * _ORBIT_tmpvar_15); _ORBIT_curptr += sizeof(((**desc)).copyright[_ORBIT_tmpvar_14]) * _ORBIT_tmpvar_15; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); _ORBIT_tmpvar_17 = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**desc)).instid = CORBA_string_alloc(_ORBIT_tmpvar_17); memcpy(((**desc)).instid, _ORBIT_curptr, sizeof(((**desc)).instid[_ORBIT_tmpvar_16]) * _ORBIT_tmpvar_17); _ORBIT_curptr += sizeof(((**desc)).instid[_ORBIT_tmpvar_16]) * _ORBIT_tmpvar_17; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ((**desc)).rxbands._length = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**desc)).rxbands._maximum = ((**desc)).rxbands._length; ((**desc)).rxbands._buffer = CORBA_sequence_Trx_TrxBandDescription_allocbuf(((**desc)).rxbands. _length); ((**desc)).rxbands._release = CORBA_TRUE; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 8); memcpy(((**desc)).rxbands._buffer, _ORBIT_curptr, sizeof(((**desc)).rxbands._buffer[_ORBIT_tmpvar_18]) * ((**desc)).rxbands._length); _ORBIT_curptr += sizeof(((**desc)).rxbands._buffer[_ORBIT_tmpvar_18]) * ((**desc)).rxbands._length; ((**desc)).txbands._length = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**desc)).txbands._maximum = ((**desc)).txbands._length; ((**desc)).txbands._buffer = CORBA_sequence_Trx_TrxBandDescription_allocbuf(((**desc)).txbands. _length); ((**desc)).txbands._release = CORBA_TRUE; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 8); memcpy(((**desc)).txbands._buffer, _ORBIT_curptr, sizeof(((**desc)).txbands._buffer[_ORBIT_tmpvar_19]) * ((**desc)).txbands._length); _ORBIT_curptr += sizeof(((**desc)).txbands._buffer[_ORBIT_tmpvar_19]) * ((**desc)).txbands._length; ((**desc)).rssimin = *((Trx_signalstrength *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**desc)).rssimax = *((Trx_signalstrength *) _ORBIT_curptr); } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_GetState(Trx_Control _obj, Trx_TrxState * state, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> GetState(_obj->servant, state, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[9]; } _ORBIT_operation_name_data = { 9, "GetState"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 13 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*state).mode))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 8); iiop_byteswap((guchar *) & ((*state).rxfreq), _ORBIT_curptr, 8); _ORBIT_curptr += 8; iiop_byteswap((guchar *) & ((*state).txfreq), _ORBIT_curptr, 8); _ORBIT_curptr += 8; (*state).ptt = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; (*state).manualptt = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; (*state).dcd = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*state).rssi))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*state).mode = *((Trx_TrxMode *) _ORBIT_curptr); _ORBIT_curptr += 4; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 8); (*state).rxfreq = *((Trx_frequency *) _ORBIT_curptr); _ORBIT_curptr += 8; (*state).txfreq = *((Trx_frequency *) _ORBIT_curptr); _ORBIT_curptr += 8; (*state).ptt = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; (*state).manualptt = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; (*state).dcd = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*state).rssi = *((Trx_signalstrength *) _ORBIT_curptr); } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_SetPTT(Trx_Control _obj, const CORBA_boolean ptt, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> SetPTT(_obj->servant, ptt, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[7]; } _ORBIT_operation_name_data = { 7, "SetPTT"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 11 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(ptt), sizeof(ptt)); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_SetFrequency(Trx_Control _obj, const Trx_frequency rx, const Trx_frequency tx, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> SetFrequency(_obj->servant, rx, tx, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[13]; } _ORBIT_operation_name_data = { 13, "SetFrequency"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 17 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_FALSE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 8); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(rx), sizeof(rx)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(tx), sizeof(tx)); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; } void Trx_Control_UartSend(Trx_Control _obj, const CORBA_char * str, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> UartSend(_obj->servant, str, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[9]; } _ORBIT_operation_name_data = { 9, "UartSend"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 13 }; register CORBA_unsigned_long _ORBIT_tmpvar_0; CORBA_unsigned_long _ORBIT_tmpvar_1; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_FALSE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; _ORBIT_tmpvar_1 = strlen(str) + 1; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_1)); memcpy(_ORBIT_t, &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof(_ORBIT_tmpvar_1)); } giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), (str), sizeof(str[_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; } void Trx_Control_UartReceive(Trx_Control _obj, CORBA_unsigned_long * ptr, CORBA_char ** str, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; register CORBA_unsigned_long _ORBIT_tmpvar_2; CORBA_unsigned_long _ORBIT_tmpvar_3; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> UartReceive(_obj->servant, ptr, str, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[12]; } _ORBIT_operation_name_data = { 12, "UartReceive"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 16 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*ptr)), sizeof((*ptr))); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*ptr)))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (_ORBIT_tmpvar_3))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*str) = CORBA_string_alloc(_ORBIT_tmpvar_3); memcpy((*str), _ORBIT_curptr, sizeof((*str)[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3); _ORBIT_curptr += sizeof((*str)[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3; } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*ptr) = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; _ORBIT_tmpvar_3 = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; (*str) = CORBA_string_alloc(_ORBIT_tmpvar_3); memcpy((*str), _ORBIT_curptr, sizeof((*str)[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3); _ORBIT_curptr += sizeof((*str)[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3; } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_BaycomUSBAdapterGetConfig(Trx_Control _obj, Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; register CORBA_unsigned_long _ORBIT_tmpvar_2; register CORBA_unsigned_long _ORBIT_tmpvar_3; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> BaycomUSBAdapterGetConfig(_obj->servant, cfg, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[26]; } _ORBIT_operation_name_data = { 26, "BaycomUSBAdapterGetConfig"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 30 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*cfg).mode))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).fclk))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).bitraterx))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).bitratetx))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).loopback))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*cfg).pttmute = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*cfg).filtmode))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).samplerate))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).gain))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; memcpy((*cfg).audiodevin, _ORBIT_curptr, sizeof((*cfg).audiodevin[_ORBIT_tmpvar_2]) * 64); _ORBIT_curptr += sizeof((*cfg).audiodevin[_ORBIT_tmpvar_2]) * 64; memcpy((*cfg).audiodevout, _ORBIT_curptr, sizeof((*cfg).audiodevout[_ORBIT_tmpvar_3]) * 64); _ORBIT_curptr += sizeof((*cfg).audiodevout[_ORBIT_tmpvar_3]) * 64; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*cfg).rfsquelch))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*cfg).audiosquelch = *((CORBA_boolean *) _ORBIT_curptr); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*cfg).mode = *((Trx_BaycomUSBAdapterMode *) _ORBIT_curptr); _ORBIT_curptr += 4; (*cfg).fclk = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; (*cfg).bitraterx = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; (*cfg).bitratetx = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; (*cfg).loopback = *((Trx_BaycomUSBAdapterLoopback *) _ORBIT_curptr); _ORBIT_curptr += 4; (*cfg).pttmute = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*cfg).filtmode = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; (*cfg).samplerate = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; (*cfg).gain = *((CORBA_float *) _ORBIT_curptr); _ORBIT_curptr += 4; memcpy((*cfg).audiodevin, _ORBIT_curptr, sizeof((*cfg).audiodevin[_ORBIT_tmpvar_2]) * 64); _ORBIT_curptr += sizeof((*cfg).audiodevin[_ORBIT_tmpvar_2]) * 64; memcpy((*cfg).audiodevout, _ORBIT_curptr, sizeof((*cfg).audiodevout[_ORBIT_tmpvar_3]) * 64); _ORBIT_curptr += sizeof((*cfg).audiodevout[_ORBIT_tmpvar_3]) * 64; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*cfg).rfsquelch = *((Trx_signalstrength *) _ORBIT_curptr); _ORBIT_curptr += 4; (*cfg).audiosquelch = *((CORBA_boolean *) _ORBIT_curptr); } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_BaycomUSBAdapterSetConfig(Trx_Control _obj, const Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> BaycomUSBAdapterSetConfig(_obj->servant, cfg, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[26]; } _ORBIT_operation_name_data = { 26, "BaycomUSBAdapterSetConfig"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 30 }; register CORBA_unsigned_long _ORBIT_tmpvar_0; register CORBA_unsigned_long _ORBIT_tmpvar_1; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).mode), sizeof((*cfg).mode)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).fclk), sizeof((*cfg).fclk)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).bitraterx), sizeof((*cfg).bitraterx)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).bitratetx), sizeof((*cfg).bitratetx)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).loopback), sizeof((*cfg).loopback)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).pttmute), sizeof((*cfg).pttmute)); giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).filtmode), sizeof((*cfg).filtmode)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).samplerate), sizeof((*cfg).samplerate)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).gain), sizeof((*cfg).gain)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).audiodevin), sizeof((*cfg). audiodevin[_ORBIT_tmpvar_0]) * 64); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).audiodevout), sizeof((*cfg). audiodevout[_ORBIT_tmpvar_1]) * 64); giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).rfsquelch), sizeof((*cfg).rfsquelch)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).audiosquelch), sizeof((*cfg).audiosquelch)); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_BaycomUSBAdapterGetAudioDevices(Trx_Control _obj, Trx_BaycomUSBAdapterAudioDevs ** devs, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; register CORBA_unsigned_long _ORBIT_tmpvar_4; register CORBA_unsigned_long _ORBIT_tmpvar_5; register CORBA_unsigned_long _ORBIT_tmpvar_6; register CORBA_unsigned_long _ORBIT_tmpvar_7; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> BaycomUSBAdapterGetAudioDevices(_obj->servant, devs, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[32]; } _ORBIT_operation_name_data = { 32, "BaycomUSBAdapterGetAudioDevices"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 36 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; *devs = Trx_BaycomUSBAdapterAudioDevs__alloc(); _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (((**devs)).audiodevsin._length))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**devs)).audiodevsin._maximum = ((**devs)).audiodevsin._length; ((**devs)).audiodevsin._buffer = CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(((**devs)). audiodevsin. _length); ((**devs)).audiodevsin._release = CORBA_TRUE; for (_ORBIT_tmpvar_4 = 0; _ORBIT_tmpvar_4 < ((**devs)).audiodevsin._length; _ORBIT_tmpvar_4++) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 1); memcpy(((**devs)).audiodevsin._buffer[_ORBIT_tmpvar_4], _ORBIT_curptr, sizeof(((**devs)).audiodevsin. _buffer[_ORBIT_tmpvar_4][_ORBIT_tmpvar_5]) * 64); _ORBIT_curptr += sizeof(((**devs)).audiodevsin. _buffer[_ORBIT_tmpvar_4][_ORBIT_tmpvar_5]) * 64; } _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (((**devs)).audiodevsout._length))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**devs)).audiodevsout._maximum = ((**devs)).audiodevsout._length; ((**devs)).audiodevsout._buffer = CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(((**devs)). audiodevsout. _length); ((**devs)).audiodevsout._release = CORBA_TRUE; for (_ORBIT_tmpvar_6 = 0; _ORBIT_tmpvar_6 < ((**devs)).audiodevsout._length; _ORBIT_tmpvar_6++) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 1); memcpy(((**devs)).audiodevsout._buffer[_ORBIT_tmpvar_6], _ORBIT_curptr, sizeof(((**devs)).audiodevsout. _buffer[_ORBIT_tmpvar_6][_ORBIT_tmpvar_7]) * 64); _ORBIT_curptr += sizeof(((**devs)).audiodevsout. _buffer[_ORBIT_tmpvar_6][_ORBIT_tmpvar_7]) * 64; } } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ((**devs)).audiodevsin._length = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**devs)).audiodevsin._maximum = ((**devs)).audiodevsin._length; ((**devs)).audiodevsin._buffer = CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(((**devs)). audiodevsin. _length); ((**devs)).audiodevsin._release = CORBA_TRUE; memcpy(((**devs)).audiodevsin._buffer, _ORBIT_curptr, sizeof(((**devs)).audiodevsin._buffer[_ORBIT_tmpvar_4]) * ((**devs)).audiodevsin._length); _ORBIT_curptr += sizeof(((**devs)).audiodevsin._buffer[_ORBIT_tmpvar_4]) * ((**devs)).audiodevsin._length; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ((**devs)).audiodevsout._length = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**devs)).audiodevsout._maximum = ((**devs)).audiodevsout._length; ((**devs)).audiodevsout._buffer = CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(((**devs)). audiodevsout. _length); ((**devs)).audiodevsout._release = CORBA_TRUE; memcpy(((**devs)).audiodevsout._buffer, _ORBIT_curptr, sizeof(((**devs)).audiodevsout._buffer[_ORBIT_tmpvar_6]) * ((**devs)).audiodevsout._length); _ORBIT_curptr += sizeof(((**devs)).audiodevsout._buffer[_ORBIT_tmpvar_6]) * ((**devs)).audiodevsout._length; } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_ChannelAccessGetConfig(Trx_Control _obj, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> ChannelAccessGetConfig(_obj->servant, cfg, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[23]; } _ORBIT_operation_name_data = { 23, "ChannelAccessGetConfig"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 27 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*cfg).txdelay))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).slottime))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).ppersistence))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).txtail))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*cfg).fullduplex = *((CORBA_boolean *) _ORBIT_curptr); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); memcpy(&((*cfg)), _ORBIT_curptr, sizeof((*cfg))); } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_ChannelAccessSetConfig(Trx_Control _obj, const Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> ChannelAccessSetConfig(_obj->servant, cfg, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[23]; } _ORBIT_operation_name_data = { 23, "ChannelAccessSetConfig"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 27 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg)), sizeof((*cfg))); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_InterfaceGetConfig(Trx_Control _obj, Trx_InterfaceConfig * cfg, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; register CORBA_unsigned_long _ORBIT_tmpvar_8; register CORBA_unsigned_long _ORBIT_tmpvar_9; register CORBA_unsigned_long _ORBIT_tmpvar_10; register CORBA_unsigned_long _ORBIT_tmpvar_11; register CORBA_unsigned_long _ORBIT_tmpvar_12; register CORBA_unsigned_long _ORBIT_tmpvar_13; register CORBA_unsigned_long _ORBIT_tmpvar_14; register CORBA_unsigned_long _ORBIT_tmpvar_15; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> InterfaceGetConfig(_obj->servant, cfg, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[19]; } _ORBIT_operation_name_data = { 19, "InterfaceGetConfig"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 23 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { memcpy((*cfg).ifname, _ORBIT_curptr, sizeof((*cfg).ifname[_ORBIT_tmpvar_8]) * 16); _ORBIT_curptr += sizeof((*cfg).ifname[_ORBIT_tmpvar_8]) * 16; memcpy((*cfg).hwaddr, _ORBIT_curptr, sizeof((*cfg).hwaddr[_ORBIT_tmpvar_9]) * 16); _ORBIT_curptr += sizeof((*cfg).hwaddr[_ORBIT_tmpvar_9]) * 16; memcpy((*cfg).ipaddr, _ORBIT_curptr, sizeof((*cfg).ipaddr[_ORBIT_tmpvar_10]) * 4); _ORBIT_curptr += sizeof((*cfg).ipaddr[_ORBIT_tmpvar_10]) * 4; memcpy((*cfg).netmask, _ORBIT_curptr, sizeof((*cfg).netmask[_ORBIT_tmpvar_11]) * 4); _ORBIT_curptr += sizeof((*cfg).netmask[_ORBIT_tmpvar_11]) * 4; memcpy((*cfg).broadcast, _ORBIT_curptr, sizeof((*cfg).broadcast[_ORBIT_tmpvar_12]) * 4); _ORBIT_curptr += sizeof((*cfg).broadcast[_ORBIT_tmpvar_12]) * 4; memcpy((*cfg).gwhwaddr, _ORBIT_curptr, sizeof((*cfg).gwhwaddr[_ORBIT_tmpvar_13]) * 128); _ORBIT_curptr += sizeof((*cfg).gwhwaddr[_ORBIT_tmpvar_13]) * 128; memcpy((*cfg).gwipaddr, _ORBIT_curptr, sizeof((*cfg).gwipaddr[_ORBIT_tmpvar_14]) * 4); _ORBIT_curptr += sizeof((*cfg).gwipaddr[_ORBIT_tmpvar_14]) * 4; memcpy((*cfg).gwnetmask, _ORBIT_curptr, sizeof((*cfg).gwnetmask[_ORBIT_tmpvar_15]) * 4); _ORBIT_curptr += sizeof((*cfg).gwnetmask[_ORBIT_tmpvar_15]) * 4; (*cfg).gwipmode = *((CORBA_char *) _ORBIT_curptr); } else { memcpy((*cfg).ifname, _ORBIT_curptr, sizeof((*cfg).ifname[_ORBIT_tmpvar_8]) * 16); _ORBIT_curptr += sizeof((*cfg).ifname[_ORBIT_tmpvar_8]) * 16; memcpy((*cfg).hwaddr, _ORBIT_curptr, sizeof((*cfg).hwaddr[_ORBIT_tmpvar_9]) * 16); _ORBIT_curptr += sizeof((*cfg).hwaddr[_ORBIT_tmpvar_9]) * 16; memcpy((*cfg).ipaddr, _ORBIT_curptr, sizeof((*cfg).ipaddr[_ORBIT_tmpvar_10]) * 4); _ORBIT_curptr += sizeof((*cfg).ipaddr[_ORBIT_tmpvar_10]) * 4; memcpy((*cfg).netmask, _ORBIT_curptr, sizeof((*cfg).netmask[_ORBIT_tmpvar_11]) * 4); _ORBIT_curptr += sizeof((*cfg).netmask[_ORBIT_tmpvar_11]) * 4; memcpy((*cfg).broadcast, _ORBIT_curptr, sizeof((*cfg).broadcast[_ORBIT_tmpvar_12]) * 4); _ORBIT_curptr += sizeof((*cfg).broadcast[_ORBIT_tmpvar_12]) * 4; memcpy((*cfg).gwhwaddr, _ORBIT_curptr, sizeof((*cfg).gwhwaddr[_ORBIT_tmpvar_13]) * 128); _ORBIT_curptr += sizeof((*cfg).gwhwaddr[_ORBIT_tmpvar_13]) * 128; memcpy((*cfg).gwipaddr, _ORBIT_curptr, sizeof((*cfg).gwipaddr[_ORBIT_tmpvar_14]) * 4); _ORBIT_curptr += sizeof((*cfg).gwipaddr[_ORBIT_tmpvar_14]) * 4; memcpy((*cfg).gwnetmask, _ORBIT_curptr, sizeof((*cfg).gwnetmask[_ORBIT_tmpvar_15]) * 4); _ORBIT_curptr += sizeof((*cfg).gwnetmask[_ORBIT_tmpvar_15]) * 4; (*cfg).gwipmode = *((CORBA_char *) _ORBIT_curptr); } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_InterfaceSetConfig(Trx_Control _obj, const Trx_InterfaceConfig * cfg, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> InterfaceSetConfig(_obj->servant, cfg, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[19]; } _ORBIT_operation_name_data = { 19, "InterfaceSetConfig"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 23 }; register CORBA_unsigned_long _ORBIT_tmpvar_0; register CORBA_unsigned_long _ORBIT_tmpvar_1; register CORBA_unsigned_long _ORBIT_tmpvar_2; register CORBA_unsigned_long _ORBIT_tmpvar_3; register CORBA_unsigned_long _ORBIT_tmpvar_4; register CORBA_unsigned_long _ORBIT_tmpvar_5; register CORBA_unsigned_long _ORBIT_tmpvar_6; register CORBA_unsigned_long _ORBIT_tmpvar_7; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).ifname), sizeof((*cfg).ifname[_ORBIT_tmpvar_0]) * 16); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).hwaddr), sizeof((*cfg).hwaddr[_ORBIT_tmpvar_1]) * 16); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).ipaddr), sizeof((*cfg).ipaddr[_ORBIT_tmpvar_2]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).netmask), sizeof((*cfg).netmask[_ORBIT_tmpvar_3]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).broadcast), sizeof((*cfg). broadcast[_ORBIT_tmpvar_4]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).gwhwaddr), sizeof((*cfg). gwhwaddr[_ORBIT_tmpvar_5]) * 128); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).gwipaddr), sizeof((*cfg). gwipaddr[_ORBIT_tmpvar_6]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*cfg).gwnetmask), sizeof((*cfg). gwnetmask[_ORBIT_tmpvar_7]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg).gwipmode), sizeof((*cfg).gwipmode)); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_ModemDisconnectGetConfig(Trx_Control _obj, Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> ModemDisconnectGetConfig(_obj->servant, cfg, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[25]; } _ORBIT_operation_name_data = { 25, "ModemDisconnectGetConfig"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 29 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*cfg).output))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).direction))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).rxc))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).txc))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*cfg).txd))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); memcpy(&((*cfg)), _ORBIT_curptr, sizeof((*cfg))); } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_ModemDisconnectSetConfig(Trx_Control _obj, const Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> ModemDisconnectSetConfig(_obj->servant, cfg, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[25]; } _ORBIT_operation_name_data = { 25, "ModemDisconnectSetConfig"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 29 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*cfg)), sizeof((*cfg))); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_GetAudioState(Trx_Control _obj, Trx_TrxAudioState * state, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> GetAudioState(_obj->servant, state, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[14]; } _ORBIT_operation_name_data = { 14, "GetAudioState"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 18 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & ((*state).samplerate))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*state).micbufsz))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*state).micbufptr))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*state).spkbufsz))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*state).spkbufptr))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*state).micsigpwr))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*state).spksigpwr))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & ((*state).spknoisepwr))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); memcpy(&((*state)), _ORBIT_curptr, sizeof((*state))); } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_GetAudioMicSamples(Trx_Control _obj, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; register CORBA_unsigned_long _ORBIT_tmpvar_1; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> GetAudioMicSamples(_obj->servant, ptr, len, samples, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[19]; } _ORBIT_operation_name_data = { 19, "GetAudioMicSamples"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 23 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(ptr), sizeof(ptr)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(len), sizeof(len)); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; *samples = Trx_TrxAudioSamples__alloc(); _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (((**samples))._length))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**samples))._maximum = ((**samples))._length; ((**samples))._buffer = CORBA_sequence_CORBA_octet_allocbuf(((**samples))._length); ((**samples))._release = CORBA_TRUE; memcpy(((**samples))._buffer, _ORBIT_curptr, sizeof(((**samples))._buffer[_ORBIT_tmpvar_1]) * ((**samples))._length); _ORBIT_curptr += sizeof(((**samples))._buffer[_ORBIT_tmpvar_1]) * ((**samples))._length; } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ((**samples))._length = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**samples))._maximum = ((**samples))._length; ((**samples))._buffer = CORBA_sequence_CORBA_octet_allocbuf(((**samples))._length); ((**samples))._release = CORBA_TRUE; memcpy(((**samples))._buffer, _ORBIT_curptr, sizeof(((**samples))._buffer[_ORBIT_tmpvar_1]) * ((**samples))._length); _ORBIT_curptr += sizeof(((**samples))._buffer[_ORBIT_tmpvar_1]) * ((**samples))._length; } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_GetAudioSpkSamples(Trx_Control _obj, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; register CORBA_unsigned_long _ORBIT_tmpvar_1; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> GetAudioSpkSamples(_obj->servant, ptr, len, samples, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[19]; } _ORBIT_operation_name_data = { 19, "GetAudioSpkSamples"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 23 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(ptr), sizeof(ptr)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(len), sizeof(len)); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; *samples = Trx_TrxAudioSamples__alloc(); _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (((**samples))._length))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; ((**samples))._maximum = ((**samples))._length; ((**samples))._buffer = CORBA_sequence_CORBA_octet_allocbuf(((**samples))._length); ((**samples))._release = CORBA_TRUE; memcpy(((**samples))._buffer, _ORBIT_curptr, sizeof(((**samples))._buffer[_ORBIT_tmpvar_1]) * ((**samples))._length); _ORBIT_curptr += sizeof(((**samples))._buffer[_ORBIT_tmpvar_1]) * ((**samples))._length; } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ((**samples))._length = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; ((**samples))._maximum = ((**samples))._length; ((**samples))._buffer = CORBA_sequence_CORBA_octet_allocbuf(((**samples))._length); ((**samples))._release = CORBA_TRUE; memcpy(((**samples))._buffer, _ORBIT_curptr, sizeof(((**samples))._buffer[_ORBIT_tmpvar_1]) * ((**samples))._length); _ORBIT_curptr += sizeof(((**samples))._buffer[_ORBIT_tmpvar_1]) * ((**samples))._length; } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_SetAudioDTMF(Trx_Control _obj, const CORBA_long ch, CORBA_Environment * ev) { static const ORBit_exception_demarshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_demarshal}, {CORBA_OBJECT_NIL, NULL} }; register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> SetAudioDTMF(_obj->servant, ch, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[13]; } _ORBIT_operation_name_data = { 13, "SetAudioDTMF"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 17 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(ch), sizeof(ch)); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, _ORBIT_user_exceptions, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } void Trx_Control_SetAudioParams(Trx_Control _obj, const Trx_TrxAudioParams * params, CORBA_Environment * ev) { register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; if (_obj->servant && _obj->vepv && Trx_Control__classid) { ((POA_Trx_Control__epv *) _obj->vepv[Trx_Control__classid])-> SetAudioParams(_obj->servant, params, ev); return; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[15]; } _ORBIT_operation_name_data = { 15, "SetAudioParams"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 19 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &((*params)), sizeof((*params))); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return; } } } baycomusb-0.10.orig/trxapi/trxctrl.h0100644000175100017510000012661107340455635015614 0ustar abaaba/* * This file was generated by orbit-idl - DO NOT EDIT! */ #include #define ORBIT_IDL_SERIAL 9 #include #ifndef trxctrl_H #define trxctrl_H 1 #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** typedefs **/ #if !defined(_Trx_frequency_defined) #define _Trx_frequency_defined 1 typedef CORBA_unsigned_long_long Trx_frequency; #if !defined(TC_IMPL_TC_Trx_frequency_0) #define TC_IMPL_TC_Trx_frequency_0 't' #define TC_IMPL_TC_Trx_frequency_1 'r' #define TC_IMPL_TC_Trx_frequency_2 'x' #define TC_IMPL_TC_Trx_frequency_3 'c' #define TC_IMPL_TC_Trx_frequency_4 't' #define TC_IMPL_TC_Trx_frequency_5 'r' #define TC_IMPL_TC_Trx_frequency_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_frequency_struct; #define TC_Trx_frequency ((CORBA_TypeCode)&TC_Trx_frequency_struct) #endif #endif #if !defined(_Trx_signalstrength_defined) #define _Trx_signalstrength_defined 1 typedef CORBA_float Trx_signalstrength; #if !defined(TC_IMPL_TC_Trx_signalstrength_0) #define TC_IMPL_TC_Trx_signalstrength_0 't' #define TC_IMPL_TC_Trx_signalstrength_1 'r' #define TC_IMPL_TC_Trx_signalstrength_2 'x' #define TC_IMPL_TC_Trx_signalstrength_3 'c' #define TC_IMPL_TC_Trx_signalstrength_4 't' #define TC_IMPL_TC_Trx_signalstrength_5 'r' #define TC_IMPL_TC_Trx_signalstrength_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_signalstrength_struct; #define TC_Trx_signalstrength ((CORBA_TypeCode)&TC_Trx_signalstrength_struct) #endif #endif #if !defined(_Trx_TrxBandDescription_defined) #define _Trx_TrxBandDescription_defined 1 typedef struct { Trx_frequency low; Trx_frequency high; Trx_frequency step; } Trx_TrxBandDescription; #if !defined(TC_IMPL_TC_Trx_TrxBandDescription_0) #define TC_IMPL_TC_Trx_TrxBandDescription_0 't' #define TC_IMPL_TC_Trx_TrxBandDescription_1 'r' #define TC_IMPL_TC_Trx_TrxBandDescription_2 'x' #define TC_IMPL_TC_Trx_TrxBandDescription_3 'c' #define TC_IMPL_TC_Trx_TrxBandDescription_4 't' #define TC_IMPL_TC_Trx_TrxBandDescription_5 'r' #define TC_IMPL_TC_Trx_TrxBandDescription_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_TrxBandDescription_struct; #define TC_Trx_TrxBandDescription ((CORBA_TypeCode)&TC_Trx_TrxBandDescription_struct) #endif extern Trx_TrxBandDescription *Trx_TrxBandDescription__alloc(void); extern gpointer Trx_TrxBandDescription__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(ORBIT_DECL_CORBA_sequence_Trx_TrxBandDescription) && !defined(_CORBA_sequence_Trx_TrxBandDescription_defined) #define ORBIT_DECL_CORBA_sequence_Trx_TrxBandDescription 1 #define _CORBA_sequence_Trx_TrxBandDescription_defined 1 #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_0 't' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_1 'r' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_2 'x' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_3 'c' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_4 't' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_5 'r' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_6 'l' typedef struct { CORBA_unsigned_long _maximum, _length; Trx_TrxBandDescription *_buffer; CORBA_boolean _release; } CORBA_sequence_Trx_TrxBandDescription; #if !defined(TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_0) #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_0 't' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_1 'r' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_2 'x' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_3 'c' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_4 't' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_5 'r' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_6 'l' extern const struct CORBA_TypeCode_struct TC_CORBA_sequence_Trx_TrxBandDescription_struct; #define TC_CORBA_sequence_Trx_TrxBandDescription ((CORBA_TypeCode)&TC_CORBA_sequence_Trx_TrxBandDescription_struct) #endif extern CORBA_sequence_Trx_TrxBandDescription *CORBA_sequence_Trx_TrxBandDescription__alloc(void); extern gpointer CORBA_sequence_Trx_TrxBandDescription__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ Trx_TrxBandDescription *CORBA_sequence_Trx_TrxBandDescription_allocbuf(CORBA_unsigned_long len); #endif #if !defined(ORBIT_DECL_CORBA_sequence_Trx_TrxBandDescription) && !defined(_CORBA_sequence_Trx_TrxBandDescription_defined) #define ORBIT_DECL_CORBA_sequence_Trx_TrxBandDescription 1 #define _CORBA_sequence_Trx_TrxBandDescription_defined 1 #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_0 't' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_1 'r' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_2 'x' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_3 'c' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_4 't' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_5 'r' #define ORBIT_IMPL_CORBA_sequence_Trx_TrxBandDescription_6 'l' typedef struct { CORBA_unsigned_long _maximum, _length; Trx_TrxBandDescription *_buffer; CORBA_boolean _release; } CORBA_sequence_Trx_TrxBandDescription; #if !defined(TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_0) #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_0 't' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_1 'r' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_2 'x' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_3 'c' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_4 't' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_5 'r' #define TC_IMPL_TC_CORBA_sequence_Trx_TrxBandDescription_6 'l' extern const struct CORBA_TypeCode_struct TC_CORBA_sequence_Trx_TrxBandDescription_struct; #define TC_CORBA_sequence_Trx_TrxBandDescription ((CORBA_TypeCode)&TC_CORBA_sequence_Trx_TrxBandDescription_struct) #endif extern CORBA_sequence_Trx_TrxBandDescription *CORBA_sequence_Trx_TrxBandDescription__alloc(void); extern gpointer CORBA_sequence_Trx_TrxBandDescription__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ Trx_TrxBandDescription *CORBA_sequence_Trx_TrxBandDescription_allocbuf(CORBA_unsigned_long len); #endif #if !defined(_Trx_TrxDescription_defined) #define _Trx_TrxDescription_defined 1 typedef struct { CORBA_char *manufacturer; CORBA_char *model; CORBA_char *copyright; CORBA_char *instid; CORBA_sequence_Trx_TrxBandDescription rxbands; CORBA_sequence_Trx_TrxBandDescription txbands; Trx_signalstrength rssimin; Trx_signalstrength rssimax; } Trx_TrxDescription; #if !defined(TC_IMPL_TC_Trx_TrxDescription_0) #define TC_IMPL_TC_Trx_TrxDescription_0 't' #define TC_IMPL_TC_Trx_TrxDescription_1 'r' #define TC_IMPL_TC_Trx_TrxDescription_2 'x' #define TC_IMPL_TC_Trx_TrxDescription_3 'c' #define TC_IMPL_TC_Trx_TrxDescription_4 't' #define TC_IMPL_TC_Trx_TrxDescription_5 'r' #define TC_IMPL_TC_Trx_TrxDescription_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_TrxDescription_struct; #define TC_Trx_TrxDescription ((CORBA_TypeCode)&TC_Trx_TrxDescription_struct) #endif extern Trx_TrxDescription *Trx_TrxDescription__alloc(void); extern gpointer Trx_TrxDescription__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_TrxMode_defined) #define _Trx_TrxMode_defined 1 typedef enum { Trx_trxunspec, Trx_trxpacket, Trx_trxaudio } Trx_TrxMode; #if !defined(TC_IMPL_TC_Trx_TrxMode_0) #define TC_IMPL_TC_Trx_TrxMode_0 't' #define TC_IMPL_TC_Trx_TrxMode_1 'r' #define TC_IMPL_TC_Trx_TrxMode_2 'x' #define TC_IMPL_TC_Trx_TrxMode_3 'c' #define TC_IMPL_TC_Trx_TrxMode_4 't' #define TC_IMPL_TC_Trx_TrxMode_5 'r' #define TC_IMPL_TC_Trx_TrxMode_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_TrxMode_struct; #define TC_Trx_TrxMode ((CORBA_TypeCode)&TC_Trx_TrxMode_struct) #endif #endif #if !defined(_Trx_TrxState_defined) #define _Trx_TrxState_defined 1 typedef struct { Trx_TrxMode mode; Trx_frequency rxfreq; Trx_frequency txfreq; CORBA_boolean ptt; CORBA_boolean manualptt; CORBA_boolean dcd; Trx_signalstrength rssi; } Trx_TrxState; #if !defined(TC_IMPL_TC_Trx_TrxState_0) #define TC_IMPL_TC_Trx_TrxState_0 't' #define TC_IMPL_TC_Trx_TrxState_1 'r' #define TC_IMPL_TC_Trx_TrxState_2 'x' #define TC_IMPL_TC_Trx_TrxState_3 'c' #define TC_IMPL_TC_Trx_TrxState_4 't' #define TC_IMPL_TC_Trx_TrxState_5 'r' #define TC_IMPL_TC_Trx_TrxState_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_TrxState_struct; #define TC_Trx_TrxState ((CORBA_TypeCode)&TC_Trx_TrxState_struct) #endif extern Trx_TrxState *Trx_TrxState__alloc(void); extern gpointer Trx_TrxState__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_BaycomUSBAdapterMode_defined) #define _Trx_BaycomUSBAdapterMode_defined 1 typedef enum { Trx_fsk, Trx_external, Trx_afsk, Trx_audio } Trx_BaycomUSBAdapterMode; #if !defined(TC_IMPL_TC_Trx_BaycomUSBAdapterMode_0) #define TC_IMPL_TC_Trx_BaycomUSBAdapterMode_0 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterMode_1 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterMode_2 'x' #define TC_IMPL_TC_Trx_BaycomUSBAdapterMode_3 'c' #define TC_IMPL_TC_Trx_BaycomUSBAdapterMode_4 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterMode_5 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterMode_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterMode_struct; #define TC_Trx_BaycomUSBAdapterMode ((CORBA_TypeCode)&TC_Trx_BaycomUSBAdapterMode_struct) #endif #endif #if !defined(_Trx_BaycomUSBAdapterLoopback_defined) #define _Trx_BaycomUSBAdapterLoopback_defined 1 typedef enum { Trx_loopback_off, Trx_loopback_scrambler, Trx_loopback_modem } Trx_BaycomUSBAdapterLoopback; #if !defined(TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_0) #define TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_0 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_1 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_2 'x' #define TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_3 'c' #define TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_4 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_5 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterLoopback_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterLoopback_struct; #define TC_Trx_BaycomUSBAdapterLoopback ((CORBA_TypeCode)&TC_Trx_BaycomUSBAdapterLoopback_struct) #endif #endif #if !defined(_Trx_BaycomUSBAdapterAudioDev_defined) #define _Trx_BaycomUSBAdapterAudioDev_defined 1 typedef CORBA_char Trx_BaycomUSBAdapterAudioDev[64]; typedef CORBA_char Trx_BaycomUSBAdapterAudioDev_slice; #if !defined(TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_0) #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_0 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_1 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_2 'x' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_3 'c' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_4 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_5 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDev_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterAudioDev_struct; #define TC_Trx_BaycomUSBAdapterAudioDev ((CORBA_TypeCode)&TC_Trx_BaycomUSBAdapterAudioDev_struct) #endif extern Trx_BaycomUSBAdapterAudioDev_slice *Trx_BaycomUSBAdapterAudioDev__alloc(void); extern gpointer Trx_BaycomUSBAdapterAudioDev__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_BaycomUSBAdapterConfig_defined) #define _Trx_BaycomUSBAdapterConfig_defined 1 typedef struct { Trx_BaycomUSBAdapterMode mode; CORBA_unsigned_long fclk; CORBA_unsigned_long bitraterx; CORBA_unsigned_long bitratetx; Trx_BaycomUSBAdapterLoopback loopback; CORBA_boolean pttmute; CORBA_unsigned_long filtmode; CORBA_unsigned_long samplerate; CORBA_float gain; Trx_BaycomUSBAdapterAudioDev audiodevin; Trx_BaycomUSBAdapterAudioDev audiodevout; Trx_signalstrength rfsquelch; CORBA_boolean audiosquelch; } Trx_BaycomUSBAdapterConfig; #if !defined(TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_0) #define TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_0 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_1 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_2 'x' #define TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_3 'c' #define TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_4 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_5 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterConfig_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterConfig_struct; #define TC_Trx_BaycomUSBAdapterConfig ((CORBA_TypeCode)&TC_Trx_BaycomUSBAdapterConfig_struct) #endif extern Trx_BaycomUSBAdapterConfig *Trx_BaycomUSBAdapterConfig__alloc(void); extern gpointer Trx_BaycomUSBAdapterConfig__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(ORBIT_DECL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev) && !defined(_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_defined) #define ORBIT_DECL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev 1 #define _CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_defined 1 #define ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_0 't' #define ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_1 'r' #define ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_2 'x' #define ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_3 'c' #define ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_4 't' #define ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_5 'r' #define ORBIT_IMPL_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_6 'l' typedef struct { CORBA_unsigned_long _maximum, _length; Trx_BaycomUSBAdapterAudioDev *_buffer; CORBA_boolean _release; } CORBA_sequence_Trx_BaycomUSBAdapterAudioDev; #if !defined(TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_0) #define TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_0 't' #define TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_1 'r' #define TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_2 'x' #define TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_3 'c' #define TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_4 't' #define TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_5 'r' #define TC_IMPL_TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_6 'l' extern const struct CORBA_TypeCode_struct TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_struct; #define TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev ((CORBA_TypeCode)&TC_CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_struct) #endif extern CORBA_sequence_Trx_BaycomUSBAdapterAudioDev *CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__alloc(void); extern gpointer CORBA_sequence_Trx_BaycomUSBAdapterAudioDev__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ Trx_BaycomUSBAdapterAudioDev *CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf (CORBA_unsigned_long len); #endif #if !defined(_Trx_BaycomUSBAdapterAudioDevSequence_defined) #define _Trx_BaycomUSBAdapterAudioDevSequence_defined 1 typedef CORBA_sequence_Trx_BaycomUSBAdapterAudioDev Trx_BaycomUSBAdapterAudioDevSequence; #if !defined(TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_0) #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_0 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_1 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_2 'x' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_3 'c' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_4 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_5 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevSequence_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterAudioDevSequence_struct; #define TC_Trx_BaycomUSBAdapterAudioDevSequence ((CORBA_TypeCode)&TC_Trx_BaycomUSBAdapterAudioDevSequence_struct) #endif extern Trx_BaycomUSBAdapterAudioDevSequence *Trx_BaycomUSBAdapterAudioDevSequence__alloc(void); extern gpointer Trx_BaycomUSBAdapterAudioDevSequence__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_BaycomUSBAdapterAudioDevs_defined) #define _Trx_BaycomUSBAdapterAudioDevs_defined 1 typedef struct { Trx_BaycomUSBAdapterAudioDevSequence audiodevsin; Trx_BaycomUSBAdapterAudioDevSequence audiodevsout; } Trx_BaycomUSBAdapterAudioDevs; #if !defined(TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_0) #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_0 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_1 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_2 'x' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_3 'c' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_4 't' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_5 'r' #define TC_IMPL_TC_Trx_BaycomUSBAdapterAudioDevs_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_BaycomUSBAdapterAudioDevs_struct; #define TC_Trx_BaycomUSBAdapterAudioDevs ((CORBA_TypeCode)&TC_Trx_BaycomUSBAdapterAudioDevs_struct) #endif extern Trx_BaycomUSBAdapterAudioDevs *Trx_BaycomUSBAdapterAudioDevs__alloc(void); extern gpointer Trx_BaycomUSBAdapterAudioDevs__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_ChannelAccessConfig_defined) #define _Trx_ChannelAccessConfig_defined 1 typedef struct { CORBA_unsigned_long txdelay; CORBA_unsigned_long slottime; CORBA_unsigned_long ppersistence; CORBA_unsigned_long txtail; CORBA_boolean fullduplex; } Trx_ChannelAccessConfig; #if !defined(TC_IMPL_TC_Trx_ChannelAccessConfig_0) #define TC_IMPL_TC_Trx_ChannelAccessConfig_0 't' #define TC_IMPL_TC_Trx_ChannelAccessConfig_1 'r' #define TC_IMPL_TC_Trx_ChannelAccessConfig_2 'x' #define TC_IMPL_TC_Trx_ChannelAccessConfig_3 'c' #define TC_IMPL_TC_Trx_ChannelAccessConfig_4 't' #define TC_IMPL_TC_Trx_ChannelAccessConfig_5 'r' #define TC_IMPL_TC_Trx_ChannelAccessConfig_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_ChannelAccessConfig_struct; #define TC_Trx_ChannelAccessConfig ((CORBA_TypeCode)&TC_Trx_ChannelAccessConfig_struct) #endif extern Trx_ChannelAccessConfig *Trx_ChannelAccessConfig__alloc(void); extern gpointer Trx_ChannelAccessConfig__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_IpAddress_defined) #define _Trx_IpAddress_defined 1 typedef CORBA_octet Trx_IpAddress[4]; typedef CORBA_octet Trx_IpAddress_slice; #if !defined(TC_IMPL_TC_Trx_IpAddress_0) #define TC_IMPL_TC_Trx_IpAddress_0 't' #define TC_IMPL_TC_Trx_IpAddress_1 'r' #define TC_IMPL_TC_Trx_IpAddress_2 'x' #define TC_IMPL_TC_Trx_IpAddress_3 'c' #define TC_IMPL_TC_Trx_IpAddress_4 't' #define TC_IMPL_TC_Trx_IpAddress_5 'r' #define TC_IMPL_TC_Trx_IpAddress_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_IpAddress_struct; #define TC_Trx_IpAddress ((CORBA_TypeCode)&TC_Trx_IpAddress_struct) #endif extern Trx_IpAddress_slice *Trx_IpAddress__alloc(void); extern gpointer Trx_IpAddress__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_InterfaceConfig_defined) #define _Trx_InterfaceConfig_defined 1 typedef struct { CORBA_char ifname[16]; CORBA_char hwaddr[16]; Trx_IpAddress ipaddr; Trx_IpAddress netmask; Trx_IpAddress broadcast; CORBA_char gwhwaddr[128]; Trx_IpAddress gwipaddr; Trx_IpAddress gwnetmask; CORBA_char gwipmode; } Trx_InterfaceConfig; #if !defined(TC_IMPL_TC_Trx_InterfaceConfig_0) #define TC_IMPL_TC_Trx_InterfaceConfig_0 't' #define TC_IMPL_TC_Trx_InterfaceConfig_1 'r' #define TC_IMPL_TC_Trx_InterfaceConfig_2 'x' #define TC_IMPL_TC_Trx_InterfaceConfig_3 'c' #define TC_IMPL_TC_Trx_InterfaceConfig_4 't' #define TC_IMPL_TC_Trx_InterfaceConfig_5 'r' #define TC_IMPL_TC_Trx_InterfaceConfig_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_InterfaceConfig_struct; #define TC_Trx_InterfaceConfig ((CORBA_TypeCode)&TC_Trx_InterfaceConfig_struct) #endif extern Trx_InterfaceConfig *Trx_InterfaceConfig__alloc(void); extern gpointer Trx_InterfaceConfig__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_ModemDisconnectRxC_defined) #define _Trx_ModemDisconnectRxC_defined 1 typedef enum { Trx_mdisc_rxc_normal, Trx_mdisc_rxc_rxclock } Trx_ModemDisconnectRxC; #if !defined(TC_IMPL_TC_Trx_ModemDisconnectRxC_0) #define TC_IMPL_TC_Trx_ModemDisconnectRxC_0 't' #define TC_IMPL_TC_Trx_ModemDisconnectRxC_1 'r' #define TC_IMPL_TC_Trx_ModemDisconnectRxC_2 'x' #define TC_IMPL_TC_Trx_ModemDisconnectRxC_3 'c' #define TC_IMPL_TC_Trx_ModemDisconnectRxC_4 't' #define TC_IMPL_TC_Trx_ModemDisconnectRxC_5 'r' #define TC_IMPL_TC_Trx_ModemDisconnectRxC_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_ModemDisconnectRxC_struct; #define TC_Trx_ModemDisconnectRxC ((CORBA_TypeCode)&TC_Trx_ModemDisconnectRxC_struct) #endif #endif #if !defined(_Trx_ModemDisconnectTxC_defined) #define _Trx_ModemDisconnectTxC_defined 1 typedef enum { Trx_mdisc_txc_normal, Trx_mdisc_txc_txclock } Trx_ModemDisconnectTxC; #if !defined(TC_IMPL_TC_Trx_ModemDisconnectTxC_0) #define TC_IMPL_TC_Trx_ModemDisconnectTxC_0 't' #define TC_IMPL_TC_Trx_ModemDisconnectTxC_1 'r' #define TC_IMPL_TC_Trx_ModemDisconnectTxC_2 'x' #define TC_IMPL_TC_Trx_ModemDisconnectTxC_3 'c' #define TC_IMPL_TC_Trx_ModemDisconnectTxC_4 't' #define TC_IMPL_TC_Trx_ModemDisconnectTxC_5 'r' #define TC_IMPL_TC_Trx_ModemDisconnectTxC_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_ModemDisconnectTxC_struct; #define TC_Trx_ModemDisconnectTxC ((CORBA_TypeCode)&TC_Trx_ModemDisconnectTxC_struct) #endif #endif #if !defined(_Trx_ModemDisconnectTxD_defined) #define _Trx_ModemDisconnectTxD_defined 1 typedef enum { Trx_mdisc_txd_normal, Trx_mdisc_txd_txdata } Trx_ModemDisconnectTxD; #if !defined(TC_IMPL_TC_Trx_ModemDisconnectTxD_0) #define TC_IMPL_TC_Trx_ModemDisconnectTxD_0 't' #define TC_IMPL_TC_Trx_ModemDisconnectTxD_1 'r' #define TC_IMPL_TC_Trx_ModemDisconnectTxD_2 'x' #define TC_IMPL_TC_Trx_ModemDisconnectTxD_3 'c' #define TC_IMPL_TC_Trx_ModemDisconnectTxD_4 't' #define TC_IMPL_TC_Trx_ModemDisconnectTxD_5 'r' #define TC_IMPL_TC_Trx_ModemDisconnectTxD_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_ModemDisconnectTxD_struct; #define TC_Trx_ModemDisconnectTxD ((CORBA_TypeCode)&TC_Trx_ModemDisconnectTxD_struct) #endif #endif #if !defined(_Trx_ModemDisconnectConfig_defined) #define _Trx_ModemDisconnectConfig_defined 1 typedef struct { CORBA_unsigned_long output; CORBA_unsigned_long direction; Trx_ModemDisconnectRxC rxc; Trx_ModemDisconnectTxC txc; Trx_ModemDisconnectTxD txd; } Trx_ModemDisconnectConfig; #if !defined(TC_IMPL_TC_Trx_ModemDisconnectConfig_0) #define TC_IMPL_TC_Trx_ModemDisconnectConfig_0 't' #define TC_IMPL_TC_Trx_ModemDisconnectConfig_1 'r' #define TC_IMPL_TC_Trx_ModemDisconnectConfig_2 'x' #define TC_IMPL_TC_Trx_ModemDisconnectConfig_3 'c' #define TC_IMPL_TC_Trx_ModemDisconnectConfig_4 't' #define TC_IMPL_TC_Trx_ModemDisconnectConfig_5 'r' #define TC_IMPL_TC_Trx_ModemDisconnectConfig_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_ModemDisconnectConfig_struct; #define TC_Trx_ModemDisconnectConfig ((CORBA_TypeCode)&TC_Trx_ModemDisconnectConfig_struct) #endif extern Trx_ModemDisconnectConfig *Trx_ModemDisconnectConfig__alloc(void); extern gpointer Trx_ModemDisconnectConfig__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_TrxAudioState_defined) #define _Trx_TrxAudioState_defined 1 typedef struct { CORBA_unsigned_long samplerate; CORBA_unsigned_long micbufsz; CORBA_unsigned_long micbufptr; CORBA_unsigned_long spkbufsz; CORBA_unsigned_long spkbufptr; CORBA_float micsigpwr; CORBA_float spksigpwr; CORBA_float spknoisepwr; } Trx_TrxAudioState; #if !defined(TC_IMPL_TC_Trx_TrxAudioState_0) #define TC_IMPL_TC_Trx_TrxAudioState_0 't' #define TC_IMPL_TC_Trx_TrxAudioState_1 'r' #define TC_IMPL_TC_Trx_TrxAudioState_2 'x' #define TC_IMPL_TC_Trx_TrxAudioState_3 'c' #define TC_IMPL_TC_Trx_TrxAudioState_4 't' #define TC_IMPL_TC_Trx_TrxAudioState_5 'r' #define TC_IMPL_TC_Trx_TrxAudioState_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_TrxAudioState_struct; #define TC_Trx_TrxAudioState ((CORBA_TypeCode)&TC_Trx_TrxAudioState_struct) #endif extern Trx_TrxAudioState *Trx_TrxAudioState__alloc(void); extern gpointer Trx_TrxAudioState__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(ORBIT_DECL_CORBA_sequence_CORBA_octet) && !defined(_CORBA_sequence_CORBA_octet_defined) #define ORBIT_DECL_CORBA_sequence_CORBA_octet 1 #define _CORBA_sequence_CORBA_octet_defined 1 #define ORBIT_IMPL_CORBA_sequence_CORBA_octet_0 't' #define ORBIT_IMPL_CORBA_sequence_CORBA_octet_1 'r' #define ORBIT_IMPL_CORBA_sequence_CORBA_octet_2 'x' #define ORBIT_IMPL_CORBA_sequence_CORBA_octet_3 'c' #define ORBIT_IMPL_CORBA_sequence_CORBA_octet_4 't' #define ORBIT_IMPL_CORBA_sequence_CORBA_octet_5 'r' #define ORBIT_IMPL_CORBA_sequence_CORBA_octet_6 'l' typedef struct { CORBA_unsigned_long _maximum, _length; CORBA_octet *_buffer; CORBA_boolean _release; } CORBA_sequence_CORBA_octet; #if !defined(TC_IMPL_TC_CORBA_sequence_CORBA_octet_0) #define TC_IMPL_TC_CORBA_sequence_CORBA_octet_0 't' #define TC_IMPL_TC_CORBA_sequence_CORBA_octet_1 'r' #define TC_IMPL_TC_CORBA_sequence_CORBA_octet_2 'x' #define TC_IMPL_TC_CORBA_sequence_CORBA_octet_3 'c' #define TC_IMPL_TC_CORBA_sequence_CORBA_octet_4 't' #define TC_IMPL_TC_CORBA_sequence_CORBA_octet_5 'r' #define TC_IMPL_TC_CORBA_sequence_CORBA_octet_6 'l' extern const struct CORBA_TypeCode_struct TC_CORBA_sequence_CORBA_octet_struct; #define TC_CORBA_sequence_CORBA_octet ((CORBA_TypeCode)&TC_CORBA_sequence_CORBA_octet_struct) #endif extern CORBA_sequence_CORBA_octet *CORBA_sequence_CORBA_octet__alloc(void); extern gpointer CORBA_sequence_CORBA_octet__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ CORBA_octet *CORBA_sequence_CORBA_octet_allocbuf(CORBA_unsigned_long len); #endif #if !defined(_Trx_TrxAudioSamples_defined) #define _Trx_TrxAudioSamples_defined 1 typedef CORBA_sequence_CORBA_octet Trx_TrxAudioSamples; #if !defined(TC_IMPL_TC_Trx_TrxAudioSamples_0) #define TC_IMPL_TC_Trx_TrxAudioSamples_0 't' #define TC_IMPL_TC_Trx_TrxAudioSamples_1 'r' #define TC_IMPL_TC_Trx_TrxAudioSamples_2 'x' #define TC_IMPL_TC_Trx_TrxAudioSamples_3 'c' #define TC_IMPL_TC_Trx_TrxAudioSamples_4 't' #define TC_IMPL_TC_Trx_TrxAudioSamples_5 'r' #define TC_IMPL_TC_Trx_TrxAudioSamples_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_TrxAudioSamples_struct; #define TC_Trx_TrxAudioSamples ((CORBA_TypeCode)&TC_Trx_TrxAudioSamples_struct) #endif extern Trx_TrxAudioSamples *Trx_TrxAudioSamples__alloc(void); extern gpointer Trx_TrxAudioSamples__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(_Trx_TrxAudioParams_defined) #define _Trx_TrxAudioParams_defined 1 typedef struct { Trx_signalstrength rfsquelch; CORBA_boolean audiosquelch; } Trx_TrxAudioParams; #if !defined(TC_IMPL_TC_Trx_TrxAudioParams_0) #define TC_IMPL_TC_Trx_TrxAudioParams_0 't' #define TC_IMPL_TC_Trx_TrxAudioParams_1 'r' #define TC_IMPL_TC_Trx_TrxAudioParams_2 'x' #define TC_IMPL_TC_Trx_TrxAudioParams_3 'c' #define TC_IMPL_TC_Trx_TrxAudioParams_4 't' #define TC_IMPL_TC_Trx_TrxAudioParams_5 'r' #define TC_IMPL_TC_Trx_TrxAudioParams_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_TrxAudioParams_struct; #define TC_Trx_TrxAudioParams ((CORBA_TypeCode)&TC_Trx_TrxAudioParams_struct) #endif extern Trx_TrxAudioParams *Trx_TrxAudioParams__alloc(void); extern gpointer Trx_TrxAudioParams__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #define ex_Trx_TrxError "IDL:Trx/TrxError:1.0" void _ORBIT_Trx_TrxError_demarshal(GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev); void _ORBIT_Trx_TrxError_marshal(GIOPSendBuffer * _ORBIT_send_buffer, CORBA_Environment * ev); #if !defined(_Trx_TrxError_defined) #define _Trx_TrxError_defined 1 typedef struct { CORBA_char *reason; } Trx_TrxError; #if !defined(TC_IMPL_TC_Trx_TrxError_0) #define TC_IMPL_TC_Trx_TrxError_0 't' #define TC_IMPL_TC_Trx_TrxError_1 'r' #define TC_IMPL_TC_Trx_TrxError_2 'x' #define TC_IMPL_TC_Trx_TrxError_3 'c' #define TC_IMPL_TC_Trx_TrxError_4 't' #define TC_IMPL_TC_Trx_TrxError_5 'r' #define TC_IMPL_TC_Trx_TrxError_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_TrxError_struct; #define TC_Trx_TrxError ((CORBA_TypeCode)&TC_Trx_TrxError_struct) #endif extern Trx_TrxError *Trx_TrxError__alloc(void); extern gpointer Trx_TrxError__free(gpointer mem, gpointer dat, CORBA_boolean free_strings); /* ORBit internal use */ #endif #if !defined(ORBIT_DECL_Trx_Control) && !defined(_Trx_Control_defined) #define ORBIT_DECL_Trx_Control 1 #define _Trx_Control_defined 1 #define Trx_Control__free CORBA_Object__free typedef CORBA_Object Trx_Control; extern CORBA_unsigned_long Trx_Control__classid; #if !defined(TC_IMPL_TC_Trx_Control_0) #define TC_IMPL_TC_Trx_Control_0 't' #define TC_IMPL_TC_Trx_Control_1 'r' #define TC_IMPL_TC_Trx_Control_2 'x' #define TC_IMPL_TC_Trx_Control_3 'c' #define TC_IMPL_TC_Trx_Control_4 't' #define TC_IMPL_TC_Trx_Control_5 'r' #define TC_IMPL_TC_Trx_Control_6 'l' extern const struct CORBA_TypeCode_struct TC_Trx_Control_struct; #define TC_Trx_Control ((CORBA_TypeCode)&TC_Trx_Control_struct) #endif #endif /** POA structures **/ typedef struct { void *_private; void (*GetDescription) (PortableServer_Servant _servant, Trx_TrxDescription ** desc, CORBA_Environment * ev); void (*GetState) (PortableServer_Servant _servant, Trx_TrxState * state, CORBA_Environment * ev); void (*SetPTT) (PortableServer_Servant _servant, const CORBA_boolean ptt, CORBA_Environment * ev); void (*SetFrequency) (PortableServer_Servant _servant, const Trx_frequency rx, const Trx_frequency tx, CORBA_Environment * ev); void (*UartSend) (PortableServer_Servant _servant, const CORBA_char * str, CORBA_Environment * ev); void (*UartReceive) (PortableServer_Servant _servant, CORBA_unsigned_long * ptr, CORBA_char ** str, CORBA_Environment * ev); void (*BaycomUSBAdapterGetConfig) (PortableServer_Servant _servant, Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev); void (*BaycomUSBAdapterSetConfig) (PortableServer_Servant _servant, const Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev); void (*BaycomUSBAdapterGetAudioDevices) (PortableServer_Servant _servant, Trx_BaycomUSBAdapterAudioDevs ** devs, CORBA_Environment * ev); void (*ChannelAccessGetConfig) (PortableServer_Servant _servant, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev); void (*ChannelAccessSetConfig) (PortableServer_Servant _servant, const Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev); void (*InterfaceGetConfig) (PortableServer_Servant _servant, Trx_InterfaceConfig * cfg, CORBA_Environment * ev); void (*InterfaceSetConfig) (PortableServer_Servant _servant, const Trx_InterfaceConfig * cfg, CORBA_Environment * ev); void (*ModemDisconnectGetConfig) (PortableServer_Servant _servant, Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev); void (*ModemDisconnectSetConfig) (PortableServer_Servant _servant, const Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev); void (*GetAudioState) (PortableServer_Servant _servant, Trx_TrxAudioState * state, CORBA_Environment * ev); void (*GetAudioMicSamples) (PortableServer_Servant _servant, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev); void (*GetAudioSpkSamples) (PortableServer_Servant _servant, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev); void (*SetAudioDTMF) (PortableServer_Servant _servant, const CORBA_long ch, CORBA_Environment * ev); void (*SetAudioParams) (PortableServer_Servant _servant, const Trx_TrxAudioParams * params, CORBA_Environment * ev); } POA_Trx_Control__epv; typedef struct { PortableServer_ServantBase__epv *_base_epv; POA_Trx_Control__epv *Trx_Control_epv; } POA_Trx_Control__vepv; typedef struct { void *_private; POA_Trx_Control__vepv *vepv; } POA_Trx_Control; extern void POA_Trx_Control__init(PortableServer_Servant servant, CORBA_Environment * ev); extern void POA_Trx_Control__fini(PortableServer_Servant servant, CORBA_Environment * ev); /** prototypes **/ void Trx_Control_GetDescription(Trx_Control _obj, Trx_TrxDescription ** desc, CORBA_Environment * ev); void Trx_Control_GetState(Trx_Control _obj, Trx_TrxState * state, CORBA_Environment * ev); void Trx_Control_SetPTT(Trx_Control _obj, const CORBA_boolean ptt, CORBA_Environment * ev); void Trx_Control_SetFrequency(Trx_Control _obj, const Trx_frequency rx, const Trx_frequency tx, CORBA_Environment * ev); void Trx_Control_UartSend(Trx_Control _obj, const CORBA_char * str, CORBA_Environment * ev); void Trx_Control_UartReceive(Trx_Control _obj, CORBA_unsigned_long * ptr, CORBA_char ** str, CORBA_Environment * ev); void Trx_Control_BaycomUSBAdapterGetConfig(Trx_Control _obj, Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev); void Trx_Control_BaycomUSBAdapterSetConfig(Trx_Control _obj, const Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev); void Trx_Control_BaycomUSBAdapterGetAudioDevices(Trx_Control _obj, Trx_BaycomUSBAdapterAudioDevs ** devs, CORBA_Environment * ev); void Trx_Control_ChannelAccessGetConfig(Trx_Control _obj, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev); void Trx_Control_ChannelAccessSetConfig(Trx_Control _obj, const Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev); void Trx_Control_InterfaceGetConfig(Trx_Control _obj, Trx_InterfaceConfig * cfg, CORBA_Environment * ev); void Trx_Control_InterfaceSetConfig(Trx_Control _obj, const Trx_InterfaceConfig * cfg, CORBA_Environment * ev); void Trx_Control_ModemDisconnectGetConfig(Trx_Control _obj, Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev); void Trx_Control_ModemDisconnectSetConfig(Trx_Control _obj, const Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev); void Trx_Control_GetAudioState(Trx_Control _obj, Trx_TrxAudioState * state, CORBA_Environment * ev); void Trx_Control_GetAudioMicSamples(Trx_Control _obj, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev); void Trx_Control_GetAudioSpkSamples(Trx_Control _obj, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev); void Trx_Control_SetAudioDTMF(Trx_Control _obj, const CORBA_long ch, CORBA_Environment * ev); void Trx_Control_SetAudioParams(Trx_Control _obj, const Trx_TrxAudioParams * params, CORBA_Environment * ev); void _ORBIT_skel_Trx_Control_GetDescription(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetDescription) (PortableServer_Servant _servant, Trx_TrxDescription ** desc, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_GetState(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetState) (PortableServer_Servant _servant, Trx_TrxState * state, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_SetPTT(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_SetPTT) (PortableServer_Servant _servant, const CORBA_boolean ptt, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_SetFrequency(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_SetFrequency) (PortableServer_Servant _servant, const Trx_frequency rx, const Trx_frequency tx, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_UartSend(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_UartSend) (PortableServer_Servant _servant, const CORBA_char * str, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_UartReceive(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_UartReceive) (PortableServer_Servant _servant, CORBA_unsigned_long * ptr, CORBA_char ** str, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_BaycomUSBAdapterGetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_BaycomUSBAdapterGetConfig) (PortableServer_Servant _servant, Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_BaycomUSBAdapterSetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_BaycomUSBAdapterSetConfig) (PortableServer_Servant _servant, const Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_BaycomUSBAdapterGetAudioDevices(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_BaycomUSBAdapterGetAudioDevices) (PortableServer_Servant _servant, Trx_BaycomUSBAdapterAudioDevs ** devs, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_ChannelAccessGetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_ChannelAccessGetConfig) (PortableServer_Servant _servant, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_ChannelAccessSetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_ChannelAccessSetConfig) (PortableServer_Servant _servant, const Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_InterfaceGetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_InterfaceGetConfig) (PortableServer_Servant _servant, Trx_InterfaceConfig * cfg, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_InterfaceSetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_InterfaceSetConfig) (PortableServer_Servant _servant, const Trx_InterfaceConfig * cfg, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_ModemDisconnectGetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_ModemDisconnectGetConfig) (PortableServer_Servant _servant, Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_ModemDisconnectSetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_ModemDisconnectSetConfig) (PortableServer_Servant _servant, const Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_GetAudioState(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetAudioState) (PortableServer_Servant _servant, Trx_TrxAudioState * state, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_GetAudioMicSamples(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetAudioMicSamples) (PortableServer_Servant _servant, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_GetAudioSpkSamples(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetAudioSpkSamples) (PortableServer_Servant _servant, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_SetAudioDTMF(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_SetAudioDTMF) (PortableServer_Servant _servant, const CORBA_long ch, CORBA_Environment * ev)); void _ORBIT_skel_Trx_Control_SetAudioParams(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_SetAudioParams) (PortableServer_Servant _servant, const Trx_TrxAudioParams * params, CORBA_Environment * ev)); #ifdef __cplusplus } #endif /* __cplusplus */ #endif #undef ORBIT_IDL_SERIAL baycomusb-0.10.orig/trxapi/trxapi.h0100644000175100017510000001572107340452755015420 0ustar abaaba/*****************************************************************************/ /* * trxapi.h -- Transceiver control API. * * Copyright (C) 2000, 2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifndef _TRXAPI_H #define _TRXAPI_H /* --------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "sysdeps.h" //#include "trxctrl.h" /* --------------------------------------------------------------------- */ typedef u_int64_t trxapi_frequency_t; typedef float trxapi_signalstrength_t; struct trxapi_banddescription { trxapi_frequency_t low; /* lower band edge */ trxapi_frequency_t high; /* upper band edge */ trxapi_frequency_t step; /* step size */ }; struct trxapi_description { char manufacturer[256]; /* transceiver manufacturer */ char model[256]; /* model number */ char copyright[256]; char instid[16]; /* serial number or similar */ unsigned int nrrxbands; struct trxapi_banddescription *rxbands; unsigned int nrtxbands; struct trxapi_banddescription *txbands; trxapi_signalstrength_t rssimin; trxapi_signalstrength_t rssimax; }; typedef enum { trxapi_mode_unspec, trxapi_mode_packet, trxapi_mode_audio } trxapi_mode_t; struct trxapi_state { trxapi_mode_t mode; trxapi_frequency_t rxfreq; trxapi_frequency_t txfreq; unsigned int ptt : 1; unsigned int manualptt : 1; unsigned int dcd : 1; trxapi_signalstrength_t rssi; }; typedef enum { trxapi_baycomusb_mode_fsk, trxapi_baycomusb_mode_external, trxapi_baycomusb_mode_afsk, trxapi_baycomusb_mode_audio } trxapi_baycomusb_mode_t; typedef enum { trxapi_baycomusb_loopback_off, trxapi_baycomusb_loopback_scrambler, trxapi_baycomusb_loopback_modem } trxapi_baycomusb_loopback_t; typedef char trxapi_audiodevice_t[64]; struct trxapi_baycomusb_adapter_config { trxapi_baycomusb_mode_t mode; unsigned long fclk; unsigned long bitraterx; unsigned long bitratetx; trxapi_baycomusb_loopback_t loopback; unsigned int pttmute : 1; unsigned long filtmode; /* audio stuff */ unsigned long samplerate; float gain; trxapi_audiodevice_t audiodevin; trxapi_audiodevice_t audiodevout; trxapi_signalstrength_t rfsquelch; unsigned int audiosquelch : 1; }; struct trxapi_baycomusb_adapter_audio_devs { unsigned int nraudiodevsin; trxapi_audiodevice_t *audiodevsin; unsigned int nraudiodevsout; trxapi_audiodevice_t *audiodevsout; }; struct trxapi_channel_access_config { unsigned long txdelay; unsigned long slottime; unsigned long ppersistence; unsigned long txtail; unsigned int fullduplex : 1; }; typedef u_int8_t trxapi_ip_address_t[4]; struct trxapi_interface_config { char ifname[16]; char hwaddr[16]; trxapi_ip_address_t ipaddr; trxapi_ip_address_t netmask; trxapi_ip_address_t broadcast; char gwhwaddr[128]; trxapi_ip_address_t gwipaddr; trxapi_ip_address_t gwnetmask; char gwipmode; }; typedef enum { trxapi_modem_disconnect_rxc_normal, trxapi_modem_disconnect_rxc_rxclock } trxapi_modem_disconnect_rxc_mode_t; typedef enum { trxapi_modem_disconnect_txc_normal, trxapi_modem_disconnect_txc_txclock } trxapi_modem_disconnect_txc_mode_t; typedef enum { trxapi_modem_disconnect_txd_normal, trxapi_modem_disconnect_txd_txdata } trxapi_modem_disconnect_txd_mode_t; struct trxapi_modem_disconnect_config { unsigned long output; unsigned long direction; trxapi_modem_disconnect_rxc_mode_t rxc; trxapi_modem_disconnect_txc_mode_t txc; trxapi_modem_disconnect_txd_mode_t txd; }; struct trxapi_audio_state { unsigned long samplerate; unsigned long micbufsz; unsigned long micbufptr; unsigned long spkbufsz; unsigned long spkbufptr; float micsigpwr; float spksigpwr; float spknoisepwr; }; struct trxapi; /* --------------------------------------------------------------------- */ extern int trxapi_init(int *argc, char **argv); extern struct trxapi *trxapi_open_byindex(unsigned int index); extern void trxapi_close(struct trxapi *api); extern const struct trxapi_description *trxapi_get_description(struct trxapi *api); extern int trxapi_get_state(struct trxapi *api, struct trxapi_state *state); extern int trxapi_set_ptt(struct trxapi *api, unsigned int ptt); extern int trxapi_set_frequency(struct trxapi *api, trxapi_frequency_t rx, trxapi_frequency_t tx); /* Raw UART */ extern int trxapi_uart_send(struct trxapi *api, const char *str); extern int trxapi_uart_receive(struct trxapi *api, unsigned long *ptr, char *str, unsigned int strsz); /* Configuration stuff */ extern int trxapi_baycomusb_adapter_get_config(struct trxapi *api, struct trxapi_baycomusb_adapter_config *cfg); extern int trxapi_baycomusb_adapter_set_config(struct trxapi *api, const struct trxapi_baycomusb_adapter_config *cfg); extern const struct trxapi_baycomusb_adapter_audio_devs *trxapi_baycomusb_adapter_get_audiodevices(struct trxapi *api); extern int trxapi_channel_access_get_config(struct trxapi *api, struct trxapi_channel_access_config *cfg); extern int trxapi_channel_access_set_config(struct trxapi *api, const struct trxapi_channel_access_config *cfg); extern int trxapi_interface_get_config(struct trxapi *api, struct trxapi_interface_config *cfg); extern int trxapi_interface_set_config(struct trxapi *api, const struct trxapi_interface_config *cfg); extern int trxapi_modem_disconnect_get_config(struct trxapi *api, struct trxapi_modem_disconnect_config *cfg); extern int trxapi_modem_disconnect_set_config(struct trxapi *api, const struct trxapi_modem_disconnect_config *cfg); /* Audio Stuff */ extern int trxapi_get_audio_state(struct trxapi *api, struct trxapi_audio_state *state); extern int trxapi_get_audio_mic_samples(struct trxapi *api, unsigned long ptr, unsigned long len, unsigned char *samples); extern int trxapi_get_audio_spk_samples(struct trxapi *api, unsigned long ptr, unsigned long len, unsigned char *samples); extern int trxapi_set_audio_dtmf(struct trxapi *api, long ch); /* --------------------------------------------------------------------- */ #endif /* _TRXAPI_H */ baycomusb-0.10.orig/trxapi/client.c0100644000175100017510000005633707340455672015373 0ustar abaaba/*****************************************************************************/ /* * client.c -- Transceiver control client (UNIX only). * * Copyright (C) 2000, 2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "trxapi.h" #include #include #if defined(WIN32) #include #else #include #endif #include "trxctrl.h" #include "trx.h" /* --------------------------------------------------------------------- */ struct trxapi { struct trxapi_description *desc; struct trxapi_baycomusb_adapter_audio_devs *audiodevs; Trx_Control obj; }; #define VERBOSE #ifdef VERBOSE #define verbose(x) x #else #define verbose(x) #endif static CORBA_ORB trx_orb; /* --------------------------------------------------------------------- */ static int printexception(const char *routine, CORBA_Environment *ev) { if (!ev || ev->_major == CORBA_NO_EXCEPTION) return 0; if (ev->_major == CORBA_USER_EXCEPTION && !strcmp(CORBA_exception_id(ev), ex_Trx_TrxError)) { lprintf(10, "CORBA exception in %s: %s (%s)\n", routine, CORBA_exception_id(ev), ((Trx_TrxError *)CORBA_exception_value(ev))->reason); CORBA_exception_free(ev); return -1; } lprintf(10, "CORBA exception in %s: %s\n", routine, CORBA_exception_id(ev)); CORBA_exception_free(ev); return -1; } static inline Trx_Control ior_to_obj(const char *ior) { CORBA_Environment ev; Trx_Control obj; Trx_TrxDescription *desc; CORBA_exception_init(&ev); obj = CORBA_ORB_string_to_object(trx_orb, (char *)ior, &ev); if (ev._major != CORBA_NO_EXCEPTION) { verbose(lprintf(0, "Error: trx_resolve_byindex: %s %s\n", ior, CORBA_exception_id(&ev))); CORBA_exception_free(&ev); return NULL; } Trx_Control_GetDescription(obj, &desc, &ev); if (ev._major != CORBA_NO_EXCEPTION) { verbose(lprintf(0, "Error: trx_resolve_byindex: (GetDescription) %s %s\n", ior, CORBA_exception_id(&ev))); CORBA_exception_free(&ev); CORBA_Object_release(obj, &ev); return NULL; } verbose(lprintf(0, "trx_resolve_byindex: %s mfg %s model %s instid %s\n", ior, desc->manufacturer, desc->model, desc->instid)); CORBA_free(desc); CORBA_exception_free(&ev); return obj; } /* --------------------------------------------------------------------- */ #if defined(WIN32) extern void win32shmem_runserver(void); static Trx_Control trx_resolve_byindex(unsigned int index) { Trx_Control obj; HKEY key, key2; DWORD err, i, bufsz, dt; CORBA_Environment ev; char buf[512]; win32shmem_runserver(); if ((err = RegOpenKeyEx(IORREGHKEY, IORREGPATH, 0, KEY_ENUMERATE_SUB_KEYS, &key)) != ERROR_SUCCESS) { lprintf(0, "RegOpenKeyEx(" IORREGPATH ") returned 0x%lx\n", err); return CORBA_OBJECT_NIL; } for (i = 0;; i++) { bufsz = sizeof(buf); err = RegEnumKeyEx(key, i, buf, &bufsz, NULL, NULL, NULL, NULL); if (err != ERROR_SUCCESS) { RegCloseKey(key); return NULL; } if (RegOpenKeyEx(key, buf, 0, KEY_ALL_ACCESS, &key2) != ERROR_SUCCESS) continue; bufsz = sizeof(buf); if (RegQueryValueEx(key2, "IOR", NULL, &dt, buf, &bufsz) != ERROR_SUCCESS) { RegCloseKey(key2); continue; } RegCloseKey(key2); if (dt != REG_SZ) { continue; } if ((obj = ior_to_obj(buf))) { if (index) { index--; CORBA_exception_init(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); continue; } RegCloseKey(key); return obj; } } } #else static Trx_Control trx_resolve_byindex(unsigned int index) { CORBA_Environment ev; DIR *dir; struct dirent *de; Trx_Control obj; char buf[1024]; char buf2[1024]; FILE *f; char *cp; if (!(dir = opendir(IORIDPATH))) return NULL; for (;;) { if (!(de = readdir(dir))) { closedir(dir); return NULL; } snprintf(buf, sizeof(buf), "%s/%s", IORIDPATH, de->d_name); if (!(f = fopen(buf, "r"))) continue; if (!fgets(buf2, sizeof(buf2), f)) { fclose(f); continue; } fclose(f); if (strncmp(buf2, "IOR", 3)) continue; if ((cp = strchr(buf2, '\n'))) *cp = 0; printf("IOR: %s\n", buf2); if ((obj = ior_to_obj(buf2))) { if (index) { index--; CORBA_exception_init(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); continue; } closedir(dir); return obj; } } } #endif /* --------------------------------------------------------------------- */ int trxapi_init(int *argc, char **argv) { CORBA_Environment ev; CORBA_exception_init(&ev); trx_orb = CORBA_ORB_init(argc, argv, "orbit-local-orb", &ev); if (ev._major != CORBA_NO_EXCEPTION) { verbose(lprintf(0, "Error: trx_initorb: %s\n", CORBA_exception_id(&ev))); CORBA_exception_free(&ev); return -1; } return 0; } struct trxapi *trxapi_open_byindex(unsigned int index) { CORBA_Environment ev; Trx_TrxDescription *desc; Trx_BaycomUSBAdapterAudioDevs *audiodevs; struct trxapi_description *d; struct trxapi_baycomusb_adapter_audio_devs *ad; struct trxapi *api; unsigned int i; if (!(api = calloc(1, sizeof(struct trxapi)))) return api; if (!(api->obj = trx_resolve_byindex(index))) { free(api); return NULL; } /* retrieve description */ CORBA_exception_init(&ev); Trx_Control_GetDescription(api->obj, &desc, &ev); if (printexception("Trx_Control_GetDescription", &ev)) goto errdesc; if (!(d = calloc(1, sizeof(struct trxapi_description) + (desc->rxbands._length + desc->txbands._length) * sizeof(struct trxapi_banddescription)))) { CORBA_free(desc); goto errdesc; } api->desc = d; d->rxbands = (struct trxapi_banddescription *)(d + 1); d->txbands = &d->rxbands[desc->rxbands._length]; strncpy(d->manufacturer, desc->manufacturer, sizeof(d->manufacturer)); d->manufacturer[sizeof(d->manufacturer)-1] = 0; strncpy(d->model, desc->model, sizeof(d->model)); d->model[sizeof(d->model)-1] = 0; strncpy(d->copyright, desc->copyright, sizeof(d->copyright)); d->copyright[sizeof(d->copyright)-1] = 0; strncpy(d->instid, desc->instid, sizeof(d->instid)); d->instid[sizeof(d->instid)-1] = 0; d->nrrxbands = desc->rxbands._length; d->nrtxbands = desc->txbands._length; d->rssimin = desc->rssimin; d->rssimax = desc->rssimax; for (i = 0; i < d->nrrxbands; i++) { d->rxbands[i].low = desc->rxbands._buffer[i].low; d->rxbands[i].high = desc->rxbands._buffer[i].high; d->rxbands[i].step = desc->rxbands._buffer[i].step; } for (i = 0; i < d->nrtxbands; i++) { d->txbands[i].low = desc->txbands._buffer[i].low; d->txbands[i].high = desc->txbands._buffer[i].high; d->txbands[i].step = desc->txbands._buffer[i].step; } CORBA_free(desc); errdesc: /* retrieve audio devs */ CORBA_exception_init(&ev); Trx_Control_BaycomUSBAdapterGetAudioDevices(api->obj, &audiodevs, &ev); if (printexception("Trx_Control_BaycomUSBAdapterGetAudioDevices", &ev)) goto erraudiodevs; if (!(ad = calloc(1, sizeof(struct trxapi_baycomusb_adapter_audio_devs) + audiodevs->audiodevsin._length * sizeof(trxapi_audiodevice_t) + audiodevs->audiodevsout._length * sizeof(trxapi_audiodevice_t)))) { CORBA_free(desc); goto erraudiodevs; } api->audiodevs = ad; ad->audiodevsin = (void *)(ad + 1); ad->nraudiodevsin = audiodevs->audiodevsin._length; ad->audiodevsout = &ad->audiodevsin[ad->nraudiodevsin]; ad->nraudiodevsout = audiodevs->audiodevsout._length; for (i = 0; i < ad->nraudiodevsin; i++) { strncpy(ad->audiodevsin[i], audiodevs->audiodevsin._buffer[i], sizeof(ad->audiodevsin[i])); ad->audiodevsin[i][sizeof(ad->audiodevsin[i])-1] = 0; } for (i = 0; i < ad->nraudiodevsout; i++) { strncpy(ad->audiodevsout[i], audiodevs->audiodevsout._buffer[i], sizeof(ad->audiodevsout[i])); ad->audiodevsout[i][sizeof(ad->audiodevsout[i])-1] = 0; } CORBA_free(audiodevs); erraudiodevs: return api; err: trxapi_close(api); return NULL; } void trxapi_close(struct trxapi *api) { CORBA_Environment ev; if (!api) return; if (api->desc) free(api->desc); if (api->audiodevs) free(api->audiodevs); CORBA_exception_init(&ev); CORBA_Object_release(api->obj, &ev); CORBA_exception_free(&ev); free(api); } const struct trxapi_description *trxapi_get_description(struct trxapi *api) { if (!api) return NULL; return api->desc; } int trxapi_get_state(struct trxapi *api, struct trxapi_state *state) { CORBA_Environment ev; Trx_TrxState status; if (!state || !api) return -1; CORBA_exception_init(&ev); Trx_Control_GetState(api->obj, &status, &ev); if (printexception("Trx_Control_GetState", &ev)) return -1; switch (status.mode) { case Trx_trxpacket: state->mode = trxapi_mode_packet; break; case Trx_trxaudio: state->mode = trxapi_mode_audio; break; default: state->mode = trxapi_mode_unspec; }; state->rxfreq = status.rxfreq; state->txfreq = status.txfreq; state->ptt = status.ptt; state->manualptt = status.manualptt; state->dcd = status.dcd; state->rssi = status.rssi; return 0; } int trxapi_set_ptt(struct trxapi *api, unsigned int ptt) { CORBA_Environment ev; if (!api) return -1; CORBA_exception_init(&ev); Trx_Control_SetPTT(api->obj, !!ptt, &ev); return printexception("Trx_Control_SetPTT", &ev); } int trxapi_set_frequency(struct trxapi *api, trxapi_frequency_t rx, trxapi_frequency_t tx) { CORBA_Environment ev; if (!api) return -1; CORBA_exception_init(&ev); Trx_Control_SetFrequency(api->obj, rx, tx, &ev); return printexception("Trx_Control_SetFrequency", &ev); } /* Raw UART */ int trxapi_uart_send(struct trxapi *api, const char *str) { CORBA_Environment ev; if (!api || !str) return -1; CORBA_exception_init(&ev); Trx_Control_UartSend(api->obj, str, &ev); return printexception("Trx_Control_UartSend", &ev); } int trxapi_uart_receive(struct trxapi *api, unsigned long *ptr, char *str, unsigned int strsz) { CORBA_char *uartstr; CORBA_unsigned_long rxuartptr; CORBA_Environment ev; unsigned int len; if (!api || !str || !ptr || strsz < 2) return -1; str[0] = 0; rxuartptr = *ptr; CORBA_exception_init(&ev); Trx_Control_UartReceive(api->obj, &rxuartptr, &uartstr, &ev); if (printexception("Trx_Control_UartReceive", &ev)) return -1; len = strlen(uartstr); if (len >= strsz) { rxuartptr -= (len - strsz + 1); len = strsz - 1; } *ptr = rxuartptr; memcpy(str, uartstr, len); str[len] = 0; CORBA_free(uartstr); return 0; } /* Configuration stuff */ int trxapi_baycomusb_adapter_get_config(struct trxapi *api, struct trxapi_baycomusb_adapter_config *cfg) { Trx_BaycomUSBAdapterConfig adaptcfg; CORBA_Environment ev; if (!api || !cfg) return -1; CORBA_exception_init(&ev); Trx_Control_BaycomUSBAdapterGetConfig(api->obj, &adaptcfg, &ev); if (printexception("Trx_Control_BaycomUSBAdapterGetConfig", &ev)) return -1; switch (adaptcfg.mode) { default: cfg->mode = trxapi_baycomusb_mode_fsk; break; case Trx_external: cfg->mode = trxapi_baycomusb_mode_external; break; case Trx_afsk: cfg->mode = trxapi_baycomusb_mode_afsk; break; case Trx_audio: cfg->mode = trxapi_baycomusb_mode_audio; break; } cfg->fclk = adaptcfg.fclk; cfg->bitraterx = adaptcfg.bitraterx; cfg->bitratetx = adaptcfg.bitratetx; switch (adaptcfg.loopback) { default: cfg->loopback = trxapi_baycomusb_loopback_off; break; case Trx_loopback_scrambler: cfg->loopback = trxapi_baycomusb_loopback_scrambler; break; case Trx_loopback_modem: cfg->loopback = trxapi_baycomusb_loopback_modem; break; } cfg->pttmute = adaptcfg.pttmute; cfg->filtmode = adaptcfg.filtmode; /* audio stuff */ cfg->samplerate = adaptcfg.samplerate; cfg->gain = adaptcfg.gain; strncpy(cfg->audiodevin, adaptcfg.audiodevin, sizeof(cfg->audiodevin)); cfg->audiodevin[sizeof(cfg->audiodevin)-1] = 0; strncpy(cfg->audiodevout, adaptcfg.audiodevout, sizeof(cfg->audiodevout)); cfg->audiodevout[sizeof(cfg->audiodevout)-1] = 0; cfg->rfsquelch = adaptcfg.rfsquelch; cfg->audiosquelch = adaptcfg.audiosquelch; return 0; } int trxapi_baycomusb_adapter_set_config(struct trxapi *api, const struct trxapi_baycomusb_adapter_config *cfg) { Trx_BaycomUSBAdapterConfig adaptcfg; CORBA_Environment ev; if (!api || !cfg) return -1; switch (cfg->mode) { default: adaptcfg.mode = Trx_fsk; break; case trxapi_baycomusb_mode_external: adaptcfg.mode = Trx_external; break; case trxapi_baycomusb_mode_afsk: adaptcfg.mode = Trx_afsk; break; case trxapi_baycomusb_mode_audio: adaptcfg.mode = Trx_audio; break; } adaptcfg.fclk = cfg->fclk; adaptcfg.bitraterx = cfg->bitraterx; adaptcfg.bitratetx = cfg->bitratetx; switch (cfg->loopback) { default: adaptcfg.loopback = Trx_loopback_off; break; case trxapi_baycomusb_loopback_scrambler: adaptcfg.loopback = Trx_loopback_scrambler; break; case trxapi_baycomusb_loopback_modem: adaptcfg.loopback = Trx_loopback_modem; break; } adaptcfg.pttmute = cfg->pttmute ? CORBA_TRUE : CORBA_FALSE; adaptcfg.filtmode = cfg->filtmode; /* audio stuff */ adaptcfg.samplerate = cfg->samplerate; adaptcfg.gain = cfg->gain; strncpy(adaptcfg.audiodevin, cfg->audiodevin, sizeof(adaptcfg.audiodevin)); adaptcfg.audiodevin[sizeof(adaptcfg.audiodevin)-1] = 0; strncpy(adaptcfg.audiodevout, cfg->audiodevout, sizeof(adaptcfg.audiodevout)); adaptcfg.audiodevout[sizeof(adaptcfg.audiodevout)-1] = 0; adaptcfg.rfsquelch = cfg->rfsquelch; adaptcfg.audiosquelch = cfg->audiosquelch; CORBA_exception_init(&ev); Trx_Control_BaycomUSBAdapterSetConfig(api->obj, &adaptcfg, &ev); return printexception("Trx_Control_BaycomUSBAdapterSetConfig", &ev); } const struct trxapi_baycomusb_adapter_audio_devs *trxapi_baycomusb_adapter_get_audiodevices(struct trxapi *api) { if (!api) return NULL; return api->audiodevs; } int trxapi_channel_access_get_config(struct trxapi *api, struct trxapi_channel_access_config *cfg) { Trx_ChannelAccessConfig chacccfg; CORBA_Environment ev; if (!api || !cfg) return -1; CORBA_exception_init(&ev); Trx_Control_ChannelAccessGetConfig(api->obj, &chacccfg, &ev); if (printexception("Trx_Control_ChannelAccessGetConfig", &ev)) return -1; cfg->txdelay = chacccfg.txdelay; cfg->slottime = chacccfg.slottime; cfg->ppersistence = chacccfg.ppersistence; cfg->txtail = chacccfg.txtail; cfg->fullduplex = chacccfg.fullduplex; return 0; } int trxapi_channel_access_set_config(struct trxapi *api, const struct trxapi_channel_access_config *cfg) { Trx_ChannelAccessConfig chacccfg; CORBA_Environment ev; if (!api || !cfg) return -1; chacccfg.txdelay = cfg->txdelay; chacccfg.slottime = cfg->slottime; chacccfg.ppersistence = cfg->ppersistence; chacccfg.txtail = cfg->txtail; chacccfg.fullduplex = cfg->fullduplex ? CORBA_TRUE : CORBA_FALSE; CORBA_exception_init(&ev); Trx_Control_ChannelAccessSetConfig(api->obj, &chacccfg, &ev); if (printexception("Trx_Control_ChannelAccessSetConfig", &ev)) return -1; return 0; } int trxapi_interface_get_config(struct trxapi *api, struct trxapi_interface_config *cfg) { Trx_InterfaceConfig ifcfg; CORBA_Environment ev; if (!api || !cfg) return -1; CORBA_exception_init(&ev); Trx_Control_InterfaceGetConfig(api->obj, &ifcfg, &ev); if (printexception("Trx_Control_InterfaceGetConfig", &ev)) return -1; strncpy(cfg->ifname, ifcfg.ifname, sizeof(cfg->ifname)); cfg->ifname[sizeof(cfg->ifname)-1] = 0; strncpy(cfg->hwaddr, ifcfg.hwaddr, sizeof(cfg->hwaddr)); cfg->hwaddr[sizeof(cfg->hwaddr)-1] = 0; cfg->ipaddr[0] = ifcfg.ipaddr[0]; cfg->ipaddr[1] = ifcfg.ipaddr[1]; cfg->ipaddr[2] = ifcfg.ipaddr[2]; cfg->ipaddr[3] = ifcfg.ipaddr[3]; cfg->netmask[0] = ifcfg.netmask[0]; cfg->netmask[1] = ifcfg.netmask[1]; cfg->netmask[2] = ifcfg.netmask[2]; cfg->netmask[3] = ifcfg.netmask[3]; cfg->broadcast[0] = ifcfg.broadcast[0]; cfg->broadcast[1] = ifcfg.broadcast[1]; cfg->broadcast[2] = ifcfg.broadcast[2]; cfg->broadcast[3] = ifcfg.broadcast[3]; strncpy(cfg->gwhwaddr, ifcfg.gwhwaddr, sizeof(cfg->gwhwaddr)); cfg->gwhwaddr[sizeof(cfg->gwhwaddr)-1] = 0; cfg->gwipaddr[0] = ifcfg.gwipaddr[0]; cfg->gwipaddr[1] = ifcfg.gwipaddr[1]; cfg->gwipaddr[2] = ifcfg.gwipaddr[2]; cfg->gwipaddr[3] = ifcfg.gwipaddr[3]; cfg->gwnetmask[0] = ifcfg.gwnetmask[0]; cfg->gwnetmask[1] = ifcfg.gwnetmask[1]; cfg->gwnetmask[2] = ifcfg.gwnetmask[2]; cfg->gwnetmask[3] = ifcfg.gwnetmask[3]; cfg->gwipmode = ifcfg.gwipmode; return 0; } int trxapi_interface_set_config(struct trxapi *api, const struct trxapi_interface_config *cfg) { Trx_InterfaceConfig ifcfg; CORBA_Environment ev; if (!api || !cfg) return -1; strncpy(ifcfg.ifname, cfg->ifname, sizeof(ifcfg.ifname)); ifcfg.ifname[sizeof(ifcfg.ifname)-1] = 0; strncpy(ifcfg.hwaddr, cfg->hwaddr, sizeof(ifcfg.hwaddr)); ifcfg.hwaddr[sizeof(ifcfg.hwaddr)-1] = 0; ifcfg.ipaddr[0] = cfg->ipaddr[0]; ifcfg.ipaddr[1] = cfg->ipaddr[1]; ifcfg.ipaddr[2] = cfg->ipaddr[2]; ifcfg.ipaddr[3] = cfg->ipaddr[3]; ifcfg.netmask[0] = cfg->netmask[0]; ifcfg.netmask[1] = cfg->netmask[1]; ifcfg.netmask[2] = cfg->netmask[2]; ifcfg.netmask[3] = cfg->netmask[3]; ifcfg.broadcast[0] = cfg->broadcast[0]; ifcfg.broadcast[1] = cfg->broadcast[1]; ifcfg.broadcast[2] = cfg->broadcast[2]; ifcfg.broadcast[3] = cfg->broadcast[3]; strncpy(ifcfg.gwhwaddr, cfg->gwhwaddr, sizeof(ifcfg.gwhwaddr)); ifcfg.gwhwaddr[sizeof(ifcfg.gwhwaddr)-1] = 0; ifcfg.gwipaddr[0] = cfg->gwipaddr[0]; ifcfg.gwipaddr[1] = cfg->gwipaddr[1]; ifcfg.gwipaddr[2] = cfg->gwipaddr[2]; ifcfg.gwipaddr[3] = cfg->gwipaddr[3]; ifcfg.gwnetmask[0] = cfg->gwnetmask[0]; ifcfg.gwnetmask[1] = cfg->gwnetmask[1]; ifcfg.gwnetmask[2] = cfg->gwnetmask[2]; ifcfg.gwnetmask[3] = cfg->gwnetmask[3]; ifcfg.gwipmode = cfg->gwipmode; CORBA_exception_init(&ev); Trx_Control_InterfaceSetConfig(api->obj, &ifcfg, &ev); return printexception("Trx_Control_InterfaceSetConfig", &ev); } int trxapi_modem_disconnect_get_config(struct trxapi *api, struct trxapi_modem_disconnect_config *cfg) { Trx_ModemDisconnectConfig mdisccfg; CORBA_Environment ev; if (!api || !cfg) return -1; CORBA_exception_init(&ev); Trx_Control_ModemDisconnectGetConfig(api->obj, &mdisccfg, &ev); if (printexception("Trx_Control_ModemDisconnectGetConfig", &ev)) return -1; cfg->output = mdisccfg.output; cfg->direction = mdisccfg.direction; switch (mdisccfg.rxc) { default: cfg->rxc = trxapi_modem_disconnect_rxc_normal; break; case Trx_mdisc_rxc_rxclock: cfg->rxc = trxapi_modem_disconnect_rxc_rxclock; break; } switch (mdisccfg.txc) { default: cfg->txc = trxapi_modem_disconnect_txc_normal; break; case Trx_mdisc_txc_txclock: cfg->txc = trxapi_modem_disconnect_txc_txclock; break; } switch (mdisccfg.txd) { default: cfg->txd = trxapi_modem_disconnect_txd_normal; break; case Trx_mdisc_txd_txdata: cfg->txd = trxapi_modem_disconnect_txd_txdata; break; } return 0; } int trxapi_modem_disconnect_set_config(struct trxapi *api, const struct trxapi_modem_disconnect_config *cfg) { Trx_ModemDisconnectConfig mdisccfg; CORBA_Environment ev; if (!api || !cfg) return -1; mdisccfg.output = cfg->output; mdisccfg.direction = cfg->direction; switch (cfg->rxc) { default: mdisccfg.rxc = Trx_mdisc_rxc_normal; break; case trxapi_modem_disconnect_rxc_rxclock: mdisccfg.rxc = Trx_mdisc_rxc_rxclock; break; } switch (cfg->txc) { default: mdisccfg.txc = Trx_mdisc_txc_normal; break; case trxapi_modem_disconnect_txc_txclock: mdisccfg.txc = Trx_mdisc_txc_txclock; break; } switch (cfg->txd) { default: mdisccfg.txd = Trx_mdisc_txd_normal; break; case trxapi_modem_disconnect_txd_txdata: mdisccfg.txd = Trx_mdisc_txd_txdata; break; } CORBA_exception_init(&ev); Trx_Control_ModemDisconnectSetConfig(api->obj, &mdisccfg, &ev); return printexception("Trx_Control_ModemDisconnectSetConfig", &ev); } /* Audio Stuff */ int trxapi_get_audio_state(struct trxapi *api, struct trxapi_audio_state *state) { CORBA_Environment ev; Trx_TrxAudioState audiostate; if (!state || !api) return -1; CORBA_exception_init(&ev); Trx_Control_GetAudioState(api->obj, &audiostate, &ev); if (printexception("Trx_Control_GetAudioState", &ev)) return -1; state->samplerate = audiostate.samplerate; state->micbufsz = audiostate.micbufsz; state->micbufptr = audiostate.micbufptr; state->spkbufsz = audiostate.spkbufsz; state->spkbufptr = audiostate.spkbufptr; state->micsigpwr = audiostate.micsigpwr; state->spksigpwr = audiostate.spksigpwr; state->spknoisepwr = audiostate.spknoisepwr; return 0; } int trxapi_get_audio_mic_samples(struct trxapi *api, unsigned long ptr, unsigned long len, unsigned char *samples) { CORBA_Environment ev; Trx_TrxAudioSamples *audiosamples; if (!samples || !api || !len) return -1; CORBA_exception_init(&ev); Trx_Control_GetAudioMicSamples(api->obj, ptr, len, &audiosamples, &ev); if (printexception("Trx_Control_GetAudioMicSamples", &ev)) return -1; if (audiosamples->_length != len) { CORBA_free(audiosamples); return -1; } memcpy(samples, audiosamples->_buffer, len); CORBA_free(audiosamples); return 0; } int trxapi_get_audio_spk_samples(struct trxapi *api, unsigned long ptr, unsigned long len, unsigned char *samples) { CORBA_Environment ev; Trx_TrxAudioSamples *audiosamples; if (!samples || !api || !len) return -1; CORBA_exception_init(&ev); Trx_Control_GetAudioSpkSamples(api->obj, ptr, len, &audiosamples, &ev); if (printexception("Trx_Control_GetAudioSpkSamples", &ev)) return -1; if (audiosamples->_length != len) { CORBA_free(audiosamples); return -1; } memcpy(samples, audiosamples->_buffer, len); CORBA_free(audiosamples); return 0; } int trxapi_set_audio_dtmf(struct trxapi *api, long ch) { CORBA_Environment ev; if (!api) return -1; CORBA_exception_init(&ev); Trx_Control_SetAudioDTMF(api->obj, ch, &ev); return printexception("Trx_Control_SetAudioDTMF", &ev); } /* --------------------------------------------------------------------- */ baycomusb-0.10.orig/trxapi/trxctrl-skels.c0100644000175100017510000021576307340455635016735 0ustar abaaba/* * This file was generated by orbit-idl - DO NOT EDIT! */ #include #include "trxctrl.h" void _ORBIT_Trx_TrxError_marshal(GIOPSendBuffer * _ORBIT_send_buffer, CORBA_Environment * ev) { register CORBA_unsigned_long _ORBIT_tmpvar_0; CORBA_unsigned_long _ORBIT_tmpvar_1; Trx_TrxError *_ORBIT_exdata = ev->_params; _ORBIT_tmpvar_1 = strlen((*_ORBIT_exdata).reason) + 1; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), 4); giop_send_buffer_append_mem_indirect(GIOP_SEND_BUFFER(_ORBIT_send_buffer), &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), ((*_ORBIT_exdata).reason), sizeof((*_ORBIT_exdata). reason[_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1); } void _ORBIT_skel_Trx_Control_GetDescription(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetDescription) (PortableServer_Servant _servant, Trx_TrxDescription ** desc, CORBA_Environment * ev)) { Trx_TrxDescription *desc; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } } _impl_GetDescription(_ORBIT_servant, &(desc), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { register CORBA_unsigned_long _ORBIT_tmpvar_0; CORBA_unsigned_long _ORBIT_tmpvar_1; register CORBA_unsigned_long _ORBIT_tmpvar_2; CORBA_unsigned_long _ORBIT_tmpvar_3; register CORBA_unsigned_long _ORBIT_tmpvar_4; CORBA_unsigned_long _ORBIT_tmpvar_5; register CORBA_unsigned_long _ORBIT_tmpvar_6; CORBA_unsigned_long _ORBIT_tmpvar_7; register CORBA_unsigned_long _ORBIT_tmpvar_8; register CORBA_unsigned_long _ORBIT_tmpvar_9; _ORBIT_tmpvar_1 = strlen((*desc).manufacturer) + 1; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_1)); memcpy(_ORBIT_t, &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof(_ORBIT_tmpvar_1)); } giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), ((*desc).manufacturer), sizeof((*desc). manufacturer [_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1); _ORBIT_tmpvar_3 = strlen((*desc).model) + 1; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_3)); memcpy(_ORBIT_t, &(_ORBIT_tmpvar_3), sizeof(_ORBIT_tmpvar_3)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof(_ORBIT_tmpvar_3)); } giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), ((*desc).model), sizeof((*desc). model[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3); _ORBIT_tmpvar_5 = strlen((*desc).copyright) + 1; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_5)); memcpy(_ORBIT_t, &(_ORBIT_tmpvar_5), sizeof(_ORBIT_tmpvar_5)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof(_ORBIT_tmpvar_5)); } giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), ((*desc).copyright), sizeof((*desc). copyright[_ORBIT_tmpvar_4]) * _ORBIT_tmpvar_5); _ORBIT_tmpvar_7 = strlen((*desc).instid) + 1; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_7)); memcpy(_ORBIT_t, &(_ORBIT_tmpvar_7), sizeof(_ORBIT_tmpvar_7)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof(_ORBIT_tmpvar_7)); } giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), ((*desc).instid), sizeof((*desc). instid[_ORBIT_tmpvar_6]) * _ORBIT_tmpvar_7); giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*desc).rxbands._length)); memcpy(_ORBIT_t, &((*desc).rxbands._length), sizeof((*desc).rxbands._length)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*desc).rxbands. _length)); } giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 8); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*desc).rxbands._buffer[_ORBIT_tmpvar_8]) * (*desc).rxbands._length); memcpy(_ORBIT_t, ((*desc).rxbands._buffer), sizeof((*desc).rxbands._buffer[_ORBIT_tmpvar_8]) * (*desc).rxbands._length); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*desc).rxbands. _buffer[_ORBIT_tmpvar_8]) * (*desc).rxbands._length); } { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*desc).txbands._length)); memcpy(_ORBIT_t, &((*desc).txbands._length), sizeof((*desc).txbands._length)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*desc).txbands. _length)); } giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 8); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*desc).txbands._buffer[_ORBIT_tmpvar_9]) * (*desc).txbands._length); memcpy(_ORBIT_t, ((*desc).txbands._buffer), sizeof((*desc).txbands._buffer[_ORBIT_tmpvar_9]) * (*desc).txbands._length); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*desc).txbands. _buffer[_ORBIT_tmpvar_9]) * (*desc).txbands._length); } giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &((*desc).rssimin), sizeof((*desc).rssimin)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &((*desc).rssimax), sizeof((*desc).rssimax)); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } if (ev->_major == CORBA_NO_EXCEPTION) CORBA_free(desc); } } void _ORBIT_skel_Trx_Control_GetState(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetState) (PortableServer_Servant _servant, Trx_TrxState * state, CORBA_Environment * ev)) { Trx_TrxState state; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } } _impl_GetState(_ORBIT_servant, &(state), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(state.mode), sizeof(state.mode)); giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 8); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(state.rxfreq), sizeof(state.rxfreq)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(state.txfreq), sizeof(state.txfreq)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(state.ptt), sizeof(state.ptt)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(state.manualptt), sizeof(state.manualptt)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(state.dcd), sizeof(state.dcd)); giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(state.rssi), sizeof(state.rssi)); } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_SetPTT(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_SetPTT) (PortableServer_Servant _servant, const CORBA_boolean ptt, CORBA_Environment * ev)) { CORBA_boolean ptt; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { ptt = *((CORBA_boolean *) _ORBIT_curptr); } else { ptt = *((CORBA_boolean *) _ORBIT_curptr); } } _impl_SetPTT(_ORBIT_servant, ptt, ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_SetFrequency(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_SetFrequency) (PortableServer_Servant _servant, const Trx_frequency rx, const Trx_frequency tx, CORBA_Environment * ev)) { Trx_frequency rx; Trx_frequency tx; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 8); iiop_byteswap((guchar *) & (rx), _ORBIT_curptr, 8); _ORBIT_curptr += 8; iiop_byteswap((guchar *) & (tx), _ORBIT_curptr, 8); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 8); rx = *((Trx_frequency *) _ORBIT_curptr); _ORBIT_curptr += 8; tx = *((Trx_frequency *) _ORBIT_curptr); } } _impl_SetFrequency(_ORBIT_servant, rx, tx, ev); } void _ORBIT_skel_Trx_Control_UartSend(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_UartSend) (PortableServer_Servant _servant, const CORBA_char * str, CORBA_Environment * ev)) { CORBA_char *str; { /* demarshalling */ guchar *_ORBIT_curptr; register CORBA_unsigned_long _ORBIT_tmpvar_2; CORBA_unsigned_long _ORBIT_tmpvar_3; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (_ORBIT_tmpvar_3))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; str = (void *) _ORBIT_curptr; _ORBIT_curptr += sizeof(str[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3; } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); _ORBIT_tmpvar_3 = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; str = (void *) _ORBIT_curptr; _ORBIT_curptr += sizeof(str[_ORBIT_tmpvar_2]) * _ORBIT_tmpvar_3; } } _impl_UartSend(_ORBIT_servant, str, ev); } void _ORBIT_skel_Trx_Control_UartReceive(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_UartReceive) (PortableServer_Servant _servant, CORBA_unsigned_long * ptr, CORBA_char ** str, CORBA_Environment * ev)) { CORBA_unsigned_long ptr; CORBA_char *str; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (ptr))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ptr = *((CORBA_unsigned_long *) _ORBIT_curptr); } } _impl_UartReceive(_ORBIT_servant, &(ptr), &(str), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { register CORBA_unsigned_long _ORBIT_tmpvar_0; CORBA_unsigned_long _ORBIT_tmpvar_1; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(ptr), sizeof(ptr)); _ORBIT_tmpvar_1 = strlen(str) + 1; { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof(_ORBIT_tmpvar_1)); memcpy(_ORBIT_t, &(_ORBIT_tmpvar_1), sizeof(_ORBIT_tmpvar_1)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof(_ORBIT_tmpvar_1)); } giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (str), sizeof(str[_ORBIT_tmpvar_0]) * _ORBIT_tmpvar_1); } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } if (ev->_major == CORBA_NO_EXCEPTION) CORBA_free(str); } } void _ORBIT_skel_Trx_Control_BaycomUSBAdapterGetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_BaycomUSBAdapterGetConfig) (PortableServer_Servant _servant, Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev)) { Trx_BaycomUSBAdapterConfig cfg; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } } _impl_BaycomUSBAdapterGetConfig(_ORBIT_servant, &(cfg), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { register CORBA_unsigned_long _ORBIT_tmpvar_0; register CORBA_unsigned_long _ORBIT_tmpvar_1; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.mode), sizeof(cfg.mode)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.fclk), sizeof(cfg.fclk)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.bitraterx), sizeof(cfg.bitraterx)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.bitratetx), sizeof(cfg.bitratetx)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.loopback), sizeof(cfg.loopback)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.pttmute), sizeof(cfg.pttmute)); giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.filtmode), sizeof(cfg.filtmode)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.samplerate), sizeof(cfg.samplerate)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.gain), sizeof(cfg.gain)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.audiodevin), sizeof(cfg. audiodevin[_ORBIT_tmpvar_0]) * 64); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.audiodevout), sizeof(cfg. audiodevout [_ORBIT_tmpvar_1]) * 64); giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.rfsquelch), sizeof(cfg.rfsquelch)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.audiosquelch), sizeof(cfg.audiosquelch)); } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_BaycomUSBAdapterSetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_BaycomUSBAdapterSetConfig) (PortableServer_Servant _servant, const Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev)) { Trx_BaycomUSBAdapterConfig cfg; { /* demarshalling */ guchar *_ORBIT_curptr; register CORBA_unsigned_long _ORBIT_tmpvar_2; register CORBA_unsigned_long _ORBIT_tmpvar_3; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (cfg.mode))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.fclk))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.bitraterx))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.bitratetx))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.loopback))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; cfg.pttmute = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (cfg.filtmode))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.samplerate))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.gain))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; memcpy(cfg.audiodevin, _ORBIT_curptr, sizeof(cfg.audiodevin[_ORBIT_tmpvar_2]) * 64); _ORBIT_curptr += sizeof(cfg.audiodevin[_ORBIT_tmpvar_2]) * 64; memcpy(cfg.audiodevout, _ORBIT_curptr, sizeof(cfg.audiodevout[_ORBIT_tmpvar_3]) * 64); _ORBIT_curptr += sizeof(cfg.audiodevout[_ORBIT_tmpvar_3]) * 64; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (cfg.rfsquelch))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; cfg.audiosquelch = *((CORBA_boolean *) _ORBIT_curptr); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); cfg.mode = *((Trx_BaycomUSBAdapterMode *) _ORBIT_curptr); _ORBIT_curptr += 4; cfg.fclk = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; cfg.bitraterx = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; cfg.bitratetx = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; cfg.loopback = *((Trx_BaycomUSBAdapterLoopback *) _ORBIT_curptr); _ORBIT_curptr += 4; cfg.pttmute = *((CORBA_boolean *) _ORBIT_curptr); _ORBIT_curptr += 1; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); cfg.filtmode = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; cfg.samplerate = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; cfg.gain = *((CORBA_float *) _ORBIT_curptr); _ORBIT_curptr += 4; memcpy(cfg.audiodevin, _ORBIT_curptr, sizeof(cfg.audiodevin[_ORBIT_tmpvar_2]) * 64); _ORBIT_curptr += sizeof(cfg.audiodevin[_ORBIT_tmpvar_2]) * 64; memcpy(cfg.audiodevout, _ORBIT_curptr, sizeof(cfg.audiodevout[_ORBIT_tmpvar_3]) * 64); _ORBIT_curptr += sizeof(cfg.audiodevout[_ORBIT_tmpvar_3]) * 64; _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); cfg.rfsquelch = *((Trx_signalstrength *) _ORBIT_curptr); _ORBIT_curptr += 4; cfg.audiosquelch = *((CORBA_boolean *) _ORBIT_curptr); } } _impl_BaycomUSBAdapterSetConfig(_ORBIT_servant, &(cfg), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_BaycomUSBAdapterGetAudioDevices(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_BaycomUSBAdapterGetAudioDevices) (PortableServer_Servant _servant, Trx_BaycomUSBAdapterAudioDevs ** devs, CORBA_Environment * ev)) { Trx_BaycomUSBAdapterAudioDevs *devs; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } } _impl_BaycomUSBAdapterGetAudioDevices(_ORBIT_servant, &(devs), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { register CORBA_unsigned_long _ORBIT_tmpvar_0; register CORBA_unsigned_long _ORBIT_tmpvar_1; register CORBA_unsigned_long _ORBIT_tmpvar_2; register CORBA_unsigned_long _ORBIT_tmpvar_3; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*devs).audiodevsin._length)); memcpy(_ORBIT_t, &((*devs).audiodevsin._length), sizeof((*devs).audiodevsin._length)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*devs).audiodevsin. _length)); } { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*devs).audiodevsin._buffer[_ORBIT_tmpvar_0]) * (*devs).audiodevsin._length); memcpy(_ORBIT_t, ((*devs).audiodevsin._buffer), sizeof((*devs).audiodevsin._buffer[_ORBIT_tmpvar_0]) * (*devs).audiodevsin._length); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*devs).audiodevsin. _buffer[_ORBIT_tmpvar_0]) * (*devs).audiodevsin._length); } giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*devs).audiodevsout._length)); memcpy(_ORBIT_t, &((*devs).audiodevsout._length), sizeof((*devs).audiodevsout._length)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*devs).audiodevsout. _length)); } { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*devs).audiodevsout._buffer[_ORBIT_tmpvar_2]) * (*devs).audiodevsout._length); memcpy(_ORBIT_t, ((*devs).audiodevsout._buffer), sizeof((*devs).audiodevsout._buffer[_ORBIT_tmpvar_2]) * (*devs).audiodevsout._length); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*devs).audiodevsout. _buffer[_ORBIT_tmpvar_2]) * (*devs).audiodevsout._length); } } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } if (ev->_major == CORBA_NO_EXCEPTION) CORBA_free(devs); } } void _ORBIT_skel_Trx_Control_ChannelAccessGetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_ChannelAccessGetConfig) (PortableServer_Servant _servant, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev)) { Trx_ChannelAccessConfig cfg; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } } _impl_ChannelAccessGetConfig(_ORBIT_servant, &(cfg), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg), sizeof(cfg)); } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_ChannelAccessSetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_ChannelAccessSetConfig) (PortableServer_Servant _servant, const Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev)) { Trx_ChannelAccessConfig cfg; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (cfg.txdelay))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.slottime))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.ppersistence))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.txtail))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; cfg.fullduplex = *((CORBA_boolean *) _ORBIT_curptr); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); memcpy(&(cfg), _ORBIT_curptr, sizeof(cfg)); } } _impl_ChannelAccessSetConfig(_ORBIT_servant, &(cfg), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_InterfaceGetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_InterfaceGetConfig) (PortableServer_Servant _servant, Trx_InterfaceConfig * cfg, CORBA_Environment * ev)) { Trx_InterfaceConfig cfg; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } } _impl_InterfaceGetConfig(_ORBIT_servant, &(cfg), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { register CORBA_unsigned_long _ORBIT_tmpvar_0; register CORBA_unsigned_long _ORBIT_tmpvar_1; register CORBA_unsigned_long _ORBIT_tmpvar_2; register CORBA_unsigned_long _ORBIT_tmpvar_3; register CORBA_unsigned_long _ORBIT_tmpvar_4; register CORBA_unsigned_long _ORBIT_tmpvar_5; register CORBA_unsigned_long _ORBIT_tmpvar_6; register CORBA_unsigned_long _ORBIT_tmpvar_7; giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.ifname), sizeof(cfg. ifname[_ORBIT_tmpvar_0]) * 16); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.hwaddr), sizeof(cfg. hwaddr[_ORBIT_tmpvar_1]) * 16); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.ipaddr), sizeof(cfg. ipaddr[_ORBIT_tmpvar_2]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.netmask), sizeof(cfg. netmask[_ORBIT_tmpvar_3]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.broadcast), sizeof(cfg. broadcast[_ORBIT_tmpvar_4]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.gwhwaddr), sizeof(cfg. gwhwaddr[_ORBIT_tmpvar_5]) * 128); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.gwipaddr), sizeof(cfg. gwipaddr[_ORBIT_tmpvar_6]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (cfg.gwnetmask), sizeof(cfg. gwnetmask[_ORBIT_tmpvar_7]) * 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg.gwipmode), sizeof(cfg.gwipmode)); } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_InterfaceSetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_InterfaceSetConfig) (PortableServer_Servant _servant, const Trx_InterfaceConfig * cfg, CORBA_Environment * ev)) { Trx_InterfaceConfig cfg; { /* demarshalling */ guchar *_ORBIT_curptr; register CORBA_unsigned_long _ORBIT_tmpvar_8; register CORBA_unsigned_long _ORBIT_tmpvar_9; register CORBA_unsigned_long _ORBIT_tmpvar_10; register CORBA_unsigned_long _ORBIT_tmpvar_11; register CORBA_unsigned_long _ORBIT_tmpvar_12; register CORBA_unsigned_long _ORBIT_tmpvar_13; register CORBA_unsigned_long _ORBIT_tmpvar_14; register CORBA_unsigned_long _ORBIT_tmpvar_15; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { memcpy(cfg.ifname, _ORBIT_curptr, sizeof(cfg.ifname[_ORBIT_tmpvar_8]) * 16); _ORBIT_curptr += sizeof(cfg.ifname[_ORBIT_tmpvar_8]) * 16; memcpy(cfg.hwaddr, _ORBIT_curptr, sizeof(cfg.hwaddr[_ORBIT_tmpvar_9]) * 16); _ORBIT_curptr += sizeof(cfg.hwaddr[_ORBIT_tmpvar_9]) * 16; memcpy(cfg.ipaddr, _ORBIT_curptr, sizeof(cfg.ipaddr[_ORBIT_tmpvar_10]) * 4); _ORBIT_curptr += sizeof(cfg.ipaddr[_ORBIT_tmpvar_10]) * 4; memcpy(cfg.netmask, _ORBIT_curptr, sizeof(cfg.netmask[_ORBIT_tmpvar_11]) * 4); _ORBIT_curptr += sizeof(cfg.netmask[_ORBIT_tmpvar_11]) * 4; memcpy(cfg.broadcast, _ORBIT_curptr, sizeof(cfg.broadcast[_ORBIT_tmpvar_12]) * 4); _ORBIT_curptr += sizeof(cfg.broadcast[_ORBIT_tmpvar_12]) * 4; memcpy(cfg.gwhwaddr, _ORBIT_curptr, sizeof(cfg.gwhwaddr[_ORBIT_tmpvar_13]) * 128); _ORBIT_curptr += sizeof(cfg.gwhwaddr[_ORBIT_tmpvar_13]) * 128; memcpy(cfg.gwipaddr, _ORBIT_curptr, sizeof(cfg.gwipaddr[_ORBIT_tmpvar_14]) * 4); _ORBIT_curptr += sizeof(cfg.gwipaddr[_ORBIT_tmpvar_14]) * 4; memcpy(cfg.gwnetmask, _ORBIT_curptr, sizeof(cfg.gwnetmask[_ORBIT_tmpvar_15]) * 4); _ORBIT_curptr += sizeof(cfg.gwnetmask[_ORBIT_tmpvar_15]) * 4; cfg.gwipmode = *((CORBA_char *) _ORBIT_curptr); } else { memcpy(cfg.ifname, _ORBIT_curptr, sizeof(cfg.ifname[_ORBIT_tmpvar_8]) * 16); _ORBIT_curptr += sizeof(cfg.ifname[_ORBIT_tmpvar_8]) * 16; memcpy(cfg.hwaddr, _ORBIT_curptr, sizeof(cfg.hwaddr[_ORBIT_tmpvar_9]) * 16); _ORBIT_curptr += sizeof(cfg.hwaddr[_ORBIT_tmpvar_9]) * 16; memcpy(cfg.ipaddr, _ORBIT_curptr, sizeof(cfg.ipaddr[_ORBIT_tmpvar_10]) * 4); _ORBIT_curptr += sizeof(cfg.ipaddr[_ORBIT_tmpvar_10]) * 4; memcpy(cfg.netmask, _ORBIT_curptr, sizeof(cfg.netmask[_ORBIT_tmpvar_11]) * 4); _ORBIT_curptr += sizeof(cfg.netmask[_ORBIT_tmpvar_11]) * 4; memcpy(cfg.broadcast, _ORBIT_curptr, sizeof(cfg.broadcast[_ORBIT_tmpvar_12]) * 4); _ORBIT_curptr += sizeof(cfg.broadcast[_ORBIT_tmpvar_12]) * 4; memcpy(cfg.gwhwaddr, _ORBIT_curptr, sizeof(cfg.gwhwaddr[_ORBIT_tmpvar_13]) * 128); _ORBIT_curptr += sizeof(cfg.gwhwaddr[_ORBIT_tmpvar_13]) * 128; memcpy(cfg.gwipaddr, _ORBIT_curptr, sizeof(cfg.gwipaddr[_ORBIT_tmpvar_14]) * 4); _ORBIT_curptr += sizeof(cfg.gwipaddr[_ORBIT_tmpvar_14]) * 4; memcpy(cfg.gwnetmask, _ORBIT_curptr, sizeof(cfg.gwnetmask[_ORBIT_tmpvar_15]) * 4); _ORBIT_curptr += sizeof(cfg.gwnetmask[_ORBIT_tmpvar_15]) * 4; cfg.gwipmode = *((CORBA_char *) _ORBIT_curptr); } } _impl_InterfaceSetConfig(_ORBIT_servant, &(cfg), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_ModemDisconnectGetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_ModemDisconnectGetConfig) (PortableServer_Servant _servant, Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev)) { Trx_ModemDisconnectConfig cfg; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } } _impl_ModemDisconnectGetConfig(_ORBIT_servant, &(cfg), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(cfg), sizeof(cfg)); } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_ModemDisconnectSetConfig(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_ModemDisconnectSetConfig) (PortableServer_Servant _servant, const Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev)) { Trx_ModemDisconnectConfig cfg; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (cfg.output))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.direction))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.rxc))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.txc))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (cfg.txd))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); memcpy(&(cfg), _ORBIT_curptr, sizeof(cfg)); } } _impl_ModemDisconnectSetConfig(_ORBIT_servant, &(cfg), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_GetAudioState(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetAudioState) (PortableServer_Servant _servant, Trx_TrxAudioState * state, CORBA_Environment * ev)) { Trx_TrxAudioState state; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { } else { } } _impl_GetAudioState(_ORBIT_servant, &(state), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), &(state), sizeof(state)); } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_GetAudioMicSamples(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetAudioMicSamples) (PortableServer_Servant _servant, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev)) { CORBA_unsigned_long ptr; CORBA_unsigned_long len; Trx_TrxAudioSamples *samples; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (ptr))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (len))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ptr = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; len = *((CORBA_unsigned_long *) _ORBIT_curptr); } } _impl_GetAudioMicSamples(_ORBIT_servant, ptr, len, &(samples), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { register CORBA_unsigned_long _ORBIT_tmpvar_0; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*samples)._length)); memcpy(_ORBIT_t, &((*samples)._length), sizeof((*samples)._length)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*samples)._length)); } { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*samples)._buffer[_ORBIT_tmpvar_0]) * (*samples)._length); memcpy(_ORBIT_t, ((*samples)._buffer), sizeof((*samples)._buffer[_ORBIT_tmpvar_0]) * (*samples)._length); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*samples). _buffer[_ORBIT_tmpvar_0]) * (*samples)._length); } } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } if (ev->_major == CORBA_NO_EXCEPTION) CORBA_free(samples); } } void _ORBIT_skel_Trx_Control_GetAudioSpkSamples(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_GetAudioSpkSamples) (PortableServer_Servant _servant, const CORBA_unsigned_long ptr, const CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev)) { CORBA_unsigned_long ptr; CORBA_unsigned_long len; Trx_TrxAudioSamples *samples; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (ptr))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; (*((guint32 *) & (len))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ptr = *((CORBA_unsigned_long *) _ORBIT_curptr); _ORBIT_curptr += 4; len = *((CORBA_unsigned_long *) _ORBIT_curptr); } } _impl_GetAudioSpkSamples(_ORBIT_servant, ptr, len, &(samples), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { register CORBA_unsigned_long _ORBIT_tmpvar_0; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*samples)._length)); memcpy(_ORBIT_t, &((*samples)._length), sizeof((*samples)._length)); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*samples)._length)); } { guchar *_ORBIT_t; _ORBIT_t = alloca(sizeof((*samples)._buffer[_ORBIT_tmpvar_0]) * (*samples)._length); memcpy(_ORBIT_t, ((*samples)._buffer), sizeof((*samples)._buffer[_ORBIT_tmpvar_0]) * (*samples)._length); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), (_ORBIT_t), sizeof((*samples). _buffer[_ORBIT_tmpvar_0]) * (*samples)._length); } } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } if (ev->_major == CORBA_NO_EXCEPTION) CORBA_free(samples); } } void _ORBIT_skel_Trx_Control_SetAudioDTMF(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_SetAudioDTMF) (PortableServer_Servant _servant, const CORBA_long ch, CORBA_Environment * ev)) { CORBA_long ch; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (ch))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); ch = *((CORBA_long *) _ORBIT_curptr); } } _impl_SetAudioDTMF(_ORBIT_servant, ch, ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { } else if (ev->_major == CORBA_USER_EXCEPTION) { static const ORBit_exception_marshal_info _ORBIT_user_exceptions[] = { {(const CORBA_TypeCode) &TC_Trx_TrxError_struct, (gpointer) _ORBIT_Trx_TrxError_marshal}, {CORBA_OBJECT_NIL, NULL} }; ORBit_send_user_exception(_ORBIT_send_buffer, ev, _ORBIT_user_exceptions); } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } void _ORBIT_skel_Trx_Control_SetAudioParams(POA_Trx_Control * _ORBIT_servant, GIOPRecvBuffer * _ORBIT_recv_buffer, CORBA_Environment * ev, void (*_impl_SetAudioParams) (PortableServer_Servant _servant, const Trx_TrxAudioParams * params, CORBA_Environment * ev)) { Trx_TrxAudioParams params; { /* demarshalling */ guchar *_ORBIT_curptr; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); (*((guint32 *) & (params.rfsquelch))) = GUINT32_SWAP_LE_BE(*((guint32 *) _ORBIT_curptr)); _ORBIT_curptr += 4; params.audiosquelch = *((CORBA_boolean *) _ORBIT_curptr); } else { _ORBIT_curptr = ALIGN_ADDRESS(_ORBIT_curptr, 4); memcpy(&(params), _ORBIT_curptr, sizeof(params)); } } _impl_SetAudioParams(_ORBIT_servant, &(params), ev); { /* marshalling */ register GIOPSendBuffer *_ORBIT_send_buffer; _ORBIT_send_buffer = giop_send_reply_buffer_use(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection, NULL, _ORBIT_recv_buffer->message.u.request. request_id, ev->_major); if (_ORBIT_send_buffer) { if (ev->_major == CORBA_NO_EXCEPTION) { } else ORBit_send_system_exception(_ORBIT_send_buffer, ev); giop_send_buffer_write(_ORBIT_send_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); } } } static ORBitSkeleton get_skel_Trx_Control(POA_Trx_Control * servant, GIOPRecvBuffer * _ORBIT_recv_buffer, gpointer * impl) { gchar *opname = _ORBIT_recv_buffer->message.u.request.operation; switch (opname[0]) { case 'B': switch (opname[1]) { case 'a': switch (opname[2]) { case 'y': switch (opname[3]) { case 'c': switch (opname[4]) { case 'o': switch (opname[5]) { case 'm': switch (opname[6]) { case 'U': switch (opname[7]) { case 'S': switch (opname[8]) { case 'B': switch (opname[9]) { case 'A': switch (opname[10]) { case 'd': switch (opname[11]) { case 'a': switch (opname [12]) { case 'p': switch (opname [13]) { case 't': switch (opname [14]) { case 'e': switch (opname [15]) { case 'r': switch (opname [16]) { case 'G': switch (opname [17]) { case 'e': switch (opname [18]) { case 't': switch (opname [19]) { case 'A': if (strcmp((opname + 20), "udioDevices")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> BaycomUSBAdapterGetAudioDevices; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_BaycomUSBAdapterGetAudioDevices; break; case 'C': if (strcmp((opname + 20), "onfig")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> BaycomUSBAdapterGetConfig; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_BaycomUSBAdapterGetConfig; break; default: break; } break; default: break; } break; default: break; } break; case 'S': if (strcmp((opname + 17), "etConfig")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> BaycomUSBAdapterSetConfig; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_BaycomUSBAdapterSetConfig; break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; case 'C': switch (opname[1]) { case 'h': switch (opname[2]) { case 'a': switch (opname[3]) { case 'n': switch (opname[4]) { case 'n': switch (opname[5]) { case 'e': switch (opname[6]) { case 'l': switch (opname[7]) { case 'A': switch (opname[8]) { case 'c': switch (opname[9]) { case 'c': switch (opname[10]) { case 'e': switch (opname[11]) { case 's': switch (opname [12]) { case 's': switch (opname [13]) { case 'G': if (strcmp((opname + 14), "etConfig")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> ChannelAccessGetConfig; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_ChannelAccessGetConfig; break; case 'S': if (strcmp((opname + 14), "etConfig")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> ChannelAccessSetConfig; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_ChannelAccessSetConfig; break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; case 'G': switch (opname[1]) { case 'e': switch (opname[2]) { case 't': switch (opname[3]) { case 'A': switch (opname[4]) { case 'u': switch (opname[5]) { case 'd': switch (opname[6]) { case 'i': switch (opname[7]) { case 'o': switch (opname[8]) { case 'M': if (strcmp ((opname + 9), "icSamples")) break; *impl = (gpointer) servant->vepv-> Trx_Control_epv-> GetAudioMicSamples; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_GetAudioMicSamples; break; case 'S': switch (opname[9]) { case 'p': if (strcmp ((opname + 10), "kSamples")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> GetAudioSpkSamples; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_GetAudioSpkSamples; break; case 't': if (strcmp ((opname + 10), "ate")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> GetAudioState; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_GetAudioState; break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; case 'D': if (strcmp((opname + 4), "escription")) break; *impl = (gpointer) servant->vepv->Trx_Control_epv-> GetDescription; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_GetDescription; break; case 'S': if (strcmp((opname + 4), "tate")) break; *impl = (gpointer) servant->vepv->Trx_Control_epv->GetState; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_GetState; break; default: break; } break; default: break; } break; default: break; } break; case 'I': switch (opname[1]) { case 'n': switch (opname[2]) { case 't': switch (opname[3]) { case 'e': switch (opname[4]) { case 'r': switch (opname[5]) { case 'f': switch (opname[6]) { case 'a': switch (opname[7]) { case 'c': switch (opname[8]) { case 'e': switch (opname[9]) { case 'G': if (strcmp ((opname + 10), "etConfig")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> InterfaceGetConfig; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_InterfaceGetConfig; break; case 'S': if (strcmp ((opname + 10), "etConfig")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> InterfaceSetConfig; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_InterfaceSetConfig; break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; case 'M': switch (opname[1]) { case 'o': switch (opname[2]) { case 'd': switch (opname[3]) { case 'e': switch (opname[4]) { case 'm': switch (opname[5]) { case 'D': switch (opname[6]) { case 'i': switch (opname[7]) { case 's': switch (opname[8]) { case 'c': switch (opname[9]) { case 'o': switch (opname[10]) { case 'n': switch (opname[11]) { case 'n': switch (opname [12]) { case 'e': switch (opname [13]) { case 'c': switch (opname [14]) { case 't': switch (opname [15]) { case 'G': if (strcmp((opname + 16), "etConfig")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> ModemDisconnectGetConfig; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_ModemDisconnectGetConfig; break; case 'S': if (strcmp((opname + 16), "etConfig")) break; *impl = (gpointer) servant-> vepv-> Trx_Control_epv-> ModemDisconnectSetConfig; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_ModemDisconnectSetConfig; break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; case 'S': switch (opname[1]) { case 'e': switch (opname[2]) { case 't': switch (opname[3]) { case 'A': switch (opname[4]) { case 'u': switch (opname[5]) { case 'd': switch (opname[6]) { case 'i': switch (opname[7]) { case 'o': switch (opname[8]) { case 'D': if (strcmp ((opname + 9), "TMF")) break; *impl = (gpointer) servant->vepv-> Trx_Control_epv-> SetAudioDTMF; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_SetAudioDTMF; break; case 'P': if (strcmp ((opname + 9), "arams")) break; *impl = (gpointer) servant->vepv-> Trx_Control_epv-> SetAudioParams; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_SetAudioParams; break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; case 'F': if (strcmp((opname + 4), "requency")) break; *impl = (gpointer) servant->vepv->Trx_Control_epv-> SetFrequency; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_SetFrequency; break; case 'P': if (strcmp((opname + 4), "TT")) break; *impl = (gpointer) servant->vepv->Trx_Control_epv->SetPTT; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_SetPTT; break; default: break; } break; default: break; } break; default: break; } break; case 'U': switch (opname[1]) { case 'a': switch (opname[2]) { case 'r': switch (opname[3]) { case 't': switch (opname[4]) { case 'R': if (strcmp((opname + 5), "eceive")) break; *impl = (gpointer) servant->vepv->Trx_Control_epv-> UartReceive; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_UartReceive; break; case 'S': if (strcmp((opname + 5), "end")) break; *impl = (gpointer) servant->vepv->Trx_Control_epv-> UartSend; return (ORBitSkeleton) _ORBIT_skel_Trx_Control_UartSend; break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } return NULL; } static void init_local_objref_Trx_Control(CORBA_Object obj, POA_Trx_Control * servant) { obj->vepv[Trx_Control__classid] = servant->vepv->Trx_Control_epv; } void POA_Trx_Control__init(PortableServer_Servant servant, CORBA_Environment * env) { static const PortableServer_ClassInfo class_info = { (ORBit_impl_finder) & get_skel_Trx_Control, "IDL:Trx/Control:1.0", (ORBit_local_objref_init) & init_local_objref_Trx_Control }; PortableServer_ServantBase__init(((PortableServer_ServantBase *) servant), env); ORBIT_OBJECT_KEY(((PortableServer_ServantBase *) servant)->_private)-> class_info = (PortableServer_ClassInfo *) & class_info; if (!Trx_Control__classid) Trx_Control__classid = ORBit_register_class(&class_info); } void POA_Trx_Control__fini(PortableServer_Servant servant, CORBA_Environment * env) { PortableServer_ServantBase__fini(servant, env); } baycomusb-0.10.orig/trxapi/server.c0100644000175100017510000010111107340455721015373 0ustar abaaba/*****************************************************************************/ /* * server.c -- Transceiver control server object implementation (UNIX only). * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * 0.2 09.03.2001 Now requiring T7F firmware V1.44 * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _REENTRANT #include #include #include #include #ifdef HAVE_ERRNO_H #include #endif #include "sysdeps.h" #include "trxctrl.h" #include "trx.h" /* --------------------------------------------------------------------- */ typedef struct trx_thread_state impl_POA_Trx_Control; static CORBA_ORB orb; static PortableServer_POA poa; /* --------------------------------------------------------------------- */ /*** Stub implementations ***/ CORBA_char *corba_strdup(const char *str) { CORBA_char *s = CORBA_string_alloc(strlen(str)); strcpy(s, str); return s; } static void raise_exception(CORBA_Environment *ev, const char *reason) { Trx_TrxError *err = Trx_TrxError__alloc(); err->reason = corba_strdup(reason); CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Trx_TrxError, err); } static void raise_oom_exception(CORBA_Environment *ev) { raise_exception(ev, "Out of memory"); } static void impl_Trx_Control_GetDescription(impl_POA_Trx_Control * servant, Trx_TrxDescription ** desc, CORBA_Environment * ev) { Trx_TrxDescription *d = Trx_TrxDescription__alloc(); *desc = d; if (!d) { raise_oom_exception(ev); return; } d->manufacturer = corba_strdup("Holger Eckart/Baycom"); d->model = corba_strdup("T7F/Baycom USB"); d->copyright = corba_strdup("(C) 1999-2000 Holger Eckart/Baycom"); d->instid = corba_strdup(servant->serial); d->rssimin = RSSI_MIN; d->rssimax = RSSI_MAX; d->rxbands._maximum = d->rxbands._length = 1; d->rxbands._buffer = CORBA_sequence_Trx_TrxBandDescription_allocbuf(1); CORBA_sequence_set_release(&d->rxbands, CORBA_TRUE); d->rxbands._buffer[0].low = 430000000; d->rxbands._buffer[0].high = 440000000; d->rxbands._buffer[0].step = 12500; d->txbands._maximum = d->txbands._length = 1; d->txbands._buffer = CORBA_sequence_Trx_TrxBandDescription_allocbuf(1); CORBA_sequence_set_release(&d->txbands, CORBA_TRUE); d->txbands._buffer[0].low = 430000000; d->txbands._buffer[0].high = 440000000; d->txbands._buffer[0].step = 12500; } static void impl_Trx_Control_GetState(impl_POA_Trx_Control * servant, Trx_TrxState * state, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); switch (servant->mode) { case MODE_FSK: case MODE_AFSK: case MODE_EXTERNAL: state->mode = Trx_trxpacket; break; case MODE_AUDIO: state->mode = Trx_trxaudio; break; default: state->mode = Trx_trxunspec; } if (servant->flags & (FLG_T7FERROR | FLG_MODEMERROR)) { state->rxfreq = 0; state->txfreq = 0; } else { state->rxfreq = 430000000 + 12500*servant->rxdiv; state->txfreq = 430000000 + 12500*servant->txdiv; } state->ptt = servant->ptt ? CORBA_TRUE : CORBA_FALSE; state->manualptt = (servant->flags & FLG_MANUALPTT) ? CORBA_TRUE : CORBA_FALSE; state->dcd = servant->dcd ? CORBA_TRUE : CORBA_FALSE; state->rssi = RSSI_MIN+(servant->rssi*((RSSI_MAX-RSSI_MIN)/255.0)); release_trxdata_mutex(servant); } static void impl_Trx_Control_SetPTT(impl_POA_Trx_Control * servant, CORBA_boolean ptt, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); if (ptt) servant->flags |= FLG_MANUALPTT; else servant->flags &= ~FLG_MANUALPTT; servant->flags |= FLG_SETPTT; release_trxdata_mutex(servant); } static void impl_Trx_Control_SetFrequency(impl_POA_Trx_Control * servant, Trx_frequency rx, Trx_frequency tx, CORBA_Environment * ev) { unsigned int dr, dt; if (rx < 430000000) rx = 0; else rx -= (430000000-12500/2); if (tx < 430000000) tx = 0; else tx -= (430000000-12500/2); if (rx > 10000000) dr = 800; else dr = ((unsigned int)rx) / 12500; if (tx > 10000000) dt = 800; else dt = ((unsigned int)tx) / 12500; acquire_trxdata_mutex(servant); servant->newrxdiv = dr; servant->newtxdiv = dt; servant->flags |= FLG_SETFREQ | FLG_SAVECONFIG; servant->cfg.freq.rx = 430000000 + 12500 * dr; servant->cfg.freq.tx = 430000000 + 12500 * dt; release_trxdata_mutex(servant); } static void impl_Trx_Control_UartSend(impl_POA_Trx_Control * servant, CORBA_char * str, CORBA_Environment * ev) { int r; if (!str) return; acquire_trxdata_mutex(servant); r = addtxfifo(servant, str, strlen(str)); release_trxdata_mutex(servant); if (r) raise_exception(ev, "FIFO full"); } static void impl_Trx_Control_UartReceive(impl_POA_Trx_Control * servant, CORBA_unsigned_long * ptr, CORBA_char ** str, CORBA_Environment * ev) { CORBA_char *cp; unsigned int i; cp = CORBA_string_alloc(512); acquire_trxdata_mutex(servant); i = getrxfifo(servant, ptr, cp, 512-1); release_trxdata_mutex(servant); cp[i] = 0; *str = cp; } static void impl_Trx_Control_BaycomUSBAdapterGetConfig(impl_POA_Trx_Control * servant, Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); switch (servant->cfg.adapt.mode) { case trxapi_baycomusb_mode_external: cfg->mode = Trx_external; break; case trxapi_baycomusb_mode_afsk: cfg->mode = Trx_afsk; break; case trxapi_baycomusb_mode_audio: cfg->mode = Trx_audio; break; default: cfg->mode = Trx_fsk; break; } cfg->fclk = servant->cfg.adapt.fclk; cfg->bitraterx = servant->cfg.adapt.bitraterx; cfg->bitratetx = servant->cfg.adapt.bitratetx; switch (servant->cfg.adapt.loopback) { default: cfg->loopback = Trx_loopback_off; break; case trxapi_baycomusb_loopback_scrambler: cfg->loopback = Trx_loopback_scrambler; break; case trxapi_baycomusb_loopback_modem: cfg->loopback = Trx_loopback_modem; break; } cfg->pttmute = servant->cfg.adapt.pttmute; cfg->filtmode = servant->cfg.adapt.filtmode; cfg->samplerate = servant->cfg.adapt.samplerate; cfg->gain = servant->cfg.adapt.gain; strncpy(cfg->audiodevin, servant->cfg.adapt.audiodevin, sizeof(cfg->audiodevin)); cfg->audiodevin[sizeof(cfg->audiodevin)-1] = 0; strncpy(cfg->audiodevout, servant->cfg.adapt.audiodevout, sizeof(cfg->audiodevout)); cfg->audiodevout[sizeof(cfg->audiodevout)-1] = 0; cfg->rfsquelch = servant->cfg.adapt.rfsquelch; cfg->audiosquelch = servant->cfg.adapt.audiosquelch; release_trxdata_mutex(servant); } static void impl_Trx_Control_BaycomUSBAdapterSetConfig(impl_POA_Trx_Control * servant, Trx_BaycomUSBAdapterConfig * cfg, CORBA_Environment * ev) { struct trxapi_baycomusb_adapter_config cf; unsigned char rfsq; acquire_trxdata_mutex(servant); /* clamp values */ if (cfg->rfsquelch <= RSSI_MIN) { cfg->rfsquelch = RSSI_MIN; rfsq = 0; } else if (cfg->rfsquelch >= RSSI_MAX) { cfg->rfsquelch = RSSI_MAX; rfsq = 255; } else rfsq = (cfg->rfsquelch - RSSI_MIN) * (255.0/(RSSI_MAX-RSSI_MIN)); #if defined(WIN32) || defined(USERMODEDRV) servant->audioparam.rfsquelch = rfsq; #endif /* check for significant changes requiring modem reboot */ servant->flags |= FLG_SAVECONFIG; switch (cfg->mode) { case Trx_external: cf.mode = trxapi_baycomusb_mode_external; break; case Trx_afsk: cf.mode = trxapi_baycomusb_mode_afsk; break; case Trx_audio: cf.mode = trxapi_baycomusb_mode_audio; break; default: cf.mode = trxapi_baycomusb_mode_fsk; break; } cf.fclk = cfg->fclk; cf.bitraterx = cfg->bitraterx; cf.bitratetx = cfg->bitratetx; switch (cfg->loopback) { default: cf.loopback = trxapi_baycomusb_loopback_off; break; case Trx_loopback_scrambler: cf.loopback = trxapi_baycomusb_loopback_scrambler; break; case Trx_loopback_modem: cf.loopback = trxapi_baycomusb_loopback_modem; break; } cf.pttmute = cfg->pttmute; cf.filtmode = cfg->filtmode; cf.samplerate = cfg->samplerate; cf.gain = cfg->gain; strncpy(cf.audiodevin, cfg->audiodevin, sizeof(cf.audiodevin)); cf.audiodevin[sizeof(cf.audiodevin)-1] = 0; strncpy(cf.audiodevout, cfg->audiodevout, sizeof(cf.audiodevout)); cf.audiodevout[sizeof(cf.audiodevout)-1] = 0; cf.rfsquelch = cfg->rfsquelch; cf.audiosquelch = cfg->audiosquelch; if (checkreload_adapt(servant, &cf)) servant->flags |= FLG_RELOADMODEM; servant->cfg.adapt = cf; release_trxdata_mutex(servant); } static void impl_Trx_Control_BaycomUSBAdapterGetAudioDevices(impl_POA_Trx_Control * servant, Trx_BaycomUSBAdapterAudioDevs ** devs, CORBA_Environment * ev) { Trx_BaycomUSBAdapterAudioDevs *d; struct trxapi_baycomusb_adapter_audio_devs *ad; unsigned int i; *devs = NULL; ad = audio_get_device_list(); if (!ad) { raise_exception(ev, "not implemented"); return; } *devs = d = Trx_BaycomUSBAdapterAudioDevs__alloc(); if (!d) { free(ad); raise_exception(ev, "out of memory"); return; } d->audiodevsin._maximum = d->audiodevsin._length = ad->nraudiodevsin; d->audiodevsout._maximum = d->audiodevsout._length = ad->nraudiodevsout; d->audiodevsin._buffer = CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(d->audiodevsin._length); CORBA_sequence_set_release(&d->audiodevsin, CORBA_TRUE); d->audiodevsout._buffer = CORBA_sequence_Trx_BaycomUSBAdapterAudioDev_allocbuf(d->audiodevsout._length); CORBA_sequence_set_release(&d->audiodevsout, CORBA_TRUE); for (i = 0; i < d->audiodevsin._length; i++) strncpy(d->audiodevsin._buffer[i], ad->audiodevsin[i], sizeof(d->audiodevsin._buffer[i])); for (i = 0; i < d->audiodevsout._length; i++) strncpy(d->audiodevsout._buffer[i], ad->audiodevsout[i], sizeof(d->audiodevsout._buffer[i])); free(ad); } static void impl_Trx_Control_ModemDisconnectGetConfig(impl_POA_Trx_Control * servant, Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); cfg->output = servant->cfg.mdisc.output; cfg->direction = servant->cfg.mdisc.direction; switch (servant->cfg.mdisc.rxc) { default: cfg->rxc = Trx_mdisc_rxc_normal; break; case trxapi_modem_disconnect_rxc_rxclock: cfg->rxc = Trx_mdisc_rxc_rxclock; break; } switch (servant->cfg.mdisc.txc) { default: cfg->txc = Trx_mdisc_txc_normal; break; case trxapi_modem_disconnect_txc_txclock: cfg->txc = Trx_mdisc_txc_txclock; break; } switch (servant->cfg.mdisc.txd) { default: cfg->txd = Trx_mdisc_txd_normal; break; case trxapi_modem_disconnect_txd_txdata: cfg->txd = Trx_mdisc_txd_txdata; break; } release_trxdata_mutex(servant); } static void impl_Trx_Control_ModemDisconnectSetConfig(impl_POA_Trx_Control * servant, Trx_ModemDisconnectConfig * cfg, CORBA_Environment * ev) { struct trxapi_modem_disconnect_config cf; cf.output = cfg->output; cf.direction = cfg->direction; switch (cfg->rxc) { default: cf.rxc = trxapi_modem_disconnect_rxc_normal; break; case Trx_mdisc_rxc_rxclock: cf.rxc = trxapi_modem_disconnect_rxc_rxclock; break; } switch (cfg->txc) { default: cf.txc = trxapi_modem_disconnect_txc_normal; break; case Trx_mdisc_txc_txclock: cf.txc = trxapi_modem_disconnect_txc_txclock; break; } switch (cfg->txd) { default: cf.txd = trxapi_modem_disconnect_txd_normal; break; case Trx_mdisc_txd_txdata: cf.txd = trxapi_modem_disconnect_txd_txdata; break; } acquire_trxdata_mutex(servant); if (checkreload_mdisc(servant, &cf)) servant->flags |= FLG_RELOADMODEM; servant->cfg.mdisc = cf; servant->flags |= FLG_SETMDISCDIR | FLG_SETMDISCOUT; release_trxdata_mutex(servant); } #if !defined(WIN32) static void impl_Trx_Control_ChannelAccessGetConfig(impl_POA_Trx_Control * servant, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); cfg->txdelay = servant->cfg.chacc.txdelay; cfg->slottime = servant->cfg.chacc.slottime; cfg->ppersistence = servant->cfg.chacc.ppersistence; cfg->txtail = servant->cfg.chacc.txtail; cfg->fullduplex = servant->cfg.chacc.fullduplex; release_trxdata_mutex(servant); } static void impl_Trx_Control_ChannelAccessSetConfig(impl_POA_Trx_Control * servant, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); servant->cfg.chacc.txdelay = cfg->txdelay; servant->cfg.chacc.slottime = cfg->slottime; servant->cfg.chacc.ppersistence = cfg->ppersistence; servant->cfg.chacc.txtail = cfg->txtail; servant->cfg.chacc.fullduplex = cfg->fullduplex; servant->flags |= FLG_RECONFCHACC | FLG_SAVECONFIG; release_trxdata_mutex(servant); } static void impl_Trx_Control_InterfaceGetConfig(impl_POA_Trx_Control * servant, Trx_InterfaceConfig * cfg, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); strncpy(cfg->ifname, servant->cfg.intf.ifname, sizeof(cfg->ifname)); cfg->ifname[sizeof(cfg->ifname)-1] = 0; strncpy(cfg->hwaddr, servant->cfg.intf.hwaddr, sizeof(cfg->hwaddr)); cfg->hwaddr[sizeof(cfg->hwaddr)-1] = 0; cfg->ipaddr[0] = servant->cfg.intf.ipaddr[0]; cfg->ipaddr[1] = servant->cfg.intf.ipaddr[1]; cfg->ipaddr[2] = servant->cfg.intf.ipaddr[2]; cfg->ipaddr[3] = servant->cfg.intf.ipaddr[3]; cfg->netmask[0] = servant->cfg.intf.netmask[0]; cfg->netmask[1] = servant->cfg.intf.netmask[1]; cfg->netmask[2] = servant->cfg.intf.netmask[2]; cfg->netmask[3] = servant->cfg.intf.netmask[3]; cfg->broadcast[0] = servant->cfg.intf.broadcast[0]; cfg->broadcast[1] = servant->cfg.intf.broadcast[1]; cfg->broadcast[2] = servant->cfg.intf.broadcast[2]; cfg->broadcast[3] = servant->cfg.intf.broadcast[3]; strncpy(cfg->gwhwaddr, servant->cfg.intf.gwhwaddr, sizeof(cfg->gwhwaddr)); cfg->gwhwaddr[sizeof(cfg->gwhwaddr)-1] = 0; cfg->gwipaddr[0] = servant->cfg.intf.gwipaddr[0]; cfg->gwipaddr[1] = servant->cfg.intf.gwipaddr[1]; cfg->gwipaddr[2] = servant->cfg.intf.gwipaddr[2]; cfg->gwipaddr[3] = servant->cfg.intf.gwipaddr[3]; cfg->gwnetmask[0] = servant->cfg.intf.gwnetmask[0]; cfg->gwnetmask[1] = servant->cfg.intf.gwnetmask[1]; cfg->gwnetmask[2] = servant->cfg.intf.gwnetmask[2]; cfg->gwnetmask[3] = servant->cfg.intf.gwnetmask[3]; cfg->gwipmode = servant->cfg.intf.gwipmode; release_trxdata_mutex(servant); } static void impl_Trx_Control_InterfaceSetConfig(impl_POA_Trx_Control * servant, Trx_InterfaceConfig * cfg, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); strncpy(servant->cfg.intf.ifname, cfg->ifname, sizeof(servant->cfg.intf.ifname)); servant->cfg.intf.ifname[sizeof(servant->cfg.intf.ifname)-1] = 0; strncpy(servant->cfg.intf.hwaddr, cfg->hwaddr, sizeof(servant->cfg.intf.hwaddr)); servant->cfg.intf.hwaddr[sizeof(servant->cfg.intf.hwaddr)-1] = 0; servant->cfg.intf.ipaddr[0] = cfg->ipaddr[0]; servant->cfg.intf.ipaddr[1] = cfg->ipaddr[1]; servant->cfg.intf.ipaddr[2] = cfg->ipaddr[2]; servant->cfg.intf.ipaddr[3] = cfg->ipaddr[3]; servant->cfg.intf.netmask[0] = cfg->netmask[0]; servant->cfg.intf.netmask[1] = cfg->netmask[1]; servant->cfg.intf.netmask[2] = cfg->netmask[2]; servant->cfg.intf.netmask[3] = cfg->netmask[3]; servant->cfg.intf.broadcast[0] = cfg->broadcast[0]; servant->cfg.intf.broadcast[1] = cfg->broadcast[1]; servant->cfg.intf.broadcast[2] = cfg->broadcast[2]; servant->cfg.intf.broadcast[3] = cfg->broadcast[3]; strncpy(servant->cfg.intf.gwhwaddr, cfg->gwhwaddr, sizeof(servant->cfg.intf.gwhwaddr)); servant->cfg.intf.gwhwaddr[sizeof(servant->cfg.intf.gwhwaddr)-1] = 0; servant->cfg.intf.gwipaddr[0] = cfg->gwipaddr[0]; servant->cfg.intf.gwipaddr[1] = cfg->gwipaddr[1]; servant->cfg.intf.gwipaddr[2] = cfg->gwipaddr[2]; servant->cfg.intf.gwipaddr[3] = cfg->gwipaddr[3]; servant->cfg.intf.gwnetmask[0] = cfg->gwnetmask[0]; servant->cfg.intf.gwnetmask[1] = cfg->gwnetmask[1]; servant->cfg.intf.gwnetmask[2] = cfg->gwnetmask[2]; servant->cfg.intf.gwnetmask[3] = cfg->gwnetmask[3]; servant->cfg.intf.gwipmode = cfg->gwipmode; servant->flags |= FLG_RECONFINTF | FLG_SAVECONFIG; release_trxdata_mutex(servant); } #else static void impl_Trx_Control_ChannelAccessGetConfig(impl_POA_Trx_Control * servant, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } static void impl_Trx_Control_ChannelAccessSetConfig(impl_POA_Trx_Control * servant, Trx_ChannelAccessConfig * cfg, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } static void impl_Trx_Control_InterfaceGetConfig(impl_POA_Trx_Control * servant, Trx_InterfaceConfig * cfg, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } static void impl_Trx_Control_InterfaceSetConfig(impl_POA_Trx_Control * servant, Trx_InterfaceConfig * cfg, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } #endif /* --------------------------------------------------------------------- */ #if !defined(WIN32) && !defined(USERMODEDRV) static void impl_Trx_Control_GetAudioState(impl_POA_Trx_Control * servant, Trx_TrxAudioState * state, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } static void impl_Trx_Control_GetAudioMicSamples(impl_POA_Trx_Control * servant, CORBA_unsigned_long ptr, CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } static void impl_Trx_Control_GetAudioSpkSamples(impl_POA_Trx_Control * servant, CORBA_unsigned_long ptr, CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } static void impl_Trx_Control_SetAudioDTMF(impl_POA_Trx_Control * servant, CORBA_long ch, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } static void impl_Trx_Control_SetAudioParams(impl_POA_Trx_Control * servant, Trx_TrxAudioParams * params, CORBA_Environment * ev) { raise_exception(ev, "not implemented"); } #else static void impl_Trx_Control_GetAudioState(impl_POA_Trx_Control * servant, Trx_TrxAudioState * state, CORBA_Environment * ev) { acquire_trxdata_mutex(servant); if (servant->mode != MODE_AUDIO) { raise_exception(ev, "invalid mode"); goto out; } state->samplerate = AUDIOSAMPLINGRATE; state->micbufsz = sizeof(servant->du.a.isrc.abuf); state->micbufptr = servant->du.a.isrc.aptr; state->spkbufsz = sizeof(servant->du.a.osrc.abuf); state->spkbufptr = servant->du.a.osrc.aptr; state->micsigpwr = servant->du.a.isrc.sigpwr; state->spksigpwr = servant->du.a.osrc.sigpwr; state->spknoisepwr = servant->du.a.osrc.noisepwr; out: release_trxdata_mutex(servant); } static void impl_Trx_Control_GetAudioSpkSamples(impl_POA_Trx_Control * servant, CORBA_unsigned_long ptr, CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev) { Trx_TrxAudioSamples *buf; unsigned int x; acquire_trxdata_mutex(servant); if (servant->mode != MODE_AUDIO) { raise_exception(ev, "invalid mode"); goto out; } if (len > sizeof(servant->du.a.osrc.abuf) || ptr >= sizeof(servant->du.a.osrc.abuf)) { raise_exception(ev, "invalid parameter"); goto out; } if (!(buf = Trx_TrxAudioSamples__alloc())) { raise_exception(ev, "out of memory"); goto out; } *samples = buf; if (!len) { buf->_maximum = buf->_length = 0; buf->_buffer = NULL; CORBA_sequence_set_release(buf, CORBA_FALSE); goto out; } buf->_maximum = buf->_length = len; buf->_buffer = CORBA_sequence_CORBA_octet_allocbuf(len); CORBA_sequence_set_release(buf, CORBA_TRUE); x = sizeof(servant->du.a.osrc.abuf) - ptr; if (x > len) x = len; memcpy(buf->_buffer, &servant->du.a.osrc.abuf[ptr], x); len -= x; if (len) memcpy(&buf->_buffer[x], servant->du.a.osrc.abuf, len); out: release_trxdata_mutex(servant); } static void impl_Trx_Control_GetAudioMicSamples(impl_POA_Trx_Control * servant, CORBA_unsigned_long ptr, CORBA_unsigned_long len, Trx_TrxAudioSamples ** samples, CORBA_Environment * ev) { Trx_TrxAudioSamples *buf; unsigned int x; acquire_trxdata_mutex(servant); if (servant->mode != MODE_AUDIO) { raise_exception(ev, "invalid mode"); goto out; } if (len > sizeof(servant->du.a.isrc.abuf) || ptr >= sizeof(servant->du.a.isrc.abuf)) { raise_exception(ev, "invalid parameter"); goto out; } if (!(buf = Trx_TrxAudioSamples__alloc())) { raise_exception(ev, "out of memory"); goto out; } *samples = buf; if (!len) { buf->_maximum = buf->_length = 0; buf->_buffer = NULL; CORBA_sequence_set_release(buf, CORBA_FALSE); goto out; } buf->_maximum = buf->_length = len; buf->_buffer = CORBA_sequence_CORBA_octet_allocbuf(len); CORBA_sequence_set_release(buf, CORBA_TRUE); x = sizeof(servant->du.a.isrc.abuf) - ptr; if (x > len) x = len; memcpy(buf->_buffer, &servant->du.a.isrc.abuf[ptr], x); len -= x; if (len) memcpy(&buf->_buffer[x], servant->du.a.isrc.abuf, len); out: release_trxdata_mutex(servant); } /* * char: * -1 off * 0..15 DTMF * 16 1750 */ /* * * DTMF frequencies * * 1209 1336 1477 1633 * 697 1 2 3 A * 770 4 5 6 B * 852 7 8 9 C * 941 * 0 # D * */ static void impl_Trx_Control_SetAudioDTMF(impl_POA_Trx_Control * servant, CORBA_long ch, CORBA_Environment * ev) { static const unsigned char dtmftransl[0x10] = { 0x13, 0x00, 0x10, 0x20, 0x01, 0x11, 0x21, 0x02, 0x12, 0x22, 0x30, 0x31, 0x32, 0x33, 0x03, 0x23 }; static const unsigned int freqlogrp[4] = { 697, 770, 852, 941 }; static const unsigned int freqhigrp[4] = { 1209, 1336, 1477, 1633 }; unsigned int sr = servant->du.a.p.srateusb, freq0 = 0, freq1 = 0, tr; acquire_trxdata_mutex(servant); if (servant->mode != MODE_AUDIO) { raise_exception(ev, "invalid mode"); goto out; } if (ch == 16) { if (sr > 0) freq0 = (1750*65536 + sr/2) / sr; } else if (ch >= 0 && ch <= 15) { tr = dtmftransl[ch & 15]; freq0 = (freqlogrp[tr & 15]*65536+sr/2)/sr; freq1 = (freqhigrp[tr >> 4]*65536+sr/2)/sr; } else if (ch != -1) { raise_exception(ev, "invalid parameter"); goto out; } servant->du.a.isrc.freq0 = freq0; servant->du.a.isrc.freq1 = freq1; servant->du.a.isrc.ph0 = 0; servant->du.a.isrc.ph1 = 0; out: release_trxdata_mutex(servant); } static void impl_Trx_Control_SetAudioParams(impl_POA_Trx_Control * servant, Trx_TrxAudioParams * params, CORBA_Environment * ev) { if (params->rfsquelch <= RSSI_MIN) servant->audioparam.rfsquelch = 0; else if (params->rfsquelch >= RSSI_MAX) servant->audioparam.rfsquelch = 255; else servant->audioparam.rfsquelch = (params->rfsquelch - RSSI_MIN) * (255.0/(RSSI_MAX-RSSI_MIN)); servant->audioparam.audiosquelch = params->audiosquelch; } #endif /* --------------------------------------------------------------------- */ /*** epv structures ***/ static PortableServer_ServantBase__epv impl_Trx_Control_base_epv = { NULL, /* _private data */ NULL, /* finalize routine */ NULL, /* default_POA routine */ }; static POA_Trx_Control__epv impl_Trx_Control_epv = { NULL, /* _private */ (gpointer) & impl_Trx_Control_GetDescription, (gpointer) & impl_Trx_Control_GetState, (gpointer) & impl_Trx_Control_SetPTT, (gpointer) & impl_Trx_Control_SetFrequency, (gpointer) & impl_Trx_Control_UartSend, (gpointer) & impl_Trx_Control_UartReceive, (gpointer) & impl_Trx_Control_BaycomUSBAdapterGetConfig, (gpointer) & impl_Trx_Control_BaycomUSBAdapterSetConfig, (gpointer) & impl_Trx_Control_BaycomUSBAdapterGetAudioDevices, (gpointer) & impl_Trx_Control_ChannelAccessGetConfig, (gpointer) & impl_Trx_Control_ChannelAccessSetConfig, (gpointer) & impl_Trx_Control_InterfaceGetConfig, (gpointer) & impl_Trx_Control_InterfaceSetConfig, (gpointer) & impl_Trx_Control_ModemDisconnectGetConfig, (gpointer) & impl_Trx_Control_ModemDisconnectSetConfig, (gpointer) & impl_Trx_Control_GetAudioState, (gpointer) & impl_Trx_Control_GetAudioMicSamples, (gpointer) & impl_Trx_Control_GetAudioSpkSamples, (gpointer) & impl_Trx_Control_SetAudioDTMF, (gpointer) & impl_Trx_Control_SetAudioParams, }; /*** vepv structures ***/ static POA_Trx_Control__vepv impl_Trx_Control_vepv = { &impl_Trx_Control_base_epv, &impl_Trx_Control_epv, }; /* --------------------------------------------------------------------- */ #if defined(WIN32) static int deletekeyx(HKEY key) { char name[128]; LONG err; DWORD len; HKEY key2; int ret = 0; for (;;) { len = sizeof(name); if ((RegEnumKeyEx(key, 0, name, &len, NULL, NULL, NULL, NULL)) != ERROR_SUCCESS) return ret; if ((err = RegOpenKeyEx(key, name, 0, KEY_ALL_ACCESS, &key2)) != ERROR_SUCCESS) { lprintf(1, "RegOpenKeyEx(%s) returned 0x%lx\n", name, err); return -1; } ret |= deletekeyx(key2); RegCloseKey(key2); RegDeleteKey(key, name); } return ret; } static int deletekey(const char *name) { HKEY key; int ret; DWORD err; if ((err = RegOpenKeyEx(IORREGHKEY, name, 0, KEY_ALL_ACCESS, &key)) != ERROR_SUCCESS) { lprintf(1, "RegOpenKeyEx(%s) returned 0x%lx\n", name, err); return -1; } ret = deletekeyx(key); RegCloseKey(key); RegDeleteKey(IORREGHKEY, name); return ret; } int publishior(struct trx_thread_state *state) { HKEY key, key2; DWORD err; snprintf(state->iorrname, sizeof(state->iorrname), "%08X", g_str_hash(state->ior)); if ((err = RegCreateKeyEx(IORREGHKEY, IORREGPATH, 0, "", 0, KEY_ALL_ACCESS, NULL, &key, NULL)) != ERROR_SUCCESS) { lprintf(1, "RegCreateKeyEx(" IORREGPATH ") returned 0x%lx\n", err); return -1; } if ((err = RegCreateKeyEx(key, state->iorrname, 0, "", REG_OPTION_VOLATILE, KEY_WRITE, NULL, &key2, NULL)) != ERROR_SUCCESS) { lprintf(1, "RegCreateKeyEx(%s) returned 0x%lx\n", state->ior, err); return -1; } err = RegSetValueEx(key2, "IOR", 0, REG_SZ, state->ior, strlen(state->ior)+1); RegCloseKey(key2); RegCloseKey(key); if (err != ERROR_SUCCESS) { lprintf(1, "RegSetValueEx(IOR,%s) returned 0x%lx\n", state->ior, err); return -1; } return 0; } int unpublishior(struct trx_thread_state *state) { char name[256]; snprintf(name, sizeof(name), "%s\\%s", IORREGPATH, state->iorrname); deletekey(name); return 0; } #else int publishior(struct trx_thread_state *state) { int fd; FILE *f; strncpy(state->iorfname, IORIDPATH "/trx-XXXXXX", sizeof(state->iorfname)); fd = mkstemp(state->iorfname); if (fd == -1) { state->iorfname[0] = 0; lprintf(1, "publish IOR %s failed %s (%u)\n", state->ior, strerror(errno), errno); return -1; } fchmod(fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (!(f = fdopen(fd, "w"))) { lprintf(1, "publish IOR %s failed %s (%u)\n", state->ior, strerror(errno), errno); close(fd); return -1; } fprintf(f, "%s\n", state->ior); fclose(f); return 0; } int unpublishior(struct trx_thread_state *state) { if (unlink(state->iorfname) == -1) { lprintf(1, "unpublish IOR %s failed %s (%u)\n", state->ior, strerror(errno), errno); return -1; } return 0; } #endif /* --------------------------------------------------------------------- */ void init_object(struct trx_thread_state *state) { Trx_Control obj; PortableServer_ObjectId *objid; CORBA_Environment ev; char *str; state->servant.vepv = &impl_Trx_Control_vepv; state->poa = poa; acquire_orbit_mutex(); CORBA_exception_init(&ev); POA_Trx_Control__init((PortableServer_Servant)state, &ev); objid = PortableServer_POA_activate_object(poa, state, &ev); CORBA_free(objid); obj = PortableServer_POA_servant_to_reference(poa, state, &ev); str = CORBA_ORB_object_to_string(orb, obj, &ev); strncpy(state->ior, str, sizeof(state->ior)); CORBA_free(str); lprintf(5, "New object: %s\n", state->ior); publishior(state); CORBA_Object_release(obj, &ev); if (ev._major != CORBA_NO_EXCEPTION) lprintf(1, "Error during object initialization\n"); release_orbit_mutex(); } void destroy_object(struct trx_thread_state *state) { PortableServer_ObjectId *objid; CORBA_Environment ev; acquire_orbit_mutex(); CORBA_exception_init(&ev); lprintf(5, "Destroying object: %s\n", state->ior); unpublishior(state); objid = PortableServer_POA_servant_to_id(state->poa, state, &ev); PortableServer_POA_deactivate_object(state->poa, objid, &ev); CORBA_free(objid); POA_Trx_Control__fini((PortableServer_Servant)state, &ev); if (ev._major != CORBA_NO_EXCEPTION) lprintf(1, "Error during object finalization\n"); release_orbit_mutex(); } /* --------------------------------------------------------------------- */ int server_init1(int *argc, char **argv) { CORBA_Environment ev; PortableServer_POAManager poamgr; /* init CORBA exception handling */ CORBA_exception_init(&ev); /* normal ORB init */ orb = CORBA_ORB_init(argc, argv, "orbit-local-orb", &ev); if (ev._major != CORBA_NO_EXCEPTION) { lprintf(0, "cannot initialize CORBA ORB\n"); return -1; } poa = (PortableServer_POA)CORBA_ORB_resolve_initial_references(orb, "RootPOA", &ev); if (ev._major != CORBA_NO_EXCEPTION) { lprintf(0, "cannot resolve initial CORBA references\n"); return -1; } poamgr = PortableServer_POA__get_the_POAManager(poa, &ev); if (ev._major != CORBA_NO_EXCEPTION) { lprintf(0, "cannot get the CORBA POA manager\n"); return -1; } PortableServer_POAManager_activate(poamgr, &ev); if (ev._major != CORBA_NO_EXCEPTION) { lprintf(0, "cannot activate CORBA POA manager\n"); return -1; } return 0; } int server_init2(void) { CORBA_Environment ev; #if defined(WIN32) deletekey(IORREGPATH); #endif CORBA_exception_init(&ev); acquire_orbit_mutex(); ORBit_custom_run_setup(orb, &ev); release_orbit_mutex(); if (ev._major == CORBA_NO_EXCEPTION) return 0; CORBA_exception_free(&ev); return 1; } baycomusb-0.10.orig/trxapi/win32client.h0100644000175100017510000001024607332075374016246 0ustar abaaba/*****************************************************************************/ /* * trxapi.h -- Transceiver control API. * * Copyright (C) 2000, 2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifndef _WIN32CLIENT_H #define _WIN32CLIENT_H /* --------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "trxapi.h" /* --------------------------------------------------------------------- */ struct trxapi { struct trx_thread_state *state; HANDLE hmutex; HANDLE hflxtxevent; HANDLE hflxrxevent; struct trxapi_description *desc; struct trxapi_baycomusb_adapter_audio_devs *audiodevs; }; extern struct trxapi *win32shmem_open_byindex(unsigned int index); extern void win32shmem_close(struct trxapi *api); extern void win32shmem_lock(struct trxapi *api); extern void win32shmem_unlock(struct trxapi *api); extern void win32shmem_wakeup(struct trxapi *api); extern int win32shmem_init(int *argc, char **argv); extern const struct trxapi_description *win32shmem_get_description(struct trxapi *api); extern int win32shmem_get_state(struct trxapi *api, struct trxapi_state *state); extern int win32shmem_set_ptt(struct trxapi *api, unsigned int ptt); extern int win32shmem_set_frequency(struct trxapi *api, trxapi_frequency_t rx, trxapi_frequency_t tx); /* Raw UART */ extern int win32shmem_uart_send(struct trxapi *api, const char *str); extern int win32shmem_uart_receive(struct trxapi *api, unsigned long *ptr, char *str, unsigned int strsz); /* Configuration stuff */ extern int win32shmem_baycomusb_adapter_get_config(struct trxapi *api, struct trxapi_baycomusb_adapter_config *cfg); extern int win32shmem_baycomusb_adapter_set_config(struct trxapi *api, const struct trxapi_baycomusb_adapter_config *cfg); extern const struct trxapi_baycomusb_adapter_audio_devs *win32shmem_baycomusb_adapter_get_audiodevices(struct trxapi *api); extern int win32shmem_channel_access_get_config(struct trxapi *api, struct trxapi_channel_access_config *cfg); extern int win32shmem_channel_access_set_config(struct trxapi *api, const struct trxapi_channel_access_config *cfg); extern int win32shmem_interface_get_config(struct trxapi *api, struct trxapi_interface_config *cfg); extern int win32shmem_interface_set_config(struct trxapi *api, const struct trxapi_interface_config *cfg); extern int win32shmem_modem_disconnect_get_config(struct trxapi *api, struct trxapi_modem_disconnect_config *cfg); extern int win32shmem_modem_disconnect_set_config(struct trxapi *api, const struct trxapi_modem_disconnect_config *cfg); /* Audio Stuff */ extern int win32shmem_get_audio_state(struct trxapi *api, struct trxapi_audio_state *state); extern int win32shmem_get_audio_mic_samples(struct trxapi *api, unsigned long ptr, unsigned long len, unsigned char *samples); extern int win32shmem_get_audio_spk_samples(struct trxapi *api, unsigned long ptr, unsigned long len, unsigned char *samples); extern int win32shmem_set_audio_dtmf(struct trxapi *api, long ch); /* --------------------------------------------------------------------- */ #endif /* _WIN32CLIENT_H */ baycomusb-0.10.orig/trxapi/trxctrl.idl0100644000175100017510000001053107340455477016132 0ustar abaabamodule Trx { typedef unsigned long long frequency; typedef float signalstrength; struct TrxBandDescription { frequency low; /* lower band edge */ frequency high; /* upper band edge */ frequency step; /* step size */ }; struct TrxDescription { string manufacturer; /* transceiver manufacturer */ string model; /* model number */ string copyright; string instid; /* serial number or similar */ sequence rxbands; sequence txbands; signalstrength rssimin; signalstrength rssimax; }; enum TrxMode { trxunspec, trxpacket, trxaudio }; struct TrxState { TrxMode mode; frequency rxfreq; frequency txfreq; boolean ptt; boolean manualptt; boolean dcd; signalstrength rssi; }; enum BaycomUSBAdapterMode { fsk, external, afsk, audio }; enum BaycomUSBAdapterLoopback { loopback_off, loopback_scrambler, loopback_modem }; typedef char BaycomUSBAdapterAudioDev[64]; struct BaycomUSBAdapterConfig { BaycomUSBAdapterMode mode; unsigned long fclk; unsigned long bitraterx; unsigned long bitratetx; BaycomUSBAdapterLoopback loopback; boolean pttmute; unsigned long filtmode; /* audio stuff */ unsigned long samplerate; float gain; BaycomUSBAdapterAudioDev audiodevin; BaycomUSBAdapterAudioDev audiodevout; signalstrength rfsquelch; boolean audiosquelch; }; typedef sequence BaycomUSBAdapterAudioDevSequence; struct BaycomUSBAdapterAudioDevs { BaycomUSBAdapterAudioDevSequence audiodevsin; BaycomUSBAdapterAudioDevSequence audiodevsout; }; struct ChannelAccessConfig { unsigned long txdelay; unsigned long slottime; unsigned long ppersistence; unsigned long txtail; boolean fullduplex; }; typedef octet IpAddress[4]; struct InterfaceConfig { char ifname[16]; char hwaddr[16]; IpAddress ipaddr; IpAddress netmask; IpAddress broadcast; char gwhwaddr[128]; IpAddress gwipaddr; IpAddress gwnetmask; char gwipmode; }; enum ModemDisconnectRxC { mdisc_rxc_normal, mdisc_rxc_rxclock }; enum ModemDisconnectTxC { mdisc_txc_normal, mdisc_txc_txclock }; enum ModemDisconnectTxD { mdisc_txd_normal, mdisc_txd_txdata }; struct ModemDisconnectConfig { unsigned long output; unsigned long direction; ModemDisconnectRxC rxc; ModemDisconnectTxC txc; ModemDisconnectTxD txd; }; struct TrxAudioState { unsigned long samplerate; unsigned long micbufsz; unsigned long micbufptr; unsigned long spkbufsz; unsigned long spkbufptr; float micsigpwr; float spksigpwr; float spknoisepwr; }; typedef sequence TrxAudioSamples; struct TrxAudioParams { signalstrength rfsquelch; boolean audiosquelch; }; exception TrxError { string reason; }; interface Control { void GetDescription(out TrxDescription desc); void GetState(out TrxState state) raises (TrxError); void SetPTT(in boolean ptt) raises (TrxError); oneway void SetFrequency(in frequency rx, in frequency tx) raises (TrxError); /* Raw UART */ oneway void UartSend(in string str) raises (TrxError); void UartReceive(inout unsigned long ptr, out string str) raises (TrxError); /* Configuration stuff */ void BaycomUSBAdapterGetConfig(out BaycomUSBAdapterConfig cfg) raises (TrxError); void BaycomUSBAdapterSetConfig(in BaycomUSBAdapterConfig cfg) raises (TrxError); void BaycomUSBAdapterGetAudioDevices(out BaycomUSBAdapterAudioDevs devs) raises (TrxError); void ChannelAccessGetConfig(out ChannelAccessConfig cfg) raises (TrxError); void ChannelAccessSetConfig(in ChannelAccessConfig cfg) raises (TrxError); void InterfaceGetConfig(out InterfaceConfig cfg) raises (TrxError); void InterfaceSetConfig(in InterfaceConfig cfg) raises (TrxError); void ModemDisconnectGetConfig(out ModemDisconnectConfig cfg) raises (TrxError); void ModemDisconnectSetConfig(in ModemDisconnectConfig cfg) raises (TrxError); /* Audio Stuff */ void GetAudioState(out TrxAudioState state) raises (TrxError); void GetAudioMicSamples(in unsigned long ptr, in unsigned long len, out TrxAudioSamples samples) raises (TrxError); void GetAudioSpkSamples(in unsigned long ptr, in unsigned long len, out TrxAudioSamples samples) raises (TrxError); void SetAudioDTMF(in long ch) raises (TrxError); void SetAudioParams(in TrxAudioParams params); }; }; baycomusb-0.10.orig/trxapi/win32client.c0100644000175100017510000005507607340452047016246 0ustar abaaba/*****************************************************************************/ /* * win32client.c -- Transceiver control client (Win32 shmem only). * * Copyright (C) 2000, 2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "trxapi.h" #include #include #if defined(WIN32) #include #else #include #endif #include "win32client.h" #include "trx.h" /* --------------------------------------------------------------------- */ #define VERBOSE #ifdef VERBOSE #define verbose(x) x #else #define verbose(x) #endif /* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */ #if defined(WIN32) #if 0 static int start_service(void) { int ret = -1; SC_HANDLE hscm, hserv; DWORD err; char *args[5] = { "-S", "-v", "9", "-s", "-ORBBindAddr=127.0.0.1" }; hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (!hscm) { err = GetLastError(); if (err != ERROR_CALL_NOT_IMPLEMENTED) lprintf(0, "Cannot open SC manager, error %lu\n", err); return -1; } hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS); if (!hserv) { err = GetLastError(); lprintf(0, "Cannot open service, error %lu\n", err); goto closescm; } if (!StartService(hserv, 5, args)) { err = GetLastError(); if (err != ERROR_SERVICE_ALREADY_RUNNING) lprintf(0, "Cannot start service, error %lu\n", err); goto closeserv; } lprintf(0, "Service %s started successfully\n", SERVICENAME); ret = 0; closeserv: if (!CloseServiceHandle(hserv)) lprintf(0, "Cannot close service handle, error %lu\n", GetLastError()); closescm: if (!CloseServiceHandle(hscm)) lprintf(0, "Cannot close service manager handle, error %lu\n", GetLastError()); return ret; } #endif #if 0 static void print_shmem(void) { unsigned int i; HANDLE hshmem, hglobalshmem, hprocess; struct win32_global_state *globalstate; struct trx_thread_state *state; hglobalshmem = OpenFileMapping(FILE_MAP_READ, FALSE, "baycomusb"); if (!hglobalshmem) { lprintf(0, "Cannot open baycomusb file mapping (error %lu)\n", GetLastError()); return; } globalstate = MapViewOfFile(hglobalshmem, FILE_MAP_READ, 0, 0, 0); CloseHandle(hglobalshmem); if (!globalstate) { lprintf(0, "Cannot map shared memory segment (error %lu)\n", GetLastError()); return; } if (strncmp(globalstate->signature, BAYUSBSIGNATURE, sizeof(globalstate->signature))) { lprintf(0, "Shared Memory Segment has invalid Signature %16s\n", globalstate->signature); goto err1; } hprocess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, globalstate->processid); if (!hprocess) { lprintf(0, "Cannot open server process %u (error %lu)\n", globalstate->processid, GetLastError()); goto err1; } printf("Modems:\n"); for (i = 0; i < MAXUSBMODEMS; i++) { if (!globalstate->modem[i].hshmem) continue; if (!DuplicateHandle(hprocess, globalstate->modem[i].hshmem, GetCurrentProcess(), &hshmem, FILE_MAP_WRITE, FALSE, 0)) { lprintf(0, "Cannot duplicate handle (error %lu)\n", GetLastError()); continue; } state = MapViewOfFile(hshmem, FILE_MAP_READ, 0, 0, 0); CloseHandle(hshmem); if (!state) { lprintf(0, "Cannot map shared memory segment (error %lu)\n", GetLastError()); continue; } printf("dev %2u: mode %u, serial %s\n", i, state->mode, state->serial); UnmapViewOfFile(state); } err2: CloseHandle(hprocess); err1: UnmapViewOfFile(globalstate); } /* MUTEX_ALL_ACCESS, EVENT_ALL_ACCESS, EVENT_MODIFY_STATE */ #endif #if 0 void win32shmem_runserver(void) { char windir[512], name[512], cmdname[512], cmdline[512], *cp; STARTUPINFO sti; PROCESS_INFORMATION pi; HANDLE hglobalshmem; hglobalshmem = OpenFileMapping(FILE_MAP_READ, FALSE, "baycomusb"); if (hglobalshmem) { CloseHandle(hglobalshmem); return; } if (!GetWindowsDirectory(windir, sizeof(windir))) { lprintf(0, "Cannot get windows directory path\n"); return; } if (!GetModuleFileName(GetModuleHandle(NULL), name, sizeof(name))) { lprintf(0, "Cannot determine executable name\n"); return; } if ((cp = strrchr(name, '\\'))) *cp = 0; else name[0] = 0; snprintf(cmdname, sizeof(cmdname), "%s\\rundll32.exe", windir); /* * Database calls (getXbyY) seem to hang for a very looooong time under * w9x if DNS is not or misconfigured. So we set the binding address to * 127.0.0.1, which only accepts connections from 127.0.0.1 * and does no database calls */ snprintf(cmdline, sizeof(cmdline), "%s %s\\bayusb.dll,server_entry_cmdline -v 9 -s" /*" -ORBBindAddr=127.0.0.1"*/, cmdname, name); GetStartupInfo(&sti); if (!CreateProcess(cmdname, cmdline, NULL, NULL, FALSE, DETACHED_PROCESS | CREATE_DEFAULT_ERROR_MODE | HIGH_PRIORITY_CLASS, NULL, NULL, &sti, &pi)) { lprintf(0, "Cannot start command %s, Error %lu\n", cmdname, GetLastError()); } else Sleep(2000); } #else void win32shmem_runserver(void) { char name[512], cmdname[512], cmdline[512], *cp; STARTUPINFO sti; PROCESS_INFORMATION pi; HANDLE hglobalshmem; hglobalshmem = OpenFileMapping(FILE_MAP_READ, FALSE, "baycomusb"); if (hglobalshmem) { CloseHandle(hglobalshmem); return; } if (!GetModuleFileName(GetModuleHandle(NULL), name, sizeof(name))) { lprintf(0, "Cannot determine executable name\n"); return; } if ((cp = strrchr(name, '\\'))) *cp = 0; else name[0] = 0; snprintf(cmdname, sizeof(cmdname), "%s\\baycomusbserv.exe", name); /* * Database calls (getXbyY) seem to hang for a very looooong time under * w9x if DNS is not or misconfigured. So we set the binding address to * 127.0.0.1, which only accepts connections from 127.0.0.1 * and does no database calls */ snprintf(cmdline, sizeof(cmdline), "%s -v 9 -s" /*" -ORBBindAddr=127.0.0.1"*/, cmdname); GetStartupInfo(&sti); if (!CreateProcess(cmdname, cmdline, NULL, NULL, FALSE, DETACHED_PROCESS | CREATE_DEFAULT_ERROR_MODE | HIGH_PRIORITY_CLASS, NULL, NULL, &sti, &pi)) { lprintf(0, "Cannot start command %s, Error %lu\n", cmdname, GetLastError()); } else Sleep(2000); } #endif #endif /* --------------------------------------------------------------------- */ struct trxapi *win32shmem_open_byindex(unsigned int index) { struct trxapi_description *d; struct trxapi *api; unsigned int i; HANDLE hshmem, hglobalshmem, hprocess, hmutex, hflxtxevent, hflxrxevent; struct win32_global_state *globalstate; struct trx_thread_state *state; static int audioglobalinit = 1; win32shmem_runserver(); /* kludge!! */ if (audioglobalinit) { audioglobalinit = 0; audio_globalinit(); } hglobalshmem = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "baycomusb"); if (!hglobalshmem) { verbose(lprintf(1, "Cannot open baycomusb file mapping (error %lu)\n", GetLastError())); return NULL; } globalstate = MapViewOfFile(hglobalshmem, FILE_MAP_ALL_ACCESS, 0, 0, 0); CloseHandle(hglobalshmem); if (!globalstate) { verbose(lprintf(1, "Cannot map shared memory segment (error %lu)\n", GetLastError())); return NULL; } if (strncmp(globalstate->signature, BAYUSBSIGNATURE, sizeof(globalstate->signature))) { verbose(lprintf(1, "Shared Memory Segment has invalid Signature %16s\n", globalstate->signature)); goto err1; } hprocess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, globalstate->processid); if (!hprocess) { verbose(lprintf(1, "Cannot open server process %u (error %lu)\n", globalstate->processid, GetLastError())); goto err1; } for (i = 0; i < MAXUSBMODEMS; i++) { if (!globalstate->modem[i].hshmem) continue; if (index) { index--; continue; } if (!DuplicateHandle(hprocess, globalstate->modem[i].hshmem, GetCurrentProcess(), &hshmem, FILE_MAP_ALL_ACCESS, FALSE, 0)) { verbose(lprintf(1, "Cannot duplicate shmem handle (error %lu)\n", GetLastError())); continue; } state = MapViewOfFile(hshmem, FILE_MAP_ALL_ACCESS, 0, 0, 0); CloseHandle(hshmem); if (!state) { verbose(lprintf(1, "Cannot map shared memory segment (error %lu)\n", GetLastError())); continue; } if (!DuplicateHandle(hprocess, state->hmutex, GetCurrentProcess(), &hmutex, MUTEX_ALL_ACCESS, FALSE, 0)) { verbose(lprintf(1, "Cannot duplicate mutex handle (error %lu)\n", GetLastError())); UnmapViewOfFile(state); continue; } if (!DuplicateHandle(hprocess, state->hflxtxevent, GetCurrentProcess(), &hflxtxevent, EVENT_MODIFY_STATE, FALSE, 0)) { verbose(lprintf(1, "Cannot duplicate tx event handle (error %lu)\n", GetLastError())); UnmapViewOfFile(state); CloseHandle(hmutex); continue; } if (!DuplicateHandle(hprocess, state->hflxrxevent, GetCurrentProcess(), &hflxrxevent, EVENT_ALL_ACCESS, FALSE, 0)) { verbose(lprintf(1, "Cannot duplicate rx event handle (error %lu)\n", GetLastError())); UnmapViewOfFile(state); CloseHandle(hmutex); CloseHandle(hflxtxevent); continue; } /* allocate new device */ if (!(api = calloc(1, sizeof(struct trxapi)))) goto err3; api->state = state; api->hmutex = hmutex; api->hflxtxevent = hflxtxevent; api->hflxrxevent = hflxrxevent; /* retrieve description */ if (!(d = calloc(1, sizeof(struct trxapi_description) + (1 + 1) * sizeof(struct trxapi_banddescription)))) goto errdesc; api->desc = d; d->rxbands = (struct trxapi_banddescription *)(d + 1); d->txbands = &d->rxbands[1]; strncpy(d->manufacturer, "Holger Eckart/Baycom", sizeof(d->manufacturer)); d->manufacturer[sizeof(d->manufacturer)-1] = 0; strncpy(d->model, "T7F/Baycom USB", sizeof(d->model)); d->model[sizeof(d->model)-1] = 0; strncpy(d->copyright, "(C) 1999-2000 Holger Eckart/Baycom", sizeof(d->copyright)); d->copyright[sizeof(d->copyright)-1] = 0; strncpy(d->instid, state->serial, sizeof(d->instid)); d->instid[sizeof(d->instid)-1] = 0; d->nrrxbands = 1; d->nrtxbands = 1; d->rssimin = RSSI_MIN; d->rssimax = RSSI_MAX; for (i = 0; i < d->nrrxbands; i++) { d->rxbands[i].low = 430000000; d->rxbands[i].high = 440000000; d->rxbands[i].step = 12500; } for (i = 0; i < d->nrtxbands; i++) { d->txbands[i].low = 430000000; d->txbands[i].high = 440000000; d->txbands[i].step = 12500; } errdesc: /* retrieve audio devs */ api->audiodevs = audio_get_device_list(); return api; } err2: CloseHandle(hprocess); err1: UnmapViewOfFile(globalstate); return NULL; err3: UnmapViewOfFile(state); CloseHandle(hmutex); CloseHandle(hflxtxevent); CloseHandle(hflxrxevent); goto err2; } /* MUTEX_ALL_ACCESS, EVENT_ALL_ACCESS, EVENT_MODIFY_STATE */ void win32shmem_close(struct trxapi *api) { if (!api) return; if (api->desc) free(api->desc); if (api->audiodevs) free(api->audiodevs); UnmapViewOfFile(api->state); CloseHandle(api->hmutex); CloseHandle(api->hflxtxevent); CloseHandle(api->hflxrxevent); free(api); } void win32shmem_lock(struct trxapi *api) { if (!api) return; WaitForSingleObject(api->hmutex, INFINITE); } void win32shmem_unlock(struct trxapi *api) { if (!api) return; ReleaseMutex(api->hmutex); } void win32shmem_wakeup(struct trxapi *api) { if (!api) return; SetEvent(api->hflxtxevent); } int win32shmem_init(int *argc, char **argv) { return 0; } const struct trxapi_description *win32shmem_get_description(struct trxapi *api) { if (!api) return NULL; return api->desc; } int win32shmem_get_state(struct trxapi *api, struct trxapi_state *state) { struct trx_thread_state *servant; if (!state || !api) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; win32shmem_lock(api); switch (servant->mode) { case MODE_FSK: case MODE_AFSK: case MODE_EXTERNAL: state->mode = trxapi_mode_packet; break; case MODE_AUDIO: state->mode = trxapi_mode_audio; break; default: state->mode = trxapi_mode_unspec; } if (servant->flags & (FLG_T7FERROR | FLG_MODEMERROR)) { state->rxfreq = 0; state->txfreq = 0; } else { state->rxfreq = 430000000 + 12500*servant->rxdiv; state->txfreq = 430000000 + 12500*servant->txdiv; } state->ptt = servant->ptt ? 1 : 0; state->manualptt = (servant->flags & FLG_MANUALPTT) ? 1 : 0; state->dcd = servant->dcd ? 1 : 0; state->rssi = RSSI_MIN+(servant->rssi*((RSSI_MAX-RSSI_MIN)/255.0)); win32shmem_unlock(api); return 0; } int win32shmem_set_ptt(struct trxapi *api, unsigned int ptt) { struct trx_thread_state *servant; if (!api) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; win32shmem_lock(api); if (ptt) servant->flags |= FLG_MANUALPTT; else servant->flags &= ~FLG_MANUALPTT; servant->flags |= FLG_SETPTT; win32shmem_unlock(api); return 0; } int win32shmem_set_frequency(struct trxapi *api, trxapi_frequency_t rx, trxapi_frequency_t tx) { struct trx_thread_state *servant; unsigned int dr, dt; if (!api) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; if (rx < 430000000) rx = 0; else rx -= (430000000-12500/2); if (tx < 430000000) tx = 0; else tx -= (430000000-12500/2); if (rx > 10000000) dr = 800; else dr = ((unsigned int)rx) / 12500; if (tx > 10000000) dt = 800; else dt = ((unsigned int)tx) / 12500; win32shmem_lock(api); servant->newrxdiv = dr; servant->newtxdiv = dt; servant->flags |= FLG_SETFREQ | FLG_SAVECONFIG; servant->cfg.freq.rx = 430000000 + 12500 * dr; servant->cfg.freq.tx = 430000000 + 12500 * dt; win32shmem_unlock(api); return 0; } /* Raw UART */ int win32shmem_uart_send(struct trxapi *api, const char *str) { struct trx_thread_state *servant; int r; if (!api || !str) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; win32shmem_lock(api); r = addtxfifo(servant, str, strlen(str)); win32shmem_unlock(api); if (r) return -1; return 0; } int win32shmem_uart_receive(struct trxapi *api, unsigned long *ptr, char *str, unsigned int strsz) { struct trx_thread_state *servant; unsigned int i, p; if (!api || !str || strsz < 2 || !ptr) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; win32shmem_lock(api); p = *ptr; i = getrxfifo(servant, &p, str, strsz-1); *ptr = p; win32shmem_unlock(api); str[i] = 0; return 0; } /* Configuration stuff */ int win32shmem_baycomusb_adapter_get_config(struct trxapi *api, struct trxapi_baycomusb_adapter_config *cfg) { struct trx_thread_state *servant; if (!api || !cfg) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; win32shmem_lock(api); *cfg = servant->cfg.adapt; win32shmem_unlock(api); return 0; } int win32shmem_baycomusb_adapter_set_config(struct trxapi *api, const struct trxapi_baycomusb_adapter_config *cfg) { struct trx_thread_state *servant; unsigned char rfsq; if (!api || !cfg) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; win32shmem_lock(api); if (checkreload_adapt(servant, cfg)) servant->flags |= FLG_RELOADMODEM; servant->cfg.adapt = *cfg; /* clamp values */ if (servant->cfg.adapt.rfsquelch <= RSSI_MIN) { servant->cfg.adapt.rfsquelch = RSSI_MIN; rfsq = 0; } else if (servant->cfg.adapt.rfsquelch >= RSSI_MAX) { servant->cfg.adapt.rfsquelch = RSSI_MAX; rfsq = 255; } else rfsq = (servant->cfg.adapt.rfsquelch - RSSI_MIN) * (255.0/(RSSI_MAX-RSSI_MIN)); #if defined(WIN32) || defined(USERMODEDRV) servant->audioparam.rfsquelch = rfsq; #endif servant->flags |= FLG_SAVECONFIG; win32shmem_unlock(api); return 0; } const struct trxapi_baycomusb_adapter_audio_devs *win32shmem_baycomusb_adapter_get_audiodevices(struct trxapi *api) { if (!api) return NULL; return api->audiodevs; } int win32shmem_channel_access_get_config(struct trxapi *api, struct trxapi_channel_access_config *cfg) { return -1; } int win32shmem_channel_access_set_config(struct trxapi *api, const struct trxapi_channel_access_config *cfg) { return -1; } int win32shmem_interface_get_config(struct trxapi *api, struct trxapi_interface_config *cfg) { return -1; } int win32shmem_interface_set_config(struct trxapi *api, const struct trxapi_interface_config *cfg) { return -1; } int win32shmem_modem_disconnect_get_config(struct trxapi *api, struct trxapi_modem_disconnect_config *cfg) { struct trx_thread_state *servant; if (!api || !cfg) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; win32shmem_lock(api); *cfg = servant->cfg.mdisc; win32shmem_unlock(api); return 0; } int win32shmem_modem_disconnect_set_config(struct trxapi *api, const struct trxapi_modem_disconnect_config *cfg) { struct trx_thread_state *servant; if (!api || !cfg) return -1; servant = api->state; if (servant->mode == MODE_DEAD) return -1; win32shmem_lock(api); if (checkreload_mdisc(servant, cfg)) servant->flags |= FLG_RELOADMODEM; servant->cfg.mdisc = *cfg; servant->flags |= FLG_SAVECONFIG; win32shmem_unlock(api); return 0; } /* Audio Stuff */ int win32shmem_get_audio_state(struct trxapi *api, struct trxapi_audio_state *state) { struct trx_thread_state *servant; if (!api || !state) return -1; servant = api->state; if (servant->mode != MODE_AUDIO) return -1; win32shmem_lock(api); state->samplerate = AUDIOSAMPLINGRATE; state->micbufsz = sizeof(servant->du.a.isrc.abuf); state->micbufptr = servant->du.a.isrc.aptr; state->spkbufsz = sizeof(servant->du.a.osrc.abuf); state->spkbufptr = servant->du.a.osrc.aptr; state->micsigpwr = servant->du.a.isrc.sigpwr; state->spksigpwr = servant->du.a.osrc.sigpwr; state->spknoisepwr = servant->du.a.osrc.noisepwr; win32shmem_unlock(api); return 0; } int win32shmem_get_audio_mic_samples(struct trxapi *api, unsigned long ptr, unsigned long len, unsigned char *samples) { struct trx_thread_state *servant; unsigned int x; if (!api || !samples || len <= 0) return -1; servant = api->state; if (servant->mode != MODE_AUDIO) return -1; win32shmem_lock(api); if (len > sizeof(servant->du.a.isrc.abuf) || ptr >= sizeof(servant->du.a.isrc.abuf)) goto err; x = sizeof(servant->du.a.isrc.abuf) - ptr; if (x > len) x = len; memcpy(samples, &servant->du.a.isrc.abuf[ptr], x); len -= x; if (len) memcpy(&samples[x], servant->du.a.isrc.abuf, len); win32shmem_unlock(api); return 0; err: win32shmem_unlock(api); return -1; } int win32shmem_get_audio_spk_samples(struct trxapi *api, unsigned long ptr, unsigned long len, unsigned char *samples) { struct trx_thread_state *servant; unsigned int x; if (!api || !samples || len <= 0) return -1; servant = api->state; if (servant->mode != MODE_AUDIO) return -1; win32shmem_lock(api); if (len > sizeof(servant->du.a.osrc.abuf) || ptr >= sizeof(servant->du.a.osrc.abuf)) goto err; x = sizeof(servant->du.a.osrc.abuf) - ptr; if (x > len) x = len; memcpy(samples, &servant->du.a.osrc.abuf[ptr], x); len -= x; if (len) memcpy(&samples[x], servant->du.a.osrc.abuf, len); win32shmem_unlock(api); return 0; err: win32shmem_unlock(api); return -1; } int win32shmem_set_audio_dtmf(struct trxapi *api, long ch) { struct trx_thread_state *servant; static const unsigned char dtmftransl[0x10] = { 0x13, 0x00, 0x10, 0x20, 0x01, 0x11, 0x21, 0x02, 0x12, 0x22, 0x30, 0x31, 0x32, 0x33, 0x03, 0x23 }; static const unsigned int freqlogrp[4] = { 697, 770, 852, 941 }; static const unsigned int freqhigrp[4] = { 1209, 1336, 1477, 1633 }; unsigned int sr, freq0 = 0, freq1 = 0, tr; if (!api) return -1; servant = api->state; if (servant->mode != MODE_AUDIO) return -1; sr = servant->du.a.p.srateusb; win32shmem_lock(api); if (ch == 16) { if (sr > 0) freq0 = (1750*65536 + sr/2) / sr; } else if (ch >= 0 && ch <= 15) { tr = dtmftransl[ch & 15]; freq0 = (freqlogrp[tr & 15]*65536+sr/2)/sr; freq1 = (freqhigrp[tr >> 4]*65536+sr/2)/sr; } else if (ch != -1) goto err; servant->du.a.isrc.freq0 = freq0; servant->du.a.isrc.freq1 = freq1; servant->du.a.isrc.ph0 = 0; servant->du.a.isrc.ph1 = 0; win32shmem_unlock(api); return 0; err: win32shmem_unlock(api); return -1; } /* --------------------------------------------------------------------- */ baycomusb-0.10.orig/trxctrl/0042755000175100017510000000000007340500011014105 5ustar abaababaycomusb-0.10.orig/trxctrl/Makefile.in0100644000175100017510000003661207340500011016155 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = @ORBIT_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv -I$(top_srcdir)/trxapi -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 -I$(top_srcdir)/kerneldrv -I$(top_srcdir)/wdmdrv -I$(top_srcdir)/flexdrv @WIN32_TRUE@PSRC = mainwin32.c cfgwin32.c audiowin32.c audio.c simd.c costab.c @WIN32_FALSE@@USERMODEDRV_TRUE@PSRC = mainunixuser.c cfgunix.c audiolinux.c audio.c simd.c costab.c @WIN32_FALSE@@USERMODEDRV_FALSE@PSRC = mainunix.c cfgunix.c @WIN32_TRUE@PPROG = delservice @WIN32_FALSE@PPROG = ifconftest @WIN32_TRUE@PLIB = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32 -lmsvcrt @WIN32_FALSE@PLIB = @WIN32_TRUE@delservice_SOURCES = delservice.c @WIN32_TRUE@delservice_LDADD = ../misc/libmisc.a @WIN32_TRUE@@DIRECTX_TRUE@DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32 @WIN32_TRUE@@DIRECTX_FALSE@DIRECTXLIBS = @WIN32_FALSE@DIRECTXLIBS = @WIN32_FALSE@ifconftest_SOURCES = ifconftest.c @CROSSCOMP_TRUE@CPROG = @CROSSCOMP_FALSE@CPROG = gentbl @CROSSCOMP_FALSE@gentbl_SOURCES = gentbl.c @CROSSCOMP_FALSE@BUILT_SOURCES = costab.c sbin_PROGRAMS = baycomusbserv noinst_PROGRAMS = $(PPROG) $(CPROG) baycomusbserv_SOURCES = trx.h common.c cfgadapt.c list.h $(PSRC) baycomusbserv_LDADD = ../trxapi/libtrxapiserver.a @ORBIT_LIBS@ ../usbdrv/libusb.a ../misc/libmisc.a @XMLLIBS@ @LIBTHREAD@ $(DIRECTXLIBS) EXTRA_DIST = mainunix.c mainunixuser.c mainwin32.c ifconftest.c cfgwin32.c cfgunix.c delservice.c common.c costab.c gentbl.c audio.c audiolinux.c audiowin32.c simd.c simd.h coeff.m mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = @CROSSCOMP_TRUE@@WIN32_TRUE@noinst_PROGRAMS = delservice$(EXEEXT) @CROSSCOMP_FALSE@@WIN32_FALSE@noinst_PROGRAMS = ifconftest$(EXEEXT) \ @CROSSCOMP_FALSE@@WIN32_FALSE@gentbl$(EXEEXT) @CROSSCOMP_TRUE@@WIN32_FALSE@noinst_PROGRAMS = ifconftest$(EXEEXT) @CROSSCOMP_FALSE@@WIN32_TRUE@noinst_PROGRAMS = delservice$(EXEEXT) \ @CROSSCOMP_FALSE@@WIN32_TRUE@gentbl$(EXEEXT) sbin_PROGRAMS = baycomusbserv$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) $(sbin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ @WIN32_TRUE@delservice_OBJECTS = delservice.$(OBJEXT) @WIN32_TRUE@delservice_DEPENDENCIES = ../misc/libmisc.a delservice_LDFLAGS = @WIN32_FALSE@ifconftest_OBJECTS = ifconftest.$(OBJEXT) ifconftest_LDADD = $(LDADD) ifconftest_DEPENDENCIES = ifconftest_LDFLAGS = @CROSSCOMP_FALSE@gentbl_OBJECTS = gentbl.$(OBJEXT) gentbl_LDADD = $(LDADD) gentbl_DEPENDENCIES = gentbl_LDFLAGS = @USERMODEDRV_FALSE@@WIN32_FALSE@baycomusbserv_OBJECTS = \ @USERMODEDRV_FALSE@@WIN32_FALSE@common.$(OBJEXT) cfgadapt.$(OBJEXT) \ @USERMODEDRV_FALSE@@WIN32_FALSE@mainunix.$(OBJEXT) cfgunix.$(OBJEXT) @USERMODEDRV_TRUE@@WIN32_TRUE@baycomusbserv_OBJECTS = common.$(OBJEXT) \ @USERMODEDRV_TRUE@@WIN32_TRUE@cfgadapt.$(OBJEXT) mainwin32.$(OBJEXT) \ @USERMODEDRV_TRUE@@WIN32_TRUE@cfgwin32.$(OBJEXT) audiowin32.$(OBJEXT) \ @USERMODEDRV_TRUE@@WIN32_TRUE@audio.$(OBJEXT) simd.$(OBJEXT) \ @USERMODEDRV_TRUE@@WIN32_TRUE@costab.$(OBJEXT) @USERMODEDRV_TRUE@@WIN32_FALSE@baycomusbserv_OBJECTS = common.$(OBJEXT) \ @USERMODEDRV_TRUE@@WIN32_FALSE@cfgadapt.$(OBJEXT) \ @USERMODEDRV_TRUE@@WIN32_FALSE@mainunixuser.$(OBJEXT) cfgunix.$(OBJEXT) \ @USERMODEDRV_TRUE@@WIN32_FALSE@audiolinux.$(OBJEXT) audio.$(OBJEXT) \ @USERMODEDRV_TRUE@@WIN32_FALSE@simd.$(OBJEXT) costab.$(OBJEXT) @USERMODEDRV_FALSE@@WIN32_TRUE@baycomusbserv_OBJECTS = common.$(OBJEXT) \ @USERMODEDRV_FALSE@@WIN32_TRUE@cfgadapt.$(OBJEXT) mainwin32.$(OBJEXT) \ @USERMODEDRV_FALSE@@WIN32_TRUE@cfgwin32.$(OBJEXT) audiowin32.$(OBJEXT) \ @USERMODEDRV_FALSE@@WIN32_TRUE@audio.$(OBJEXT) simd.$(OBJEXT) \ @USERMODEDRV_FALSE@@WIN32_TRUE@costab.$(OBJEXT) @DIRECTX_TRUE@@WIN32_TRUE@baycomusbserv_DEPENDENCIES = \ @DIRECTX_TRUE@@WIN32_TRUE@../trxapi/libtrxapiserver.a \ @DIRECTX_TRUE@@WIN32_TRUE@../usbdrv/libusb.a ../misc/libmisc.a @DIRECTX_TRUE@@WIN32_FALSE@baycomusbserv_DEPENDENCIES = \ @DIRECTX_TRUE@@WIN32_FALSE@../trxapi/libtrxapiserver.a \ @DIRECTX_TRUE@@WIN32_FALSE@../usbdrv/libusb.a ../misc/libmisc.a @DIRECTX_FALSE@@WIN32_FALSE@baycomusbserv_DEPENDENCIES = \ @DIRECTX_FALSE@@WIN32_FALSE@../trxapi/libtrxapiserver.a \ @DIRECTX_FALSE@@WIN32_FALSE@../usbdrv/libusb.a ../misc/libmisc.a @DIRECTX_FALSE@@WIN32_TRUE@baycomusbserv_DEPENDENCIES = \ @DIRECTX_FALSE@@WIN32_TRUE@../trxapi/libtrxapiserver.a \ @DIRECTX_FALSE@@WIN32_TRUE@../usbdrv/libusb.a ../misc/libmisc.a baycomusbserv_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(delservice_SOURCES) $(ifconftest_SOURCES) $(gentbl_SOURCES) $(baycomusbserv_SOURCES) OBJECTS = $(delservice_OBJECTS) $(ifconftest_OBJECTS) $(gentbl_OBJECTS) $(baycomusbserv_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps trxctrl/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstPROGRAMS: clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) distclean-noinstPROGRAMS: maintainer-clean-noinstPROGRAMS: mostlyclean-sbinPROGRAMS: clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) distclean-sbinPROGRAMS: maintainer-clean-sbinPROGRAMS: install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(sbindir) @list='$(sbin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) list='$(sbin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: delservice$(EXEEXT): $(delservice_OBJECTS) $(delservice_DEPENDENCIES) @rm -f delservice$(EXEEXT) $(LINK) $(delservice_LDFLAGS) $(delservice_OBJECTS) $(delservice_LDADD) $(LIBS) ifconftest$(EXEEXT): $(ifconftest_OBJECTS) $(ifconftest_DEPENDENCIES) @rm -f ifconftest$(EXEEXT) $(LINK) $(ifconftest_LDFLAGS) $(ifconftest_OBJECTS) $(ifconftest_LDADD) $(LIBS) gentbl$(EXEEXT): $(gentbl_OBJECTS) $(gentbl_DEPENDENCIES) @rm -f gentbl$(EXEEXT) $(LINK) $(gentbl_LDFLAGS) $(gentbl_OBJECTS) $(gentbl_LDADD) $(LIBS) baycomusbserv$(EXEEXT): $(baycomusbserv_OBJECTS) $(baycomusbserv_DEPENDENCIES) @rm -f baycomusbserv$(EXEEXT) $(LINK) $(baycomusbserv_LDFLAGS) $(baycomusbserv_OBJECTS) $(baycomusbserv_LDADD) $(LIBS) 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = trxctrl 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 audio.o: audio.c ../config.h trx.h ../misc/sysdeps.h ../trxapi/trxapi.h \ ../usbdrv/usbdrv.h list.h ../trxapi/trxctrl.h simd.h audiolinux.o: audiolinux.c ../config.h ../trxapi/trxapi.h \ ../misc/sysdeps.h trx.h ../usbdrv/usbdrv.h list.h \ ../trxapi/trxctrl.h cfgadapt.o: cfgadapt.c trx.h ../config.h ../misc/sysdeps.h \ ../trxapi/trxapi.h ../usbdrv/usbdrv.h list.h \ ../trxapi/trxctrl.h ../fpga/fsk_fpga.h ../fpga/fsk_firmware.h \ ../fpga/afsk_firmware.h ../fpga/sample_firmware.h \ ../firmware/reset2firmware.h ../firmware/dl2firmware.h \ ../firmware/bscanfirmware.h ../firmware/fskfirmware.h \ ../firmware/afskfirmware.h ../firmware/audio2firmware.h cfgunix.o: cfgunix.c ../config.h trx.h ../misc/sysdeps.h \ ../trxapi/trxapi.h ../usbdrv/usbdrv.h list.h \ ../trxapi/trxctrl.h common.o: common.c ../config.h trx.h ../misc/sysdeps.h \ ../trxapi/trxapi.h ../usbdrv/usbdrv.h list.h \ ../trxapi/trxctrl.h costab.o: costab.c trx.h ../config.h ../misc/sysdeps.h \ ../trxapi/trxapi.h ../usbdrv/usbdrv.h list.h \ ../trxapi/trxctrl.h gentbl.o: gentbl.c ../config.h ifconftest.o: ifconftest.c ../config.h trx.h ../misc/sysdeps.h \ ../trxapi/trxapi.h ../usbdrv/usbdrv.h list.h \ ../trxapi/trxctrl.h mainunixuser.o: mainunixuser.c ../config.h trx.h ../misc/sysdeps.h \ ../trxapi/trxapi.h ../usbdrv/usbdrv.h list.h \ ../trxapi/trxctrl.h simd.h simd.o: simd.c ../config.h ../misc/sysdeps.h trx.h ../trxapi/trxapi.h \ ../usbdrv/usbdrv.h list.h ../trxapi/trxctrl.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-sbinPROGRAMS 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-sbinPROGRAMS uninstall: uninstall-am all-am: Makefile $(PROGRAMS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(sbindir) 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: -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-sbinPROGRAMS \ mostlyclean-compile mostlyclean-tags \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-noinstPROGRAMS clean-sbinPROGRAMS clean-compile \ clean-tags clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-noinstPROGRAMS distclean-sbinPROGRAMS \ distclean-compile distclean-tags distclean-generic \ clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-noinstPROGRAMS \ maintainer-clean-sbinPROGRAMS 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-noinstPROGRAMS distclean-noinstPROGRAMS \ clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ mostlyclean-sbinPROGRAMS distclean-sbinPROGRAMS clean-sbinPROGRAMS \ maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \ install-sbinPROGRAMS mostlyclean-compile distclean-compile \ clean-compile maintainer-clean-compile 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 @CROSSCOMP_FALSE@$(srcdir)/costab.c: gentbl$(EXEEXT) @CROSSCOMP_FALSE@ ./gentbl$(EXEEXT) > $(srcdir)/costab.c # 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: baycomusb-0.10.orig/trxctrl/Makefile.am0100644000175100017510000000277007332023516016155 0ustar abaabaINCLUDES = @ORBIT_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \ -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv -I$(top_srcdir)/trxapi \ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 \ -I$(top_srcdir)/kerneldrv -I$(top_srcdir)/wdmdrv -I$(top_srcdir)/flexdrv if WIN32 PSRC = mainwin32.c cfgwin32.c audiowin32.c audio.c simd.c costab.c PPROG = delservice PLIB = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32 -lmsvcrt delservice_SOURCES = delservice.c delservice_LDADD = ../misc/libmisc.a if DIRECTX DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32 else DIRECTXLIBS = endif else if USERMODEDRV PSRC = mainunixuser.c cfgunix.c audiolinux.c audio.c simd.c costab.c else PSRC = mainunix.c cfgunix.c endif PPROG = ifconftest PLIB = ifconftest_SOURCES = ifconftest.c DIRECTXLIBS = endif if CROSSCOMP CPROG = else gentbl_SOURCES = gentbl.c BUILT_SOURCES = costab.c CPROG = gentbl $(srcdir)/costab.c: gentbl$(EXEEXT) ./gentbl$(EXEEXT) > $(srcdir)/costab.c endif sbin_PROGRAMS = baycomusbserv noinst_PROGRAMS = $(PPROG) $(CPROG) baycomusbserv_SOURCES = trx.h common.c cfgadapt.c list.h $(PSRC) baycomusbserv_LDADD = ../trxapi/libtrxapiserver.a @ORBIT_LIBS@ ../usbdrv/libusb.a ../misc/libmisc.a @XMLLIBS@ @LIBTHREAD@ $(DIRECTXLIBS) EXTRA_DIST = mainunix.c mainunixuser.c mainwin32.c ifconftest.c \ cfgwin32.c cfgunix.c delservice.c common.c \ costab.c gentbl.c audio.c audiolinux.c audiowin32.c simd.c simd.h coeff.m baycomusb-0.10.orig/trxctrl/ifconftest.c0100644000175100017510000000604507325134424016433 0ustar abaaba/*****************************************************************************/ /* * ifconftest.c -- Test SIOCGIFCONF ioctl. * * Copyright (C) 2000 * Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _REENTRANT #include "trx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #else #include "getopt.h" #endif #ifdef HAVE_SYSLOG_H #include #endif //#ifdef HAVE_NET_IF_H //#include //#endif #ifdef HAVE_LINUX_IF_H #include #endif #ifdef HAVE_LINUX_AX25_H #include #endif #ifdef HAVE_LINUX_SOCKIOS_H #include #endif #ifdef HAVE_LINUX_IF_ETHER_H #include #endif #if defined(HAVE_ARPA_INET_H) && !defined(WIN32) #include #endif /* --------------------------------------------------------------------- */ int main(int argc, char *argv[]) { unsigned char buf[8192]; struct ifconf ifconf; struct ifreq *ifr, *cur, *end, ifr2; int fd; if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } ifconf.ifc_len = sizeof(buf); ifconf.ifc_buf = buf; if (ioctl(fd, SIOCGIFCONF, &ifconf) == -1) { perror("ioctl SIOCGIFCONF"); exit(1); } ifr = (struct ifreq *)ifconf.ifc_buf; end = (struct ifreq *)(((char *)ifconf.ifc_buf) + ifconf.ifc_len); while (ifr < end) { cur = ifr; ifr = (struct ifreq *)(((char *)ifr) + sizeof(struct ifreq)); memcpy(&ifr2, cur, sizeof(ifr2)); if (ioctl(fd, SIOCGIFHWADDR, &ifr2)) { perror("ioctl SIOCGIFHWADDR"); exit(1); } printf("IF Family: %u Name: %s Hwaddr Family: %d\n", cur->ifr_addr.sa_family, cur->ifr_name, ifr2.ifr_addr.sa_family); } exit(0); } baycomusb-0.10.orig/trxctrl/gentbl.c0100644000175100017510000000433207325305412015534 0ustar abaaba/*****************************************************************************/ /* * gentbl.c -- Soundmodem table generator. * * Copyright (C) 1996-1999,2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include /* -------------------------------------------------------------------- */ static const char *progname; /* -------------------------------------------------------------------- */ static void gen_costab(unsigned size, FILE *f) { int i; fprintf(f, "#include \n#include \"trx.h\"\n\n/*\n * cosine table\n */\n\n" "const int16_t costab[%d] = {", size); for (i = 0; i < size; i++) { if (!(i & 7)) fprintf(f, "\n\t"); fprintf(f, "%6d", (int)(32767.0*cos(i*(2.0*M_PI)/size))); if (i != (size-1)) fprintf(f, ", "); } fprintf(f, "\n};\n\n"); } /* -------------------------------------------------------------------- */ int main(int argc, char *argv[]) { progname = argv[0]; if (argc != 1) { fprintf(stderr, "usage: gentbl\n"); exit(1); } gen_costab(512, stdout); exit(0); } /* -------------------------------------------------------------------- */ baycomusb-0.10.orig/trxctrl/trx.h0100644000175100017510000003343607340451650015115 0ustar abaaba/*****************************************************************************/ /* * trx.h -- Transceiver control master include file. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifndef _TRX_H #define _TRX_H /* --------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "sysdeps.h" #include "trxapi.h" #include "usbdrv.h" #include "list.h" #if defined(ORBITIPC) #include "trxctrl.h" #endif #if !defined(WIN32) #include #endif #if defined(HAVE_SYS_SOCKET_H) && !defined(WIN32) #include #endif #ifdef HAVE_LINUX_IF_H #include #endif #if defined(HAVE_DIRECTX) #include #endif #if defined(HAVE_WINDOWS_H) #include #endif #if defined(WIN32) #include "flexdrv.h" #endif /* ---------------------------------------------------------------------- */ #define BAYCOMUSB_VENDORID 0xbac0 #define BAYCOMUSB_PRODUCTID_EMPTY 0x6134 #define BAYCOMUSB_PRODUCTID_FPGALD 0x6135 #define BAYCOMUSB_PRODUCTID_MODEM 0x6136 #define BAYCOMUSB_PRODUCTID_AUDIO 0x6137 /* --------------------------------------------------------------------- */ #if defined(WIN32) #define IORREGHKEY HKEY_LOCAL_MACHINE #define IORREGPATH "SOFTWARE\\FlexNet\\Transceivers" #define SERVICENAME "baycomusb_server" #define SERVICEDISPLAYNAME "Baycom USBFLEX Modem" #define USECRITICALSECT #else #define IORIDPATH "/var/hamradio/transceivers" #define NETIFMUXDEV "/dev/baycomusb" #endif /* --------------------------------------------------------------------- */ #if defined(WIN32) #define NUMTXPACKETS 32 #define NUMRXPACKETS 32 #else #define MAXFLEN 512 #define NUMTXPACKETS 16 #define NUMRXPACKETS 1 #endif #define NUMAUDIOURB 4 #define NUMFRAMESPERURB 32 #define AUDIOSAMPLINGRATE 16000 #define AUDIOBUFSIZE 16384 #define INTERRUPT_INTERVAL 10 /* poll interrupt pipe every 10ms */ #define UARTTXDELAY 4 #define AUDIOOVERLAP 32 #define AUDIOFILTERLEN 8U #define AUDIONUMFILTER 32U #define AUDIOFILTERIDX(x) (((x) >> 11U) & 31U) #define AUDIOFILTERSAMPLE(x) ((x)>>16) #define AUDIOSRCPHASEFRAC 16 #define AUDIOSRCPHASEMASK ((1<>7)&0x1ff] #define SIN(x) COS((x)+0xc000) #define SNDLATENCY (AUDIOSAMPLINGRATE/4) /* approx 1/4 seconds */ /* * common.c */ extern void addrxfifo(struct trx_thread_state *ctrl, const unsigned char *rp, unsigned int rlen); extern unsigned int getrxfifo(struct trx_thread_state *ctrl, unsigned int *ptr, unsigned char *p, unsigned int len); extern int addtxfifo(struct trx_thread_state *ctrl, const unsigned char *tp, unsigned int tlen); extern int checkreload_adapt(struct trx_thread_state *servant, struct trxapi_baycomusb_adapter_config *cfg); extern int checkreload_mdisc(struct trx_thread_state *servant, struct trxapi_modem_disconnect_config *cfg); extern void trx_thread(struct trx_thread_state *state); extern int getuartline(struct trx_thread_state *ctrl, unsigned int *ptr, unsigned char *buf, size_t bufsz, unsigned int timeout); /* * mainwin32.c */ #if defined(WIN32) #define MAXUSBMODEMS 8 #define BAYUSBSIGNATURE "baycomusbv1" struct win32_global_state { char signature[16]; unsigned int processid; struct { HANDLE hshmem; } modem[MAXUSBMODEMS]; }; /* KB Q164787 */ extern void CALLBACK server_entry_cmdline(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); extern int server_entry_parse_argv(int argc, char *argv[]); extern int server_entry_run(void); extern void server_entry_quit(void); #endif /* --------------------------------------------------------------------- */ #endif /* _TRX_H */ baycomusb-0.10.orig/trxctrl/common.c0100644000175100017510000002166107340451624015561 0ustar abaaba/*****************************************************************************/ /* * common.c -- Common routines needed by driver and clients. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * 0.2 09.03.2001 Now requiring T7F firmware V1.44 * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _REENTRANT #include "trx.h" /* --------------------------------------------------------------------- */ void addrxfifo(struct trx_thread_state *ctrl, const unsigned char *rp, unsigned int rlen) { struct rxuartfifo *fifo = &ctrl->rfifo; unsigned int sz, ptr; while (rlen > 0) { ptr = fifo->wr % sizeof(fifo->buf); sz = sizeof(fifo->buf) - ptr; if (sz > rlen) sz = rlen; memcpy(&fifo->buf[ptr], rp, sz); rp += sz; rlen -= sz; fifo->wr += sz; } } unsigned int getrxfifo(struct trx_thread_state *ctrl, unsigned int *ptr, unsigned char *p, unsigned int len) { struct rxuartfifo *fifo = &ctrl->rfifo; unsigned int sz, pt, pt2, cnt = 0; signed int diff; pt = fifo->wr - *ptr; if (pt > sizeof(fifo->buf)) pt = sizeof(fifo->buf); pt = fifo->wr - pt; while (len > 0) { diff = fifo->wr - pt; if (diff <= 0) break; pt2 = pt % sizeof(fifo->buf); sz = sizeof(fifo->buf) - pt2; if (sz > len) sz = len; if (sz > diff) sz = diff; memcpy(p, &fifo->buf[pt2], sz); p += sz; len -= sz; pt += sz; cnt += sz; } *ptr = pt; return cnt; } int addtxfifo(struct trx_thread_state *ctrl, const unsigned char *tp, unsigned int tlen) { struct txuartfifo *fifo = &ctrl->tfifo; unsigned int len; len = (sizeof(fifo->buf) - 1 + fifo->rd - fifo->wr) % sizeof(fifo->buf); if (tlen > len) return -len; while (tlen > 0) { len = tlen; if (fifo->wr + len > sizeof(fifo->buf)) len = sizeof(fifo->buf) - fifo->wr; memcpy(&fifo->buf[fifo->wr], tp, len); fifo->wr = (fifo->wr + len) % sizeof(fifo->buf); tp += len; tlen -= len; } return 0; } /* --------------------------------------------------------------------- */ int checkreload_adapt(struct trx_thread_state *servant, struct trxapi_baycomusb_adapter_config *cfg) { struct trxapi_baycomusb_adapter_config *cfgo = &servant->cfg.adapt; if (cfgo->mode != cfg->mode || cfgo->fclk != cfg->fclk) return 1; if (cfg->mode == trxapi_baycomusb_mode_fsk || cfg->mode == trxapi_baycomusb_mode_external || cfg->mode == trxapi_baycomusb_mode_afsk) { if (cfgo->bitraterx != cfg->bitraterx || cfgo->bitratetx != cfg->bitratetx || cfgo->loopback != cfg->loopback || cfgo->pttmute != cfg->pttmute || cfgo->filtmode != cfg->filtmode) return 1; } else if (cfg->mode == trxapi_baycomusb_mode_audio) { if (cfgo->samplerate != cfg->samplerate || cfgo->gain != cfg->gain || strcmp(cfgo->audiodevin, cfg->audiodevin) || strcmp(cfgo->audiodevout, cfg->audiodevout)) return 1; } return 0; } int checkreload_mdisc(struct trx_thread_state *servant, struct trxapi_modem_disconnect_config *cfg) { struct trxapi_modem_disconnect_config *cfgo = &servant->cfg.mdisc; if (cfgo->rxc != cfg->rxc) return 1; if (cfgo->txc != cfg->txc) return 1; if (cfgo->txd != cfg->txd) return 1; return 0; } /* --------------------------------------------------------------------- */ static int setfreq(struct trx_thread_state *state) { unsigned int rxf, txf, fifoptr; unsigned char buff[16]; unsigned char buf[256]; int r; acquire_trxdata_mutex(state); fifoptr = state->rfifo.wr; rxf = state->newrxdiv; txf = state->newtxdiv; snprintf(buff, sizeof(buff), "\rC?%03d%03d\r", txf, rxf); if (!(state->flags & FLG_T7FERROR) && (state->flags & FLG_MANUALPTT)) { state->flags |= FLG_SETPTT | FLG_INHIBITSETPTT | FLG_CLRPTT; release_trxdata_mutex(state); for (r = 0; r < 20; r++) { if (polldevice(state)) return -1; if (!state->ptt) break; } acquire_trxdata_mutex(state); } addtxfifo(state, buff, 10); release_trxdata_mutex(state); for (;;) { r = getuartline(state, &fifoptr, buf, sizeof(buf), 5000); if (r <= 0) { acquire_trxdata_mutex(state); state->flags |= FLG_SETFREQ | FLG_T7FERROR; state->flags &= ~FLG_INHIBITSETPTT; release_trxdata_mutex(state); return r; } if (!memcmp(buf, buff+1, 8)) { acquire_trxdata_mutex(state); state->t7fport = 0; state->flags |= FLG_SETT7FPORT | FLG_SAVECONFIG; state->flags &= ~(FLG_T7FERROR | FLG_INHIBITSETPTT); state->rxdiv = rxf; state->txdiv = txf; release_trxdata_mutex(state); return 0; } } } static int checktransceiver(struct trx_thread_state *state) { unsigned int fifoptr; unsigned char buff[16]; unsigned char buf[256]; unsigned char *cp; int r; acquire_trxdata_mutex(state); fifoptr = state->rfifo.wr; snprintf(buff, sizeof(buff), "\rV\r"); addtxfifo(state, buff, 10); release_trxdata_mutex(state); for (;;) { r = getuartline(state, &fifoptr, buf, sizeof(buf), 2500); if (r < 0) return r; if (!r) return -1; if (buf[0] == 'V') { cp = buf + 1; while (*cp != 0 && *cp != '\r' && *cp != '\n') cp++; *cp = 0; lprintf(2, "T7F Firmware Version: %s\n", buf+1); return 0; } } } static void mainloop(struct trx_thread_state *state) { int r; while (!check_quit()) { acquire_trxdata_mutex(state); if (state->flags & FLG_SAVECONFIG) { state->flags &= ~FLG_SAVECONFIG; config_savedevice(state); release_trxdata_mutex(state); config_save(); continue; } if (state->flags & FLG_RELOADMODEM) { state->flags &= ~FLG_RELOADMODEM; state->flags |= FLG_MODEMERROR | FLG_T7FERROR; release_trxdata_mutex(state); netif_close(state); state->rssi = 0; state->dcd = state->ptt = 0; /* need to reset the adapter first to get descriptors with bulk pipes for FPGA download */ r = adapter_reset(state->usbdev); #if 0 if (r) { sleep(1); r = adapter_reset(state->usbdev); } #endif if (r) { lprintf(1, "Error resetting adapter: %d\n", r); return; } r = reopen_usbdev(state); if (r) { lprintf(1, "Error reopening USB device: %d\n", r); return; } r = adapter_finalinit(state); if (r) { lprintf(1, "Error during final initialization of adapter: %d\n", r); return; } r = netif_open(state); if (r) { #if defined(WIN32) || defined(USERMODEDRV) #define STR "" #else #define STR " (baycom_usb.o loaded?)" #endif lprintf(1, "Error during network interface opening" STR ": %d\n", r); #undef STR return; } acquire_trxdata_mutex(state); state->flags &= ~FLG_MODEMERROR; state->flags |= FLG_RECONFINTF | FLG_RECONFCHACC | FLG_SETMDISCDIR | FLG_SETMDISCOUT | FLG_SETT7FPORT | FLG_SETFREQ | FLG_SAVECONFIG; release_trxdata_mutex(state); r = checktransceiver(state); if (r) r = checktransceiver(state); if (r) { state->flags |= FLG_T7FERROR; lprintf(1, "Error while checking the T7F firmware\n"); } continue; } if (state->flags & FLG_SETFREQ) { state->flags &= ~FLG_SETFREQ; release_trxdata_mutex(state); /* do it twice since T7F apparently doesn't get it the first time... */ if (setfreq(state)) return; if (setfreq(state)) return; continue; } release_trxdata_mutex(state); if (polldevice(state)) return; } } /* --------------------------------------------------------------------- */ void trx_thread(struct trx_thread_state *state) { trxapi_frequency_t rx, tx; config_loaddevice(state); rx = state->cfg.freq.rx; tx = state->cfg.freq.tx; if (rx < 430000000 || rx > 440000000) rx = 433350000; if (tx < 430000000 || tx > 440000000) tx = 433350000; state->newrxdiv = (rx-430000000+12500/2)/12500; state->newtxdiv = (tx-430000000+12500/2)/12500; init_object(state); init_shmem_object(state); mainloop(state); destroy_shmem_object(state); destroy_object(state); } /* --------------------------------------------------------------------- */ baycomusb-0.10.orig/trxctrl/cfgadapt.c0100644000175100017510000007006707340456065016052 0ustar abaaba/*****************************************************************************/ /* * cfgadapt.c -- Baycom USB modem Anchorchip/Xilinx firmware loading. * * Copyright (C) 1999-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * * History: * 0.1 26.05.99 Created * */ /*****************************************************************************/ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include "trx.h" #include "usbdrv.h" #include "fpga/fsk_fpga.h" #include "fpga/fsk_firmware.h" #include "fpga/afsk_firmware.h" #include "fpga/sample_firmware.h" #include "firmware/reset2firmware.h" #include "firmware/dl2firmware.h" #include "firmware/bscanfirmware.h" #include "firmware/fskfirmware.h" #include "firmware/afskfirmware.h" #if defined(WIN32) || defined(USERMODEDRV) #include "firmware/audio2firmware.h" #define audiofirmware audio2firmware #define SAMPLERATE AUDIOSAMPLINGRATE #else #include "firmware/audiofirmware.h" #define SAMPLERATE state->cfg.adapt.samplerate #endif /* ---------------------------------------------------------------------- */ static void printconfig(const struct trx_thread_state *state) { #if defined(WIN32) lprintf(1, "configuration for serial \"%s\"\n" " adapter: mode %s, fclk %lu Hz, bitrate %lu/%lu, loopback %u, %spttmute, filtmode %lu gain %f\n" " modem disconnect: output 0x%02lx, direction 0x%02lx, rxc %u, txc %u, txd %u\n", state->serial, (state->cfg.adapt.mode == trxapi_baycomusb_mode_fsk) ? "fsk" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_external) ? "external" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_afsk) ? "afsk" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_audio) ? "audio" : "off", state->cfg.adapt.fclk, state->cfg.adapt.bitraterx, state->cfg.adapt.bitratetx, state->cfg.adapt.loopback, state->cfg.adapt.pttmute ? "" : "no ", state->cfg.adapt.filtmode, state->cfg.adapt.gain, state->cfg.mdisc.output, state->cfg.mdisc.direction, state->cfg.mdisc.rxc, state->cfg.mdisc.txc, state->cfg.mdisc.txd); #else lprintf(1, "configuration for serial \"%s\"\n" " adapter: mode %s, fclk %lu Hz, bitrate %lu/%lu, loopback %u, %spttmute, filtmode %lu gain %f\n" " channel access: txdelay %lums, slottime %lums, ppersistence %lu txtail %lums, %sduplex\n" " interface: ifname %s, hwaddr %s, ipaddr %u.%u.%u.%u, netmask %u.%u.%u.%u, broadcast %u.%u.%u.%u\n" " modem disconnect: output 0x%02lx, direction 0x%02lx, rxc %u, txc %u, txd %u\n", state->serial, (state->cfg.adapt.mode == trxapi_baycomusb_mode_fsk) ? "fsk" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_external) ? "external" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_afsk) ? "afsk" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_audio) ? "audio" : "off", state->cfg.adapt.fclk, state->cfg.adapt.bitraterx, state->cfg.adapt.bitratetx, state->cfg.adapt.loopback, state->cfg.adapt.pttmute ? "" : "no ", state->cfg.adapt.filtmode, state->cfg.adapt.gain, state->cfg.chacc.txdelay, state->cfg.chacc.slottime, state->cfg.chacc.ppersistence, state->cfg.chacc.txtail, state->cfg.chacc.fullduplex ? "full" : "half", state->cfg.intf.ifname, state->cfg.intf.hwaddr, state->cfg.intf.ipaddr[0], state->cfg.intf.ipaddr[1], state->cfg.intf.ipaddr[2], state->cfg.intf.ipaddr[3], state->cfg.intf.netmask[0], state->cfg.intf.netmask[1], state->cfg.intf.netmask[2], state->cfg.intf.netmask[3], state->cfg.intf.broadcast[0], state->cfg.intf.broadcast[1], state->cfg.intf.broadcast[2], state->cfg.intf.broadcast[3], state->cfg.mdisc.output, state->cfg.mdisc.direction, state->cfg.mdisc.rxc, state->cfg.mdisc.txc, state->cfg.mdisc.txd); #endif } /* ---------------------------------------------------------------------- */ static unsigned int readconfigrom(const unsigned char *firmware, const unsigned long rom[16]) { unsigned ret = 0, mask = 1, i, j; for (i = 0; i < 16; i++, mask <<= 1) { j = rom[i]; if (!(firmware[j >> 3] & (1 << (j & 7)))) ret |= mask; } return ret & 0xffff; } /* warning: if used, don't use CRC bitstream, there's currently no code to recalc the CRC */ static void writeconfigrom(unsigned char *firmware, const unsigned long rom[16], unsigned val) { unsigned mask = 1, i, j; for (i = 0; i < 16; i++, mask <<= 1) { j = rom[i]; if (val & mask) firmware[j >> 3] &= ~(1 << (j & 7)); else firmware[j >> 3] |= 1 << (j & 7); } } /* ---------------------------------------------------------------------- */ /* * Filter calc routines */ static const float filt_comp[32] = { -0.0000, -0.0071, -0.0144, -0.0160, -0.0028, 0.0279, 0.0617, 0.0683, 0.0208, -0.0765, -0.1732, -0.1877, -0.0525, 0.2365, 0.5993, 0.9000, 1.0122, 0.8857, 0.5741, 0.2060, -0.0825, -0.2130, -0.1919, -0.0888, 0.0138, 0.0649, 0.0606, 0.0281, -0.0021, -0.0152, -0.0139, -0.0070 }; /* -------------------------------------------------------------------- */ #define HAMMING(x) (0.54-0.46*cos(2*M_PI*(x))); extern inline float hamming(float x) { return 0.54-0.46*cos(2*M_PI*x); } extern inline float sinc(float x) { if (x == 0) return 1; x *= M_PI; return sin(x)/x; } /* -------------------------------------------------------------------- */ #if 0 static void filt_printfcoeff(const float coeff[32]) { int i; lprintf(3, "filter coefficients:"); for (i = 0; i < 32; i++) { if (!(i & 7)) lprintf(3, "\n "); lprintf(3, "%6.2f", coeff[i]); } lprintf(3, '\n'); } static void filt_printicoeff(const int coeff[32]) { int i; lprintf(3, "filter coefficients:"); for (i = 0; i < 32; i++) { if (!(i & 7)) lprintf(3, "\n "); lprintf(3, "%5i", coeff[i]); } lprintf(3, '\n'); } #endif /* -------------------------------------------------------------------- */ static void filt_genideal(float coeff[32]) { int i; for (i = 0; i < 32; i++) coeff[i] = hamming(i / 31.0) * sinc((i - 15.5) / 4.0); } /* -------------------------------------------------------------------- */ static void filt_rom(const float coeff[32], unsigned rom[16]) { float max = 0.000001, s; int ocoeff[32]; int i, j; /* scale filter values */ for(i = 0; i < 4; i++) { for(s = 0, j = i; j < 32; j += 4) s += fabs(coeff[j]); if (s > max) max = s; } s = 126.0 / max; for(i = 0; i < 32; i++) ocoeff[i] = s * coeff[i]; /* convert to internal ROM representation */ memset(rom, 0, sizeof(rom[0])*16); for (i = 0; i < 8; i++) for (j = 0; j < 16; j++) { if ((1 << i) & ocoeff[j]) rom[i] |= 1 << (((j + 1) & 3) | (j & 12)); if ((1 << i) & ocoeff[j+16]) rom[i+8] |= 1 << j; } } /* ---------------------------------------------------------------------- */ static int writecpucs(struct usbdevice *dev, unsigned char buf) { int r; r = usb_control_msg(dev, 0x40, 0xa0, 0x7F92, 0, 1, &buf, 5000); if (r != 1) { lprintf(2, "ezusb: writecpucs(0x%02x) failed %d\n", buf, r); return -1; } return 0; } static int loadmem(struct usbdevice *dev, const unsigned char *fw, unsigned int len) { unsigned addr, sz; int r; if (writecpucs(dev, 1)) return -1; for (addr = 0; addr < len; addr += 64) { sz = len - addr; if (sz > 64) sz = 64; r = usb_control_msg(dev, 0x40, 0xa0, addr, 0, sz, (void *)(fw+addr), 5000); if (r != sz) { lprintf(2, "ezusb: code download(sz=%d,addr=0x%04x) returned %d\n", sz, addr, r); return -1; } } return 0; } /* --------------------------------------------------------------------- */ static int displaymem(struct usbdevice *dev) { unsigned char buf[16]; unsigned addr, u; int r; printf("EZUSB Memory contents:\n"); for (addr = 0; addr < 0x2000; addr += 16) { r = usb_control_msg(dev, 0xc0, 0xa0, addr, 0, 16, buf, 5000); if (r != 16) { lprintf(2, "ezusb: code upload(sz=%d,addr=0x%04x) returned %d\n", 16, addr, r); return -1; } printf("%04x:", addr); for (u = 0; u < 16; u++) printf(" %02x", buf[u]); printf("\n"); } r = usb_control_msg(dev, 0xc0, 0xa0, 0x7F92, 0, 1, buf, 5000); if (r != 1) { lprintf(2, "ezusb: readcpucs returned %d\n", r); return -1; } printf("CPUCS: %02x\n", buf[0]); return 0; } static int displaycpucs(struct usbdevice *dev) { unsigned char buf; int r; r = usb_control_msg(dev, 0xc0, 0xa0, 0x7F92, 0, 1, &buf, 5000); if (r != 1) { lprintf(2, "ezusb: readcpucs returned %d\n", r); return -1; } printf("CPUCS: %02x\n", buf); return 0; } /* --------------------------------------------------------------------- */ int adapter_reset(struct usbdevice *dev) { /* first download the loader firmware to the AnchorChips core */ lprintf(30, "baycomusb: downloading reset2 firmware\n"); if (loadmem(dev, reset2firmware, sizeof(reset2firmware)) || /* start AnchorChips core */ writecpucs(dev, 0)) return -1; return 0; } /* --------------------------------------------------------------------- */ struct anfwstat { unsigned char errcode; unsigned char errval; unsigned count; }; static int anchor_fw_stat(struct usbdevice *dev, struct anfwstat *st) { unsigned char buf[4]; int r; r = usb_control_msg(dev, 0xc0, 0xb1, 0, 0, 4, buf, 5000); if (r != 4) { lprintf(2, "usb_control_msg(0xb1) error %s\n", strerror(errno)); return -1; } lprintf(4, "ezusb: anchorstat: errcode 0x%02x errval 0x%02x cfgcntr 0x%04x\n", buf[0], buf[1], buf[2] | (buf[3] << 8)); st->errcode = buf[0]; st->errval = buf[1]; st->count = buf[2] | (buf[3] << 8); return 0; } /* --------------------------------------------------------------------- */ static unsigned int prepare_fsk(struct trx_thread_state *state, unsigned char *fpga, unsigned char *fw) { float fcoeff[32]; unsigned int filtrom[16]; unsigned int dividerrx, dividertx; unsigned int i; /* copy FPGA firmware */ memcpy(fpga, fsk_firmware, FPGA_CONFIGSIZE); memcpy(fw, fskfirmware, sizeof(fskfirmware)); strncpy(&fw[0xf0], state->serial, 0x10); fw[0xe6] = (state->cfg.adapt.mode == trxapi_baycomusb_mode_external); fw[0xe7] = state->cfg.adapt.pttmute; /* calculate the divider */ dividerrx = (state->cfg.adapt.fclk + 8 * state->cfg.adapt.bitraterx) / (16 * state->cfg.adapt.bitraterx); if (dividerrx < 1) dividerrx = 1; if (dividerrx > 1024) dividerrx = 1024; state->cfg.adapt.bitraterx = (state->cfg.adapt.fclk + 8 * dividerrx) / (16 * dividerrx); dividertx = (state->cfg.adapt.fclk + 8 * state->cfg.adapt.bitratetx) / (16 * state->cfg.adapt.bitratetx); if (dividertx < 1) dividertx = 1; if (dividertx > 1024) dividertx = 1024; state->cfg.adapt.bitratetx = (state->cfg.adapt.fclk + 8 * dividertx) / (16 * dividertx); fw[0xe0] = state->cfg.adapt.bitratetx; fw[0xe1] = state->cfg.adapt.bitratetx >> 8; fw[0xe2] = state->cfg.adapt.bitratetx >> 16; fw[0xe3] = state->cfg.adapt.bitraterx; fw[0xe4] = state->cfg.adapt.bitraterx >> 8; fw[0xe5] = state->cfg.adapt.bitraterx >> 16; /* patch configuration ROM's */ #if 0 if (state->cfg.adapt.intclk) writeconfigrom(fpga, fsk_roms+FSK_ROM_CLKSELROM, 0); #endif writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX0, 1 << ((dividerrx-1) & 0xf)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX1, 1 << (((dividerrx-1) >> 4) & 0xf)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX2, 0x1000 << (((dividerrx-1) >> 8) & 0x3)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX0, 1 << ((dividertx-1) & 0xf)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX1, 1 << (((dividertx-1) >> 4) & 0xf)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX2, 0x1000 << (((dividertx-1) >> 8) & 0x3)); if (state->cfg.adapt.mode == trxapi_baycomusb_mode_external) { writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMID, 0xcccc); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIC, 0x0c0c); /* RxC: rising edge */ writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOC, 0x3030); /* TxC: falling edge */ /* switch off scrambler and differential */ writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOE, 0xaaaa); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOS, 0xaaaa); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIE, 0xaaaa); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIS, 0xaaaa); /* switch on data output to MDISC */ writeconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMTXD, 0xcccc); } else { if (state->cfg.mdisc.rxc) writeconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMRXC, 0xcccc); if (state->cfg.mdisc.txc) writeconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMTXC, 0xcccc); if (state->cfg.mdisc.txd) writeconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMTXD, 0xcccc); switch (state->cfg.adapt.loopback) { default: break; case trxapi_baycomusb_loopback_scrambler: writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMID, 0xf0f0); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIC, 0xff00); /* modem output clock */ break; case trxapi_baycomusb_loopback_modem: writeconfigrom(fpga, fsk_roms+FSK_ROM_MDMINROM, 0xcccc); break; } } if (state->cfg.adapt.filtmode == 1) { filt_rom(filt_comp, filtrom); for (i = 0; i < 16; i++) writeconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_0+16*i, filtrom[i]); } else if (state->cfg.adapt.filtmode == 2) { filt_genideal(fcoeff); filt_rom(fcoeff, filtrom); for (i = 0; i < 16; i++) writeconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_0+16*i, filtrom[i]); } /* print configuration ROM's (mainly a debugging action) */ lprintf(2, "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n" "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_0), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_1), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_2), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_3), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_4), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_5), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_6), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_7), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_0), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_1), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_2), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_3), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_4), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_5), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_6), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_7)); #if 0 lprintf(2, "config: ClkSel: %04x PTT mute: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_CLKSELROM), readconfigrom(fpga, fsk_roms+FSK_ROM_PTTMUTEROM)); lprintf(2, "config: DCD: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMDCD)); #endif lprintf(2, "config: DivRx: %04x %04x %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX0), readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX1), readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX2)); lprintf(2, "config: DivTx: %04x %04x %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX0), readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX1), readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX2)); lprintf(2, "config: IClk: %04x ID: %04x IE: %04x IS: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIC), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMID), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIE), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIS)); lprintf(2, "config: OClk: %04x OE: %04x OS: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOC), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOE), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOS)); lprintf(2, "config: MDISC: RxC: %04x TxC: %04x TxD: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMRXC), readconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMTXC), readconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMTXD)); lprintf(2, "config: Modem: in: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_MDMINROM)); return sizeof(fskfirmware); } static unsigned int prepare_afsk(struct trx_thread_state *state, unsigned char *fpga, unsigned char *fw) { /* copy FPGA firmware */ memcpy(fpga, afsk_firmware, FPGA_CONFIGSIZE); memcpy(fw, afskfirmware, sizeof(afskfirmware)); strncpy(&fw[0xf0], state->serial, 0x10); fw[0xe0] = (1200) & 0xff; fw[0xe1] = (1200 >> 8) & 0xff; fw[0xe2] = (1200 >> 16) & 0xff; fw[0xe3] = (1200) & 0xff; fw[0xe4] = (1200 >> 8) & 0xff; fw[0xe5] = (1200 >> 16) & 0xff; fw[0xe6] = 0; fw[0xe7] = state->cfg.adapt.pttmute; /* patch configuration ROM's */ /* only swromie/swromoe could be patched, for differential decoding */ /* print configuration ROM's (mainly a debugging action) */ lprintf(2, "config: IE: %04x OE: %04x\n", readconfigrom(fpga, afsk_roms+AFSK_ROM_SWROMIE), readconfigrom(fpga, afsk_roms+AFSK_ROM_SWROMOE)); return sizeof(afskfirmware); } static unsigned int prepare_audio(struct trx_thread_state *state, unsigned char *fpga, unsigned char *fw) { unsigned divider; unsigned int i; /* copy FPGA firmware */ memcpy(fpga, sample_firmware, FPGA_CONFIGSIZE); memcpy(fw, audiofirmware, sizeof(audiofirmware)); strncpy(&fw[0xf0], state->serial, 0x10); /* calculate the true bitrate (aka samplerate) */ state->cfg.adapt.samplerate = (SAMPLERATE + 500) / 1000 * 1000; if (state->cfg.adapt.samplerate < 8000 && state->cfg.adapt.samplerate != 2000 && state->cfg.adapt.samplerate != 3000) state->cfg.adapt.samplerate = 8000; if (state->cfg.adapt.samplerate > 24000) state->cfg.adapt.samplerate = 24000; divider = (24000000 + state->cfg.adapt.samplerate/2) / state->cfg.adapt.samplerate; fw[0xe0] = state->cfg.adapt.samplerate / 1000; /* calculate the gain */ i = (state->cfg.adapt.gain * (1 << 24)) / divider; if (i > 65535) i = 65535; if (i < 1) i = 1; /* patch configuration ROM's */ writeconfigrom(fpga, sample_roms+SAMPLE_ROM_MULROM, i); /* print configuration ROM's (mainly a debugging action) */ lprintf(2, "config: InputGain: %04x\n", readconfigrom(fpga, sample_roms+SAMPLE_ROM_MULROM)); return sizeof(audiofirmware); } /* --------------------------------------------------------------------- */ static int adapter_download(struct trx_thread_state *state) { unsigned char stat[5]; unsigned u, ln; unsigned char fpga[FPGA_CONFIGSIZE], firmware[8192]; unsigned int fwlen; int i; switch (state->cfg.adapt.mode) { case trxapi_baycomusb_mode_fsk: case trxapi_baycomusb_mode_external: fwlen = prepare_fsk(state, fpga, firmware); break; case trxapi_baycomusb_mode_afsk: fwlen = prepare_afsk(state, fpga, firmware); break; case trxapi_baycomusb_mode_audio: fwlen = prepare_audio(state, fpga, firmware); break; default: return -1; } printconfig(state); /* claim interface 0 */ if (usb_claiminterface(state->usbdev, 0)) { lprintf(2, "FPGAdownload: cannot claim interface 0\n"); return -1; } /* set interface 0 altsetting 1, to enable the bulk ep's */ if (usb_setinterface(state->usbdev, 0, 1)) { lprintf(2, "FPGAdownload: cannot set interface 0 altsetting 1\n"); return -1; } if (usb_resetep(state->usbdev, 0x81)) { lprintf(2, "FPGAdownload: cannot reset ep1 in\n"); //return -1; } if (usb_resetep(state->usbdev, 0x02)) { lprintf(2, "FPGAdownload: cannot reset ep2 out\n"); //return -1; } #if 1 i = usb_control_msg(state->usbdev, 0xc0, 0xb1, 0, 0, 4, stat, 5000); if (i != 4) lprintf(2, "usb_control_msg(0xc0, 0xb1) failure (%d)\n", i); else lprintf(3, "FPGAdownload: stat: 0x%02x 0x%02x 0x%02x 0x%02x\n", stat[0], stat[1], stat[2], stat[3]); #endif /* download FPGA firmware using bulk transfers */ for (;;) { #if 1 i = usb_bulk_msg(state->usbdev, 0x81, sizeof(stat), stat, 5000); #else i = usb_control_msg(state->usbdev, 0xc0, 0xb2, 0, 0, 5, stat, 5000); #endif if (i != sizeof(stat)) { lprintf(2, "usb_bulk ep1 in failure (%d)\n", i); #if 1 i = usb_control_msg(state->usbdev, 0xc0, 0xb1, 0, 0, 4, stat, 5000); if (i != 4) lprintf(2, "usb_control_msg(0xc0, 0xb1) failure (%d)\n", i); else lprintf(3, "FPGAdownload: stat: 0x%02x 0x%02x 0x%02x 0x%02x\n", stat[0], stat[1], stat[2], stat[3]); #endif return -1; } lprintf(3, "FPGAdownload: stat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", stat[0], stat[1], stat[2], stat[3], stat[4]); if (stat[0] == 0x10) break; if (stat[0] & 0x80) { lprintf(2, "FPGA download error code 0x%02x\n", stat[0]); return -1; } } #define MAXSZ 256 for (u = 0; u < FPGA_CONFIGSIZE; ) { ln = FPGA_CONFIGSIZE - u; if (ln > MAXSZ) ln = MAXSZ; i = usb_bulk_msg(state->usbdev, 0x02, ln, (void *)(fpga+u), 5000); if (i != ln) { lprintf(2, "usb_bulk_msg ep2 out failure (%d,len=%u,addr=%u)\n", i, ln, u); return -1; } u += ln; #if 1 i = usb_bulk_msg(state->usbdev, 0x81, sizeof(stat), stat, 5000); #else i = usb_control_msg(state->usbdev, 0xc0, 0xb2, 0, 0, 5, stat, 5000); #endif if (i != sizeof(stat)) { lprintf(2, "usb_bulk_msg ep1 in failure (%d)\n", i); return -1; } } for (;;) { #if 1 i = usb_bulk_msg(state->usbdev, 0x81, sizeof(stat), stat, 5000); #else i = usb_control_msg(state->usbdev, 0xc0, 0xb2, 0, 0, 5, stat, 5000); #endif if (i != sizeof(stat)) { lprintf(2, "usb_bulk_msg ep1 in failure (%d)\n", i); return -1; } lprintf(3, "FPGAdownload: stat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", stat[0], stat[1], stat[2], stat[3], stat[4]); if (stat[0] == 0x20) break; if (stat[0] & 0x80 || stat[0] == 0x10) { lprintf(2, "FPGA download error code 0x%02x\n", stat[0]); return -1; } } /* download the firmware to the AnchorChips core */ switch (state->cfg.adapt.mode) { case trxapi_baycomusb_mode_fsk: case trxapi_baycomusb_mode_external: lprintf(30, "baycomusb: downloading fsk firmware\n"); break; case trxapi_baycomusb_mode_afsk: lprintf(30, "baycomusb: downloading afsk firmware\n"); break; case trxapi_baycomusb_mode_audio: lprintf(30, "baycomusb: downloading audio firmware\n"); break; default: return -1; } if (loadmem(state->usbdev, firmware, fwlen)) return -1; /* start AnchorChips core */ if (writecpucs(state->usbdev, 0)) return -1; return 0; } /* ---------------------------------------------------------------------- */ int adapter_finalinit(struct trx_thread_state *state) { char buf[8]; int i; if (state->cfg.adapt.mode != trxapi_baycomusb_mode_audio) { if (usb_setconfiguration(state->usbdev, 1)) return -1; /* claim interface 0 */ if (usb_claiminterface(state->usbdev, 0)) { lprintf(2, "adapter_finalinit: cannot claim interface 0\n"); return -1; } /* set interface 0 altsetting 1, to enable the bulk ep's */ if (usb_setinterface(state->usbdev, 0, 1)) { lprintf(2, "adapter_finalinit: cannot set interface 0 altsetting 1\n"); return -1; } /* kludge: the first OUT2 packet seems to arrive corrupted, so send this special "magic" packet */ buf[0] = 0x55; if ((i = usb_bulk_msg(state->usbdev, 0x02, 1, buf, 500)) != 1) { lprintf(2, "usb_bulk_msg ep2 out failure (%d)\n", i); return -1; } if (usb_releaseinterface(state->usbdev, 0)) { lprintf(2, "adapter_finalinit: cannot release interface 0\n"); return -1; } } return 0; } /* ---------------------------------------------------------------------- */ int adapter_init_getserial(struct trx_thread_state *state) { struct usb_device_descriptor desc; unsigned char mode; int i; /* get product ID */ if (usb_getdevicedescriptor(state->usbdev, &desc)) { lprintf(2, "usb_getdevicedescriptor error %s\n", strerror(errno)); adapter_reset(state->usbdev); return -1; } if ((desc.idVendor[0] | (desc.idVendor[1] << 8)) != BAYCOMUSB_VENDORID) { lprintf(0, "usb_getdevicedescriptor: wrong vendor ID??\n"); return -1; } switch (desc.idProduct[0] | (desc.idProduct[1] << 8)) { case BAYCOMUSB_PRODUCTID_EMPTY: adapter_reset(state->usbdev); return -1; case BAYCOMUSB_PRODUCTID_FPGALD: if (usb_setconfiguration(state->usbdev, 1)) { adapter_reset(state->usbdev); return -1; } /* retrieve serial number from EEPROM */ i = usb_control_msg(state->usbdev, 0xc0, 0xb3, 0, 0, sizeof(state->serial)-1, state->serial, 5000); if (i < 0 || i >= sizeof(state->serial)) { lprintf(2, "usb_control_msg(0xc0,0xb3) error %s\n", strerror(errno)); i = 0; } state->serial[i] = 0; if (!i) { lprintf(1, "USB device has no serial number\n"); strncpy(state->serial, "blank", sizeof(state->serial)); } config_loaddevice(state); if (adapter_download(state)) { lprintf(2, "adapter_download failed\n"); adapter_reset(state->usbdev); return -2; } return -1; case BAYCOMUSB_PRODUCTID_MODEM: case BAYCOMUSB_PRODUCTID_AUDIO: /* check status of configuration */ i = usb_control_msg(state->usbdev, 0xc0, 0xc8, 0, 0, 1, &mode, 500); if (i != 1) { lprintf(2, "usb_control_msg(0xc0,0xc8) error %s\n", strerror(errno)); state->mode = MODE_NONE; adapter_reset(state->usbdev); return -1; } state->mode = mode; i = usb_control_msg(state->usbdev, 0xc0, 0xc9, 0, 0, sizeof(state->serial)-1, state->serial, 500); if (i < 0 || i >= sizeof(state->serial)) { lprintf(2, "usb_control_msg(0xc0,0xc9) error %s\n", strerror(errno)); lprintf(1, "USB device has no serial number\n"); strncpy(state->serial, "blank", sizeof(state->serial)); } else { state->serial[i] = 0; } return 0; default: lprintf(0, "usb_getdevicedescriptor: wrong product ID??\n"); adapter_reset(state->usbdev); return -1; } } baycomusb-0.10.orig/trxctrl/list.h0100644000175100017510000000445407325134424015251 0ustar abaaba#ifndef _LINUX_LIST_H #define _LINUX_LIST_H /* * Simple doubly linked list implementation. * * Some of the internal functions ("__xxx") are useful when * manipulating whole lists rather than single entries, as * sometimes we already know the next/prev entries and we can * generate better code by using them directly rather than * using the generic single-entry routines. */ struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) /* * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static __inline__ void __list_add(struct list_head * new, struct list_head * prev, struct list_head * next) { next->prev = new; new->next = next; new->prev = prev; prev->next = new; } /* * Insert a new entry after the specified head.. */ static __inline__ void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } /* * Insert a new entry before the specified head.. */ static __inline__ void list_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } /* * Delete a list entry by making the prev/next entries * point to each other. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static __inline__ void __list_del(struct list_head * prev, struct list_head * next) { next->prev = prev; prev->next = next; } static __inline__ void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); } static __inline__ int list_empty(struct list_head *head) { return head->next == head; } /* * Splice in "list" into "head" */ static __inline__ void list_splice(struct list_head *list, struct list_head *head) { struct list_head *first = list->next; if (first != list) { struct list_head *last = list->prev; struct list_head *at = head->next; first->prev = head; head->next = first; last->next = at; at->prev = last; } } #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) #endif baycomusb-0.10.orig/trxctrl/mainunixuser.c0100644000175100017510000017467407340456112017032 0ustar abaaba/*****************************************************************************/ /* * mainunixuser.c -- Transceiver control UNIX stuff (Userspace driver, uses mkiss). * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _GNU_SOURCE #define _REENTRANT /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #include "trx.h" #include "simd.h" #define _USE_BSD #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #else #include "getopt.h" #endif #ifdef HAVE_SYSLOG_H #include #endif #ifdef HAVE_LINUX_IF_H #include #endif #ifdef HAVE_LINUX_SOCKIOS_H #include #endif #ifdef HAVE_LINUX_IF_ETHER_H #include #endif #if defined(HAVE_ARPA_INET_H) && !defined(WIN32) #include #endif #ifdef HAVE_NET_IF_ARP_H #include #endif #ifdef HAVE_NETAX25_AX25_H #include #elif defined(HAVE_LINUX_AX25_H) #include #endif #ifdef HAVE_NET_ROUTE_H #include #endif #include #include #include "list.h" #ifdef HAVE_MKISS #include #endif #ifdef HAVE_PTY_H #include #else extern int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp); #endif /* --------------------------------------------------------------------- */ struct orbfdlist { struct list_head list; GIOPConnection *conn; struct pollfd *pfd; }; /* --------------------------------------------------------------------- */ static int devices_fd = -1; static LIST_HEAD(devices_list); static pthread_mutex_t orbit_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t devlist_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t devlist_cond = PTHREAD_COND_INITIALIZER; static LIST_HEAD(orb_fds); static int quit = 0; static int sock_fd = -1; /* --------------------------------------------------------------------- */ void acquire_orbit_mutex(void) { pthread_mutex_lock(&orbit_mutex); } void release_orbit_mutex(void) { pthread_mutex_unlock(&orbit_mutex); } void acquire_trxdata_mutex(struct trx_thread_state *state) { pthread_mutex_lock(&state->mutex); } void release_trxdata_mutex(struct trx_thread_state *state) { pthread_mutex_unlock(&state->mutex); } int check_quit(void) { return quit; } /* --------------------------------------------------------------------- */ int reopen_usbdev(struct trx_thread_state *state) { struct timespec tm; struct timeval tv; int r; if (state->usbdev) usb_close(state->usbdev); state->usbdev = NULL; pthread_mutex_lock(&devlist_mutex); state->busnr = state->devnr = -1; gettimeofday(&tv, NULL); tm.tv_sec = tv.tv_sec + 60; tm.tv_nsec = tv.tv_usec * 1000; for (;;) { if ((r = pthread_cond_timedwait(&devlist_cond, &devlist_mutex, &tm)) && r != EINTR) { lprintf(1, "Timeout reopening USB device %s: pthread_cond_wait error %s (%d)\n", state->serial, strerror(r), r); pthread_mutex_unlock(&devlist_mutex); return -1; } if (check_quit()) { pthread_mutex_unlock(&devlist_mutex); return -1; } if (state->busnr != -1 && state->devnr != -1) break; } pthread_mutex_unlock(&devlist_mutex); if (!(state->usbdev = usb_open_bynumber(state->busnr, state->devnr, BAYCOMUSB_VENDORID, -1))) { lprintf(1, "Cannot open USB device %03d:%03d\n", state->busnr, state->devnr); return -1; } lprintf(10, "=== THREADCONTINUE: %03d:%03d\n", state->busnr, state->devnr); return 0; } /* --------------------------------------------------------------------- */ static void *thread_start(void *arg) { struct trx_thread_state *state = arg; struct trx_thread_state *state2; struct list_head *list; int i; lprintf(10, ">>> THREADSTART: %03d:%03d\n", state->busnr, state->devnr); /* open communications to device */ pthread_mutex_init(&state->mutex, NULL); state->netif_fd = state->netif_fdmaster = -1; state->netif_opened = 0; /* get serial number from device */ if (!(state->usbdev = usb_open_bynumber(state->busnr, state->devnr, BAYCOMUSB_VENDORID, -1))) { lprintf(1, "Cannot open USB device %03d:%03d\n", state->busnr, state->devnr); goto ret; } i = adapter_init_getserial(state); if (i < 0) { if (i == -2) lprintf(1, "Error loading USB device %03d:%03d\n", state->busnr, state->devnr); goto ret; } lprintf(2, "USB device %03d:%03d serial %s\n", state->busnr, state->devnr, state->serial); pthread_mutex_lock(&devlist_mutex); for (list = devices_list.next; list != &devices_list; list = list->next) { state2 = list_entry(list, struct trx_thread_state, device_list); if (state2 != state && !strcmp(state2->serial, state->serial)) { state2->busnr = state->busnr; state2->devnr = state->devnr; state2->mode = state->mode; list_del(&state->device_list); INIT_LIST_HEAD(&state->device_list); pthread_mutex_unlock(&devlist_mutex); lprintf(2, "Thread for USB device %03d:%03d serial %s already running\n", state->busnr, state->devnr, state->serial); pthread_cond_broadcast(&devlist_cond); goto ret; } } pthread_mutex_unlock(&devlist_mutex); state->flags = FLG_RELOADMODEM | FLG_MODEMERROR | FLG_T7FERROR; /* finally start thread */ trx_thread(state); if (state->usbdev) adapter_reset(state->usbdev); ret: netif_close(state); if (state->usbdev) usb_close(state->usbdev); pthread_mutex_destroy(&state->mutex); pthread_mutex_lock(&devlist_mutex); list_del(&state->device_list); pthread_mutex_unlock(&devlist_mutex); lprintf(10, "<<< THREADSTOP: %03d:%03d serial %s\n", state->busnr, state->devnr, state->serial); free(state); return NULL; } /* --------------------------------------------------------------------- */ static void check_new_uninited_modems(void) { char buf[16384]; char *start, *end, *lineend, *cp; int ret; unsigned int devnum = 0, busnum = 0, vendorid, productid; struct list_head *list; struct trx_thread_state *state; pthread_attr_t attr; pthread_t thr; /* now scan devices file */ if (lseek(devices_fd, 0, SEEK_SET) == (off_t)-1) lprintf(0, "lseek: %s (%d)\n", strerror(errno), errno); lprintf(10, "read\n"); ret = read(devices_fd, buf, sizeof(buf)-1); lprintf(10, "end read: %d\n", ret); if (ret == -1) lprintf(0, "read: %s (%d)\n", strerror(errno), errno); end = buf + ret; *end = 0; start = buf; while (start < end) { lineend = strchr(start, '\n'); if (!lineend) break; *lineend = 0; switch (start[0]) { case 'T': /* topology line */ if ((cp = strstr(start, "Dev#="))) { devnum = strtoul(cp + 5, NULL, 0); } else devnum = 0; if ((cp = strstr(start, "Bus="))) { busnum = strtoul(cp + 4, NULL, 0); } else busnum = 0; break; case 'P': if ((cp = strstr(start, "Vendor="))) { vendorid = strtoul(cp + 7, NULL, 16); } else vendorid = 0xffff; if ((cp = strstr(start, "ProdID="))) { productid = strtoul(cp + 7, NULL, 16); } else productid = 0xffff; lprintf(5, "Device %u Bus %u Vendor ID %04x Product ID %04x\n", devnum, busnum, vendorid, productid); if (vendorid != BAYCOMUSB_VENDORID || (productid != BAYCOMUSB_PRODUCTID_EMPTY && productid != BAYCOMUSB_PRODUCTID_FPGALD && productid != BAYCOMUSB_PRODUCTID_MODEM && productid != BAYCOMUSB_PRODUCTID_AUDIO)) break; /* search device; mark and continue if found */ pthread_mutex_lock(&devlist_mutex); for (list = devices_list.next; list != &devices_list; list = list->next) { state = list_entry(list, struct trx_thread_state, device_list); if (state->devnr != devnum || state->busnr != busnum) continue; goto devalreadyfound; } /* not found, make new device and create thread */ state = malloc(sizeof(struct trx_thread_state)); if (!state) goto err; memset(state, 0, sizeof(struct trx_thread_state)); state->devnr = devnum; state->busnr = busnum; /* start thread */ if (pthread_attr_init(&attr)) goto err; if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) goto err; if (pthread_create(&thr, &attr, thread_start, state)) goto err; pthread_attr_destroy(&attr); list_add(&state->device_list, &devices_list); devalreadyfound: pthread_mutex_unlock(&devlist_mutex); break; err: if (state) free(state); pthread_mutex_unlock(&devlist_mutex); break; default: break; } #if 0 printf("line: %s\n", start); #endif start = lineend + 1; } } /* --------------------------------------------------------------------- */ static void orb_add_connection(GIOPConnection *cnx) { struct orbfdlist *ofd; if (!(cnx->user_data = ofd = malloc(sizeof(struct orbfdlist)))) return; ofd->conn = cnx; ofd->pfd = NULL; list_add(&ofd->list, &orb_fds); } static void orb_remove_connection(GIOPConnection *cnx) { struct orbfdlist *ofd = cnx->user_data; if (!ofd) return; ofd->conn = NULL; } #define MAXPFD 64 static void mainloop(void) { struct list_head *list; struct orbfdlist *ofd; struct pollfd *pfd; struct pollfd pfds[MAXPFD]; unsigned int npfd; int i; while (!quit) { npfd = 1; pfds[0].fd = devices_fd; pfds[0].events = POLLIN; acquire_orbit_mutex(); for (list = orb_fds.next; list != &orb_fds;) { ofd = list_entry(list, struct orbfdlist, list); list = list->next; if (!ofd->conn) { list_del(&ofd->list); free(ofd); continue; } if (npfd >= MAXPFD) { ofd->pfd = NULL; continue; } ofd->pfd = &pfds[npfd++]; ofd->pfd->fd = GIOP_CONNECTION_GET_FD(ofd->conn); ofd->pfd->events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL; } release_orbit_mutex(); i = poll(pfds, npfd, -1); if (i == -1 && errno != EINTR) { lprintf(0, "poll: %s (%u)\n", strerror(errno), errno); exit(1); } if (pfds[0].revents & POLLIN) check_new_uninited_modems(); acquire_orbit_mutex(); for (list = orb_fds.next; list != &orb_fds; list = list->next) { ofd = list_entry(list, struct orbfdlist, list); if (!(pfd = ofd->pfd)) continue; #if 0 printf("fd %d events 0x%x revents 0x%x\n", pfd->fd, pfd->events, pfd->revents); #endif if (pfd->revents & (POLLERR | POLLHUP | POLLNVAL) && ofd->conn) { giop_main_handle_connection_exception(ofd->conn); } if (pfd->revents & (POLLIN | POLLPRI) && ofd->conn) { giop_main_handle_connection(ofd->conn); } } release_orbit_mutex(); } } /* --------------------------------------------------------------------- */ static int parsehw(ax25_address *hwaddr, const char *cp) { const char *cp1; unsigned int i, j; if (!cp || !*cp) return 0; memset(hwaddr->ax25_call, (' ' << 1), 6); cp1 = strchr(cp, '-'); if (cp1) { i = cp1 - cp; j = strtoul(cp1 + 1, NULL, 0); hwaddr->ax25_call[6] = (j & 15) << 1; } else { i = strlen(cp); hwaddr->ax25_call[6] = 0; } if (i > 6) i = 6; for (j = 0; j < i; j++) hwaddr->ax25_call[j] = toupper(cp[j]) << 1; return 1; } static int parsehwpath(struct full_sockaddr_ax25 *fsa, const char *cp) { char tmp[128]; char *cp2, *ptrptr; if (!fsa || !cp || !*cp) return 0; fsa->fsa_ax25.sax25_family = AF_AX25; fsa->fsa_ax25.sax25_ndigis = 0; strncpy(tmp, cp, sizeof(tmp)); cp2 = strtok_r(tmp, " \t\n,", &ptrptr); if (!parsehw(&fsa->fsa_ax25.sax25_call, cp2)) return 0; while ((cp2 = strtok_r(NULL, " \t\n,", &ptrptr))) { if (fsa->fsa_ax25.sax25_ndigis >= AX25_MAX_DIGIS) return 1; if (!parsehw(&fsa->fsa_digipeater[fsa->fsa_ax25.sax25_ndigis], cp2)) return 0; fsa->fsa_ax25.sax25_ndigis++; } return 1; } #define PARAM_TXDELAY 1 #define PARAM_PERSIST 2 #define PARAM_SLOTTIME 3 #define PARAM_TXTAIL 4 #define PARAM_FULLDUP 5 static int set_intf(struct trx_thread_state *state) { struct sockaddr_ax25 sax25; struct sockaddr_in sin; struct ifreq ifr; struct arpreq arpreq; struct rtentry rtentry; struct full_sockaddr_ax25 gwpath; struct ax25_routes_struct ax25_route; struct ax25_route_opt_struct ax25_opt; int fd; if (state->mode != MODE_FSK && state->mode != MODE_EXTERNAL && state->mode != MODE_AFSK) return 0; strncpy(ifr.ifr_name, state->ifname, sizeof(ifr.ifr_name)); if (ioctl(sock_fd, SIOCGIFINDEX, &ifr) == -1) lprintf(1, "ioctl: SIOCGIFINDEX failed: %s (%u)\n", strerror(errno), errno); ifr.ifr_mtu = 256; if (ioctl(sock_fd, SIOCSIFMTU, &ifr) == -1) lprintf(1, "ioctl: SIOCSIFMTU failed: %s (%u)\n", strerror(errno), errno); if (parsehw(&sax25.sax25_call, state->cfg.intf.hwaddr)) { sax25.sax25_family = AF_AX25; sax25.sax25_ndigis = 0; memcpy(&ifr.ifr_hwaddr, &sax25, sizeof(ifr.ifr_hwaddr)); if (ioctl(sock_fd, SIOCSIFHWADDR, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFHWADDR failed: %s (%u)\n", strerror(errno), errno); } sin.sin_addr.s_addr = (state->cfg.intf.ipaddr[3] << 24) | (state->cfg.intf.ipaddr[2] << 16) | (state->cfg.intf.ipaddr[1] << 8) | state->cfg.intf.ipaddr[0]; if (sin.sin_addr.s_addr != INADDR_ANY && sin.sin_addr.s_addr != INADDR_NONE) { sin.sin_family = AF_INET; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(sock_fd, SIOCSIFADDR, &ifr) == -1) lprintf(1, "ioctl: SIOCSIFADDR failed: %s (%u)\n", strerror(errno), errno); } sin.sin_addr.s_addr = (state->cfg.intf.netmask[3] << 24) | (state->cfg.intf.netmask[2] << 16) | (state->cfg.intf.netmask[1] << 8) | state->cfg.intf.netmask[0]; if (sin.sin_addr.s_addr != INADDR_ANY && sin.sin_addr.s_addr != INADDR_NONE) { sin.sin_family = AF_INET; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(sock_fd, SIOCSIFNETMASK, &ifr) == -1) lprintf(1, "ioctl: SIOCSIFNETMASK failed: %s (%u)\n", strerror(errno), errno); } sin.sin_addr.s_addr = (state->cfg.intf.broadcast[3] << 24) | (state->cfg.intf.broadcast[2] << 16) | (state->cfg.intf.broadcast[1] << 8) | state->cfg.intf.broadcast[0]; if (sin.sin_addr.s_addr != INADDR_ANY && sin.sin_addr.s_addr != INADDR_NONE) { sin.sin_family = AF_INET; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(sock_fd, SIOCSIFBRDADDR, &ifr) == -1) lprintf(1, "ioctl: SIOCSIFBRDADDR failed: %s (%u)\n", strerror(errno), errno); } if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { if (ioctl(sock_fd, SIOCGIFFLAGS, &ifr) == -1) lprintf(0, "ioctl: SIOCGIFFLAGS failed: %s (%u)\n", strerror(errno), errno); else { ifr.ifr_flags &= ~IFF_NOARP; ifr.ifr_flags |= IFF_UP | IFF_RUNNING; if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFFLAGS failed: %s (%u)\n", strerror(errno), errno); } } /* set gateway ARP etc */ if (!state->cfg.intf.gwipaddr[0] && !state->cfg.intf.gwipaddr[1] && !state->cfg.intf.gwipaddr[2] && !state->cfg.intf.gwipaddr[3]) return 0; if (!parsehwpath(&gwpath, state->cfg.intf.gwhwaddr)) return 0; /* get interface address */ if (ioctl(sock_fd, SIOCGIFHWADDR, &ifr) == -1) { lprintf(0, "ioctl: SIOCSIFHWADDR failed: %s (%u)\n", strerror(errno), errno); return 0; } memcpy(&sax25, &ifr.ifr_hwaddr, sizeof(sax25)); if (sax25.sax25_family != AF_AX25) { lprintf(0, "ioctl: SIOCSIFHWADDR invalid address family: %u\n", sax25.sax25_family); return 0; } sin.sin_addr.s_addr = (state->cfg.intf.gwipaddr[3] << 24) | (state->cfg.intf.gwipaddr[2] << 16) | (state->cfg.intf.gwipaddr[1] << 8) | state->cfg.intf.gwipaddr[0]; if (sin.sin_addr.s_addr == INADDR_ANY || sin.sin_addr.s_addr == INADDR_NONE) return 0; sin.sin_family = AF_INET; arpreq.arp_flags = ATF_COM | ATF_PERM; ((struct sockaddr_in *)&arpreq.arp_pa)->sin_family = AF_INET; ((struct sockaddr_in *)&arpreq.arp_pa)->sin_port = 0; ((struct sockaddr_in *)&arpreq.arp_pa)->sin_addr = sin.sin_addr; memcpy(&arpreq.arp_ha, &gwpath, sizeof(arpreq.arp_ha)); ((struct sockaddr_ax25 *)&arpreq.arp_ha)->sax25_ndigis = 0; strncpy(arpreq.arp_dev, state->ifname, sizeof(arpreq.arp_dev)); if (ioctl(sock_fd, SIOCSARP, &arpreq)) lprintf(0, "ioctl: SIOCSARP failed: %s (%u)\n", strerror(errno), errno); if ((fd = socket(AF_AX25, SOCK_SEQPACKET, 0)) < 0) { lprintf(0, "socket: AF_AX25,SOCK_SEQPACKET failed: %s (%u)\n", strerror(errno), errno); return 0; } ax25_route.port_addr = sax25.sax25_call; ax25_route.dest_addr = gwpath.fsa_ax25.sax25_call; ax25_route.digi_count = gwpath.fsa_ax25.sax25_ndigis; memcpy(&ax25_route.digi_addr, &gwpath.fsa_digipeater, sizeof(ax25_route.digi_addr)); if (ioctl(fd, SIOCADDRT, &ax25_route) != 0) lprintf(0, "ioctl: SIOCADDRT (ax25) failed: %s (%u)\n", strerror(errno), errno); ax25_opt.port_addr = sax25.sax25_call; ax25_opt.dest_addr = gwpath.fsa_ax25.sax25_call; ax25_opt.cmd = AX25_SET_RT_IPMODE; ax25_opt.arg = state->cfg.intf.gwipmode; if (ioctl(fd, SIOCAX25OPTRT, &ax25_opt) != 0) lprintf(0, "ioctl: SIOCAX25OPTRT failed: %s (%u)\n", strerror(errno), errno); close(fd); memset(&rtentry, 0, sizeof(rtentry)); rtentry.rt_flags = RTF_UP | RTF_GATEWAY; ((struct sockaddr_in *)&rtentry.rt_dst)->sin_family = AF_INET; ((struct sockaddr_in *)&rtentry.rt_dst)->sin_port = 0; ((struct sockaddr_in *)&rtentry.rt_dst)->sin_addr = sin.sin_addr; ((struct sockaddr_in *)&rtentry.rt_gateway)->sin_family = AF_INET; ((struct sockaddr_in *)&rtentry.rt_gateway)->sin_port = 0; ((struct sockaddr_in *)&rtentry.rt_gateway)->sin_addr = sin.sin_addr; sin.sin_addr.s_addr = (state->cfg.intf.gwnetmask[3] << 24) | (state->cfg.intf.gwnetmask[2] << 16) | (state->cfg.intf.gwnetmask[1] << 8) | state->cfg.intf.gwnetmask[0]; if (sin.sin_addr.s_addr != INADDR_ANY && sin.sin_addr.s_addr != INADDR_NONE) { ((struct sockaddr_in *)&rtentry.rt_genmask)->sin_family = AF_INET; ((struct sockaddr_in *)&rtentry.rt_genmask)->sin_port = 0; ((struct sockaddr_in *)&rtentry.rt_genmask)->sin_addr = sin.sin_addr; ((struct sockaddr_in *)&rtentry.rt_dst)->sin_addr.s_addr &= sin.sin_addr.s_addr; } else rtentry.rt_flags |= RTF_HOST; rtentry.rt_dev = state->ifname; if (ioctl(sock_fd, SIOCADDRT, &rtentry) != 0) lprintf(0, "ioctl: SIOCADDRT (ipv4) failed: %s (%u)\n", strerror(errno), errno); return 0; } /* --------------------------------------------------------------------- */ #define SCRIPTNAME "/etc/ax25/baycomusb.ifchange" static void runscript(struct trx_thread_state *state, const char *cmd) { pid_t pid; char home[128]; char ifname[64]; char hwaddr[64]; char ipaddr[64]; char netmask[64]; char broadcast[64]; char gwhwaddr[192]; char gwipaddr[64]; char gwnetmask[64]; char gwipmode[64]; char *cp; char *const argv[] = { SCRIPTNAME, cmd, NULL }; char *const envp[] = { "TERM=linux", home, ifname, hwaddr, ipaddr, netmask, broadcast, gwhwaddr, gwipaddr, gwnetmask, gwipmode, NULL }; return; lprintf(4, "Running Script: %s\n", cmd); pid = fork(); if (pid) { if (pid != -1) return; lprintf(1, "fork failed: %s (%u)\n", strerror(errno), errno); return; } cp = getenv("HOME"); snprintf(home, sizeof(home), "HOME=%s", cp ? cp : "/"); snprintf(ifname, sizeof(ifname), "IFNAME=%s", state->ifname); snprintf(hwaddr, sizeof(hwaddr), "HWADDR=%s", state->cfg.intf.hwaddr); snprintf(ipaddr, sizeof(ipaddr), "IPADDR=%u.%u.%u.%u", state->cfg.intf.ipaddr[0], state->cfg.intf.ipaddr[1], state->cfg.intf.ipaddr[2], state->cfg.intf.ipaddr[3]); snprintf(netmask, sizeof(netmask), "NETMASK=%u.%u.%u.%u", state->cfg.intf.netmask[0], state->cfg.intf.netmask[1], state->cfg.intf.netmask[2], state->cfg.intf.netmask[3]); snprintf(broadcast, sizeof(broadcast), "BROADCAST=%u.%u.%u.%u", state->cfg.intf.broadcast[0], state->cfg.intf.broadcast[1], state->cfg.intf.broadcast[2], state->cfg.intf.broadcast[3]); snprintf(gwhwaddr, sizeof(gwhwaddr), "GWHWADDR=%s", state->cfg.intf.gwhwaddr); snprintf(gwipaddr, sizeof(gwipaddr), "GWIPADDR=%u.%u.%u.%u", state->cfg.intf.gwipaddr[0], state->cfg.intf.gwipaddr[1], state->cfg.intf.gwipaddr[2], state->cfg.intf.gwipaddr[3]); snprintf(gwnetmask, sizeof(gwnetmask), "GWNETMASK=%u.%u.%u.%u", state->cfg.intf.gwnetmask[0], state->cfg.intf.gwnetmask[1], state->cfg.intf.gwnetmask[2], state->cfg.intf.gwnetmask[3]); snprintf(gwipmode, sizeof(gwipmode), "GWIPMODE=%c", state->cfg.intf.gwipmode); execve(SCRIPTNAME, argv, envp); lprintf(4, "execve("SCRIPTNAME") failed: %s (%u)\n", strerror(errno), errno); } /* --------------------------------------------------------------------- */ #define KISS_FEND ((unsigned char)0300) #define KISS_FESC ((unsigned char)0333) #define KISS_TFEND ((unsigned char)0334) #define KISS_TFESC ((unsigned char)0335) #define KISS_CMD_DATA 0 #define KISS_CMD_TXDELAY 1 #define KISS_CMD_PPERSIST 2 #define KISS_CMD_SLOTTIME 3 #define KISS_CMD_TXTAIL 4 #define KISS_CMD_FULLDUP 5 #define KISS_CMD_HARDWARE 6 #define KISS_CMD_FECLEVEL 8 #define KISS_CMD_RETURN 255 /* ---------------------------------------------------------------------- */ const u_int16_t crc_ccitt_table[0x100] = { 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 }; static inline u_int16_t calc_crc_ccitt(const u_int8_t *buffer, int len) { u_int16_t crc = 0xffff; for (;len>0;len--) crc = (crc >> 8) ^ crc_ccitt_table[(crc ^ *buffer++) & 0xff]; crc ^= 0xffff; return crc; } static inline int check_crc_ccitt(const u_int8_t *buffer, int len) { u_int16_t crc = calc_crc_ccitt(buffer, len); return (crc & 0xffff) == 0x0f47; } static void kiss_encodepkt(struct trx_thread_state *state, unsigned char *data, unsigned dlen) { unsigned char *kbuf = alloca(dlen * 2 + 3); unsigned char *bp = kbuf; int i, len; #if 0 if (!check_crc_ccitt(data, dlen+2)) { u_int16_t x1 = calc_crc_ccitt(data, dlen); u_int16_t x2 = data[dlen] | (data[dlen+1] << 8); printf("CRC ERROR: 0x%04x 0x%04x\n", x1, x2); abort(); } #endif #if 0 { char buf[512]; snprintpkt(buf, sizeof(buf), data, dlen); printf("Rx(%u): %s\n", dlen, buf); } #endif if (state->netif_fd == -1) { state->stat.kiss_outerr++; lprintf(1, "baycomusb: KISS outerr %u\n", state->stat.kiss_outerr); return; } *bp++ = KISS_FEND; *bp++ = KISS_CMD_DATA; for (; dlen > 0; dlen--, data++) { if (*data == KISS_FEND) { *bp++ = KISS_FESC; *bp++ = KISS_TFEND; } else if (*data == KISS_FESC) { *bp++ = KISS_FESC; *bp++ = KISS_TFESC; } else *bp++ = *data; } *bp++ = KISS_FEND; len = bp - kbuf; i = write(state->netif_fd, kbuf, len); if (i < 0) { if (errno == EAGAIN || errno == EIO) { state->stat.kiss_outerr++; lprintf(1, "baycomusb: KISS outerr %u\n", state->stat.kiss_outerr); } else { lerr(0, "baycomusb: write"); abort(); } } else if (i < len) lprintf(1, "baycomusb: write error: %d < %d\n", i, len); else state->stat.kiss_out++; } /* ---------------------------------------------------------------------- */ static void kiss_process_pkt(struct trx_thread_state *state, u_int8_t *pkt, unsigned int len, unsigned int txurb) { unsigned int txd; if (len < 2) return; state->stat.kiss_in++; switch (pkt[0]) { case KISS_CMD_DATA: if (len <= MAXFLEN-1) { txd = state->cfg.chacc.txdelay * state->txdmul / 10; state->du.p.txurb[txurb].urb.buffer_length = len+1; memcpy(state->du.p.txurb[txurb].b.buf+2, pkt+1, len-1); state->du.p.txurb[txurb].b.buf[0] = txd; state->du.p.txurb[txurb].b.buf[1] = txd >> 8; state->du.p.txurb[txurb].urbstate = URBSTATE_FILLED; } #if 0 { char buf[512]; snprintpkt(buf, sizeof(buf), pkt+1, len-1); printf("Tx(%u): %s\n", len-1, buf); #if 0 printf("CRC: 0x%04x\n", calc_crc_ccitt(pkt+1, len-1)); #endif } #endif return; case KISS_CMD_TXDELAY: state->cfg.chacc.txdelay = pkt[1]*10; lprintf(10, "baycomusb: txdelay = %ums\n", pkt[1]*10); return; case KISS_CMD_TXTAIL: lprintf(10, "baycomusb: txtail = %ums\n", pkt[1]*10); return; case KISS_CMD_PPERSIST: state->cfg.chacc.ppersistence = pkt[1]; lprintf(10, "baycomusb: ppersist = %u/256\n", pkt[1]); return; case KISS_CMD_SLOTTIME: state->cfg.chacc.slottime = pkt[1]*10; lprintf(10, "baycomusb: slottime = %ums\n", pkt[1]*10); return; case KISS_CMD_FULLDUP: state->cfg.chacc.fullduplex = !!pkt[1]; lprintf(10, "baycomusb: %sduplex\n", pkt[1] ? "full" : "half"); return; default: lprintf(5, "unknown kiss packet: 0x%02x 0x%02x\n", pkt[0], pkt[1]); return; } } /* ---------------------------------------------------------------------- */ /* we decode inplace */ static void kiss_decode(struct trx_thread_state *state, u_int8_t *b, int len, unsigned int txurb) { int nlen = 0; u_int8_t *p1 = b, *p2, *iframe; iframe = p2 = alloca(len); while (len > 0) { if (*p1 != KISS_FESC) { *p2++ = *p1++; nlen++; len--; } else { if (len < 2) goto err; /* invalid escape */ if (p1[1] == KISS_TFEND) *p2++ = KISS_FEND; else if (p1[1] == KISS_TFESC) *p2++ = KISS_FESC; else goto err; /* invalid escape */ nlen++; p1 += 2; len -= 2; } } if (len > 0) goto err; kiss_process_pkt(state, iframe, nlen, txurb); return; err: lprintf(1, "KISS input error\n"); state->stat.kiss_inerr++; lprintf(1, "baycomusb: KISS inerr %u\n", state->stat.kiss_inerr); } static void kiss_input(struct trx_thread_state *state) { char *cp1, *cp2, *endp; unsigned int txurb = 0; int i; if (state->netif_fd == -1) return; if (state->kiss.ibufptr < sizeof(state->kiss.ibuf)) { i = read(state->netif_fd, state->kiss.ibuf + state->kiss.ibufptr, sizeof(state->kiss.ibuf) - state->kiss.ibufptr); if (i < 0) { if (errno == EIO) { state->kiss.ioerr++; i = 0; lprintf(1, "baycomusb: KISS ioerr %u\n", state->kiss.ioerr); } else if (errno == EAGAIN || errno == EINTR) { i = 0; } else { lerr(0, "baycomusb: read"); abort(); return; } } state->kiss.ibufptr += i; } endp = state->kiss.ibuf + state->kiss.ibufptr; cp1 = memchr(state->kiss.ibuf, KISS_FEND, state->kiss.ibufptr); while (cp1) { cp2 = NULL; /* find free TxURB */ if (txurb >= NUMTXPACKETS || state->du.p.txurb[txurb].urbstate != URBSTATE_UNUSED) { for (txurb = 0; txurb < NUMTXPACKETS; txurb++) { if (state->du.p.txurb[txurb].urbstate == URBSTATE_UNUSED) break; } } /* if TxURB found */ if (txurb < NUMTXPACKETS) cp2 = memchr(cp1+1, KISS_FEND, endp - cp1 - 1); if (!cp2) { state->kiss.ibufptr = endp-cp1; memmove(state->kiss.ibuf, cp1, state->kiss.ibufptr); return; } kiss_decode(state, cp1+1, cp2-cp1-1, txurb); cp1 = cp2; } } /* ---------------------------------------------------------------------- */ static unsigned short random_num(void) { static unsigned short random_seed; random_seed = 28629 * random_seed + 157; return random_seed; } /* --------------------------------------------------------------------- */ void netif_close(struct trx_thread_state *state) { unsigned int i; if (state->netif_opened) { /* kill pending URBs */ acquire_trxdata_mutex(state); if (state->iurb.urbstate == URBSTATE_INPROGRESS) { if (usb_discardurb(state->usbdev, &state->iurb.urb)) lprintf(1, "error %s (%d) killing interrupt urb\n", strerror(errno), errno); } if (state->curb.urbstate == URBSTATE_INPROGRESS) { if (usb_discardurb(state->usbdev, &state->curb.urb)) lprintf(1, "error %s (%d) killing control urb\n", strerror(errno), errno); } if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { for (i = 0; i < NUMRXPACKETS; i++) { if (state->du.p.rxurb[i].urbstate != URBSTATE_INPROGRESS) continue; if (usb_discardurb(state->usbdev, &state->du.p.rxurb[i].urb)) lprintf(1, "error %s (%d) killing rx packet urb %u\n", strerror(errno), errno, i); } for (i = 0; i < NUMTXPACKETS; i++) { if (state->du.p.txurb[i].urbstate != URBSTATE_INPROGRESS) continue; if (usb_discardurb(state->usbdev, &state->du.p.txurb[i].urb)) lprintf(1, "error %s (%d) killing tx packet urb %u\n", strerror(errno), errno, i); } } else if (state->mode == MODE_AUDIO) { for (i = 0; i < NUMAUDIOURB; i++) { if (state->du.a.inurb[i].urbstate != URBSTATE_INPROGRESS) continue; if (usb_discardurb(state->usbdev, &state->du.a.inurb[i].urb)) lprintf(1, "error %s (%d) killing audio input urb %u\n", strerror(errno), errno, i); } for (i = 0; i < NUMAUDIOURB; i++) { if (state->du.a.outurb[i].urbstate != URBSTATE_INPROGRESS) continue; if (usb_discardurb(state->usbdev, &state->du.a.outurb[i].urb)) lprintf(1, "error %s (%d) killing audio output urb %u\n", strerror(errno), errno, i); } audio_close(state); #if 0 if (usb_releaseinterface(state->usbdev, 3)) lprintf(2, "netif_close: cannot release interface 3\n"); if (usb_releaseinterface(state->usbdev, 2)) lprintf(2, "netif_close: cannot release interface 2\n"); if (usb_releaseinterface(state->usbdev, 1)) lprintf(2, "netif_close: cannot release interface 1\n"); #endif } release_trxdata_mutex(state); if (usb_releaseinterface(state->usbdev, 0)) lprintf(2, "netif_close: cannot release interface 0\n"); } /* close network interface stuff */ if (state->netif_fd != -1) close(state->netif_fd); if (state->netif_fdmaster != -1) close(state->netif_fdmaster); state->netif_fd = state->netif_fdmaster = -1; if (state->netif_opened) runscript(state, "down"); state->netif_opened = 0; lprintf(30, "netif_close\n"); } int netif_open(struct trx_thread_state *state) { struct termios tm; char ttyname[32]; int master, slave, fd, disc = N_AX25, encap = 4; struct ifreq ifr; unsigned char br[6]; unsigned int u, k; int r; netif_close(state); /* initialize URBs */ state->iurb.urbstate = 0; state->iurb.nexttime = gettimems(); state->iurb.urb.type = USBDEVFS_URB_TYPE_BULK; state->iurb.urb.endpoint = 0x81; state->iurb.urb.flags = 0; state->iurb.urb.buffer = state->iurb.buf; state->iurb.urb.buffer_length = sizeof(state->iurb.buf); state->iurb.urb.signr = 0; state->iurb.urb.usercontext = (void *)0x20000; state->curb.urbstate = 0; state->curb.urb.type = USBDEVFS_URB_TYPE_CONTROL; state->curb.urb.endpoint = 0; state->curb.urb.flags = 0; state->curb.urb.buffer = &state->curb.buf; state->curb.urb.buffer_length = 8; state->curb.urb.signr = 0; state->curb.urb.usercontext = (void *)0x30000; if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { state->du.p.rxurbptr = 0; for (u = 0; u < NUMRXPACKETS; u++) { state->du.p.rxurb[u].urbstate = 0; state->du.p.rxurb[u].urb.type = USBDEVFS_URB_TYPE_BULK; state->du.p.rxurb[u].urb.endpoint = 0x82; state->du.p.rxurb[u].urb.flags = (NUMRXPACKETS > 1) ? USBDEVFS_URB_QUEUE_BULK : 0; state->du.p.rxurb[u].urb.buffer = state->du.p.rxurb[u].b.buf; state->du.p.rxurb[u].urb.buffer_length = sizeof(state->du.p.rxurb[u].b.buf); state->du.p.rxurb[u].urb.signr = 0; state->du.p.rxurb[u].urb.usercontext = (void *)(0x00000 | u); } for (u = 0; u < NUMTXPACKETS; u++) { state->du.p.txurb[u].urbstate = 0; state->du.p.txurb[u].urb.type = USBDEVFS_URB_TYPE_BULK; state->du.p.txurb[u].urb.endpoint = 0x02; state->du.p.txurb[u].urb.flags = ((NUMTXPACKETS > 1) ? USBDEVFS_URB_QUEUE_BULK : 0) | USBDEVFS_URB_ZERO_PACKET; state->du.p.txurb[u].urb.buffer = state->du.p.txurb[u].b.buf; state->du.p.txurb[u].urb.buffer_length = sizeof(state->du.p.txurb[u].b.buf); state->du.p.txurb[u].urb.signr = 0; state->du.p.txurb[u].urb.usercontext = (void *)(0x10000 | u); } } else if (state->mode == MODE_AUDIO) { for (u = 0; u < NUMAUDIOURB; u++) { state->du.a.inurb[u].urbstate = 0; state->du.a.inurb[u].urb.type = USBDEVFS_URB_TYPE_ISO; state->du.a.inurb[u].urb.endpoint = 0x88; state->du.a.inurb[u].urb.flags = USBDEVFS_URB_ISO_ASAP; state->du.a.inurb[u].urb.buffer = state->du.a.inurb[u].buf; state->du.a.inurb[u].urb.buffer_length = sizeof(state->du.a.inurb[u].buf); state->du.a.inurb[u].urb.number_of_packets = NUMFRAMESPERURB; state->du.a.inurb[u].urb.signr = 0; state->du.a.inurb[u].urb.usercontext = (void *)(0x00000 | u); for (k = 0; k < NUMFRAMESPERURB; k++) state->du.a.inurb[u].urb.iso_frame_desc[k].length = AUDIOSAMPLINGRATE/1000; } for (u = 0; u < NUMAUDIOURB; u++) { state->du.a.outurb[u].urbstate = 0; state->du.a.outurb[u].urb.type = USBDEVFS_URB_TYPE_ISO; state->du.a.outurb[u].urb.endpoint = 0x08; state->du.a.outurb[u].urb.flags = USBDEVFS_URB_ISO_ASAP; state->du.a.outurb[u].urb.buffer = state->du.a.outurb[u].buf; state->du.a.outurb[u].urb.buffer_length = sizeof(state->du.a.outurb[u].buf); state->du.a.outurb[u].urb.number_of_packets = NUMFRAMESPERURB; state->du.a.outurb[u].urb.signr = 0; state->du.a.outurb[u].urb.usercontext = (void *)(0x10000 | u); for (k = 0; k < NUMFRAMESPERURB; k++) state->du.a.outurb[u].urb.iso_frame_desc[k].length = AUDIOSAMPLINGRATE/1000; /* clear tx data */ memset(&state->du.a.outurb[u].buf, 0x80, sizeof(state->du.a.outurb[u].buf)); } } /* claim device */ if (usb_setconfiguration(state->usbdev, 1)) { lprintf(2, "netif_open: cannot set configuration 1\n"); return -1; } /* claim interface 0 */ if (usb_claiminterface(state->usbdev, 0)) { lprintf(2, "netif_open: cannot claim interface 0\n"); return -1; } /* set interface 0 altsetting 1, to enable the bulk ep's */ if (usb_setinterface(state->usbdev, 0, 1)) { lprintf(2, "netif_open: cannot set interface 0 altsetting 1\n"); goto errsetif0; } state->bitraterx = state->bitratetx = state->txdmul = 0; if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { r = usb_control_msg(state->usbdev, 0xc0, 0xd1, 0, 0, 6, br, 100); if (r != 6) { lprintf(1, "Error while reading adapter bitrate\n"); goto errsetif0; } state->bitratetx = br[0] | (br[1] << 8) | (br[2] << 16); state->bitraterx = br[3] | (br[4] << 8) | (br[5] << 16); state->txdmul = (state->bitratetx + 799) / 800; lprintf(5, "Adapter %s bitrate %u/%u\n", state->serial, state->bitraterx, state->bitratetx); if (openpty(&master, &slave, ttyname, NULL, NULL)) { lerr(0, "openpty"); goto errsetif0; } /* set mode to raw */ memset(&tm, 0, sizeof(tm)); tm.c_cflag = CS8 | CREAD | CLOCAL; if (tcsetattr(master, TCSANOW, &tm)) { lerr(0, "master: tcsetattr"); goto errms; } memset(&tm, 0, sizeof(tm)); tm.c_cflag = CS8 | CREAD | CLOCAL; if (tcsetattr(slave, TCSANOW, &tm)) { lerr(0, "slave: tcsetattr"); goto errms; } /* set the line discipline */ if (ioctl(master, TIOCSETD, &disc) == -1) { lerr(0, "ioctl: TIOCSETD"); goto errms; } if (ioctl(master, SIOCSIFENCAP, &encap) == -1) { lerr(0, "ioctl: SIOCSIFENCAP"); goto errms; } /* try to set the interface name */ strncpy(state->ifname, state->cfg.intf.ifname, sizeof(state->ifname)); if (!state->ifname[0]) strncpy(state->ifname, "bcu0", sizeof(state->ifname)); if (ioctl(master, SIOCGIFNAME, ifr.ifr_name) == -1) { lerr(0, "ioctl: SIOCGIFNAME"); goto errms; } #ifdef HAVE_IFRNEWNAME if (strcmp(state->ifname, ifr.ifr_name)) { strncpy(ifr.ifr_newname, state->ifname, sizeof(ifr.ifr_newname)); if (ioctl(master, SIOCSIFNAME, &ifr) == -1) { lerr(1, "ioctl: SIOCSIFNAME"); lprintf(1, "baycomusb: cannot set ifname to %s, using %s (old kernel version?)\n", state->ifname, ifr.ifr_name); } } #endif if (ioctl(master, SIOCGIFNAME, ifr.ifr_name) == -1) { lerr(0, "ioctl: SIOCGIFNAME"); goto errms; } strncpy(state->ifname, ifr.ifr_name, sizeof(state->ifname)); /* start the interface */ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { lerr(0, "socket"); goto errms; } ifr.ifr_mtu = 256; if (ioctl(fd, SIOCSIFMTU, &ifr) == -1) { lerr(0, "ioctl: SIOCSIFMTU"); goto errmsfd; } if (ioctl(fd, SIOCGIFFLAGS, &ifr) == -1) { lerr(0, "ioctl: SIOCGIFFLAGS"); goto errmsfd; } ifr.ifr_flags &= ~IFF_NOARP; ifr.ifr_flags |= IFF_UP | IFF_RUNNING; if (ioctl(fd, SIOCSIFFLAGS, &ifr) == -1) { lerr(0, "ioctl: SIOCSIFFLAGS"); goto errmsfd; } close(fd); /* prepare for using it */ state->netif_fd = slave; state->netif_fdmaster = master; state->kiss.ioerr = 0; fcntl(state->netif_fd, F_SETFL, fcntl(state->netif_fd, F_GETFL, 0) | O_NONBLOCK); state->kiss.ibufptr = 0; state->dcd = 0; if (set_intf(state)) goto errms; runscript(state, "up"); state->slottime = gettimems(); } else if (state->mode == MODE_AUDIO) { #if 0 /* claim interface 1 */ if (usb_claiminterface(state->usbdev, 1)) { lprintf(2, "netif_open: cannot claim interface 1\n"); goto errsetif0; } /* set interface 1 altsetting 0 */ if (usb_setinterface(state->usbdev, 1, 0)) { lprintf(2, "netif_open: cannot set interface 1 altsetting 0\n"); goto errsetif1; } /* claim interface 2 */ if (usb_claiminterface(state->usbdev, 2)) { lprintf(2, "netif_open: cannot claim interface 2\n"); goto errsetif1; } /* set interface 2 altsetting 1, to enable the ISO ep's */ if (usb_setinterface(state->usbdev, 2, 1)) { lprintf(2, "netif_open: cannot set interface 2 altsetting 1\n"); goto errsetif2; } /* claim interface 3 */ if (usb_claiminterface(state->usbdev, 3)) { lprintf(2, "netif_open: cannot claim interface 3\n"); goto errsetif2; } /* set interface 3 altsetting 1, to enable the ISO ep's */ if (usb_setinterface(state->usbdev, 3, 1)) { lprintf(2, "netif_open: cannot set interface 3 altsetting 1\n"); goto errsetif3; } #endif audio_open(state); } lprintf(30, "netif_open\n"); state->netif_opened = 1; return 0; #if 0 errsetif3: usb_releaseinterface(state->usbdev, 3); errsetif2: usb_releaseinterface(state->usbdev, 2); errsetif1: usb_releaseinterface(state->usbdev, 1); goto errsetif0; #endif errmsfd: close(fd); errms: close(master); close(slave); errsetif0: usb_releaseinterface(state->usbdev, 0); state->netif_fd = state->netif_fdmaster = -1; lprintf(30, "netif_open error\n"); return -1; } /* --------------------------------------------------------------------- */ static int process(struct trx_thread_state *state, unsigned int timeout) { unsigned int curtime = gettimems(), rettime = curtime + timeout; struct usbdevfs_urb *urb; signed int tdiff, tdiff1; unsigned int i, j, maytx, nrtxfree; struct pollfd pfd[2]; int r; if (!state->netif_opened) { if (timeout) poll(NULL, 0, timeout); return 0; } if (!timeout) rettime++; acquire_trxdata_mutex(state); for (;;) { nrtxfree = 0; if (state->iurb.urbstate != URBSTATE_INPROGRESS) { tdiff = curtime - state->iurb.nexttime; if (tdiff >= 0) { r = usb_submiturb(state->usbdev, &state->iurb.urb); if (r < 0) { lprintf(1, "error submitting interrupt urb\n"); goto submiterr; } state->iurb.urbstate = URBSTATE_INPROGRESS; state->iurb.nexttime += INTERRUPT_INTERVAL; tdiff = curtime - state->iurb.nexttime; if (tdiff > 0) state->iurb.nexttime = curtime; } } else { /* interrupt urb timeout processing */ tdiff = curtime - state->iurb.nexttime; if (tdiff >= 1000) { lprintf(1, "interrupt urb timeout\n"); if (usb_discardurb(state->usbdev, &state->iurb.urb)) lprintf(1, "error %s (%d) killing interrupt urb\n", strerror(errno), errno); state->iurb.urbstate = URBSTATE_UNUSED; } } if (state->curb.urbstate != URBSTATE_INPROGRESS) { if (state->uarttxempty >= UARTTXDELAY && state->tfifo.rd != state->tfifo.wr) { state->curb.buf.creq.requesttype = 0x40; state->curb.buf.creq.request = 0xd3; state->curb.buf.creq.value[0] = state->tfifo.buf[state->tfifo.rd]; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 0; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 0; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 8; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (txuart)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->tfifo.rd = (state->tfifo.rd + 1) % sizeof(state->tfifo.buf); state->uarttxempty = 0; } else if (state->flags & FLG_CLRPTT) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd0; state->curb.buf.creq.value[0] = 0; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 1; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 3; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 11; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (ptt)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_CLRPTT; } else if (state->flags & FLG_SETPTT && !(state->flags & FLG_INHIBITSETPTT)) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd0; state->curb.buf.creq.value[0] = (state->flags & FLG_MANUALPTT) ? 1 : 0; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 1; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 3; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 11; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (ptt)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETPTT; } else if (state->flags & FLG_SETMDISCDIR) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd4; state->curb.buf.creq.value[0] = state->cfg.mdisc.direction; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 2; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 3; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 11; /* enable RxC, TxC or TxD outputs if special output mode is selected */ if (state->mode == MODE_FSK) { if (state->cfg.mdisc.rxc) state->curb.buf.creq.value[0] &= ~(1 << 0); if (state->cfg.mdisc.txc) state->curb.buf.creq.value[0] &= ~(1 << 1); if (state->cfg.mdisc.txd) state->curb.buf.creq.value[0] &= ~(1 << 3); } r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (mdiscdir)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETMDISCDIR; } else if (state->flags & FLG_SETMDISCOUT) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd4; state->curb.buf.creq.value[0] = state->cfg.mdisc.output; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 1; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 3; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 11; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (mdiscout)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETMDISCOUT; } else if (state->flags & FLG_SETT7FPORT) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd5; state->curb.buf.creq.value[0] = state->t7fport; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 1; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 2; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 10; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (t7fport)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETT7FPORT; } else if (state->flags & FLG_SETLEDS) { state->curb.buf.creq.requesttype = 0x40; state->curb.buf.creq.request = 0xd2; state->curb.buf.creq.value[0] = state->leds & 3; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 0; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 0; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 8; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (setleds)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETLEDS; } } else { /* control URB timeout processing */ tdiff = curtime - state->curb.starttime; if (tdiff >= 2000) { lprintf(1, "control urb timeout\n"); if (usb_discardurb(state->usbdev, &state->curb.urb)) lprintf(1, "error %s (%d) killing interrupt urb\n", strerror(errno), errno); state->curb.urbstate = URBSTATE_UNUSED; } } if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { kiss_input(state); for (;;) { i = state->du.p.rxurbptr; if (state->du.p.rxurb[i].urbstate == URBSTATE_INPROGRESS) break; if (state->du.p.rxurb[i].urbstate == URBSTATE_DONE) kiss_encodepkt(state, state->du.p.rxurb[i].b.buf, state->du.p.rxurb[i].urb.actual_length-2); state->du.p.rxurb[i].urbstate = URBSTATE_UNUSED; r = usb_submiturb(state->usbdev, &state->du.p.rxurb[i].urb); if (r < 0) { lprintf(1, "error submitting rx packet urb %u\n", i); goto submiterr; } state->du.p.rxurb[i].urbstate = URBSTATE_INPROGRESS; state->du.p.rxurbptr = (i + 1) % NUMRXPACKETS; } for (i = 0; i < NUMTXPACKETS; i++) if (state->du.p.txurb[i].urbstate == URBSTATE_UNUSED) nrtxfree++; /* channel access */ maytx = state->ptt || state->cfg.chacc.fullduplex; tdiff = state->slottime - curtime; if (tdiff < 0 || tdiff > 10000) { state->slottime = curtime + state->cfg.chacc.slottime; if (!state->dcd && (random_num() & 0xff) <= state->cfg.chacc.ppersistence) maytx = 1; } if (maytx) { for (i = 0; i < NUMTXPACKETS; i++) { if (state->du.p.txurb[i].urbstate != URBSTATE_FILLED) continue; r = usb_submiturb(state->usbdev, &state->du.p.txurb[i].urb); if (r < 0) { lprintf(1, "error submitting tx packet urb %u\n", i); goto submiterr; } state->du.p.txurb[i].urbstate = URBSTATE_INPROGRESS; } } } else if (state->mode == MODE_AUDIO) { for (i = 0; i < NUMAUDIOURB; i++) { if (state->du.a.inurb[i].urbstate != URBSTATE_UNUSED) continue; r = usb_submiturb(state->usbdev, &state->du.a.inurb[i].urb); if (r < 0) { lprintf(1, "error submitting audio input urb %u\n", i); goto submiterr; } state->du.a.inurb[i].urbstate = URBSTATE_INPROGRESS; } for (i = 0; i < NUMAUDIOURB; i++) { if (state->du.a.outurb[i].urbstate != URBSTATE_UNUSED) continue; r = usb_submiturb(state->usbdev, &state->du.a.outurb[i].urb); if (r < 0) { lprintf(1, "error submitting audio output urb %u\n", i); goto submiterr; } state->du.a.outurb[i].urbstate = URBSTATE_INPROGRESS; } } tdiff = rettime - curtime; if (tdiff < 0) { release_trxdata_mutex(state); return 0; } tdiff1 = state->iurb.nexttime - curtime; if (tdiff1 < 0) tdiff1 = 0; if (tdiff1 < tdiff) tdiff = tdiff1; release_trxdata_mutex(state); #if 1 pfd[0].fd = usb_getfd(state->usbdev); pfd[0].events = POLLOUT; pfd[1].fd = state->netif_fd; pfd[1].events = POLLIN; r = poll(pfd, (pfd[1].fd == -1 || !nrtxfree) ? 1 : 2, tdiff); if (r == -1) lerr(1, "poll"); urb = usb_reapurb(state->usbdev, 0); #else urb = usb_reapurb(state->usbdev, tdiff); #endif acquire_trxdata_mutex(state); curtime = gettimems(); if (!urb) continue; switch (((unsigned int)urb->usercontext) & ~0xffff) { case 0x00000: i = ((unsigned int)urb->usercontext) & 0xffff; #if 0 printf("Rx: %u \n", i); #endif if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { if (i > NUMRXPACKETS || urb != &state->du.p.rxurb[i].urb) abort(); if (!state->du.p.rxurb[i].urb.status && state->du.p.rxurb[i].urb.actual_length > 2) { state->du.p.rxurb[i].urbstate = URBSTATE_DONE; } else { lprintf(1, "receive transfer failed, status %u length %u\n", state->du.p.rxurb[i].urb.status, state->du.p.rxurb[i].urb.actual_length); state->du.p.rxurb[i].urbstate = URBSTATE_UNUSED; } } else if (state->mode == MODE_AUDIO) { if (i > NUMAUDIOURB || urb != &state->du.a.inurb[i].urb) abort(); if (state->du.a.inurb[i].urb.status) lprintf(1, "audio input transfer failed, status %u\n", state->du.a.inurb[i].urb.status); for (j = 0; j < NUMFRAMESPERURB; j++) { if (!state->du.a.inurb[i].urb.iso_frame_desc[j].status) continue; lprintf(1, " audio input transfer frame %u status %u\n", j, state->du.a.inurb[i].urb.iso_frame_desc[j].status); memset(&state->du.a.inurb[i].buf[j*(AUDIOSAMPLINGRATE/1000)], 0x80, (AUDIOSAMPLINGRATE/1000)); } audio_input(state, state->du.a.inurb[i].buf, NUMFRAMESPERURB*(AUDIOSAMPLINGRATE/1000)); state->du.a.inurb[i].urbstate = URBSTATE_UNUSED; } break; case 0x10000: i = ((unsigned int)urb->usercontext) & 0xffff; #if 0 printf("Tx: %u \n", i); #endif if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { if (i > NUMTXPACKETS || urb != &state->du.p.txurb[i].urb) abort(); if (state->du.p.txurb[i].urb.status) lprintf(1, "transmit transfer failed, status %u length %u\n", state->du.p.txurb[i].urb.status, state->du.p.txurb[i].urb.actual_length); state->du.p.txurb[i].urbstate = URBSTATE_UNUSED; } else if (state->mode == MODE_AUDIO) { if (i > NUMAUDIOURB || urb != &state->du.a.outurb[i].urb) abort(); if (state->du.a.outurb[i].urb.status) lprintf(1, "audio output transfer failed, status %u\n", state->du.a.outurb[i].urb.status); for (j = 0; j < NUMFRAMESPERURB; j++) { if (!state->du.a.outurb[i].urb.iso_frame_desc[j].status) continue; lprintf(1, " audio output transfer frame %u status %u\n", j, state->du.a.outurb[i].urb.iso_frame_desc[j].status); } audio_output(state, state->du.a.outurb[i].buf, NUMFRAMESPERURB*(AUDIOSAMPLINGRATE/1000)); state->du.a.outurb[i].urbstate = URBSTATE_UNUSED; } break; case 0x20000: if (urb != &state->iurb.urb) abort(); if (!state->iurb.urb.status && state->iurb.urb.actual_length >= 5) { #if 0 printf("stat: %02x %02x %02x %02x %02x\r", state->iurb.buf[0], state->iurb.buf[1], state->iurb.buf[2], state->iurb.buf[3], state->iurb.buf[4]); fflush(stdout); #endif state->ptt = !!(state->iurb.buf[0] & 4); if (state->mode != MODE_AUDIO) state->dcd = !!(state->iurb.buf[0] & 8); state->rssi = state->iurb.buf[3]; if (state->iurb.buf[0] & 32) state->uarttxempty++; else state->uarttxempty = 0; /* add UART RxChars */ if (state->iurb.urb.actual_length > 5) addrxfifo(state, &state->iurb.buf[5], state->iurb.urb.actual_length-5); } else lprintf(1, "interrupt transfer failed, status %u length %u\n", state->iurb.urb.status, state->iurb.urb.actual_length); #if 0 printf("ptt %d dcd %d rssi %u tempt %u slottime %u curtime %u\n", state->ptt, state->dcd, state->rssi, state->uarttxempty, state->slottime, curtime); #endif state->iurb.urbstate = URBSTATE_UNUSED; break; case 0x30000: if (urb != &state->curb.urb) abort(); if (state->iurb.urb.status) lprintf(1, "control transfer failed, status %u length %u\n", state->curb.urb.status, state->curb.urb.actual_length); state->curb.urbstate = URBSTATE_UNUSED; break; default: abort(); } } submiterr: release_trxdata_mutex(state); lprintf(1, "Error submitting urb: %d/%s (%u)\n", r, strerror(errno), errno); return -1; } int polldevice(struct trx_thread_state *state) { return process(state, 25); } /* --------------------------------------------------------------------- */ int getuartline(struct trx_thread_state *ctrl, unsigned int *ptr, unsigned char *buf, size_t bufsz, unsigned int timeout) { unsigned int cpy = 0, tdiff, reload; struct timeval tv1, tv2; if (!ctrl) return -1; if (gettimeofday(&tv1, NULL)) return -1; timeout *= 1000; while (cpy < bufsz) { acquire_trxdata_mutex(ctrl); if (buf) { while (cpy < bufsz && getrxfifo(ctrl, ptr, buf, 1) == 1) { if (*buf == '\r' || *buf == '\n') { cpy++; *buf++ = '\n'; *buf = 0; release_trxdata_mutex(ctrl); return cpy; } cpy++; buf++; } } reload = ctrl->flags & FLG_RELOADMODEM; release_trxdata_mutex(ctrl); if (reload) break; if (gettimeofday(&tv2, NULL)) break; tdiff = 1000000 * (tv2.tv_sec - tv1.tv_sec) + tv2.tv_usec - tv1.tv_usec; if (tdiff > timeout) break; if (process(ctrl, 25)) return -1; } if (buf) *buf = 0; return cpy; } /* --------------------------------------------------------------------- */ static RETSIGTYPE signal_quit(int signum) { quit = 1; } static RETSIGTYPE signal_child(int signum, siginfo_t *info, void *dummy) { int status; struct rusage rusage; if (info->si_code == CLD_STOPPED || info->si_code == CLD_CONTINUED) return; wait4(-1, &status, WNOHANG, &rusage); } /* --------------------------------------------------------------------- */ int main (int argc, char *argv[]) { static const struct option long_options[] = { { "drv", 1, 0, 'D' }, { "config", 1, 0, 'C' }, { "daemonize", 0, 0, 'd' }, { "verbose", 0, 0, 'v' }, { "help", 0, 0, 'h' }, { "nommx", 0, 0, 0x400 }, { "mmx", 0, 0, 0x401 }, { 0, 0, 0, 0 } }; int c, err = 0; unsigned int daemonize = 0, simd = 1; char devname[256] = "/proc/bus/usb/devices"; const char *cfgfile = NULL; int pfds[2]; pid_t pid; unsigned char uch; struct sigaction sigact; printf("baycomusbserv v" VERSION " (user) (c) 1999-2001 by Thomas Sailer, HB9JNX/AE4WA\n"); /* init custom IO handlers */ IIOPAddConnectionHandler = orb_add_connection; IIOPRemoveConnectionHandler = orb_remove_connection; if (server_init1(&argc, argv)) return -1; while ((c = getopt_long(argc, argv, "D:C:sv:d", long_options, NULL)) != EOF) { switch (c) { case 'D': usb_setmountpoint(optarg); snprintf(devname, sizeof(devname), "%s/devices", optarg); break; case 'C': cfgfile = optarg; break; #if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG) case 's': if (syslogmsg) break; openlog("baycomusb", LOG_PID, LOG_USER); syslogmsg = 1; break; #endif case 'd': daemonize = 1; break; case 'v': verboselevel = strtoul(optarg, NULL, 0); break; case 0x400: case 0x401: simd = c & 1; break; default: err++; break; } } if (err) { lprintf(0, "usage: %s [-v ] [-D ] [-C ]\n", argv[0]); exit(1); } if (daemonize) { if (pipe(pfds)) { lprintf(0, "pipe error %s (%u)", strerror(errno), errno); exit(1); } switch (pid = fork()) { case -1: lprintf(0, "fork error %s (%u)", strerror(errno), errno); exit(1); case 0: /* child process */ close(pfds[0]); setsid(); /* become a process group leader and drop controlling terminal */ fclose(stdin); /* no more standard in */ break; default: /* parent process */ close(pfds[1]); err = read(pfds[0], &uch, sizeof(uch)); if (err != sizeof(uch)) { lprintf(0, "baycomusbserv init failed\n"); _exit(1); } /* need to run _exit, otherwise ORBit inadvertedly kills some needed stuff */ _exit(0); } } if (config_load(cfgfile)) exit(1); if ((devices_fd = open(devname, 0)) == -1) { lprintf(0, "Cannot open %s, usbdevfs not mounted?\n", devname); exit(1); } sigact.sa_handler = signal_quit; sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_RESTART; #ifdef SIGHUP sigaction(SIGHUP, &sigact, NULL); #endif sigaction(SIGINT, &sigact, NULL); #ifdef SIGQUIT sigaction(SIGQUIT, &sigact, NULL); #endif sigaction(SIGTERM, &sigact, NULL); sigact.sa_sigaction = signal_child; sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_RESTART | SA_NOCLDSTOP | SA_SIGINFO; sigaction(SIGCHLD, &sigact, NULL); if (daemonize) { uch = 0; if (write(pfds[1], &uch, sizeof(uch)) != sizeof(uch)) { lprintf(0, "write error %s (%u)", strerror(errno), errno); exit(1); } close(pfds[1]); } if ((sock_fd = socket(/*PF_PACKET*/AF_INET, /*SOCK_RAW*/SOCK_PACKET, htons(ETH_P_AX25))) < 0) { lprintf(0, "Cannot create socket: %s (%u) \n", strerror(errno), errno); exit(1);; } initsimd(simd); audio_globalinit(); if (server_init2()) return 1; mainloop(); config_save(); return 0; } baycomusb-0.10.orig/trxctrl/cfgunix.c0100644000175100017510000003545307340456307015743 0ustar abaaba/*****************************************************************************/ /* * cfgunix.c -- UNIX configuration file IO. * * Copyright (C) 1999-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "trx.h" /* libxml includes */ #include #include /* ---------------------------------------------------------------------- */ static char configfile[256] = "/etc/ax25/baycomusb.conf"; static xmlDocPtr doc; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; #define FALSE 0 #define TRUE 1 /* ---------------------------------------------------------------------- */ int config_load(const char *name) { if (name) strncpy(configfile, name, sizeof(configfile)); pthread_mutex_lock(&mutex); if (!(doc = xmlParseFile(configfile))) { if (!(doc = xmlNewDoc("1.0"))) goto errmem; if (!(doc->root = xmlNewDocNode(doc, NULL, "baycomusb", NULL))) goto errmem; goto retok; } if (strcmp(doc->root->name, "baycomusb")) { lprintf(1, "Config file does not contain baycomusb data\n"); pthread_mutex_unlock(&mutex); return -1; } retok: pthread_mutex_unlock(&mutex); return 0; errmem: lprintf(1, "Configfile: out of memory\n"); pthread_mutex_unlock(&mutex); return -1; } /* ---------------------------------------------------------------------- */ int config_save(void) { int r = 0; pthread_mutex_lock(&mutex); if (!xmlSaveFile(configfile, doc)) r = -1; pthread_mutex_unlock(&mutex); return r; } /* ---------------------------------------------------------------------- */ static xmlNodePtr getserialnode(const char *serial) { xmlNodePtr node; const char *cp; for (node = doc->root->childs; node; node = node->next) { if (!node->name || strcmp(node->name, "device")) continue; cp = xmlGetProp(node, "serial"); if (!cp) continue; if (strcmp(cp, serial)) continue; return node; } node = xmlNewChild(doc->root, NULL, "device", NULL); if (node) xmlSetProp(node, "serial", serial); return node; } /* ---------------------------------------------------------------------- */ static xmlNodePtr getsectionnode(xmlNodePtr sernode, const char *secname) { xmlNodePtr node; for (node = sernode->childs; node; node = node->next) { if (!node->name) continue; if (strcmp(node->name, secname)) continue; return node; } node = xmlNewChild(sernode, NULL, secname, NULL); return node; } /* ---------------------------------------------------------------------- */ static void parseip(trxapi_ip_address_t addr, const char *cp) { unsigned int r1, r2, r3, r4; if (!cp || sscanf(cp, "%u.%u.%u.%u", &r1, &r2, &r3, &r4) != 4) { addr[0] = addr[1] = addr[2] = addr[3] = 0; return; } addr[0] = r1; addr[1] = r2; addr[2] = r3; addr[3] = r4; } void config_loaddevice(struct trx_thread_state *state) { xmlNodePtr sernode, node; const char *cp; /* set default */ state->cfg.adapt.mode = trxapi_baycomusb_mode_fsk; state->cfg.adapt.fclk = 19666600; state->cfg.adapt.bitraterx = state->cfg.adapt.bitratetx = 9600; state->cfg.adapt.loopback = trxapi_baycomusb_loopback_off; state->cfg.adapt.pttmute = TRUE; state->cfg.adapt.filtmode = 0; state->cfg.adapt.samplerate = 8000; state->cfg.adapt.gain = 1; strncpy(state->cfg.adapt.audiodevin, "/dev/dsp", sizeof(state->cfg.adapt.audiodevin)); strncpy(state->cfg.adapt.audiodevout, "/dev/dsp", sizeof(state->cfg.adapt.audiodevout)); state->cfg.adapt.rfsquelch = RSSI_MIN; state->cfg.adapt.audiosquelch = FALSE; state->cfg.chacc.txdelay = 150; state->cfg.chacc.slottime = 100; state->cfg.chacc.ppersistence = 40; state->cfg.chacc.txtail = 10; state->cfg.chacc.fullduplex = FALSE; strncpy(state->cfg.intf.ifname, "bcu0", sizeof(state->cfg.intf.ifname)); strncpy(state->cfg.intf.hwaddr, "N0CALL", sizeof(state->cfg.intf.hwaddr)); state->cfg.intf.ipaddr[0] = 10; state->cfg.intf.ipaddr[1] = 0; state->cfg.intf.ipaddr[2] = 0; state->cfg.intf.ipaddr[3] = 1; state->cfg.intf.netmask[0] = 255; state->cfg.intf.netmask[1] = 255; state->cfg.intf.netmask[2] = 255; state->cfg.intf.netmask[3] = 0; state->cfg.intf.broadcast[0] = 10; state->cfg.intf.broadcast[1] = 0; state->cfg.intf.broadcast[2] = 0; state->cfg.intf.broadcast[3] = 255; state->cfg.intf.gwhwaddr[0] = 0; state->cfg.intf.gwipaddr[0] = 0; state->cfg.intf.gwipaddr[1] = 0; state->cfg.intf.gwipaddr[2] = 0; state->cfg.intf.gwipaddr[3] = 0; state->cfg.intf.gwnetmask[0] = 255; state->cfg.intf.gwnetmask[1] = 0; state->cfg.intf.gwnetmask[2] = 0; state->cfg.intf.gwnetmask[3] = 0; state->cfg.intf.gwipmode = ' '; state->cfg.mdisc.output = 0; state->cfg.mdisc.direction = 0xff; state->cfg.mdisc.rxc = trxapi_modem_disconnect_rxc_normal; state->cfg.mdisc.txc = trxapi_modem_disconnect_txc_normal; state->cfg.mdisc.txd = trxapi_modem_disconnect_txd_normal; pthread_mutex_lock(&mutex); if (!(sernode = getserialnode(state->serial))) { pthread_mutex_unlock(&mutex); return; } if ((node = getsectionnode(sernode, "adapter"))) { if ((cp = xmlGetProp(node, "mode"))) { if (!strcmp(cp, "fsk")) { state->cfg.adapt.mode = trxapi_baycomusb_mode_fsk; } else if (!strcmp(cp, "external")) { state->cfg.adapt.mode = trxapi_baycomusb_mode_external; } else if (!strcmp(cp, "afsk")) { state->cfg.adapt.mode = trxapi_baycomusb_mode_afsk; } else if (!strcmp(cp, "audio")) { state->cfg.adapt.mode = trxapi_baycomusb_mode_audio; } } if ((cp = xmlGetProp(node, "fclk"))) state->cfg.adapt.fclk = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "bitrate"))) state->cfg.adapt.bitraterx = state->cfg.adapt.bitratetx = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "bitraterx"))) state->cfg.adapt.bitraterx = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "bitratetx"))) state->cfg.adapt.bitratetx = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "loopback"))) state->cfg.adapt.loopback = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "pttmute"))) state->cfg.adapt.pttmute = (cp[0] == '0' || cp[0] == 'n' || cp[0] == 'N') ? FALSE : TRUE; if ((cp = xmlGetProp(node, "filtmode"))) state->cfg.adapt.filtmode = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "samplerate"))) state->cfg.adapt.samplerate = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "gain"))) state->cfg.adapt.gain = strtod(cp, NULL); if ((cp = xmlGetProp(node, "audiodevin"))) strncpy(state->cfg.adapt.audiodevin, cp, sizeof(state->cfg.adapt.audiodevin)); if ((cp = xmlGetProp(node, "audiodevout"))) strncpy(state->cfg.adapt.audiodevout, cp, sizeof(state->cfg.adapt.audiodevout)); if ((cp = xmlGetProp(node, "rfsquelch"))) state->cfg.adapt.rfsquelch = strtod(cp, NULL); if ((cp = xmlGetProp(node, "audiosquelch"))) state->cfg.adapt.audiosquelch = (cp[0] == '0' || cp[0] == 'n' || cp[0] == 'N') ? FALSE : TRUE; } if ((node = getsectionnode(sernode, "chaccess"))) { if ((cp = xmlGetProp(node, "txdelay"))) state->cfg.chacc.txdelay = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "slottime"))) state->cfg.chacc.slottime = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "ppersistence"))) state->cfg.chacc.ppersistence = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "txtail"))) state->cfg.chacc.txtail = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "fullduplex"))) state->cfg.chacc.fullduplex = (cp[0] == '0' || cp[0] == 'n' || cp[0] == 'N') ? FALSE : TRUE; } if ((node = getsectionnode(sernode, "interface"))) { if ((cp = xmlGetProp(node, "ifname"))) strncpy(state->cfg.intf.ifname, cp, sizeof(state->cfg.intf.ifname)); if ((cp = xmlGetProp(node, "hwaddr"))) strncpy(state->cfg.intf.hwaddr, cp, sizeof(state->cfg.intf.hwaddr)); if ((cp = xmlGetProp(node, "ipaddr"))) parseip(state->cfg.intf.ipaddr, cp); if ((cp = xmlGetProp(node, "netmask"))) parseip(state->cfg.intf.netmask, cp); if ((cp = xmlGetProp(node, "broadcast"))) parseip(state->cfg.intf.broadcast, cp); if ((cp = xmlGetProp(node, "gwhwaddr"))) strncpy(state->cfg.intf.gwhwaddr, cp, sizeof(state->cfg.intf.gwhwaddr)); if ((cp = xmlGetProp(node, "gwipaddr"))) parseip(state->cfg.intf.gwipaddr, cp); if ((cp = xmlGetProp(node, "gwnetmask"))) parseip(state->cfg.intf.gwnetmask, cp); if ((cp = xmlGetProp(node, "gwipmode"))) state->cfg.intf.gwipmode = *cp; } if ((node = getsectionnode(sernode, "modemdisc"))) { if ((cp = xmlGetProp(node, "output"))) state->cfg.mdisc.output = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "direction"))) state->cfg.mdisc.direction = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "rxc"))) state->cfg.mdisc.rxc = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "txc"))) state->cfg.mdisc.txc = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "txd"))) state->cfg.mdisc.txd = strtoul(cp, NULL, 0); } if ((node = getsectionnode(sernode, "frequency"))) { if ((cp = xmlGetProp(node, "rx"))) state->cfg.freq.rx = strtoull(cp, NULL, 0); if ((cp = xmlGetProp(node, "tx"))) state->cfg.freq.tx = strtoull(cp, NULL, 0); } pthread_mutex_unlock(&mutex); } /* ---------------------------------------------------------------------- */ void config_savedevice(struct trx_thread_state *state) { xmlNodePtr sernode, node; char buf[128]; if (!state->serial[0]) return; pthread_mutex_lock(&mutex); if (!(sernode = getserialnode(state->serial))) { lprintf(1, "Config %s out of memory\n", state->serial); pthread_mutex_unlock(&mutex); return; } if ((node = getsectionnode(sernode, "adapter"))) { xmlSetProp(node, "mode", (state->cfg.adapt.mode == trxapi_baycomusb_mode_external) ? "external" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_afsk) ? "afsk" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_audio) ? "audio" : "fsk"); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.fclk); xmlSetProp(node, "fclk", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.bitraterx); xmlSetProp(node, "bitraterx", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.bitratetx); xmlSetProp(node, "bitratetx", buf); snprintf(buf, sizeof(buf), "%d", state->cfg.adapt.loopback); xmlSetProp(node, "loopback", buf); snprintf(buf, sizeof(buf), "%d", !!state->cfg.adapt.pttmute); xmlSetProp(node, "pttmute", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.filtmode); xmlSetProp(node, "filtmode", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.samplerate); xmlSetProp(node, "samplerate", buf); snprintf(buf, sizeof(buf), "%f", state->cfg.adapt.gain); xmlSetProp(node, "gain", buf); xmlSetProp(node, "audiodevin", state->cfg.adapt.audiodevin); xmlSetProp(node, "audiodevout", state->cfg.adapt.audiodevout); snprintf(buf, sizeof(buf), "%f", state->cfg.adapt.rfsquelch); xmlSetProp(node, "rfsquelch", buf); snprintf(buf, sizeof(buf), "%d", !!state->cfg.adapt.audiosquelch); xmlSetProp(node, "audiosquelch", buf); } else lprintf(1, "Config %s node adapter out of memory\n", state->serial); if ((node = getsectionnode(sernode, "chaccess"))) { snprintf(buf, sizeof(buf), "%ld", state->cfg.chacc.txdelay); xmlSetProp(node, "txdelay", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.chacc.slottime); xmlSetProp(node, "slottime", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.chacc.ppersistence); xmlSetProp(node, "ppersistence", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.chacc.txtail); xmlSetProp(node, "txtail", buf); snprintf(buf, sizeof(buf), "%d", !!state->cfg.chacc.fullduplex); xmlSetProp(node, "fullduplex", buf); } else lprintf(1, "Config %s node chaccess out of memory\n", state->serial); if ((node = getsectionnode(sernode, "interface"))) { xmlSetProp(node, "ifname", state->cfg.intf.ifname); xmlSetProp(node, "hwaddr", state->cfg.intf.hwaddr); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", state->cfg.intf.ipaddr[0], state->cfg.intf.ipaddr[1], state->cfg.intf.ipaddr[2], state->cfg.intf.ipaddr[3]); xmlSetProp(node, "ipaddr", buf); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", state->cfg.intf.netmask[0], state->cfg.intf.netmask[1], state->cfg.intf.netmask[2], state->cfg.intf.netmask[3]); xmlSetProp(node, "netmask", buf); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", state->cfg.intf.broadcast[0], state->cfg.intf.broadcast[1], state->cfg.intf.broadcast[2], state->cfg.intf.broadcast[3]); xmlSetProp(node, "broadcast", buf); xmlSetProp(node, "gwhwaddr", state->cfg.intf.gwhwaddr); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", state->cfg.intf.gwipaddr[0], state->cfg.intf.gwipaddr[1], state->cfg.intf.gwipaddr[2], state->cfg.intf.gwipaddr[3]); xmlSetProp(node, "gwipaddr", buf); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", state->cfg.intf.gwnetmask[0], state->cfg.intf.gwnetmask[1], state->cfg.intf.gwnetmask[2], state->cfg.intf.gwnetmask[3]); xmlSetProp(node, "gwnetmask", buf); snprintf(buf, sizeof(buf), "%c", state->cfg.intf.gwipmode); xmlSetProp(node, "gwipmode", buf); } else lprintf(1, "Config %s node interface out of memory\n", state->serial); if ((node = getsectionnode(sernode, "modemdisc"))) { snprintf(buf, sizeof(buf), "0x%02lx", state->cfg.mdisc.output & 0xff); xmlSetProp(node, "output", buf); snprintf(buf, sizeof(buf), "0x%02lx", state->cfg.mdisc.direction & 0xff); xmlSetProp(node, "direction", buf); snprintf(buf, sizeof(buf), "%u", state->cfg.mdisc.rxc); xmlSetProp(node, "rxc", buf); snprintf(buf, sizeof(buf), "%u", state->cfg.mdisc.txc); xmlSetProp(node, "txc", buf); snprintf(buf, sizeof(buf), "%u", state->cfg.mdisc.txd); xmlSetProp(node, "txd", buf); } else lprintf(1, "Config %s node modemdisc out of memory\n", state->serial); if ((node = getsectionnode(sernode, "frequency"))) { snprintf(buf, sizeof(buf), "%llu", state->cfg.freq.rx); xmlSetProp(node, "rx", buf); snprintf(buf, sizeof(buf), "%llu", state->cfg.freq.tx); xmlSetProp(node, "tx", buf); } else lprintf(1, "Config %s node frequency out of memory\n", state->serial); pthread_mutex_unlock(&mutex); } baycomusb-0.10.orig/trxctrl/audiolinux.c0100644000175100017510000003161607331753212016451 0ustar abaaba/*****************************************************************************/ /* * audiolinux.c -- Audio processing for "virtual transceiver", Linux IO. * * Copyright (C) 1999, 2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #include #if defined(HAVE_SYS_SOUNDCARD_H) #include #elif defined(HAVE_LINUX_SOUNDCARD_H) #include #endif #include #include #include #include #include #include #include #include "trxapi.h" #include "trx.h" /* ---------------------------------------------------------------------- */ #if (defined(HAVE_LINUX_SOUNDCARD_H) || defined(HAVE_SYS_SOUNDCARD_H)) #define BUFSIZE 8192 /* must be significantly bigger than SNDLATENCY! */ /* ---------------------------------------------------------------------- */ static void stop(struct trx_thread_state *state) { if (state->du.a.io.fdout != -1 && state->du.a.io.fdout != state->du.a.io.fdin) close(state->du.a.io.fdout); if (state->du.a.io.fdin != -1) close(state->du.a.io.fdin); state->du.a.io.fdin = state->du.a.io.fdout = -1; } static void start(struct trx_thread_state *state) { int16_t buf[SNDLATENCY]; audio_buf_info abinfo; int apar; unsigned srate; stop(state); if (strncmp(state->cfg.adapt.audiodevin, state->cfg.adapt.audiodevout, sizeof(state->cfg.adapt.audiodevin))) { if ((state->du.a.io.fdin = open(state->cfg.adapt.audiodevin, O_RDONLY | O_NONBLOCK)) == -1) { lprintf(0, "cannot open \"%s\" (%s)\n", state->cfg.adapt.audiodevin, strerror(errno)); goto errsnd; } if ((state->du.a.io.fdout = open(state->cfg.adapt.audiodevout, O_WRONLY | O_NONBLOCK)) == -1) { lprintf(0, "cannot open \"%s\" (%s)\n", state->cfg.adapt.audiodevout, strerror(errno)); goto errsnd; } } else { if ((state->du.a.io.fdin = state->du.a.io.fdout = open(state->cfg.adapt.audiodevin, O_RDWR | O_NONBLOCK)) == -1) { lprintf(0, "cannot open \"%s\" (%s)\n", state->cfg.adapt.audiodevin, strerror(errno)); goto errsnd; } } fcntl(state->du.a.io.fdin, F_SETFL, fcntl(state->du.a.io.fdin, F_GETFL, 0) | O_NONBLOCK); if (state->du.a.io.fdin != state->du.a.io.fdout) fcntl(state->du.a.io.fdout, F_SETFL, fcntl(state->du.a.io.fdout, F_GETFL, 0) | O_NONBLOCK); if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_NONBLOCK, 0) == -1) { lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno)); goto errsnd; } if (state->du.a.io.fdin != state->du.a.io.fdout && ioctl(state->du.a.io.fdout, SNDCTL_DSP_NONBLOCK, 0) == -1) { lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno)); goto errsnd; } if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_GETCAPS, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno)); goto errsnd; } if (!(apar & DSP_CAP_TRIGGER)) { lprintf(0, "soundcard does not support trigger\n"); goto errsnd; } if (state->du.a.io.fdin != state->du.a.io.fdout) { if (ioctl(state->du.a.io.fdout, SNDCTL_DSP_GETCAPS, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno)); goto errsnd; } if (!(apar & DSP_CAP_TRIGGER)) { lprintf(0, "soundcard does not support trigger\n"); goto errsnd; } } else { if (!(apar & DSP_CAP_DUPLEX)) { lprintf(0, "soundcard does not support full duplex\n"); goto errsnd; } } apar = AFMT_S16_LE; if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_SETFMT, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), S16_LE not supported??\n", strerror(errno)); goto errsnd; } #if 0 apar = 0; if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_STEREO, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno)); goto errsnd; } #else apar = 1; if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_CHANNELS, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_CHANNELS failed (%s), mono not supported??\n", strerror(errno)); goto errsnd; } #endif srate = state->du.a.p.srateusb; if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_SPEED, &srate) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n", strerror(errno), state->du.a.p.srateusb); goto errsnd; } state->du.a.p.sratedspout = state->du.a.p.sratedspin = srate; if (state->du.a.io.fdin != state->du.a.io.fdout) { apar = AFMT_S16_LE; if (ioctl(state->du.a.io.fdout, SNDCTL_DSP_SETFMT, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), S16_LE not supported??\n", strerror(errno)); goto errsnd; } #if 0 apar = 0; if (ioctl(state->du.a.io.fdout, SNDCTL_DSP_STEREO, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno)); goto errsnd; } #else apar = 1; if (ioctl(state->du.a.io.fdout, SNDCTL_DSP_CHANNELS, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_CHANNELS failed (%s), mono not supported??\n", strerror(errno)); goto errsnd; } #endif srate = state->du.a.p.srateusb; if (ioctl(state->du.a.io.fdout, SNDCTL_DSP_SPEED, &srate) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n", strerror(errno), state->du.a.p.srateusb); goto errsnd; } state->du.a.p.sratedspout = srate; } lprintf(2, "usb adapter sampling rate %u, soundcard sampling rate in %u out %u\n", state->du.a.p.srateusb, state->du.a.p.sratedspin, state->du.a.p.sratedspout); if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_GETISPACE, &abinfo) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno)); goto errsnd; } if (abinfo.fragstotal * abinfo.fragsize < 2*SNDLATENCY*2) { lprintf(0, "soundcard buffers too small (%u)\n", abinfo.fragstotal * abinfo.fragsize); goto errsnd; } if (ioctl(state->du.a.io.fdout, SNDCTL_DSP_GETOSPACE, &abinfo) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETOSPACE failed (%s)\n", strerror(errno)); goto errsnd; } if (abinfo.fragstotal * abinfo.fragsize < 2*SNDLATENCY*2) { lprintf(0, "soundcard buffers too small (%u)\n", abinfo.fragstotal * abinfo.fragsize); goto errsnd; } if (state->du.a.io.fdin != state->du.a.io.fdout) { apar = PCM_ENABLE_INPUT; if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_SETTRIGGER, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno)); goto errsnd; } apar = PCM_ENABLE_OUTPUT; if (ioctl(state->du.a.io.fdout, SNDCTL_DSP_SETTRIGGER, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno)); goto errsnd; } } else { apar = PCM_ENABLE_INPUT|PCM_ENABLE_OUTPUT; if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_SETTRIGGER, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno)); goto errsnd; } } state->du.a.io.inzerosamples = SNDLATENCY; memset(buf, 0, sizeof(buf)); write(state->du.a.io.fdout, buf, sizeof(buf)); return; errsnd: stop(state); state->du.a.p.sratedspin = state->du.a.p.sratedspout = state->du.a.p.srateusb; } /* ---------------------------------------------------------------------- */ void audio_globalinit(void) { } struct trxapi_baycomusb_adapter_audio_devs *audio_get_device_list(void) { struct trxapi_baycomusb_adapter_audio_devs *ad; /* retrieve audio devs */ if (!(ad = calloc(1, sizeof(struct trxapi_baycomusb_adapter_audio_devs) + 4 * sizeof(trxapi_audiodevice_t) + 4 * sizeof(trxapi_audiodevice_t)))) return NULL; ad->audiodevsin = (void *)(ad + 1); ad->nraudiodevsin = 4; ad->audiodevsout = &ad->audiodevsin[4]; ad->nraudiodevsout = 4; strncpy(ad->audiodevsin[0], "/dev/dsp", sizeof(ad->audiodevsin[0])); strncpy(ad->audiodevsin[1], "/dev/dsp1", sizeof(ad->audiodevsin[1])); strncpy(ad->audiodevsin[2], "/dev/dsp2", sizeof(ad->audiodevsin[2])); strncpy(ad->audiodevsin[3], "/dev/dsp3", sizeof(ad->audiodevsin[3])); strncpy(ad->audiodevsout[0], "/dev/dsp", sizeof(ad->audiodevsout[0])); strncpy(ad->audiodevsout[1], "/dev/dsp1", sizeof(ad->audiodevsout[1])); strncpy(ad->audiodevsout[2], "/dev/dsp2", sizeof(ad->audiodevsout[2])); strncpy(ad->audiodevsout[3], "/dev/dsp3", sizeof(ad->audiodevsout[3])); return ad; } void audio_open(struct trx_thread_state *state) { state->du.a.p.srateusb = state->du.a.p.sratedspin = state->du.a.p.sratedspout = AUDIOSAMPLINGRATE; start(state); audioproc_init(state); } void audio_close(struct trx_thread_state *state) { stop(state); } void audio_input(struct trx_thread_state *state, const signed char *samples, unsigned int nrsamples) { int16_t sbuf[BUFSIZE]; unsigned int apar, cnt; int r; /* usb->dsp direction */ cnt = audioproc_convertoutput(state, nrsamples, samples, sbuf); if (state->du.a.io.fdout == -1) return; if ((r = write(state->du.a.io.fdout, sbuf, 2*cnt)) != 2*cnt) { lprintf(0, "write(%d) failed %i (%s)\n", 2*cnt, r, strerror(errno)); goto err; } if (ioctl(state->du.a.io.fdout, SNDCTL_DSP_GETODELAY, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETODELAY failed (%s)\n", strerror(errno)); goto err; } apar >>= 1; /* adjust speed */ if (audioproc_adjustoutput(state, apar)) goto err; return; err: stop(state); } void audio_output(struct trx_thread_state *state, signed char *samples, unsigned int nrsamples) { int16_t *sbuf; unsigned int isamples; audio_buf_info abinfo; int r; /* dsp->usb direction */ if (!nrsamples) return; if (state->du.a.io.fdin == -1) { isamples = audioproc_convertinput_isamples(state, nrsamples); sbuf = alloca(isamples * sizeof(sbuf[0])); memset(sbuf, 0, isamples * sizeof(sbuf[0])); audioproc_convertinput(state, isamples, nrsamples, sbuf, samples); return; } isamples = audioproc_convertinput_isamples(state, nrsamples); sbuf = alloca(isamples * sizeof(sbuf[0])); memset(sbuf, 0, isamples * sizeof(sbuf[0])); if (state->du.a.io.inzerosamples >= isamples) { state->du.a.io.inzerosamples -= isamples; } else { state->du.a.io.inzerosamples = 0; r = read(state->du.a.io.fdin, sbuf+state->du.a.io.inzerosamples, (isamples-state->du.a.io.inzerosamples) * sizeof(sbuf[0])); if (r == -1 && errno != EAGAIN) { audioproc_convertinput(state, isamples, nrsamples, sbuf, samples); lprintf(0, "read failed %i (%s)\n", r, strerror(errno)); goto err; } } audioproc_convertinput(state, isamples, nrsamples, sbuf, samples); if (ioctl(state->du.a.io.fdin, SNDCTL_DSP_GETISPACE, &abinfo) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno)); goto err; } /* adjust speed */ if (audioproc_adjustinput(state, abinfo.bytes / sizeof(sbuf[0]) + state->du.a.io.inzerosamples)) goto err; return; err: stop(state); } /* ---------------------------------------------------------------------- */ #else /* !HAVE_LINUX_SOUNDCARD_H && !HAVE_SYS_SOUNDCARD_H */ void audio_globalinit(void) { } struct trxapi_baycomusb_adapter_audio_devs *audio_get_device_list(void) { return NULL; } void audio_open(struct trx_thread_state *state) { state->du.a.p.srateusb = state->du.a.p.sratedspin = state->du.a.p.sratedspout = AUDIOSAMPLINGRATE; audioproc_init(state); } void audio_close(struct trx_thread_state *state) { } void audio_input(struct trx_thread_state *state, const signed char *samples, unsigned int nrsamples) { audioproc_convertoutput(state, nrsamples, samples, sbuf); } void audio_output(struct trx_thread_state *state, signed char *samples, unsigned int nrsamples) { int16_t *sbuf; unsigned int isamples; if (!nrsamples) return; isamples = audioproc_convertinput_isamples(state, nrsamples); sbuf = alloca(isamples * sizeof(sbuf[0])); memset(sbuf, 0, isamples * sizeof(sbuf[0])); audioproc_convertinput(state, isamples, nrsamples, sbuf, samples); } /* ---------------------------------------------------------------------- */ #endif /* HAVE_LINUX_SOUNDCARD_H || HAVE_SYS_SOUNDCARD_H */ baycomusb-0.10.orig/trxctrl/audio.c0100644000175100017510000002724107340235076015373 0ustar abaaba/*****************************************************************************/ /* * audio.c -- Audio processing for "virtual transceiver". * * Copyright (C) 1999, 2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #include #include "trx.h" #include "simd.h" /* ---------------------------------------------------------------------- */ #define PWRINTERVAL 4096 /* must be even */ #define PWRINTERVAL2 64 /* must be even */ #define PWRNOISECALIB 4096 #define RCOSALPHA 0.4 //#define FILTERRELAX 1.4 #define FILTERRELAX 1.0 #define MAXSAMPLERATE 0.5 /* relative to AUDIOSAMPLERATE */ /* --------------------------------------------------------------------- */ static inline double sinc(double x) { double arg = x * M_PI; if (fabs(arg) < 1e-10) return 1; return sin(arg) / arg; } static inline double hamming(double x) { return 0.54-0.46*cos(2*M_PI*x); } static void compute_filter(double tmul, int16_t filter[AUDIONUMFILTER][AUDIOFILTERLEN]) { int i, j; float f1, f2, time, alphatime; float c[AUDIONUMFILTER * AUDIOFILTERLEN]; if (tmul > MAXSAMPLERATE) tmul = MAXSAMPLERATE; #if 0 tmul *= (FILTERRELAX / AUDIONUMFILTER); for (i = 0; i < AUDIONUMFILTER * AUDIOFILTERLEN; i++) { f1 = i - ((AUDIONUMFILTER * AUDIOFILTERLEN - 1.0) / 2.0); f1 *= tmul; f2 = i * (1.0 / (AUDIONUMFILTER * AUDIOFILTERLEN - 1.0)); c[i] = sinc(f1) * hamming(f2); } #else tmul *= (1.0 / AUDIONUMFILTER); for (i = 0; i < AUDIONUMFILTER * AUDIOFILTERLEN; i++) { time = i - ((AUDIONUMFILTER * AUDIOFILTERLEN - 1.0) / 2.0); time *= tmul; alphatime = time * RCOSALPHA; f1 = 1 - 4 * alphatime * alphatime; if (fabs(f1) < 1e-10) f2 = M_PI * (1.0 / 8.0) * sin(M_PI * alphatime) / alphatime; else f2 = cos(M_PI * alphatime) / f1; c[i] = sinc(time) * f2; } #endif f1 = 0; for (i = 0; i < AUDIONUMFILTER; i++) { for (f2 = 0, j = i; j < AUDIONUMFILTER * AUDIOFILTERLEN; j += AUDIONUMFILTER) f2 += fabs(c[j]); if (f2 > f1) f1 = f2; } f1 = 32767.0 / f1; for (i = 0; i < AUDIONUMFILTER; i++) for (j = 0; j < AUDIOFILTERLEN; j++) filter[i][AUDIOFILTERLEN-1-j] = f1 * c[j * AUDIONUMFILTER + i]; } /* ---------------------------------------------------------------------- */ #if 0 static inline int16_t fir(const int16_t *p1, const int16_t *p2, int len) { int32_t sum = 0; for(; len > 0; len--, p1++, p2++) sum += ((int32_t)*p1) * ((int32_t)*p2); return sum >> 16; } #endif /* ---------------------------------------------------------------------- */ void audioproc_init(struct trx_thread_state *state) { if (state->cfg.adapt.rfsquelch <= RSSI_MIN) state->audioparam.rfsquelch = 0; else if (state->cfg.adapt.rfsquelch >= RSSI_MAX) state->audioparam.rfsquelch = 255; else state->audioparam.rfsquelch = (state->cfg.adapt.rfsquelch - RSSI_MIN) * (255.0/(RSSI_MAX-RSSI_MIN)); /* init input sampling rate converter */ memset(&state->du.a.isrc, 0, sizeof(state->du.a.isrc)); state->du.a.isrc.phinc = ((1 << AUDIOSRCPHASEFRAC) * state->du.a.p.sratedspin + state->du.a.p.srateusb / 2) / state->du.a.p.srateusb; lprintf(2, "rec phase inc: 0x%05x\n", state->du.a.isrc.phinc); compute_filter(state->du.a.p.srateusb / (double)state->du.a.p.sratedspin, state->du.a.isrc.filter); /* init output sampling rate converter */ memset(&state->du.a.osrc, 0, sizeof(state->du.a.osrc)); state->du.a.osrc.phinc = ((1 << AUDIOSRCPHASEFRAC) * state->du.a.p.srateusb + state->du.a.p.sratedspout / 2) / state->du.a.p.sratedspout; lprintf(2, "play phase inc: 0x%05x\n", state->du.a.osrc.phinc); compute_filter(state->du.a.p.sratedspout / (double)state->du.a.p.srateusb, state->du.a.osrc.filter); } unsigned int audioproc_convertinput_isamples(struct trx_thread_state *state, unsigned int osamples) { return (osamples * state->du.a.isrc.phinc + (state->du.a.isrc.ph & AUDIOSRCPHASEMASK)) >> AUDIOSRCPHASEFRAC; } void audioproc_convertinput(struct trx_thread_state *state, unsigned int inum, unsigned int onum, const int16_t *ibuf, signed char *obuf) { int16_t *ib; unsigned int i; float pw; int s; /* handle overlap!! */ for (i = 0; i < inum; i++) { state->du.a.isrc.pwracc += ibuf[i] * ibuf[i]; if ((++state->du.a.isrc.pwrcnt) >= PWRINTERVAL) { pw = state->du.a.isrc.pwracc; state->du.a.isrc.pwracc = 0; state->du.a.isrc.pwrcnt = 0; pw *= (1.0 / PWRINTERVAL); if (pw < 1.6384) pw = -40; else pw = (10.0 / M_LN10) * log(pw) - 42.144; state->du.a.isrc.sigpwr = pw; } } /* handle overlap */ ib = alloca((inum + AUDIOOVERLAP) * sizeof(ib[0])); memcpy(ib, state->du.a.isrc.sample, AUDIOOVERLAP * sizeof(ib[0])); memcpy(ib + AUDIOOVERLAP, ibuf, inum * sizeof(ib[0])); memcpy(state->du.a.isrc.sample, ib + inum, AUDIOOVERLAP * sizeof(ib[0])); /* output filtering */ state->du.a.isrc.ph &= AUDIOSRCPHASEMASK; simdpreparefpu(); for (i = 0; i < onum; i++) { s = simdfir16(state->du.a.isrc.filter[AUDIOFILTERIDX(state->du.a.isrc.ph)], ib+AUDIOFILTERSAMPLE(state->du.a.isrc.ph), AUDIOFILTERLEN) >> 16; s += SIN(state->du.a.isrc.ph0) >> 1; s += SIN(state->du.a.isrc.ph1) >> 1; s >>= 8; if (s > 127) s = 127; if (s < -128) s = -128; state->du.a.isrc.abuf[state->du.a.isrc.aptr] = s; state->du.a.isrc.aptr = (state->du.a.isrc.aptr + 1) % (sizeof(state->du.a.isrc.abuf) / sizeof(state->du.a.isrc.abuf[0])); obuf[i] = s; state->du.a.isrc.ph += state->du.a.isrc.phinc; state->du.a.isrc.ph0 += state->du.a.isrc.freq0; state->du.a.isrc.ph1 += state->du.a.isrc.freq1; } simdpreparefpu(); } int audioproc_adjustinput(struct trx_thread_state *state, unsigned int usbdelay) { if (usbdelay > SNDLATENCY) { state->du.a.isrc.phinc++; state->du.a.isrc.ph += AUDIOSRCPHASEMASK >> 2; if (state->du.a.isrc.ph > AUDIOSRCPHASEMASK) state->du.a.isrc.ph = AUDIOSRCPHASEMASK; } else if (usbdelay < SNDLATENCY) { state->du.a.isrc.phinc--; state->du.a.isrc.ph -= AUDIOSRCPHASEMASK >> 2; if (state->du.a.isrc.ph > AUDIOSRCPHASEMASK) state->du.a.isrc.ph = 0; } if (state->du.a.isrc.phinc < AUDIOSRCMINPHINC) { lprintf(0, "phinc (0x%05x) out of range\n", state->du.a.isrc.phinc); state->du.a.isrc.phinc = AUDIOSRCMINPHINC; } else if (state->du.a.isrc.phinc > AUDIOSRCMAXPHINC) { lprintf(0, "phinc (0x%05x) out of range\n", state->du.a.isrc.phinc); state->du.a.isrc.phinc = AUDIOSRCMAXPHINC; } lprintf(20, "in: usbdelay %d phase increment: 0x%05x\n", usbdelay, state->du.a.isrc.phinc); return 0; } unsigned int audioproc_convertoutput(struct trx_thread_state *state, unsigned int inum, const signed char *ibuf, int16_t *obuf) { unsigned int cnt = 0; unsigned int i; float pw1, pw2; int s; int16_t *ib; if (!inum) return 0; if (!state->audioparam.audiosquelch) state->dcd = state->rssi >= state->audioparam.rfsquelch; ib = alloca((inum + AUDIOOVERLAP) * sizeof(ib[0])); memcpy(ib, state->du.a.osrc.sample, AUDIOOVERLAP * sizeof(ib[0])); for (i = 0; i < inum; i++) { s = state->du.a.osrc.abuf[state->du.a.osrc.aptr] = ibuf[i]; state->du.a.osrc.aptr = (state->du.a.osrc.aptr + 1) % (sizeof(state->du.a.osrc.abuf) / sizeof(state->du.a.osrc.abuf[0])); ib[i + AUDIOOVERLAP] = s << 8; state->du.a.osrc.pwracc1 += s * s; switch (state->du.a.osrc.pwrcnt2 & 3) { case 0: state->du.a.osrc.pwracc2 -= s; break; case 1: state->du.a.osrc.pwracc3 -= s; break; case 2: state->du.a.osrc.pwracc2 += s; break; default: state->du.a.osrc.pwracc3 += s; break; } if ((++state->du.a.osrc.pwrcnt2) >= PWRINTERVAL2) { state->du.a.osrc.pwracc4 += state->du.a.osrc.pwracc2 * state->du.a.osrc.pwracc2 + state->du.a.osrc.pwracc3 * state->du.a.osrc.pwracc3; state->du.a.osrc.pwracc2 = 0; state->du.a.osrc.pwracc3 = 0; state->du.a.osrc.pwrcnt2 = 0; } if ((++state->du.a.osrc.pwrcnt) >= PWRINTERVAL) { pw1 = state->du.a.osrc.pwracc1; pw2 = state->du.a.osrc.pwracc4; state->du.a.osrc.pwracc1 = 0; state->du.a.osrc.pwracc4 = 0; state->du.a.osrc.pwrcnt = 0; pw1 *= (1.0 / PWRINTERVAL); pw2 *= (1.0 / PWRINTERVAL / PWRINTERVAL) * PWRNOISECALIB; if (pw1 < 1.6384) pw1 = -40; else pw1 = (10.0 / M_LN10) * log(pw1) - 42.144; if (pw2 < 1.6384) pw2 = -40; else pw2 = (10.0 / M_LN10) * log(pw2) - 42.144; if (pw2 > 0) pw2 = 0; state->du.a.osrc.sigpwr = pw1; state->du.a.osrc.noisepwr = pw2; if (state->audioparam.audiosquelch) state->dcd = (pw1 > -30) && (pw2 < (pw1 / 2 - 20)); } } state->du.a.osrc.ph &= AUDIOSRCPHASEMASK; memcpy(state->du.a.osrc.sample, ib + inum, AUDIOOVERLAP * sizeof(ib[0])); simdpreparefpu(); while (state->du.a.osrc.ph < (inum << AUDIOSRCPHASEFRAC)) { obuf[cnt] = simdfir16(state->du.a.osrc.filter[AUDIOFILTERIDX(state->du.a.osrc.ph)], ib+AUDIOFILTERSAMPLE(state->du.a.osrc.ph), AUDIOFILTERLEN) >> 16; state->du.a.osrc.ph += state->du.a.osrc.phinc; cnt++; } simdpreparefpu(); #if 0 printf("audiosq %u rfsq %u rssi %u dcd %u\n", state->audioparam.audiosquelch, state->audioparam.rfsquelch, state->rssi, state->dcd); #endif if (!state->dcd) memset(obuf, 0, 2*cnt); return cnt; } int audioproc_adjustoutput(struct trx_thread_state *state, unsigned int dspdelay) { state->du.a.osrc.ph &= AUDIOSRCPHASEMASK; if (dspdelay > SNDLATENCY) { state->du.a.osrc.phinc++; state->du.a.osrc.ph += AUDIOSRCPHASEMASK >> 2; if (state->du.a.osrc.ph > AUDIOSRCPHASEMASK) state->du.a.osrc.ph = AUDIOSRCPHASEMASK; } else if (dspdelay < SNDLATENCY) { state->du.a.osrc.phinc--; state->du.a.osrc.ph -= AUDIOSRCPHASEMASK >> 2; if (state->du.a.osrc.ph > AUDIOSRCPHASEMASK) state->du.a.osrc.ph = 0; } if (state->du.a.osrc.phinc < AUDIOSRCMINPHINC) { lprintf(0, "phinc (0x%05x) out of range\n", state->du.a.osrc.phinc); state->du.a.osrc.phinc = AUDIOSRCMINPHINC; } else if (state->du.a.osrc.phinc > AUDIOSRCMAXPHINC) { lprintf(0, "phinc (0x%05x) out of range\n", state->du.a.osrc.phinc); state->du.a.osrc.phinc = AUDIOSRCMAXPHINC; } lprintf(20, "out: dspdelay %d phase increment: 0x%05x\n", dspdelay, state->du.a.osrc.phinc); return 0; } /* ---------------------------------------------------------------------- */ baycomusb-0.10.orig/trxctrl/simd.c0100644000175100017510000000500207327073544015222 0ustar abaaba/*****************************************************************************/ /* * simd.c -- SIMD (aka MMX and VIS) routines. * * Copyright (C) 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #define _GNU_SOURCE #define _REENTRANT #ifdef HAVE_CONFIG_H #include "config.h" #endif /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #include "sysdeps.h" #include "trx.h" /* ---------------------------------------------------------------------- */ #if defined(USEMMX) unsigned int simd_enabled = 0; static inline unsigned int cpucapability(void) { unsigned int a, b, c, d; asm("pushfl \n\t" "popl %0 \n\t" "movl %0,%1 \n\t" "xorl $0x00200000,%0 \n\t" "pushl %0 \n\t" "popfl \n\t" "pushfl \n\t" "popl %0 \n\t" : "=r" (a), "=r" (b)); if (a == b) return 0; asm("cpuid" : "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "0" (1)); return d; } void initsimd(int enable) { unsigned int cap = cpucapability(); simd_enabled = (enable && (cap & 0x800000)) ? 1 : 0; lprintf(3, "x86 CPU capability %08x, MMX %s%sabled\n", cap, enable ? "" : "manually ", simd_enabled ? "en" : "dis"); } #elif defined(USEVIS) unsigned int simd_enabled = 0; void initsimd(int enable) { simd_enabled = !!enable; lprintf(3, "VIS %sabled\n", simd_enabled ? "en" : "dis"); } #endif baycomusb-0.10.orig/trxctrl/costab.c0100644000175100017510000001034107340477572015547 0ustar abaaba#include #include "trx.h" /* * cosine table */ const int16_t costab[512] = { 32767, 32764, 32757, 32744, 32727, 32705, 32678, 32646, 32609, 32567, 32520, 32468, 32412, 32350, 32284, 32213, 32137, 32056, 31970, 31880, 31785, 31684, 31580, 31470, 31356, 31236, 31113, 30984, 30851, 30713, 30571, 30424, 30272, 30116, 29955, 29790, 29621, 29446, 29268, 29085, 28897, 28706, 28510, 28309, 28105, 27896, 27683, 27466, 27244, 27019, 26789, 26556, 26318, 26077, 25831, 25582, 25329, 25072, 24811, 24546, 24278, 24006, 23731, 23452, 23169, 22883, 22594, 22301, 22004, 21705, 21402, 21096, 20787, 20474, 20159, 19840, 19519, 19194, 18867, 18537, 18204, 17868, 17530, 17189, 16845, 16499, 16150, 15799, 15446, 15090, 14732, 14372, 14009, 13645, 13278, 12909, 12539, 12166, 11792, 11416, 11038, 10659, 10278, 9895, 9511, 9126, 8739, 8351, 7961, 7571, 7179, 6786, 6392, 5997, 5601, 5205, 4807, 4409, 4011, 3611, 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, 0, -402, -804, -1206, -1607, -2009, -2410, -2811, -3211, -3611, -4011, -4409, -4807, -5205, -5601, -5997, -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, -9511, -9895, -10278, -10659, -11038, -11416, -11792, -12166, -12539, -12909, -13278, -13645, -14009, -14372, -14732, -15090, -15446, -15799, -16150, -16499, -16845, -17189, -17530, -17868, -18204, -18537, -18867, -19194, -19519, -19840, -20159, -20474, -20787, -21096, -21402, -21705, -22004, -22301, -22594, -22883, -23169, -23452, -23731, -24006, -24278, -24546, -24811, -25072, -25329, -25582, -25831, -26077, -26318, -26556, -26789, -27019, -27244, -27466, -27683, -27896, -28105, -28309, -28510, -28706, -28897, -29085, -29268, -29446, -29621, -29790, -29955, -30116, -30272, -30424, -30571, -30713, -30851, -30984, -31113, -31236, -31356, -31470, -31580, -31684, -31785, -31880, -31970, -32056, -32137, -32213, -32284, -32350, -32412, -32468, -32520, -32567, -32609, -32646, -32678, -32705, -32727, -32744, -32757, -32764, -32767, -32764, -32757, -32744, -32727, -32705, -32678, -32646, -32609, -32567, -32520, -32468, -32412, -32350, -32284, -32213, -32137, -32056, -31970, -31880, -31785, -31684, -31580, -31470, -31356, -31236, -31113, -30984, -30851, -30713, -30571, -30424, -30272, -30116, -29955, -29790, -29621, -29446, -29268, -29085, -28897, -28706, -28510, -28309, -28105, -27896, -27683, -27466, -27244, -27019, -26789, -26556, -26318, -26077, -25831, -25582, -25329, -25072, -24811, -24546, -24278, -24006, -23731, -23452, -23169, -22883, -22594, -22301, -22004, -21705, -21402, -21096, -20787, -20474, -20159, -19840, -19519, -19194, -18867, -18537, -18204, -17868, -17530, -17189, -16845, -16499, -16150, -15799, -15446, -15090, -14732, -14372, -14009, -13645, -13278, -12909, -12539, -12166, -11792, -11416, -11038, -10659, -10278, -9895, -9511, -9126, -8739, -8351, -7961, -7571, -7179, -6786, -6392, -5997, -5601, -5205, -4807, -4409, -4011, -3611, -3211, -2811, -2410, -2009, -1607, -1206, -804, -402, 0, 402, 804, 1206, 1607, 2009, 2410, 2811, 3211, 3611, 4011, 4409, 4807, 5205, 5601, 5997, 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, 9511, 9895, 10278, 10659, 11038, 11416, 11792, 12166, 12539, 12909, 13278, 13645, 14009, 14372, 14732, 15090, 15446, 15799, 16150, 16499, 16845, 17189, 17530, 17868, 18204, 18537, 18867, 19194, 19519, 19840, 20159, 20474, 20787, 21096, 21402, 21705, 22004, 22301, 22594, 22883, 23169, 23452, 23731, 24006, 24278, 24546, 24811, 25072, 25329, 25582, 25831, 26077, 26318, 26556, 26789, 27019, 27244, 27466, 27683, 27896, 28105, 28309, 28510, 28706, 28897, 29085, 29268, 29446, 29621, 29790, 29955, 30116, 30272, 30424, 30571, 30713, 30851, 30984, 31113, 31236, 31356, 31470, 31580, 31684, 31785, 31880, 31970, 32056, 32137, 32213, 32284, 32350, 32412, 32468, 32520, 32567, 32609, 32646, 32678, 32705, 32727, 32744, 32757, 32764 }; baycomusb-0.10.orig/trxctrl/mainunix.c0100644000175100017510000010756007340456130016121 0ustar abaaba/*****************************************************************************/ /* * mainunix.c -- Transceiver control UNIX stuff. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _REENTRANT #include "trx.h" #define _USE_BSD #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #else #include "getopt.h" #endif #ifdef HAVE_SYSLOG_H #include #endif #ifdef HAVE_LINUX_IF_H #include #endif #ifdef HAVE_LINUX_SOCKIOS_H #include #endif #ifdef HAVE_LINUX_IF_ETHER_H #include #endif #if defined(HAVE_ARPA_INET_H) && !defined(WIN32) #include #endif #ifdef HAVE_NET_IF_ARP_H #include #endif #ifdef HAVE_NETAX25_AX25_H #include #elif defined(HAVE_LINUX_AX25_H) #include #endif #ifdef HAVE_NET_ROUTE_H #include #endif #include #include #include "list.h" #include "baycom_usb.h" /* --------------------------------------------------------------------- */ struct orbfdlist { struct list_head list; GIOPConnection *conn; struct pollfd *pfd; }; /* --------------------------------------------------------------------- */ static int devices_fd = -1; static LIST_HEAD(devices_list); static pthread_mutex_t orbit_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t devlist_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t devlist_cond = PTHREAD_COND_INITIALIZER; static LIST_HEAD(orb_fds); static int quit = 0; static int sock_fd = -1; /* --------------------------------------------------------------------- */ void acquire_orbit_mutex(void) { pthread_mutex_lock(&orbit_mutex); } void release_orbit_mutex(void) { pthread_mutex_unlock(&orbit_mutex); } void acquire_trxdata_mutex(struct trx_thread_state *state) { pthread_mutex_lock(&state->mutex); } void release_trxdata_mutex(struct trx_thread_state *state) { pthread_mutex_unlock(&state->mutex); } int check_quit(void) { return quit; } /* --------------------------------------------------------------------- */ #if 0 static int findinterface(struct trx_thread_state *state) { struct ifreq ifr; int fd; union { struct baycomusb_device bdev; char buf[1024]; } bd; FILE *f; char *cp; if (!(f = fopen("/proc/net/dev", "r"))) { lprintf(1, "cannot open /proc/net/dev\n"); return -1; } if ((fd = socket(PF_AX25, SOCK_SEQPACKET, 0)) < 0) { lprintf(0, "Cannot create socket: %s (%u) \n", strerror(errno), errno); } for (;;) { if (!fgets(bd.buf, sizeof(bd.buf), f)) { lprintf(1, "Cannot find network interface for %03d:%03d\n", state->busnr, state->devnr); fclose(f); close(fd); return -1; } if (!(cp = strchr(bd.buf, ':'))) continue; *cp = 0; cp = bd.buf; while (*cp == ' ') cp++; strncpy(ifr.ifr_name, cp, sizeof(ifr.ifr_name)); if (ioctl(fd, SIOCGIFHWADDR, &ifr)) continue; if (ifr.ifr_addr.sa_family != AF_AX25) continue; ifr.ifr_data = (void *)&bd.bdev; bd.bdev.cmd = BAYCOMUSB_GETDEVICE; if (ioctl(fd, SIOCDEVPRIVATE, &ifr)) continue; printf("Baycomusb netdev: %s usbdev: %03d:%03d\n", ifr.ifr_name, bd.bdev.busnr, bd.bdev.devnr); if (bd.bdev.busnr != state->busnr || bd.bdev.devnr != state->devnr) continue; break; } fclose(f); close(fd); if (strcmp(state->serial, bd.bdev.serial)) lprintf(1, "USB device %03d:%03d: serial numbers %s / %s do not match!\n", state->busnr, state->devnr, state->serial, bd.bdev.serial); state->bitrate = bd.bdev.bitrate; strncpy(state->ifname, ifr.ifr_name, sizeof(state->ifname)); return 0; } #endif /* --------------------------------------------------------------------- */ int reopen_usbdev(struct trx_thread_state *state) { struct timespec tm; struct timeval tv; int r; if (state->usbdev) usb_close(state->usbdev); state->usbdev = NULL; pthread_mutex_lock(&devlist_mutex); state->busnr = state->devnr = -1; gettimeofday(&tv, NULL); tm.tv_sec = tv.tv_sec + 60; tm.tv_nsec = tv.tv_usec * 1000; for (;;) { if ((r = pthread_cond_timedwait(&devlist_cond, &devlist_mutex, &tm)) && r != EINTR) { lprintf(1, "Timeout reopening USB device %s: pthread_cond_wait error %s (%d)\n", state->serial, strerror(r), r); pthread_mutex_unlock(&devlist_mutex); return -1; } if (check_quit()) { pthread_mutex_unlock(&devlist_mutex); return -1; } if (state->busnr != -1 && state->devnr != -1) break; } pthread_mutex_unlock(&devlist_mutex); if (!(state->usbdev = usb_open_bynumber(state->busnr, state->devnr, BAYCOMUSB_VENDORID, -1))) { lprintf(1, "Cannot open USB device %03d:%03d\n", state->busnr, state->devnr); return -1; } lprintf(10, "=== THREADCONTINUE: %03d:%03d\n", state->busnr, state->devnr); return 0; } /* --------------------------------------------------------------------- */ static void *thread_start(void *arg) { struct trx_thread_state *state = arg; struct trx_thread_state *state2; struct list_head *list; int i; lprintf(10, ">>> THREADSTART: %03d:%03d\n", state->busnr, state->devnr); /* open communications to device */ pthread_mutex_init(&state->mutex, NULL); state->netif_fd = -1; /* get serial number from device */ if (!(state->usbdev = usb_open_bynumber(state->busnr, state->devnr, BAYCOMUSB_VENDORID, -1))) { lprintf(1, "Cannot open USB device %03d:%03d\n", state->busnr, state->devnr); goto ret; } i = adapter_init_getserial(state); if (i < 0) { if (i == -2) lprintf(1, "Error loading USB device %03d:%03d\n", state->busnr, state->devnr); goto ret; } lprintf(2, "USB device %03d:%03d serial %s\n", state->busnr, state->devnr, state->serial); pthread_mutex_lock(&devlist_mutex); for (list = devices_list.next; list != &devices_list; list = list->next) { state2 = list_entry(list, struct trx_thread_state, device_list); if (state2 != state && !strcmp(state2->serial, state->serial)) { state2->busnr = state->busnr; state2->devnr = state->devnr; state2->mode = state->mode; list_del(&state->device_list); INIT_LIST_HEAD(&state->device_list); pthread_mutex_unlock(&devlist_mutex); lprintf(2, "Thread for USB device %03d:%03d serial %s already running\n", state->busnr, state->devnr, state->serial); pthread_cond_broadcast(&devlist_cond); goto ret; } } pthread_mutex_unlock(&devlist_mutex); state->flags = FLG_RELOADMODEM | FLG_MODEMERROR | FLG_T7FERROR; trx_thread(state); ret: pthread_mutex_destroy(&state->mutex); if (state->usbdev) usb_close(state->usbdev); netif_close(state); pthread_mutex_lock(&devlist_mutex); list_del(&state->device_list); pthread_mutex_unlock(&devlist_mutex); lprintf(10, "<<< THREADSTOP: %s\n", state->serial); free(state); return NULL; } /* --------------------------------------------------------------------- */ static void check_new_uninited_modems(void) { char buf[16384]; char *start, *end, *lineend, *cp; int ret; unsigned int devnum = 0, busnum = 0, vendorid, productid; struct list_head *list; struct trx_thread_state *state; pthread_attr_t attr; pthread_t thr; /* now scan devices file */ if (lseek(devices_fd, 0, SEEK_SET) == (off_t)-1) lprintf(0, "lseek: %s (%d)\n", strerror(errno), errno); lprintf(10, "read\n"); ret = read(devices_fd, buf, sizeof(buf)-1); lprintf(10, "end read: %d\n", ret); if (ret == -1) lprintf(0, "read: %s (%d)\n", strerror(errno), errno); end = buf + ret; *end = 0; start = buf; while (start < end) { lineend = strchr(start, '\n'); if (!lineend) break; *lineend = 0; switch (start[0]) { case 'T': /* topology line */ if ((cp = strstr(start, "Dev#="))) { devnum = strtoul(cp + 5, NULL, 0); } else devnum = 0; if ((cp = strstr(start, "Bus="))) { busnum = strtoul(cp + 4, NULL, 0); } else busnum = 0; break; case 'P': if ((cp = strstr(start, "Vendor="))) { vendorid = strtoul(cp + 7, NULL, 16); } else vendorid = 0xffff; if ((cp = strstr(start, "ProdID="))) { productid = strtoul(cp + 7, NULL, 16); } else productid = 0xffff; lprintf(5, "Device %u Bus %u Vendor ID %04x Product ID %04x\n", devnum, busnum, vendorid, productid); if (vendorid != BAYCOMUSB_VENDORID || (productid != BAYCOMUSB_PRODUCTID_EMPTY && productid != BAYCOMUSB_PRODUCTID_FPGALD && productid != BAYCOMUSB_PRODUCTID_MODEM && productid != BAYCOMUSB_PRODUCTID_AUDIO)) break; /* search device; mark and continue if found */ pthread_mutex_lock(&devlist_mutex); for (list = devices_list.next; list != &devices_list; list = list->next) { state = list_entry(list, struct trx_thread_state, device_list); if (state->devnr != devnum || state->busnr != busnum) continue; goto devalreadyfound; } /* not found, make new device and create thread */ state = malloc(sizeof(struct trx_thread_state)); if (!state) goto err; memset(state, 0, sizeof(struct trx_thread_state)); state->devnr = devnum; state->busnr = busnum; /* start thread */ if (pthread_attr_init(&attr)) goto err; if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) goto err; if (pthread_create(&thr, &attr, thread_start, state)) goto err; pthread_attr_destroy(&attr); list_add(&state->device_list, &devices_list); devalreadyfound: pthread_mutex_unlock(&devlist_mutex); break; err: if (state) free(state); pthread_mutex_unlock(&devlist_mutex); break; default: break; } #if 0 printf("line: %s\n", start); #endif start = lineend + 1; } } /* --------------------------------------------------------------------- */ static void orb_add_connection(GIOPConnection *cnx) { struct orbfdlist *ofd; if (!(cnx->user_data = ofd = malloc(sizeof(struct orbfdlist)))) return; ofd->conn = cnx; ofd->pfd = NULL; list_add(&ofd->list, &orb_fds); } static void orb_remove_connection(GIOPConnection *cnx) { struct orbfdlist *ofd = cnx->user_data; if (!ofd) return; ofd->conn = NULL; } #define MAXPFD 64 static void mainloop(void) { struct list_head *list; struct orbfdlist *ofd; struct pollfd *pfd; struct pollfd pfds[MAXPFD]; unsigned int npfd; int i; while (!quit) { npfd = 1; pfds[0].fd = devices_fd; pfds[0].events = POLLIN; acquire_orbit_mutex(); for (list = orb_fds.next; list != &orb_fds;) { ofd = list_entry(list, struct orbfdlist, list); list = list->next; if (!ofd->conn) { list_del(&ofd->list); free(ofd); continue; } if (npfd >= MAXPFD) { ofd->pfd = NULL; continue; } ofd->pfd = &pfds[npfd++]; ofd->pfd->fd = GIOP_CONNECTION_GET_FD(ofd->conn); ofd->pfd->events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL; } release_orbit_mutex(); i = poll(pfds, npfd, -1); if (i == -1 && errno != EINTR) { lprintf(0, "poll: %s (%u)\n", strerror(errno), errno); exit(1); } if (pfds[0].revents & POLLIN) check_new_uninited_modems(); acquire_orbit_mutex(); for (list = orb_fds.next; list != &orb_fds; list = list->next) { ofd = list_entry(list, struct orbfdlist, list); if (!(pfd = ofd->pfd)) continue; #if 0 printf("fd %d events 0x%x revents 0x%x\n", pfd->fd, pfd->events, pfd->revents); #endif if (pfd->revents & (POLLERR | POLLHUP | POLLNVAL) && ofd->conn) { giop_main_handle_connection_exception(ofd->conn); } if (pfd->revents & (POLLIN | POLLPRI) && ofd->conn) { giop_main_handle_connection(ofd->conn); } } release_orbit_mutex(); } } /* --------------------------------------------------------------------- */ static int parsehw(ax25_address *hwaddr, const char *cp) { const char *cp1; unsigned int i, j; if (!cp || !*cp) return 0; memset(hwaddr->ax25_call, (' ' << 1), 6); cp1 = strchr(cp, '-'); if (cp1) { i = cp1 - cp; j = strtoul(cp1 + 1, NULL, 0); hwaddr->ax25_call[6] = (j & 15) << 1; } else { i = strlen(cp); hwaddr->ax25_call[6] = 0; } if (i > 6) i = 6; for (j = 0; j < i; j++) hwaddr->ax25_call[j] = toupper(cp[j]) << 1; return 1; } static int parsehwpath(struct full_sockaddr_ax25 *fsa, const char *cp) { char tmp[128]; char *cp2, *ptrptr; if (!fsa || !cp || !*cp) return 0; fsa->fsa_ax25.sax25_family = AF_AX25; fsa->fsa_ax25.sax25_ndigis = 0; strncpy(tmp, cp, sizeof(tmp)); cp2 = strtok_r(tmp, " \t\n,", &ptrptr); if (!parsehw(&fsa->fsa_ax25.sax25_call, cp2)) return 0; while ((cp2 = strtok_r(NULL, " \t\n,", &ptrptr))) { if (fsa->fsa_ax25.sax25_ndigis >= AX25_MAX_DIGIS) return 1; if (!parsehw(&fsa->fsa_digipeater[fsa->fsa_ax25.sax25_ndigis], cp2)) return 0; fsa->fsa_ax25.sax25_ndigis++; } return 1; } #define PARAM_TXDELAY 1 #define PARAM_PERSIST 2 #define PARAM_SLOTTIME 3 #define PARAM_TXTAIL 4 #define PARAM_FULLDUP 5 static int set_intf(struct trx_thread_state *state) { struct sockaddr_ax25 sax25; struct sockaddr_in sin; struct ifreq ifr; struct arpreq arpreq; struct rtentry rtentry; struct full_sockaddr_ax25 gwpath; struct ax25_routes_struct ax25_route; struct ax25_route_opt_struct ax25_opt; int fd; if (state->mode != MODE_FSK && state->mode != MODE_EXTERNAL && state->mode != MODE_AFSK) return 0; strncpy(ifr.ifr_name, state->ifname, sizeof(ifr.ifr_name)); #ifdef HAVE_IFRNEWNAME if (state->cfg.intf.ifname[0] && strcmp(state->cfg.intf.ifname, state->ifname)) { strncpy(ifr.ifr_newname, state->cfg.intf.ifname, sizeof(ifr.ifr_newname)); if (ioctl(sock_fd, SIOCSIFNAME, &ifr) == -1) { lprintf(1, "Cannot rename interface (SIOCSIFNAME: %s (%u))\n", strerror(errno), errno); netif_close(state); if (netif_open(state)) return -1; } else { strncpy(state->ifname, ifr.ifr_newname, sizeof(state->ifname)); strncpy(ifr.ifr_name, state->ifname, sizeof(ifr.ifr_name)); } } #endif if (ioctl(sock_fd, SIOCGIFINDEX, &ifr) == -1) lprintf(1, "ioctl: SIOCGIFINDEX failed: %s (%u)\n", strerror(errno), errno); ifr.ifr_mtu = 256; if (ioctl(sock_fd, SIOCSIFMTU, &ifr) == -1) lprintf(1, "ioctl: SIOCSIFMTU failed: %s (%u)\n", strerror(errno), errno); if (parsehw(&sax25.sax25_call, state->cfg.intf.hwaddr)) { sax25.sax25_family = AF_AX25; sax25.sax25_ndigis = 0; memcpy(&ifr.ifr_hwaddr, &sax25, sizeof(ifr.ifr_hwaddr)); if (ioctl(sock_fd, SIOCSIFHWADDR, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFHWADDR failed: %s (%u)\n", strerror(errno), errno); } sin.sin_addr.s_addr = (state->cfg.intf.ipaddr[3] << 24) | (state->cfg.intf.ipaddr[2] << 16) | (state->cfg.intf.ipaddr[1] << 8) | state->cfg.intf.ipaddr[0]; if (sin.sin_addr.s_addr != INADDR_ANY && sin.sin_addr.s_addr != INADDR_NONE) { sin.sin_family = AF_INET; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(sock_fd, SIOCSIFADDR, &ifr) == -1) lprintf(1, "ioctl: SIOCSIFADDR failed: %s (%u)\n", strerror(errno), errno); } sin.sin_addr.s_addr = (state->cfg.intf.netmask[3] << 24) | (state->cfg.intf.netmask[2] << 16) | (state->cfg.intf.netmask[1] << 8) | state->cfg.intf.netmask[0]; if (sin.sin_addr.s_addr != INADDR_ANY && sin.sin_addr.s_addr != INADDR_NONE) { sin.sin_family = AF_INET; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(sock_fd, SIOCSIFNETMASK, &ifr) == -1) lprintf(1, "ioctl: SIOCSIFNETMASK failed: %s (%u)\n", strerror(errno), errno); } sin.sin_addr.s_addr = (state->cfg.intf.broadcast[3] << 24) | (state->cfg.intf.broadcast[2] << 16) | (state->cfg.intf.broadcast[1] << 8) | state->cfg.intf.broadcast[0]; if (sin.sin_addr.s_addr != INADDR_ANY && sin.sin_addr.s_addr != INADDR_NONE) { sin.sin_family = AF_INET; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(sock_fd, SIOCSIFBRDADDR, &ifr) == -1) lprintf(1, "ioctl: SIOCSIFBRDADDR failed: %s (%u)\n", strerror(errno), errno); } if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { if (ioctl(sock_fd, SIOCGIFFLAGS, &ifr) == -1) lprintf(0, "ioctl: SIOCGIFFLAGS failed: %s (%u)\n", strerror(errno), errno); else { ifr.ifr_flags &= ~IFF_NOARP; ifr.ifr_flags |= IFF_UP | IFF_RUNNING; if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFFLAGS failed: %s (%u)\n", strerror(errno), errno); } } /* set gateway ARP etc */ if (!state->cfg.intf.gwipaddr[0] && !state->cfg.intf.gwipaddr[1] && !state->cfg.intf.gwipaddr[2] && !state->cfg.intf.gwipaddr[3]) return 0; if (!parsehwpath(&gwpath, state->cfg.intf.gwhwaddr)) return 0; /* get interface address */ if (ioctl(sock_fd, SIOCGIFHWADDR, &ifr) == -1) { lprintf(0, "ioctl: SIOCSIFHWADDR failed: %s (%u)\n", strerror(errno), errno); return 0; } memcpy(&sax25, &ifr.ifr_hwaddr, sizeof(sax25)); if (sax25.sax25_family != AF_AX25) { lprintf(0, "ioctl: SIOCSIFHWADDR invalid address family: %u\n", sax25.sax25_family); return 0; } sin.sin_addr.s_addr = (state->cfg.intf.gwipaddr[3] << 24) | (state->cfg.intf.gwipaddr[2] << 16) | (state->cfg.intf.gwipaddr[1] << 8) | state->cfg.intf.gwipaddr[0]; if (sin.sin_addr.s_addr == INADDR_ANY || sin.sin_addr.s_addr == INADDR_NONE) return 0; sin.sin_family = AF_INET; arpreq.arp_flags = ATF_COM | ATF_PERM; ((struct sockaddr_in *)&arpreq.arp_pa)->sin_family = AF_INET; ((struct sockaddr_in *)&arpreq.arp_pa)->sin_port = 0; ((struct sockaddr_in *)&arpreq.arp_pa)->sin_addr = sin.sin_addr; memcpy(&arpreq.arp_ha, &gwpath, sizeof(arpreq.arp_ha)); ((struct sockaddr_ax25 *)&arpreq.arp_ha)->sax25_ndigis = 0; strncpy(arpreq.arp_dev, state->ifname, sizeof(arpreq.arp_dev)); if (ioctl(sock_fd, SIOCSARP, &arpreq)) lprintf(0, "ioctl: SIOCSARP failed: %s (%u)\n", strerror(errno), errno); if ((fd = socket(AF_AX25, SOCK_SEQPACKET, 0)) < 0) { lprintf(0, "socket: AF_AX25,SOCK_SEQPACKET failed: %s (%u)\n", strerror(errno), errno); return 0; } ax25_route.port_addr = sax25.sax25_call; ax25_route.dest_addr = gwpath.fsa_ax25.sax25_call; ax25_route.digi_count = gwpath.fsa_ax25.sax25_ndigis; memcpy(&ax25_route.digi_addr, &gwpath.fsa_digipeater, sizeof(ax25_route.digi_addr)); if (ioctl(fd, SIOCADDRT, &ax25_route) != 0) lprintf(0, "ioctl: SIOCADDRT (ax25) failed: %s (%u)\n", strerror(errno), errno); ax25_opt.port_addr = sax25.sax25_call; ax25_opt.dest_addr = gwpath.fsa_ax25.sax25_call; ax25_opt.cmd = AX25_SET_RT_IPMODE; ax25_opt.arg = state->cfg.intf.gwipmode; if (ioctl(fd, SIOCAX25OPTRT, &ax25_opt) != 0) lprintf(0, "ioctl: SIOCAX25OPTRT failed: %s (%u)\n", strerror(errno), errno); close(fd); memset(&rtentry, 0, sizeof(rtentry)); rtentry.rt_flags = RTF_UP | RTF_GATEWAY; ((struct sockaddr_in *)&rtentry.rt_dst)->sin_family = AF_INET; ((struct sockaddr_in *)&rtentry.rt_dst)->sin_port = 0; ((struct sockaddr_in *)&rtentry.rt_dst)->sin_addr = sin.sin_addr; ((struct sockaddr_in *)&rtentry.rt_gateway)->sin_family = AF_INET; ((struct sockaddr_in *)&rtentry.rt_gateway)->sin_port = 0; ((struct sockaddr_in *)&rtentry.rt_gateway)->sin_addr = sin.sin_addr; sin.sin_addr.s_addr = (state->cfg.intf.gwnetmask[3] << 24) | (state->cfg.intf.gwnetmask[2] << 16) | (state->cfg.intf.gwnetmask[1] << 8) | state->cfg.intf.gwnetmask[0]; if (sin.sin_addr.s_addr != INADDR_ANY && sin.sin_addr.s_addr != INADDR_NONE) { ((struct sockaddr_in *)&rtentry.rt_genmask)->sin_family = AF_INET; ((struct sockaddr_in *)&rtentry.rt_genmask)->sin_port = 0; ((struct sockaddr_in *)&rtentry.rt_genmask)->sin_addr = sin.sin_addr; ((struct sockaddr_in *)&rtentry.rt_dst)->sin_addr.s_addr &= sin.sin_addr.s_addr; } else rtentry.rt_flags |= RTF_HOST; rtentry.rt_dev = state->ifname; if (ioctl(sock_fd, SIOCADDRT, &rtentry) != 0) lprintf(0, "ioctl: SIOCADDRT (ipv4) failed: %s (%u)\n", strerror(errno), errno); return 0; } static void set_chacc(struct trx_thread_state *state) { struct sockaddr sa; unsigned char buf[2]; if (state->mode != MODE_FSK && state->mode != MODE_EXTERNAL && state->mode != MODE_AFSK) return; strncpy(sa.sa_data, state->ifname, sizeof(sa.sa_data)); sa.sa_family = AF_PACKET; buf[0] = PARAM_TXDELAY; buf[1] = state->cfg.chacc.txdelay / 10; if (sendto(sock_fd, buf, 2, 0, &sa, sizeof(struct sockaddr)) == -1) lprintf(1, "sendto failed: %s (%u)\n", strerror(errno), errno); buf[0] = PARAM_PERSIST; buf[1] = state->cfg.chacc.ppersistence; if (sendto(sock_fd, buf, 2, 0, &sa, sizeof(sa)) == -1) lprintf(1, "sendto failed: %s (%u)\n", strerror(errno), errno); buf[0] = PARAM_SLOTTIME; buf[1] = state->cfg.chacc.slottime / 10; if (sendto(sock_fd, buf, 2, 0, &sa, sizeof(sa)) == -1) lprintf(1, "sendto failed: %s (%u)\n", strerror(errno), errno); buf[0] = PARAM_TXTAIL; buf[1] = state->cfg.chacc.txtail / 10; if (sendto(sock_fd, buf, 2, 0, &sa, sizeof(sa)) == -1) lprintf(1, "sendto failed: %s (%u)\n", strerror(errno), errno); buf[0] = PARAM_FULLDUP; buf[1] = state->cfg.chacc.fullduplex; if (sendto(sock_fd, buf, 2, 0, &sa, sizeof(sa)) == -1) lprintf(1, "sendto failed: %s (%u)\n", strerror(errno), errno); } /* --------------------------------------------------------------------- */ #define SCRIPTNAME "/etc/ax25/baycomusb.ifchange" static void runscript(struct trx_thread_state *state, const char *cmd) { pid_t pid; char home[128]; char ifname[64]; char hwaddr[64]; char ipaddr[64]; char netmask[64]; char broadcast[64]; char gwhwaddr[192]; char gwipaddr[64]; char gwnetmask[64]; char gwipmode[64]; char *cp; char *const argv[] = { SCRIPTNAME, cmd, NULL }; char *const envp[] = { "TERM=linux", home, ifname, hwaddr, ipaddr, netmask, broadcast, gwhwaddr, gwipaddr, gwnetmask, gwipmode, NULL }; return; lprintf(4, "Running Script: %s\n", cmd); pid = fork(); if (pid) { if (pid != -1) return; lprintf(1, "fork failed: %s (%u)\n", strerror(errno), errno); return; } cp = getenv("HOME"); snprintf(home, sizeof(home), "HOME=%s", cp ? cp : "/"); snprintf(ifname, sizeof(ifname), "IFNAME=%s", state->ifname); snprintf(hwaddr, sizeof(hwaddr), "HWADDR=%s", state->cfg.intf.hwaddr); snprintf(ipaddr, sizeof(ipaddr), "IPADDR=%u.%u.%u.%u", state->cfg.intf.ipaddr[0], state->cfg.intf.ipaddr[1], state->cfg.intf.ipaddr[2], state->cfg.intf.ipaddr[3]); snprintf(netmask, sizeof(netmask), "NETMASK=%u.%u.%u.%u", state->cfg.intf.netmask[0], state->cfg.intf.netmask[1], state->cfg.intf.netmask[2], state->cfg.intf.netmask[3]); snprintf(broadcast, sizeof(broadcast), "BROADCAST=%u.%u.%u.%u", state->cfg.intf.broadcast[0], state->cfg.intf.broadcast[1], state->cfg.intf.broadcast[2], state->cfg.intf.broadcast[3]); snprintf(gwhwaddr, sizeof(gwhwaddr), "GWHWADDR=%s", state->cfg.intf.gwhwaddr); snprintf(gwipaddr, sizeof(gwipaddr), "GWIPADDR=%u.%u.%u.%u", state->cfg.intf.gwipaddr[0], state->cfg.intf.gwipaddr[1], state->cfg.intf.gwipaddr[2], state->cfg.intf.gwipaddr[3]); snprintf(gwnetmask, sizeof(gwnetmask), "GWNETMASK=%u.%u.%u.%u", state->cfg.intf.gwnetmask[0], state->cfg.intf.gwnetmask[1], state->cfg.intf.gwnetmask[2], state->cfg.intf.gwnetmask[3]); snprintf(gwipmode, sizeof(gwipmode), "GWIPMODE=%c", state->cfg.intf.gwipmode); execve(SCRIPTNAME, argv, envp); lprintf(4, "execve("SCRIPTNAME") failed: %s (%u)\n", strerror(errno), errno); } void netif_close(struct trx_thread_state *state) { if (state->netif_fd != -1) close(state->netif_fd); state->netif_fd = -1; runscript(state, "down"); } int netif_open(struct trx_thread_state *state) { struct baycomusb_startnetdev stn; unsigned char br[6]; int r; if (state->netif_fd != -1) close(state->netif_fd); state->netif_fd = -1; if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { r = usb_control_msg(state->usbdev, 0xc0, 0xd1, 0, 0, 6, br, 100); if (r != 6) { lprintf(1, "Error while reading adapter bitrate\n"); return -1; } state->bitratetx = br[0] | (br[1] << 8) | (br[2] << 16); state->bitraterx = br[3] | (br[4] << 8) | (br[5] << 16); state->txdmul = (state->bitratetx + 799) / 800; lprintf(5, "Adapter %s bitrate %u/%u\n", state->serial, state->bitraterx, state->bitratetx); } else state->bitraterx = state->bitratetx = state->txdmul = 0; if ((state->netif_fd = open(NETIFMUXDEV, O_RDWR)) == -1) { lprintf(1, "Cannot open " NETIFMUXDEV "\n"); return -1; } stn.busnr = state->busnr; stn.devnr = state->devnr; strncpy(stn.ifname, state->cfg.intf.ifname, sizeof(stn.ifname)); if (!stn.ifname[0]) strncpy(stn.ifname, "bcu0", sizeof(stn.ifname)); if (ioctl(state->netif_fd, BAYCOMUSB_STARTNETDEV, &stn)) { lprintf(1, "ioctl: BAYCOMUSB_STARTNETDEV: error %s (%d)\n", strerror(errno), errno); close(state->netif_fd); state->netif_fd = -1; return -1; } strncpy(state->ifname, stn.ifname, sizeof(state->ifname)); if (set_intf(state)) return -1; runscript(state, "up"); return 0; } /* --------------------------------------------------------------------- */ #if 0 static int bcusbioctl(struct trx_thread_state *ctrl, int cmd, void *data) { struct ifreq ifr; if (!ctrl) return -1; strncpy(ifr.ifr_name, ctrl->ifname, sizeof(ifr.ifr_name)); ifr.ifr_data = data; *((int *)data) = cmd; return ioctl(sock_fd, SIOCDEVPRIVATE, &ifr); } #else static int bcusbioctl(struct trx_thread_state *ctrl, int cmd, void *data) { if (!ctrl) return -1; return ioctl(ctrl->netif_fd, cmd, data); } #endif static int periodic(struct trx_thread_state *state) { struct baycomusb_status b; struct baycomusb_receiveuart ruart; struct baycomusb_transmituart tuart; struct baycomusb_forceptt bforceptt; struct baycomusb_modemdisc bmdisc; struct baycomusb_t7fcontrol bt7f; struct baycomusb_setleds bleds; if (bcusbioctl(state, BAYCOMUSB_GETSTATUS, &b)) return -1; state->ptt = b.ptt; state->dcd = b.dcd; state->rssi = b.rssi; if (b.uartchars) { if (!bcusbioctl(state, BAYCOMUSB_RECEIVEUART, &ruart)) addrxfifo(state, ruart.buffer, ruart.len); } if (state->tfifo.rd != state->tfifo.wr) { tuart.txchar = state->tfifo.buf[state->tfifo.rd]; if (!bcusbioctl(state, BAYCOMUSB_TRANSMITUART, &tuart)) { state->tfifo.rd = (state->tfifo.rd + 1) % sizeof(state->tfifo.buf); } } if (state->flags & FLG_CLRPTT) { state->flags &= ~FLG_CLRPTT; bforceptt.ptt = 0; goto setptt; } if (state->flags & FLG_SETPTT && !(state->flags & FLG_INHIBITSETPTT)) { state->flags &= ~FLG_SETPTT; bforceptt.ptt = (state->flags & FLG_MANUALPTT) ? 1 : 0; setptt: if (bcusbioctl(state, BAYCOMUSB_FORCEPTT, &bforceptt)) lprintf(1, "USB device %03d:%03d: failed to set ptt\n", state->busnr, state->devnr); } if (state->flags & FLG_RECONFINTF) { state->flags &= ~FLG_RECONFINTF; if (set_intf(state)) return -1; } if (state->flags & FLG_RECONFCHACC) { state->flags &= ~FLG_RECONFCHACC; set_chacc(state); } if (state->flags & (FLG_SETMDISCDIR | FLG_SETMDISCOUT)) { state->flags &= ~(FLG_SETMDISCDIR | FLG_SETMDISCOUT); bmdisc.setdirection = state->cfg.mdisc.direction; bmdisc.setoutput = state->cfg.mdisc.output; /* enable RxC, TxC or TxD outputs if special output mode is selected */ if (state->mode == MODE_FSK) { if (state->cfg.mdisc.rxc) bmdisc.setdirection &= ~(1 << 0); if (state->cfg.mdisc.txc) bmdisc.setdirection &= ~(1 << 1); if (state->cfg.mdisc.txd) bmdisc.setdirection &= ~(1 << 3); } if (bcusbioctl(state, BAYCOMUSB_MODEMDISC, &bmdisc)) lprintf(1, "USB device %03d:%03d: failed to set modem disconnect port\n", state->busnr, state->devnr); } if (state->flags & FLG_SETT7FPORT) { state->flags &= ~FLG_SETT7FPORT; bt7f.setoutput = state->t7fport; if (bcusbioctl(state, BAYCOMUSB_T7FCONTROL, &bt7f)) lprintf(1, "USB device %03d:%03d: failed to set T7F control port\n", state->busnr, state->devnr); } if (state->flags & FLG_SETLEDS) { state->flags &= ~FLG_SETLEDS; bleds.leds = state->leds; if (bcusbioctl(state, BAYCOMUSB_SETLEDS, &bleds)) lprintf(1, "USB device %03d:%03d: failed to set LEDS\n", state->busnr, state->devnr); } return 0; } int polldevice(struct trx_thread_state *state) { int r; usleep(25000); acquire_trxdata_mutex(state); r = periodic(state); release_trxdata_mutex(state); return r; } /* --------------------------------------------------------------------- */ int getuartline(struct trx_thread_state *ctrl, unsigned int *ptr, unsigned char *buf, size_t bufsz, unsigned int timeout) { unsigned int cpy = 0, tdiff, reload; struct timeval tv1, tv2; if (!ctrl) return -1; if (gettimeofday(&tv1, NULL)) return -1; timeout *= 1000; while (cpy < bufsz) { acquire_trxdata_mutex(ctrl); if (buf) { while (cpy < bufsz && getrxfifo(ctrl, ptr, buf, 1) == 1) { if (*buf == '\r' || *buf == '\n') { cpy++; *buf++ = '\n'; *buf = 0; release_trxdata_mutex(ctrl); return cpy; } cpy++; buf++; } } if (periodic(ctrl)) { release_trxdata_mutex(ctrl); return -1; } reload = ctrl->flags & FLG_RELOADMODEM; release_trxdata_mutex(ctrl); if (reload) break; if (gettimeofday(&tv2, NULL)) break; tdiff = 1000000 * (tv2.tv_sec - tv1.tv_sec) + tv2.tv_usec - tv1.tv_usec; if (tdiff > timeout) break; usleep(25000); } if (buf) *buf = 0; return cpy; } /* --------------------------------------------------------------------- */ struct trxapi_baycomusb_adapter_audio_devs *audio_get_device_list(void) { return NULL; } /* --------------------------------------------------------------------- */ static void signal_quit(int signum) { quit = 1; } static void signal_child(int signum, siginfo_t *info, void *dummy) { int status; struct rusage rusage; if (info->si_code == CLD_STOPPED || info->si_code == CLD_CONTINUED) return; wait4(-1, &status, WNOHANG, &rusage); } /* --------------------------------------------------------------------- */ int main (int argc, char *argv[]) { static const struct option long_options[] = { { "drv", 1, 0, 'D' }, { "config", 1, 0, 'C' }, { "daemonize", 0, 0, 'd' }, { "verbose", 0, 0, 'v' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } }; int c, err = 0; unsigned int daemonize = 0; char devname[256] = "/proc/bus/usb/devices"; const char *cfgfile = NULL; CORBA_Environment ev; int pfds[2]; pid_t pid; unsigned char uch; struct sigaction sigact; printf("baycomusbserv v" VERSION " (c) 1999-2001 by Thomas Sailer, HB9JNX/AE4WA\n"); /* init custom IO handlers */ IIOPAddConnectionHandler = orb_add_connection; IIOPRemoveConnectionHandler = orb_remove_connection; if (server_init1(&argc, argv)) return -1; while ((c = getopt_long(argc, argv, "D:C:sv:d", long_options, NULL)) != EOF) { switch (c) { case 'D': usb_setmountpoint(optarg); snprintf(devname, sizeof(devname), "%s/devices", optarg); break; case 'C': cfgfile = optarg; break; #if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG) case 's': if (syslogmsg) break; openlog("baycomusb", LOG_PID, LOG_USER); syslogmsg = 1; break; #endif case 'd': daemonize = 1; break; case 'v': verboselevel = strtoul(optarg, NULL, 0); break; default: err++; break; } } if (err) { lprintf(0, "usage: %s [-v ] [-D ] [-C ]\n", argv[0]); exit(1); } if (daemonize) { if (pipe(pfds)) { lprintf(0, "pipe error %s (%u)", strerror(errno), errno); exit(1); } switch (pid = fork()) { case -1: lprintf(0, "fork error %s (%u)", strerror(errno), errno); exit(1); case 0: /* child process */ close(pfds[0]); setsid(); /* become a process group leader and drop controlling terminal */ fclose(stdin); /* no more standard in */ break; default: /* parent process */ close(pfds[1]); err = read(pfds[0], &uch, sizeof(uch)); if (err != sizeof(uch)) { lprintf(0, "baycomusbserv init failed\n"); _exit(1); } /* need to run _exit, otherwise ORBit inadvertedly kills some needed stuff */ _exit(0); } } if (config_load(cfgfile)) exit(1); if ((devices_fd = open(devname, 0)) == -1) { lprintf(0, "Cannot open %s, usbdevfs not mounted?\n", devname); exit(1); } sigact.sa_handler = signal_quit; sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_RESTART; #ifdef SIGHUP sigaction(SIGHUP, &sigact, NULL); #endif sigaction(SIGINT, &sigact, NULL); #ifdef SIGQUIT sigaction(SIGQUIT, &sigact, NULL); #endif sigaction(SIGTERM, &sigact, NULL); sigact.sa_sigaction = signal_child; sigemptyset(&sigact.sa_mask); sigact.sa_flags = SA_RESTART | SA_NOCLDSTOP | SA_SIGINFO; sigaction(SIGCHLD, &sigact, NULL); if (daemonize) { uch = 0; if (write(pfds[1], &uch, sizeof(uch)) != sizeof(uch)) { lprintf(0, "write error %s (%u)", strerror(errno), errno); exit(1); } close(pfds[1]); } if ((sock_fd = socket(/*PF_PACKET*/AF_INET, /*SOCK_RAW*/SOCK_PACKET, htons(ETH_P_AX25))) < 0) { lprintf(0, "Cannot create socket: %s (%u) \n", strerror(errno), errno); exit(1);; } if (server_init2()) return 1; mainloop(); config_save(); return 0; } baycomusb-0.10.orig/trxctrl/mainwin32.c0100644000175100017510000013037107340456151016077 0ustar abaaba/*****************************************************************************/ /* * mainwin32.c -- Transceiver control Win32 stuff. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * * * WARNING: * malloc and free from MSVCRT cause almost immediate crashes. * On the other hand, printf from CRTDLL does not support 64bit * ints while the one from MSVCRT does... */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _REENTRANT #include "trx.h" #include "simd.h" #include #include #include #include #include #include #include #include #if defined(ORBITIPC) #include #endif #include "list.h" /* --------------------------------------------------------------------- */ static HANDLE devlist_mutex; static HANDLE hglobalshmem; static struct win32_global_state *globalstate; static LIST_HEAD(devices_list); static LIST_HEAD(orb_fds); static int quit = 0; static unsigned int fastpoll = 0; #define POLLINTERVAL 10000 /* check all 10s for new modems */ #define FASTPOLLINTERVAL 1000 /* check all 1s for new modems when anticipated */ #define PAGE_ALIGN(x) (((x)+((1<<12)-1))&~((1<<12)-1)) /* --------------------------------------------------------------------- */ void acquire_trxdata_mutex(struct trx_thread_state *state) { WaitForSingleObject(state->hmutex, INFINITE); } void release_trxdata_mutex(struct trx_thread_state *state) { ReleaseMutex(state->hmutex); } int check_quit(void) { return quit; } static inline void acquire_devlist_mutex(void) { WaitForSingleObject(devlist_mutex, INFINITE); } static inline void release_devlist_mutex(void) { ReleaseMutex(devlist_mutex); } /* --------------------------------------------------------------------- */ int reopen_usbdev(struct trx_thread_state *state) { DWORD r; HANDLE h[2]; if (state->usbdev) usb_close(state->usbdev); state->usbdev = NULL; Sleep(500); /* make sure device disconnected */ acquire_devlist_mutex(); if (WaitForSingleObject(state->hevent, 0) == WAIT_OBJECT_0) goto outok; state->devidx = -1; fastpoll = 10; release_devlist_mutex(); /* now wait for device to connect */ h[0] = devlist_mutex; h[1] = state->hevent; r = WaitForMultipleObjects(2, h, TRUE, 60000); if (r < WAIT_OBJECT_0 || r > (WAIT_OBJECT_0+1)) { lprintf(1, "Timeout reopening USB device %s (error %lu)\n", state->serial, r); return -1; } outok: release_devlist_mutex(); if (!(state->usbdev = usb_open(BAYCOMUSB_VENDORID, -1, 0, state->devidx))) { lprintf(1, "Cannot open USB device %d (serial %s)\n", state->devidx, state->serial); return -1; } lprintf(10, "=== THREADCONTINUE: %d, %s\n", state->devidx, state->serial); return 0; } /* --------------------------------------------------------------------- */ void init_shmem_object(struct trx_thread_state *state) { unsigned int j; destroy_shmem_object(state); for (j = 0; j < MAXUSBMODEMS; j++) { if (globalstate->modem[j].hshmem != NULL) continue; globalstate->modem[j].hshmem = state->hshmem; state->globalidx = j; break; } } void destroy_shmem_object(struct trx_thread_state *state) { if (state->globalidx != -1) { globalstate->modem[state->globalidx].hshmem = NULL; state->globalidx = -1; } } /* --------------------------------------------------------------------- */ static void thread_start(void *arg) { struct trx_thread_state *state = arg; struct trx_thread_state *state2; struct list_head *list; int i; lprintf(10, ">>> THREADSTART: %d\n", state->devidx); /* open communications to device */ state->netif_opened = 0; state->hmutex = CreateMutex(NULL, FALSE, NULL); if (!state->hmutex) goto ret; state->hevent = CreateEvent(NULL, FALSE, FALSE, NULL); if (!state->hevent) goto ret; state->hflxtxevent = CreateEvent(NULL, FALSE, FALSE, NULL); if (!state->hflxtxevent) goto ret; state->hflxrxevent = CreateEvent(NULL, FALSE, FALSE, NULL); if (!state->hflxrxevent) goto ret; /* get serial number from device */ i = adapter_init_getserial(state); if (i < 0) { if (i == -2) lprintf(1, "Error loading USB device %d\n", state->devidx); fastpoll = 10; goto ret; } lprintf(2, "USB device %d serial %s\n", state->devidx, state->serial); acquire_devlist_mutex(); for (list = devices_list.next; list != &devices_list; list = list->next) { state2 = list_entry(list, struct trx_thread_state, device_list); if (state2 != state && !strcmp(state2->serial, state->serial)) { state2->devidx = state->devidx; state2->mode = state->mode; list_del(&state->device_list); INIT_LIST_HEAD(&state->device_list); lprintf(2, "Thread for USB device %d serial %s already running\n", state->devidx, state->serial); if (state->usbdev) usb_close(state->usbdev); state->usbdev = NULL; SetEvent(state2->hevent); release_devlist_mutex(); goto ret; } } release_devlist_mutex(); state->flags = FLG_RELOADMODEM | FLG_MODEMERROR | FLG_T7FERROR; /* finally start thread */ trx_thread(state); if (state->usbdev) adapter_reset(state->usbdev); ret: state->mode = MODE_DEAD; if (state->hflxrxevent) { CloseHandle(state->hflxrxevent); state->hflxrxevent = NULL; } if (state->hflxtxevent) { CloseHandle(state->hflxtxevent); state->hflxtxevent = NULL; } if (state->hevent) { CloseHandle(state->hevent); state->hevent = NULL; } if (state->hmutex) { CloseHandle(state->hmutex); state->hmutex = NULL; } if (state->hshmem) { CloseHandle(state->hshmem); state->hshmem = NULL; } if (state->usbdev) usb_close(state->usbdev); acquire_devlist_mutex(); destroy_shmem_object(state); list_del(&state->device_list); fastpoll = 10; release_devlist_mutex(); lprintf(10, "<<< THREADSTOP: %s\n", state->serial); UnmapViewOfFile(state); return; } /* --------------------------------------------------------------------- */ static void check_new_uninited_modems(void) { struct list_head *list; struct trx_thread_state *state; unsigned int devmask = 0; unsigned int i; struct usbdevice *usbdev; HANDLE hshmem; for (list = devices_list.next; list != &devices_list; list = list->next) { state = list_entry(list, struct trx_thread_state, device_list); if (state->devidx == -1) continue; devmask |= (1 << state->devidx); } for (i = 0; i < MAXUSBMODEMS; i++) { if (devmask & (1 << i)) continue; if (!(usbdev = usb_open(BAYCOMUSB_VENDORID, -1, 0, i))) continue; hshmem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, PAGE_ALIGN(sizeof(struct trx_thread_state)), NULL); if (!hshmem) { usb_close(usbdev); lprintf(0, "Cannot create file mapping (error %ld)\n", GetLastError()); continue; } state = MapViewOfFile(hshmem, FILE_MAP_WRITE, 0, 0, 0); if (!state) { usb_close(usbdev); CloseHandle(hshmem); lprintf(0, "Cannot map file mapping (error %ld)\n", GetLastError()); continue; } memset(state, 0, sizeof(struct trx_thread_state)); state->hshmem = hshmem; state->devidx = i; state->usbdev = usbdev; state->globalidx = -1; _beginthread(thread_start, 0, state); list_add(&state->device_list, &devices_list); } } /* --------------------------------------------------------------------- */ #if defined(ORBITIPC) struct orbfdlist { struct list_head list; GIOPConnection *conn; }; /* --------------------------------------------------------------------- */ #ifdef USECRITICALSECT static CRITICAL_SECTION orbit_mutex; #else static HANDLE orbit_mutex; #endif void acquire_orbit_mutex(void) { #ifdef USECRITICALSECT EnterCriticalSection(&orbit_mutex); #else WaitForSingleObject(orbit_mutex, INFINITE); #endif } void release_orbit_mutex(void) { #ifdef USECRITICALSECT LeaveCriticalSection(&orbit_mutex); #else ReleaseMutex(orbit_mutex); #endif } /* --------------------------------------------------------------------- */ static void orb_add_connection(GIOPConnection *cnx) { struct orbfdlist *ofd; if (!(cnx->user_data = ofd = malloc(sizeof(struct orbfdlist)))) return; ofd->conn = cnx; list_add(&ofd->list, &orb_fds); } static void orb_remove_connection(GIOPConnection *cnx) { struct orbfdlist *ofd = cnx->user_data; if (!ofd) return; ofd->conn = NULL; } static void mainloop(void) { struct list_head *list; struct orbfdlist *ofd; fd_set rmask, emask; int i, fd, maxfd; struct timeval tv; DWORD nextpolltime; long tdiff; nextpolltime = GetTickCount(); while (!quit) { FD_ZERO(&rmask); FD_ZERO(&emask); maxfd = 0; for (list = orb_fds.next; list != &orb_fds;) { ofd = list_entry(list, struct orbfdlist, list); list = list->next; if (!ofd->conn) { list_del(&ofd->list); free(ofd); continue; } fd = GIOP_CONNECTION_GET_FD(ofd->conn); if (fd >= maxfd) maxfd = fd + 1; FD_SET(fd, &rmask); FD_SET(fd, &emask); } tdiff = nextpolltime - GetTickCount(); if (tdiff < 0) tdiff = 0; tv.tv_sec = tdiff / 1000; tv.tv_usec = (tdiff - tv.tv_sec * 1000) * 1000; i = select(maxfd, &rmask, NULL, &emask, &tv); if (i == -1 || errno == EINTR) { lprintf(0, "poll: %s (%u)\n", strerror(errno), errno); exit(1); } for (list = orb_fds.next; list != &orb_fds; list = list->next) { ofd = list_entry(list, struct orbfdlist, list); fd = GIOP_CONNECTION_GET_FD(ofd->conn); if (FD_ISSET(fd, &emask) && ofd->conn) giop_main_handle_connection_exception(ofd->conn); if (FD_ISSET(fd, &rmask) && ofd->conn) giop_main_handle_connection(ofd->conn); } tdiff = GetTickCount() - nextpolltime; if (tdiff >= 0) { acquire_devlist_mutex(); check_new_uninited_modems(); if (fastpoll > 0) { nextpolltime = GetTickCount() + FASTPOLLINTERVAL; fastpoll--; } else { nextpolltime = GetTickCount() + POLLINTERVAL; } release_devlist_mutex(); } } } /* --------------------------------------------------------------------- */ #else static void mainloop(void) { DWORD nextpolltime; long tdiff; nextpolltime = GetTickCount(); while (!quit) { tdiff = nextpolltime - GetTickCount(); if (tdiff < 0) tdiff = 0; Sleep(tdiff); tdiff = GetTickCount() - nextpolltime; if (tdiff >= 0) { acquire_devlist_mutex(); check_new_uninited_modems(); if (fastpoll > 0) { nextpolltime = GetTickCount() + FASTPOLLINTERVAL; fastpoll--; } else { nextpolltime = GetTickCount() + POLLINTERVAL; } release_devlist_mutex(); } } } #endif /* --------------------------------------------------------------------- */ void netif_close(struct trx_thread_state *state) { unsigned int i; if (state->netif_opened) { /* kill pending URBs */ acquire_trxdata_mutex(state); if (state->iurb.urbstate == URBSTATE_INPROGRESS) { if (usb_discardurb(state->usbdev, &state->iurb.urb)) lprintf(1, "error %s (%d) killing interrupt urb\n", strerror(errno), errno); } if (state->curb.urbstate == URBSTATE_INPROGRESS) { if (usb_discardurb(state->usbdev, &state->curb.urb)) lprintf(1, "error %s (%d) killing control urb\n", strerror(errno), errno); } if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { for (i = 0; i < NUMRXPACKETS; i++) { if (state->du.p.rxurb[i].urbstate != URBSTATE_INPROGRESS) continue; if (usb_discardurb(state->usbdev, &state->du.p.rxurb[i].urb)) lprintf(1, "error %s (%d) killing rx packet urb %u\n", strerror(errno), errno, i); } for (i = 0; i < NUMTXPACKETS; i++) { if (state->du.p.txurb[i].urbstate != URBSTATE_INPROGRESS) continue; if (usb_discardurb(state->usbdev, &state->du.p.txurb[i].urb)) lprintf(1, "error %s (%d) killing tx packet urb %u\n", strerror(errno), errno, i); } } else if (state->mode == MODE_AUDIO) { for (i = 0; i < NUMAUDIOURB; i++) { if (state->du.a.inurb[i].urbstate != URBSTATE_INPROGRESS) continue; if (usb_discardurb(state->usbdev, &state->du.a.inurb[i].urb)) lprintf(1, "error %s (%d) killing audio input urb %u\n", strerror(errno), errno, i); } for (i = 0; i < NUMAUDIOURB; i++) { if (state->du.a.outurb[i].urbstate != URBSTATE_INPROGRESS) continue; if (usb_discardurb(state->usbdev, &state->du.a.outurb[i].urb)) lprintf(1, "error %s (%d) killing audio output urb %u\n", strerror(errno), errno, i); } audio_close(state); #if 0 if (usb_releaseinterface(state->usbdev, 3)) lprintf(2, "netif_close: cannot release interface 3\n"); if (usb_releaseinterface(state->usbdev, 2)) lprintf(2, "netif_close: cannot release interface 2\n"); if (usb_releaseinterface(state->usbdev, 1)) lprintf(2, "netif_close: cannot release interface 1\n"); #endif } release_trxdata_mutex(state); /* close network interface stuff */ if (usb_releaseinterface(state->usbdev, 0)) lprintf(2, "netif_close: cannot release interface 0\n"); } lprintf(30, "netif_close\n"); state->netif_opened = 0; } int netif_open(struct trx_thread_state *state) { unsigned char br[6]; unsigned int u, k; int r; netif_close(state); /* initialize URBs */ state->iurb.urbstate = 0; state->iurb.nexttime = gettimems(); state->iurb.urb.type = USBDEVFS_URB_TYPE_BULK; state->iurb.urb.endpoint = 0x81; state->iurb.urb.flags = 0; state->iurb.urb.buffer = state->iurb.buf; state->iurb.urb.buffer_length = sizeof(state->iurb.buf); state->iurb.urb.signr = 0; state->iurb.urb.usercontext = (void *)0x20000; state->curb.urbstate = 0; state->curb.urb.type = USBDEVFS_URB_TYPE_CONTROL; state->curb.urb.endpoint = 0; state->curb.urb.flags = 0; state->curb.urb.buffer = &state->curb.buf; state->curb.urb.buffer_length = 8; state->curb.urb.signr = 0; state->curb.urb.usercontext = (void *)0x30000; if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { state->du.p.rxurbptr = 0; for (u = 0; u < NUMRXPACKETS; u++) { state->du.p.rxurb[u].urbstate = 0; state->du.p.rxurb[u].urb.type = USBDEVFS_URB_TYPE_BULK; state->du.p.rxurb[u].urb.endpoint = 0x82; state->du.p.rxurb[u].urb.flags = USBDEVFS_URB_QUEUE_BULK; state->du.p.rxurb[u].urb.buffer = &state->du.p.rxurb[u].b.frame.frame[0]; state->du.p.rxurb[u].urb.buffer_length = sizeof(state->du.p.rxurb[u].b.frame.frame)+2; state->du.p.rxurb[u].urb.signr = 0; state->du.p.rxurb[u].urb.usercontext = (void *)(0x00000 | u); } for (u = 0; u < NUMTXPACKETS; u++) { state->du.p.txurb[u].urbstate = 0; state->du.p.txurb[u].urb.type = USBDEVFS_URB_TYPE_BULK; state->du.p.txurb[u].urb.endpoint = 0x02; state->du.p.txurb[u].urb.flags = USBDEVFS_URB_QUEUE_BULK | USBDEVFS_URB_ZERO_PACKET; state->du.p.txurb[u].urb.buffer = state->du.p.txurb[u].b.buf; state->du.p.txurb[u].urb.buffer_length = sizeof(state->du.p.txurb[u].b); state->du.p.txurb[u].urb.signr = 0; state->du.p.txurb[u].urb.usercontext = (void *)(0x10000 | u); } } else if (state->mode == MODE_AUDIO) { for (u = 0; u < NUMAUDIOURB; u++) { state->du.a.inurb[u].urbstate = 0; state->du.a.inurb[u].urb.type = USBDEVFS_URB_TYPE_ISO; state->du.a.inurb[u].urb.endpoint = 0x88; state->du.a.inurb[u].urb.flags = USBDEVFS_URB_ISO_ASAP; state->du.a.inurb[u].urb.buffer = state->du.a.inurb[u].buf; state->du.a.inurb[u].urb.buffer_length = sizeof(state->du.a.inurb[u].buf); state->du.a.inurb[u].urb.number_of_packets = NUMFRAMESPERURB; state->du.a.inurb[u].urb.signr = 0; state->du.a.inurb[u].urb.usercontext = (void *)(0x00000 | u); for (k = 0; k < NUMFRAMESPERURB; k++) state->du.a.inurb[u].urb.iso_frame_desc[k].length = AUDIOSAMPLINGRATE/1000; } for (u = 0; u < NUMAUDIOURB; u++) { state->du.a.outurb[u].urbstate = 0; state->du.a.outurb[u].urb.type = USBDEVFS_URB_TYPE_ISO; state->du.a.outurb[u].urb.endpoint = 0x08; state->du.a.outurb[u].urb.flags = USBDEVFS_URB_ISO_ASAP; state->du.a.outurb[u].urb.buffer = state->du.a.outurb[u].buf; state->du.a.outurb[u].urb.buffer_length = sizeof(state->du.a.outurb[u].buf); state->du.a.outurb[u].urb.number_of_packets = NUMFRAMESPERURB; state->du.a.outurb[u].urb.signr = 0; state->du.a.outurb[u].urb.usercontext = (void *)(0x10000 | u); for (k = 0; k < NUMFRAMESPERURB; k++) state->du.a.outurb[u].urb.iso_frame_desc[k].length = AUDIOSAMPLINGRATE/1000; /* clear tx data */ memset(&state->du.a.outurb[u].buf, 0x80, sizeof(state->du.a.outurb[u].buf)); } } /* claim device */ if (usb_setconfiguration(state->usbdev, 1)) { lprintf(2, "netif_open: cannot set configuration 1\n"); return -1; } /* claim interface 0 */ if (usb_claiminterface(state->usbdev, 0)) { lprintf(2, "netif_open: cannot claim interface 0\n"); return -1; } /* set interface 0 altsetting 1, to enable the bulk ep's */ if (usb_setinterface(state->usbdev, 0, 1)) { lprintf(2, "netif_open: cannot set interface 0 altsetting 1\n"); goto errsetif0; } state->bitraterx = state->bitratetx = state->txdmul = 0; if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { r = usb_control_msg(state->usbdev, 0xc0, 0xd1, 0, 0, 6, br, 100); if (r != 6) { lprintf(1, "Error while reading adapter bitrate\n"); goto errsetif0; } state->bitratetx = br[0] | (br[1] << 8) | (br[2] << 16); state->bitraterx = br[3] | (br[4] << 8) | (br[5] << 16); state->txdmul = (state->bitratetx + 799) / 800; lprintf(5, "Adapter %s bitrate %u/%u\n", state->serial, state->bitraterx, state->bitratetx); } else if (state->mode == MODE_AUDIO) { #if 0 /* claim interface 1 */ if (usb_claiminterface(state->usbdev, 1)) { lprintf(2, "netif_open: cannot claim interface 1\n"); goto errsetif0; } /* set interface 1 altsetting 0 */ if (usb_setinterface(state->usbdev, 1, 0)) { lprintf(2, "netif_open: cannot set interface 1 altsetting 0\n"); goto errsetif1; } /* claim interface 2 */ if (usb_claiminterface(state->usbdev, 2)) { lprintf(2, "netif_open: cannot claim interface 2\n"); goto errsetif1; } /* set interface 2 altsetting 1, to enable the ISO ep's */ if (usb_setinterface(state->usbdev, 2, 1)) { lprintf(2, "netif_open: cannot set interface 2 altsetting 1\n"); goto errsetif2; } /* claim interface 3 */ if (usb_claiminterface(state->usbdev, 3)) { lprintf(2, "netif_open: cannot claim interface 3\n"); goto errsetif2; } /* set interface 3 altsetting 1, to enable the ISO ep's */ if (usb_setinterface(state->usbdev, 3, 1)) { lprintf(2, "netif_open: cannot set interface 3 altsetting 1\n"); goto errsetif3; } #endif audio_open(state); } lprintf(30, "netif_open\n"); state->netif_opened = 1; return 0; #if 0 errsetif3: usb_releaseinterface(state->usbdev, 3); errsetif2: usb_releaseinterface(state->usbdev, 2); errsetif1: usb_releaseinterface(state->usbdev, 1); #endif errsetif0: usb_releaseinterface(state->usbdev, 0); lprintf(30, "netif_open error\n"); return -1; } /* --------------------------------------------------------------------- */ static int process(struct trx_thread_state *state, unsigned int timeout) { unsigned int curtime = gettimems(), rettime = curtime + timeout; struct usbdevfs_urb *urb; signed int tdiff, tdiff1; unsigned int i, j; int r; DWORD wres; HANDLE whandle[2]; if (!state->netif_opened) { if (timeout) Sleep(timeout); return 0; } if (!timeout) rettime++; //lprintf(20, ">>> process: %d\n", timeout); acquire_trxdata_mutex(state); for (;;) { if (state->iurb.urbstate != URBSTATE_INPROGRESS) { tdiff = curtime - state->iurb.nexttime; if (tdiff >= 0) { r = usb_submiturb(state->usbdev, &state->iurb.urb); if (r < 0) { lprintf(1, "error submitting interrupt urb\n"); goto submiterr; } state->iurb.urbstate = URBSTATE_INPROGRESS; state->iurb.nexttime += INTERRUPT_INTERVAL; tdiff = curtime - state->iurb.nexttime; if (tdiff > 0) state->iurb.nexttime = curtime; } } else { /* interrupt urb timeout processing */ tdiff = curtime - state->iurb.nexttime; if (tdiff >= 1000) { lprintf(1, "interrupt urb timeout\n"); if (usb_discardurb(state->usbdev, &state->iurb.urb)) lprintf(1, "error %s (%d) killing interrupt urb\n", strerror(errno), errno); state->iurb.urbstate = URBSTATE_UNUSED; } } if (state->curb.urbstate != URBSTATE_INPROGRESS) { if (state->uarttxempty >= UARTTXDELAY && state->tfifo.rd != state->tfifo.wr) { state->curb.buf.creq.requesttype = 0x40; state->curb.buf.creq.request = 0xd3; state->curb.buf.creq.value[0] = state->tfifo.buf[state->tfifo.rd]; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 0; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 0; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 8; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (txuart)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->tfifo.rd = (state->tfifo.rd + 1) % sizeof(state->tfifo.buf); state->uarttxempty = 0; } else if (state->flags & FLG_CLRPTT) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd0; state->curb.buf.creq.value[0] = 0; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 1; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 3; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 11; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (ptt)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_CLRPTT; } else if (state->flags & FLG_SETPTT && !(state->flags & FLG_INHIBITSETPTT)) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd0; state->curb.buf.creq.value[0] = (state->flags & FLG_MANUALPTT) ? 1 : 0; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 1; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 3; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 11; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (ptt)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETPTT; } else if (state->flags & FLG_SETMDISCDIR) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd4; state->curb.buf.creq.value[0] = state->cfg.mdisc.direction; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 2; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 3; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 11; /* enable RxC, TxC or TxD outputs if special output mode is selected */ if (state->mode == MODE_FSK) { if (state->cfg.mdisc.rxc) state->curb.buf.creq.value[0] &= ~(1 << 0); if (state->cfg.mdisc.txc) state->curb.buf.creq.value[0] &= ~(1 << 1); if (state->cfg.mdisc.txd) state->curb.buf.creq.value[0] &= ~(1 << 3); } r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (mdiscdir)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETMDISCDIR; } else if (state->flags & FLG_SETMDISCOUT) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd4; state->curb.buf.creq.value[0] = state->cfg.mdisc.output; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 1; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 3; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 11; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (mdiscout)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETMDISCOUT; } else if (state->flags & FLG_SETT7FPORT) { state->curb.buf.creq.requesttype = 0xc0; state->curb.buf.creq.request = 0xd5; state->curb.buf.creq.value[0] = state->t7fport; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 1; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 2; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 10; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (t7fport)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETT7FPORT; } else if (state->flags & FLG_SETLEDS) { state->curb.buf.creq.requesttype = 0x40; state->curb.buf.creq.request = 0xd2; state->curb.buf.creq.value[0] = state->leds & 3; state->curb.buf.creq.value[1] = 0; state->curb.buf.creq.index[0] = 0; state->curb.buf.creq.index[1] = 0; state->curb.buf.creq.length[0] = 0; state->curb.buf.creq.length[1] = 0; state->curb.urb.buffer_length = 8; r = usb_submiturb(state->usbdev, &state->curb.urb); if (r < 0) { lprintf(1, "error submitting control urb (setleds)\n"); goto submiterr; } state->curb.urbstate = URBSTATE_INPROGRESS; state->curb.starttime = gettimems(); state->flags &= ~FLG_SETLEDS; } } else { /* control URB timeout processing */ tdiff = curtime - state->curb.starttime; if (tdiff >= 2000) { lprintf(1, "control urb timeout\n"); if (usb_discardurb(state->usbdev, &state->curb.urb)) lprintf(1, "error %s (%d) killing interrupt urb\n", strerror(errno), errno); state->curb.urbstate = URBSTATE_UNUSED; } } if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { for (;;) { i = state->du.p.rxurbptr; if (state->du.p.rxurb[i].urbstate == URBSTATE_INPROGRESS || state->du.p.rxurb[i].urbstate == URBSTATE_DONE || state->du.p.rxurb[i].urbstate == URBSTATE_CORBASEND) break; state->du.p.rxurb[i].urbstate = URBSTATE_UNUSED; r = usb_submiturb(state->usbdev, &state->du.p.rxurb[i].urb); if (r < 0) { lprintf(1, "error submitting rx packet urb %u\n", i); goto submiterr; } state->du.p.rxurb[i].urbstate = URBSTATE_INPROGRESS; state->du.p.rxurbptr = (i + 1) % NUMRXPACKETS; } for (i = 0; i < NUMTXPACKETS; i++) { if (state->du.p.txurb[i].urbstate != URBSTATE_FILLED) continue; r = usb_submiturb(state->usbdev, &state->du.p.txurb[i].urb); if (r < 0) { lprintf(1, "error submitting tx packet urb %u\n", i); goto submiterr; } state->du.p.txurb[i].urbstate = URBSTATE_INPROGRESS; #if 0 { char buf[512]; snprintpkt(buf, sizeof(buf), state->du.p.txurb[i].urb.buffer+2, state->du.p.txurb[i].urb.buffer_length-2); printf("Tx(%u): %s\n", state->du.p.txurb[i].urb.buffer_length, buf); } #endif } #if 0 { unsigned int rxu = 0, txu = 0; for (i = 0; i < NUMRXPACKETS; i++) if (state->du.p.rxurb[i].urbstate == URBSTATE_INPROGRESS) rxu++; for (i = 0; i < NUMTXPACKETS; i++) if (state->du.p.txurb[i].urbstate == URBSTATE_INPROGRESS) txu++; if (rxu != NUMRXPACKETS || txu) lprintf(10, "queued URBs: rx %u tx %u\n", rxu, txu); } #endif } else if (state->mode == MODE_AUDIO) { for (i = 0; i < NUMAUDIOURB; i++) { if (state->du.a.inurb[i].urbstate != URBSTATE_UNUSED) continue; r = usb_submiturb(state->usbdev, &state->du.a.inurb[i].urb); if (r < 0) { lprintf(1, "error submitting audio input urb %u\n", i); goto submiterr; } state->du.a.inurb[i].urbstate = URBSTATE_INPROGRESS; } for (i = 0; i < NUMAUDIOURB; i++) { if (state->du.a.outurb[i].urbstate != URBSTATE_UNUSED) continue; r = usb_submiturb(state->usbdev, &state->du.a.outurb[i].urb); if (r < 0) { lprintf(1, "error submitting audio output urb %u\n", i); goto submiterr; } state->du.a.outurb[i].urbstate = URBSTATE_INPROGRESS; } } tdiff = rettime - curtime; if (tdiff < 0) { release_trxdata_mutex(state); //lprintf(20, "<<< process\n"); return 0; } tdiff1 = state->iurb.nexttime - curtime; if (tdiff1 < 0) tdiff1 = 0; if (tdiff1 < tdiff) tdiff = tdiff1; release_trxdata_mutex(state); #if 1 //lprintf(20, ">>>WaitForMultipleObjects %d\n", tdiff); whandle[0] = state->hflxtxevent; whandle[1] = usb_getfd(state->usbdev); wres = WaitForMultipleObjects(2, whandle, FALSE, tdiff); urb = usb_reapurb(state->usbdev, 0); //lprintf(20, "<<usbdev, tdiff); #endif acquire_trxdata_mutex(state); curtime = gettimems(); if (!urb) continue; switch (((unsigned int)urb->usercontext) & ~0xffff) { case 0x00000: i = ((unsigned int)urb->usercontext) & 0xffff; if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { if (i > NUMRXPACKETS || urb != &state->du.p.rxurb[i].urb) abort(); if (state->du.p.rxurb[i].urb.status || state->du.p.rxurb[i].urb.actual_length <= 2) { lprintf(1, "receive transfer failed, status %u length %u\n", state->du.p.rxurb[i].urb.status, state->du.p.rxurb[i].urb.actual_length); state->du.p.rxurb[i].urbstate = URBSTATE_UNUSED; } else { #if 0 { char buf[512]; snprintpkt(buf, sizeof(buf), state->du.p.rxurb[i].urb.buffer, state->du.p.rxurb[i].urb.actual_length-2); printf("Rx(%d): %s\n", state->du.p.rxurb[i].urb.actual_length, buf); } #endif state->du.p.rxurb[i].urbstate = URBSTATE_DONE; SetEvent(state->hflxrxevent); } } else if (state->mode == MODE_AUDIO) { if (i > NUMAUDIOURB || urb != &state->du.a.inurb[i].urb) abort(); if (state->du.a.inurb[i].urb.status) lprintf(1, "audio input transfer failed, status %u\n", state->du.a.inurb[i].urb.status); for (j = 0; j < NUMFRAMESPERURB; j++) { if (!state->du.a.inurb[i].urb.iso_frame_desc[j].status) continue; lprintf(1, " audio input transfer frame %u status %u\n", j, state->du.a.inurb[i].urb.iso_frame_desc[j].status); memset(&state->du.a.inurb[i].buf[j*(AUDIOSAMPLINGRATE/1000)], 0x80, (AUDIOSAMPLINGRATE/1000)); } audio_input(state, state->du.a.inurb[i].buf, NUMFRAMESPERURB*(AUDIOSAMPLINGRATE/1000)); state->du.a.inurb[i].urbstate = URBSTATE_UNUSED; } break; case 0x10000: i = ((unsigned int)urb->usercontext) & 0xffff; if (state->mode == MODE_FSK || state->mode == MODE_EXTERNAL || state->mode == MODE_AFSK) { if (i > NUMTXPACKETS || urb != &state->du.p.txurb[i].urb) abort(); if (state->du.p.txurb[i].urb.status) lprintf(1, "transmit transfer failed, status %u length %u\n", state->du.p.txurb[i].urb.status, state->du.p.txurb[i].urb.actual_length); state->du.p.txurb[i].urbstate = URBSTATE_UNUSED; } else if (state->mode == MODE_AUDIO) { if (i > NUMAUDIOURB || urb != &state->du.a.outurb[i].urb) abort(); if (state->du.a.outurb[i].urb.status) lprintf(1, "audio output transfer failed, status %u\n", state->du.a.outurb[i].urb.status); for (j = 0; j < NUMFRAMESPERURB; j++) { if (!state->du.a.outurb[i].urb.iso_frame_desc[j].status) continue; lprintf(1, " audio output transfer frame %u status %u\n", j, state->du.a.outurb[i].urb.iso_frame_desc[j].status); } audio_output(state, state->du.a.outurb[i].buf, NUMFRAMESPERURB*(AUDIOSAMPLINGRATE/1000)); state->du.a.outurb[i].urbstate = URBSTATE_UNUSED; } break; case 0x20000: if (urb != &state->iurb.urb) abort(); if (!state->iurb.urb.status && state->iurb.urb.actual_length >= 5) { state->ptt = !!(state->iurb.buf[0] & 4); if (state->mode != MODE_AUDIO) state->dcd = !!(state->iurb.buf[0] & 8); state->rssi = state->iurb.buf[3]; if (state->iurb.buf[0] & 32) state->uarttxempty++; else state->uarttxempty = 0; /* add UART RxChars */ if (state->iurb.urb.actual_length > 5) addrxfifo(state, &state->iurb.buf[5], state->iurb.urb.actual_length-5); } else { lprintf(1, "interrupt transfer failed, status %u length %u\n", state->iurb.urb.status, state->iurb.urb.actual_length); goto interr; } #if 0 printf("ptt %d dcd %d rssi %u tempt %u slottime %u curtime %u\n", state->ptt, state->dcd, state->rssi, state->uarttxempty, state->slottime, curtime); #endif state->iurb.urbstate = URBSTATE_UNUSED; break; case 0x30000: if (urb != &state->curb.urb) abort(); if (state->iurb.urb.status) lprintf(1, "control transfer failed, status %u length %u\n", state->curb.urb.status, state->curb.urb.actual_length); state->curb.urbstate = URBSTATE_UNUSED; break; default: abort(); } } submiterr: release_trxdata_mutex(state); lprintf(1, "Error submitting urb: %d/%s (%u)\n", r, strerror(errno), errno); return -1; interr: release_trxdata_mutex(state); return -1; } int polldevice(struct trx_thread_state *state) { return process(state, 25); } /* --------------------------------------------------------------------- */ int getuartline(struct trx_thread_state *ctrl, unsigned int *ptr, unsigned char *buf, size_t bufsz, unsigned int timeout) { unsigned int cpy = 0, reload; DWORD endtime; if (!ctrl) return -1; endtime = GetTickCount() + timeout; while (cpy < bufsz) { acquire_trxdata_mutex(ctrl); if (buf) { while (cpy < bufsz && getrxfifo(ctrl, ptr, buf, 1) == 1) { if (*buf == '\r' || *buf == '\n') { cpy++; *buf++ = '\n'; *buf = 0; release_trxdata_mutex(ctrl); return cpy; } cpy++; buf++; } } reload = ctrl->flags & FLG_RELOADMODEM; release_trxdata_mutex(ctrl); if (reload) break; if ((signed)(GetTickCount()-endtime) > 0) break; if (process(ctrl, 25)) return -1; } if (buf) *buf = 0; return cpy; } /* --------------------------------------------------------------------- */ static BOOL WINAPI signal_handler(DWORD type) { switch (type) { case CTRL_C_EVENT: case CTRL_BREAK_EVENT: lprintf(1, "CTRL-C/BREAK pressed\n"); quit = 1; return TRUE; case CTRL_CLOSE_EVENT: lprintf(1, "Console closed\n"); return FALSE; case CTRL_LOGOFF_EVENT: lprintf(1, "Current user logging out\n"); return FALSE; case CTRL_SHUTDOWN_EVENT: lprintf(1, "System shutdown\n"); quit = 1; return TRUE; default: lprintf(1, "Unknown ConsoleCtrl type %lu\n", type); return FALSE; } return FALSE; } /* --------------------------------------------------------------------- */ static int do_init(int argc, char *argv[]) { static const struct option long_options[] = { { "drv", 1, 0, 'D' }, { "config", 1, 0, 'C' }, { "verbose", 1, 0, 'v' }, { "help", 0, 0, 'h' }, { "nommx", 0, 0, 0x400 }, { "mmx", 0, 0, 0x401 }, { 0, 0, 0, 0 } }; int c, err = 0; unsigned int simd = 1; const char *cfgfile = NULL; hglobalshmem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, PAGE_ALIGN(sizeof(struct win32_global_state)), "baycomusb"); if (!hglobalshmem) { lprintf(0, "Cannot create shared memory segment (error %lu)\n", GetLastError()); return -1; } if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hglobalshmem); lprintf(0, "baycomusbserv already running\n"); return -1; } globalstate = MapViewOfFile(hglobalshmem, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (!globalstate) { lprintf(0, "Cannot map shared memory segment (error %lu)\n", GetLastError()); return -1; } memset(globalstate, 0, sizeof(struct win32_global_state)); strncpy(globalstate->signature, BAYUSBSIGNATURE, sizeof(globalstate->signature)); globalstate->processid = GetCurrentProcessId(); devlist_mutex = CreateMutex(NULL, FALSE, NULL); if (!devlist_mutex) { lprintf(0, "devlist_mutex creation error %lu\n", GetLastError()); return -1; } #if defined(ORBITIPC) #ifdef USECRITICALSECT InitializeCriticalSection(&orbit_mutex); #else orbit_mutex = CreateMutex(NULL, FALSE, NULL); if (!orbit_mutex) { lprintf(0, "orbit_mutex creation error %lu\n", GetLastError()); return -1; } #endif /* init custom IO handlers */ IIOPAddConnectionHandler = orb_add_connection; IIOPRemoveConnectionHandler = orb_remove_connection; #endif if (server_init1(&argc, argv)) return -1; while ((c = getopt_long(argc, argv, "D:C:sv:S", long_options, NULL)) != EOF) { switch (c) { case 'D': usb_setmountpoint(optarg); break; case 'C': cfgfile = optarg; break; case 's': syslogmsg = 1; break; case 'v': verboselevel = strtoul(optarg, NULL, 0); break; case 'S': break; case 0x400: case 0x401: simd = c & 1; break; default: err++; break; } } if (err) { lprintf(1, "usage: %s [-v ] [-s] [-D ] [-C ]\n", argv[0]); return -1; } if (config_load(cfgfile)) return -1; initsimd(simd); return 0; } /* --------------------------------------------------------------------- */ int server_entry_parse_argv(int argc, char *argv[]) { if (do_init(argc, argv)) return 1; return 0; } int server_entry_run(void) { if (!SetConsoleCtrlHandler(signal_handler, TRUE)) lprintf(1, "Cannot add ConsoleCtrlHandler\n"); if (!SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS)) lprintf(1, "Cannot set scheduling priority, error 0x%lx\n", GetLastError()); audio_globalinit(); if (server_init2()) return 1; mainloop(); config_save(); return 0; } #define MAXARGV 64 void CALLBACK server_entry_cmdline(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow) { unsigned int argc = 1; char *argv[MAXARGV]; char *cp = lpszCmdLine; verboselevel = ~0; syslogmsg = 1; argv[0] = "bayusb.dll"; #if 0 lprintf(0, "server_entry_cmdline: \"%s\"\n", lpszCmdLine); #endif while (*cp) { while (*cp && isspace(*cp)) cp++; if (!*cp) break; if (argc >= MAXARGV) break; argv[argc++] = cp; while (*cp && !isspace(*cp)) cp++; if (!*cp) break; *cp++ = 0; } lprintf(0, "server_entry_cmdline argc %u\n", argc); #if 0 { unsigned int i; for (i = 0; i < argc; i++) lprintf(0, "server_entry_cmdline argv[%u] \"%s\"\n", i, argv[i]); } #endif #if 1 if (server_entry_parse_argv(argc, argv)) return; server_entry_run(); #endif } void server_entry_quit(void) { quit = 1; } /* --------------------------------------------------------------------- */ static SERVICE_STATUS MyServiceStatus; static SERVICE_STATUS_HANDLE MyServiceStatusHandle; static void BaycomUsbServiceCtrlHandler(DWORD Opcode) { DWORD status; switch(Opcode) { case SERVICE_CONTROL_STOP: quit = 1; MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); lprintf(1, "SetServiceStatus error %ld\n",status); } lprintf(1, "Stopping baycomusbserv\n"); return; case SERVICE_CONTROL_INTERROGATE: /* Fall through to send current status. */ break; default: lprintf(1, "BaycomUsbServiceCtrlHandler: Unrecognized opcode %ld\n", Opcode); } /* Send current status. */ if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); lprintf(1, "SetServiceStatus error %ld\n",status); } } static void BaycomUsbServiceStart(DWORD argc, LPTSTR *argv) { DWORD status; MyServiceStatus.dwServiceType = SERVICE_WIN32; MyServiceStatus.dwCurrentState = SERVICE_START_PENDING; MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwServiceSpecificExitCode = 0; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; MyServiceStatusHandle = RegisterServiceCtrlHandler(SERVICENAME, BaycomUsbServiceCtrlHandler); if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { lprintf(1, "RegisterServiceCtrlHandler failed %ld\n", GetLastError()); return; } if (do_init(argc, argv)) { MyServiceStatus.dwCurrentState = SERVICE_STOPPED; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; MyServiceStatus.dwWin32ExitCode = ERROR_ACCESS_DENIED; MyServiceStatus.dwServiceSpecificExitCode = ERROR_INVALID_DATA; SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus); return; } /* Initialization complete - report running status. */ MyServiceStatus.dwCurrentState = SERVICE_RUNNING; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); lprintf(1, "SetServiceStatus error %ld\n",status); } mainloop(); config_save(); MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwCurrentState = SERVICE_STOPPED; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); lprintf(1, "SetServiceStatus error %ld\n",status); } lprintf(1, "baycomusbserv stopped\n"); } /* --------------------------------------------------------------------- */ int main(int argc, char *argv[]) { SERVICE_TABLE_ENTRY DispatchTable[] = { { SERVICENAME, BaycomUsbServiceStart }, { NULL, NULL } }; printf("baycomusbserv v" VERSION " (c) 1999-2001 by Thomas Sailer, HB9JNX/AE4WA\n"); if (argc >= 2 && !strcmp(argv[1], "-S")) { verboselevel = 10; syslogmsg = 1; if (!StartServiceCtrlDispatcher(DispatchTable)) { lprintf(0, "Error starting service: %lu\n", GetLastError()); exit(1); } lprintf(0, "Starting Service\n"); return 0; } if (server_entry_parse_argv(argc, argv)) exit(1); return server_entry_run(); } baycomusb-0.10.orig/trxctrl/cfgwin32.c0100644000175100017510000002360707340457547015727 0ustar abaaba/*****************************************************************************/ /* * cfgwin32.c -- Windows (registry) configuration IO. * * Copyright (C) 2000-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "trx.h" /* ---------------------------------------------------------------------- */ #define REGHKEY HKEY_LOCAL_MACHINE static char configfile[256] = "SOFTWARE\\FlexNet\\BaycomUSB"; #define FALSE 0 #define TRUE 1 /* ---------------------------------------------------------------------- */ int config_load(const char *name) { if (name) strncpy(configfile, name, sizeof(configfile)); return 0; } /* ---------------------------------------------------------------------- */ int config_save(void) { return 0; } /* ---------------------------------------------------------------------- */ static unsigned long long strtoull(const char *nptr, char **endptr, int base) { unsigned long long v = 0; while (nptr && *nptr >= '0' && *nptr <= '9') v = (v * 10) + *nptr++ - '0'; if (endptr) *endptr = nptr; return v; } /* ---------------------------------------------------------------------- */ static HKEY getsectionnode(const char *serial, const char *secname) { HKEY hkey; char name[256]; DWORD disp; snprintf(name, sizeof(name), "%s\\%s\\%s", configfile, serial, secname); if (RegCreateKeyEx(REGHKEY, name, 0, "", 0, KEY_ALL_ACCESS, NULL, &hkey, &disp) != ERROR_SUCCESS) return NULL; return hkey; } static int getprop(HKEY key, const char *name, char *buf, unsigned int sz) { DWORD t, s; s = sz-1; if (RegQueryValueEx(key, name, NULL, &t, buf, &s) != ERROR_SUCCESS) { buf[0] = 0; return 0; } if (t != REG_SZ) { buf[0] = 0; return 0; } buf[s] = 0; return 1; } static void setprop(HKEY key, const char *name, const char *val) { DWORD err; err = RegSetValueEx(key, name, 0, REG_SZ, val, strlen(val)+1); if (err != ERROR_SUCCESS) lprintf(2, "RegSetValueEx(%s,%s) error %lu\n", name, val, err); } /* ---------------------------------------------------------------------- */ void config_loaddevice(struct trx_thread_state *state) { HKEY hkey; char buf[128]; /* set default */ state->cfg.adapt.mode = trxapi_baycomusb_mode_fsk; state->cfg.adapt.fclk = 19666600; state->cfg.adapt.bitraterx = state->cfg.adapt.bitratetx = 9600; state->cfg.adapt.loopback = trxapi_baycomusb_loopback_off; state->cfg.adapt.pttmute = TRUE; state->cfg.adapt.filtmode = 0; state->cfg.adapt.samplerate = 8000; state->cfg.adapt.gain = 1; state->cfg.adapt.audiodevin[0] = state->cfg.adapt.audiodevout[0] = 0; state->cfg.adapt.rfsquelch = RSSI_MIN; state->cfg.adapt.audiosquelch = FALSE; state->cfg.chacc.txdelay = 100; state->cfg.chacc.fulldup = 0; state->cfg.mdisc.output = 0; state->cfg.mdisc.direction = 0xff; state->cfg.mdisc.rxc = trxapi_modem_disconnect_rxc_normal; state->cfg.mdisc.txc = trxapi_modem_disconnect_txc_normal; state->cfg.mdisc.txd = trxapi_modem_disconnect_txd_normal; if ((hkey = getsectionnode(state->serial, "adapter"))) { if (getprop(hkey, "mode", buf, sizeof(buf))) { if (!strcmp(buf, "fsk")) { state->cfg.adapt.mode = trxapi_baycomusb_mode_fsk; } else if (!strcmp(buf, "external")) { state->cfg.adapt.mode = trxapi_baycomusb_mode_external; } else if (!strcmp(buf, "afsk")) { state->cfg.adapt.mode = trxapi_baycomusb_mode_afsk; } else if (!strcmp(buf, "audio")) { state->cfg.adapt.mode = trxapi_baycomusb_mode_audio; } } if (getprop(hkey, "fclk", buf, sizeof(buf))) state->cfg.adapt.fclk = strtoul(buf, NULL, 0); if (getprop(hkey, "bitrate", buf, sizeof(buf))) state->cfg.adapt.bitraterx = state->cfg.adapt.bitratetx = strtoul(buf, NULL, 0); if (getprop(hkey, "bitraterx", buf, sizeof(buf))) state->cfg.adapt.bitraterx = strtoul(buf, NULL, 0); if (getprop(hkey, "bitratetx", buf, sizeof(buf))) state->cfg.adapt.bitratetx = strtoul(buf, NULL, 0); if (getprop(hkey, "loopback", buf, sizeof(buf))) state->cfg.adapt.loopback = strtoul(buf, NULL, 0); if (getprop(hkey, "pttmute", buf, sizeof(buf))) state->cfg.adapt.pttmute = (buf[0] == '0' || buf[0] == 'n' || buf[0] == 'N') ? FALSE : TRUE; if (getprop(hkey, "filtmode", buf, sizeof(buf))) state->cfg.adapt.filtmode = strtoul(buf, NULL, 0); if (getprop(hkey, "samplerate", buf, sizeof(buf))) state->cfg.adapt.samplerate = strtoul(buf, NULL, 0); if (getprop(hkey, "gain", buf, sizeof(buf))) state->cfg.adapt.gain = strtod(buf, NULL); if (getprop(hkey, "audiodevin", buf, sizeof(buf))) strncpy(state->cfg.adapt.audiodevin, buf, sizeof(state->cfg.adapt.audiodevin)); if (getprop(hkey, "audiodevout", buf, sizeof(buf))) strncpy(state->cfg.adapt.audiodevout, buf, sizeof(state->cfg.adapt.audiodevout)); if (getprop(hkey, "rfsquelch", buf, sizeof(buf))) state->cfg.adapt.rfsquelch = strtod(buf, NULL); if (getprop(hkey, "audiosquelch", buf, sizeof(buf))) state->cfg.adapt.audiosquelch = (buf[0] == '0' || buf[0] == 'n' || buf[0] == 'N') ? FALSE : TRUE; } if ((hkey = getsectionnode(state->serial, "chacc"))) { if (getprop(hkey, "txdelay", buf, sizeof(buf))) state->cfg.chacc.txdelay = strtoul(buf, NULL, 0); if (getprop(hkey, "fulldup", buf, sizeof(buf))) state->cfg.chacc.fulldup = strtoul(buf, NULL, 0); } if ((hkey = getsectionnode(state->serial, "modemdisc"))) { if (getprop(hkey, "output", buf, sizeof(buf))) state->cfg.mdisc.output = strtoul(buf, NULL, 0); if (getprop(hkey, "direction", buf, sizeof(buf))) state->cfg.mdisc.direction = strtoul(buf, NULL, 0); if (getprop(hkey, "rxc", buf, sizeof(buf))) state->cfg.mdisc.rxc = strtoul(buf, NULL, 0); if (getprop(hkey, "txc", buf, sizeof(buf))) state->cfg.mdisc.txc = strtoul(buf, NULL, 0); if (getprop(hkey, "txd", buf, sizeof(buf))) state->cfg.mdisc.txd = strtoul(buf, NULL, 0); } if ((hkey = getsectionnode(state->serial, "frequency"))) { if (getprop(hkey, "rx", buf, sizeof(buf))) state->cfg.freq.rx = strtoull(buf, NULL, 0); if (getprop(hkey, "tx", buf, sizeof(buf))) state->cfg.freq.tx = strtoull(buf, NULL, 0); } } /* ---------------------------------------------------------------------- */ void config_savedevice(struct trx_thread_state *state) { HKEY hkey; char buf[128]; if (!state->serial[0]) return; if ((hkey = getsectionnode(state->serial, "adapter"))) { setprop(hkey, "mode", (state->cfg.adapt.mode == trxapi_baycomusb_mode_external) ? "external" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_afsk) ? "afsk" : (state->cfg.adapt.mode == trxapi_baycomusb_mode_audio) ? "audio" : "fsk"); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.fclk); setprop(hkey, "fclk", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.bitraterx); setprop(hkey, "bitraterx", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.bitratetx); setprop(hkey, "bitratetx", buf); snprintf(buf, sizeof(buf), "%d", state->cfg.adapt.loopback); setprop(hkey, "loopback", buf); snprintf(buf, sizeof(buf), "%d", !!state->cfg.adapt.pttmute); setprop(hkey, "pttmute", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.filtmode); setprop(hkey, "filtmode", buf); snprintf(buf, sizeof(buf), "%ld", state->cfg.adapt.samplerate); setprop(hkey, "samplerate", buf); snprintf(buf, sizeof(buf), "%f", state->cfg.adapt.gain); setprop(hkey, "gain", buf); setprop(hkey, "audiodevin", state->cfg.adapt.audiodevin); setprop(hkey, "audiodevout", state->cfg.adapt.audiodevout); snprintf(buf, sizeof(buf), "%f", state->cfg.adapt.rfsquelch); setprop(hkey, "rfsquelch", buf); snprintf(buf, sizeof(buf), "%d", !!state->cfg.adapt.audiosquelch); setprop(hkey, "audiosquelch", buf); } else lprintf(1, "Config %s node adapter out of memory\n", state->serial); if ((hkey = getsectionnode(state->serial, "chacc"))) { snprintf(buf, sizeof(buf), "%lu", state->cfg.chacc.txdelay); setprop(hkey, "txdelay", buf); snprintf(buf, sizeof(buf), "%u", state->cfg.chacc.fulldup); setprop(hkey, "fulldup", buf); } else lprintf(1, "Config %s node channel access out of memory\n", state->serial); if ((hkey = getsectionnode(state->serial, "modemdisc"))) { snprintf(buf, sizeof(buf), "0x%02lx", state->cfg.mdisc.output & 0xff); setprop(hkey, "output", buf); snprintf(buf, sizeof(buf), "0x%02lx", state->cfg.mdisc.direction & 0xff); setprop(hkey, "direction", buf); snprintf(buf, sizeof(buf), "%u", state->cfg.mdisc.rxc); setprop(hkey, "rxc", buf); snprintf(buf, sizeof(buf), "%u", state->cfg.mdisc.txc); setprop(hkey, "txc", buf); snprintf(buf, sizeof(buf), "%u", state->cfg.mdisc.txd); setprop(hkey, "txd", buf); } else lprintf(1, "Config %s node modemdisc out of memory\n", state->serial); if ((hkey = getsectionnode(state->serial, "frequency"))) { snprintf(buf, sizeof(buf), "%llu", state->cfg.freq.rx); setprop(hkey, "rx", buf); snprintf(buf, sizeof(buf), "%llu", state->cfg.freq.tx); setprop(hkey, "tx", buf); } else lprintf(1, "Config %s node frequency out of memory\n", state->serial); } /* ---------------------------------------------------------------------- */ baycomusb-0.10.orig/trxctrl/delservice.c0100644000175100017510000001672307325134424016420 0ustar abaaba/*****************************************************************************/ /* * delservice.c -- Delete W2k Service. * * Copyright (C) 2000 * Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "trx.h" #include #include /* --------------------------------------------------------------------- */ static int delete_service(void) { int ret = -1; SC_HANDLE hscm, hserv; SERVICE_STATUS sstat; hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (!hscm) { fprintf(stderr, "Cannot open SC manager, error %lu\n", GetLastError()); return -1; } hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS); if (!hserv) { fprintf(stderr, "Cannot open service, error %lu\n", GetLastError()); goto closescm; } ret = 0; if (!ControlService(hserv, SERVICE_CONTROL_STOP, &sstat)) { fprintf(stderr, "Cannot delete service, error %lu\n", GetLastError()); ret = -1; } if (!DeleteService(hserv)) { fprintf(stderr, "Cannot delete service, error %lu\n", GetLastError()); ret = -1; } if (!ret) fprintf(stderr, "Service %s stopped successfully\n", SERVICENAME); if (!CloseServiceHandle(hserv)) fprintf(stderr, "Cannot close service handle, error %lu\n", GetLastError()); closescm: if (!CloseServiceHandle(hscm)) fprintf(stderr, "Cannot close service manager handle, error %lu\n", GetLastError()); return ret; } static int create_service(void) { int ret = -1; SC_HANDLE hscm, hserv; char name[512], cmdname[512], *cp; if (!GetModuleFileName(GetModuleHandle(NULL), name, sizeof(name))) { fprintf(stderr, "Cannot determine executable name\n"); return -1; } if ((cp = strrchr(name, '\\'))) *cp = 0; else name[0] = 0; /* * Database calls (getXbyY) seem to hang for a very looooong time under * w9x if DNS is not or misconfigured. So we set the binding address to * 127.0.0.1, which only accepts connections from 127.0.0.1 * and does no database calls */ //snprintf(cmdname, sizeof(cmdname), "%s\\baycomusbserv.exe -S -v 9 -s -ORBBindAddr=127.0.0.1", name); snprintf(cmdname, sizeof(cmdname), "%%SystemRoot%%\\baycomusbserv.exe -S -v 9 -s -ORBBindAddr=127.0.0.1"); hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (!hscm) { fprintf(stderr, "Cannot open SC manager, error %lu\n", GetLastError()); return -1; } hserv = CreateService(hscm, SERVICENAME, SERVICEDISPLAYNAME, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START/*SERVICE_DEMAND_START*/, SERVICE_ERROR_NORMAL, cmdname, NULL, NULL, NULL, NULL, NULL); if (!hserv) { fprintf(stderr, "Cannot create service, error %lu\n", GetLastError()); goto closescm; } fprintf(stderr, "Service %s created successfully\n", SERVICENAME); ret = 0; if (!CloseServiceHandle(hserv)) fprintf(stderr, "Cannot close service handle, error %lu\n", GetLastError()); closescm: if (!CloseServiceHandle(hscm)) fprintf(stderr, "Cannot close service manager handle, error %lu\n", GetLastError()); return ret; } static int start_service(int recurse) { int ret = -1; SC_HANDLE hscm, hserv; DWORD err; char *args[5] = { "-S", "-v", "9", "-s", "-ORBBindAddr=127.0.0.1" }; hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (!hscm) { fprintf(stderr, "Cannot open SC manager, error %lu\n", GetLastError()); return -1; } hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS); if (!hserv) { err = GetLastError(); fprintf(stderr, "Cannot open service, error %lu\n", err); if (recurse && err == ERROR_SERVICE_DOES_NOT_EXIST) { if (!CloseServiceHandle(hscm)) fprintf(stderr, "Cannot close service manager handle, error %lu\n", GetLastError()); if (create_service()) return -1; return start_service(0); } goto closescm; } if (!StartService(hserv, 5, args)) { err = GetLastError(); if (err != ERROR_SERVICE_ALREADY_RUNNING) fprintf(stderr, "Cannot start service, error %lu\n", err); if (recurse && err == ERROR_PATH_NOT_FOUND) { if (!CloseServiceHandle(hserv)) fprintf(stderr, "Cannot close service handle, error %lu\n", GetLastError()); if (!CloseServiceHandle(hscm)) fprintf(stderr, "Cannot close service manager handle, error %lu\n", GetLastError()); if (delete_service()) return -1; if (create_service()) return -1; return start_service(0); } goto closeserv; } fprintf(stderr, "Service %s started successfully\n", SERVICENAME); ret = 0; closeserv: if (!CloseServiceHandle(hserv)) fprintf(stderr, "Cannot close service handle, error %lu\n", GetLastError()); closescm: if (!CloseServiceHandle(hscm)) fprintf(stderr, "Cannot close service manager handle, error %lu\n", GetLastError()); return ret; } /* --------------------------------------------------------------------- */ int main(int argc, char *argv[]) { if (argc >= 2) { switch (argv[1][0]) { case 's': case 'S': return start_service(0) ? 1 : 0; case 'c': case 'C': return create_service() ? 1 : 0; } } return delete_service() ? 1 : 0; } baycomusb-0.10.orig/trxctrl/audiowin32.c0100644000175100017510000005137007331753236016261 0ustar abaaba/*****************************************************************************/ /* * audiowin32.c -- Audio processing for "virtual transceiver", win32 IO. * * Copyright (C) 1999, 2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #include #include #include #include #include "trx.h" #include "trxapi.h" /* ---------------------------------------------------------------------- */ #define BUFSIZE 8192 /* must be significantly bigger than SNDLATENCY! */ #define WAVE_FORMAT_1M08 1 #define WAVE_FORMAT_1S08 2 #define WAVE_FORMAT_1M16 4 #define WAVE_FORMAT_1S16 8 #define WAVE_FORMAT_2M08 16 #define WAVE_FORMAT_2S08 32 #define WAVE_FORMAT_2M16 64 #define WAVE_FORMAT_2S16 128 #define WAVE_FORMAT_4M08 256 #define WAVE_FORMAT_4S08 512 #define WAVE_FORMAT_4M16 1024 #define WAVE_FORMAT_4S16 2048 #define WAVE_FORMAT_PCM 1 /* ---------------------------------------------------------------------- */ #if defined(HAVE_DIRECTX) #include struct dsdrivers { struct list_head list; GUID guid; char name[64]; char desc[64]; }; static LIST_HEAD(dsplaylist); static LIST_HEAD(dscapturelist); /* ---------------------------------------------------------------------- */ static void stop(struct trx_thread_state *state) { if (state->du.a.io.dsplay) { IDirectSoundBuffer_Stop(state->du.a.io.playbuf); IDirectSoundBuffer_Release(state->du.a.io.playbuf); } if (state->du.a.io.dsrec) { IDirectSoundCaptureBuffer_Stop(state->du.a.io.recbuf); IDirectSoundCaptureBuffer_Release(state->du.a.io.recbuf); IDirectSoundCapture_Release(state->du.a.io.dsrec); } if (state->du.a.io.dsplay) IDirectSound_Release(state->du.a.io.dsplay); state->du.a.io.recbuf = NULL; state->du.a.io.dsrec = NULL; state->du.a.io.playbuf = NULL; state->du.a.io.dsplay = NULL; } static void start(struct trx_thread_state *state) { struct list_head *list; struct dsdrivers *drv; LPGUID lpguid; HRESULT res; WAVEFORMATEX waveformat; DSBUFFERDESC bdesc; DSCBUFFERDESC cbdesc; DSCAPS caps; DSCCAPS ccaps; DSBCAPS bcaps; DSCBCAPS cbcaps; unsigned int isprimary = 0, weight = ~0; void *lptr1; DWORD lbytes1; HWND hwnd = GetDesktopWindow(); lpguid = NULL; for (list = dsplaylist.next; list != &dsplaylist; list = list->next) { drv = list_entry(list, struct dsdrivers, list); if (strcmp(drv->desc, state->cfg.adapt.audiodevout)) continue; if (memcmp(&drv->guid, &GUID_NULL, sizeof(drv->guid))) lpguid = &drv->guid; break; } if (FAILED(res = DirectSoundCreate(lpguid, &state->du.a.io.dsplay, NULL))) { lprintf(1, "DirectSoundCreate error 0x%lx\n", res); goto errdscreate; } if (FAILED(res = IDirectSound_SetCooperativeLevel(state->du.a.io.dsplay, hwnd, DSSCL_WRITEPRIMARY))) { lprintf(3, "SetCooperativeLevel DSSCL_WRITEPRIMARY error 0x%lx\n", res); if (FAILED(res = IDirectSound_SetCooperativeLevel(state->du.a.io.dsplay, hwnd, DSSCL_EXCLUSIVE))) { lprintf(1, "SetCooperativeLevel DSSCL_EXCLUSIVE error 0x%lx\n", res); goto errdsb; } } else isprimary = 1; lpguid = NULL; for (list = dscapturelist.next; list != &dscapturelist; list = list->next) { drv = list_entry(list, struct dsdrivers, list); if (strcmp(drv->desc, state->cfg.adapt.audiodevin)) continue; if (memcmp(&drv->guid, &GUID_NULL, sizeof(drv->guid))) lpguid = &drv->guid; break; } if (FAILED(res = DirectSoundCaptureCreate(lpguid, &state->du.a.io.dsrec, NULL))) { lprintf(1, "DirectSoundCaptureCreate error 0x%lx\n", res); goto errdsb; } /* DirectSound capabilities */ caps.dwSize = sizeof(caps); if (FAILED(res = IDirectSound_GetCaps(state->du.a.io.dsplay, &caps))) { lprintf(1, "DirectSoundGetCaps error 0x%lx\n", res); goto errdscb; } lprintf(5, "DirectSound capabilities:\n" " Flags 0x%04lx\n" " SampleRate min %lu max %lu\n" " # Primary Buffers %lu\n", caps.dwFlags, caps.dwMinSecondarySampleRate, caps.dwMaxSecondarySampleRate, caps.dwPrimaryBuffers); /* DirectSoundCapture capabilities */ ccaps.dwSize = sizeof(ccaps); if (FAILED(res = IDirectSoundCapture_GetCaps(state->du.a.io.dsrec, &ccaps))) { lprintf(1, "DirectSoundCaptureGetCaps error 0x%lx\n", res); goto errdscb; } lprintf(5, "DirectSoundCapture capabilities:\n" " Flags 0x%04lx\n" " Formats 0x%04lx\n" " Channels %lu\n", ccaps.dwFlags, ccaps.dwFormats, ccaps.dwChannels); /* adjust sampling rate */ if (!(caps.dwFlags & DSCAPS_PRIMARY16BIT) || !(caps.dwFlags & DSCAPS_PRIMARYMONO)) { lprintf(1, "Unsupported playback format 16bit mono\n"); goto errdscb; } if (state->du.a.p.sratedspout < caps.dwMinSecondarySampleRate) state->du.a.p.sratedspout = caps.dwMinSecondarySampleRate; if (state->du.a.p.sratedspout > caps.dwMaxSecondarySampleRate) state->du.a.p.sratedspout = caps.dwMaxSecondarySampleRate; if ((ccaps.dwFormats & WAVE_FORMAT_1M16) && abs(state->du.a.p.srateusb - 11025) < weight) { weight = abs(state->du.a.p.srateusb - 11025); state->du.a.p.sratedspin = 11025; } if ((ccaps.dwFormats & WAVE_FORMAT_1M16) && abs(state->du.a.p.srateusb - 22050) < weight) { weight = abs(state->du.a.p.srateusb - 22050); state->du.a.p.sratedspin = 22050; } if ((ccaps.dwFormats & WAVE_FORMAT_1M16) && abs(state->du.a.p.srateusb - 44100) < weight) { weight = abs(state->du.a.p.srateusb - 44100); state->du.a.p.sratedspin = 44100; } if (weight == ~0) { lprintf(1, "Unsupported capture sampling rate\n"); goto errdscb; } /* create capture buffer */ memset(&waveformat, 0, sizeof(waveformat)); waveformat.wFormatTag = WAVE_FORMAT_PCM; waveformat.wBitsPerSample = 16; waveformat.nChannels = 1; waveformat.nSamplesPerSec = state->du.a.p.sratedspin; waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8; waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign; memset(&cbdesc, 0, sizeof(cbdesc)); cbdesc.dwSize = sizeof(cbdesc); cbdesc.dwFlags = /* DSCBCAPS_WAVEMAPPED */ 0; cbdesc.dwBufferBytes = 65536; cbdesc.lpwfxFormat = &waveformat; if (FAILED(res = IDirectSoundCapture_CreateCaptureBuffer(state->du.a.io.dsrec, &cbdesc, &state->du.a.io.recbuf, NULL))) { lprintf(1, "CreateSoundCaptureBuffer error 0x%lx\n", res); goto errdscb; } /* create playback buffer */ if (isprimary) { memset(&bdesc, 0, sizeof(bdesc)); bdesc.dwSize = sizeof(bdesc); bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_PRIMARYBUFFER; bdesc.dwBufferBytes = 0; bdesc.lpwfxFormat = NULL; if (FAILED(res = IDirectSound_CreateSoundBuffer(state->du.a.io.dsplay, &bdesc, &state->du.a.io.playbuf, NULL))) { lprintf(1, "DirectSoundCreateSoundBuffer error 0x%lx\n", res); goto errdspb; } memset(&waveformat, 0, sizeof(waveformat)); waveformat.wFormatTag = WAVE_FORMAT_PCM; waveformat.wBitsPerSample = 16; waveformat.nChannels = 1; waveformat.nSamplesPerSec = state->du.a.p.sratedspout; waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8; waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign; if (FAILED(res = IDirectSoundBuffer_SetFormat(state->du.a.io.playbuf, &waveformat))) { lprintf(1, "DirectSoundBufferSetFormat error 0x%lx\n", res); goto errsnd; } if (FAILED(res = IDirectSoundBuffer_GetFormat(state->du.a.io.playbuf, &waveformat, sizeof(waveformat), NULL))) { lprintf(1, "DirectSoundBufferGetFormat error 0x%lx\n", res); goto errsnd; } lprintf(5, "Sampling rates: Recording %u Playback %u\n", state->du.a.p.sratedspin, state->du.a.p.sratedspout); } else { /* first try to set the format of the primary buffer */ memset(&bdesc, 0, sizeof(bdesc)); bdesc.dwSize = sizeof(bdesc); bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_PRIMARYBUFFER; bdesc.dwBufferBytes = 0; bdesc.lpwfxFormat = NULL; if (FAILED(res = IDirectSound_CreateSoundBuffer(state->du.a.io.dsplay, &bdesc, &state->du.a.io.playbuf, NULL))) { lprintf(1, "DirectSoundCreateSoundBuffer (primary) error 0x%lx\n", res); } else { memset(&waveformat, 0, sizeof(waveformat)); waveformat.wFormatTag = WAVE_FORMAT_PCM; waveformat.wBitsPerSample = 16; waveformat.nChannels = 1; waveformat.nSamplesPerSec = state->du.a.p.sratedspout; waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8; waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign; if (FAILED(res = IDirectSoundBuffer_SetFormat(state->du.a.io.playbuf, &waveformat))) { lprintf(1, "DirectSoundBufferSetFormat (primary) error 0x%lx\n", res); } IDirectSoundBuffer_Release(state->du.a.io.playbuf); } /* create secondary */ memset(&waveformat, 0, sizeof(waveformat)); waveformat.wFormatTag = WAVE_FORMAT_PCM; waveformat.wBitsPerSample = 16; waveformat.nChannels = 1; waveformat.nSamplesPerSec = state->du.a.p.sratedspout; waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8; waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign; memset(&bdesc, 0, sizeof(bdesc)); bdesc.dwSize = sizeof(bdesc); bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS; bdesc.dwBufferBytes = 65536; bdesc.lpwfxFormat = &waveformat; if (FAILED(res = IDirectSound_CreateSoundBuffer(state->du.a.io.dsplay, &bdesc, &state->du.a.io.playbuf, NULL))) { lprintf(1, "DirectSoundCreateSoundBuffer error 0x%lx\n", res); goto errdspb; } } /* find out buffer size */ bcaps.dwSize = sizeof(bcaps); if (FAILED(res = IDirectSoundBuffer_GetCaps(state->du.a.io.playbuf, &bcaps))) { lprintf(1, "DirectSoundBufferGetCaps error 0x%lx\n", res); goto errsnd; } lprintf(1, "Playback buffer characteristics:\n" " Flags 0x%04lx\n" " Buffer Bytes %lu\n" " Unlock Transfer rate %lu\n" " CPU overhead %lu\n", bcaps.dwFlags, bcaps.dwBufferBytes, bcaps.dwUnlockTransferRate, bcaps.dwPlayCpuOverhead); state->du.a.io.playbufsz = bcaps.dwBufferBytes; cbcaps.dwSize = sizeof(cbcaps); if (FAILED(res = IDirectSoundCaptureBuffer_GetCaps(state->du.a.io.recbuf, &cbcaps))) { lprintf(1, "DirectSoundCaptureBufferGetCaps error 0x%lx\n", res); goto errsnd; } lprintf(5, "Recording buffer characteristics:\n" " Flags 0x%04lx\n" " Buffer Bytes %lu\n", cbcaps.dwFlags, cbcaps.dwBufferBytes); state->du.a.io.recbufsz = cbcaps.dwBufferBytes; /* start recording */ if (FAILED(res = IDirectSoundCaptureBuffer_Start(state->du.a.io.recbuf, DSCBSTART_LOOPING))) { lprintf(1, "DirectSoundCaptureBufferStart error 0x%lx\n", res); goto errsnd; } /* zero playback buffer and start it */ if (FAILED(res = IDirectSoundBuffer_Lock(state->du.a.io.playbuf, 0, state->du.a.io.playbufsz, &lptr1, &lbytes1, NULL, NULL, 0))) { if (res != DSERR_BUFFERLOST) { lprintf(1, "DirectSoundBufferLock error 0x%lx\n", res); goto errsnd; } if (FAILED(res = IDirectSoundBuffer_Restore(state->du.a.io.playbuf))) { lprintf(1, "DirectSoundBufferRestore error 0x%lx\n", res); goto errsnd; } if (FAILED(res = IDirectSoundBuffer_Lock(state->du.a.io.playbuf, 0, state->du.a.io.playbufsz, &lptr1, &lbytes1, NULL, NULL, 0))) { lprintf(1, "DirectSoundBufferLock error 0x%lx\n", res); goto errsnd; } } memset(lptr1, 0, lbytes1); if (FAILED(res = IDirectSoundBuffer_Unlock(state->du.a.io.playbuf, lptr1, lbytes1, NULL, 0))) { lprintf(1, "DirectSoundBufferUnlock error 0x%lx\n", res); goto errsnd; } if (FAILED(res = IDirectSoundBuffer_Play(state->du.a.io.playbuf, 0, 0, DSBPLAY_LOOPING))) { lprintf(1, "DirectSoundBufferPlay error 0x%lx\n", res); goto errsnd; } state->du.a.io.playptr = 2*SNDLATENCY; state->du.a.io.recptr = state->du.a.io.recbufsz - 2*SNDLATENCY; return; errsnd: IDirectSoundBuffer_Stop(state->du.a.io.playbuf); IDirectSoundBuffer_Release(state->du.a.io.playbuf); errdspb: IDirectSoundCaptureBuffer_Stop(state->du.a.io.recbuf); IDirectSoundCaptureBuffer_Release(state->du.a.io.recbuf); errdscb: IDirectSoundCapture_Release(state->du.a.io.dsrec); errdsb: IDirectSound_Release(state->du.a.io.dsplay); errdscreate: state->du.a.io.recbuf = NULL; state->du.a.io.dsrec = NULL; state->du.a.io.playbuf = NULL; state->du.a.io.dsplay = NULL; state->du.a.p.sratedspin = state->du.a.p.sratedspout = state->du.a.p.srateusb; } /* ---------------------------------------------------------------------- */ void audio_open(struct trx_thread_state *state) { state->du.a.io.dsplay = NULL; state->du.a.io.dsrec = NULL; state->du.a.io.playbuf = NULL; state->du.a.io.recbuf = NULL; state->du.a.io.playptr = 0; state->du.a.io.recptr = 0; state->du.a.p.srateusb = state->du.a.p.sratedspin = state->du.a.p.sratedspout = AUDIOSAMPLINGRATE; start(state); audioproc_init(state); } void audio_close(struct trx_thread_state *state) { stop(state); } void audio_input(struct trx_thread_state *state, const signed char *samples, unsigned int nrsamples) { int16_t sbuf[BUFSIZE]; HRESULT res; DWORD lockbytes1, lockbytes2, delay; int16_t *sptr1; int16_t *sptr2; int cnt; /* usb->dsp direction */ /* get FIFO count */ cnt = audioproc_convertoutput(state, nrsamples, samples, sbuf); if (!state->du.a.io.playbuf) return; if (FAILED(res = IDirectSoundBuffer_Lock(state->du.a.io.playbuf, state->du.a.io.playptr, cnt*2, (LPVOID)&sptr1, &lockbytes1, (LPVOID)&sptr2, &lockbytes2, 0))) { lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res); goto err; } memcpy(sptr1, sbuf, lockbytes1); if (lockbytes1 < cnt*sizeof(sbuf[0])) memcpy(sptr2, sbuf + lockbytes1/sizeof(sbuf[0]), cnt*sizeof(sbuf[0]) - lockbytes1); if (FAILED(res = IDirectSoundBuffer_Unlock(state->du.a.io.playbuf, sptr1, lockbytes1, sptr2, lockbytes2))) { lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res); goto err; } state->du.a.io.playptr = (state->du.a.io.playptr + cnt*sizeof(sbuf[0])) % state->du.a.io.playbufsz; /* get output delay */ if (FAILED(res = IDirectSoundBuffer_GetCurrentPosition(state->du.a.io.playbuf, &delay, NULL))) { lprintf(0, "IDirectSoundBuffer_GetCurrentPosition error %lu\n", res); goto err; } delay = (state->du.a.io.playbufsz + state->du.a.io.playptr - delay) % state->du.a.io.playbufsz; delay /= sizeof(sbuf[0]); /* adjust speed */ if (audioproc_adjustoutput(state, delay)) goto err; return; err: stop(state); } void audio_output(struct trx_thread_state *state, signed char *samples, unsigned int nrsamples) { int16_t *sbuf; HRESULT res; DWORD lockbytes1, lockbytes2, delay; int16_t *sptr1; int16_t *sptr2; unsigned int isamples, ocnts; /* dsp->usb direction */ if (!nrsamples) return; if (!state->du.a.io.recbuf) { isamples = audioproc_convertinput_isamples(state, nrsamples); sbuf = alloca(isamples * sizeof(sbuf[0])); memset(sbuf, 0, isamples * sizeof(sbuf[0])); audioproc_convertinput(state, isamples, nrsamples, sbuf, samples); return; } isamples = audioproc_convertinput_isamples(state, nrsamples); sbuf = alloca(isamples * sizeof(sbuf[0])); if (FAILED(res = IDirectSoundCaptureBuffer_Lock(state->du.a.io.recbuf, state->du.a.io.recptr, isamples * sizeof(sbuf[0]), (LPVOID)&sptr1, &lockbytes1, (LPVOID)&sptr2, &lockbytes2, 0))) { lprintf(0, "IDirectSoundCaptureBuffer_Lock error %lu\n", res); goto err; } memcpy(sbuf, sptr1, lockbytes1); if (lockbytes1 < isamples * sizeof(sbuf[0])) memcpy(sbuf+lockbytes1/sizeof(sbuf[0]), sptr2, isamples * sizeof(sbuf[0]) - lockbytes1); if (FAILED(res = IDirectSoundCaptureBuffer_Unlock(state->du.a.io.recbuf, sptr1, lockbytes1, sptr2, lockbytes2))) { lprintf(0, "IDirectSoundCaptureBuffer_Unlock error %lu\n", res); goto err; } state->du.a.io.recptr = (state->du.a.io.recptr + isamples * sizeof(sbuf[0])) % state->du.a.io.recbufsz; audioproc_convertinput(state, isamples, nrsamples, sbuf, samples); if (FAILED(res = IDirectSoundCaptureBuffer_GetCurrentPosition(state->du.a.io.recbuf, &delay, NULL))) { lprintf(0, "IDirectSoundCaptureBuffer_GetCurrentPosition error %lu\n", res); goto err; } ocnts = (state->du.a.io.recbufsz + delay - state->du.a.io.recptr) % state->du.a.io.recbufsz; ocnts /= sizeof(sbuf[0]); /* adjust speed */ if (audioproc_adjustinput(state, ocnts)) goto err; return; err: stop(state); } /* ---------------------------------------------------------------------- */ static BOOL CALLBACK DSEnumProc(LPGUID guid, LPCSTR lpszDesc, LPCSTR lpszDrvName, LPVOID lpcontext) { struct list_head *list = lpcontext; struct dsdrivers *drv; if (!(drv = malloc(sizeof(struct dsdrivers)))) { lprintf(1, "DSEnumProc: out of memory\n"); return TRUE; } if (guid) drv->guid = *guid; else drv->guid = GUID_NULL; if (!lpszDrvName) drv->name[0] = 0; else strncpy(drv->name, lpszDrvName, sizeof(drv->name)); strncpy(drv->desc, lpszDesc, sizeof(drv->desc)); drv->name[sizeof(drv->name)-1] = 0; drv->desc[sizeof(drv->desc)-1] = 0; list_add_tail(&drv->list, list); lprintf(1, "has %sGUID, desc %s drvname %s\n", guid ? "" : "no ", lpszDesc, lpszDrvName ? lpszDrvName : "(null)"); return TRUE; } void audio_globalinit(void) { lprintf(1, "DirectSound drivers\n"); DirectSoundEnumerateA(DSEnumProc, &dsplaylist); lprintf(1, "DirectSoundCapture drivers\n"); DirectSoundCaptureEnumerateA(DSEnumProc, &dscapturelist); } struct trxapi_baycomusb_adapter_audio_devs *audio_get_device_list(void) { struct trxapi_baycomusb_adapter_audio_devs *ad; unsigned int nrdevin = 0, nrdevout = 0; struct list_head *list; struct dsdrivers *drv; unsigned int i; for (list = dscapturelist.next; list != &dscapturelist; list = list->next) nrdevin++; for (list = dsplaylist.next; list != &dsplaylist; list = list->next) nrdevout++; /* retrieve audio devs */ if (!(ad = calloc(1, sizeof(struct trxapi_baycomusb_adapter_audio_devs) + nrdevin * sizeof(trxapi_audiodevice_t) + nrdevout * sizeof(trxapi_audiodevice_t)))) return NULL; ad->audiodevsin = (void *)(ad + 1); ad->nraudiodevsin = nrdevin; ad->audiodevsout = &ad->audiodevsin[nrdevin]; ad->nraudiodevsout = nrdevout; for (list = dscapturelist.next, i = 0; i < nrdevin; i++, list = list->next) { drv = list_entry(list, struct dsdrivers, list); strncpy(ad->audiodevsin[i], drv->desc, sizeof(ad->audiodevsin[i])); ad->audiodevsin[i][sizeof(ad->audiodevsin[i])-1] = 0; } for (list = dsplaylist.next, i = 0; i < nrdevout; i++, list = list->next) { drv = list_entry(list, struct dsdrivers, list); strncpy(ad->audiodevsout[i], drv->desc, sizeof(ad->audiodevsout[i])); ad->audiodevsout[i][sizeof(ad->audiodevsout[i])-1] = 0; } return ad; } /* ---------------------------------------------------------------------- */ #else /* !HAVE_DIRECTX */ void audio_globalinit(void) { } struct trxapi_baycomusb_adapter_audio_devs *audio_get_device_list(void) { return NULL; } void audio_open(struct trx_thread_state *state) { state->du.a.p.srateusb = state->du.a.p.sratedspin = state->du.a.p.sratedspout = AUDIOSAMPLINGRATE; audioproc_init(state); } void audio_close(struct trx_thread_state *state) { } void audio_input(struct trx_thread_state *state, const signed char *samples, unsigned int nrsamples) { audioproc_convertoutput(state, nrsamples, samples, sbuf); } void audio_output(struct trx_thread_state *state, signed char *samples, unsigned int nrsamples) { int16_t *sbuf; unsigned int isamples; if (!nrsamples) return; isamples = audioproc_convertinput_isamples(state, nrsamples); sbuf = alloca(isamples * sizeof(sbuf[0])); memset(sbuf, 0, isamples * sizeof(sbuf[0])); audioproc_convertinput(state, isamples, nrsamples, sbuf, samples); } /* ---------------------------------------------------------------------- */ #endif /* HAVE_DIRECTX */ baycomusb-0.10.orig/trxctrl/simd.h0100644000175100017510000001073307326535216015234 0ustar abaaba/*****************************************************************************/ /* * simd.h -- SIMD filter procedures (aka MMX, VIS, etc). * * Copyright (C) 1999-2000 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifndef _SIMD_H #define _SIMD_H /* ---------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "sysdeps.h" /* ---------------------------------------------------------------------- */ /* * SIMD stuff */ #if !defined(__i386__) #undef USEMMX #endif #if !defined(__sparc__) && !defined(__sparc64__) #undef USEVIS #endif #if !defined(USEMMX) && !defined(USEVIS) extern inline void initsimd(int enable) { } extern inline int checksimd(void) { return 0; } extern inline int simdfir16(const int16_t *p1, const int16_t *p2, unsigned int nr) { int s = 0; for (; nr > 0; nr--, p1++, p2++) s += (*p1) * (*p2); return s; } extern inline void simdpreparefpu(void) { } #else extern unsigned int simd_enabled; extern void initsimd(int enable); extern inline int checksimd(void) { return simd_enabled; } #if defined(USEMMX) #define MMXCLOBBER "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)" extern inline int simdfir16(const int16_t *p1, const int16_t *p2, unsigned int nr) { unsigned int i, j; int s = 0; if (checksimd()) { j = nr >> 2; nr &= 3; asm volatile("pxor\t%%mm0,%%mm0" : : : MMXCLOBBER); for (i = 0; i < j; i++, p1 += 4, p2 += 4) asm volatile("\n\tmovq\t%0,%%mm1" "\n\tpmaddwd\t%1,%%mm1" "\n\tpaddd\t%%mm1,%%mm0" : : "m" (*p1), "m" (*p2) : MMXCLOBBER); asm volatile("\n\tmovq\t%%mm0,%%mm1 " "\n\tpunpckhdq\t%%mm1,%%mm1" "\n\tpaddd\t%%mm1,%%mm0" "\n\tmovd\t%%mm0,%0" : "=m" (s) : : MMXCLOBBER); } for (; nr > 0; nr--, p1++, p2++) s += (*p1) * (*p2); return s; } extern inline void simdpreparefpu(void) { if (checksimd()) asm volatile("emms"); } #elif defined(USEVIS) /*extern inline*/static int simdfir16(const int16_t *p1, const int16_t *p2, unsigned int nr) { double dsum1, dsum2, dsum3, dsum4, arg1, arg2, arg3, arg4; float sum, sum1, sum2; unsigned int i, j; int s = 0, sx[1]; if (checksimd()) { j = nr >> 1; nr &= 1; asm("fzeros %0" : "=f" (sum)); for (i = 0; i < j; i++) { asm volatile("ldda [%2] 0xd2, %0 ! ASI_FL16_P \n\t" "ldda [%3] 0xd2, %1 ! ASI_FL16_P \n\t": "=e" (arg1), "=e" (arg2) : "r" (p1), "r" (p2)); p1++; p2++; asm volatile("ldda [%2] 0xd2, %0 ! ASI_FL16_P \n\t" "ldda [%3] 0xd2, %1 ! ASI_FL16_P \n\t": "=e" (arg3), "=e" (arg4) : "r" (p1), "r" (p2)); p1++; p2++; asm volatile("fmuld8sux16 %L2,%L3,%0 \n\t" "fmuld8ulx16 %L2,%L3,%1 \n\t" : "=&e" (dsum1), "=&e" (dsum2) : "e" (arg1), "e" (arg2)); asm volatile("fmuld8sux16 %L2,%L3,%0 \n\t" "fmuld8ulx16 %L2,%L3,%1 \n\t" : "=&e" (dsum3), "=&e" (dsum4) : "e" (arg3), "e" (arg4)); asm volatile("fpadd32s %L1,%L2,%0" : "=f" (sum1) : "e" (dsum1), "e" (dsum2)); asm volatile("fpadd32s %L1,%L2,%0" : "=f" (sum2) : "e" (dsum3), "e" (dsum4)); asm volatile("fpadd32s %1,%2,%0" : "=f" (sum) : "f" (sum1), "f" (sum)); asm volatile("fpadd32s %1,%2,%0" : "=f" (sum) : "f" (sum2), "f" (sum)); }; asm("st %1,%0" : "=m" (sx) : "f" (sum)); s = sx[0]; } for (; nr > 0; nr--, p1++, p2++) s += (*p1) * (*p2); return s; } extern inline void simdpreparefpu(void) { } #endif #endif /* ---------------------------------------------------------------------- */ #endif /* _SIMD_H */ baycomusb-0.10.orig/trxctrl/coeff.m0100644000175100017510000000116707325134424015363 0ustar abaaba% fs=16000; overs=16; fg1=3500; fg2=4500; flen=16; %c=remez(overs*flen-1,[ 0 2*fg1/fs/overs 2*fg2/fs/overs 1 ], [ 1 1 0 0 ]); c=sinc((0.5-overs*flen/2:overs*flen/2-0.5)*(2*fg2/fs/overs)).*hamming(overs*flen)'; for t=1:overs, tt(t) = sum(abs(c(t:16:overs*flen))); end; c=c./max(tt); t1=fft(c); plot((0:overs*flen-1)*fs/flen,20*log10(abs(t1))); fid=fopen('filter.txt','w'); fprintf(fid,'static const int16_t rxfilter[%d][%d] = {\n',overs,flen); for t=1:overs, fprintf(fid,'\t{ '); for tt=0:flen-1, fprintf(fid, '%6d, ', round(c(tt*overs+t) * 65536)); end; fprintf(fid,'},\n'); end; fprintf(fid,'};'); fclose(fid); baycomusb-0.10.orig/flexdrv/0042755000175100017510000000000007340500011014055 5ustar abaababaycomusb-0.10.orig/flexdrv/Makefile.in0100644000175100017510000002445407340500011016126 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ EXTRA_DIST = bayusb.c bayusb_old.c bayusb_old2.c bayusb_orb.c bayusb.rc driver.c drv32.h flexdriv.def flexdrv.h resource.h INCLUDES = @ORBIT_CFLAGS@ -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/main -I$(top_srcdir)/trxapi -I$(top_srcdir)/trxctrl -I$(top_srcdir)/usbdrv -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 noinst_DATA = libtrxapi.a libusb.a @WIN32_TRUE@@DIRECTX_TRUE@DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32 @WIN32_TRUE@@DIRECTX_FALSE@DIRECTXLIBS = @WIN32_TRUE@@DIRECTX_TRUE@AUDIOOBJ = ../trxctrl/audiowin32.o @WIN32_TRUE@@DIRECTX_FALSE@AUDIOOBJ = @WIN32_TRUE@@ORBITIPC_TRUE@DEFNAME = flexdrivorbit.def @WIN32_TRUE@@ORBITIPC_FALSE@DEFNAME = flexdriv.def @WIN32_TRUE@noinst_LIBRARIES = libflxdrv.a @WIN32_TRUE@libflxdrv_a_SOURCES = driver.c bayusb.c @WIN32_TRUE@DLLNAME = bayusb @WIN32_TRUE@DLLOBJ = driver.o bayusb.o bayusb.res ../trxctrl/common.o ../trxctrl/simd.o ../trxctrl/costab.o ../trxctrl/mainwin32.o ../trxctrl/cfgadapt.o ../trxctrl/cfgwin32.o ../trxctrl/audio.o $(AUDIOOBJ) ../trxapi/libtrxapi.a ../trxapi/libtrxapiserver.a ../misc/libmisc.a ../usbdrv/libusb.a @WIN32_TRUE@DLLLDARGS = @ORBIT_LIBS@ $(DIRECTXLIBS) @LIBS@ @WIN32_TRUE@DLLDEF = --def $(srcdir)/$(DEFNAME) @WIN32_TRUE@noinst_SCRIPTS = $(DLLNAME).dll mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libflxdrv_a_LIBADD = @WIN32_TRUE@libflxdrv_a_OBJECTS = driver.$(OBJEXT) bayusb.$(OBJEXT) SCRIPTS = $(noinst_SCRIPTS) CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DATA = $(noinst_DATA) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(libflxdrv_a_SOURCES) OBJECTS = $(libflxdrv_a_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps flexdrv/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstLIBRARIES: clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) distclean-noinstLIBRARIES: maintainer-clean-noinstLIBRARIES: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: libflxdrv.a: $(libflxdrv_a_OBJECTS) $(libflxdrv_a_DEPENDENCIES) -rm -f libflxdrv.a $(AR) cru libflxdrv.a $(libflxdrv_a_OBJECTS) $(libflxdrv_a_LIBADD) $(RANLIB) libflxdrv.a 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = flexdrv 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 $(LIBRARIES) $(SCRIPTS) $(DATA) 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-noinstLIBRARIES mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-noinstLIBRARIES distclean-compile \ distclean-tags distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ 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-noinstLIBRARIES distclean-noinstLIBRARIES \ clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile 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 @WIN32_TRUE@bayusb.res: bayusb.rc resource.h @WIN32_TRUE@ $(WINDRES) $< -O coff -o $@ @WIN32_TRUE@$(DLLNAME).dll lib$(DLLNAME).a: $(DLLOBJ) @WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) @WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ) @WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) @WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ) @WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) @WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --output-lib lib$(DLLNAME).a $(DLLOBJ) @WIN32_TRUE@libtrxapi.a: libbayusb.a @WIN32_TRUE@ cp $< $@ @WIN32_TRUE@libusb.a: libbayusb.a @WIN32_TRUE@ cp $< $@ @WIN32_FALSE@libtrxapi.a: ../trxapi/libtrxapi.a @WIN32_FALSE@ cp $< $@ @WIN32_FALSE@libusb.a: ../usbdrv/libusb.a @WIN32_FALSE@ cp $< $@ # 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: baycomusb-0.10.orig/flexdrv/Makefile.am0100644000175100017510000000404407331751660016130 0ustar abaabaEXTRA_DIST = bayusb.c bayusb_old.c bayusb_old2.c bayusb_orb.c \ bayusb.rc driver.c drv32.h flexdriv.def flexdrv.h resource.h INCLUDES = @ORBIT_CFLAGS@ -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/main -I$(top_srcdir)/trxapi \ -I$(top_srcdir)/trxctrl -I$(top_srcdir)/usbdrv -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 noinst_DATA = libtrxapi.a libusb.a if WIN32 if DIRECTX DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32 AUDIOOBJ = ../trxctrl/audiowin32.o else DIRECTXLIBS = AUDIOOBJ = endif if ORBITIPC DEFNAME = flexdrivorbit.def else DEFNAME = flexdriv.def endif noinst_LIBRARIES = libflxdrv.a libflxdrv_a_SOURCES = driver.c bayusb.c bayusb.res: bayusb.rc resource.h $(WINDRES) $< -O coff -o $@ DLLNAME = bayusb DLLOBJ = driver.o bayusb.o bayusb.res \ ../trxctrl/common.o ../trxctrl/simd.o ../trxctrl/costab.o ../trxctrl/mainwin32.o \ ../trxctrl/cfgadapt.o ../trxctrl/cfgwin32.o ../trxctrl/audio.o $(AUDIOOBJ) \ ../trxapi/libtrxapi.a ../trxapi/libtrxapiserver.a ../misc/libmisc.a ../usbdrv/libusb.a DLLLDARGS = @ORBIT_LIBS@ $(DIRECTXLIBS) @LIBS@ DLLDEF = --def $(srcdir)/$(DEFNAME) noinst_SCRIPTS = $(DLLNAME).dll $(DLLNAME).dll lib$(DLLNAME).a: $(DLLOBJ) $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ) $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ) $(CC) -mdll -mno-cygwin -Wl,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --output-lib lib$(DLLNAME).a $(DLLOBJ) libtrxapi.a: libbayusb.a cp $< $@ libusb.a: libbayusb.a cp $< $@ else libtrxapi.a: ../trxapi/libtrxapi.a cp $< $@ libusb.a: ../usbdrv/libusb.a cp $< $@ endif baycomusb-0.10.orig/flexdrv/bayusb.c0100644000175100017510000005004507340477747015542 0ustar abaaba/*****************************************************************************/ /* * bayusb.c -- FlexNet driver for Baycom USB modem. * * Copyright (C) 1999-2000, 2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * * History: * 0.1 23.06.1999 Created * 0.2 07.01.2000 Expanded to usbdevfs capabilities * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include //#include "flexdrv.h" #include "resource.h" /* --------------------------------------------------------------------- */ #include "trx.h" #include "win32client.h" #define VERBOSE #ifdef VERBOSE #define verbose(x) x #else #define verbose(x) #endif /* --------------------------------------------------------------------- */ #define DRIVER_NAME "BaycomUSB" #define DRIVER_VERSION "0.2" #define APIFLG_COUNTMASK 0x0ffff #define APIFLG_TERMINATE 0x10000 #define APIFLG_CLOSE 0x20000 static struct state { struct trxapi *api; unsigned int apiflags; CRITICAL_SECTION apilock; HANDLE hdevlife; char serial[16]; /* device serial number, or NULL string for any device */ char devname[32]; u16 mode; UINT calibtimer; L1FRAME txframe; L1_STATISTICS stat; } state = { 0, }; /* ----------------------------------------------------------------------- */ static struct trx_thread_state *api_lock() { struct trx_thread_state *servant = NULL; const struct trxapi_description *desc; struct trxapi *api; unsigned int i; EnterCriticalSection(&state.apilock); if (state.apiflags & (APIFLG_TERMINATE|APIFLG_CLOSE)) goto out; if (!state.api) { for (i = 0;; i++) { if (!(api = win32shmem_open_byindex(i))) break; desc = win32shmem_get_description(api); if (desc && (!state.serial[0] || !strcmp(desc->instid, state.serial))) break; win32shmem_close(api); } if (api) { snprintf(state.devname, sizeof(state.devname), "%s (%s)", desc->model, desc->instid); servant = api->state; win32shmem_lock(api); if (servant->mode == MODE_DEAD || servant->flexnetlock) { win32shmem_unlock(api); win32shmem_close(api); } else { servant->flexnetlock = 1; win32shmem_unlock(api); SetEvent(state.hdevlife); state.api = api; } } } if (!state.api) goto out; servant = state.api->state; if (servant->mode == MODE_DEAD) { servant = NULL; state.apiflags |= APIFLG_CLOSE; SetEvent(state.api->hflxrxevent); if (!(state.apiflags & APIFLG_COUNTMASK)) { win32shmem_lock(state.api); state.api->state->flexnetlock = 0; win32shmem_unlock(state.api); win32shmem_close(state.api); state.api = NULL; state.apiflags &= ~APIFLG_CLOSE; SetEvent(state.hdevlife); } goto out; } state.apiflags = (state.apiflags & ~APIFLG_COUNTMASK) | ((state.apiflags + 1) & APIFLG_COUNTMASK); out: LeaveCriticalSection(&state.apilock); return servant; } static void api_unlock(void) { EnterCriticalSection(&state.apilock); state.apiflags = (state.apiflags & ~APIFLG_COUNTMASK) | ((state.apiflags - 1) & APIFLG_COUNTMASK); if ((state.apiflags & APIFLG_CLOSE) && !(state.apiflags & APIFLG_COUNTMASK)) { win32shmem_lock(state.api); state.api->state->flexnetlock = 0; win32shmem_unlock(state.api); win32shmem_close(state.api); state.api = NULL; state.apiflags &= ~APIFLG_CLOSE; SetEvent(state.hdevlife); } LeaveCriticalSection(&state.apilock); } static void api_close(void) { EnterCriticalSection(&state.apilock); if (state.api) { state.apiflags |= APIFLG_CLOSE; SetEvent(state.api->hflxrxevent); if (!(state.apiflags & APIFLG_COUNTMASK)) { win32shmem_lock(state.api); state.api->state->flexnetlock = 0; win32shmem_unlock(state.api); win32shmem_close(state.api); state.api = NULL; state.apiflags &= ~APIFLG_CLOSE; SetEvent(state.hdevlife); } } LeaveCriticalSection(&state.apilock); } /* ----------------------------------------------------------------------- */ /* * Treiber-Init. Sofern mehrfach aufgerufen, kommt vorher jeweils l1_exit() * Hier also alle Ressourcen allokieren, aber noch nicht starten sofern * dazu die Parameter gebraucht werden. Die kommen spaeter per l1_init_kanal() */ int init_device(HKEY hKey) { DWORD regtype, reglen; verboselevel = ~0; syslogmsg = 1; /* get serial from registry */ reglen = sizeof(state.serial); if (RegQueryValueEx(hKey, "SerialNumber", NULL, ®type, state.serial, ®len) != ERROR_SUCCESS || regtype != REG_SZ) state.serial[0] = 0; state.serial[sizeof(state.serial)-1] = 0; state.api = NULL; state.apiflags = 0; InitializeCriticalSection(&state.apilock); state.hdevlife = CreateEvent(NULL, FALSE, FALSE, "FlexNet Device State"); return 1; } /* ------------------------------------------------------------------------- */ void l1_exit(HKEY hKey) { EnterCriticalSection(&state.apilock); state.apiflags |= APIFLG_TERMINATE; LeaveCriticalSection(&state.apilock); api_close(); l1_init_kanal(0, 0, MODE_off); RegSetValueEx(hKey, "SerialNumber", 0, REG_SZ, state.serial, strlen(state.serial)+1); EnterCriticalSection(&state.apilock); while (state.api) { LeaveCriticalSection(&state.apilock); Sleep(10); EnterCriticalSection(&state.apilock); } LeaveCriticalSection(&state.apilock); CloseHandle(state.hdevlife); DeleteCriticalSection(&state.apilock); } /* ------------------------------------------------------------------------- */ byte *config_info(byte kanal) { if (kanal) return 0; return state.devname; } /* ------------------------------------------------------------------------- */ static void setdlgitems(HWND hDlg) { struct trxapi *api; const struct trxapi_description *desc; struct trx_thread_state *servant; char buf[32]; unsigned int i; HWND hcombo; GetDlgItemText(hDlg, IDC_SERIAL, buf, sizeof(buf)); if (!strcmp(buf, "Any")) buf[0] = 0; if (!buf[0]) { api = win32shmem_open_byindex(0); } else { for (i = 0;; i++) { if (!(api = win32shmem_open_byindex(i))) break; desc = win32shmem_get_description(api); if (desc) { if (!strcmp(desc->instid, buf)) break; } win32shmem_close(api); } } if (!api) { lprintf(10, "No modem found\n"); /* gray out dialog */ hcombo = GetDlgItem(hDlg, IDC_MODE); ComboBox_ResetContent(hcombo); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"-"); SendDlgItemMessage(hDlg, IDC_BITRATERX, EM_SETREADONLY, 1, 0); SendDlgItemMessage(hDlg, IDC_BITRATETX, EM_SETREADONLY, 1, 0); SendDlgItemMessage(hDlg, IDC_TXDELAY, EM_SETREADONLY, 1, 0); CheckDlgButton(hDlg, IDC_FULLDUPLEX, BST_INDETERMINATE); CheckDlgButton(hDlg, IDC_PTTMUTE, BST_INDETERMINATE); return; } servant = api->state; hcombo = GetDlgItem(hDlg, IDC_MODE); ComboBox_ResetContent(hcombo); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"-"); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"fsk"); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"afsk"); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"external"); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"audio"); switch (servant->cfg.adapt.mode) { case trxapi_baycomusb_mode_fsk: ComboBox_SetCurSel(hcombo, 1); break; case trxapi_baycomusb_mode_external: ComboBox_SetCurSel(hcombo, 3); break; case trxapi_baycomusb_mode_afsk: ComboBox_SetCurSel(hcombo, 2); break; case trxapi_baycomusb_mode_audio: ComboBox_SetCurSel(hcombo, 4); break; default: ComboBox_SetCurSel(hcombo, 0); break; } SendDlgItemMessage(hDlg, IDC_BITRATERX, EM_SETREADONLY, 0, 0); snprintf(buf, sizeof(buf), "%ld", servant->cfg.adapt.bitraterx); SetDlgItemText(hDlg, IDC_BITRATERX, buf); SendDlgItemMessage(hDlg, IDC_BITRATETX, EM_SETREADONLY, 0, 0); snprintf(buf, sizeof(buf), "%ld", servant->cfg.adapt.bitratetx); SetDlgItemText(hDlg, IDC_BITRATETX, buf); SendDlgItemMessage(hDlg, IDC_TXDELAY, EM_SETREADONLY, 0, 0); snprintf(buf, sizeof(buf), "%ld", servant->cfg.chacc.txdelay); SetDlgItemText(hDlg, IDC_TXDELAY, buf); CheckDlgButton(hDlg, IDC_FULLDUPLEX, servant->cfg.chacc.fulldup ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hDlg, IDC_PTTMUTE, servant->cfg.adapt.pttmute ? BST_CHECKED : BST_UNCHECKED); win32shmem_close(api); } static unsigned int getdlgitems(HWND hDlg) { struct trxapi *api; const struct trxapi_description *desc; struct trx_thread_state *servant; struct trxapi_baycomusb_adapter_config cf; char buf[32]; unsigned int restart, i; GetDlgItemText(hDlg, IDC_SERIAL, buf, sizeof(buf)); if (!strcmp(buf, "Any")) buf[0] = 0; restart = strcmp(buf, state.serial); strncpy(state.serial, buf, sizeof(state.serial)); if (!buf[0]) { api = win32shmem_open_byindex(0); } else { for (i = 0;; i++) { if (!(api = win32shmem_open_byindex(i))) break; desc = win32shmem_get_description(api); if (desc) { if (!strcmp(desc->instid, buf)) break; } win32shmem_close(api); } } if (!api) { lprintf(10, "No modem found\n"); return restart; } servant = api->state; cf = servant->cfg.adapt; GetDlgItemText(hDlg, IDC_MODE, buf, sizeof(buf)); if (!strcmp(buf, "fsk")) cf.mode = trxapi_baycomusb_mode_fsk; else if (!strcmp(buf, "external")) cf.mode = trxapi_baycomusb_mode_external; else if (!strcmp(buf, "afsk")) cf.mode = trxapi_baycomusb_mode_afsk; else if (!strcmp(buf, "audio")) cf.mode = trxapi_baycomusb_mode_audio; GetDlgItemText(hDlg, IDC_BITRATERX, buf, sizeof(buf)); cf.bitraterx = strtoul(buf, NULL, 0); GetDlgItemText(hDlg, IDC_BITRATETX, buf, sizeof(buf)); cf.bitratetx = strtoul(buf, NULL, 0); GetDlgItemText(hDlg, IDC_TXDELAY, buf, sizeof(buf)); servant->cfg.chacc.txdelay = strtoul(buf, NULL, 0); servant->cfg.chacc.fulldup = IsDlgButtonChecked(hDlg, IDC_FULLDUPLEX) == BST_CHECKED; cf.pttmute = IsDlgButtonChecked(hDlg, IDC_PTTMUTE) == BST_CHECKED; if (checkreload_adapt(servant, &cf)) servant->flags |= FLG_RELOADMODEM; servant->cfg.adapt = cf; servant->flags |= FLG_SAVECONFIG; win32shmem_close(api); return restart; } static BOOL CALLBACK EdParmDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { struct trxapi *api; const struct trxapi_description *desc; HWND hcombo; unsigned int restart, i, index; int cursel; switch (uMsg) { case WM_INITDIALOG: hcombo = GetDlgItem(hDlg, IDC_SERIAL); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"Any"); cursel = state.serial[0] ? -1 : 0; for (index = 0, i = 1;; index++) { if (!(api = win32shmem_open_byindex(index))) break; desc = win32shmem_get_description(api); if (desc) { SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)desc->instid); if (!strcmp(desc->instid, state.serial)) cursel = i; i++; } win32shmem_close(api); } ComboBox_SetCurSel(hcombo, cursel); SetWindowText(hDlg, DRIVER_NAME" Configuration"); setdlgitems(hDlg); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: EndDialog(hDlg, 0); break; case IDOK: restart = getdlgitems(hDlg); EndDialog(hDlg, restart); break; case IDC_SERIAL: setdlgitems(hDlg); break; case IDC_FULLDUPLEX: case IDC_PTTMUTE: if (GET_WM_COMMAND_CMD(wParam, lParam) != BN_CLICKED) break; switch (IsDlgButtonChecked(hDlg, GET_WM_COMMAND_ID(wParam, lParam))) { case BST_CHECKED: CheckDlgButton(hDlg, GET_WM_COMMAND_ID(wParam, lParam), BST_UNCHECKED); break; case BST_UNCHECKED: CheckDlgButton(hDlg, GET_WM_COMMAND_ID(wParam, lParam), BST_CHECKED); break; } break; default: break; } break; default: return FALSE; } return TRUE; } /* ------------------------------------------------------------------------- */ int config_device(byte max_channels, HWND hDlg, byte channel) { int restart = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hDlg, EdParmDlgProc, 0); if (restart) api_close(); return restart; } /* ------------------------------------------------------------------------- */ u16 l1_get_ch_cnt(void) { return 1; } /* ------------------------------------------------------------------------- */ byte get_txdelay(byte kanal) { struct trx_thread_state *servant; byte ret = 0; if (kanal) return 0; servant = api_lock(); if (!servant) return 0; ret = servant->cfg.chacc.txdelay / 10; api_unlock(); return ret; } void set_txdelay(byte kanal, byte delay) { struct trx_thread_state *servant; if (kanal) return; servant = api_lock(); if (!servant) return; servant = state.api->state; win32shmem_lock(state.api); servant->cfg.chacc.txdelay = delay * 10; servant->flags |= FLG_SAVECONFIG; win32shmem_unlock(state.api); api_unlock(); } u16 get_mode(byte kanal) { struct trx_thread_state *servant; u16 ret = state.mode & ~MODE_d; if (kanal) return 0; servant = api_lock(); if (!servant) return ret; if (servant->cfg.chacc.fulldup) ret |= MODE_d; api_unlock(); return ret; } u16 get_baud(byte kanal) { struct trx_thread_state *servant; u16 ret = 0; if (kanal) return 0; servant = api_lock(); if (!servant) return 0; ret = servant->cfg.adapt.bitratetx / 100; api_unlock(); return ret; } /* ------------------------------------------------------------------------- */ byte l1_init_kanal(byte kanal, u16 chbaud, u16 chmode) { state.mode = chmode; return 1; } /* ------------------------------------------------------------------------- */ byte l1_ch_active(byte kanal) { return state.api != NULL; } /* ------------------------------------------------------------------------- */ char far *l1_ident(byte kanal) { return DRIVER_NAME; } /* ------------------------------------------------------------------------- */ char far *l1_version(byte kanal) { return DRIVER_VERSION; } /* ------------------------------------------------------------------------- */ L1_STATISTICS far *l1_stat(byte kanal, byte delete) { L1_STATISTICS *p = &state.stat; if (delete) p->tx_error = p->rx_overrun = p->rx_bufferoverflow = p->tx_frames = p->rx_frames = p->io_error = 0; return p; } /* ------------------------------------------------------------------------- */ void set_led(byte kanal, byte ledcode) { struct trx_thread_state *servant; if (!(servant = api_lock())) return; win32shmem_lock(state.api); servant->leds = ((ledcode & LED_CON) ? 1 : 0) | ((ledcode & LED_STA) ? 2 : 0); servant->flags |= FLG_SETLEDS; win32shmem_unlock(state.api); api_unlock(); } /* ------------------------------------------------------------------------- */ /* * state and servant must be locked! */ static unsigned int compute_state(struct trx_thread_state *servant, unsigned int *nextrx, unsigned int *nexttx) { unsigned int nrtx = 0, nrrx = 0, nxttx, nxtrx, i; unsigned int st = 0; if (servant->mode != MODE_FSK && servant->mode != MODE_EXTERNAL && servant->mode != MODE_AFSK) goto nopkt; /* find tx packet */ for (i = 0; i < NUMTXPACKETS; i++) { if (servant->du.p.txurb[i].urbstate == URBSTATE_UNUSED) { if (!nrtx) nxttx = i; nrtx++; continue; } if (servant->du.p.txurb[i].urbstate == URBSTATE_FILLED) { nrtx = 0; continue; } } /* find rx packet */ i = servant->du.p.rxurbptr; do { if (servant->du.p.rxurb[i].urbstate == URBSTATE_CORBASEND) servant->du.p.rxurb[i].urbstate = URBSTATE_UNUSED; /* stop at INPROGRESS urbs */ if (servant->du.p.rxurb[i].urbstate == URBSTATE_DONE) { if (!nrrx) nxtrx = i; nrrx++; } else if (servant->du.p.rxurb[i].urbstate != URBSTATE_UNUSED) break; i = (i + 1) % NUMRXPACKETS; } while (i != servant->du.p.rxurbptr); nopkt: if (!nrrx) nxtrx = ~0; if (!nrtx) nxttx = ~0; if (nextrx) *nextrx = nxtrx; if (nexttx) *nexttx = nxttx; /* update status */ if (servant->ptt) st |= CH_PTT; if (servant->dcd) st |= CH_DCD; if (nrrx > 0) st |= CH_RXB; if (!nrtx) st |= CH_TBY; return st; } byte l1_ch_state(byte kanal) { struct trx_thread_state *servant; byte ret; if (kanal) return CH_DEAD; if (!(servant = api_lock())) return CH_DEAD; win32shmem_lock(state.api); ret = compute_state(servant, NULL, NULL); win32shmem_unlock(state.api); api_unlock(); return ret; } /* ------------------------------------------------------------------------- */ u16 l1_scale(byte kanal) { struct trx_thread_state *servant; unsigned long br; u16 ret = 0; if (kanal) return 0; if (!(servant = api_lock())) return 0; win32shmem_lock(state.api); br = servant->cfg.adapt.bitratetx; if (br >= 10) ret = 614400 / br; win32shmem_unlock(state.api); api_unlock(); return ret; } /* ------------------------------------------------------------------------- */ static void CALLBACK stopcalib(HWND hwnd, UINT umsg, UINT idevent, DWORD dwtime) { if (!api_lock()) return; win32shmem_set_ptt(state.api, 0); api_unlock(); } void l1_tx_calib(byte kanal, byte minutes) { if (state.calibtimer) KillTimer(NULL, state.calibtimer); if (!api_lock()) return; if (win32shmem_set_ptt(state.api, 1)) { state.calibtimer = SetTimer(NULL, 0, minutes * 60000, stopcalib); if (!state.calibtimer) stopcalib(NULL, 0, 0, 0); } api_unlock(); } /* ------------------------------------------------------------------------- */ L1FRAME far *l1_get_framebuf(byte kanal) { if (kanal) return NULL; return &state.txframe; } byte l1_tx_frame(void) { struct trx_thread_state *servant; unsigned int i, txd; if (!(servant = api_lock())) { state.stat.io_error++; return 1; } win32shmem_lock(state.api); compute_state(servant, NULL, &i); if (i >= NUMTXPACKETS) goto errpkt; if (servant->mode != MODE_FSK && servant->mode != MODE_EXTERNAL && servant->mode != MODE_AFSK) goto errio; if (state.txframe.len > sizeof(servant->du.p.txurb[i].b)-2) goto errio; txd = state.txframe.txdelay; if (!txd) txd = servant->cfg.chacc.txdelay / 10; txd *= servant->txdmul; if (!txd) txd = 1; servant->du.p.txurb[i].urb.buffer_length = state.txframe.len + 2; memcpy(&servant->du.p.txurb[i].b.buf[2], state.txframe.frame, state.txframe.len); servant->du.p.txurb[i].b.buf[0] = txd; servant->du.p.txurb[i].b.buf[1] = txd >> 8; servant->du.p.txurb[i].urbstate = URBSTATE_FILLED; win32shmem_unlock(state.api); win32shmem_wakeup(state.api); api_unlock(); state.stat.tx_frames++; return 1; errio: win32shmem_unlock(state.api); api_unlock(); state.stat.io_error++; return 1; errpkt: win32shmem_unlock(state.api); api_unlock(); return 0; } /* ------------------------------------------------------------------------- */ /* * RX-Thread. Wartet auf RX-Bytes, verarbeitet sie und returned wenn * Handle zu oder Paket komplett */ L1FRAME far *l1_rx_frame(void) { struct trx_thread_state *servant; unsigned int i; L1FRAME *rxframe; if (!(servant = api_lock())) return NULL; while (!(state.apiflags & (APIFLG_TERMINATE|APIFLG_CLOSE))) { win32shmem_lock(state.api); compute_state(servant, &i, NULL); if (i < NUMRXPACKETS) { rxframe = &servant->du.p.rxurb[i].b.frame; rxframe->kanal = 0; rxframe->txdelay = 0; rxframe->len = servant->du.p.rxurb[i].urb.actual_length-2; servant->du.p.rxurb[i].urbstate = URBSTATE_CORBASEND; win32shmem_unlock(state.api); api_unlock(); return rxframe; } win32shmem_unlock(state.api); WaitForSingleObject(state.api->hflxrxevent, 10); } api_unlock(); return NULL; } /* ------------------------------------------------------------------------- */ baycomusb-0.10.orig/flexdrv/bayusb_old.c0100644000175100017510000003131307325134424016356 0ustar abaaba/*****************************************************************************/ /* * bayusb.c -- FlexNet driver for Baycom USB modem. * * Copyright (C) 1999-2000 * Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * * History: * 0.1 23.06.1999 Created * 0.2 07.01.2000 Expanded to usbdevfs capabilities * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "flexdrv.h" #include "resource.h" #include "pktio.h" #include "baycomusb.h" /* --------------------------------------------------------------------- */ #define DRIVER_NAME "BaycomUSB" #define DRIVER_VERSION "0.1" #define RX_RUNNING 0 #define RX_RESTART 1 #define RX_TERMINATE 2 #define TX_NORMAL 0 #define TX_LOCKPKT 1 #define TX_TERMINATE 2 struct pkthandle { struct pktio *pkt; unsigned int refcnt; }; static struct state { volatile unsigned int terminate; volatile unsigned int rxactive; struct pkthandle *pkt; struct configentry *cfg; char serial[16]; /* device serial number, or NULL string for any device */ char devname[32]; byte baud; byte mode; byte status; unsigned int scale; unsigned int txdelay; UINT calibtimer; unsigned int stopcalib; HANDLE hdevlife; HANDLE hpktmutex; L1FRAME txframe; L1FRAME rxframe; L1_STATISTICS stat; } state = { 0, }; #define REGISTRYPATH "SOFTWARE\\FlexNet\\BaycomUSB" #define REGHKEY HKEY_LOCAL_MACHINE /* ------------------------------------------------------------------------- */ int lprintf(unsigned vl, const char *format, ...) { va_list ap; char buf[512]; int r; va_start(ap, format); r = vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); OutputDebugString(buf); return r; } /* ----------------------------------------------------------------------- */ static struct pkthandle *pktget(void) { struct pkthandle *r; WaitForSingleObject(state.hpktmutex, INFINITE); r = state.pkt; if (r) r->refcnt++; ReleaseMutex(state.hpktmutex); return r; } static void pktput(struct pkthandle *pkt) { unsigned int r; if (!pkt) return; WaitForSingleObject(state.hpktmutex, INFINITE); if (pkt->refcnt) pkt->refcnt--; r = pkt->refcnt; ReleaseMutex(state.hpktmutex); if (r) return; pkt_close(pkt->pkt); free(pkt); } static void pktrelease(void) { struct pkthandle *pkt; unsigned int r = 1; WaitForSingleObject(state.hpktmutex, INFINITE); pkt = state.pkt; state.pkt = NULL; if (pkt) { if (pkt->refcnt) pkt->refcnt--; r = pkt->refcnt; } ReleaseMutex(state.hpktmutex); if (r) return; pkt_close(pkt->pkt); free(pkt); } static void pktopen(void) { struct pkthandle *pkt = malloc(sizeof(struct pkthandle)); struct pkthandle *pkt2; if (!pkt) return; pkt->refcnt = 1; pkt->pkt = pkt_open(state.serial, 0); if (!pkt->pkt) { free(pkt); return; } WaitForSingleObject(state.hpktmutex, INFINITE); pkt2 = state.pkt; state.pkt = pkt; ReleaseMutex(state.hpktmutex); if (pkt2) pktput(pkt2); } /* ----------------------------------------------------------------------- */ /* * Treiber-Init. Sofern mehrfach aufgerufen, kommt vorher jeweils l1_exit() * Hier also alle Ressourcen allokieren, aber noch nicht starten sofern * dazu die Parameter gebraucht werden. Die kommen spaeter per l1_init_kanal() */ int init_device(HKEY hKey) { DWORD regtype, reglen; reglen = sizeof(state.serial); if (RegQueryValueEx(hKey, "SerialNumber", NULL, ®type, state.serial, ®len) != ERROR_SUCCESS || regtype != REG_SZ) state.serial[0] = 0; state.serial[sizeof(state.serial)-1] = 0; state.terminate = state.rxactive = 0; state.status = CH_DEAD; state.cfg = NULL; state.hdevlife = CreateEvent(NULL, FALSE, FALSE, "FlexNet Device State"); state.hpktmutex = CreateMutex(NULL, FALSE, NULL); return 1; } /* ------------------------------------------------------------------------- */ void l1_exit(HKEY hKey) { state.terminate = 1; while (state.rxactive) Sleep(10); pktrelease(); l1_init_kanal(0, 0, MODE_off); RegSetValueEx(hKey, "SerialNumber", 0, REG_SZ, state.serial, strlen(state.serial)+1); CloseHandle(state.hdevlife); CloseHandle(state.hpktmutex); } /* ------------------------------------------------------------------------- */ byte *config_info(byte kanal) { return state.devname; } /* ------------------------------------------------------------------------- */ static BOOL CALLBACK EdParmDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hcombo; HKEY regkey; LONG err; DWORD index; DWORD len; char buf[32]; unsigned int restart, i; int cursel; switch (uMsg) { case WM_INITDIALOG: hcombo = GetDlgItem(hDlg, IDC_SERIAL); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"Any"); err = RegOpenKeyEx(REGHKEY, REGISTRYPATH, 0, KEY_READ, ®key); if (err == ERROR_SUCCESS) { cursel = state.serial[0] ? -1 : 0; for (i = 1, index = 0;; index++) { len = sizeof(buf); if ((RegEnumKeyEx(regkey, index, buf, &len, NULL, NULL, NULL, NULL)) != ERROR_SUCCESS) break; if (buf[0] >= '0' && buf[0] <= '9') { SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)buf); if (!strcmp(buf, state.serial)) cursel = i; i++; } } ComboBox_SetCurSel(hcombo, cursel); RegCloseKey(regkey); } SetWindowText(hDlg, DRIVER_NAME" Configuration"); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: EndDialog(hDlg, 0); break; case IDOK: GetDlgItemText(hDlg, IDC_SERIAL, buf, sizeof(buf)); if (buf[0] < '0' || buf[0] > '9') buf[0] = 0; restart = strcmp(buf, state.serial); strncpy(state.serial, buf, sizeof(state.serial)); EndDialog(hDlg, restart); break; default: break; } break; default: return FALSE; } return TRUE; } /* ------------------------------------------------------------------------- */ int config_device(byte max_channels, HWND hDlg, byte channel) { int restart = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hDlg, EdParmDlgProc, 0); if (restart) pktrelease(); return restart; } /* ------------------------------------------------------------------------- */ u16 l1_get_ch_cnt(void) { return 1; } /* ------------------------------------------------------------------------- */ byte get_txdelay(byte kanal) { byte txd = 0; if (state.cfg) txd = state.cfg->chaccess.txdelay / 10; lprintf(10, "get_txdelay: %u\n", txd); return txd; } void set_txdelay(byte kanal, byte delay) { if (state.cfg) state.cfg->chaccess.txdelay = 10 * delay; } u16 get_mode(byte kanal) { return state.mode; } u16 get_baud(byte kanal) { return state.baud; } /* ------------------------------------------------------------------------- */ byte l1_init_kanal(byte kanal, u16 chbaud, u16 chmode) { state.mode = chmode; return 1; } /* ------------------------------------------------------------------------- */ byte l1_ch_active(byte kanal) { return 1; } /* ------------------------------------------------------------------------- */ char far *l1_ident(byte kanal) { return DRIVER_NAME; } /* ------------------------------------------------------------------------- */ char far *l1_version(byte kanal) { return DRIVER_VERSION; } /* ------------------------------------------------------------------------- */ L1_STATISTICS far *l1_stat(byte kanal, byte delete) { L1_STATISTICS *p = &state.stat; if (delete) p->tx_error = p->rx_overrun = p->rx_bufferoverflow = p->tx_frames = p->rx_frames = p->io_error = 0; return p; } /* ------------------------------------------------------------------------- */ void set_led(byte kanal, byte ledcode) { #if 0 if (state.active) pkt_setled(state.pkt, ledcode); #endif } /* ------------------------------------------------------------------------- */ byte l1_ch_state(byte kanal) { return state.status; } /* ------------------------------------------------------------------------- */ u16 l1_scale(byte kanal) { return state.scale; } /* ------------------------------------------------------------------------- */ static void CALLBACK stopcalib(HWND hwnd, UINT umsg, UINT idevent, DWORD dwtime) { state.stopcalib = 1; } void l1_tx_calib(byte kanal, byte minutes) { struct pkthandle *pkt = pktget(); if (!pkt) return; if (state.calibtimer) KillTimer(NULL, state.calibtimer); state.stopcalib = 0; pkt_forceptt(pkt->pkt, 1); pktput(pkt); state.calibtimer = SetTimer(NULL, 0, minutes * 60000, stopcalib); if (!state.calibtimer) state.stopcalib = 1; } /* ------------------------------------------------------------------------- */ L1FRAME far *l1_get_framebuf(byte kanal) { return &state.txframe; } byte l1_tx_frame(void) { struct pkthandle *pkt = pktget(); unsigned int txd; int r; if (!pkt) { state.stat.io_error++; return 1; } txd = state.txframe.txdelay; if (!txd && state.cfg) txd = state.cfg->chaccess.txdelay / 10; r = pkt_transmit(pkt->pkt, txd, state.txframe.frame, state.txframe.len); pktput(pkt); if (r == -1) { pktrelease(); state.stat.io_error++; return 1; } if (r < 0) return 0; state.stat.tx_frames++; return 1; } /* ------------------------------------------------------------------------- */ /* * RX-Thread. Wartet auf RX-Bytes, verarbeitet sie und returned wenn * Handle zu oder Paket komplett */ L1FRAME far *l1_rx_frame(void) { struct pkthandle *pkt; unsigned int i; char buf[32]; byte st; int r; state.rxactive = 1; for (;;) { if (state.terminate) { state.rxactive = 0; return NULL; } if (!(pkt = pktget())) { for (;;) { pktopen(); if ((pkt = pktget())) break; state.status = CH_DEAD; SetEvent(state.hdevlife); for (i = 0; i < 20; i++) { if (state.terminate) { state.rxactive = 0; return NULL; } Sleep(50); } } pkt_getserial(pkt->pkt, buf, sizeof(buf)); buf[sizeof(buf)-1] = 0; sprintf(state.devname, "BaycomUSB %s", buf); state.cfg = config_lookup(buf); r = pkt_getbitrate(pkt->pkt); if (r < 1) r = 1; state.scale = 614400 / r; state.baud = r / 100; state.status = 0; SetEvent(state.hdevlife); } if (state.stopcalib) { state.stopcalib = 0; pkt_forceptt(pkt->pkt, 0); } /* update status */ r = pkt_getstatus(pkt->pkt); if (r < 0) { pktput(pkt); pktrelease(); state.stat.io_error++; state.status = CH_DEAD; SetEvent(state.hdevlife); state.rxactive = 0; return NULL; } st = 0; if (r & PKTSTAT_PTT) st |= CH_PTT; if (r & PKTSTAT_DCD) st |= CH_DCD; if (r & PKTSTAT_RXB) st |= CH_RXB; state.status = st; /* try to receive */ if (st & CH_RXB) { r = pkt_receive(pkt->pkt, state.rxframe.frame, sizeof(state.rxframe.frame)); if (r < 0) { pktput(pkt); pktrelease(); state.stat.io_error++; state.status = CH_DEAD; SetEvent(state.hdevlife); state.rxactive = 0; return NULL; } if (r > 0) { pktput(pkt); state.rxframe.len = r; state.rxframe.kanal = 0; state.rxframe.txdelay = 0; state.rxactive = 0; return &state.rxframe; } } pktput(pkt); Sleep(10); } } /* ------------------------------------------------------------------------- */ baycomusb-0.10.orig/flexdrv/bayusb_old2.c0100644000175100017510000003674307325134424016454 0ustar abaaba/*****************************************************************************/ /* * bayusb.c -- FlexNet driver for Baycom USB modem. * * Copyright (C) 1999-2000 * Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * * History: * 0.1 23.06.1999 Created * 0.2 07.01.2000 Expanded to usbdevfs capabilities * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "flexdrv.h" #include "resource.h" #include "trxclient.h" /* --------------------------------------------------------------------- */ #define DRIVER_NAME "BaycomUSB" #define DRIVER_VERSION "0.2" struct pkthandle { struct pktio *pkt; unsigned int refcnt; }; static struct state { unsigned int terminate; Trx_Control obj; HANDLE hobjmutex; HANDLE hdevlife; char serial[16]; /* device serial number, or NULL string for any device */ char devname[32]; byte baud; byte mode; byte status; unsigned int scale; unsigned int txdelay; unsigned int fullduplex; UINT calibtimer; L1FRAME txframe; L1FRAME rxframe; L1_STATISTICS stat; } state = { 0, }; #define REGISTRYPATH "SOFTWARE\\FlexNet\\BaycomUSB" #define REGHKEY HKEY_LOCAL_MACHINE /* ------------------------------------------------------------------------- */ int lprintf(unsigned vl, const char *format, ...) { va_list ap; char buf[512]; int r; va_start(ap, format); r = vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); OutputDebugString(buf); return r; } /* ----------------------------------------------------------------------- */ /* * Treiber-Init. Sofern mehrfach aufgerufen, kommt vorher jeweils l1_exit() * Hier also alle Ressourcen allokieren, aber noch nicht starten sofern * dazu die Parameter gebraucht werden. Die kommen spaeter per l1_init_kanal() */ int init_device(HKEY hKey) { DWORD regtype, reglen, regval; int argc = 0; char *argv[1] = { NULL }; static int orbinit = 1; /* initialize ORB */ if (orbinit && trx_initorb(&argc, argv)) return 0; orbinit = 0; /* get serial from registry */ reglen = sizeof(state.serial); if (RegQueryValueEx(hKey, "SerialNumber", NULL, ®type, state.serial, ®len) != ERROR_SUCCESS || regtype != REG_SZ) state.serial[0] = 0; state.serial[sizeof(state.serial)-1] = 0; reglen = sizeof(regval); if (RegQueryValueEx(hKey, "TxDelay", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD) regval = 5; state.txdelay = regval; reglen = sizeof(regval); if (RegQueryValueEx(hKey, "FullDuplex", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD) regval = 0; state.fullduplex = regval; state.terminate = 0; state.status = CH_DEAD; state.obj = CORBA_OBJECT_NIL; state.hdevlife = CreateEvent(NULL, FALSE, FALSE, "FlexNet Device State"); state.hobjmutex = CreateMutex(NULL, FALSE, NULL); return 1; } /* ------------------------------------------------------------------------- */ void l1_exit(HKEY hKey) { DWORD regval; state.terminate = 1; while (state.obj) Sleep(10); l1_init_kanal(0, 0, MODE_off); RegSetValueEx(hKey, "SerialNumber", 0, REG_SZ, state.serial, strlen(state.serial)+1); regval = state.txdelay; RegSetValueEx(hKey, "TxDelay", 0, REG_DWORD, (void *)®val, sizeof(regval)); regval = state.fullduplex; RegSetValueEx(hKey, "FullDuplex", 0, REG_DWORD, (void *)®val, sizeof(regval)); CloseHandle(state.hdevlife); CloseHandle(state.hobjmutex); } /* ------------------------------------------------------------------------- */ byte *config_info(byte kanal) { return state.devname; } /* ------------------------------------------------------------------------- */ static BOOL CALLBACK EdParmDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CORBA_Environment ev; Trx_TrxDescription *desc; Trx_Control obj; HWND hcombo; char buf[32]; unsigned int restart, i, index; int cursel; switch (uMsg) { case WM_INITDIALOG: hcombo = GetDlgItem(hDlg, IDC_SERIAL); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"Any"); cursel = state.serial[0] ? -1 : 0; WaitForSingleObject(state.hobjmutex, INFINITE); CORBA_exception_init(&ev); for (index = 0, i = 1;; index++) { if (!(obj = trx_resolve_byindex(index))) break; Trx_Control_GetDescription(obj, &desc, &ev); if (ev._major == CORBA_NO_EXCEPTION) { SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)desc->instid); if (!strcmp(desc->instid, state.serial)) cursel = i; CORBA_free(desc); i++; } CORBA_exception_free(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); } ReleaseMutex(state.hobjmutex); ComboBox_SetCurSel(hcombo, cursel); snprintf(buf, sizeof(buf), "%d", state.txdelay); SetDlgItemText(hDlg, IDC_TXDELAY, buf); CheckDlgButton(hDlg, IDC_FULLDUPLEX, state.fullduplex ? BST_CHECKED : BST_UNCHECKED); SetWindowText(hDlg, DRIVER_NAME" Configuration"); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: EndDialog(hDlg, 0); break; case IDOK: GetDlgItemText(hDlg, IDC_SERIAL, buf, sizeof(buf)); if (!strcmp(buf, "Any")) buf[0] = 0; restart = strcmp(buf, state.serial); strncpy(state.serial, buf, sizeof(state.serial)); GetDlgItemText(hDlg, IDC_TXDELAY, buf, sizeof(buf)); state.txdelay = strtoul(buf, NULL, 0); state.fullduplex = IsDlgButtonChecked(hDlg, IDC_FULLDUPLEX) == BST_CHECKED; EndDialog(hDlg, restart); break; default: break; } break; default: return FALSE; } return TRUE; } /* ------------------------------------------------------------------------- */ int config_device(byte max_channels, HWND hDlg, byte channel) { CORBA_Environment ev; int restart = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hDlg, EdParmDlgProc, 0); if (restart) { WaitForSingleObject(state.hobjmutex, INFINITE); CORBA_exception_init(&ev); if (state.obj) { Trx_Control_FlexNetUnlock(state.obj, &ev); CORBA_exception_free(&ev); CORBA_Object_release(state.obj, &ev); } CORBA_exception_free(&ev); state.obj = CORBA_OBJECT_NIL; ReleaseMutex(state.hobjmutex); } return restart; } /* ------------------------------------------------------------------------- */ u16 l1_get_ch_cnt(void) { return 1; } /* ------------------------------------------------------------------------- */ byte get_txdelay(byte kanal) { return state.txdelay / 10; } void set_txdelay(byte kanal, byte delay) { state.txdelay = 10 * delay; } u16 get_mode(byte kanal) { return (state.mode & ~MODE_d) | (state.fullduplex ? MODE_d : 0); } u16 get_baud(byte kanal) { return state.baud; } /* ------------------------------------------------------------------------- */ byte l1_init_kanal(byte kanal, u16 chbaud, u16 chmode) { state.mode = chmode; return 1; } /* ------------------------------------------------------------------------- */ byte l1_ch_active(byte kanal) { return 1; } /* ------------------------------------------------------------------------- */ char far *l1_ident(byte kanal) { return DRIVER_NAME; } /* ------------------------------------------------------------------------- */ char far *l1_version(byte kanal) { return DRIVER_VERSION; } /* ------------------------------------------------------------------------- */ L1_STATISTICS far *l1_stat(byte kanal, byte delete) { L1_STATISTICS *p = &state.stat; if (delete) p->tx_error = p->rx_overrun = p->rx_bufferoverflow = p->tx_frames = p->rx_frames = p->io_error = 0; return p; } /* ------------------------------------------------------------------------- */ void set_led(byte kanal, byte ledcode) { CORBA_Environment ev; WaitForSingleObject(state.hobjmutex, INFINITE); if (state.obj) { CORBA_exception_init(&ev); Trx_Control_FlexNetSetLEDS(state.obj, !!(ledcode & LED_CON), !!(ledcode & LED_STA), &ev); CORBA_exception_free(&ev); } ReleaseMutex(state.hobjmutex); } /* ------------------------------------------------------------------------- */ byte l1_ch_state(byte kanal) { return state.status; } /* ------------------------------------------------------------------------- */ u16 l1_scale(byte kanal) { return state.scale; } /* ------------------------------------------------------------------------- */ static void CALLBACK stopcalib(HWND hwnd, UINT umsg, UINT idevent, DWORD dwtime) { CORBA_Environment ev; WaitForSingleObject(state.hobjmutex, INFINITE); if (state.obj) { CORBA_exception_init(&ev); Trx_Control_SetPTT(state.obj, CORBA_FALSE, &ev); CORBA_exception_free(&ev); } ReleaseMutex(state.hobjmutex); } void l1_tx_calib(byte kanal, byte minutes) { CORBA_Environment ev; if (state.calibtimer) KillTimer(NULL, state.calibtimer); WaitForSingleObject(state.hobjmutex, INFINITE); if (state.obj) { CORBA_exception_init(&ev); Trx_Control_SetPTT(state.obj, CORBA_TRUE, &ev); CORBA_exception_free(&ev); } ReleaseMutex(state.hobjmutex); state.calibtimer = SetTimer(NULL, 0, minutes * 60000, stopcalib); if (!state.calibtimer) stopcalib(NULL, 0, 0, 0); } /* ------------------------------------------------------------------------- */ L1FRAME far *l1_get_framebuf(byte kanal) { return &state.txframe; } byte l1_tx_frame(void) { CORBA_Environment ev; Trx_FlexNetPacket pkt = { 0, }; byte ret = 0; pkt.txdelay = state.txframe.txdelay; if (!pkt.txdelay) pkt.txdelay = state.txdelay / 10; pkt.data._buffer = state.txframe.frame; pkt.data._length = pkt.data._maximum = state.txframe.len; WaitForSingleObject(state.hobjmutex, INFINITE); if (!state.obj) { ReleaseMutex(state.hobjmutex); state.stat.io_error++; return 1; } CORBA_exception_init(&ev); Trx_Control_FlexNetSendPacket(state.obj, &pkt, &ev); if (ev._major == CORBA_NO_EXCEPTION) { ret = 1; state.stat.tx_frames++; } CORBA_exception_free(&ev); ReleaseMutex(state.hobjmutex); return ret; } /* ------------------------------------------------------------------------- */ /* * RX-Thread. Wartet auf RX-Bytes, verarbeitet sie und returned wenn * Handle zu oder Paket komplett */ L1FRAME far *l1_rx_frame(void) { CORBA_Environment ev; CORBA_unsigned_long bitrate; Trx_TrxDescription *desc; Trx_FlexNetPollOneState *poll; Trx_Control obj; unsigned int i; byte st; WaitForSingleObject(state.hobjmutex, INFINITE); for (;;) { if (state.terminate) { if (state.obj) { CORBA_exception_init(&ev); Trx_Control_FlexNetUnlock(state.obj, &ev); CORBA_exception_free(&ev); CORBA_Object_release(state.obj, &ev); CORBA_exception_free(&ev); state.obj = CORBA_OBJECT_NIL; } ReleaseMutex(state.hobjmutex); return NULL; } if (!state.obj) { state.status = CH_DEAD; SetEvent(state.hdevlife); for (i = 0; i < 20; i++) { if (state.terminate) break; ReleaseMutex(state.hobjmutex); Sleep(50); WaitForSingleObject(state.hobjmutex, INFINITE); } if (state.terminate) continue; for (i = 0;; i++) { CORBA_exception_init(&ev); if (!(obj = trx_resolve_byindex(i))) break; Trx_Control_GetDescription(obj, &desc, &ev); if (ev._major == CORBA_NO_EXCEPTION && (!state.serial[0] || !strcmp(desc->instid, state.serial))) break; CORBA_exception_free(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); } if (!obj) goto wait; snprintf(state.devname, sizeof(state.devname), "%s (%s)", desc->model, desc->instid); CORBA_free(desc); if (!Trx_Control_FlexNetLock(obj, &ev) || ev._major != CORBA_NO_EXCEPTION) { CORBA_exception_free(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); goto wait; } Trx_Control_FlexNetGetBitrate(obj, &bitrate, &ev); if (ev._major != CORBA_NO_EXCEPTION) bitrate = 1; CORBA_exception_free(&ev); if (bitrate < 1) bitrate = 1; state.scale = 614400 / bitrate; state.baud = bitrate / 100; state.status = 0; SetEvent(state.hdevlife); state.obj = obj; } CORBA_exception_init(&ev); Trx_Control_FlexNetPollOne(state.obj, &poll, &ev); if (ev._major != CORBA_NO_EXCEPTION) { CORBA_exception_free(&ev); Trx_Control_FlexNetUnlock(state.obj, &ev); CORBA_exception_free(&ev); CORBA_Object_release(state.obj, &ev); CORBA_exception_free(&ev); state.obj = CORBA_OBJECT_NIL; goto wait; } CORBA_exception_free(&ev); st = state.status; if (poll->ptt) state.status |= CH_PTT; else state.status &= ~CH_PTT; if (poll->dcd) state.status |= CH_DCD; else state.status &= ~CH_DCD; if (poll->nrpkt > 1) state.status |= CH_RXB; else state.status &= ~CH_RXB; if (poll->dead) state.status |= CH_DEAD; else state.status &= ~CH_DEAD; if ((state.status ^ st) & CH_DEAD) SetEvent(state.hdevlife); if (!poll->pkt.data._length) { CORBA_free(poll); goto wait; } state.rxframe.kanal = 0; state.rxframe.txdelay = poll->pkt.txdelay; state.rxframe.len = poll->pkt.data._length; memcpy(state.rxframe.frame, poll->pkt.data._buffer, state.rxframe.len); CORBA_free(poll); ReleaseMutex(state.hobjmutex); return &state.rxframe; wait: ReleaseMutex(state.hobjmutex); Sleep(10); WaitForSingleObject(state.hobjmutex, INFINITE); } } /* ------------------------------------------------------------------------- */ baycomusb-0.10.orig/flexdrv/bayusb_orb.c0100644000175100017510000004710207331325262016364 0ustar abaaba/*****************************************************************************/ /* * bayusb.c -- FlexNet driver for Baycom USB modem. * * Copyright (C) 1999-2000 * Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * * History: * 0.1 23.06.1999 Created * 0.2 07.01.2000 Expanded to usbdevfs capabilities * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "flexdrv.h" #include "resource.h" /* --------------------------------------------------------------------- */ #include "trx.h" #define VERBOSE #ifdef VERBOSE #define verbose(x) x #else #define verbose(x) #endif static CORBA_ORB trx_orb; static inline Trx_Control ior_to_obj(const char *ior) { CORBA_Environment ev; Trx_Control obj; Trx_TrxDescription *desc; CORBA_exception_init(&ev); obj = CORBA_ORB_string_to_object(trx_orb, (char *)ior, &ev); if (ev._major != CORBA_NO_EXCEPTION) { verbose(fprintf(stderr, "Error: trx_resolve_byindex: %s %s\n", ior, CORBA_exception_id(&ev))); CORBA_exception_free(&ev); return NULL; } Trx_Control_GetDescription(obj, &desc, &ev); if (ev._major != CORBA_NO_EXCEPTION) { verbose(fprintf(stderr, "Error: trx_resolve_byindex: (GetDescription) %s %s\n", ior, CORBA_exception_id(&ev))); CORBA_exception_free(&ev); CORBA_Object_release(obj, &ev); return NULL; } verbose(fprintf(stderr, "trx_resolve_byindex: %s mfg %s model %s instid %s\n", ior, desc->manufacturer, desc->model, desc->instid)); CORBA_free(desc); CORBA_exception_free(&ev); return obj; } static inline void runserver(void) { static unsigned int inited = 0; char name[512], cmdname[512], cmdline[512], *cp; STARTUPINFO sti; PROCESS_INFORMATION pi; if (inited) return; inited = 1; if (!GetModuleFileName(GetModuleHandle(NULL), name, sizeof(name))) { fprintf(stderr, "Cannot determine executable name\n"); return; } if ((cp = strrchr(name, '\\'))) *cp = 0; else name[0] = 0; snprintf(cmdname, sizeof(cmdname), "%s\\baycomusbserv.exe", name); /* * Database calls (getXbyY) seem to hang for a very looooong time under * w9x if DNS is not or misconfigured. So we set the binding address to * 127.0.0.1, which only accepts connections from 127.0.0.1 * and does no database calls */ snprintf(cmdline, sizeof(cmdline), "%s -v 9 -s -ORBBindAddr=127.0.0.1", cmdname); GetStartupInfo(&sti); if (!CreateProcess(cmdname, cmdline, NULL, NULL, FALSE, DETACHED_PROCESS | CREATE_DEFAULT_ERROR_MODE | HIGH_PRIORITY_CLASS, NULL, NULL, &sti, &pi)) { fprintf(stderr, "Cannot start command %s, Error %lu\n", cmdname, GetLastError()); } } static Trx_Control trx_resolve_byindex(unsigned int index) { Trx_Control obj; HKEY key, key2; DWORD err, i, bufsz, dt; CORBA_Environment ev; char buf[512]; runserver(); if ((err = RegOpenKeyEx(IORREGHKEY, IORREGPATH, 0, KEY_ENUMERATE_SUB_KEYS, &key)) != ERROR_SUCCESS) { fprintf(stderr, "RegOpenKeyEx(" IORREGPATH ") returned 0x%lx\n", err); return CORBA_OBJECT_NIL; } for (i = 0;; i++) { bufsz = sizeof(buf); err = RegEnumKeyEx(key, i, buf, &bufsz, NULL, NULL, NULL, NULL); if (err != ERROR_SUCCESS) { RegCloseKey(key); return NULL; } if (RegOpenKeyEx(key, buf, 0, KEY_ALL_ACCESS, &key2) != ERROR_SUCCESS) continue; bufsz = sizeof(buf); if (RegQueryValueEx(key2, "IOR", NULL, &dt, buf, &bufsz) != ERROR_SUCCESS) { RegCloseKey(key2); continue; } RegCloseKey(key2); if (dt != REG_SZ) { continue; } if ((obj = ior_to_obj(buf))) { if (index) { index--; CORBA_exception_init(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); continue; } RegCloseKey(key); return obj; } } } int trx_initorb(int *argc, char **argv) { CORBA_Environment ev; CORBA_exception_init(&ev); trx_orb = CORBA_ORB_init(argc, argv, "orbit-local-orb", &ev); if (ev._major != CORBA_NO_EXCEPTION) { verbose(fprintf(stderr, "Error: trx_initorb: %s\n", CORBA_exception_id(&ev))); CORBA_exception_free(&ev); return -1; } return 0; } /* --------------------------------------------------------------------- */ #define DRIVER_NAME "BaycomUSB" #define DRIVER_VERSION "0.2" static struct state { unsigned int terminate; Trx_Control obj; HANDLE hobjmutex; HANDLE hdevlife; char serial[16]; /* device serial number, or NULL string for any device */ char devname[32]; byte baud; byte mode; byte status; unsigned int scale; unsigned int txdelay; unsigned int fullduplex; UINT calibtimer; Trx_FlexNetPollState *poll; unsigned int pollidx; L1FRAME txframe; L1FRAME rxframe; L1_STATISTICS stat; } state = { 0, }; /* ----------------------------------------------------------------------- */ /* * Treiber-Init. Sofern mehrfach aufgerufen, kommt vorher jeweils l1_exit() * Hier also alle Ressourcen allokieren, aber noch nicht starten sofern * dazu die Parameter gebraucht werden. Die kommen spaeter per l1_init_kanal() */ int init_device(HKEY hKey) { DWORD regtype, reglen, regval; int argc = 0; char *argv[1] = { NULL }; static int orbinit = 1; verboselevel = ~0; syslogmsg = 1; /* initialize ORB */ if (orbinit && trx_initorb(&argc, argv)) return 0; orbinit = 0; /* get serial from registry */ reglen = sizeof(state.serial); if (RegQueryValueEx(hKey, "SerialNumber", NULL, ®type, state.serial, ®len) != ERROR_SUCCESS || regtype != REG_SZ) state.serial[0] = 0; state.serial[sizeof(state.serial)-1] = 0; reglen = sizeof(regval); if (RegQueryValueEx(hKey, "TxDelay", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD) regval = 5; state.txdelay = regval; reglen = sizeof(regval); if (RegQueryValueEx(hKey, "FullDuplex", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD) regval = 0; state.fullduplex = regval; state.terminate = 0; state.status = CH_DEAD; state.obj = CORBA_OBJECT_NIL; state.poll = NULL; state.hdevlife = CreateEvent(NULL, FALSE, FALSE, "FlexNet Device State"); state.hobjmutex = CreateMutex(NULL, FALSE, NULL); return 1; } /* ------------------------------------------------------------------------- */ void l1_exit(HKEY hKey) { CORBA_Environment ev; DWORD regval; WaitForSingleObject(state.hobjmutex, INFINITE); state.terminate = 1; if (state.obj) { CORBA_exception_init(&ev); Trx_Control_FlexNetUnlock(state.obj, &ev); CORBA_exception_free(&ev); CORBA_Object_release(state.obj, &ev); CORBA_exception_free(&ev); state.obj = CORBA_OBJECT_NIL; } if (state.poll) CORBA_free(state.poll); state.poll = NULL; ReleaseMutex(state.hobjmutex); l1_init_kanal(0, 0, MODE_off); RegSetValueEx(hKey, "SerialNumber", 0, REG_SZ, state.serial, strlen(state.serial)+1); regval = state.txdelay; RegSetValueEx(hKey, "TxDelay", 0, REG_DWORD, (void *)®val, sizeof(regval)); regval = state.fullduplex; RegSetValueEx(hKey, "FullDuplex", 0, REG_DWORD, (void *)®val, sizeof(regval)); CloseHandle(state.hdevlife); CloseHandle(state.hobjmutex); } /* ------------------------------------------------------------------------- */ byte *config_info(byte kanal) { return state.devname; } /* ------------------------------------------------------------------------- */ static BOOL CALLBACK EdParmDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CORBA_Environment ev; Trx_TrxDescription *desc; Trx_Control obj; HWND hcombo; char buf[32]; unsigned int restart, i, index; int cursel; switch (uMsg) { case WM_INITDIALOG: hcombo = GetDlgItem(hDlg, IDC_SERIAL); SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"Any"); cursel = state.serial[0] ? -1 : 0; WaitForSingleObject(state.hobjmutex, INFINITE); CORBA_exception_init(&ev); for (index = 0, i = 1;; index++) { if (!(obj = trx_resolve_byindex(index))) break; Trx_Control_GetDescription(obj, &desc, &ev); if (ev._major == CORBA_NO_EXCEPTION) { SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)desc->instid); if (!strcmp(desc->instid, state.serial)) cursel = i; CORBA_free(desc); i++; } CORBA_exception_free(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); } ReleaseMutex(state.hobjmutex); ComboBox_SetCurSel(hcombo, cursel); snprintf(buf, sizeof(buf), "%d", state.txdelay); SetDlgItemText(hDlg, IDC_TXDELAY, buf); CheckDlgButton(hDlg, IDC_FULLDUPLEX, state.fullduplex ? BST_CHECKED : BST_UNCHECKED); SetWindowText(hDlg, DRIVER_NAME" Configuration"); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: EndDialog(hDlg, 0); break; case IDOK: GetDlgItemText(hDlg, IDC_SERIAL, buf, sizeof(buf)); if (!strcmp(buf, "Any")) buf[0] = 0; restart = strcmp(buf, state.serial); strncpy(state.serial, buf, sizeof(state.serial)); GetDlgItemText(hDlg, IDC_TXDELAY, buf, sizeof(buf)); state.txdelay = strtoul(buf, NULL, 0); state.fullduplex = IsDlgButtonChecked(hDlg, IDC_FULLDUPLEX) == BST_CHECKED; EndDialog(hDlg, restart); break; default: break; } break; default: return FALSE; } return TRUE; } /* ------------------------------------------------------------------------- */ int config_device(byte max_channels, HWND hDlg, byte channel) { CORBA_Environment ev; int restart = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hDlg, EdParmDlgProc, 0); if (restart) { WaitForSingleObject(state.hobjmutex, INFINITE); CORBA_exception_init(&ev); if (state.obj) { Trx_Control_FlexNetUnlock(state.obj, &ev); CORBA_exception_free(&ev); CORBA_Object_release(state.obj, &ev); } CORBA_exception_free(&ev); state.obj = CORBA_OBJECT_NIL; if (state.poll) CORBA_free(state.poll); state.poll = NULL; ReleaseMutex(state.hobjmutex); } return restart; } /* ------------------------------------------------------------------------- */ u16 l1_get_ch_cnt(void) { return 1; } /* ------------------------------------------------------------------------- */ byte get_txdelay(byte kanal) { return state.txdelay / 10; } void set_txdelay(byte kanal, byte delay) { state.txdelay = 10 * delay; } u16 get_mode(byte kanal) { return (state.mode & ~MODE_d) | (state.fullduplex ? MODE_d : 0); } u16 get_baud(byte kanal) { return state.baud; } /* ------------------------------------------------------------------------- */ byte l1_init_kanal(byte kanal, u16 chbaud, u16 chmode) { state.mode = chmode; return 1; } /* ------------------------------------------------------------------------- */ byte l1_ch_active(byte kanal) { return 1; } /* ------------------------------------------------------------------------- */ char far *l1_ident(byte kanal) { return DRIVER_NAME; } /* ------------------------------------------------------------------------- */ char far *l1_version(byte kanal) { return DRIVER_VERSION; } /* ------------------------------------------------------------------------- */ L1_STATISTICS far *l1_stat(byte kanal, byte delete) { L1_STATISTICS *p = &state.stat; if (delete) p->tx_error = p->rx_overrun = p->rx_bufferoverflow = p->tx_frames = p->rx_frames = p->io_error = 0; return p; } /* ------------------------------------------------------------------------- */ void set_led(byte kanal, byte ledcode) { CORBA_Environment ev; WaitForSingleObject(state.hobjmutex, INFINITE); if (state.obj) { CORBA_exception_init(&ev); Trx_Control_FlexNetSetLEDS(state.obj, !!(ledcode & LED_CON), !!(ledcode & LED_STA), &ev); CORBA_exception_free(&ev); } ReleaseMutex(state.hobjmutex); } /* ------------------------------------------------------------------------- */ byte l1_ch_state(byte kanal) { return state.status; } /* ------------------------------------------------------------------------- */ u16 l1_scale(byte kanal) { return state.scale; } /* ------------------------------------------------------------------------- */ static void CALLBACK stopcalib(HWND hwnd, UINT umsg, UINT idevent, DWORD dwtime) { CORBA_Environment ev; WaitForSingleObject(state.hobjmutex, INFINITE); if (state.obj) { CORBA_exception_init(&ev); Trx_Control_SetPTT(state.obj, CORBA_FALSE, &ev); CORBA_exception_free(&ev); } ReleaseMutex(state.hobjmutex); } void l1_tx_calib(byte kanal, byte minutes) { CORBA_Environment ev; if (state.calibtimer) KillTimer(NULL, state.calibtimer); WaitForSingleObject(state.hobjmutex, INFINITE); if (state.obj) { CORBA_exception_init(&ev); Trx_Control_SetPTT(state.obj, CORBA_TRUE, &ev); CORBA_exception_free(&ev); } ReleaseMutex(state.hobjmutex); state.calibtimer = SetTimer(NULL, 0, minutes * 60000, stopcalib); if (!state.calibtimer) stopcalib(NULL, 0, 0, 0); } /* ------------------------------------------------------------------------- */ L1FRAME far *l1_get_framebuf(byte kanal) { return &state.txframe; } byte l1_tx_frame(void) { CORBA_Environment ev; Trx_FlexNetPacket pkt = { 0, }; byte ret = 0; pkt.txdelay = state.txframe.txdelay; if (!pkt.txdelay) pkt.txdelay = state.txdelay / 10; pkt.data._buffer = state.txframe.frame; pkt.data._length = pkt.data._maximum = state.txframe.len; WaitForSingleObject(state.hobjmutex, INFINITE); if (!state.obj) { ReleaseMutex(state.hobjmutex); state.stat.io_error++; return 1; } CORBA_exception_init(&ev); Trx_Control_FlexNetSendPacket(state.obj, &pkt, &ev); if (ev._major == CORBA_NO_EXCEPTION) { ret = 1; state.stat.tx_frames++; } CORBA_exception_free(&ev); ReleaseMutex(state.hobjmutex); return ret; } /* ------------------------------------------------------------------------- */ /* * RX-Thread. Wartet auf RX-Bytes, verarbeitet sie und returned wenn * Handle zu oder Paket komplett */ L1FRAME far *l1_rx_frame(void) { CORBA_Environment ev; CORBA_unsigned_long bitrate; Trx_TrxDescription *desc; Trx_Control obj; Trx_FlexNetPacket *pkt; unsigned int i; byte st; WaitForSingleObject(state.hobjmutex, INFINITE); for (;;) { if (state.terminate) { ReleaseMutex(state.hobjmutex); return NULL; } if (!state.obj) { state.status = CH_DEAD; SetEvent(state.hdevlife); for (i = 0; i < 20; i++) { if (state.terminate) break; ReleaseMutex(state.hobjmutex); Sleep(50); WaitForSingleObject(state.hobjmutex, INFINITE); } if (state.terminate) continue; for (i = 0;; i++) { CORBA_exception_init(&ev); if (!(obj = trx_resolve_byindex(i))) break; Trx_Control_GetDescription(obj, &desc, &ev); if (ev._major == CORBA_NO_EXCEPTION && (!state.serial[0] || !strcmp(desc->instid, state.serial))) break; CORBA_exception_free(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); } if (!obj) goto wait; snprintf(state.devname, sizeof(state.devname), "%s (%s)", desc->model, desc->instid); CORBA_free(desc); if (!Trx_Control_FlexNetLock(obj, &ev) || ev._major != CORBA_NO_EXCEPTION) { CORBA_exception_free(&ev); CORBA_Object_release(obj, &ev); CORBA_exception_free(&ev); goto wait; } Trx_Control_FlexNetGetBitrate(obj, &bitrate, &ev); if (ev._major != CORBA_NO_EXCEPTION) bitrate = 1; CORBA_exception_free(&ev); if (bitrate < 1) bitrate = 1; state.scale = 614400 / bitrate; state.baud = bitrate / 100; state.status = 0; SetEvent(state.hdevlife); state.obj = obj; } if (!state.poll) { CORBA_exception_init(&ev); Trx_Control_FlexNetPoll(state.obj, &state.poll, &ev); if (ev._major != CORBA_NO_EXCEPTION) { CORBA_exception_free(&ev); Trx_Control_FlexNetUnlock(state.obj, &ev); CORBA_exception_free(&ev); CORBA_Object_release(state.obj, &ev); CORBA_exception_free(&ev); state.obj = CORBA_OBJECT_NIL; state.poll = NULL; goto wait; } CORBA_exception_free(&ev); state.pollidx = 0; st = state.status; if (state.poll->ptt) state.status |= CH_PTT; else state.status &= ~CH_PTT; if (state.poll->dcd) state.status |= CH_DCD; else state.status &= ~CH_DCD; if (state.poll->pkt._length > 0) state.status |= CH_RXB; else state.status &= ~CH_RXB; if (state.poll->dead) state.status |= CH_DEAD; else state.status &= ~CH_DEAD; if ((state.status ^ st) & CH_DEAD) SetEvent(state.hdevlife); if (!state.poll->pkt._length) { CORBA_free(state.poll); state.poll = NULL; goto wait; } } if (state.pollidx < state.poll->pkt._length) { pkt = &state.poll->pkt._buffer[state.pollidx++]; state.rxframe.kanal = 0; state.rxframe.txdelay = pkt->txdelay; state.rxframe.len = pkt->data._length; memcpy(state.rxframe.frame, pkt->data._buffer, state.rxframe.len); if (state.pollidx >= state.poll->pkt._length) { state.status &= ~CH_RXB; CORBA_free(state.poll); state.poll = NULL; } ReleaseMutex(state.hobjmutex); return &state.rxframe; } wait: ReleaseMutex(state.hobjmutex); Sleep(10); WaitForSingleObject(state.hobjmutex, INFINITE); } } /* ------------------------------------------------------------------------- */ /* KB Q164787 */ void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow) { lprintf(0, "Hello World!\ncmdline: %s\n", lpszCmdLine); printf("Hello World!\ncmdline: %s\n", lpszCmdLine); Sleep(30000); lprintf(0, "End\n"); } /* ------------------------------------------------------------------------- */ baycomusb-0.10.orig/flexdrv/bayusb.rc0100644000175100017510000000507107340467214015707 0ustar abaaba#include "resource.h" #include "windows.h" #define IDC_STATIC -1 IDD_DIALOG1 DIALOGEX 0, 0, 232, 176 STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,175,12,50,14 PUSHBUTTON "Cancel",IDCANCEL,175,37,50,14 RTEXT "Serial Number",IDC_STATIC,40,15,35,8,0,WS_EX_RIGHT COMBOBOX IDC_SERIAL,77,12,50,145,CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP RTEXT "Mode",IDC_STATIC,40,36,35,8 COMBOBOX IDC_MODE,77,34,50,145,CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP RTEXT "Bitrate RX",IDC_STATIC,40,58,35,8 EDITTEXT IDC_BITRATERX,77,56,40,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "bit/s",IDC_STATIC,120,58,20,8 RTEXT "Bitrate TX",IDC_STATIC,40,80,35,8 EDITTEXT IDC_BITRATETX,77,78,40,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "bit/s",IDC_STATIC,120,80,20,8 RTEXT "TxDelay",IDC_STATIC,40,102,35,8 EDITTEXT IDC_TXDELAY,77,100,40,14,ES_AUTOHSCROLL | ES_NUMBER LTEXT "ms",IDC_STATIC,120,102,10,8 CONTROL "Full Duplex",IDC_FULLDUPLEX,"Button",BS_3STATE | WS_TABSTOP,77,122,51,10 CONTROL "PTT Mute",IDC_PTTMUTE,"Button",BS_3STATE | WS_TABSTOP,77,144,51,10 CONTROL "Author: Thomas Sailer, HB9JNX/AE4WA",IDC_STATIC,"Static", SS_LEFTNOWORDWRAP | WS_GROUP,3,166,130,8 END LANGUAGE LANG_GERMAN, SUBLANG_GERMAN VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x0L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Baycom Hard- und Software GmbH\0" VALUE "FileDescription", "baycomusb\0" VALUE "FileVersion", "1, 0, 0, 1\0" VALUE "InternalName", "Baycom USB FlexNet driver\0" VALUE "LegalCopyright", "Copyright © 1999-2000\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "baycomusb.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "USBFLEX\0" VALUE "ProductVersion", "1.00a\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END baycomusb-0.10.orig/flexdrv/driver.c0100644000175100017510000000543407325134424015533 0ustar abaaba#define STRICT #include #pragma hdrstop #include #include "flexdrv.h" // der offizielle Header #include "drv32.h" HANDLE hInst; //-------------------------------------------------------------------- // Einziger Treiberaufruf u32 flexnet_driver(int func, int kanal, int a, int b) { static byte base_kanal; static byte tx_kanal; static L1FRAME *l1f; L1FRAME *rxf; switch (func) { case drv_interfaceversion: return DRIVER_INTERFACE_VERSION; case drv_ident: return (u32)l1_ident((byte)(kanal-base_kanal)); case drv_version: return (u32)l1_version((byte)(kanal - base_kanal)); case drv_config: return config_device((byte)(kanal), (HWND)a, (byte)(b - base_kanal)); case drv_confinfo: return (u32)config_info((byte)(kanal - base_kanal)); case drv_init_device: base_kanal = kanal; return init_device((HKEY)b); case drv_get_ch_cnt: return l1_get_ch_cnt(); case drv_exit: l1_exit((HKEY)a); break; case drv_ch_active: return l1_ch_active((byte)(kanal - base_kanal)); case drv_init_kanal: return l1_init_kanal((byte)(kanal - base_kanal), (u16)a, (u16)b); case drv_stat: return (u32)l1_stat((byte)(kanal - base_kanal), (byte)a); case drv_ch_state: return l1_ch_state((byte)(kanal - base_kanal)); case drv_scale: return l1_scale((byte)(kanal - base_kanal)); case drv_tx_calib: l1_tx_calib((byte)(kanal - base_kanal), (byte)a); break; case drv_set_led: set_led((byte)(kanal - base_kanal), (byte)a); break; case drv_rx_frame: if (rxf = l1_rx_frame()) rxf->kanal += base_kanal; return (u32)rxf; case drv_get_framebuf: return (u32)(l1f = l1_get_framebuf(tx_kanal = (byte)(kanal - base_kanal))); case drv_tx_frame: if (l1f) l1f->kanal = tx_kanal; return l1_tx_frame(); case drv_get_txdelay: return get_txdelay((byte)(kanal - base_kanal)); case drv_get_mode: return get_mode((byte)(kanal - base_kanal)); case drv_get_baud: return get_baud((byte)(kanal - base_kanal)); case drv_set_txdelay: set_txdelay((byte)(kanal - base_kanal), (byte)a); break; default: return 0; } return 0; } //-------------------------------------------------------------------- BOOL WINAPI DllMain (HANDLE hModule, DWORD dwFunction, LPVOID lpNot) { switch(dwFunction) { case DLL_PROCESS_ATTACH: // hier evtl. noch Test ob mehrfach geladen, dazu brauchts aber Handle (mutex oder sowas) hInst = hModule; // kein break, auch neuer Prozess istn Thread case DLL_THREAD_ATTACH: break; case DLL_PROCESS_DETACH: // vor allem wenn harter Abbruch: Alles deinitialisieren! break; // kein Durchfall, Prozessende gibt eh alles frei und schliesst pipes case DLL_THREAD_DETACH: break; } return 1; // Indicate that the DLL was initialized successfully. } //-------------------------------------------------------------------- baycomusb-0.10.orig/flexdrv/drv32.h0100644000175100017510000000070207325134424015176 0ustar abaaba #define DRIVER_INTERFACE_VERSION 1 enum drvc { drv_interfaceversion=1, drv_ident, drv_version, drv_config, drv_confinfo, drv_init_device, drv_get_ch_cnt, drv_exit, drv_ch_active, drv_init_kanal, drv_stat, drv_ch_state, drv_scale, drv_tx_calib, drv_set_led, drv_rx_frame, drv_get_framebuf, drv_tx_frame, drv_get_txdelay, drv_get_mode, drv_get_baud, drv_set_txdelay }; baycomusb-0.10.orig/flexdrv/flexdriv.def0100644000175100017510000000347007331755454016406 0ustar abaaba;LIBRARY FLEXNET_DRIVER DESCRIPTION "FlexNet Channel Driver" VERSION 1.0 CODE READ SHARED EXECUTE DATA READ WRITE EXPORTS flexnet_driver trxapi_init = win32shmem_init trxapi_open_byindex = win32shmem_open_byindex trxapi_close = win32shmem_close trxapi_get_description = win32shmem_get_description trxapi_get_state = win32shmem_get_state trxapi_set_ptt = win32shmem_set_ptt trxapi_set_frequency = win32shmem_set_frequency trxapi_uart_send = win32shmem_uart_send trxapi_uart_receive = win32shmem_uart_receive trxapi_baycomusb_adapter_get_config = win32shmem_baycomusb_adapter_get_config trxapi_baycomusb_adapter_set_config = win32shmem_baycomusb_adapter_set_config trxapi_baycomusb_adapter_get_audiodevices = win32shmem_baycomusb_adapter_get_audiodevices trxapi_channel_access_get_config = win32shmem_channel_access_get_config trxapi_channel_access_set_config = win32shmem_channel_access_set_config trxapi_interface_get_config = win32shmem_interface_get_config trxapi_interface_set_config = win32shmem_interface_set_config trxapi_modem_disconnect_get_config = win32shmem_modem_disconnect_get_config trxapi_modem_disconnect_set_config = win32shmem_modem_disconnect_set_config trxapi_get_audio_state = win32shmem_get_audio_state trxapi_get_audio_mic_samples = win32shmem_get_audio_mic_samples trxapi_get_audio_spk_samples = win32shmem_get_audio_spk_samples trxapi_set_audio_dtmf = win32shmem_set_audio_dtmf usb_show_device_descriptor usb_setmountpoint usb_getmountpoint usb_close usb_open_bynumber usb_open usb_control_msg usb_bulk_msg usb_resetep usb_setconfiguration usb_setinterface usb_getdevicedescriptor usb_claiminterface usb_releaseinterface usb_discsignal usb_submiturb usb_discardurb usb_reapurb usb_getfd vsnprintf server_entry_cmdline = server_entry_cmdline@16 server_entry_parse_argv server_entry_run server_entry_quit baycomusb-0.10.orig/flexdrv/flexdrv.h0100644000175100017510000005023507325134424015716 0ustar abaaba/*************************************************************** FlexNet / BayCom Layer 1 Service Interface (C) 7/1994 DK7WJ, DL8MBT Translation by HB9JNX Definitionen und Prototypes fr Aufruf von Layer1-Funktionen Definitions and prototypes for calling Layer1 functions 28.08.94 DK7WJ Erste verteilte Version First distributed version 10.09.94 DK7WJ Modebefehl geaendert Changed the mode command Prototypen neu f. Speichermodell MEDIUM New prototypes for the MEDIUM memory model 25.09.94 DK7WJ FDX an Treiber uebergeben FDX now forwarded to the driver 20.02.95 DK7WJ CH_TBY neu CH_TBY added 31.03.95 DK7WJ Device-Versionkennungen Device version identifier 01.03.96 DK7WJ Windows extensions, comments pending :-) 22.04.96 DK7WJ . 25.03.97 HB9JNX IO trapping changes 10.01.00 DK7WJ WIN32 definitions 19.06.00 DK7WJ CH_DEAD included ***************************************************************/ //#ifndef _FLEXTYPES_DEFINED //#define _FLEXTYPES_DEFINED typedef unsigned char byte; typedef signed char i8; typedef signed short i16; typedef unsigned short u16; typedef unsigned long u32; #ifdef _WIN32 #define far #define near #endif //#endif #ifdef _WIN32 #pragma pack(push, flexdrv) #pragma pack(1) #endif #define MAXFLEN 400 /* Maximale Laenge eines Frames */ /* maximum length of a frame */ /* Struct f. Treiberkommunikation bei TX und RX */ /* struct for communicating RX and TX packets to the driver */ typedef struct { i16 len; /* Laenge des Frames - length of the frame */ byte kanal; /* Kanalnummer - channel number */ byte txdelay; /* RX: Gemessenes TxDelay [*10ms], 0 wenn nicht unterstuetzt TX: Zu sendendes TxDelay */ /* RX: measured transmitter keyup delay (TxDelay) in 10ms units, 0 if not supported TX: transmitter keyup delay (TxDelay) that should be sent */ byte frame[MAXFLEN]; /* L1-Frame (ohne CRC) - L1 frame without CRC */ } L1FRAME; /* Struct f. Kanalstatistik (wird noch erweitert) */ /* struct for channel statistics (still being extended) */ #ifndef _FLEXAPPL typedef struct { u32 tx_error; /* Underrun oder anderes Problem - underrun or some other problem */ u32 rx_overrun; /* Wenn Hardware das unterstuetzt - if supported by the hardware */ u32 rx_bufferoverflow; u32 tx_frames; /* Gesamt gesendete Frames - total number of sent frames */ u32 rx_frames; /* Gesamt empfangene Frames - total number of received frames */ u32 io_error; /* Reset von IO-Device - number of resets of the IO device */ u32 reserve[4]; /* f. Erweiterungen, erstmal 0 lassen! - reserved for extensions, leave 0! */ } L1_STATISTICS; #endif #ifdef _WIN32 extern HANDLE hInst; #pragma pack(pop, flexdrv) #endif /* Masken fr den Mode-Parameter - bitmasks for the mode parameter */ #define MODE_d 0x0080 #define MODE_r 0x0040 #define MODE_t 0x0020 #define MODE_z 0x0010 #define MODE_p 0x0004 /* needs also MODE_d */ #define MODE_c 0x0002 #define MODE_off 0x0001 /* Special: Wenn 1, Kanal abgeschaltet */ /* special: if one, the channel is switched off */ /* Masken fr den L1-Kanalstatus */ /* masks for the L1 channel status */ #define CH_DEAD 0x01 #define CH_RXB 0x40 #define CH_PTT 0x20 #define CH_DCD 0x10 #define CH_FDX 0x08 #define CH_TBY 0x04 #ifdef _WIN32 // Konfiguration. Wenn geaendert, TRUE returnen, dann erfolgt exit() und Re-Init // max_channels: Maximal moegliche Kanalanzahl f. diesen Treiber int config_device(byte max_channels, HWND hParentWindow, byte channel); // Return: Anzahl belegte Kanaele! byte *config_info(byte channel); /* Liefert String der die treiberspezifische Konfiguration beschreibt, z.B. Resourcen-Name Wenn keine treiberspezifische Konfiguration vorhanden (config_device() ist Dummy), Nullpointer liefern */ /* Returns a string describing the channel configuration, i.e. the name of hardware resource If config_device() is a dummy, this call must return a null pointer */ int init_device(HKEY kHey); void far l1_exit(HKEY hKey); void set_txdelay(byte channel, byte txdel); byte get_txdelay(byte channel); u16 get_baud(byte channel); u16 get_mode(byte channel); #else u16 far init_device(int argc, char near *argv[]); /* Treiberinterner Aufruf aus Treiberkopf bei Installation: kann benutzt werden um Command Line Parameter zu parsen Return: 0=OK; sonst Exit mit Returnwert als Exit-Argument ACHTUNG: Wenn Returnwert >0, erfolgt Abbruch, es duerfen dann also keine aktiven oder umgelegten Interrupts verbleiben! */ /* This procedure is called from the driver stub at installation time. It may be used to parse the command line Return value: 0=OK; otherwise installation is cancelled and the value returned as exit argument WARNING: If return value >0 the installation is cancelled, active or patched interrupt vectors must not be left! */ void far l1_exit(void); /* Wird bei Verlassen des Programms aufgerufen und kann zum Aufr„umen verwendet werden (Interrupts und Schnittstellen abschalten) */ /* Is called when the driver terminates and may be used to clean up everything (switch off interrupts and interfaces) */ #endif u16 far l1_get_ch_cnt(void); /* Aufruf aus Treiberkopf bei Programmstart; muss Anzahl der im Treiber definierten Kanaele liefern */ /* called from the driver stub at installation time; should return the number of channels defined by the driver */ byte far l1_ch_active(byte kanal); /* Zurueckliefern, ob Kanal im Prinzip funktionstuechtig ist. Also immer, ausser wenn Dummykanal, >0 liefern! */ /* report if the channel could work in principle. Thus always return >0 if not a dummy channel. */ byte far l1_init_kanal(byte kanal, u16 baud, u16 mode); /* Kanalnummer: 0-15 Baud: Baudrate / 100, z.B. 115200 Baud wird als 1152 uebergeben Mode: Kanalmodus, Bitflaggen, derzeit definiert: 0x0080 d Vollduplex 0x0040 r Externer RX-Takt 0x0020 t Externer TX-Takt 0x0010 z NRZ-Kodierung (Anstatt NRZI), nur f. HDLC 0x0002 c Kanal macht immer CRC, nur f. KISS Baycom: Soft-DCD aktivieren 0x0001 - Kanal per Modebefehl deaktiviert Es sind noch weitere Bits definiert, die sind aber im L1-Treiber nicht relevant! Um eventuelle Verklemmungen zu beseitigen, sollte in diesem Modul der Treiber soweit als moeglich (re)initialisiert werden! Return: 1 wenn alles ok; 0 wenn Parameterfehler, dann Anzeige von '---' in der Modeliste Aufruf erfolgt beim Programmstart sowie bei jeder Baud- oder Mode„nderung, ausserdem wenn der Kanal seit 3 Minuten nichts mehr empfangen hat. */ /* kanal: channel number (0-15) baud: the baud rate / 100, for example 115200 baud is specified as baud = 1152 mode: the channel mode, a bit field, currently the following bits are defined: 0x0080 d Full duplex 0x0040 r External RX clock 0x0020 t External TX clock 0x0010 z NRZ coding (instead of NRZI) (only for HDLC) 0x0002 c KISS: driver forces checksum Baycom: activate software DCD 0x0001 - channel inactivated There are some additional bits defined which are not relevant to the L1 driver. To recover from lockups, this function should (re)initialize as much of the driver and the hardware as possible. Return value: 1 if everything is ok; 0 if a parameter error; '---' is then displayed in the ports list This procedure is called at program start, at every baud rate or mode change, or if the driver has not received anything for 3 minutes. */ L1FRAME far * far l1_rx_frame(void); /* Wird zyklisch aufgerufen Return: *Frame oder 0 wenn nichts empfangen Der Frame muá jeweils bis zum n„chsten Aufruf verfgbar bleiben, d.h. jeder Aufruf l”scht den zuletzt gemeldeten Frame */ /* Is called periodically Return value: *Frame or null pointer if nothing was received The frame has to be readable until the next call to this function, i.e. every call removes the frame returned by the last call. */ L1FRAME far * far l1_get_framebuf(byte kanal); /* L2 fordert hiermit einen Sendepuffer an. Er muá die Maximall„nge aufnehmen k”nnen. Wenn erfolgreich, folgt vielleicht l1_tx_frame(), es kann aber auch vorkommen dass ein weiterer Aufruf erfolgt! Also nicht dynamisch allokieren, sondern nur einen Pointer liefern! Return: *Frame, der Frame wird hier hineingebaut 0 wenn kein Platz verfuegbar */ /* L2 requests a transmitter buffer. The buffer must be able to store the maximum length. If successful, a l1_tx_frame() probably follows, but it may also happen that another call to l1_get_framebuf() follows! Therefore, do not allocate dynamically, just return a pointer! Return value: *Frame : the frame is stored here 0 : no storage available */ byte far l1_tx_frame(void); /* Aussenden des Frames in vorher mit l1_get_framebuf angefordeten Buffers; Return: 1 wenn ok, sonst 0 Wenn der Sender aus ist, muss jetzt die Entscheidung fallen ob gesendet werden kann!!! ACHTUNG: Wenn die Sendung nicht moeglich ist, darf der Frame auf keinen Fall gespeichert werden! Stattdessen den Frame verwerfen und 0 returnen. DCD darf den Sender auch bei Halbduplex NICHT sperren! Dies ist Bedingung fuer das Funktionieren des FlexNet-OPTIMA-Zugriffsverfahrens. Die DCD- Verriegelung ist bereits in FlexNet enthalten! Wenn der TX bereits an ist (PTT an) und es werden bereits Frames gesendet, sollte der Frame zur Sendung zwischengespeichert werden, sofern der Puffer- platz dafuer ausreicht. Wenn nicht, 0 returnen, dann erfolgt spaeter ein neuer Versuch. In diesem Fall muss jedoch sichergestellt sein, dass der Frame auf jeden Fall noch in DIESEM Durchgang gesendet wird! Das Kanalzugriffstiming findet bereits im FlexNet-Kern statt! */ /* Transmit the frame in the buffer that was returned by the last l1_get_framebuf() Return value: 1 if ok, 0 if not. If the transmitter is off, then the decision must now be made if transmission is possible!!! WARNING: If transmission is not possible now, the frame MUST NOT be stored! The frame should be thrown away and zero should be returned. DCD must not inhibit the transmitter, not even in half duplex mode! This is a necessity for the FlexNet-OPTIMA-Channel access algorithm. The Kernel already contains the DCD transmitter inhibit. If the transmitter is already on (PTT keyed) and frames are being sent, then the frame should be stored if the buffer memory suffices. If not, zero should be returned, the kernel will try again later. If the frame is stored, it is important that it gets transmitted during the same transmission! The channel access timing is already handled by the FlexNet kernel! */ void far l1_tx_calib(byte kanal, byte minutes); /* Sofern die Hardware es erlaubt, Sender in Calibrate-Modus schalten. Minutes=0 stoppt den Calibrate-Mode sofort. */ /* If the hardware allows it, switch the transmitter into the calibrate mode (i.e. start transmitting a calibration pattern) minutes=0 should immediately stop the calibration mode. */ byte far l1_ch_state(byte kanal); /* Gibt verschiedene Kanalzust„nde zurck, Bits sind 1 wenn wahr: 0x40 RxB RxBuffer ist nicht leer 0x20 PTT Sender ist an 0x10 DCD Empf„nger ist aktiv 0x08 FDX Kanal ist Vollduplex, kann also immer empfangen 0x04 TBY Sender ist nicht bereit, z.B. wegen Calibrate Anmerkung: Die korrekte Bedienung dieser Flags ist essentiell fuer das Funktionieren des FlexNet-Kanalzugriffstimings incl. DAMA-Master und -Slave. Erlaeuterungen zu den Flags: RxB ist 1 wenn gueltige RX-Frames im Puffer liegen. Verriegelt u.a. den Sender bei Halbduplex, da immer erst alle Frames verarbeitet werden sollen. Waehrend des Empfangs muss dieses Flag mit DCD ueberlappend bedient werden, d.h. sobald ein RX-Frame als gueltig erkannt wird, muss RxB spaetestens 1 werden, wenn DCD 0 wird! PTT 1 wenn der TX bereits an ist. Dann setzt FlexNet voraus dass uebergebene Frames in diesem Durchgang noch gesendet werden koennen. Braucht nicht bedient zu werden bei reinen Vollduplextreibern, also wenn FDX 1 ist. DCD 1 wenn der Kanal belegt ist. Darf im Treiber den Sender nicht blockieren, die Entscheidung ob gesendet werden kann faellt stets im FlexNet-Kern! FDX Ist eine typabhaengige Konstante. Stets 0 bei Treibern die einen Halb- duplexkanal bedienen koennen, also die PTT- und DCD-Flags korrekt ansteuern. Treiber die kein Kanalzugriffstiming benoetigen (z.B. Ethernet, SLIP, KISS f. reine Rechnerkopplung usw.), liefern hier 1. TBY Dient nur zur Beschleunigung des Kernels. Wenn 1, wird nichts gesendet. Kann also z.B. waehrend Calibrate oder bei abgeschaltetem Kanal gesetzt werden */ /* return different channel states. The following bits are one if true: 0x40 RxB RxBuffer is not empty 0x20 PTT Transmitter is keyed on 0x10 DCD Receiver is active 0x08 FDX Channel is full duplex, receiver can always receive 0x04 TBY Transmitter not ready, for example because of ongoing calibration Note: It is essential that these flags are services correctly. Otherwise, the channel access timing including DAMA master and slave will not work correctly. Explanation of the flags: RxB is 1 if valid RX frames are available in the buffer. Inhibits for example the transmitter in half duplex mode, because all frames should be processed before transmitting. During receipt this flag should overlap the DCD flag, i.e. RxB should go to one before DCD transitions to zero! PTT 1 if the transmitter is already keyed up. In this case, FlexNet assumes that frames passed are sent during the same transmission. Needs not be serviced by full duplex drivers (i.e. if FDX is one) DCD 1 if the channel is busy. Must not inhibit the transmitter in the driver, since the decision if one should transmit is made by the FlexNet kernel! FDX is a driver dependent constant. Always 0 for drivers that may service a half duplex channel, i.e. that serve the PTT and DCD flags correctly. Drivers that do not need a channel access timing (for example Ethernet, SLIP, KISS for connecting PCs and so on), should return 1. TBY Speeds up the kernel. If 1, it will not try to send. May be set to one for example during calibration or if the channel is switched off. */ u16 far l1_scale(byte kanal); /* Baudratenabh„ngigen Faktor liefern, wird fr diverse adaptive Parms gebraucht, u.a. T2-Steuerung. Return: 300 Baud: 2048 9600 Baud: 64 oder anders ausgedrckt: Return = 614400/[Baudrate] Sollte die real moegliche Geschwindigkeit des Kanals liefern. Bei Treibern, die die in init_kanal() uebergebene Baudrate verwenden, berechnen. Treiber, die diese nicht verwenden, sollten einen Schaetzwert liefern. Bei sehr schnellen Kanaelen (z.B. Ethernet) immer 0 liefern! */ /* Return a baud rate dependent factor. Is needed to calculate several adaptive parameters, for example T2 control Return value: 300 baud: 2048 9600 baud: 64 or as a formula: Return value = 614400/[baud rate] Should return the real speed of the channel. Drivers that use the baud rate specified in init_kanal() should calculate the return value. Drivers that do not use this parameter should estimate the speed of the channel. Drivers for very fast channels (for example Ethernet) should always return 0! */ char far * far l1_ident(byte kanal); /* Kennung fr Kanalhardware bzw. Treibertyp zurckgeben. Geliefert wird ein far-pointer auf einen null-terminierten String. Der String fr die Kanalhardware ist maximal 8 Zeichen lang, z.B. "SCC0" .. "SCC3", "RS232", "PAR96", "KISS", "IPX", usw. */ /* Return an identifier for the channel hardware or the driver type. The return value must be a far pointer to a zero terminated string. The string should be at most 8 characters long. Examples are "SCC0" .. "SCC3", "RS232", "PAR96", "KISS", "IPX", etc. */ char far * far l1_version(byte kanal); /* Versionsnummernstring liefern. Maximal 5 Zeichen */ /* Return a version number string. At most 5 characters. */ L1_STATISTICS far * far l1_stat(byte kanal, byte delete); /* Statistikwerte liefern Delete = 1: Werte auf 0 zuruecksetzen! Wenn nicht implementiert, Nullpointer liefern! */ /* Return the statistics. Delete = 1: clear the statistics values! If not implemented, return a null pointer! */ void set_led(byte kanal, byte ledcode); /* Falls der Kanal Status-LEDs hat (z.B. TNC), kommen hier die Zustaende bei jeder Aenderung an; kann sicherlich meistens Dummy sein: Bitmasken dazu: */ /* If the channel hardware has status LEDs (for example a TNC), this procedure may be used to drive them; in most cases, this procedure may be a dummy. Bitmasks used: */ #define LED_CON 2 /* Mindestens 1 Connect - at least one connect */ #define LED_STA 4 /* Sendeseitig ausstehende Frames - frames in the transmitter buffer */ /*---------------------------------------------------------------------------*/ #ifndef _WIN32 /* Pointer auf unsigned-Timertic, f. schnellen Zugriff wenn Zeitintervalle geprueft werden muessen. Inkrementiert alle 100ms mit Phasenjitter */ /* Pointer to an unsigned timer_tic, for fast access if timing intervals need to be measured. Increments every 100ms with phase jitter */ extern const volatile far u16 *timer_tic; /* Variable fuer externe Kommunikation zwischen Modulen Koennen bei Bedarf besetzt werden */ /* Variables for intermodule communications May be used if needed */ extern u16 device_type; /* Bitte vor Vergabe DK7WJ konsultieren! */ /* Please consult DK7WJ prior to usage! */ extern u16 device_version; /* Versionskennung - version identifier */ extern void far *device_vector; /* Beliebiger Vektor, wird zurueckgeliefert */ /* arbitrary vector returned by device_vec() */ extern void far (*drv_cb)(void); typedef struct { u16 ds; u16 es; u16 cs; u16 dsize; u16 esize; u16 csize; u16 offset; u16 irq; u16 revision; u16 ioport1; u16 ioextent1; u16 ioport2; u16 ioextent2; } defint; extern defint intsegs; #define DEFINT_REVISION 1 /*---------------------------------------------------------------------------*/ /* Die folgenden Aufrufe werden durch den Treiberkern bereitgestellt */ /* The following procedures are supplied by the driver library */ /*---------------------------------------------------------------------------*/ /* Einige einfache Ausgaberoutinen, die die Verwendung von printf() ersparen */ /* Nur waehrend der Initialisierung in init_device() verwenden!! */ /* Some simple console output routines, that make printf() unnecessary */ /* May only be used during initialisation, inside init_device()!! */ void far pch(byte character); /* Gibt ein Zeichen auf die Konsole aus Print a character onto the console */ void far pstr(byte near *string); /* Gibt einen C-String auf die Konsole aus Print a C string onto the console */ void far pnum(u16 num); /* Gibt einen numerischen Wert dezimal aus Print a decimal numerical value onto the console */ void far phex(u16 hex); /* Gibt einen numerischen Wert hexadezimal aus Print a hexadecimal numerical value onto the console */ #endif // _WIN32 baycomusb-0.10.orig/flexdrv/resource.h0100644000175100017510000000054707340467137016103 0ustar abaaba#define IDD_DIALOG1 101 #define IDC_SERIAL 1000 #define IDC_MODE 1001 #define IDC_BITRATERX 1002 #define IDC_BITRATETX 1003 #define IDC_TXDELAY 1004 #define IDC_FULLDUPLEX 1005 #define IDC_PTTMUTE 1006 baycomusb-0.10.orig/trxclient/0042755000175100017510000000000007340500012014420 5ustar abaababaycomusb-0.10.orig/trxclient/Makefile.in0100644000175100017510000002025007340500012016457 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = @ORBIT_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/trxapi noinst_PROGRAMS = trxclient trxclient_SOURCES = client.c trxclient_LDADD = ../flexdrv/libtrxapi.a ../misc/libmisc.a @ORBIT_LIBS@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = noinst_PROGRAMS = trxclient$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ trxclient_OBJECTS = client.$(OBJEXT) trxclient_DEPENDENCIES = ../flexdrv/libtrxapi.a ../misc/libmisc.a trxclient_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(trxclient_SOURCES) OBJECTS = $(trxclient_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps trxclient/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstPROGRAMS: clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) distclean-noinstPROGRAMS: maintainer-clean-noinstPROGRAMS: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: trxclient$(EXEEXT): $(trxclient_OBJECTS) $(trxclient_DEPENDENCIES) @rm -f trxclient$(EXEEXT) $(LINK) $(trxclient_LDFLAGS) $(trxclient_OBJECTS) $(trxclient_LDADD) $(LIBS) 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = trxclient 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 $(PROGRAMS) 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-noinstPROGRAMS mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-noinstPROGRAMS clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-noinstPROGRAMS distclean-compile distclean-tags \ distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-noinstPROGRAMS \ 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-noinstPROGRAMS distclean-noinstPROGRAMS \ clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile 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: baycomusb-0.10.orig/trxclient/Makefile.am0100644000175100017510000000045407331015516016464 0ustar abaabaINCLUDES = @ORBIT_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \ -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/trxapi noinst_PROGRAMS = trxclient trxclient_SOURCES = client.c trxclient_LDADD = ../flexdrv/libtrxapi.a ../misc/libmisc.a @ORBIT_LIBS@ baycomusb-0.10.orig/trxclient/client.c0100644000175100017510000002201407335251272016053 0ustar abaaba/*****************************************************************************/ /* * client.c -- Transceiver control client. * * Copyright (C) 2000, 2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "trxapi.h" #include #include #include #include #include /* --------------------------------------------------------------------- */ static unsigned int verboselevel = 0; #if defined(WIN32) #define UINT64_FORMAT "I64u" #else #define UINT64_FORMAT "llu" #endif /* --------------------------------------------------------------------- */ static void list_trxobjects(void) { unsigned int index = 0, i; struct trxapi *trx; const struct trxapi_description *desc; struct trxapi_state state; for (;; index++) { if (!(trx = trxapi_open_byindex(index))) break; printf("Transceiver Index %u\n", index); desc = trxapi_get_description(trx); if (!desc) { printf(" trxapi_get_description error\n"); trxapi_close(trx); continue; } printf(" Manufacturer : %s\n" " Model : %s\n" " Copyright : %s\n" " Instance ID (serial no): %s\n" " RSSI range : %gdB..%gdB\n" " Receive Bands:\n", desc->manufacturer, desc->model, desc->copyright, desc->instid, desc->rssimin, desc->rssimax); for (i = 0; i < desc->nrrxbands; i++) printf(" Frequency range %10" UINT64_FORMAT "-%10" UINT64_FORMAT " stepsize %10" UINT64_FORMAT "\n", desc->rxbands[i].low, desc->rxbands[i].high, desc->rxbands[i].step); printf(" Transmit Bands:\n"); for (i = 0; i < desc->nrtxbands; i++) printf(" Frequency range %10" UINT64_FORMAT "-%10" UINT64_FORMAT " stepsize %10" UINT64_FORMAT "\n", desc->txbands[i].low, desc->txbands[i].high, desc->txbands[i].step); if (trxapi_get_state(trx, &state)) { printf(" trxapi_get_state error\n"); trxapi_close(trx); continue; } printf(" RX Frequency : %10" UINT64_FORMAT "\n" " TX Frequency : %10" UINT64_FORMAT "\n", state.rxfreq, state.txfreq); printf(" PTT : %s\n" " DCD : %s\n" " RSSI : %gdB\n", state.ptt ? "on" : "off", state.dcd ? "on" : "off", state.rssi); trxapi_close(trx); } if (!index) printf("No Transceivers found\n"); } /* --------------------------------------------------------------------- */ static int periodic_trxstate(unsigned int index) { unsigned int i; struct trxapi *trx; const struct trxapi_description *desc; struct trxapi_state state; if (!(trx = trxapi_open_byindex(index))) { fprintf(stderr, "Cannot find transceiver index %u\n", index); return 1; } printf("Transceiver Index %u\n", index); desc = trxapi_get_description(trx); if (!desc) { printf(" trxapi_get_description error\n"); trxapi_close(trx); return 1; } printf(" Manufacturer : %s\n" " Model : %s\n" " Copyright : %s\n" " Instance ID (serial no): %s\n" " RSSI range : %gdB..%gdB\n" " Receive Bands:\n", desc->manufacturer, desc->model, desc->copyright, desc->instid, desc->rssimin, desc->rssimax); for (i = 0; i < desc->nrrxbands; i++) printf(" Frequency range %10" UINT64_FORMAT "-%10" UINT64_FORMAT " stepsize %10" UINT64_FORMAT "\n", desc->rxbands[i].low, desc->rxbands[i].high, desc->rxbands[i].step); printf(" Transmit Bands:\n"); for (i = 0; i < desc->nrtxbands; i++) printf(" Frequency range %10" UINT64_FORMAT "-%10" UINT64_FORMAT " stepsize %10" UINT64_FORMAT "\n", desc->txbands[i].low, desc->txbands[i].high, desc->txbands[i].step); for (;;) { if (trxapi_get_state(trx, &state)) { printf(" trxapi_get_state error\n"); trxapi_close(trx); return 1; } printf("RX %10" UINT64_FORMAT " TX %10" UINT64_FORMAT " PTT %c DCD %c RSSI %8.2fdB\n", state.rxfreq, state.txfreq, state.ptt ? 'P' : '-', state.dcd ? 'D' : '-', state.rssi); sleep(1); } trxapi_close(trx); } /* --------------------------------------------------------------------- */ static int setfreq(unsigned int index, unsigned int rx, unsigned int tx) { struct trxapi *trx; if (!(trx = trxapi_open_byindex(index))) { fprintf(stderr, "Cannot find transceiver index %u\n", index); return 1; } if (trxapi_set_frequency(trx, rx, tx)) { printf(" trxapi_set_frequency error\n"); trxapi_close(trx); return 1; } trxapi_close(trx); return 0; } /* --------------------------------------------------------------------- */ static int rxuart(unsigned int index) { unsigned long fifoptr = 0; struct trxapi *trx; char buf[256]; char *cp; if (!(trx = trxapi_open_byindex(index))) { fprintf(stderr, "Cannot find transceiver index %u\n", index); return 1; } for (;;) { if (trxapi_uart_receive(trx, &fifoptr, buf, sizeof(buf))) { printf(" trxapi_uart_receive error\n"); trxapi_close(trx); return 1; } cp = buf; while ((cp = strchr(cp, '\r'))) *cp++ = '\n'; printf("%s", buf); fflush(stdout); sleep(1); } trxapi_close(trx); return 0; } /* --------------------------------------------------------------------- */ static int txuart(unsigned int index, const char *str) { struct trxapi *trx; char buf[256]; if (!(trx = trxapi_open_byindex(index))) { fprintf(stderr, "Cannot find transceiver index %u\n", index); return 1; } snprintf(buf, sizeof(buf), "%s\r", str); if (trxapi_uart_send(trx, buf)) { printf(" trxapi_uart_send error\n"); trxapi_close(trx); return 1; } trxapi_close(trx); return 0; } /* --------------------------------------------------------------------- */ static int setptt(unsigned int index, unsigned int ptt) { struct trxapi *trx; if (!(trx = trxapi_open_byindex(index))) { fprintf(stderr, "Cannot find transceiver index %u\n", index); return 1; } if (trxapi_set_ptt(trx, ptt)) { printf(" trxapi_set_ptt error\n"); trxapi_close(trx); return 1; } trxapi_close(trx); return 0; } /* --------------------------------------------------------------------- */ int main (int argc, char *argv[]) { static const struct option long_options[] = { { "list", 0, 0, 'l' }, { "setfreq", 0, 0, 's' }, { "rxuart", 0, 0, 'r' }, { "txuart", 0, 0, 't' }, { "ptt", 0, 0, 'p' }, { "verbose", 0, 0, 'v' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } }; int c, err = 0; unsigned int index = 0, mode = 0; printf("trxclient v" VERSION " (c) 2000 by Thomas Sailer, HB9JNX/AE4WA\n"); /* init CORBA */ if (trxapi_init(&argc, argv)) exit(1); while ((c = getopt_long(argc, argv, "vli:srpt", long_options, NULL)) != EOF) { switch (c) { case 'v': verboselevel++; break; case 'l': mode = 1; break; case 's': mode = 2; break; case 'r': mode = 3; break; case 'p': mode = 4; break; case 't': mode = 5; break; case 'i': index = strtoul(optarg, NULL, 0); break; default: err++; break; } } if (err) { fprintf(stderr, "usage: %s [-v] [-l]\n", argv[0]); exit(1); } switch (mode) { default: exit(periodic_trxstate(index)); case 1: list_trxobjects(); exit(0); case 2: if (optind + 2 > argc) { fprintf(stderr, "usage: %s -s \n", argv[0]); exit(1); } exit(setfreq(index, strtoul(argv[optind], NULL, 0), strtoul(argv[optind+1], NULL, 0))); case 3: exit(rxuart(index)); case 4: if (optind + 1 > argc) { fprintf(stderr, "usage: %s -s \n", argv[0]); exit(1); } exit(setptt(index, strtoul(argv[optind], NULL, 0))); case 5: if (optind + 1 > argc) { fprintf(stderr, "usage: %s -s \n", argv[0]); exit(1); } exit(txuart(index, argv[optind])); } return 0; } baycomusb-0.10.orig/winserv/0042755000175100017510000000000007340500012014101 5ustar abaababaycomusb-0.10.orig/winserv/Makefile.in0100644000175100017510000002222607340500012016145 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = @ORBIT_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 -I$(top_srcdir)/trxapi -I$(top_srcdir)/trxctrl -I$(top_srcdir)/flexdrv @WIN32_TRUE@sbin_PROGRAMS = baycomusbserv @WIN32_TRUE@baycomusbserv_SOURCES = serv.c @WIN32_TRUE@baycomusbserv_LDADD = ../flexdrv/libbayusb.a EXTRA_DIST = serv.c mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = @WIN32_TRUE@sbin_PROGRAMS = baycomusbserv$(EXEEXT) PROGRAMS = $(sbin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ @WIN32_TRUE@baycomusbserv_OBJECTS = serv.$(OBJEXT) @WIN32_TRUE@baycomusbserv_DEPENDENCIES = ../flexdrv/libbayusb.a baycomusbserv_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(baycomusbserv_SOURCES) OBJECTS = $(baycomusbserv_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps winserv/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-sbinPROGRAMS: clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) distclean-sbinPROGRAMS: maintainer-clean-sbinPROGRAMS: install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(sbindir) @list='$(sbin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) list='$(sbin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: baycomusbserv$(EXEEXT): $(baycomusbserv_OBJECTS) $(baycomusbserv_DEPENDENCIES) @rm -f baycomusbserv$(EXEEXT) $(LINK) $(baycomusbserv_LDFLAGS) $(baycomusbserv_OBJECTS) $(baycomusbserv_LDADD) $(LIBS) 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = winserv 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-sbinPROGRAMS 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-sbinPROGRAMS uninstall: uninstall-am all-am: Makefile $(PROGRAMS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(sbindir) 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-sbinPROGRAMS mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-sbinPROGRAMS clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-sbinPROGRAMS distclean-compile distclean-tags \ distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-sbinPROGRAMS \ 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-sbinPROGRAMS distclean-sbinPROGRAMS \ clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \ install-sbinPROGRAMS mostlyclean-compile distclean-compile \ clean-compile maintainer-clean-compile 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: baycomusb-0.10.orig/winserv/Makefile.am0100644000175100017510000000071707332033116016144 0ustar abaabaINCLUDES = @ORBIT_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \ -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv \ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 \ -I$(top_srcdir)/trxapi -I$(top_srcdir)/trxctrl -I$(top_srcdir)/flexdrv if WIN32 sbin_PROGRAMS = baycomusbserv baycomusbserv_SOURCES = serv.c baycomusbserv_LDADD = ../flexdrv/libbayusb.a endif EXTRA_DIST = serv.c baycomusb-0.10.orig/winserv/serv.c0100644000175100017510000001532507330045746015246 0ustar abaaba/*****************************************************************************/ /* * serv.c -- Win32 bayusb service starter. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * History: * 0.1 19.09.2000 Created */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _REENTRANT #include "trx.h" #include #include #include #include #include #include #include /* --------------------------------------------------------------------- */ static unsigned int verboselevel = 10; static unsigned int syslogmsg = 1; /* --------------------------------------------------------------------- */ int lprintf(unsigned vl, const char *format, ...) { va_list ap; int r; if (vl > verboselevel) return 0; va_start(ap, format); if (syslogmsg) { char buf[512]; r = vsnprintf(buf, sizeof(buf), format, ap); OutputDebugString(buf); } else { r = vfprintf(stderr, format, ap); fflush(stderr); } va_end(ap); return r; } /* --------------------------------------------------------------------- */ static SERVICE_STATUS MyServiceStatus; static SERVICE_STATUS_HANDLE MyServiceStatusHandle; static void BaycomUsbServiceCtrlHandler(DWORD Opcode) { DWORD status; switch(Opcode) { case SERVICE_CONTROL_STOP: server_entry_quit(); MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); lprintf(1, "SetServiceStatus error %ld\n",status); } lprintf(1, "Stopping baycomusbserv\n"); return; case SERVICE_CONTROL_INTERROGATE: /* Fall through to send current status. */ break; default: lprintf(1, "BaycomUsbServiceCtrlHandler: Unrecognized opcode %ld\n", Opcode); } /* Send current status. */ if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); lprintf(1, "SetServiceStatus error %ld\n",status); } } static void BaycomUsbServiceStart(DWORD argc, LPTSTR *argv) { DWORD status; char *args[8]; MyServiceStatus.dwServiceType = SERVICE_WIN32; MyServiceStatus.dwCurrentState = SERVICE_START_PENDING; MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwServiceSpecificExitCode = 0; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; MyServiceStatusHandle = RegisterServiceCtrlHandler(SERVICENAME, BaycomUsbServiceCtrlHandler); if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { lprintf(1, "RegisterServiceCtrlHandler failed %ld\n", GetLastError()); return; } args[0] = "baycomusbserv"; args[1] = "-s"; args[2] = "-v"; args[3] = "10"; if (!argc){ argc = 4; argv = args; } if (server_entry_parse_argv(argc, argv)) { MyServiceStatus.dwCurrentState = SERVICE_STOPPED; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; MyServiceStatus.dwWin32ExitCode = ERROR_ACCESS_DENIED; MyServiceStatus.dwServiceSpecificExitCode = ERROR_INVALID_DATA; SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus); return; } /* Initialization complete - report running status. */ MyServiceStatus.dwCurrentState = SERVICE_RUNNING; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); lprintf(1, "SetServiceStatus error %ld\n",status); } MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwServiceSpecificExitCode = 0; if (server_entry_run()) { MyServiceStatus.dwWin32ExitCode = ERROR_ACCESS_DENIED; MyServiceStatus.dwServiceSpecificExitCode = ERROR_INVALID_DATA; } MyServiceStatus.dwCurrentState = SERVICE_STOPPED; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus(MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); lprintf(1, "SetServiceStatus error %ld\n",status); } lprintf(1, "baycomusbserv stopped\n"); } /* --------------------------------------------------------------------- */ int main(int argc, char *argv[]) { SERVICE_TABLE_ENTRY DispatchTable[] = { { SERVICENAME, BaycomUsbServiceStart }, { NULL, NULL } }; printf("baycomusbserv v" VERSION " (c) 1999-2001 by Thomas Sailer, HB9JNX/AE4WA\n"); if (argc >= 2 && !strcmp(argv[1], "-S")) { if (!StartServiceCtrlDispatcher(DispatchTable)) { lprintf(0, "Error starting service: %lu\n", GetLastError()); exit(1); } lprintf(0, "Starting Service\n"); return 0; } if (server_entry_parse_argv(argc, argv)) return 1; return server_entry_run(); } baycomusb-0.10.orig/diag/0042755000175100017510000000000007340500013013311 5ustar abaababaycomusb-0.10.orig/diag/Makefile.in0100644000175100017510000003130007340500013015346 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = @GTK_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv -I$(top_srcdir)/diag -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 -I$(top_srcdir)/kerneldrv -I$(top_srcdir)/wdmdrv man_MANS = baycomusb.8 sbin_PROGRAMS = baycomusb writeeeprom noinst_LIBRARIES = libbaycomusb.a baycomusb_SOURCES = baycomusb.c baycomusb_LDADD = libbaycomusb.a ../flexdrv/libusb.a ../misc/libmisc.a @XMLLIBS@ writeeeprom_SOURCES = writeeeprom.c writeeeprom_LDADD = libbaycomusb.a ../flexdrv/libusb.a ../misc/libmisc.a CLEANFILES = noinst_HEADERS = baycomusb.h @WIN32_TRUE@libbaycomusb_a_SOURCES = cfgwin32.c configadapt.c adapttests.c @WIN32_FALSE@libbaycomusb_a_SOURCES = cfgunix.c configadapt.c adapttests.c EXTRA_DIST = baycomusb.8 cfgunix.c cfgwin32.c configadapt.c adapttests.c mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libbaycomusb_a_LIBADD = @WIN32_TRUE@libbaycomusb_a_OBJECTS = cfgwin32.$(OBJEXT) \ @WIN32_TRUE@configadapt.$(OBJEXT) adapttests.$(OBJEXT) @WIN32_FALSE@libbaycomusb_a_OBJECTS = cfgunix.$(OBJEXT) \ @WIN32_FALSE@configadapt.$(OBJEXT) adapttests.$(OBJEXT) sbin_PROGRAMS = baycomusb$(EXEEXT) writeeeprom$(EXEEXT) PROGRAMS = $(sbin_PROGRAMS) baycomusb_OBJECTS = baycomusb.$(OBJEXT) baycomusb_DEPENDENCIES = libbaycomusb.a ../flexdrv/libusb.a \ ../misc/libmisc.a baycomusb_LDFLAGS = writeeeprom_OBJECTS = writeeeprom.$(OBJEXT) writeeeprom_DEPENDENCIES = libbaycomusb.a ../flexdrv/libusb.a \ ../misc/libmisc.a writeeeprom_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ man8dir = $(mandir)/man8 MANS = $(man_MANS) NROFF = nroff HEADERS = $(noinst_HEADERS) DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(libbaycomusb_a_SOURCES) $(baycomusb_SOURCES) $(writeeeprom_SOURCES) OBJECTS = $(libbaycomusb_a_OBJECTS) $(baycomusb_OBJECTS) $(writeeeprom_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps diag/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstLIBRARIES: clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) distclean-noinstLIBRARIES: maintainer-clean-noinstLIBRARIES: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: libbaycomusb.a: $(libbaycomusb_a_OBJECTS) $(libbaycomusb_a_DEPENDENCIES) -rm -f libbaycomusb.a $(AR) cru libbaycomusb.a $(libbaycomusb_a_OBJECTS) $(libbaycomusb_a_LIBADD) $(RANLIB) libbaycomusb.a mostlyclean-sbinPROGRAMS: clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) distclean-sbinPROGRAMS: maintainer-clean-sbinPROGRAMS: install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(sbindir) @list='$(sbin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) list='$(sbin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done baycomusb$(EXEEXT): $(baycomusb_OBJECTS) $(baycomusb_DEPENDENCIES) @rm -f baycomusb$(EXEEXT) $(LINK) $(baycomusb_LDFLAGS) $(baycomusb_OBJECTS) $(baycomusb_LDADD) $(LIBS) writeeeprom$(EXEEXT): $(writeeeprom_OBJECTS) $(writeeeprom_DEPENDENCIES) @rm -f writeeeprom$(EXEEXT) $(LINK) $(writeeeprom_LDFLAGS) $(writeeeprom_OBJECTS) $(writeeeprom_LDADD) $(LIBS) install-man8: $(mkinstalldirs) $(DESTDIR)$(man8dir) @list='$(man8_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.8*) 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)$(man8dir)/$$inst"; \ $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \ done uninstall-man8: @list='$(man8_MANS)'; \ l2='$(man_MANS)'; for i in $$l2; do \ case "$$i" in \ *.8*) 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)$(man8dir)/$$inst"; \ rm -f $(DESTDIR)$(man8dir)/$$inst; \ done install-man: $(MANS) @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-man8 uninstall-man: @$(NORMAL_UNINSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-man8 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = diag 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 cfgunix.o: cfgunix.c ../config.h ../misc/getopt.h baycomusb.h \ ../misc/sysdeps.h ../usbdrv/usbdrv.h configadapt.o: configadapt.c ../misc/getopt.h baycomusb.h \ ../misc/sysdeps.h ../config.h ../usbdrv/usbdrv.h \ ../fpga/fsk_fpga.h ../fpga/fsk_firmware.h \ ../fpga/afsk_firmware.h ../fpga/sample_firmware.h \ ../firmware/reset2firmware.h ../firmware/dl2firmware.h \ ../firmware/bscanfirmware.h ../firmware/fskfirmware.h \ ../firmware/afskfirmware.h ../firmware/audiofirmware.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-sbinPROGRAMS 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-sbinPROGRAMS uninstall-man uninstall: uninstall-am all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man8 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: mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ mostlyclean-sbinPROGRAMS mostlyclean-tags \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-noinstLIBRARIES clean-compile clean-sbinPROGRAMS \ clean-tags clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-noinstLIBRARIES distclean-compile \ distclean-sbinPROGRAMS distclean-tags distclean-generic \ clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ maintainer-clean-compile maintainer-clean-sbinPROGRAMS \ 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-noinstLIBRARIES distclean-noinstLIBRARIES \ clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile mostlyclean-sbinPROGRAMS \ distclean-sbinPROGRAMS clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS \ uninstall-sbinPROGRAMS install-sbinPROGRAMS install-man8 uninstall-man8 \ 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: baycomusb-0.10.orig/diag/Makefile.am0100644000175100017510000000170207331024436015352 0ustar abaaba## Process this file with automake to produce Makefile.in INCLUDES = @GTK_CFLAGS@ @XMLCFLAGS@ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \ -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/usbdrv -I$(top_srcdir)/diag \ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 -I$(top_srcdir)/kerneldrv -I$(top_srcdir)/wdmdrv man_MANS = baycomusb.8 sbin_PROGRAMS = baycomusb writeeeprom noinst_LIBRARIES = libbaycomusb.a baycomusb_SOURCES = baycomusb.c baycomusb_LDADD = libbaycomusb.a ../flexdrv/libusb.a ../misc/libmisc.a @XMLLIBS@ writeeeprom_SOURCES = writeeeprom.c writeeeprom_LDADD = libbaycomusb.a ../flexdrv/libusb.a ../misc/libmisc.a CLEANFILES = noinst_HEADERS = baycomusb.h if WIN32 libbaycomusb_a_SOURCES = cfgwin32.c configadapt.c adapttests.c else libbaycomusb_a_SOURCES = cfgunix.c configadapt.c adapttests.c endif EXTRA_DIST = baycomusb.8 cfgunix.c cfgwin32.c configadapt.c adapttests.c baycomusb-0.10.orig/diag/cfgunix.c0100644000175100017510000002713507340456364015146 0ustar abaaba/*****************************************************************************/ /* * cfgunix.c -- UNIX configuration file IO. * * Copyright (C) 1999-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "baycomusb.h" /* libxml includes */ #include #include /* ---------------------------------------------------------------------- */ #define MAXCONFIGENTRIES 32 static char configfile[256] = "/etc/ax25/baycomusb.conf"; static struct configentry configs[MAXCONFIGENTRIES]; /* ---------------------------------------------------------------------- */ void config_setfile(const char *name) { if (!name) name = "/etc/ax25/baycomusb.conf"; strncpy(configfile, name, sizeof(configfile)); } const char *config_getfile(void) { return configfile; } struct configentry *config_entry(unsigned int index) { struct configentry *cfg; unsigned int i; for (cfg = &configs[0], i = 0; i < MAXCONFIGENTRIES; i++, cfg++) { if (!cfg->serial[0]) continue; if (!index) return cfg; index--; } return NULL; } struct configentry *config_findentry(const char *ser) { struct configentry *cfg; unsigned int i; for (cfg = &configs[0], i = 0; i < MAXCONFIGENTRIES; i++, cfg++) { if (!cfg->serial[0]) continue; if (!strcmp(cfg->serial, ser)) return cfg; } return NULL; } struct configentry *config_lookup(const char *ser) { struct configentry *cfg; unsigned int i; for (cfg = &configs[0], i = 0; i < MAXCONFIGENTRIES; i++, cfg++) { if (!cfg->serial[0]) continue; if (!strcmp(cfg->serial, ser)) return cfg; } return &configs[0]; } struct configentry *config_newentry(void) { struct configentry *cfg; unsigned int i; for (cfg = &configs[1], i = 1; i < MAXCONFIGENTRIES && cfg->serial[0]; i++, cfg++); if (i >= MAXCONFIGENTRIES) return NULL; config_default(&configs[i]); return &configs[i]; } int config_deleteentry(struct configentry *cfg) { if (!cfg) return -1; if (cfg == &configs[0]) return -1; cfg->serial[0] = 0; return 0; } /* ---------------------------------------------------------------------- */ static void parseone(xmlNodePtr node, struct configentry *cfg) { const char *cp; for (; node; node = node->next) { if (!node->name) { lprintf(10, "Node has no name\n"); continue; } if (!strcmp(node->name, "adapter")) { if ((cp = xmlGetProp(node, "mode"))) { if (!strcmp(cp, "fsk")) { cfg->adapter.mode = MODE_FSK; } else if (!strcmp(cp, "external")) { cfg->adapter.mode = MODE_EXTERNAL; } else if (!strcmp(cp, "afsk")) { cfg->adapter.mode = MODE_AFSK; } else if (!strcmp(cp, "audio")) { cfg->adapter.mode = MODE_AUDIO; } else if (!strcmp(cp, "bscan")) { cfg->adapter.mode = MODE_BSCAN; } } if ((cp = xmlGetProp(node, "fclk"))) cfg->adapter.fclk = strtoul(cp, NULL, 0); /* legacy */ if ((cp = xmlGetProp(node, "bitrate"))) cfg->adapter.bitraterx = cfg->adapter.bitratetx = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "bitraterx"))) cfg->adapter.bitraterx = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "bitratetx"))) cfg->adapter.bitratetx = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "samplerate"))) cfg->adapter.samplerate = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "loopback"))) cfg->adapter.loopback = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "pttmute"))) cfg->adapter.pttmute = !(cp[0] == '0' || cp[0] == 'n' || cp[0] == 'N'); if ((cp = xmlGetProp(node, "filtmode"))) cfg->adapter.filtmode = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "gain"))) cfg->adapter.gain = strtoul(cp, NULL, 0); } else if (!strcmp(node->name, "chaccess")) { if ((cp = xmlGetProp(node, "txdelay"))) cfg->chaccess.txdelay = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "slottime"))) cfg->chaccess.slottime = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "ppersistence"))) cfg->chaccess.ppersistence = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "txtail"))) cfg->chaccess.txtail = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "fullduplex"))) cfg->chaccess.fullduplex = !(cp[0] == '0' || cp[0] == 'n' || cp[0] == 'N'); } else if (!strcmp(node->name, "interface")) { if ((cp = xmlGetProp(node, "ifname"))) strncpy(cfg->ifcfg.ifname, cp, sizeof(cfg->ifcfg.ifname)); if ((cp = xmlGetProp(node, "hwaddr"))) strncpy(cfg->ifcfg.hwaddr, cp, sizeof(cfg->ifcfg.hwaddr)); if ((cp = xmlGetProp(node, "ipaddr"))) strncpy(cfg->ifcfg.ipaddr, cp, sizeof(cfg->ifcfg.ipaddr)); if ((cp = xmlGetProp(node, "netmask"))) strncpy(cfg->ifcfg.netmask, cp, sizeof(cfg->ifcfg.netmask)); if ((cp = xmlGetProp(node, "broadcast"))) strncpy(cfg->ifcfg.broadcast, cp, sizeof(cfg->ifcfg.broadcast)); } else if (!strcmp(node->name, "modemdisc")) { if ((cp = xmlGetProp(node, "output"))) cfg->mdisc.output = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "direction"))) cfg->mdisc.direction = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "rxc"))) cfg->mdisc.rxc = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "txc"))) cfg->mdisc.txc = strtoul(cp, NULL, 0); if ((cp = xmlGetProp(node, "txd"))) cfg->mdisc.txd = strtoul(cp, NULL, 0); } else if (!strcmp(node->name, "t7f")) { if ((cp = xmlGetProp(node, "ctrl"))) cfg->t7f.ctrl =strtoul(cp, NULL, 0) ; } else { lprintf(10, "Unknown node %s\n", node->name); continue; } } } void config_default(struct configentry *cfg) { cfg->serial[0] = 0; cfg->adapter.mode = MODE_FSK; cfg->adapter.fclk = 19666600; cfg->adapter.bitraterx = cfg->adapter.bitratetx = 9600; cfg->adapter.samplerate = 8000; cfg->adapter.loopback = 0; cfg->adapter.pttmute = 1; cfg->adapter.filtmode = 0; cfg->adapter.gain = 0; cfg->chaccess.txdelay = 150; cfg->chaccess.slottime = 100; cfg->chaccess.ppersistence = 40; cfg->chaccess.txtail = 10; cfg->chaccess.fullduplex = 0; strncpy(cfg->ifcfg.ifname, "bcu0", sizeof(cfg->ifcfg.ifname)); strncpy(cfg->ifcfg.hwaddr, "N0CALL", sizeof(cfg->ifcfg.hwaddr)); strncpy(cfg->ifcfg.ipaddr, "10.0.0.1", sizeof(cfg->ifcfg.ipaddr)); strncpy(cfg->ifcfg.netmask, "255.255.255.0", sizeof(cfg->ifcfg.netmask)); strncpy(cfg->ifcfg.broadcast, "10.0.0.255", sizeof(cfg->ifcfg.broadcast)); cfg->mdisc.output = 0; cfg->mdisc.direction = 0xff; cfg->mdisc.rxc = 0; cfg->mdisc.txc = 0; cfg->mdisc.txd = 0; cfg->t7f.ctrl = 0; } int config_parse(void) { xmlDocPtr doc; xmlNodePtr node; struct configentry *cfg; unsigned int i; const char *cp; /* default configuration */ for (i = 0; i < MAXCONFIGENTRIES; i++) { cfg = &configs[i]; config_default(cfg); } strncpy(configs[0].serial, "default", sizeof(configs[0].serial)); /* parse config file */ doc = xmlParseFile(configfile); if (!doc) goto err; if (strcmp(doc->root->name, "baycomusb")) { lprintf(10, "Config file does not contain baycomusb data\n"); goto err2; } for (node = doc->root->childs; node; node = node->next) { if (!node->name || strcmp(node->name, "device")) continue; cp = xmlGetProp(node, "serial"); if (!cp || !strcmp(cp, "default")) cfg = &configs[0]; else { cfg = config_findentry(cp); if (!cfg) { cfg = config_newentry(); if (!cfg) { lprintf(10, "Too many configurations, ignoring serial %s\n", cp); continue; } strncpy(cfg->serial, cp, sizeof(cfg->serial)); } } parseone(node->childs, cfg); } xmlFreeDoc(doc); return 0; err2: xmlFreeDoc(doc); err: return -1; } /* ---------------------------------------------------------------------- */ int config_save(void) { xmlDocPtr doc; xmlNodePtr node, node2; struct configentry *cfg; unsigned int i; char buf[128]; if (!(doc = xmlNewDoc("1.0"))) return -1; doc->root = xmlNewDocNode(doc, NULL, "baycomusb", NULL); for (i = 0, cfg = configs; i < MAXCONFIGENTRIES; i++, cfg++) { if (!cfg->serial[0]) continue; node = xmlNewChild(doc->root, NULL, "device", NULL); xmlSetProp(node, "serial", cfg->serial); node2 = xmlNewChild(node, NULL, "adapter", NULL); xmlSetProp(node2, "mode", (cfg->adapter.mode == MODE_EXTERNAL) ? "external" : (cfg->adapter.mode == MODE_AFSK) ? "afsk" : (cfg->adapter.mode == MODE_AUDIO) ? "audio" : (cfg->adapter.mode == MODE_BSCAN) ? "bscan" : "fsk"); snprintf(buf, sizeof(buf), "%d", cfg->adapter.fclk); xmlSetProp(node2, "fclk", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.bitraterx); xmlSetProp(node2, "bitraterx", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.bitratetx); xmlSetProp(node2, "bitratetx", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.samplerate); xmlSetProp(node2, "samplerate", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.loopback); xmlSetProp(node2, "loopback", buf); snprintf(buf, sizeof(buf), "%d", !!cfg->adapter.pttmute); xmlSetProp(node2, "pttmute", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.filtmode); xmlSetProp(node2, "filtmode", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.gain); xmlSetProp(node2, "gain", buf); node2 = xmlNewChild(node, NULL, "chaccess", NULL); snprintf(buf, sizeof(buf), "%d", cfg->chaccess.txdelay); xmlSetProp(node2, "txdelay", buf); snprintf(buf, sizeof(buf), "%d", cfg->chaccess.slottime); xmlSetProp(node2, "slottime", buf); snprintf(buf, sizeof(buf), "%d", cfg->chaccess.ppersistence); xmlSetProp(node2, "ppersistence", buf); snprintf(buf, sizeof(buf), "%d", cfg->chaccess.txtail); xmlSetProp(node2, "txtail", buf); snprintf(buf, sizeof(buf), "%d", !!cfg->chaccess.fullduplex); xmlSetProp(node2, "fullduplex", buf); node2 = xmlNewChild(node, NULL, "interface", NULL); xmlSetProp(node2, "ifname", cfg->ifcfg.ifname); xmlSetProp(node2, "hwaddr", cfg->ifcfg.hwaddr); xmlSetProp(node2, "ipaddr", cfg->ifcfg.ipaddr); xmlSetProp(node2, "netmask", cfg->ifcfg.netmask); xmlSetProp(node2, "broadcast", cfg->ifcfg.broadcast); node2 = xmlNewChild(node, NULL, "modemdisc", NULL); snprintf(buf, sizeof(buf), "0x%02x", cfg->mdisc.output & 0xff); xmlSetProp(node2, "output", buf); snprintf(buf, sizeof(buf), "0x%02x", cfg->mdisc.direction & 0xff); xmlSetProp(node2, "direction", buf); snprintf(buf, sizeof(buf), "%u", cfg->mdisc.rxc); xmlSetProp(node2, "rxc", buf); snprintf(buf, sizeof(buf), "%u", cfg->mdisc.txc); xmlSetProp(node2, "txc", buf); snprintf(buf, sizeof(buf), "%u", cfg->mdisc.txd); xmlSetProp(node2, "txd", buf); node2 = xmlNewChild(node, NULL, "t7f", NULL); snprintf(buf, sizeof(buf), "0x%02x", cfg->t7f.ctrl & 0x1f); xmlSetProp(node2, "ctrl", buf); } if (!xmlSaveFile(configfile, doc)) goto err; xmlFreeDoc(doc); return 0; err: xmlFreeDoc(doc); return -1; } /* ---------------------------------------------------------------------- */ baycomusb-0.10.orig/diag/configadapt.c0100644000175100017510000006573507340454203015760 0ustar abaaba/*****************************************************************************/ /* * configadapt.c -- Baycom USB modem utility. * * Copyright (C) 1999-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * * * History: * 0.1 26.05.99 Created * */ /*****************************************************************************/ #define _GNU_SOURCE #include //#ifdef HAVE_SYS_IOCTL_H //#include //#endif #include #include #include #include #include #include #include #include "baycomusb.h" #include "usbdrv.h" #include "fpga/fsk_fpga.h" #include "fpga/fsk_firmware.h" #include "fpga/afsk_firmware.h" #include "fpga/sample_firmware.h" #include "firmware/reset2firmware.h" #include "firmware/dl2firmware.h" #include "firmware/bscanfirmware.h" #include "firmware/fskfirmware.h" #include "firmware/afskfirmware.h" #include "firmware/audiofirmware.h" /* ---------------------------------------------------------------------- */ static void printconfig(const struct configentry *cfg) { lprintf(1, "configuration for serial \"%s\"\n" " adapter: mode %s, fclk %u Hz, bitrate %u/%u, loopback %u, filtmode %u gain %u\n" " channel access: txdelay %ums, slottime %ums, ppersistence %u txtail %ums, %sduplex\n" " interface: ifname %s, hwaddr %s, ipaddr %s, netmask %s, broadcast %s\n" " modem disconnect: output 0x%02x, direction 0x%02x\n" " t7f: control 0x%02x\n", cfg->serial, (cfg->adapter.mode == MODE_FSK) ? "fsk" : (cfg->adapter.mode == MODE_EXTERNAL) ? "external" : (cfg->adapter.mode == MODE_AFSK) ? "afsk" : (cfg->adapter.mode == MODE_AUDIO) ? "audio" : (cfg->adapter.mode == MODE_BSCAN) ? "bscan" : "off", cfg->adapter.fclk, cfg->adapter.bitraterx, cfg->adapter.bitratetx, cfg->adapter.loopback, cfg->adapter.filtmode, cfg->adapter.gain, cfg->chaccess.txdelay, cfg->chaccess.slottime, cfg->chaccess.ppersistence, cfg->chaccess.txtail, cfg->chaccess.fullduplex ? "full" : "half", cfg->ifcfg.ifname, cfg->ifcfg.hwaddr, cfg->ifcfg.ipaddr, cfg->ifcfg.netmask, cfg->ifcfg.broadcast, cfg->mdisc.output, cfg->mdisc.direction, cfg->t7f.ctrl); } /* ---------------------------------------------------------------------- */ static unsigned int readconfigrom(const unsigned char *firmware, const unsigned long rom[16]) { unsigned ret = 0, mask = 1, i, j; for (i = 0; i < 16; i++, mask <<= 1) { j = rom[i]; if (!(firmware[j >> 3] & (1 << (j & 7)))) ret |= mask; } return ret & 0xffff; } /* warning: if used, don't use CRC bitstream, there's currently no code to recalc the CRC */ static void writeconfigrom(unsigned char *firmware, const unsigned long rom[16], unsigned val) { unsigned mask = 1, i, j; for (i = 0; i < 16; i++, mask <<= 1) { j = rom[i]; if (val & mask) firmware[j >> 3] &= ~(1 << (j & 7)); else firmware[j >> 3] |= 1 << (j & 7); } } /* ---------------------------------------------------------------------- */ /* * Filter calc routines */ static const float filt_comp[32] = { -0.0000, -0.0071, -0.0144, -0.0160, -0.0028, 0.0279, 0.0617, 0.0683, 0.0208, -0.0765, -0.1732, -0.1877, -0.0525, 0.2365, 0.5993, 0.9000, 1.0122, 0.8857, 0.5741, 0.2060, -0.0825, -0.2130, -0.1919, -0.0888, 0.0138, 0.0649, 0.0606, 0.0281, -0.0021, -0.0152, -0.0139, -0.0070 }; /* -------------------------------------------------------------------- */ #define HAMMING(x) (0.54-0.46*cos(2*M_PI*(x))); extern inline float hamming(float x) { return 0.54-0.46*cos(2*M_PI*x); } extern inline float sinc(float x) { if (x == 0) return 1; x *= M_PI; return sin(x)/x; } /* -------------------------------------------------------------------- */ #if 0 static void filt_printfcoeff(const float coeff[32]) { int i; lprintf(3, "filter coefficients:"); for (i = 0; i < 32; i++) { if (!(i & 7)) lprintf(3, "\n "); lprintf(3, "%6.2f", coeff[i]); } lprintf(3, '\n'); } static void filt_printicoeff(const int coeff[32]) { int i; lprintf(3, "filter coefficients:"); for (i = 0; i < 32; i++) { if (!(i & 7)) lprintf(3, "\n "); lprintf(3, "%5i", coeff[i]); } lprintf(3, '\n'); } #endif /* -------------------------------------------------------------------- */ static void filt_genideal(float coeff[32]) { int i; for (i = 0; i < 32; i++) coeff[i] = hamming(i / 31.0) * sinc((i - 15.5) / 4.0); } /* -------------------------------------------------------------------- */ static void filt_rom(const float coeff[32], unsigned rom[16]) { float max = 0.000001, s; int ocoeff[32]; int i, j; /* scale filter values */ for(i = 0; i < 4; i++) { for(s = 0, j = i; j < 32; j += 4) s += fabs(coeff[j]); if (s > max) max = s; } s = 126.0 / max; for(i = 0; i < 32; i++) ocoeff[i] = s * coeff[i]; /* convert to internal ROM representation */ memset(rom, 0, sizeof(rom[0])*16); for (i = 0; i < 8; i++) for (j = 0; j < 16; j++) { if ((1 << i) & ocoeff[j]) rom[i] |= 1 << (((j + 1) & 3) | (j & 12)); if ((1 << i) & ocoeff[j+16]) rom[i+8] |= 1 << j; } } /* ---------------------------------------------------------------------- */ static int writecpucs(struct usbdevice *dev, unsigned char buf) { int r; r = usb_control_msg(dev, 0x40, 0xa0, 0x7F92, 0, 1, &buf, 5000); if (r != 1) { lprintf(2, "ezusb: writecpucs(0x%02x) failed %d\n", buf, r); return -1; } return 0; } static int loadmem(struct usbdevice *dev, const unsigned char *fw, unsigned int len) { unsigned addr, sz; int r; if (writecpucs(dev, 1)) return -1; for (addr = 0; addr < len; addr += 64) { sz = len - addr; if (sz > 64) sz = 64; r = usb_control_msg(dev, 0x40, 0xa0, addr, 0, sz, (void *)(fw+addr), 5000); if (r != sz) { lprintf(2, "ezusb: code download(sz=%d,addr=0x%04x) returned %d\n", sz, addr, r); return -1; } } return 0; } /* --------------------------------------------------------------------- */ static int displaymem(struct usbdevice *dev) { unsigned char buf[16]; unsigned addr, u; int r; printf("EZUSB Memory contents:\n"); for (addr = 0; addr < 0x2000; addr += 16) { r = usb_control_msg(dev, 0xc0, 0xa0, addr, 0, 16, buf, 5000); if (r != 16) { lprintf(2, "ezusb: code upload(sz=%d,addr=0x%04x) returned %d\n", 16, addr, r); return -1; } printf("%04x:", addr); for (u = 0; u < 16; u++) printf(" %02x", buf[u]); printf("\n"); } r = usb_control_msg(dev, 0xc0, 0xa0, 0x7F92, 0, 1, buf, 5000); if (r != 1) { lprintf(2, "ezusb: readcpucs returned %d\n", r); return -1; } printf("CPUCS: %02x\n", buf[0]); return 0; } static int displaycpucs(struct usbdevice *dev) { unsigned char buf; int r; r = usb_control_msg(dev, 0xc0, 0xa0, 0x7F92, 0, 1, &buf, 5000); if (r != 1) { lprintf(2, "ezusb: readcpucs returned %d\n", r); return -1; } printf("CPUCS: %02x\n", buf); return 0; } /* --------------------------------------------------------------------- */ int adapter_reset(struct usbdevice *dev) { /* first download the loader firmware to the AnchorChips core */ if (loadmem(dev, reset2firmware, sizeof(reset2firmware)) || /* start AnchorChips core */ writecpucs(dev, 0)) return -1; return 0; } /* --------------------------------------------------------------------- */ struct anfwstat { unsigned char errcode; unsigned char errval; unsigned count; }; static int anchor_fw_stat(struct usbdevice *dev, struct anfwstat *st) { unsigned char buf[4]; int r; r = usb_control_msg(dev, 0xc0, 0xb1, 0, 0, 4, buf, 5000); if (r != 4) { lprintf(2, "usb_control_msg(0xb1) error %s\n", strerror(errno)); return -1; } lprintf(4, "ezusb: anchorstat: errcode 0x%02x errval 0x%02x cfgcntr 0x%04x\n", buf[0], buf[1], buf[2] | (buf[3] << 8)); st->errcode = buf[0]; st->errval = buf[1]; st->count = buf[2] | (buf[3] << 8); return 0; } /* --------------------------------------------------------------------- */ static unsigned int prepare_fsk(struct usbdevice *dev, struct configentry *cfg, const char *serial, unsigned char *fpga, unsigned char *fw) { float fcoeff[32]; unsigned filtrom[16]; unsigned dividerrx, dividertx; unsigned int i; /* copy FPGA firmware */ memcpy(fpga, fsk_firmware, FPGA_CONFIGSIZE); memcpy(fw, fskfirmware, sizeof(fskfirmware)); strncpy(&fw[0xf0], serial, 0x10); fw[0xe3] = cfg->adapter.mode == MODE_EXTERNAL; fw[0xe4] = cfg->adapter.pttmute; /* calculate the divider */ dividerrx = (cfg->adapter.fclk + 8 * cfg->adapter.bitraterx) / (16 * cfg->adapter.bitraterx); if (dividerrx < 1) dividerrx = 1; if (dividerrx > 1024) dividerrx = 1024; cfg->adapter.bitraterx = (cfg->adapter.fclk + 8 * dividerrx) / (16 * dividerrx); dividertx = (cfg->adapter.fclk + 8 * cfg->adapter.bitratetx) / (16 * cfg->adapter.bitratetx); if (dividertx < 1) dividertx = 1; if (dividertx > 1024) dividertx = 1024; cfg->adapter.bitratetx = (cfg->adapter.fclk + 8 * dividertx) / (16 * dividertx); fw[0xe0] = cfg->adapter.bitratetx; fw[0xe1] = cfg->adapter.bitratetx >> 8; fw[0xe2] = cfg->adapter.bitratetx >> 16; fw[0xe3] = cfg->adapter.bitraterx; fw[0xe4] = cfg->adapter.bitraterx >> 8; fw[0xe5] = cfg->adapter.bitraterx >> 16; /* patch configuration ROM's */ #if 0 if (cfg->adapter.intclk) writeconfigrom(fpga, fsk_roms+FSK_ROM_CLKSELROM, 0); #endif writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX0, 1 << ((dividerrx-1) & 0xf)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX1, 1 << (((dividerrx-1) >> 4) & 0xf)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX2, 0x1000 << (((dividerrx-1) >> 8) & 0x3)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX0, 1 << ((dividertx-1) & 0xf)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX1, 1 << (((dividertx-1) >> 4) & 0xf)); writeconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX2, 0x1000 << (((dividertx-1) >> 8) & 0x3)); if (cfg->adapter.mode == MODE_EXTERNAL) { writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMID, 0xcccc); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIC, 0x0c0c); /* RxC: rising edge */ writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOC, 0x3030); /* TxC: falling edge */ /* switch off scrambler and differential */ writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOE, 0xaaaa); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOS, 0xaaaa); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIE, 0xaaaa); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIS, 0xaaaa); } else { switch (cfg->adapter.loopback) { case 1: writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMID, 0xf0f0); writeconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIC, 0xff00); /* modem output clock */ break; case 2: writeconfigrom(fpga, fsk_roms+FSK_ROM_MDMINROM, 0xcccc); break; } } if (cfg->adapter.filtmode == 1) { filt_rom(filt_comp, filtrom); for (i = 0; i < 16; i++) writeconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_0+16*i, filtrom[i]); } else if (cfg->adapter.filtmode == 2) { filt_genideal(fcoeff); filt_rom(fcoeff, filtrom); for (i = 0; i < 16; i++) writeconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_0+16*i, filtrom[i]); } /* print configuration ROM's (mainly a debugging action) */ lprintf(2, "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n" "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_0), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_1), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_2), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_3), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_4), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_5), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_6), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM0_R_7), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_0), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_1), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_2), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_3), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_4), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_5), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_6), readconfigrom(fpga, fsk_roms+FSK_ROM_CROM1_R_7)); #if 0 lprintf(2, "config: ClkSel: %04x PTT mute: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_CLKSELROM), readconfigrom(fpga, fsk_roms+FSK_ROM_PTTMUTEROM)); lprintf(2, "config: DCD: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMDCD)); #endif lprintf(2, "config: DivRx: %04x %04x %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX0), readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX1), readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMRX2)); lprintf(2, "config: DivTx: %04x %04x %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX0), readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX1), readconfigrom(fpga, fsk_roms+FSK_ROM_DIVROMTX2)); lprintf(2, "config: IClk: %04x ID: %04x IE: %04x IS: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIC), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMID), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIE), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIS)); lprintf(2, "config: OClk: %04x OE: %04x OS: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOC), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOE), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOS)); lprintf(2, "config: MDISC: RxC: %04x TxC: %04x TxD: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMRXC), readconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMTXC), readconfigrom(fpga, fsk_roms+FSK_ROM_MDISCROMTXD)); lprintf(2, "config: Modem: in: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_MDMINROM)); return sizeof(fskfirmware); } static unsigned int prepare_afsk(struct usbdevice *dev, struct configentry *cfg, const char *serial, unsigned char *fpga, unsigned char *fw) { cfg->adapter.bitraterx = cfg->adapter.bitratetx = 1200; /* copy FPGA firmware */ memcpy(fpga, afsk_firmware, FPGA_CONFIGSIZE); memcpy(fw, afskfirmware, sizeof(afskfirmware)); strncpy(&fw[0xf0], serial, 0x10); fw[0xe0] = cfg->adapter.bitratetx; fw[0xe1] = cfg->adapter.bitratetx >> 8; fw[0xe2] = cfg->adapter.bitratetx >> 16; fw[0xe3] = cfg->adapter.bitraterx; fw[0xe4] = cfg->adapter.bitraterx >> 8; fw[0xe5] = cfg->adapter.bitraterx >> 16; fw[0xe6] = 0; fw[0xe7] = cfg->adapter.pttmute; /* patch configuration ROM's */ /* only swromie/swromoe could be patched, for differential decoding */ /* print configuration ROM's (mainly a debugging action) */ lprintf(2, "config: IE: %04x OE: %04x\n", readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMIE), readconfigrom(fpga, fsk_roms+FSK_ROM_SWROMOE)); return sizeof(afskfirmware); } static unsigned int prepare_audio(struct usbdevice *dev, struct configentry *cfg, const char *serial, unsigned char *fpga, unsigned char *fw) { unsigned divider; unsigned int i; /* copy FPGA firmware */ memcpy(fpga, sample_firmware, FPGA_CONFIGSIZE); memcpy(fw, audiofirmware, sizeof(audiofirmware)); strncpy(&fw[0xf0], serial, 0x10); /* calculate the true bitrate (aka samplerate) */ cfg->adapter.samplerate = (cfg->adapter.samplerate + 500) / 1000 * 1000; if (cfg->adapter.samplerate < 8000 && cfg->adapter.samplerate != 2000 && cfg->adapter.samplerate != 3000) cfg->adapter.samplerate = 8000; if (cfg->adapter.samplerate > 24000) cfg->adapter.samplerate = 24000; divider = (24000000 + cfg->adapter.samplerate/2) / cfg->adapter.samplerate; fw[0xe0] = cfg->adapter.samplerate / 1000; /* calculate the gain */ i = (cfg->adapter.gain << 24) / divider; if (i > 65535) i = 65535; if (i < 1) i = 1; /* patch configuration ROM's */ writeconfigrom(fpga, sample_roms+SAMPLE_ROM_MULROM, i); /* print configuration ROM's (mainly a debugging action) */ lprintf(2, "config: InputGain: %04x\n", readconfigrom(fpga, sample_roms+SAMPLE_ROM_MULROM)); return sizeof(audiofirmware); } static unsigned int prepare_bscan(struct usbdevice *dev, const struct configentry *cfg, const char *serial, unsigned char *fpga, unsigned char *fw) { unsigned int i; memcpy(fw, bscanfirmware, sizeof(bscanfirmware)); for (i = 0; i < 6; i++) { if (*serial) fw[0xf2+2*i] = *serial++; else fw[0xf2+2*i] = '_'; } return sizeof(bscanfirmware); } /* --------------------------------------------------------------------- */ static int fpgadownload(struct usbdevice *dev) { unsigned char stat[5]; unsigned u, ln; struct configentry *cfg; char serial[16]; unsigned char fpga[FPGA_CONFIGSIZE], firmware[8192]; unsigned int fwlen; struct anfwstat anstat; int i; /* download the loader firmware to the AnchorChips core */ if (loadmem(dev, dl2firmware, sizeof(dl2firmware))) return -1; /* start AnchorChips core */ if (writecpucs(dev, 0)) return -1; if (usb_setconfiguration(dev, 1)) return -1; /* retrieve serial number from EEPROM */ i = usb_control_msg(dev, 0xc0, 0xb3, 0, 0, sizeof(serial)-1, serial, 5000); if (i < 0 || i >= sizeof(serial)) { lprintf(2, "usb_control_msg(0xc0,0xb3) error %s\n", strerror(errno)); serial[0] = 0; } else serial[i] = 0; cfg = config_lookup(serial); lprintf(1, "Serial number read: %s using configuration: %s (mode %u)\n", serial, cfg->serial, cfg->adapter.mode); if (!serial[0]) strncpy(serial, "000000", sizeof(serial)); switch (cfg->adapter.mode) { case MODE_FSK: case MODE_EXTERNAL: fwlen = prepare_fsk(dev, cfg, serial, fpga, firmware); break; case MODE_AFSK: fwlen = prepare_afsk(dev, cfg, serial, fpga, firmware); break; case MODE_AUDIO: fwlen = prepare_audio(dev, cfg, serial, fpga, firmware); break; case MODE_BSCAN: fwlen = prepare_bscan(dev, cfg, serial, fpga, firmware); goto downloadfw; default: return -1; } printconfig(cfg); /* claim interface 0 */ if (usb_claiminterface(dev, 0)) { lprintf(2, "FPGAdownload: cannot claim interface 0\n"); return -1; } /* set interface 0 altsetting 1, to enable the bulk ep's */ if (usb_setinterface(dev, 0, 1)) { lprintf(2, "FPGAdownload: cannot set interface 0 altsetting 1\n"); return -1; } if (usb_resetep(dev, 0x81)) { lprintf(2, "FPGAdownload: cannot reset ep1 in\n"); //return -1; } if (usb_resetep(dev, 0x02)) { lprintf(2, "FPGAdownload: cannot reset ep2 out\n"); //return -1; } #if 1 i = usb_control_msg(dev, 0xc0, 0xb1, 0, 0, 4, stat, 5000); if (i != 4) lprintf(2, "usb_control_msg(0xc0, 0xb1) failure (%d)\n", i); else lprintf(3, "FPGAdownload: stat: 0x%02x 0x%02x 0x%02x 0x%02x\n", stat[0], stat[1], stat[2], stat[3]); #endif /* download FPGA firmware using bulk transfers */ for (;;) { #if 1 i = usb_bulk_msg(dev, 0x81, sizeof(stat), stat, 5000); #else i = usb_control_msg(dev, 0xc0, 0xb2, 0, 0, 5, stat, 5000); #endif if (i != sizeof(stat)) { lprintf(2, "usb_bulk ep1 in failure (%d)\n", i); #if 1 i = usb_control_msg(dev, 0xc0, 0xb1, 0, 0, 4, stat, 5000); if (i != 4) lprintf(2, "usb_control_msg(0xc0, 0xb1) failure (%d)\n", i); else lprintf(3, "FPGAdownload: stat: 0x%02x 0x%02x 0x%02x 0x%02x\n", stat[0], stat[1], stat[2], stat[3]); #endif return -1; } lprintf(3, "FPGAdownload: stat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", stat[0], stat[1], stat[2], stat[3], stat[4]); if (stat[0] == 0x10) break; if (stat[0] & 0x80) { lprintf(2, "FPGA download error code 0x%02x\n", stat[0]); return -1; } } #define MAXSZ 256 for (u = 0; u < FPGA_CONFIGSIZE; ) { ln = FPGA_CONFIGSIZE - u; if (ln > MAXSZ) ln = MAXSZ; i = usb_bulk_msg(dev, 0x02, ln, (void *)(fpga+u), 5000); if (i != ln) { lprintf(2, "usb_bulk_msg ep2 out failure (%d,len=%u,addr=%u)\n", i, ln, u); return -1; } u += ln; #if 1 i = usb_bulk_msg(dev, 0x81, sizeof(stat), stat, 5000); #else i = usb_control_msg(dev, 0xc0, 0xb2, 0, 0, 5, stat, 5000); #endif if (i != sizeof(stat)) { lprintf(2, "usb_bulk_msg ep1 in failure (%d)\n", i); return -1; } } for (;;) { #if 1 i = usb_bulk_msg(dev, 0x81, sizeof(stat), stat, 5000); #else i = usb_control_msg(dev, 0xc0, 0xb2, 0, 0, 5, stat, 5000); #endif if (i != sizeof(stat)) { lprintf(2, "usb_bulk_msg ep1 in failure (%d)\n", i); return -1; } lprintf(3, "FPGAdownload: stat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", stat[0], stat[1], stat[2], stat[3], stat[4]); if (stat[0] == 0x20) break; if (stat[0] & 0x80 || stat[0] == 0x10) { lprintf(2, "FPGA download error code 0x%02x\n", stat[0]); return -1; } } downloadfw: /* download the firmware to the AnchorChips core */ if (loadmem(dev, firmware, fwlen)) return -1; /* start AnchorChips core */ if (writecpucs(dev, 0)) return -1; if (cfg->adapter.mode != MODE_BSCAN) return 0; for (;;) { if (anchor_fw_stat(dev, &anstat)) return -1; if (anstat.errcode == 0x20) break; if (anstat.errcode != 0) return -1; } return 1; } /* ---------------------------------------------------------------------- */ int adapter_configure(struct usbdevice *dev) { int i; unsigned char mode; char serial[16]; struct configentry *cfg; unsigned char buf[16]; struct anfwstat stat; if (FPGA_CONFIGSIZE != sizeof(fsk_firmware) || FPGA_CONFIGSIZE != sizeof(afsk_firmware) || FPGA_CONFIGSIZE != sizeof(sample_firmware)) abort(); /* check status of configuration */ i = usb_control_msg(dev, 0xc0, 0xc8, 0, 0, 1, &mode, 500); if (i != 1) { lprintf(2, "usb_control_msg(0xc0,0xc8) error %s\n", strerror(errno)); return fpgadownload(dev); } i = usb_control_msg(dev, 0xc0, 0xc9, 0, 0, sizeof(serial)-1, serial, 500); if (i < 0 || i >= sizeof(serial)) { lprintf(2, "usb_control_msg(0xc0,0xc9) error %s\n", strerror(errno)); serial[0] = 0; } else serial[i] = 0; cfg = config_lookup(serial); lprintf(1, "Serial number read: %s using configuration: %s\n", serial, cfg->serial); switch (mode) { case MODE_BSCAN: for (;;) { if (anchor_fw_stat(dev, &stat)) return -1; if (stat.errcode == 0x20) break; if (stat.errcode != 0) return -1; } return 1; case MODE_FSK: case MODE_AFSK: case MODE_AUDIO: if (usb_control_msg(dev, 0xc0, 0xd4, cfg->mdisc.output, 1, 3, buf, 500) != 3 || usb_control_msg(dev, 0xc0, 0xd4, cfg->mdisc.direction, 2, 3, buf, 500) != 3 || usb_control_msg(dev, 0xc0, 0xd4, 0, 0, 3, buf, 500) != 3) { lprintf(2, "usb_control_msg(0xc0,0xd4) error %s\n", strerror(errno)); return -1; } lprintf(1, "Modem disconnect port: Input 0x%02x Output 0x%02x Direction 0x%02x\n", buf[0], buf[1], buf[2]); /* fall through */ case MODE_EXTERNAL: if (usb_control_msg(dev, 0xc0, 0xd5, cfg->t7f.ctrl, 1, 2, buf, 500) != 2 || usb_control_msg(dev, 0xc0, 0xd5, 0, 0, 2, buf, 500) != 2) { lprintf(2, "usb_control_msg(0xc0,0xd5) error %s\n", strerror(errno)); return -1; } lprintf(1, "T7F port: Input 0x%02x Output 0x%02x\n", buf[0], buf[1]); /* claim interfaces */ if (usb_setconfiguration(dev, 1)) return -1; /* kludge now in baycom_usb driver */ if (mode != MODE_AUDIO) { if (usb_claiminterface(dev, 0)) { lprintf(2, "usb_claiminterface(2) error %s\n", strerror(errno)); } else { if (usb_setinterface(dev, 0, 1)) { lprintf(2, "usb_setinterface(0,1) error %s\n", strerror(errno)); return -1; } /* kludge: the first OUT2 packet seems to arrive corrupted, so send this special "magic" packet */ buf[0] = 0x55; if (usb_bulk_msg(dev, 2, 1, buf, 500) != 1) { lprintf(2, "usb_bulk_msg(2) error %s\n", strerror(errno)); return -1; } usb_releaseinterface(dev, 0); } } #if 0 i = (mode == MODE_AUDIO) ? 4 : 0; /* interface */ if (usb_claiminterface(dev, 0)) return -1; if (usb_setinterface(dev, i, 1)) return -1; #endif return 1; default: return -1; } } /* ---------------------------------------------------------------------- */ struct configentry *adapter_findconfig(struct usbdevice *dev) { int i; char serial[16]; struct configentry *cfg; i = usb_control_msg(dev, 0xc0, 0xc9, 0, 0, sizeof(serial)-1, serial, 500); if (i < 0 || i >= sizeof(serial)) { lprintf(2, "usb_control_msg(0xc0,0xc9) error %s\n", strerror(errno)); serial[0] = 0; } else serial[i] = 0; cfg = config_lookup(serial); lprintf(1, "Serial number read: %s using configuration: %s\n", serial, cfg->serial); return cfg; } baycomusb-0.10.orig/diag/adapttests.c0100644000175100017510000016030407325134424015644 0ustar abaaba/*****************************************************************************/ /* * adapttests.c -- HDLC packet radio modem for USB using FPGA/AnchorChips utility library. * * Copyright (C) 1998-2000 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #include #include #include #ifndef HAVE_WINDOWS_H #include #endif #ifdef HAVE_SYS_IOCTL_H #include #endif #include #include #include #include #include #include #include #include #ifdef HAVE_ERRNO_H #include #endif #include "baycomusb.h" #include "sysdeps.h" /* ---------------------------------------------------------------------- */ static void mode_none(struct configentry *cfg) { cfg->adapter.mode = MODE_NONE; } static void mode_fsk(struct configentry *cfg) { cfg->adapter.mode = MODE_FSK; } static void mode_external(struct configentry *cfg) { cfg->adapter.mode = MODE_EXTERNAL; } static void mode_afsk(struct configentry *cfg) { cfg->adapter.mode = MODE_AFSK; } static void mode_audio(struct configentry *cfg) { cfg->adapter.mode = MODE_AUDIO; } static void mode_bscan(struct configentry *cfg) { cfg->adapter.mode = MODE_BSCAN; } /* ---------------------------------------------------------------------- */ /* *The doubly scrambled BERR tests * (once in software, once in the modem) * exercise the data exchange between modem and PC */ /* note: this is the reverse direction */ #if 0 #define SCRAM_TAP1 0x00001 /* X^17 */ #define SCRAM_TAPN 0x21000 /* X^0+X^5 */ #define DESCRAM_TAPSH1 0 #define DESCRAM_TAPSH2 5 #define DESCRAM_TAPSH3 17 #endif #define DESCRAM_TAPSH1 0 #define DESCRAM_TAPSH2 7 #define DESCRAM_TAPSH3 10 #define SCRAM_TAP1 1 #define SCRAM_TAPN ((1<> 2) & 0x3f; if (i) tprintf("%c",i+0x20); i = ((pkt[2] << 4) | ((pkt[3] >> 4) & 0xf)) & 0x3f; if (i) tprintf("%c", i+0x20); i = ((pkt[3] << 2) | ((pkt[4] >> 6) & 3)) & 0x3f; if (i) tprintf("%c", i+0x20); i = pkt[4] & 0x3f; if (i) tprintf("%c", i+0x20); i = (pkt[5] >> 2) & 0x3f; if (i) tprintf("%c", i+0x20); i = ((pkt[5] << 4) | ((pkt[6] >> 4) & 0xf)) & 0x3f; if (i) tprintf("%c", i+0x20); tprintf("-%u QSO Nr %u", pkt[6] & 0xf, (pkt[0] << 6) | (pkt[1] >> 2)); pkt += 7; len -= 7; } else { /* * normal header */ if (len < 15) return; if ((pkt[6] & 0x80) != (pkt[13] & 0x80)) { v1 = 0; cmd = (pkt[6] & 0x80); } tprintf("fm "); for(i = 7; i < 13; i++) if ((pkt[i] &0xfe) != 0x40) tprintf("%c", pkt[i] >> 1); tprintf("-%u to ", (pkt[13] >> 1) & 0xf); for(i = 0; i < 6; i++) if ((pkt[i] &0xfe) != 0x40) tprintf("%c", pkt[i] >> 1); tprintf("-%u", (pkt[6] >> 1) & 0xf); pkt += 14; len -= 14; if ((!(pkt[-1] & 1)) && (len >= 7)) tprintf(" via "); while ((!(pkt[-1] & 1)) && (len >= 7)) { for(i = 0; i < 6; i++) if ((pkt[i] &0xfe) != 0x40) tprintf("%c", pkt[i] >> 1); tprintf("-%u", (pkt[6] >> 1) & 0xf); pkt += 7; len -= 7; if ((!(pkt[-1] & 1)) && (len >= 7)) tprintf(","); } } if(!len) return; i = *pkt++; len--; j = v1 ? ((i & 0x10) ? '!' : ' ') : ((i & 0x10) ? (cmd ? '+' : '-') : (cmd ? '^' : 'v')); if (!(i & 1)) { /* * Info frame */ tprintf(" I%u%u%c", (i >> 5) & 7, (i >> 1) & 7, j); } else if (i & 2) { /* * U frame */ switch (i & (~0x10)) { case 0x03: tprintf(" UI%c", j); break; case 0x2f: tprintf(" SABM%c", j); break; case 0x43: tprintf(" DISC%c", j); break; case 0x0f: tprintf(" DM%c", j); break; case 0x63: tprintf(" UA%c", j); break; case 0x87: tprintf(" FRMR%c", j); break; default: tprintf(" unknown U (0x%x)%c", i & (~0x10), j); break; } } else { /* * supervisory */ switch (i & 0xf) { case 0x1: tprintf(" RR%u%c", (i >> 5) & 7, j); break; case 0x5: tprintf(" RNR%u%c", (i >> 5) & 7, j); break; case 0x9: tprintf(" REJ%u%c", (i >> 5) & 7, j); break; default: tprintf(" unknown S (0x%x)%u%c", i & 0xf, (i >> 5) & 7, j); break; } } if (!len) { tprintf("\n"); return; } tprintf(" pid=%02X\n", *pkt++); len--; j = 0; while (len) { i = *pkt++; if ((i >= 32) && (i < 128)) tprintf("%c", i); else if (i == 13) { if (j) tprintf("\n"); j = 0; } else tprintf("."); if (i >= 32) j = 1; len--; } if (j) tprintf("\n"); } /* ---------------------------------------------------------------------- */ /* * the CRC routines are stolen from WAMPES * by Dieter Deyke */ static const u_int16_t crc_ccitt_table[0x100] = { 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 }; /* --------------------------------------------------------------------- */ extern inline u_int16_t calc_crc_ccitt(const u_int8_t *buffer, int len) { u_int16_t crc = 0xffff; for (;len>0;len--) crc = (crc >> 8) ^ crc_ccitt_table[(crc ^ *buffer++) & 0xff]; crc ^= 0xffff; return crc; } extern inline void append_crc_ccitt(u_int8_t *buffer, int len) { u_int16_t crc = calc_crc_ccitt(buffer, len); *buffer++ = crc; *buffer++ = crc >> 8; } extern inline int check_crc_ccitt(const u_int8_t *buffer, int len) { u_int16_t crc = calc_crc_ccitt(buffer, len); return (crc & 0xffff) == 0x0f47; } /* ---------------------------------------------------------------------- */ #define MAXFLEN 512 #define RXBUFFER_SIZE ((MAXFLEN*6/5)+8) struct hdlc_receiver { unsigned int bitbuf, bitstream, numbits, state; unsigned char *bufptr; int bufcnt; unsigned char buf[RXBUFFER_SIZE]; }; extern inline void hdlc_initrx(struct hdlc_receiver *h) { memset(h, 0, sizeof(struct hdlc_receiver)); h->bufptr = h->buf; } static void do_rxpacket(struct hdlc_receiver *h) { if (h->bufcnt < 4) return; if (!check_crc_ccitt(h->buf, h->bufcnt)) return; tprintf(" \r"); tprintpkt(h->buf, h->bufcnt-2); } #define DECODEITERA(j) \ ({ \ if (!(notbitstream & (0x0fc << j))) /* flag or abort */ \ goto flgabrt##j; \ if ((bitstream & (0x1f8 << j)) == (0xf8 << j)) /* stuffed bit */ \ goto stuff##j; \ enditer##j: \ }) #define DECODEITERB(j) \ ({ \ flgabrt##j: \ if (!(notbitstream & (0x1fc << j))) { /* abort received */ \ state = 0; \ goto enditer##j; \ } \ if ((bitstream & (0x1fe << j)) != (0x0fc << j)) /* flag received */ \ goto enditer##j; \ if (state) \ do_rxpacket(h); \ h->bufcnt = 0; \ h->bufptr = h->buf; \ state = 1; \ numbits = 7-j; \ goto enditer##j; \ stuff##j: \ numbits--; \ bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1); \ goto enditer##j; \ }) /* ---------------------------------------------------------------------- */ static void hdlc_receive(struct hdlc_receiver *h, u_int8_t *bits, int cnt) { unsigned int bitbuf, notbitstream, bitstream, numbits, state; u_int8_t ch; numbits = h->numbits; state = h->state; bitstream = h->bitstream; bitbuf = h->bitbuf; for (; cnt > 0; cnt--) { ch = *bits++; bitstream >>= 8; bitstream |= ch << 8; bitbuf >>= 8; bitbuf |= ch << 8; numbits += 8; notbitstream = ~bitstream; DECODEITERA(0); DECODEITERA(1); DECODEITERA(2); DECODEITERA(3); DECODEITERA(4); DECODEITERA(5); DECODEITERA(6); DECODEITERA(7); goto enddec; DECODEITERB(0); DECODEITERB(1); DECODEITERB(2); DECODEITERB(3); DECODEITERB(4); DECODEITERB(5); DECODEITERB(6); DECODEITERB(7); enddec: while (state && numbits >= 8) { if (h->bufcnt >= RXBUFFER_SIZE) { state = 0; } else { *(h->bufptr)++ = bitbuf >> (16-numbits); h->bufcnt++; numbits -= 8; } } } h->numbits = numbits; h->state = state; h->bitstream = bitstream; h->bitbuf = bitbuf; } /* ---------------------------------------------------------------------- */ /* * this routine depends on the boundary scan firmware running on the * EZUSB controller (i.e. adapter_start_bscan) */ static void prbscan(const unsigned char *s, const unsigned char *x) { unsigned i; printf("bound %s: ", s); for (i = 0; i < FPGA_BOUNDSIZE; i++, x++) printf("%02X", *x); printf("\n"); } struct anfwstat { unsigned char errcode; unsigned char errval; unsigned count; }; static int anchor_fw_stat(struct usbdevice *dev, struct anfwstat *st) { unsigned char buf[4]; int r; r = usb_control_msg(dev, 0xc0, 0xb1, 0, 0, 4, buf, 5000); if (r != 4) { lprintf(2, "usb_control_msg(0xb1) error %s\n", strerror(errno)); return -1; } lprintf(4, "ezusb: anchorstat: errcode 0x%02x errval 0x%02x cfgcntr 0x%04x\n", buf[0], buf[1], buf[2] | (buf[3] << 8)); st->errcode = buf[0]; st->errval = buf[1]; st->count = buf[2] | (buf[3] << 8); return 0; } static int boundary(struct usbdevice *dev, unsigned int blen, const unsigned char *in, unsigned char *out) { struct anfwstat stat; int r; anchor_fw_stat(dev, &stat); #if 0 prbscan("in ", in); #endif #if 1 r = usb_control_msg(dev, 0x40, 0xb8, 0, 0, FPGA_BOUNDSIZE, (void *)in, 5000); if (r != FPGA_BOUNDSIZE) { lprintf(2, "usb_control_msg(0x40,0xb8) error %s\n", strerror(errno)); return -1; } #endif #if 1 r = usb_control_msg(dev, 0xc0, 0xb9, 0, 0, 0, NULL, 5000); if (r) { lprintf(2, "usb_control_msg(0xb9) error %s\n", strerror(errno)); return -1; } #endif for (;;) { if (anchor_fw_stat(dev, &stat)) return -1; if (stat.errcode == 0x20) break; if (stat.errcode != 0x21) return -1; } #if 1 r = usb_control_msg(dev, 0xc0, 0xb8, 0, 0, FPGA_BOUNDSIZE, out, 5000); if (r < 0) { lprintf(2, "usb_control_msg(0xc0,0xb8) error %s\n", strerror(errno)); return -1; } if (r < FPGA_BOUNDSIZE) { lprintf(2, "usb_control_msg(0xc0,0xb8) short read %d\n", r); return -1; } #endif #if 0 prbscan("out", out); #endif return 0; } /* ---------------------------------------------------------------------- */ extern inline unsigned readboundary(const unsigned char *b, unsigned x) { return (b[x >> 3] >> (x & 7)) & 1; } extern inline void writeboundary(unsigned char *b, unsigned x, int v) { b[x >> 3] &= ~(1 << (x & 7)); b[x >> 3] |= (v & 1) << (x & 7); } /* ---------------------------------------------------------------------- */ static unsigned readboundaryword(const unsigned char *b, const unsigned *x, unsigned num) { unsigned mask = 1, ret = 0; for (; num > 0; num--, x++, mask <<= 1) if (readboundary(b, *x)) ret |= mask; return ret; } static void writeboundaryword(unsigned char *b, const unsigned *x, unsigned num, unsigned v) { unsigned sh = 0; for (; num > 0; num--, x++, sh++) writeboundary(b, *x, (v >> sh) & 1); } /* ========= BOUNDARY SCAN ONLY TESTS =================================== */ /* * LED test */ static int ledtest(struct usbdevice *dev, struct configentry *cfg) { unsigned led = 0; unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE]; memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE); tprintf("LED test, DISCONNECT PTT!!\n"); for (;;) { led = (++led) & 1; writeboundary(bd1, FPGA_PIN_LEDPTT_O, led != 0); writeboundary(bd1, FPGA_PIN_LEDDCD_O, led != 1); writeboundary(bd1, FPGA_PIN_LEDPTT_T, 0); writeboundary(bd1, FPGA_PIN_LEDDCD_T, 0); boundary(dev, FPGA_BOUND, bd1, bd2); tprintf("Lighting LED %s\r", ((const char *[4]){ "PTT", "DCD" })[led]); if (idle_callback(500000)) return 0; } } /* ---------------------------------------------------------------------- */ /* * DAC test */ static const unsigned int dac_t[7] = { FPGA_PIN_MDATAOUT0_T, FPGA_PIN_MDATAOUT1_T, FPGA_PIN_MDATAOUT2_T, FPGA_PIN_MDATAOUT3_T, FPGA_PIN_MDATAOUT4_T, FPGA_PIN_MDATAOUT5_T, FPGA_PIN_MDATAOUT6_T }; static const unsigned int dac_o[7] = { FPGA_PIN_MDATAOUT0_O, FPGA_PIN_MDATAOUT1_O, FPGA_PIN_MDATAOUT2_O, FPGA_PIN_MDATAOUT3_O, FPGA_PIN_MDATAOUT4_O, FPGA_PIN_MDATAOUT5_O, FPGA_PIN_MDATAOUT6_O }; static int dactest(struct usbdevice *dev, struct configentry *cfg) { unsigned phase = 0, data, rot = 0; unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE]; memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE); tprintf("DAC test\n"); for (;;) { data = 64 + 63 * sin(M_PI / 128 * phase); writeboundaryword(bd1, dac_t, 7, 0); writeboundaryword(bd1, dac_o, 7, data); boundary(dev, FPGA_BOUND, bd1, bd2); phase = (phase + 1) & 0xff; if (phase) continue; rot = (rot + 1) & 3; tprintf("%c\r", "|\\-/"[rot]); if (idle_callback(0)) return 0; } } /* ---------------------------------------------------------------------- */ static int resetadapt(struct usbdevice *dev, struct configentry *cfg) { lprintf(0, "Resetting adapter\n"); if (adapter_reset(dev)) { lprintf(0, "adapter_reset failed\n"); return -1; } return 0; } /* ---------------------------------------------------------------------- */ /* * LED test with FSK firmware */ static int fsk_write_xmem(struct usbdevice *dev, unsigned int addr, unsigned int data) { int i; i = usb_control_msg(dev, 0x40, 0xd8, data, addr, 0, NULL, 5000); if (i < 0) { lprintf(0, "usb_control_msg(0x40,0xd8) failed\n"); return -1; } return 0; } static int fsk_read_xmem(struct usbdevice *dev, unsigned int addr) { int i; unsigned char ch; i = usb_control_msg(dev, 0xc0, 0xd8, 0, addr, 1, &ch, 5000); if (i < 0) { lprintf(0, "usb_control_msg(0xc0,0xd8) failed\n"); return -1; } return ch; } static int fskledtest(struct usbdevice *dev, struct configentry *cfg) { unsigned int ctrlreg = 0x40; int i; tprintf("FSK Firmware/LED test\n"); for (;;) { ctrlreg ^= 0x04; if (fsk_write_xmem(dev, 0xc008, ctrlreg)) return -1; if ((i = fsk_read_xmem(dev, 0xc008)) < 0) return -1; tprintf("FPGA Control register written: 0x%02x read: 0x%02x\n", ctrlreg, i); if (idle_callback(500000)) return 0; } } /* ---------------------------------------------------------------------- */ static void sendpkt(struct usbdevice *dev, const void *pkt, unsigned int pktlen) { int i; unsigned char *p; if (!pktlen) return; p = alloca(pktlen + 2); memcpy(p+2, pkt, pktlen); p[0] = 100; p[1] = 0; i = usb_bulk_msg(dev, 0x02, pktlen+2, p, 5000); if (i < 0) { lprintf(0, "USB bulk send packet failed\n"); /*return -1;*/ } } static unsigned recvpkt(struct usbdevice *dev, void *pkt, unsigned int maxlen) { int i; i = usb_bulk_msg(dev, 0x82, maxlen, pkt, 5000); if (i < 0) { lprintf(0, "USB bulk receive packet failed\n"); return 0; } lprintf(1, "Received Packet length: %d\n", i); return i; } static int getstat(struct usbdevice *dev, unsigned char *irq) { int i; memset(irq, 0, 23); #if 1 i = usb_control_msg(dev, 0xc0, 0xc0, 0, 0, 23, irq, 5000); if (i < 0) { lprintf(0, "USB control failed\n"); return -1; } lprintf(2, "USB control: return: %d\n", i); #else i = usb_bulk_msg(dev, 0x81, 20, irq, 5000); if (i < 0) { lprintf(0, "USB bulk ep 1 in failed\n"); return -1; } lprintf(2, "USB bulk: return: %d\n", i); #endif lprintf(2, "USBstat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", irq[0], irq[1], irq[2], irq[3], irq[4], irq[5]); lprintf(2, " tx: st: 0x%02x rd: 0x%02x wr: 0x%02x 0x%02x cnt: 0x%02x flg: 0x%04x\n", irq[6], irq[7], irq[8], irq[9], irq[10], irq[11] | (irq[12] << 8)); lprintf(2, " rx: st: 0x%02x rd: 0x%02x wr: 0x%02x 0x%02x cnt: 0x%02x\n", irq[13], irq[14], irq[15], irq[16], irq[17]); lprintf(2, " rxcnt: 0x%02x txcnt: 0x%02x ctrl: 0x%02x stat: 0x%02x\n", irq[18], irq[19], irq[20], irq[21]); lprintf(2, " out2cs: 0x%02x\n", irq[22]); return 0; } /* ---------------------------------------------------------------------- */ static int modemstat(struct usbdevice *dev, struct configentry *cfg) { unsigned char irq[23]; int i; i = usb_control_msg(dev, 0xc0, 0xd1, 0, 0, 2, irq, 5000); if (i < 0) { lprintf(0, "USB control failed\n"); return -1; } lprintf(0, "Bitrate: %02x %02x\n", irq[0], irq[1]); i = usb_control_msg(dev, 0xc0, 0xc0, 0, 0, 23, irq, 5000); if (i < 0) { lprintf(0, "USB control failed\n"); return -1; } lprintf(2, "USB control: return: %d\n", i); lprintf(0, "USBstat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", irq[0], irq[1], irq[2], irq[3], irq[4], irq[5]); lprintf(0, " tx: st: 0x%02x rd: 0x%02x wr: 0x%02x 0x%02x cnt: 0x%02x flg: 0x%04x\n", irq[6], irq[7], irq[8], irq[9], irq[10], irq[11] | (irq[12] << 8)); lprintf(0, " rx: st: 0x%02x rd: 0x%02x wr: 0x%02x 0x%02x cnt: 0x%02x\n", irq[13], irq[14], irq[15], irq[16], irq[17]); lprintf(0, " rxcnt: 0x%02x txcnt: 0x%02x ctrl: 0x%02x stat: 0x%02x\n", irq[18], irq[19], irq[20], irq[21]); lprintf(0, " out2cs: 0x%02x\n", irq[22]); return 0; } /* ---------------------------------------------------------------------- */ static int fsktest(struct usbdevice *dev, struct configentry *cfg) { unsigned char irq[20]; int i; if (usb_claiminterface(dev, 0)) { lprintf(0, "Cannot claim interface 0\n"); return -1; } usb_bulk_msg(dev, 0x81, sizeof(irq), irq, 5000); for (;;) { i = usb_bulk_msg(dev, 0x81, sizeof(irq), irq, 5000); if (i < 0) { lprintf(0, "USB interrupt failed\n"); return -1; } if (i < 6) lprintf(0, "USB Interrupt data too short %d\n", i); else { printf("USBstat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", irq[0], irq[1], irq[2], irq[3], irq[4], irq[5]); } if (idle_callback(10)) return 0; } return 0; } static int fsktest2(struct usbdevice *dev, struct configentry *cfg) { unsigned char irq[23]; int i; if (usb_claiminterface(dev, 0)) { lprintf(0, "Cannot claim interface 0\n"); return -1; } for (;;) { i = usb_control_msg(dev, 0xc0, 0xc0, 0, 0, sizeof(irq), irq, 5000); if (i < 0) { lprintf(0, "USB control failed\n"); return -1; } printf("USBstat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", irq[0], irq[1], irq[2], irq[3], irq[4], irq[5]); if (idle_callback(10)) return 0; } return 0; } /* ---------------------------------------------------------------------- */ static int uarttest(struct usbdevice *dev, struct configentry *cfg) { static const char text[] = "This is a test text."; unsigned char irq[20]; unsigned idx = 0; int i, j; for (;;) { i = usb_bulk_msg(dev, 0x81, sizeof(irq), irq, 500); if (i < 0) { lprintf(0, "USB bulk in failed\n"); /*return -1;*/ } lprintf(2, "USBstat: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", irq[0], irq[1], irq[2], irq[3], irq[4], irq[5]); for (j = 5; j < i; j++) printf("Receive: %c\n", irq[j]); if (irq[0] & 0x20) { if (!text[idx] && idx > sizeof(text)) idx = 0; printf("Send: %c\n", text[idx]); i = usb_control_msg(dev, 0x40, 0xd3, text[idx++], 0, 0, NULL, 5000); if (i < 0) { lprintf(0, "USB control failed\n"); return -1; } } if (idle_callback(10)) return 0; } return 0; } /* ---------------------------------------------------------------------- */ static int transmittest(struct usbdevice *dev, struct configentry *cfg) { #if 0 static const char text[] = "Test"; #elif 0 static const char text[] = "TestpktTestpktTestpktTestpktTestpktTestpktTestpktTestpktTestpktTestpkt."; #elif 0 static const char text[] = " dpl0 = 0x82\n" " dph0 = 0x83\n" " dpl1 = 0x84\n" " dph1 = 0x85\n" " dps = 0x86\n" " ckcon = 0x8E\n" " spc_fnc = 0x8F\n" " exif = 0x91\n" " mpage = 0x92\n" " scon0 = 0x98\n" " sbuf0 = 0x99\n" " scon1 = 0xC0\n" " sbuf1 = 0xC1\n" " eicon = 0xD8\n" " eie = 0xE8\n" " eip = 0xF8\n"; #elif 0 static const char text[] = "0123456789012345678901234567890123456789012345678901234567890"; #elif 1 static const char text[] = "01234567890123456789012345678901234567890123456789012345678901"; #elif 0 static const char text[] = "012345678901234567890123456789012345678901234567890123456789012"; #elif 0 static const char text[] = "0123456789012345678901234567890123456789012345678901234567890123"; #else static const char text[] = "01234567890123456789012345678901234567890123456789012345678901234"; #endif unsigned char rxpkt[MAXFLEN+2+1]; unsigned char irq[23]; unsigned plen; int i; if (usb_claiminterface(dev, 0)) { lprintf(0, "Cannot claim interface 0\n"); return -1; } #if 0 { unsigned char x[64]; getstat(dev, irq); x[0] = 0xaa; x[1] = 0x55; x[2] = 0x12; x[3] = 0x34; x[4] = 0x56; i = usb_bulk_msg(dev, 0x02, 5, x, 5000); if (i < 0) { lprintf(0, "USB bulk out packet failed\n"); /*return -1;*/ } else lprintf(0, "Bulk out: result %d\n", i); getstat(dev, irq); getstat(dev, irq); i = usb_bulk_msg(dev, 0x82, sizeof(x), x, 5000); if (i < 0) { lprintf(0, "USB bulk in packet failed\n"); /*return -1;*/ } else lprintf(0, "Bulk in: length %d; data %02x %02x %02x %02x\n", i, x[0], x[1], x[2], x[3]); getstat(dev, irq); i = usb_bulk_msg(dev, 0x82, sizeof(x), x, 5000); if (i < 0) { lprintf(0, "USB bulk in packet failed\n"); /*return -1;*/ } else lprintf(0, "Bulk in: length %d; data %02x %02x %02x %02x %02x %02x %02x %02x\n", i, x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]); } #endif getstat(dev, irq); sendpkt(dev, text, strlen(text)); getstat(dev, irq); sendpkt(dev, text, strlen(text)); getstat(dev, irq); //return 0; for (;;) { if (getstat(dev, irq)) return -1; if (irq[14] != irq[15]) { plen = recvpkt(dev, rxpkt, sizeof(rxpkt)); lprintf(0, "RX: %u text: %02x %02x %02x %02x %02x %02x\n", plen, rxpkt[0], rxpkt[1], rxpkt[2], rxpkt[3], rxpkt[4], rxpkt[5]); rxpkt[plen] = 0; lprintf(0, "RX Packet:"); for (i = 0; i < plen; i++) lprintf(0, " %02x", rxpkt[i]); lprintf(0, "\n"); } /*else*/ if (irq[7] == irq[8]) sendpkt(dev, text, strlen(text)); if (idle_callback(10)) return 0; } return 0; } /* ---------------------------------------------------------------------- */ static int fskrx(struct usbdevice *dev, struct configentry *cfg) { unsigned char rxpkt[MAXFLEN+2]; unsigned char irq[23]; unsigned plen; if (usb_claiminterface(dev, 0)) { lprintf(0, "Cannot claim interface 0\n"); return -1; } for (;;) { if (getstat(dev, irq)) goto errret; if (irq[14] != irq[15]) { plen = recvpkt(dev, rxpkt, sizeof(rxpkt)); if (plen > 4) tprintpkt(rxpkt, plen-2); } if (idle_callback(10000)) return 0; /* DCD has inverse logic */ tprintf("DCD:%c\r", (irq[0] & 0x08) ? 'D' : '-'); if (idle_callback(0)) return 0; } return 0; errret: lprintf(0, "USB Control Transfer failed\n"); return -1; } /* ---------------------------------------------------------------------- */ static int transmittestafsk(struct usbdevice *dev, struct configentry *cfg) { #if 0 static const char text[] = "Test"; #elif 0 static const char text[] = "TestpktTestpktTestpktTestpktTestpktTestpktTestpktTestpktTestpktTestpkt."; #elif 0 static const char text[] = " dpl0 = 0x82\n" " dph0 = 0x83\n" " dpl1 = 0x84\n" " dph1 = 0x85\n" " dps = 0x86\n" " ckcon = 0x8E\n" " spc_fnc = 0x8F\n" " exif = 0x91\n" " mpage = 0x92\n" " scon0 = 0x98\n" " sbuf0 = 0x99\n" " scon1 = 0xC0\n" " sbuf1 = 0xC1\n" " eicon = 0xD8\n" " eie = 0xE8\n" " eip = 0xF8\n"; #elif 0 static const char text[] = "0123456789012345678901234567890123456789012345678901234567890"; #elif 1 static const char text[] = "01234567890123456789012345678901234567890123456789012345678901"; #elif 0 static const char text[] = "012345678901234567890123456789012345678901234567890123456789012"; #elif 0 static const char text[] = "0123456789012345678901234567890123456789012345678901234567890123"; #else static const char text[] = "01234567890123456789012345678901234567890123456789012345678901234"; #endif unsigned char rxpkt[MAXFLEN+2+1]; unsigned char irq[23]; unsigned plen; int i; if (usb_claiminterface(dev, 0)) { lprintf(0, "Cannot claim interface 0\n"); return -1; } i = calc_crc_ccitt(text, strlen(text)); printf("CRC: 0x%04x\n", i); #if 0 { unsigned char x[64]; getstat(dev, irq); i = usb_bulk_msg(dev, 2, 1, sizeof(x), x); if (i < 0) { lprintf(0, "USB bulk receive packet failed\n"); /*return -1;*/ } } #endif getstat(dev, irq); sendpkt(dev, text, strlen(text)); getstat(dev, irq); sendpkt(dev, text, strlen(text)); getstat(dev, irq); for (;;) { if (getstat(dev, irq)) return -1; if (irq[14] != irq[15]) { plen = recvpkt(dev, rxpkt, sizeof(rxpkt)); lprintf(0, "RX: %u text: %02x %02x %02x %02x %02x %02x\n", plen, rxpkt[0], rxpkt[1], rxpkt[2], rxpkt[3], rxpkt[4], rxpkt[5]); rxpkt[plen] = 0; lprintf(0, "RX Packet:"); for (i = 0; i < plen; i++) lprintf(0, " %02x", rxpkt[i]); lprintf(0, "\n"); } /*else*/ if (irq[7] == irq[8]) sendpkt(dev, text, strlen(text)); if (idle_callback(10)) return 0; } return 0; } /* ---------------------------------------------------------------------- */ static int afskrx(struct usbdevice *dev, struct configentry *cfg) { unsigned char rxpkt[MAXFLEN+2]; unsigned char irq[23]; unsigned plen; if (usb_claiminterface(dev, 0)) { lprintf(0, "Cannot claim interface 0\n"); return -1; } for (;;) { if (getstat(dev, irq)) goto errret; if (irq[14] != irq[15]) { plen = recvpkt(dev, rxpkt, sizeof(rxpkt)); if (plen > 4) tprintpkt(rxpkt, plen-2); } if (idle_callback(10000)) return 0; /* DCD has inverse logic */ tprintf("DCD:%c\r", (irq[0] & 0x08) ? 'D' : '-'); if (idle_callback(0)) return 0; } return 0; errret: lprintf(0, "USB Control Transfer failed\n"); return -1; } /* ---------------------------------------------------------------------- */ static void cfg_clkfrequency(struct configentry *cfg) { cfg->adapter.mode = MODE_AUDIO; cfg->adapter.samplerate = 2000; } static int clkfrequency(struct usbdevice *dev, struct configentry *cfg) { unsigned val[8], freq[5]; unsigned char data[7]; struct timeval tv1, tv2; unsigned timediff; int i; if (usb_setinterface(dev, 0, 0)) goto usberr; /* measure clk24 and clkmodem */ if (usb_control_msg(dev, 0xc0, 0xe0, 0x00, 1, 7, data, 5000) < 7) goto usberr; lprintf(5, "data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); if (usb_control_msg(dev, 0xc0, 0xe0, 0x40, 1, 0, NULL, 5000) < 0) goto usberr; gettime(&tv1); if (idle_callback(400000)) return 0; if (usb_control_msg(dev, 0xc0, 0xe0, 0x10, 1, 7, data, 5000) < 7) goto usberr; gettime(&tv2); lprintf(5, "data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); val[0] = data[1] | (data[2] << 8) | (data[3] << 16); val[1] = data[4] | (data[5] << 8) | (data[6] << 16); timediff = (1000000 + tv2.tv_usec - tv1.tv_usec) % 1000000; lprintf(1, "Measurement1: cntr0: 0x%06x cntr1: 0x%06x timediff: %6uus\n", val[0], val[1], timediff); /* measure clk8m */ if (usb_control_msg(dev, 0xc0, 0xe0, 0x04, 1, 0, NULL, 5000) < 0) goto usberr; if (usb_control_msg(dev, 0xc0, 0xe0, 0x54, 1, 0, NULL, 5000) < 0) goto usberr; if (idle_callback(400000)) return 0; if (usb_control_msg(dev, 0xc0, 0xe0, 0x14, 1, 7, data, 5000) < 7) goto usberr; lprintf(5, "data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); val[2] = data[1] | (data[2] << 8) | (data[3] << 16); val[3] = data[4] | (data[5] << 8) | (data[6] << 16); lprintf(1, "Measurement2: cntr0: 0x%06x cntr1: 0x%06x\n", val[2], val[3]); /* measure rxc */ if (usb_control_msg(dev, 0xc0, 0xe0, 0x08, 1, 0, NULL, 5000) < 0) goto usberr; if (usb_control_msg(dev, 0xc0, 0xe0, 0x68, 1, 0, NULL, 5000) < 0) goto usberr; if (idle_callback(400000)) return 0; if (usb_control_msg(dev, 0xc0, 0xe0, 0x18, 1, 7, data, 5000) < 7) goto usberr; lprintf(5, "data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); val[4] = data[1] | (data[2] << 8) | (data[3] << 16); val[5] = data[4] | (data[5] << 8) | (data[6] << 16); lprintf(1, "Measurement3: cntr0: 0x%06x cntr1: 0x%06x\n", val[4], val[5]); /* measure txc */ if (usb_control_msg(dev, 0xc0, 0xe0, 0x0c, 1, 0, NULL, 5000) < 0) goto usberr; if (usb_control_msg(dev, 0xc0, 0xe0, 0x7c, 1, 0, NULL, 5000) < 0) goto usberr; if (idle_callback(400000)) return 0; if (usb_control_msg(dev, 0xc0, 0xe0, 0x1c, 1, 7, data, 5000) < 7) goto usberr; lprintf(5, "data: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6]); val[6] = data[1] | (data[2] << 8) | (data[3] << 16); val[7] = data[4] | (data[5] << 8) | (data[6] << 16); lprintf(1, "Measurement4: cntr0: 0x%06x cntr1: 0x%06x\n", val[6], val[7]); /* print measurements */ if (!timediff) timediff = 1; freq[4] = (val[0] * 1000000ULL + timediff / 2) / timediff; for (i = 0; i < 4; i++) { if (!val[2*i]) val[2*i] = 1; freq[i] = (24000000ULL * val[2*i+1] + val[2*i]/2) / val[2*i]; } lprintf(0, "Clock frequencies\n" " clk24: %'8u Hz (approximate!)\n" " clkmodem: %'8u Hz\n" " clk8m: %'8u Hz\n" " mrxc: %'8u Hz\n" " mtxc: %'8u Hz\n", freq[4], freq[0]*8, freq[1], freq[2], freq[3]); /* reset LED's */ if (usb_control_msg(dev, 0xc0, 0xe0, 0x00, 1, 0, NULL, 5000) < 0) goto usberr; return 0; usberr: lprintf(0, "USB Control Transfer failed\n"); return -1; } /* ---------------------------------------------------------------------- */ #ifndef HAVE_WINDOWS_H #define ISOFRAMES 128 static void cfg_isotest(struct configentry *cfg) { cfg->adapter.mode = MODE_AUDIO; cfg->adapter.samplerate = 2000; } static int isotest(struct usbdevice *dev, struct configentry *cfg) { struct { struct usbdevfs_urb urb; struct usbdevfs_iso_packet_desc frames[ISOFRAMES]; } urb[2]; struct usbdevfs_urb *purb; unsigned char data[ISOFRAMES*16]; unsigned char *datap; unsigned char irq[23]; int i, j; if (getstat(dev, irq)) goto errret; memset(&urb[0], 0, sizeof(urb[0])); urb[0].urb.type = USBDEVFS_URB_TYPE_ISO; urb[0].urb.endpoint = 0x88; urb[0].urb.flags = USBDEVFS_URB_ISO_ASAP; urb[0].urb.buffer = data; urb[0].urb.buffer_length = 2*ISOFRAMES; urb[0].urb.number_of_packets = ISOFRAMES; urb[0].urb.signr = 0; urb[0].urb.usercontext = NULL; for (j = 0; j < ISOFRAMES; j++) urb[0].urb.iso_frame_desc[j].length = 2; urb[1] = urb[0]; urb[1].urb.buffer = data+2*ISOFRAMES; for (i = 0; i < 2; i++) { if (usb_submiturb(dev, &urb[i].urb)) { lprintf(0, "usb_submiturb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } } for (;;) { if (!(purb = usb_reapurb(dev, 0))) { lprintf(0, "usb_reapurb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } if (purb != &urb[0].urb && purb != &urb[1].urb) { lprintf(1, "Argh, usb_reapurb returned invalid pointer %p (urb0 %p urb1 %p)\n", purb, &urb[0].urb, &urb[1].urb); continue; } datap = (unsigned char *)purb->buffer; lprintf(0, "async completed:\n" "status %d length %u error_count %d stat[0].length %u stat[0].status %u\n", purb->status, purb->actual_length, purb->error_count, purb->iso_frame_desc[0].actual_length, purb->iso_frame_desc[0].status); for (i = 0; i < ISOFRAMES; i++) lprintf(0, " frame %02d len %u stat %u data %02x %02x\n", i, purb->iso_frame_desc[i].actual_length, purb->iso_frame_desc[i].status, datap[2*i], datap[2*i+1]); if (usb_submiturb(dev, purb)) { lprintf(0, "usb_submiturb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } #if 0 if (getstat(dev, irq)) goto errret; if (idle_callback(10000)) return 0; #endif /* DCD has inverse logic */ tprintf("DCD:%c\r", (irq[0] & 0x08) ? 'D' : '-'); if (idle_callback(0)) return 0; } return 0; errret: lprintf(0, "USB Control Transfer failed\n"); return -1; } #undef ISOFRAMES /* ---------------------------------------------------------------------- */ #define ISOFRAMES 128 #define ISOFRAMESIZE 16 static void cfg_isotest2(struct configentry *cfg) { cfg->adapter.mode = MODE_AUDIO; cfg->adapter.samplerate = ISOFRAMESIZE*1000; } static int isotest2(struct usbdevice *dev, struct configentry *cfg) { struct { struct usbdevfs_urb urb; struct usbdevfs_iso_packet_desc frames[ISOFRAMES]; } urb[4]; struct usbdevfs_urb *purb; unsigned char data[4*ISOFRAMES*ISOFRAMESIZE]; unsigned char *datap; unsigned char irq[23]; int i, j; if (getstat(dev, irq)) goto errret; /* initialize the output data */ for (i = j = 0; i < 2*ISOFRAMES*ISOFRAMESIZE; i++) { data[2*ISOFRAMES*ISOFRAMESIZE+i] = 127 * cos((M_PI / 32768) * j); j += 65536U * 1000U / cfg->adapter.samplerate; j &= 0xffff; } /* fill ISO URBs */ memset(&urb[0], 0, sizeof(urb[0])); urb[0].urb.type = USBDEVFS_URB_TYPE_ISO; urb[0].urb.endpoint = 0x88; urb[0].urb.flags = USBDEVFS_URB_ISO_ASAP; urb[0].urb.buffer = data; urb[0].urb.buffer_length = ISOFRAMESIZE*ISOFRAMES; urb[0].urb.number_of_packets = ISOFRAMES; urb[0].urb.signr = 0; urb[0].urb.usercontext = NULL; for (j = 0; j < ISOFRAMES; j++) urb[0].urb.iso_frame_desc[j].length = ISOFRAMESIZE; urb[1] = urb[0]; urb[2] = urb[0]; urb[2].urb.endpoint = 0x08; urb[3] = urb[2]; urb[1].urb.buffer = data+ISOFRAMES*ISOFRAMESIZE; urb[2].urb.buffer = data+2*ISOFRAMES*ISOFRAMESIZE; urb[3].urb.buffer = data+3*ISOFRAMES*ISOFRAMESIZE; for (i = 0; i < 4; i++) { if (usb_submiturb(dev, &urb[i].urb)) { lprintf(0, "usb_submiturb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } } for (;;) { if (!(purb = usb_reapurb(dev, 0))) { lprintf(0, "usb_reapurb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } if (purb != &urb[0].urb && purb != &urb[1].urb && purb != &urb[2].urb && purb != &urb[3].urb) { lprintf(1, "Argh, USB_PROC_REAPURB returned invalid pointer %p (urb0 %p urb1 %p urb2 %p urb3 %p)\n", purb, &urb[0].urb, &urb[1].urb, &urb[2].urb, &urb[3].urb); continue; } datap = (unsigned char *)purb->buffer; /* check for output isobuf */ if (!(purb->endpoint & 0x80)) { if (usb_submiturb(dev, purb)) { lprintf(0, "usb_submiturb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } continue; } /* check for errors */ for (i = 0; i < ISOFRAMES; i++) { if (purb->iso_frame_desc[i].status != 0 || purb->iso_frame_desc[i].actual_length != ISOFRAMESIZE) { lprintf(1, "USB iso transfer: warning: subframe %d status %d length %d\n", i, purb->iso_frame_desc[i].status, purb->iso_frame_desc[i].actual_length); memset(datap+i*ISOFRAMESIZE, 0, ISOFRAMESIZE); } } /* restart iso */ if (usb_submiturb(dev, purb)) { lprintf(0, "usb_submiturb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } /* print frame contents */ #if 0 for (i = 0; i < ISOFRAMES; i++) { if (purb->iso_frame_desc[i].status == 0 && purb->iso_frame_desc[i].actual_length == ISOFRAMESIZE) { lprintf(2, "USB Frame %3d:", i); for (j = 0; j < ISOFRAMESIZE; j++) lprintf(2, " %02x", datap[i*ISOFRAMESIZE+j]); lprintf(2, "\n"); } } #endif /* fetch PLL variables */ if (usb_control_msg(dev, 0xc0, 0xe1, 0, 0, 7, irq, 5000) < 7) goto errret; tprintf("PLL: sofcnt: %3d framesz: %2u div: %5u divrel: %3u pllcorr: %2u txcnt: %2u\n", irq[0], irq[1], irq[2] | (irq[3] << 8), irq[4], irq[5], irq[6]); /* check samples written to tx */ if (usb_control_msg(dev, 0xc0, 0xe2, 0, 0, ISOFRAMESIZE, irq, 5000) < ISOFRAMESIZE) goto errret; lprintf(0, "Tx sample frame:"); for(i = 0; i < ISOFRAMESIZE; i++) lprintf(0, " %02x", irq[i]); lprintf(0, "\n"); /* check for CTRL-C */ if (idle_callback(0)) return 0; } return 0; errret: lprintf(0, "USB Control Transfer failed\n"); return -1; } #undef ISOFRAMES #undef ISOFRAMESIZE /* ---------------------------------------------------------------------- */ #ifdef HAVE_LINUX_SOUNDCARD_H #include #include #define SNDLATENCY 4000 /* approx 1/2 seconds */ #define PHASEFRAC 12 #define PHASEMASK ((1<adapter.mode = MODE_AUDIO; cfg->adapter.samplerate = ISOFRAMESIZE*1000; } static int saudio(struct usbdevice *dev, struct configentry *cfg) { /* USB variables */ struct { struct usbdevfs_urb urb; struct usbdevfs_iso_packet_desc frames[ISOFRAMES]; } urb[2]; struct usbdevfs_urb *purb; unsigned char data[2*ISOFRAMES*ISOFRAMESIZE]; unsigned char *datap; /* soundcard variables */ unsigned char buf[SNDLATENCY]; /* must be at least SNDLATENCY! */ audio_buf_info aboinfo, abiinfo; unsigned srate; unsigned char ctrl = 0; unsigned phincusbdsp, phincdspusb, phusbdsp = 0, phdspusb = 0; unsigned ledcnt = 0; int i, j, fddsp, apar; #ifdef SINEOVERLAY signed char sine[128]; unsigned phase = 0; #endif #ifdef SINEOVERLAY for (i = 0; i < sizeof(sine); i++) sine[i] = 63 * sin((2.0 * M_PI / sizeof(sine)) * i); #endif /* initialize soundcard */ if ((fddsp = open("/dev/dsp", O_RDWR | O_NONBLOCK)) == -1) { lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno)); return -1; } fcntl(fddsp, F_SETFL, fcntl(fddsp, F_GETFL, 0) | O_NONBLOCK); if (ioctl(fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) { lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno)); goto errsnd; } if (ioctl(fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno)); goto errsnd; } if (!(apar & DSP_CAP_DUPLEX)) { lprintf(0, "full duplex soundcard required\n"); goto errsnd; } if (!(apar & DSP_CAP_TRIGGER)) { lprintf(0, "soundcard does not support trigger\n"); goto errsnd; } if (ioctl(fddsp, SNDCTL_DSP_SETDUPLEX, 0) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SETDUPLEX failed (%s)\n", strerror(errno)); goto errsnd; } apar = AFMT_U8; if (ioctl(fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), U8 not supported??\n", strerror(errno)); goto errsnd; } apar = 0; if (ioctl(fddsp, SNDCTL_DSP_STEREO, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno)); goto errsnd; } srate = cfg->adapter.samplerate; if (ioctl(fddsp, SNDCTL_DSP_SPEED, &srate) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n", strerror(errno), cfg->adapter.samplerate); goto errsnd; } lprintf(1, "usb adapter sampling rate %u, soundcard sampling rate %u\n", cfg->adapter.samplerate, srate); if (abs(cfg->adapter.samplerate - srate) > cfg->adapter.samplerate / 2) { lprintf(0, "sampling rates (%u,%u) too different\n", cfg->adapter.samplerate, srate); goto errsnd; } phincusbdsp = ((1 << PHASEFRAC) * cfg->adapter.samplerate + srate / 2) / srate; phincdspusb = ((1 << PHASEFRAC) * srate + cfg->adapter.samplerate / 2) / cfg->adapter.samplerate; lprintf(1, "usb->dsp phase inc: 0x%05x dsp->usb phase inc: 0x%05x\n", phincusbdsp, phincdspusb); if (ioctl(fddsp, SNDCTL_DSP_GETOSPACE, &aboinfo) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETOSPACE failed (%s)\n", strerror(errno)); goto errsnd; } if (ioctl(fddsp, SNDCTL_DSP_GETISPACE, &abiinfo) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno)); goto errsnd; } if (aboinfo.fragstotal * aboinfo.fragsize < 2*SNDLATENCY || abiinfo.fragstotal * abiinfo.fragsize < 2*SNDLATENCY) { lprintf(0, "soundcard buffers too small (%u,%u)\n", aboinfo.fragstotal * aboinfo.fragsize, abiinfo.fragstotal * abiinfo.fragsize); goto errsnd; } /* prepare and start USB transfer */ memset(&urb[0], 0, sizeof(urb[0])); urb[0].urb.type = USBDEVFS_URB_TYPE_ISO; urb[0].urb.endpoint = 0x88; urb[0].urb.flags = USBDEVFS_URB_ISO_ASAP; urb[0].urb.buffer = data; urb[0].urb.buffer_length = ISOFRAMES*ISOFRAMESIZE; urb[0].urb.number_of_packets = ISOFRAMES; urb[0].urb.signr = 0; urb[0].urb.usercontext = NULL; for (j = 0; j < ISOFRAMES; j++) urb[0].urb.iso_frame_desc[j].length = ISOFRAMESIZE; urb[1] = urb[0]; urb[1].urb.buffer = data+ISOFRAMES*ISOFRAMESIZE; for (i = 0; i < 2; i++) { if (usb_submiturb(dev, &urb[i].urb)) { lprintf(0, "usb_submiturb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } } tprintf("Audio IO to Linux Soundcard\n"); /* prefill to nominal queue size and stard soundcard */ memset(buf, 0x80, SNDLATENCY); if ((i = write(fddsp, buf, SNDLATENCY)) != SNDLATENCY) { lprintf(0, "write(%d) failed %i (%s)\n", SNDLATENCY, i, strerror(errno)); goto errsnd; } apar = /*PCM_ENABLE_INPUT |*/ PCM_ENABLE_OUTPUT; if (ioctl(fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno)); goto errsnd; } /* start the whole thing */ for (;;) { if (!(purb = usb_reapurb(dev, 0))) { lprintf(0, "usb_reapurb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } if (purb != &urb[0].urb && purb != &urb[1].urb) { lprintf(1, "Argh, USB_PROC_REAPURB returned invalid pointer %p (urb0 %p urb1 %p)\n", purb, &urb[0].urb, &urb[1].urb); continue; } datap = (unsigned char *)purb->buffer; for (i = 0; i < ISOFRAMES; i++) { if (purb->iso_frame_desc[i].status != 0 || purb->iso_frame_desc[i].actual_length != ISOFRAMESIZE) { lprintf(1, "USB iso transfer: warning: subframe %d status %d length %d\n", i, purb->iso_frame_desc[i].status, purb->iso_frame_desc[i].actual_length); memset(datap+i*ISOFRAMESIZE, 0, ISOFRAMESIZE); } } if ((i = write(fddsp, datap, ISOFRAMES*ISOFRAMESIZE)) != ISOFRAMES*ISOFRAMESIZE) { lprintf(0, "write(%d) failed %i (%s)\n", ISOFRAMES*ISOFRAMESIZE, i, strerror(errno)); goto errsnd; } if (usb_submiturb(dev, purb)) { lprintf(0, "usb_submiturb failed, %s (errno %d)\n", strerror(errno), errno); goto errret; } if (ioctl(fddsp, SNDCTL_DSP_GETODELAY, &apar) == -1) { lprintf(0, "ioctl SNDCTL_DSP_GETODELAY failed (%s)\n", strerror(errno)); goto errsnd; } /* adjust speed */ lprintf(4, "odel %d\n", apar); if (apar > SNDLATENCY) phincusbdsp++; else if (apar < SNDLATENCY) phincusbdsp--; if (phincusbdsp < (0x9 << (PHASEFRAC-4)) || phincusbdsp > (0x1f << (PHASEFRAC-4))) { lprintf(0, "phincusbdsp (0x%05x) out of range\n", phincusbdsp); goto errsnd; } /* play games with the LEDS */ ledcnt += ISOFRAMES*ISOFRAMESIZE; if (ledcnt >= 4000) { ledcnt %= 4000; ctrl += 0x40; } #if 0 /* next do the dsp->usb direction */ /* get FIFO count */ bufu[0] = ctrl | 2; if (parport_usb_write_addr(bufu, 1) != 1) goto errret; if (parport_usb_read_addr(bufu, 2) != 2) goto errret; ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8); bufu[0] = ctrl; if (parport_usb_write_addr(bufu, 1) != 1) goto errret; ocnt &= 0x7fff; omax = 16384 - ocnt; /* read sound */ ocnts = read(fddsp, bufu, sizeof(bufu)/2); if (ocnts == -1 && errno == EAGAIN) ocnts = 0; if (ocnts < 0) { lprintf(0, "read(%d) failed %i (%s)\n", sizeof(bufu)/2, ocnts, strerror(errno)); goto errsnd; } if (ocnts > 0) { phdspusb &= PHASEMASK; cnt = 0; while (phdspusb < (ocnts << PHASEFRAC)) { bufs[cnt] = bufu[phdspusb >> PHASEFRAC] - 128; phdspusb += phincdspusb; cnt++; } if (cnt > omax) { lprintf(0, "usb adapter output overrun (%d, %d)\n", cnt, omax); goto errsnd; } #ifdef SINEOVERLAY for (i = 0; i < cnt; i++) { bufs[i] += sine[(phase >> 9) & 0x7f]; phase += 0x1789; /* pretty arbitrary */ } #endif if (parport_usb_write_data(bufs, cnt) != cnt) goto errret; /* reget the FIFO count */ bufu[0] = ctrl | 2; if (parport_usb_write_addr(bufu, 1) != 1) goto errret; if (parport_usb_read_addr(bufu, 2) != 2) goto errret; ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8); bufu[0] = ctrl; if (parport_usb_write_addr(bufu, 1) != 1) goto errret; ocnt &= 0x7fff; /* adjust speed */ lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt); if (ocnt > SNDLATENCY) phincdspusb++; else if (ocnt < SNDLATENCY) phincdspusb--; if (phincdspusb < (0x9 << (PHASEFRAC-4)) || phincdspusb > (0x1f << (PHASEFRAC-4))) { lprintf(0, "phincdspusb (0x%05x) out of range\n", phincdspusb); goto errsnd; } } #endif /* we block when waiting for a new USB event */ if (idle_callback(0)) return 0; lprintf(1, "phase increments: 0x%05x 0x%05x\n", phincusbdsp, phincdspusb); } errret: lprintf(0, "USB error\n"); errsnd: close(fddsp); return -1; } #endif /* HAVE_LINUX_SOUNDCARD_H */ #endif /* HAVE_WINDOWS_H */ /* ---------------------------------------------------------------------- */ const struct usbtests usbtests[] = { { "bled", "tests the on board LED's using boundary scan", mode_bscan, ledtest }, { "dac", "tests the on board DAC", mode_bscan, dactest }, { "reset", "Reset the adapter (Disconnect & Reconnect)", mode_none, resetadapt }, { "fskmodemstat", "Retrieve FSK Modem Status", mode_fsk, modemstat }, { "fskmodemstat", "Retrieve AFSK Modem Status", mode_afsk, modemstat }, { "fskledtest", "FSK Firmware/LED test", mode_fsk, fskledtest }, { "fsktest", "fsktest", mode_fsk, fsktest }, { "fsktest2", "fsktest2", mode_fsk, fsktest2 }, { "uarttest", "uarttest", mode_fsk, uarttest }, { "txtest", "transmittest", mode_fsk, transmittest }, { "fskrx", "decodes received FSK packets", mode_fsk, fskrx }, { "txtestafsk", "transmittest", mode_afsk, transmittestafsk }, { "afskrx", "decodes received FSK packets", mode_afsk, afskrx }, { "clk", "measures various clock frequencies", cfg_clkfrequency, clkfrequency }, #ifndef HAVE_WINDOWS_H { "isotest", "test isochronous transfers", cfg_isotest, isotest }, { "isotest2", "test isochronous transfers and sample lock to SOF rate PLL", cfg_isotest2, isotest2 }, #ifdef HAVE_LINUX_SOUNDCARD_H { "saudio", "generate approx 1k sine using the sample IO firmware", cfg_saudio, saudio }, #endif #endif { NULL, NULL, NULL } }; /* ---------------------------------------------------------------------- */ baycomusb-0.10.orig/diag/baycomusb.c0100644000175100017510000002774307330254406015464 0ustar abaaba/*****************************************************************************/ /* * baycomusb.c -- HDLC packet radio modem for USB using FPGA/AnchorChips utility. * * Copyright (C) 1998-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef WIN32 #include #include #endif #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #else #include "getopt.h" #endif #ifdef HAVE_SYSLOG_H #include #endif #ifdef HAVE_LINUX_IF_H #include #endif #ifdef HAVE_LINUX_AX25_H #include #endif #ifdef HAVE_LINUX_SOCKIOS_H #include #endif #ifdef HAVE_LINUX_IF_ETHER_H #include #endif #if defined(HAVE_ARPA_INET_H) && !defined(WIN32) #include #endif #include "baycomusb.h" /* ---------------------------------------------------------------------- */ static int quit = 0; /* ---------------------------------------------------------------------- */ int tprintf(const char *format, ...) { va_list ap; int i; va_start(ap, format); i = vprintf(format, ap); va_end(ap); fflush(stdout); return i; } int idle_callback(unsigned us_delay) { if (us_delay) usleep(us_delay); return quit; } static void signal_quit(int signum) { quit = 1; } /* ---------------------------------------------------------------------- */ #ifdef WIN32 static int doinit(int devnr, int busnr, const char *ifname) { return 0; } #else /* WIN32 */ static int parsehw(ax25_address *hwaddr, const char *cp) { const char *cp1; unsigned int i, j; if (!cp || !*cp) return 0; memset(hwaddr->ax25_call, ' ', 6); cp1 = strchr(cp, '-'); if (cp1) { i = cp1 - cp; j = strtoul(cp1 + 1, NULL, 0); hwaddr->ax25_call[6] = j & 15; } else { i = strlen(cp); hwaddr->ax25_call[6] = 0; } if (i > 6) i = 6; memcpy(hwaddr->ax25_call, cp, i); for (i = 0; i < 7; i++) hwaddr->ax25_call[i] <<= 1; return 1; } static int parseip(struct in_addr *ipaddr, const char *cp) { if (!cp || !*cp) return 0; if (inet_aton(cp, ipaddr)) return 1; ipaddr->s_addr = 0; lprintf(0, "baycomusb: invalid IP address \"%s\"\n", cp); return 0; } #define PARAM_TXDELAY 1 #define PARAM_PERSIST 2 #define PARAM_SLOTTIME 3 #define PARAM_TXTAIL 4 #define PARAM_FULLDUP 5 static int initonedev(struct usbdevice *dev, const char *ifname) { struct configentry *cfg; struct sockaddr sa; struct sockaddr_ax25 sax25; struct sockaddr_in sin; struct ifreq ifr, ifr_h; unsigned char buf[2]; int i, fd; i = adapter_configure(dev); if (i < 1) return i; cfg = adapter_findconfig(dev); strncpy(ifr_h.ifr_name, ifname, sizeof(ifr_h.ifr_name)); #ifdef HAVE_IFRNEWNAME if (cfg->ifcfg.ifname[0]) { if ((fd = socket(PF_AX25, SOCK_SEQPACKET, 0)) < 0) { lprintf(0, "Cannot create socket: %s (%u) \n", strerror(errno), errno); } else { strncpy(ifr_h.ifr_newname, cfg->ifcfg.ifname, sizeof(ifr_h.ifr_newname)); if (ioctl(fd, SIOCSIFNAME, &ifr_h) == -1) lprintf(0, "Cannot rename interface (SIOCSIFNAME: %s (%u))\n", strerror(errno), errno); else strncpy(ifr_h.ifr_name, cfg->ifcfg.ifname, sizeof(ifr_h.ifr_name)); close(fd); } } #endif if ((fd = socket(/*PF_PACKET*/AF_INET, /*SOCK_RAW*/SOCK_PACKET, htons(ETH_P_AX25))) < 0) { lprintf(0, "Cannot create socket: %s (%u) \n", strerror(errno), errno); return -1; } if (ioctl(fd, SIOCGIFINDEX, &ifr_h) == -1) lprintf(0, "ioctl: SIOCGIFINDEX failed: %s (%u)\n", strerror(errno), errno); ifr = ifr_h; ifr.ifr_mtu = 256; if (ioctl(fd, SIOCSIFMTU, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFMTU failed: %s (%u)\n", strerror(errno), errno); if (parsehw(&sax25.sax25_call, cfg->ifcfg.hwaddr)) { sax25.sax25_family = AF_AX25; sax25.sax25_ndigis = 0; ifr = ifr_h; memcpy(&ifr.ifr_hwaddr, &sax25, sizeof(ifr.ifr_hwaddr)); if (ioctl(fd, SIOCSIFHWADDR, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFHWADDR failed: %s (%u)\n", strerror(errno), errno); } if (parseip(&sin.sin_addr, cfg->ifcfg.ipaddr)) { sin.sin_family = AF_INET; ifr = ifr_h; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(fd, SIOCSIFADDR, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFADDR failed: %s (%u)\n", strerror(errno), errno); } if (parseip(&sin.sin_addr, cfg->ifcfg.netmask)) { sin.sin_family = AF_INET; ifr = ifr_h; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(fd, SIOCSIFNETMASK, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFNETMASK failed: %s (%u)\n", strerror(errno), errno); } if (parseip(&sin.sin_addr, cfg->ifcfg.broadcast)) { sin.sin_family = AF_INET; ifr = ifr_h; memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr)); if (ioctl(fd, SIOCSIFBRDADDR, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFBRDADDR failed: %s (%u)\n", strerror(errno), errno); } if (cfg->adapter.mode != MODE_AUDIO) { ifr = ifr_h; if (ioctl(fd, SIOCGIFFLAGS, &ifr) == -1) lprintf(0, "ioctl: SIOCGIFFLAGS failed: %s (%u)\n", strerror(errno), errno); else { ifr.ifr_flags &= ~IFF_NOARP; ifr.ifr_flags |= IFF_UP | IFF_RUNNING; if (ioctl(fd, SIOCSIFFLAGS, &ifr) == -1) lprintf(0, "ioctl: SIOCSIFFLAGS failed: %s (%u)\n", strerror(errno), errno); } } strncpy(sa.sa_data, ifr_h.ifr_name, sizeof(sa.sa_data)); sa.sa_family = AF_PACKET; buf[0] = PARAM_TXDELAY; buf[1] = cfg->chaccess.txdelay / 10; if (sendto(fd, buf, 2, 0, &sa, sizeof(struct sockaddr)) == -1) lprintf(0, "sendto failed: %s (%u)\n", strerror(errno), errno); buf[0] = PARAM_PERSIST; buf[1] = cfg->chaccess.ppersistence; if (sendto(fd, buf, 2, 0, &sa, sizeof(sa)) == -1) lprintf(0, "sendto failed: %s (%u)\n", strerror(errno), errno); buf[0] = PARAM_SLOTTIME; buf[1] = cfg->chaccess.slottime / 10; if (sendto(fd, buf, 2, 0, &sa, sizeof(sa)) == -1) lprintf(0, "sendto failed: %s (%u)\n", strerror(errno), errno); buf[0] = PARAM_TXTAIL; buf[1] = cfg->chaccess.txtail / 10; if (sendto(fd, buf, 2, 0, &sa, sizeof(sa)) == -1) lprintf(0, "sendto failed: %s (%u)\n", strerror(errno), errno); buf[0] = PARAM_FULLDUP; buf[1] = cfg->chaccess.fullduplex; if (sendto(fd, buf, 2, 0, &sa, sizeof(sa)) == -1) lprintf(0, "sendto failed: %s (%u)\n", strerror(errno), errno); return 0; } static int doinit(int devnr, int busnr, const char *ifname) { struct usbdevice *dev; unsigned int index; int ret; if (devnr != -1 && busnr != -1) { if (!(dev = usb_open_bynumber(busnr, devnr, BAYCOMUSB_VENDORID, -1))) { lprintf(0, "Cannot open Baycom USB device %03u:%03u\n", busnr, devnr); return -1; } ret = initonedev(dev, ifname); usb_close(dev); return ret; } for (ret = index = 0; ; index++) { if (!(dev = usb_open(BAYCOMUSB_VENDORID, -1, 0, index))) { if (!index) lprintf(0, "No Baycom USB devices found\n"); break; } ret |= initonedev(dev, ifname); usb_close(dev); } return ret; } #endif /* WIN32 */ static int dotest(unsigned int index, int devnr, int busnr, const struct usbtests *tst) { struct usbdevice *dev; struct configentry *cfg; unsigned int i; int ret; for (i = 0; ; i++) { cfg = config_entry(i); if (!cfg) break; tst->cfg(cfg); } if (devnr != -1 && busnr != -1) { if (!(dev = usb_open_bynumber(busnr, devnr, BAYCOMUSB_VENDORID, -1))) { lprintf(0, "Cannot open Baycom USB device %03u:%03u\n", busnr, devnr); return -1; } } else { if (!(dev = usb_open(BAYCOMUSB_VENDORID, -1, 0, index))) { lprintf(0, "Cannot open Baycom USB device at index %u\n", index); return -1; } } cfg = config_entry(0); if (cfg->adapter.mode != MODE_NONE) { ret = adapter_configure(dev); if (ret == -1) goto err; if (!ret) { usb_close(dev); sleep(2); if (devnr != -1 && busnr != -1) { if (!(dev = usb_open_bynumber(busnr, devnr, BAYCOMUSB_VENDORID, -1))) { lprintf(0, "Cannot open Baycom USB device %03u:%03u\n", busnr, devnr); return -1; } } else { if (!(dev = usb_open(BAYCOMUSB_VENDORID, -1, 0, index))) { lprintf(0, "Cannot open Baycom USB device at index %u\n", index); return -1; } } ret = adapter_configure(dev); if (ret < 1) { ret = -1; goto err; } } } #ifdef SIGHUP signal(SIGHUP, signal_quit); #endif signal(SIGINT, signal_quit); #ifdef SIGQUIT signal(SIGQUIT, signal_quit); #endif signal(SIGTERM, signal_quit); ret = abs(tst->func(dev, adapter_findconfig(dev))); err: usb_close(dev); return ret; } /* ---------------------------------------------------------------------- */ int main(int argc, char *argv[]) { static const struct option long_options[] = { { "drv", 1, 0, 'D' }, { "config", 1, 0, 'C' }, { "device", 1, 0, 'd' }, { "index", 1, 0, 'i' }, { "ifname", 1, 0, 'I' }, { "test", 1, 0, 't' }, { "verbose", 0, 0, 'v' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } }; int c, err = 0; const struct usbtests *tst = NULL; const char *ifname = NULL; int devnr = -1, busnr = -1; unsigned int index = 0; char *cp; printf("baycomusb v" VERSION " (c) 1999-2001 by Thomas Sailer, HB9JNX/AE4WA\n"); while ((c = getopt_long(argc, argv, "D:C:svd:i:I:t:", long_options, NULL)) != EOF) { switch (c) { case 'D': usb_setmountpoint(optarg); break; case 'C': config_setfile(optarg); break; #if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG) case 's': if (syslogmsg) break; openlog("baycomusb", LOG_PID, LOG_USER); syslogmsg = 1; break; #endif case 'v': verboselevel++; break; case 'd': cp = strchr(optarg, ':'); if (!cp) { busnr = 0; devnr = strtoul(optarg, NULL, 0); break; } *cp++ = 0; busnr = strtoul(optarg, NULL, 0); devnr = strtoul(cp, NULL, 0); break; case 'i': index = strtoul(optarg, NULL, 0); break; case 'I': ifname = optarg; break; case 't': if (tst != NULL) { err++; break; } for (tst = usbtests; tst->name && strcmp(optarg, tst->name); tst++); if (!tst->name) err++; break; default: err++; break; } } if (err) { lprintf(0, "usage: %s [-v] [-D ] [-C ] [-d ] [-i ] [-I ] [-t ]\n" " test options:\n", argv[0]); for (tst = usbtests; tst->name; tst++) lprintf(0, " %-15s%s\n", tst->name, tst->desc); exit(1); } if (config_parse()) lprintf(0, "Warning: Could not parse configuration file %s\n", config_getfile()); if (!tst) exit(doinit(devnr, busnr, ifname)); exit(dotest(index, devnr, busnr, tst)); } baycomusb-0.10.orig/diag/writeeeprom.c0100644000175100017510000002355407330254332016034 0ustar abaaba/*****************************************************************************/ /* * writeeeprom.c -- "Burn" EEPROM on the modem. * * Copyright (C) 1999-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * History: * 0.1 26.05.99 Created * */ /*****************************************************************************/ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #ifdef HAVE_GETOPT_H #include #else #include "getopt.h" #endif #include "baycomusb.h" #include "usbdrv.h" #include "firmware/reset2firmware.h" /* ---------------------------------------------------------------------- */ static int writecpucs(struct usbdevice *dev, unsigned char buf) { int r; r = usb_control_msg(dev, 0x40, 0xa0, 0x7F92, 0, 1, &buf, 5000); if (r != 1) { fprintf(stderr, "ezusb: writecpucs(0x%02x) failed %d\n", buf, r); return -1; } return 0; } static int loadmem(struct usbdevice *dev, const unsigned char *fw, unsigned int len) { unsigned addr, sz; int r; if (writecpucs(dev, 1)) return -1; for (addr = 0; addr < len; addr += 64) { sz = len - addr; if (sz > 64) sz = 64; r = usb_control_msg(dev, 0x40, 0xa0, addr, 0, sz, (void *)(fw+addr), 5000); if (r != sz) { fprintf(stderr, "ezusb: code download(sz=%d,addr=0x%04x) returned %d\n", sz, addr, r); return -1; } } return 0; } int adapter_reset(struct usbdevice *dev) { /* first download the loader firmware to the AnchorChips core */ if (loadmem(dev, reset2firmware, sizeof(reset2firmware)) || /* start AnchorChips core */ writecpucs(dev, 0)) return -1; return 0; } /* --------------------------------------------------------------------- */ static int displaymem(struct usbdevice *dev) { unsigned char buf[16]; unsigned addr, u; int r; printf("EZUSB Memory contents:\n"); for (addr = 0; addr < 0x2000; addr += 16) { r = usb_control_msg(dev, 0xc0, 0xa0, addr, 0, 16, buf, 5000); if (r != 16) { fprintf(stderr, "ezusb: code upload(sz=%d,addr=0x%04x) returned %d\n", 16, addr, r); return -1; } printf("%04x:", addr); for (u = 0; u < 16; u++) printf(" %02x", buf[u]); printf("\n"); } r = usb_control_msg(dev, 0xc0, 0xa0, 0x7F92, 0, 1, buf, 5000); if (r != 1) { fprintf(stderr, "ezusb: readcpucs returned %d\n", r); return -1; } printf("CPUCS: %02x\n", buf[0]); return 0; } static int displaycpucs(struct usbdevice *dev) { unsigned char buf; int r; r = usb_control_msg(dev, 0xc0, 0xa0, 0x7F92, 0, 1, &buf, 5000); if (r != 1) { fprintf(stderr, "ezusb: readcpucs returned %d\n", r); return -1; } printf("CPUCS: %02x\n", buf); return 0; } /* --------------------------------------------------------------------- */ static int write_eeprom_byte(struct usbdevice *dev, unsigned char addr, unsigned char byte) { unsigned char data[2]; data[0] = addr; data[1] = byte; if (usb_control_msg(dev, 0x40, 0xb4, 0, 0xa0, 2, data, 500) != 2) return -1; /* I2C EEPROM takes 5ms to write byte */ usleep(10000); return 0; } static int read_eeprom_byte(struct usbdevice *dev, unsigned char addr) { unsigned char data[1]; data[0] = addr; if (usb_control_msg(dev, 0x40, 0xb4, 0, 0xa0, 1, data, 500) != 1) return -1; if (usb_control_msg(dev, 0xc0, 0xb4, 0, 0xa0, 1, data, 500) != 1) return -1; return data[0] & 0xff; } /* --------------------------------------------------------------------- */ static int display_eeprom(struct usbdevice *dev, unsigned int serial) { unsigned char eeprom[256]; unsigned int i; int r; for (i = 0; i < 256; i++) { r = read_eeprom_byte(dev, i); if (r == -1) { fprintf(stderr, "Error reading EEPROM address 0x%02x\n", i); return -1; } eeprom[i] = r; } printf("EEPROM contents:"); for (i = 0; i < 256; i++) { if (!(i & 15)) printf("\n%04x:", i); printf(" %02x", eeprom[i]); } printf("\n\n" "VID %04x\n" "PID %04x\n" "DID %02x.%02x\n" "Serial %c%c%c%c%c%c\n\n", eeprom[1] | (eeprom[2] << 8), eeprom[3] | (eeprom[4] << 8), eeprom[6], eeprom[5], (eeprom[0x10] >= '0' && eeprom[0x10] <= '9') ? eeprom[0x10] : '.', (eeprom[0x11] >= '0' && eeprom[0x11] <= '9') ? eeprom[0x11] : '.', (eeprom[0x12] >= '0' && eeprom[0x12] <= '9') ? eeprom[0x12] : '.', (eeprom[0x13] >= '0' && eeprom[0x13] <= '9') ? eeprom[0x13] : '.', (eeprom[0x14] >= '0' && eeprom[0x14] <= '9') ? eeprom[0x14] : '.', (eeprom[0x15] >= '0' && eeprom[0x15] <= '9') ? eeprom[0x15] : '.'); return 0; } /* --------------------------------------------------------------------- */ static int program_eeprom(struct usbdevice *dev, unsigned int serial) { unsigned char eeprom[256]; unsigned int i; int r, ret = 0; memset(eeprom, 0xff, sizeof(eeprom)); eeprom[0] = 0xb0; eeprom[1] = 0xc0; eeprom[2] = 0xba; eeprom[3] = 0x34; eeprom[4] = 0x61; eeprom[5] = 0x01; eeprom[6] = 0x01; eeprom[0x10] = '0' + ((serial / 100000) % 10); eeprom[0x11] = '0' + ((serial / 10000) % 10); eeprom[0x12] = '0' + ((serial / 1000) % 10); eeprom[0x13] = '0' + ((serial / 100) % 10); eeprom[0x14] = '0' + ((serial / 10) % 10); eeprom[0x15] = '0' + (serial % 10); for (i = 0; i < 7; i++) { r = write_eeprom_byte(dev, i, eeprom[i]); if (r == -1) { fprintf(stderr, "Error writing EEPROM address 0x%02x\n", i); return -1; } } for (i = 0x10; i < 0x16; i++) { r = write_eeprom_byte(dev, i, eeprom[i]); if (r == -1) { fprintf(stderr, "Error writing EEPROM address 0x%02x\n", i); return -1; } } for (i = 0; i < 7; i++) { r = read_eeprom_byte(dev, i); if (r == -1) { fprintf(stderr, "Error reading EEPROM address 0x%02x\n", i); return -1; } if (r != eeprom[i]) { fprintf(stderr, "Error comparing EEPROM address 0x%02x: 0x%02x != 0x%02x\n", i, r, eeprom[i]); ret = -1; } } for (i = 0x10; i < 0x16; i++) { r = read_eeprom_byte(dev, i); if (r == -1) { fprintf(stderr, "Error reading EEPROM address 0x%02x\n", i); return -1; } if (r != eeprom[i]) { fprintf(stderr, "Error comparing EEPROM address 0x%02x: 0x%02x != 0x%02x\n", i, r, eeprom[i]); ret = -1; } } if (!ret) printf("Successfully programmed serial %c%c%c%c%c%c\n", eeprom[0x10], eeprom[0x11], eeprom[0x12], eeprom[0x13], eeprom[0x14], eeprom[0x15]); return ret; } /* --------------------------------------------------------------------- */ int main(int argc, char *argv[]) { static const struct option long_options[] = { { "drv", 1, 0, 'D' }, { "vendor", 1, 0, 'V' }, { "product", 1, 0, 'P' }, { 0, 0, 0, 0 } }; struct usbdevice *dev; struct usb_device_descriptor devdesc; int c, err = 0; unsigned int vid = 0x547, pid = 0x2131, serial; int (*func)(struct usbdevice *dev, unsigned int serial) = program_eeprom; struct timeval tv; printf("writeeeprom v" VERSION " (C) 1999-2001 by Thomas Sailer, HB9JNX/AE4WA\n"); gettime(&tv); srand(tv.tv_sec ^ tv.tv_usec); serial = rand(); while ((c = getopt_long(argc, argv, "D:V:P:dn:v:", long_options, NULL)) != EOF) { switch (c) { case 'D': usb_setmountpoint(optarg); break; case 'V': vid = strtoul(optarg, NULL, 0); break; case 'P': pid = strtoul(optarg, NULL, 0); break; case 'd': func = display_eeprom; break; case 'n': serial = strtoul(optarg, NULL, 0); break; case 'v': verboselevel = strtoul(optarg, NULL, 0); break; default: err++; break; } } if (err) { fprintf(stderr, "usage: %s [-v ] [-D ] [-V ] [-P ] [-n ] [-d]\n", argv[0]); exit(1); } dev = usb_open(vid, pid, 0, 0); if (!dev) dev = usb_open(BAYCOMUSB_VENDORID, BAYCOMUSB_PRODUCTID_FPGALD, 0, 0); if (!dev) { fprintf(stderr, "Cannot open USB device with VendorID 0x%04x/ProductID 0x%04x\n", vid, pid); exit(1); } if (usb_getdevicedescriptor(dev, &devdesc)) { perror("usb_getdevicedescriptor"); exit(1); } if ((devdesc.idVendor[0] | (devdesc.idVendor[1] << 8)) != BAYCOMUSB_VENDORID || (devdesc.idProduct[0] | (devdesc.idProduct[1] << 8)) != BAYCOMUSB_PRODUCTID_FPGALD) { if (adapter_reset(dev)) { perror("adapter_reset"); exit(1); } usb_close(dev); /*sleep(3);*/ usleep(3000000); if (!(dev = usb_open(BAYCOMUSB_VENDORID, BAYCOMUSB_PRODUCTID_FPGALD, 0, 0))) { fprintf(stderr, "Cannot open USB device\n"); exit(1); } } if (usb_setconfiguration(dev, 1)) { perror("usb_setconfiguration"); exit(1); } c = func(dev, serial); usb_close(dev); exit(abs(c)); } baycomusb-0.10.orig/diag/baycomusb.h0100644000175100017510000001061007340456433015457 0ustar abaaba/*****************************************************************************/ /* * baycomusb.h -- Baycom USB modem diagnostics utility. * * Copyright (C) 1999-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * Please note that the GPL allows you to use the driver, NOT the radio. * In order to use the radio, you need a license from the communications * authority of your country. * */ /*****************************************************************************/ #ifndef _BAYCOMUSB_H #define _BAYCOMUSB_H /* ---------------------------------------------------------------------- */ #include "sysdeps.h" #include "usbdrv.h" /* ---------------------------------------------------------------------- */ #define MODE_NONE 0 #define MODE_FSK 1 #define MODE_EXTERNAL 2 #define MODE_AFSK 3 #define MODE_AUDIO 4 #define MODE_BSCAN 5 struct configentry { char serial[32]; struct { unsigned int mode; unsigned int fclk; unsigned int bitraterx; unsigned int bitratetx; unsigned int samplerate; unsigned int loopback; unsigned int pttmute; unsigned int filtmode; unsigned int gain; } adapter; struct { unsigned int txdelay; unsigned int slottime; unsigned int ppersistence; unsigned int txtail; unsigned int fullduplex; } chaccess; struct { char ifname[16]; char hwaddr[16]; char ipaddr[16]; char netmask[16]; char broadcast[16]; } ifcfg; struct { unsigned int output; unsigned int direction; unsigned int rxc; unsigned int txc; unsigned int txd; } mdisc; struct { unsigned int ctrl; } t7f; }; extern int config_parse(void); extern int config_save(void); extern void config_default(struct configentry *cfg); extern void config_setfile(const char *name); extern const char *config_getfile(void); extern struct configentry *config_entry(unsigned int index); extern struct configentry *config_findentry(const char *ser); extern struct configentry *config_lookup(const char *ser); extern struct configentry *config_newentry(void); extern int config_deleteentry(struct configentry *cfg); /* currently only under Windows */ extern int config_setvalue(const char *propname, const char *value); extern int config_getvalue(const char *propname, char *value, size_t vsize); /* ---------------------------------------------------------------------- */ #define BAYCOMUSB_VENDORID 0xbac0 #define BAYCOMUSB_PRODUCTID_EMPTY 0x6134 #define BAYCOMUSB_PRODUCTID_FPGALD 0x6135 #define BAYCOMUSB_PRODUCTID_MODEM 0x6136 #define BAYCOMUSB_PRODUCTID_AUDIO 0x6137 /* ---------------------------------------------------------------------- */ extern int adapter_reset(struct usbdevice *dev); extern int adapter_configure(struct usbdevice *dev); extern struct configentry *adapter_findconfig(struct usbdevice *dev); /* ---------------------------------------------------------------------- */ /* * description of the test procedures defined */ extern const struct usbtests { const char *name; const char *desc; void (*cfg)(struct configentry *); int (*func)(struct usbdevice *, struct configentry *); } usbtests[]; /* ---------------------------------------------------------------------- */ /* * provided externally! */ extern int lprintf(unsigned vl, const char *format, ...) __attribute__ ((format (printf, 2, 3))); extern int tprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2))); extern int idle_callback(unsigned us_delay); /* ---------------------------------------------------------------------- */ extern int snprintpkt(char *buf, size_t sz, const u_int8_t *pkt, unsigned len); /* ---------------------------------------------------------------------- */ #endif /* _BAYCOMUSB_H */ baycomusb-0.10.orig/diag/baycomusb.80100644000175100017510000000423307325134424015377 0ustar abaaba.\" Copyright 1999 Thomas Sailer (sailer@ife.ee.ethz.ch) .\" May be distributed under the GNU General Public License .\" .\" " .TH BAYCOMUSB 8 "13 May 1998" "BaycomUSB 0.1" "Linux AX.25 Utilities Manual" .SH NAME baycomusb \- Baycom USB modem diagnostics utility .SH SYNOPSIS .B baycomusb .B "[ \-sv ]" .B "[\-D usbdevfsmountdir]" .B "[\-C configfilepath]" .B "[\-d busnr:devnr]" .B "[\-i index]" .B "[\-I ifname]" .B "[\-t testname]" .B "[\--drv=usbdevfsmountdir]" .B "[\--config=configfilepath]" .B "[\--device=busnr:devnr]" .B "[\--index=index]" .B "[\--ifname=ifname]" .B "[\--test=testname]" .SH DESCRIPTION .B baycomusb is a user mode driver for the Baycom EPP modem family. It currently supports the conventional EPP modem (using the IDT 72xxx FIFO's) and the FPGA (Xilinx XCS10) variant. The driver automatically initializes the FPGA modem depending on the requested mode. In order to keep the resident memory footprint small (approx 20kBytes plus standard system shared libraries like libc), the initialization code is contained in a shared library called .I "baycomfpga_init.so". This driver is able to automatically attach itself to the kernel network stack as a network interface (usually called ax0). To do this it requires the Linux Kernel MKISS driver (enable CONFIG_MKISS). .SH OPTIONS .B baycomusb accepts the following options: .TP .B \-h .B \--help Display an overview of the available command line parameters and exit. .TP .B \-v .B \--verbose Increases the verbosity of the output. May be cumulated. .TP .B \-D .B \--drv Specifies the mount directory of the USB device filesystem. The default is /proc/bus/usb .TP .B \-C .B \--config Specifies the config file. The default is /etc/ax25/baycomusb.xml. .TP .B \-d .B \--device Specifies the device by bus number and device number. .TP .B \-i .B \--index Specifies the device by a number. .TP .B \-I .B \--ifname The name of the AX.25 network interface when performing final setup (to be used by the kernel driver). .TP .B \-t .B \--test Specifies the test to be performed. .SH "SEE ALSO" .nf .BR ifconfig "\ (8), " sethdlc "\ (8), " .fi .SH AUTHOR baycomusb was written by Thomas Sailer, HB9JNX/AE4WA (sailer@ife.ee.ethz.ch). baycomusb-0.10.orig/diag/cfgwin32.c0100644000175100017510000004244307340457772015130 0ustar abaaba/*****************************************************************************/ /* * cfgwin32.c -- Windows (registry) configuration IO. * * Copyright (C) 2000-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "baycomusb.h" #include /* ---------------------------------------------------------------------- */ #define MAXCONFIGENTRIES 32 #define REGISTRYPATH "SOFTWARE\\FlexNet\\BaycomUSB" #define REGHKEY HKEY_LOCAL_MACHINE static char configfile[256] = REGISTRYPATH; static struct configentry configs[MAXCONFIGENTRIES]; /* ---------------------------------------------------------------------- */ void config_setfile(const char *name) { if (!name) name = REGISTRYPATH; strncpy(configfile, name, sizeof(configfile)); } const char *config_getfile(void) { return configfile; } struct configentry *config_entry(unsigned int index) { struct configentry *cfg; unsigned int i; for (cfg = &configs[0], i = 0; i < MAXCONFIGENTRIES; i++, cfg++) { if (!cfg->serial[0]) continue; if (!index) return cfg; index--; } return NULL; } struct configentry *config_findentry(const char *ser) { struct configentry *cfg; unsigned int i; for (cfg = &configs[0], i = 0; i < MAXCONFIGENTRIES; i++, cfg++) { if (!cfg->serial[0]) continue; if (!strcmp(cfg->serial, ser)) return cfg; } return NULL; } struct configentry *config_lookup(const char *ser) { struct configentry *cfg; unsigned int i; for (cfg = &configs[0], i = 0; i < MAXCONFIGENTRIES; i++, cfg++) { if (!cfg->serial[0]) continue; if (!strcmp(cfg->serial, ser)) return cfg; } return &configs[0]; } struct configentry *config_newentry(void) { struct configentry *cfg; unsigned int i; for (cfg = &configs[1], i = 1; i < MAXCONFIGENTRIES && cfg->serial[0]; i++, cfg++); if (i >= MAXCONFIGENTRIES) return NULL; config_default(&configs[i]); return &configs[i]; } int config_deleteentry(struct configentry *cfg) { if (!cfg) return -1; if (cfg == &configs[0]) return -1; cfg->serial[0] = 0; return 0; } /* ---------------------------------------------------------------------- */ static int deletekeyx(HKEY key) { char name[128]; LONG err; DWORD len; HKEY key2; int ret = 0; for (;;) { len = sizeof(name); if ((RegEnumKeyEx(key, 0, name, &len, NULL, NULL, NULL, NULL)) != ERROR_SUCCESS) return ret; if ((err = RegOpenKeyEx(key, name, 0, KEY_ALL_ACCESS, &key2)) != ERROR_SUCCESS) { lprintf(10, "RegOpenKeyEx(%s) returned 0x%lx\n", name, err); return -1; } ret |= deletekeyx(key2); RegCloseKey(key2); RegDeleteKey(key, name); } return ret; } static int deletekey(const char *name) { HKEY key; int ret; DWORD err; if ((err = RegOpenKeyEx(REGHKEY, name, 0, KEY_ALL_ACCESS, &key)) != ERROR_SUCCESS) { lprintf(10, "RegOpenKeyEx(%s) returned 0x%lx\n", name, err); return -1; } ret = deletekeyx(key); RegCloseKey(key); RegDeleteKey(REGHKEY, name); return ret; } static int setprop(const char *serial, const char *section, const char *propname, const char *value) { char name[256]; HKEY key; DWORD err; snprintf(name, sizeof(name), "%s\\%s\\%s", configfile, serial, section); if ((err = RegCreateKeyEx(REGHKEY, name, 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &key, NULL)) != ERROR_SUCCESS) { lprintf(10, "RegCreateKeyEx(%s,%s) returned 0x%lx\n", serial, section, err); return -1; } err = RegSetValueEx(key, propname, 0, REG_SZ, value, strlen(value)+1); RegCloseKey(key); if (err != ERROR_SUCCESS) { lprintf(10, "RegSetValueEx(%s,%s,%s,%s) returned 0x%lx\n", serial, section, propname, value, err); return -1; } return 0; } static int getprop(const char *serial, const char *section, const char *propname, char *value, size_t vsize) { char name[256]; HKEY key; DWORD err, vtype, len; snprintf(name, sizeof(name), "%s\\%s\\%s", configfile, serial, section); if ((err = RegCreateKeyEx(REGHKEY, name, 0, "", REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &key, NULL)) != ERROR_SUCCESS) { lprintf(10, "RegCreateKeyEx(%s,%s) returned 0x%lx\n", serial, section, err); return -1; } len = vsize; err = RegQueryValueEx(key, propname, NULL, &vtype, value, &len); RegCloseKey(key); if (err != ERROR_SUCCESS) { lprintf(10, "RegQueryValueEx(%s,%s,%s) returned 0x%lx\n", serial, section, propname, err); value[0] = 0; return -1; } if (vtype != REG_SZ) { value[0] = 0; return -1; } if (len >= vsize) len = vsize; value[len] = 0; return 0; } int config_setvalue(const char *propname, const char *value) { char name[256]; HKEY key; DWORD err; snprintf(name, sizeof(name), "%s\\misc", configfile); if ((err = RegCreateKeyEx(REGHKEY, name, 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &key, NULL)) != ERROR_SUCCESS) { lprintf(10, "RegCreateKeyEx(misc) returned 0x%lx\n", err); return -1; } err = RegSetValueEx(key, propname, 0, REG_SZ, value, strlen(value)+1); RegCloseKey(key); if (err != ERROR_SUCCESS) { lprintf(10, "RegSetValueEx(misc,%s,%s) returned 0x%lx\n", propname, value, err); return -1; } return 0; } int config_getvalue(const char *propname, char *value, size_t vsize) { char name[256]; HKEY key; DWORD err, vtype, len; snprintf(name, sizeof(name), "%s\\misc", configfile); if ((err = RegCreateKeyEx(REGHKEY, name, 0, "", REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &key, NULL)) != ERROR_SUCCESS) { lprintf(10, "RegCreateKeyEx(misc) returned 0x%lx\n", err); return -1; } len = vsize; err = RegQueryValueEx(key, propname, NULL, &vtype, value, &len); RegCloseKey(key); if (err != ERROR_SUCCESS) { lprintf(10, "RegQueryValueEx(misc,%s) returned 0x%lx\n", propname, err); value[0] = 0; return -1; } if (vtype != REG_SZ) { value[0] = 0; return -1; } if (len >= vsize) len = vsize; value[len] = 0; return 0; } /* ---------------------------------------------------------------------- */ static void parseone(struct configentry *cfg) { char buf[128]; if (!getprop(cfg->serial, "adapter", "mode", buf, sizeof(buf))) { if (!strcmp(buf, "fsk")) { cfg->adapter.mode = MODE_FSK; } else if (!strcmp(buf, "external")) { cfg->adapter.mode = MODE_EXTERNAL; } else if (!strcmp(buf, "afsk")) { cfg->adapter.mode = MODE_AFSK; } else if (!strcmp(buf, "audio")) { cfg->adapter.mode = MODE_AUDIO; } else if (!strcmp(buf, "bscan")) { cfg->adapter.mode = MODE_BSCAN; } } if (!getprop(cfg->serial, "adapter", "fclk", buf, sizeof(buf))) cfg->adapter.fclk = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "adapter", "bitrate", buf, sizeof(buf))) cfg->adapter.bitraterx = cfg->adapter.bitratetx = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "adapter", "bitraterx", buf, sizeof(buf))) cfg->adapter.bitraterx = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "adapter", "bitratetx", buf, sizeof(buf))) cfg->adapter.bitratetx = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "adapter", "samplerate", buf, sizeof(buf))) cfg->adapter.samplerate = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "adapter", "loopback", buf, sizeof(buf))) cfg->adapter.loopback = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "adapter", "pttmute", buf, sizeof(buf))) cfg->adapter.pttmute = !(buf[0] == '0' || buf[0] == 'n' || buf[0] == 'N'); if (!getprop(cfg->serial, "adapter", "filtmode", buf, sizeof(buf))) cfg->adapter.filtmode = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "adapter", "gain", buf, sizeof(buf))) cfg->adapter.gain = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "chaccess", "txdelay", buf, sizeof(buf))) cfg->chaccess.txdelay = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "chaccess", "slottime", buf, sizeof(buf))) cfg->chaccess.slottime = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "chaccess", "ppersistence", buf, sizeof(buf))) cfg->chaccess.ppersistence = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "chaccess", "txtail", buf, sizeof(buf))) cfg->chaccess.txtail = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "chaccess", "fullduplex", buf, sizeof(buf))) cfg->chaccess.fullduplex = !(buf[0] == '0' || buf[0] == 'n' || buf[0] == 'N'); if (!getprop(cfg->serial, "interface", "ifname", buf, sizeof(buf))) strncpy(cfg->ifcfg.ifname, buf, sizeof(cfg->ifcfg.ifname)); if (!getprop(cfg->serial, "interface", "hwaddr", buf, sizeof(buf))) strncpy(cfg->ifcfg.hwaddr, buf, sizeof(cfg->ifcfg.hwaddr)); if (!getprop(cfg->serial, "interface", "ipaddr", buf, sizeof(buf))) strncpy(cfg->ifcfg.ipaddr, buf, sizeof(cfg->ifcfg.ipaddr)); if (!getprop(cfg->serial, "interface", "netmask", buf, sizeof(buf))) strncpy(cfg->ifcfg.netmask, buf, sizeof(cfg->ifcfg.netmask)); if (!getprop(cfg->serial, "interface", "broadcast", buf, sizeof(buf))) strncpy(cfg->ifcfg.broadcast, buf, sizeof(cfg->ifcfg.broadcast)); if (!getprop(cfg->serial, "modemdisc", "output", buf, sizeof(buf))) cfg->mdisc.output = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "modemdisc", "direction", buf, sizeof(buf))) cfg->mdisc.direction = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "modemdisc", "rxc", buf, sizeof(buf))) cfg->mdisc.rxc = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "modemdisc", "txc", buf, sizeof(buf))) cfg->mdisc.txc = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "modemdisc", "txd", buf, sizeof(buf))) cfg->mdisc.txd = strtoul(buf, NULL, 0); if (!getprop(cfg->serial, "t7f", "ctrl", buf, sizeof(buf))) cfg->t7f.ctrl =strtoul(buf, NULL, 0) ; } void config_default(struct configentry *cfg) { cfg->serial[0] = 0; cfg->adapter.mode = MODE_FSK; cfg->adapter.fclk = 19666600; cfg->adapter.bitraterx = cfg->adapter.bitratetx = 9600; cfg->adapter.samplerate = 8000; cfg->adapter.loopback = 0; cfg->adapter.pttmute = 1; cfg->adapter.filtmode = 0; cfg->adapter.gain = 0; cfg->chaccess.txdelay = 150; cfg->chaccess.slottime = 100; cfg->chaccess.ppersistence = 40; cfg->chaccess.txtail = 10; cfg->chaccess.fullduplex = 0; strncpy(cfg->ifcfg.ifname, "bcu0", sizeof(cfg->ifcfg.ifname)); strncpy(cfg->ifcfg.hwaddr, "N0CALL", sizeof(cfg->ifcfg.hwaddr)); strncpy(cfg->ifcfg.ipaddr, "10.0.0.1", sizeof(cfg->ifcfg.ipaddr)); strncpy(cfg->ifcfg.netmask, "255.255.255.0", sizeof(cfg->ifcfg.netmask)); strncpy(cfg->ifcfg.broadcast, "10.0.0.255", sizeof(cfg->ifcfg.broadcast)); cfg->mdisc.output = 0; cfg->mdisc.direction = 0xff; cfg->mdisc.rxc = 0; cfg->mdisc.txc = 0; cfg->mdisc.txd = 0; cfg->t7f.ctrl = 0; } int config_parse(void) { HKEY regkey; LONG err; DWORD len; DWORD index = 0; char buf[256]; struct configentry *cfg; unsigned int i; /* default configuration */ for (i = 0; i < MAXCONFIGENTRIES; i++) { cfg = &configs[i]; config_default(cfg); } strncpy(configs[0].serial, "default", sizeof(configs[0].serial)); /* enumerate registry keys */ if ((err = RegOpenKeyEx(REGHKEY, configfile, 0, KEY_READ, ®key)) != ERROR_SUCCESS) { lprintf(10, "RegOpenKeyEx(%s) returned 0x%lx\n", configfile, err); return -1; } for (;;) { len = sizeof(buf); if ((RegEnumKeyEx(regkey, index, buf, &len, NULL, NULL, NULL, NULL)) != ERROR_SUCCESS) break; index++; if (!strcmp(buf, "default")) cfg = &configs[0]; else if (buf[0] >= '0' && buf[0] <= '9') { cfg = config_findentry(buf); if (!cfg) { cfg = config_newentry(); if (!cfg) { lprintf(10, "Too many configurations, ignoring serial %s\n", buf); continue; } strncpy(cfg->serial, buf, sizeof(cfg->serial)); } } parseone(cfg); #if 0 lprintf(10, "Read Configuration: Serial %s, Mode %u\n", cfg->serial, cfg->adapter.mode); #endif } RegCloseKey(regkey); return 0; } /* ---------------------------------------------------------------------- */ int config_save(void) { struct configentry *cfg; HKEY regkey; LONG err; DWORD len, index; char buf[32]; char buf2[256]; unsigned int i; /* first delete all nonexisting serials */ delloop: /* enumerate registry keys */ if ((err = RegOpenKeyEx(REGHKEY, configfile, 0, KEY_READ, ®key)) != ERROR_SUCCESS) { lprintf(10, "RegOpenKeyEx(%s) returned 0x%lx\n", configfile, err); goto dosave; } index = 0; for (;;) { len = sizeof(buf); if ((RegEnumKeyEx(regkey, index, buf, &len, NULL, NULL, NULL, NULL)) != ERROR_SUCCESS) break; index++; if (buf[0] < '0' || buf[0] > '9') continue; for (i = 0; i < MAXCONFIGENTRIES && (!configs[i].serial[0] || strcmp(buf, configs[i].serial)); i++); if (i >= MAXCONFIGENTRIES) { RegCloseKey(regkey); snprintf(buf2, sizeof(buf2), "%s\\%s", configfile, buf); deletekey(buf2); lprintf(10, "Deleting Key %s\n", buf2); goto delloop; } } RegCloseKey(regkey); /* save existing serials */ dosave: for (i = 0, cfg = configs; i < MAXCONFIGENTRIES; i++, cfg++) { if (!cfg->serial[0]) continue; setprop(cfg->serial, "adapter", "mode", (cfg->adapter.mode == MODE_EXTERNAL) ? "external" : (cfg->adapter.mode == MODE_AFSK) ? "afsk" : (cfg->adapter.mode == MODE_AUDIO) ? "audio" : (cfg->adapter.mode == MODE_BSCAN) ? "bscan" : "fsk"); snprintf(buf, sizeof(buf), "%d", cfg->adapter.fclk); setprop(cfg->serial, "adapter", "fclk", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.bitraterx); setprop(cfg->serial, "adapter", "bitraterx", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.bitratetx); setprop(cfg->serial, "adapter", "bitratetx", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.samplerate); setprop(cfg->serial, "adapter", "samplerate", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.loopback); setprop(cfg->serial, "adapter", "loopback", buf); snprintf(buf, sizeof(buf), "%d", !!cfg->adapter.pttmute); setprop(cfg->serial, "adapter", "pttmute", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.filtmode); setprop(cfg->serial, "adapter", "filtmode", buf); snprintf(buf, sizeof(buf), "%d", cfg->adapter.gain); setprop(cfg->serial, "adapter", "gain", buf); snprintf(buf, sizeof(buf), "%d", cfg->chaccess.txdelay); setprop(cfg->serial, "chaccess", "txdelay", buf); snprintf(buf, sizeof(buf), "%d", cfg->chaccess.slottime); setprop(cfg->serial, "chaccess", "slottime", buf); snprintf(buf, sizeof(buf), "%d", cfg->chaccess.ppersistence); setprop(cfg->serial, "chaccess", "ppersistence", buf); snprintf(buf, sizeof(buf), "%d", cfg->chaccess.txtail); setprop(cfg->serial, "chaccess", "txtail", buf); snprintf(buf, sizeof(buf), "%d", !!cfg->chaccess.fullduplex); setprop(cfg->serial, "chaccess", "fullduplex", buf); setprop(cfg->serial, "interface", "ifname", cfg->ifcfg.ifname); setprop(cfg->serial, "interface", "hwaddr", cfg->ifcfg.hwaddr); setprop(cfg->serial, "interface", "ipaddr", cfg->ifcfg.ipaddr); setprop(cfg->serial, "interface", "netmask", cfg->ifcfg.netmask); setprop(cfg->serial, "interface", "broadcast", cfg->ifcfg.broadcast); snprintf(buf, sizeof(buf), "0x%02x", cfg->mdisc.output & 0xff); setprop(cfg->serial, "modemdisc", "output", buf); snprintf(buf, sizeof(buf), "0x%02x", cfg->mdisc.direction & 0xff); setprop(cfg->serial, "modemdisc", "direction", buf); snprintf(buf, sizeof(buf), "%u", cfg->mdisc.rxc); setprop(cfg->serial, "modemdisc", "rxc", buf); snprintf(buf, sizeof(buf), "%u", cfg->mdisc.txc); setprop(cfg->serial, "modemdisc", "txc", buf); snprintf(buf, sizeof(buf), "%u", cfg->mdisc.txd); setprop(cfg->serial, "modemdisc", "txd", buf); snprintf(buf, sizeof(buf), "0x%02x", cfg->t7f.ctrl & 0x1f); setprop(cfg->serial, "t7f", "ctrl", buf); } return 0; } /* ---------------------------------------------------------------------- */ baycomusb-0.10.orig/trxapp/0042755000175100017510000000000007340500013013723 5ustar abaababaycomusb-0.10.orig/trxapp/Makefile.in0100644000175100017510000002366307340500013015775 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ SUBDIRS = src #install-data-local: # @$(NORMAL_INSTALL) # if test -d $(srcdir)/pixmaps; then \ # $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/pixmaps; \ # for pixmap in $(srcdir)/pixmaps/*; do \ # if test -f $$pixmap; then \ # $(INSTALL_DATA) $$pixmap $(DESTDIR)$(pkgdatadir)/pixmaps; \ # fi \ # done \ # fi #dist-hook: # if test -d pixmaps; then \ # mkdir $(distdir)/pixmaps; \ # for pixmap in pixmaps/*; do \ # if test -f $$pixmap; then \ # cp -p $$pixmap $(distdir)/pixmaps; \ # fi \ # done \ # fi EXTRA_DIST = trxapp.glade option1.png option1.xpm option2.png option2.xpm mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = DIST_COMMON = README AUTHORS ChangeLog Makefile.am Makefile.in NEWS \ configure.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar 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 trxapp/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status # 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = trxapp 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 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=../$(top_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 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 .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: baycomusb-0.10.orig/trxapp/README0100644000175100017510000000000007325134424014600 0ustar abaababaycomusb-0.10.orig/trxapp/AUTHORS0100644000175100017510000000000007325134424014770 0ustar abaababaycomusb-0.10.orig/trxapp/ChangeLog0100644000175100017510000000000007325134424015472 0ustar abaababaycomusb-0.10.orig/trxapp/Makefile.am0100644000175100017510000000124207325134424015765 0ustar abaaba## Process this file with automake to produce Makefile.in SUBDIRS = src #install-data-local: # @$(NORMAL_INSTALL) # if test -d $(srcdir)/pixmaps; then \ # $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/pixmaps; \ # for pixmap in $(srcdir)/pixmaps/*; do \ # if test -f $$pixmap; then \ # $(INSTALL_DATA) $$pixmap $(DESTDIR)$(pkgdatadir)/pixmaps; \ # fi \ # done \ # fi #dist-hook: # if test -d pixmaps; then \ # mkdir $(distdir)/pixmaps; \ # for pixmap in pixmaps/*; do \ # if test -f $$pixmap; then \ # cp -p $$pixmap $(distdir)/pixmaps; \ # fi \ # done \ # fi EXTRA_DIST = trxapp.glade option1.png option1.xpm option2.png option2.xpm baycomusb-0.10.orig/trxapp/NEWS0100644000175100017510000000000007325134424014417 0ustar abaababaycomusb-0.10.orig/trxapp/configure.in0100644000175100017510000000255307325134424016250 0ustar abaabadnl Process this file with autoconf to produce a configure script. AC_INIT(configure.in) AM_INIT_AUTOMAKE(t7fapp, 0.1) AM_CONFIG_HEADER(config.h) AC_ISC_POSIX AC_PROG_CC AM_PROG_CC_STDC AC_HEADER_STDC AM_PATH_GTK(1.2.0, , AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?)) dnl Add the languages which your application supports here. ALL_LINGUAS="" AM_GNU_GETTEXT dnl Set PACKAGE_LOCALE_DIR in config.h. if test "x${prefix}" = "xNONE"; then AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale") else AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale") fi dnl Set PACKAGE_DATA_DIR in config.h. if test "x${datadir}" = 'x${prefix}/share'; then if test "x${prefix}" = "xNONE"; then AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}") else AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}") fi else AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}") fi dnl Set PACKAGE_SOURCE_DIR in config.h. packagesrcdir=`cd $srcdir && pwd` AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}") dnl Use -Wall if we have gcc. changequote(,)dnl if test "x$GCC" = "xyes"; then case " $CFLAGS " in *[\ \ ]-Wall[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wall" ;; esac fi changequote([,])dnl AC_OUTPUT([ Makefile src/Makefile intl/Makefile po/Makefile.in ]) baycomusb-0.10.orig/trxapp/trxapp.glade0100644000175100017510000057412407340461304016260 0ustar abaaba trxapp trxapp src pixmaps C False True GtkWindow mainwindow destroy_event on_mainwindow_destroy_event Mon, 26 Jun 2000 22:53:51 GMT delete_event on_mainwindow_delete_event Mon, 26 Jun 2000 22:58:56 GMT Baycom USB Transceiver Controller GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkVBox vbox1 False 0 GtkHandleBox handlebox1 GTK_SHADOW_OUT GTK_POS_LEFT GTK_POS_TOP 0 False True GtkMenuBar menubar1 GTK_SHADOW_OUT GtkMenuItem file False GtkMenu file_menu GtkMenuItem freqlist GDK_CONTROL_MASK GDK_F activate activate on_freqlist_activate Fri, 15 Sep 2000 22:02:45 GMT False GtkMenuItem modemconfig GDK_CONTROL_MASK GDK_C activate activate on_modemconfig_activate Sun, 24 Sep 2000 00:31:43 GMT False GtkMenuItem selectmodem GDK_CONTROL_MASK GDK_S activate activate on_selectmodem_activate Sun, 24 Sep 2000 00:32:47 GMT False GtkMenuItem audioparams GDK_CONTROL_MASK GDK_Z activate activate on_audioparams_activate Mon, 16 Jul 2001 23:19:37 GMT False GtkMenuItem separator1 False GtkMenuItem quit GDK_CONTROL_MASK GDK_Q activate activate on_quit_activate Sun, 25 Jun 2000 14:41:57 GMT False GtkMenuItem audio False GtkMenu audio_menu GtkMenuItem spkscope activate on_spkscope_activate Mon, 16 Jul 2001 21:15:03 GMT False GtkMenuItem spkspectrum activate on_spkspectrum_activate Mon, 16 Jul 2001 21:15:29 GMT False GtkMenuItem micscope activate on_micscope_activate Mon, 16 Jul 2001 21:15:40 GMT False GtkMenuItem micspectrum activate on_micspectrum_activate Mon, 16 Jul 2001 21:15:52 GMT False GtkMenuItem audiodtmf activate on_audiodtmf_activate Mon, 16 Jul 2001 21:16:27 GMT False GtkMenuItem audiopwrs activate on_audiopwrs_activate Wed, 18 Jul 2001 14:26:14 GMT False GtkMenuItem expert False GtkMenu expert_menu GtkMenuItem terminal Open Terminal Window GDK_CONTROL_MASK GDK_T activate activate on_terminal_activate Tue, 11 Jul 2000 20:37:18 GMT False GtkMenuItem channelwindow GDK_CONTROL_MASK GDK_M activate activate on_channelwindow_activate Sun, 16 Jul 2000 01:29:39 GMT False GtkMenuItem progchmem GDK_CONTROL_MASK GDK_P activate activate on_progchmem_activate Sun, 16 Jul 2000 01:30:15 GMT False GtkMenuItem help True GtkMenu help_menu GtkMenuItem about GDK_CONTROL_MASK GDK_A activate activate on_about_activate Sun, 25 Jun 2000 14:42:27 GMT False GtkHBox hbox2 False 0 0 True True GtkVBox vbox5 False 0 0 True True GtkFrame frame2 0 GTK_SHADOW_ETCHED_IN 0 True True GtkTable table4 2 3 False 0 0 GtkSpinButton rxqrg True changed on_qrg_changed Fri, 15 Sep 2000 22:58:04 GMT 1 4 True GTK_UPDATE_ALWAYS False False 0 0 99999 0.0125 1 1 1 2 0 1 4 4 True True False False True True GtkLabel label58 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 1 2 0 0 False False False False True True GtkLabel label57 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False False False False True True GtkSpinButton txqrg True changed on_qrg_changed Fri, 15 Sep 2000 22:58:14 GMT 1 4 True GTK_UPDATE_ALWAYS False False 0 0 99999 0.0125 1 1 1 2 1 2 4 4 True False False False True False GtkLabel label124 GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 0 1 0 0 False False False False True True GtkLabel label125 GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 1 2 0 0 False False False False True True GtkFrame frame6 0 GTK_SHADOW_ETCHED_IN 0 True True GtkHBox hbox4 False 0 GtkCombo stnname False True False True False 0 True True GtkEntry GtkCombo:entry stnnameentry True changed on_stn_changed Fri, 15 Sep 2000 22:59:51 GMT False True 0 GtkFrame frame3 0 GTK_SHADOW_ETCHED_IN 0 True True GtkHBox hbox3 False 0 GtkToggleButton buttonptt 6 True toggled on_buttonptt_toggled Mon, 16 Jul 2001 21:25:27 GMT False 0 True True GtkButton button1750 6 True pressed on_button1750_pressed Mon, 16 Jul 2001 22:34:55 GMT released on_button1750_released Mon, 16 Jul 2001 22:35:03 GMT 0 True True GtkLabel labelptt GTK_JUSTIFY_CENTER False 1 0.5 5 0 0 True True Custom ledptt create_led_pixmap 0 0 Tue, 11 Jul 2000 22:10:19 GMT 4 False True GtkLabel labeldcd GTK_JUSTIFY_CENTER False 1 0.5 5 0 0 True True Custom leddcd create_led_pixmap 0 0 Tue, 11 Jul 2000 22:10:31 GMT 4 False True GtkFrame frame5 0.5 GTK_SHADOW_ETCHED_IN 0 False False GtkProgressBar rssi 255 255 255 GTK_PROGRESS_CONTINUOUS GTK_PROGRESS_BOTTOM_TO_TOP False True %v 0.5 0.5 GtkFrame frame4 0 GTK_SHADOW_ETCHED_IN 0 False False Custom rssihistory 256 64 signalhistory_new 0 0 Tue, 11 Jul 2000 23:06:32 GMT GtkStatusbar statusbar 0 False False GtkDialog aboutwindow About Baycom USB Transceiver Controller GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True True False baycomusb baycomusb GtkVBox Dialog:vbox dialog-vbox1 False 0 GtkHBox Dialog:action_area dialog-action_area1 10 True 5 0 False True GTK_PACK_END GtkHButtonBox hbuttonbox1 GTK_BUTTONBOX_DEFAULT_STYLE 30 85 27 7 0 0 False False GtkButton aboutok True True GtkFrame frame1 6 0.5 GTK_SHADOW_ETCHED_OUT 0 True True GtkVBox vbox4 False 0 GtkLabel label13 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 True True GtkLabel label14 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 True True GtkDialog errordialog Error GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True True True False baycomusb baycomusb GtkVBox Dialog:vbox dialog-vbox3 False 0 GtkHBox Dialog:action_area dialog-action_area3 10 True 5 0 False True GTK_PACK_END GtkHButtonBox hbuttonbox3 GTK_BUTTONBOX_DEFAULT_STYLE 30 85 27 7 0 0 True True GtkButton errorok True True 0 GDK_Return clicked GtkLabel errorlabel GTK_JUSTIFY_CENTER True 0.5 0.5 6 6 0 True True GtkWindow terminalwindow delete_event on_terminalwindow_delete_event Tue, 11 Jul 2000 21:18:39 GMT T7F Terminal GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False 250 150 True True False baycomusb baycomusb GtkScrolledWindow scrolledwindow1 GTK_POLICY_ALWAYS GTK_POLICY_ALWAYS GTK_UPDATE_CONTINUOUS GTK_UPDATE_CONTINUOUS GtkText text True True GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK key_press_event on_text_key_press_event Tue, 11 Jul 2000 20:40:25 GMT key_release_event on_text_key_release_event Tue, 11 Jul 2000 20:40:35 GMT False GtkWindow chmemorywindow delete_event on_chmemorywindow_delete_event Sun, 16 Jul 2000 01:33:47 GMT T7F Channel Memory GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkTable table5 12 5 False 0 0 GtkLabel label61 GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 0 1 1 2 0 0 True True False False True True GtkLabel label62 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 2 3 0 0 True True False False True True GtkLabel label63 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 3 4 0 0 True True False False True True GtkLabel label64 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 4 5 0 0 True True False False True True GtkLabel label65 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 5 6 0 0 True True False False True True GtkLabel label66 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 6 7 0 0 True True False False True True GtkLabel label67 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 7 8 0 0 True True False False True True GtkLabel label68 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 8 9 0 0 True True False False True True GtkLabel label69 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 9 10 0 0 True True False False True True GtkLabel label70 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 10 11 0 0 True True False False True True GtkLabel label71 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 0 1 11 12 0 0 True True False False True True GtkLabel label73 GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 5 0 1 0 0 True True False False True True GtkLabel label72 GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 3 0 1 0 0 True True False False True True GtkLabel label77 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 4 5 1 2 0 0 True True False False True True GtkLabel label76 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 3 4 1 2 0 0 True True False False True True GtkLabel label75 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 2 3 1 2 0 0 True True False False True True GtkLabel label74 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 1 2 1 2 0 0 True True False False True True GtkLabel ch0a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 2 3 0 0 True True False False True True GtkLabel ch1a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 3 4 0 0 True True False False True True GtkLabel ch2a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 4 5 0 0 True True False False True True GtkLabel ch3a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 5 6 0 0 True True False False True True GtkLabel ch4a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 6 7 0 0 True True False False True True GtkLabel ch5a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 7 8 0 0 True True False False True True GtkLabel ch6a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 8 9 0 0 True True False False True True GtkLabel ch7a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 9 10 0 0 True True False False True True GtkLabel ch8a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 10 11 0 0 True True False False True True GtkLabel ch9a GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 1 2 11 12 0 0 True True False False True True GtkLabel ch9b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 11 12 0 0 True True False False True True GtkLabel ch8b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 10 11 0 0 True True False False True True GtkLabel ch7b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 9 10 0 0 True True False False True True GtkLabel ch6b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 8 9 0 0 True True False False True True GtkLabel ch5b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 7 8 0 0 True True False False True True GtkLabel ch4b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 6 7 0 0 True True False False True True GtkLabel ch3b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 5 6 0 0 True True False False True True GtkLabel ch2b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 4 5 0 0 True True False False True True GtkLabel ch1b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 3 4 0 0 True True False False True True GtkLabel ch0b GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 2 3 0 0 True True False False True True GtkLabel ch0c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 2 3 0 0 True True False False True True GtkLabel ch1c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 3 4 0 0 True True False False True True GtkLabel ch2c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 4 5 0 0 True True False False True True GtkLabel ch3c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 5 6 0 0 True True False False True True GtkLabel ch4c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 6 7 0 0 True True False False True True GtkLabel ch5c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 7 8 0 0 True True False False True True GtkLabel ch6c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 8 9 0 0 True True False False True True GtkLabel ch7c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 9 10 0 0 True True False False True True GtkLabel ch8c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 10 11 0 0 True True False False True True GtkLabel ch9c GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 3 4 11 12 0 0 True True False False True True GtkLabel ch0d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 2 3 0 0 True True False False True True GtkLabel ch1d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 3 4 0 0 True True False False True True GtkLabel ch2d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 4 5 0 0 True True False False True True GtkLabel ch3d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 5 6 0 0 True True False False True True GtkLabel ch4d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 6 7 0 0 True True False False True True GtkLabel ch5d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 7 8 0 0 True True False False True True GtkLabel ch6d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 8 9 0 0 True True False False True True GtkLabel ch7d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 9 10 0 0 True True False False True True GtkLabel ch8d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 10 11 0 0 True True False False True True GtkLabel ch9d GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 4 5 11 12 0 0 True True False False True True GtkWindow chprogwindow delete_event on_chprogwindow_delete_event Sun, 16 Jul 2000 01:33:52 GMT Program Channel GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkVBox vbox6 False 0 GtkTable table6 4 3 False 0 0 0 True True GtkSpinButton rxqrg True 1 4 True GTK_UPDATE_ALWAYS False True 430 430 440 0.025 1 1 1 2 2 3 3 3 True True False False True True GtkSpinButton txqrg True 1 4 False GTK_UPDATE_ALWAYS False False 430 430 440 0.025 1 1 1 2 3 4 3 3 True True False False True True GtkLabel label119 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 1 2 0 0 False True False False True True GtkLabel label118 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False True False False True True GtkLabel label120 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 2 3 0 0 False True False False True True GtkLabel label121 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 3 4 0 0 False True False False True True GtkSpinButton channel True changed on_chprog_channel_changed Sun, 16 Jul 2000 01:29:20 GMT 1 0 True GTK_UPDATE_ALWAYS False True 0 0 9 1 1 1 1 3 0 1 3 3 True True False False True True GtkCheckButton raster True toggled on_chprog_raster_toggled Sun, 01 Oct 2000 17:34:26 GMT False True 1 3 1 2 3 3 True True False False True True GtkLabel label123 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 3 4 0 0 False True False False True True GtkLabel label122 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 2 3 0 0 False True False False True True GtkHButtonBox hbuttonbox4 GTK_BUTTONBOX_SPREAD 30 85 27 7 0 0 False True GtkButton chprogcancel True True clicked on_chprogcancel_clicked Sun, 16 Jul 2000 01:28:27 GMT GtkButton chprogok True True clicked on_chprogok_clicked Sun, 16 Jul 2000 01:37:20 GMT GtkWindow freqlistwindow 600 200 delete_event on_freqlistwindow_delete_event Fri, 15 Sep 2000 22:38:32 GMT Frequency List GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkVBox vbox7 False 0 GtkScrolledWindow scrolledwindow2 GTK_POLICY_ALWAYS GTK_POLICY_ALWAYS GTK_UPDATE_CONTINUOUS GTK_UPDATE_CONTINUOUS 0 True True GtkCList freqlist True select_row on_freqlist_select_row Sat, 16 Sep 2000 00:51:18 GMT unselect_row on_freqlist_unselect_row Sat, 16 Sep 2000 00:51:26 GMT 4 303,80,80,80 GTK_SELECTION_SINGLE True GTK_SHADOW_IN GtkLabel CList:title label126 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkLabel CList:title label127 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkLabel CList:title label128 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkLabel CList:title label129 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkHButtonBox hbuttonbox5 GTK_BUTTONBOX_SPREAD 30 85 27 7 0 4 False True GtkButton buttonset True True clicked on_freqlistset_clicked Fri, 15 Sep 2000 22:49:34 GMT GtkButton buttonnew True True clicked on_freqlistnew_clicked Fri, 15 Sep 2000 22:49:43 GMT GtkButton buttonupdate True True clicked on_freqlistupdate_clicked Fri, 15 Sep 2000 22:49:53 GMT GtkButton buttondelete True True clicked on_freqlistdelete_clicked Fri, 15 Sep 2000 22:50:06 GMT GtkWindow newstationwindow delete_event on_newstationwindow_delete_event Fri, 15 Sep 2000 22:40:51 GMT New Station GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False False False baycomusb baycomusb GtkVBox vbox8 False 0 GtkTable table7 6 3 False 0 0 0 False True GtkLabel label129 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False False False False True True GtkLabel label130 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 1 2 0 0 False False False False True True GtkLabel label131 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 2 3 0 0 False False False False True True GtkEntry stnname 215 True True True 0 1 3 2 3 4 4 True False False False True True GtkSpinButton rxqrg True 1 4 True GTK_UPDATE_ALWAYS False False 430 430 440 0.0125 1 1 1 2 0 1 4 4 True True False False True True GtkSpinButton txqrg True 1 4 True GTK_UPDATE_ALWAYS False False 430 430 440 0.0125 1 1 1 2 1 2 4 4 True True False False True True GtkLabel label133 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 1 2 0 0 False False False False True True GtkLabel label132 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 0 1 0 0 False False False False True True GtkLabel label141 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 3 4 0 0 False False False False True True GtkLabel label142 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 4 5 0 0 False False False False True True GtkLabel label147 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 5 6 0 0 False False False False True True GtkCombo mode True False False True False - fsk afsk audio external 1 2 3 4 4 4 True False False False True True GtkEntry GtkCombo:entry modeentry True changed on_newstnmodeentry_changed Wed, 27 Jun 2001 23:40:27 GMT False True 0 - GtkSpinButton bitraterx True 1 0 True GTK_UPDATE_ALWAYS False False 9600 1200 310000 1200 9600 9600 1 2 4 5 4 4 True True False False True True GtkSpinButton bitratetx True 1 0 True GTK_UPDATE_ALWAYS False False 9600 1200 310000 1200 9600 9600 1 2 5 6 4 4 True True False False True True GtkLabel label143 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 4 5 0 0 False False False False True True GtkLabel label146 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 5 6 0 0 False False False False True True GtkHButtonBox hbuttonbox6 GTK_BUTTONBOX_SPREAD 30 85 27 7 0 5 False True GtkButton buttonok True True clicked on_newstnok_clicked Fri, 15 Sep 2000 22:41:56 GMT GtkButton buttoncancel True True clicked on_newstncancel_clicked Fri, 15 Sep 2000 22:41:42 GMT GtkWindow modemselectwindow delete_event on_modemselectwindow_delete_event Sun, 24 Sep 2000 01:58:14 GMT Modem/Transceiver Selection GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkVBox vbox9 False 0 GtkScrolledWindow scrolledwindow3 GTK_POLICY_ALWAYS GTK_POLICY_ALWAYS GTK_UPDATE_CONTINUOUS GTK_UPDATE_CONTINUOUS 0 True True GtkCList modemlist True select_row on_modemlist_select_row Sun, 24 Sep 2000 01:54:01 GMT unselect_row on_modemlist_unselect_row Sun, 24 Sep 2000 01:54:09 GMT 3 141,103,80 GTK_SELECTION_SINGLE True GTK_SHADOW_IN GtkLabel CList:title label134 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkLabel CList:title label135 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkLabel CList:title label136 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkHButtonBox hbuttonbox7 GTK_BUTTONBOX_SPREAD 30 85 27 7 0 0 False True GtkButton modemselok True True clicked on_modemselok_clicked Sun, 24 Sep 2000 00:27:30 GMT GtkButton modemselcancel True True clicked on_modemselcancel_clicked Sun, 24 Sep 2000 00:27:23 GMT GtkWindow configwindow delete_event on_configwindow_delete_event Sun, 24 Sep 2000 01:03:18 GMT Baycom USB Adapter Configuration GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkVBox vbox1 False 0 GtkNotebook confignotebook True True True GTK_POS_TOP False 2 2 False 0 True True GtkTable table1 7 3 False 0 0 GtkLabel label22 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False False False False True True GtkLabel label23 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 1 2 0 0 False False False False True True GtkLabel label24 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 2 3 0 0 False False False False True True GtkLabel label144 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 3 4 0 0 False False False False True True GtkCombo adaptmode True False True True False fsk afsk external audio 1 3 0 1 3 3 True False False False True False GtkEntry GtkCombo:entry adaptmodeentry True True True 0 fsk GtkSpinButton adaptfclk True 1 0 False GTK_UPDATE_ALWAYS False False 1.96666e+07 1e+06 2.5e+07 1 10 10 1 2 1 2 3 3 True False False False True False GtkLabel label29 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 1 2 0 0 False False False False True True GtkSpinButton adaptbitraterx used only in FSK and EXTERNAL mode True 1 0 False GTK_UPDATE_ALWAYS False False 9600 10 310000 1200 9600 9600 1 2 2 3 3 3 True False False False True False GtkLabel label65 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 2 3 0 0 False False False False True True GtkSpinButton adaptbitratetx used only in FSK and EXTERNAL mode True 1 0 False GTK_UPDATE_ALWAYS False False 9600 10 310000 1200 9600 9600 1 2 3 4 3 3 True False False False True False GtkLabel label145 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 3 4 0 0 False False False False True True GtkLabel label25 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 4 5 0 0 False False False False True True GtkLabel label26 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 5 6 0 0 False False False False True True GtkCheckButton adaptpttmute True False True 1 3 5 6 0 0 False False False False True True GtkLabel label27 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 6 7 0 0 False False False False True True GtkCombo adaptfiltmode True False True True False 1 3 6 7 3 3 True False False False True False GtkEntry GtkCombo:entry adaptfiltmodeentry True True True 0 0 GtkCombo adaptloopback True False True True False 0 1 3 4 5 3 3 True False False False True False GtkEntry GtkCombo:entry adaptloopbackentry True True True 0 0 GtkLabel Notebook:tab label18 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkTable table8 6 3 False 0 0 GtkLabel label64 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False False False False True True GtkLabel label28 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 1 2 0 0 False False False False True True GtkLabel label66 GTK_JUSTIFY_CENTER False 0 0.5 5 0 2 3 0 1 0 0 False False False False True True GtkSpinButton adaptsamplerate used only in AUDIO mode True 1 0 False GTK_UPDATE_ALWAYS False False 8000 8000 24000 1000 8000 8000 1 2 0 1 3 3 True False False False True False GtkSpinButton adaptgain True 1 3 False GTK_UPDATE_ALWAYS False False 1 0 100 0.1 1 10 1 3 1 2 3 3 True False False False True False GtkLabel label150 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 3 4 0 0 False False False False True True GtkLabel label149 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 2 3 0 0 False False False False True True GtkCombo adaptaudiodevin False True True True False 1 3 2 3 3 3 True False False False True False GtkEntry GtkCombo:entry adaptaudiodevinentry True True True 64 /dev/dsp GtkCombo adaptaudiodevout False True True True False 1 3 3 4 3 3 True False False False True False GtkEntry GtkCombo:entry adaptaudiodevoutentry True True True 64 /dev/dsp GtkCheckButton adaptaudiosquelch True False True 1 3 5 6 0 0 False False False False True False GtkHScale adaptrfsquelch 150 True True GTK_POS_TOP 1 GTK_UPDATE_CONTINUOUS -120 -120 -35 0 0 0 1 3 4 5 3 3 True False False False True False GtkLabel label152 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 4 5 0 0 False False False False True True GtkLabel label153 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 5 6 0 0 False False False False True True GtkLabel Notebook:tab label148 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkTable table2 5 3 False 0 0 GtkCheckButton chaccfullduplex True False True 1 3 4 5 3 3 False False False False True True GtkLabel label34 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 4 5 0 0 False False False False True True GtkLabel label33 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 3 4 0 0 False False False False True True GtkLabel label32 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 2 3 0 0 False False False False True True GtkLabel label31 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 1 2 0 0 False False False False True True GtkLabel label30 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False False False False True True GtkLabel label35 GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 0 1 0 0 False False False False True True GtkLabel label36 GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 1 2 0 0 False False False False True True GtkLabel label37 GTK_JUSTIFY_CENTER False 0.5 0.5 5 0 2 3 2 3 0 0 False False False False True True GtkSpinButton chaccppersistence True 1 0 False GTK_UPDATE_ALWAYS False False 40 0 255 1 10 10 1 3 3 4 3 3 True False False False True False GtkSpinButton chaccslottime True 1 0 False GTK_UPDATE_ALWAYS False False 100 0 2550 10 100 100 1 2 2 3 3 3 True False False False True False GtkSpinButton chacctxtail True 1 0 False GTK_UPDATE_ALWAYS False False 30 0 2550 10 100 100 1 2 1 2 3 3 True False False False True False GtkSpinButton chacctxdelay True 1 0 False GTK_UPDATE_ALWAYS False False 150 0 2550 10 100 100 1 2 0 1 3 3 True False False False True False GtkLabel Notebook:tab label19 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkTable table3 9 3 False 0 0 GtkCombo ifcfgifname False True False True False bcu0 bcu1 bcu2 bcu3 1 3 0 1 3 3 True False False False True False GtkEntry GtkCombo:entry ifcfgifnameentry True True True 14 bcu0 GtkEntry ifcfghwaddr True True True 9 1 3 1 2 3 3 True False False False True False GtkEntry ifcfgipaddr True True True 15 10.0.0.1 1 3 2 3 3 3 True False False False True False GtkEntry ifcfgnetmask True True True 15 255.255.255.0 1 3 3 4 3 3 True False False False True False GtkEntry ifcfgbroadcast True True True 15 10.0.0.255 1 3 4 5 3 3 True False False False True False GtkLabel label39 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False False False False True True GtkLabel label40 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 1 2 0 0 False False False False True True GtkLabel label41 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 2 3 0 0 False False False False True True GtkLabel label42 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 3 4 0 0 False False False False True True GtkLabel label43 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 4 5 0 0 False False False False True True GtkLabel label137 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 5 6 0 0 False False False False True True GtkLabel label138 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 6 7 0 0 False False False False True True GtkLabel label139 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 7 8 0 0 False False False False True True GtkLabel label140 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 8 9 0 0 False False False False True True GtkEntry ifcfggwhwaddr True True True 80 1 3 5 6 3 3 True False False False True False GtkEntry ifcfggwipaddr True True True 15 1 3 6 7 3 3 True False False False True False GtkEntry ifcfggwnetmask True True True 15 1 3 7 8 3 3 True False False False True False GtkCombo ifcfggwipmode True False False True False Default Virtual Circuit Datagram Compressed 1 3 8 9 3 3 True False False False True False GtkEntry GtkCombo:entry ifcfggwipmodeentry True True True 0 Default GtkLabel Notebook:tab label20 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkTable table5 8 6 False 0 0 GtkLabel label53 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 7 8 0 0 False False False False True True GtkLabel label52 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 6 7 0 0 False False False False True True GtkLabel label51 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 5 6 0 0 False False False False True True GtkLabel label50 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 4 5 0 0 False False False False True True GtkLabel label49 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 3 4 0 0 False False False False True True GtkLabel label48 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 2 3 0 0 False False False False True True GtkLabel label47 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 1 2 0 0 False False False False True True GtkLabel label46 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False False False False True True GtkRadioButton mdisc4l True False True mdisc4 2 3 4 5 5 0 False False False False True True GtkRadioButton mdisc5l True False True mdisc5 2 3 5 6 5 0 False False False False True True GtkRadioButton mdisc6l True False True mdisc6 2 3 6 7 5 0 False False False False True True GtkRadioButton mdisc7l True False True mdisc7 2 3 7 8 5 0 False False False False True True GtkRadioButton mdisc3l True False True mdisc3 2 3 3 4 5 0 False False False False True True GtkRadioButton mdisc1l True False True mdisc1 2 3 2 3 5 0 False False False False True True GtkRadioButton mdisc2l True False True mdisc2 2 3 1 2 5 0 False False False False True True GtkRadioButton mdisc0l True False True mdisc0 2 3 0 1 5 0 False False False False True True GtkRadioButton mdisc0h True False True mdisc0 3 4 0 1 5 0 False False False False True True GtkRadioButton mdisc2h True False True mdisc2 3 4 1 2 5 0 False False False False True True GtkRadioButton mdisc1h True False True mdisc1 3 4 2 3 5 0 False False False False True True GtkRadioButton mdisc3h True False True mdisc3 3 4 3 4 5 0 False False False False True True GtkRadioButton mdisc4h True False True mdisc4 3 4 4 5 5 0 False False False False True True GtkRadioButton mdisc5h True False True mdisc5 3 4 5 6 5 0 False False False False True True GtkRadioButton mdisc6h True False True mdisc6 3 4 6 7 5 0 False False False False True True GtkRadioButton mdisc7h True False True mdisc7 3 4 7 8 5 0 False False False False True True GtkRadioButton mdisc0t True True True mdisc0 4 5 0 1 5 0 False False False False True True GtkRadioButton mdisc2t True True True mdisc2 4 5 1 2 5 0 False False False False True True GtkRadioButton mdisc1t True True True mdisc1 4 5 2 3 5 0 False False False False True True GtkRadioButton mdisc3t True True True mdisc3 4 5 3 4 5 0 False False False False True True GtkRadioButton mdisc4t True True True mdisc4 4 5 4 5 5 0 False False False False True True GtkRadioButton mdisc5t True True True mdisc5 4 5 5 6 5 0 False False False False True True GtkRadioButton mdisc6t True True True mdisc6 4 5 6 7 5 0 False False False False True True GtkRadioButton mdisc7t True True True mdisc7 4 5 7 8 5 0 False False False False True True GtkLabel label55 GTK_JUSTIFY_CENTER False 0 0.5 5 0 1 2 0 1 0 0 True False False False True True GtkLabel label54 GTK_JUSTIFY_CENTER False 0 0.5 5 0 1 2 1 2 0 0 True False False False True True GtkLabel label56 GTK_JUSTIFY_CENTER False 0 0.5 5 0 1 2 2 3 0 0 True False False False True True GtkLabel label57 GTK_JUSTIFY_CENTER False 0 0.5 5 0 1 2 3 4 0 0 True False False False True True GtkLabel label58 GTK_JUSTIFY_CENTER False 0 0.5 5 0 1 2 4 5 0 0 True False False False True True GtkLabel label59 GTK_JUSTIFY_CENTER False 0 0.5 5 0 1 2 5 6 0 0 True False False False True True GtkLabel label60 GTK_JUSTIFY_CENTER False 0 0.5 5 0 1 2 6 7 0 0 True False False False True True GtkLabel label61 GTK_JUSTIFY_CENTER False 0 0.5 5 0 1 2 7 8 0 0 True False False False True True GtkCombo mdisctxd True False True True False Normal TxData 5 6 3 4 0 0 False False False False True False GtkEntry GtkCombo:entry mdisctxdentry 60 selects the output signal if the internal FSK mode is used True True True 0 Normal GtkCombo mdiscrxc True False True True False Normal TxData 5 6 0 1 0 0 False False False False True False GtkEntry GtkCombo:entry mdiscrxcentry 60 selects the output signal if the internal FSK mode is used True True True 0 Normal GtkCombo mdisctxc True False True True False Normal TxData 5 6 1 2 0 0 False False False False True False GtkEntry GtkCombo:entry mdisctxcentry 60 selects the output signal if the internal FSK mode is used True True True 0 Normal GtkLabel Notebook:tab label21 GTK_JUSTIFY_CENTER False 0.5 0.5 0 0 GtkHButtonBox hbuttonbox8 GTK_BUTTONBOX_SPREAD 30 85 27 7 0 0 False False GtkButton configok True True clicked on_configwindowok_clicked Sun, 24 Sep 2000 01:59:42 GMT GtkButton configcancel True True clicked on_configwindowcancel_clicked Sun, 24 Sep 2000 01:59:52 GMT GtkWindow dtmfwindow GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK key_press_event on_dtmfwindow_key_event Thu, 15 Jul 1999 12:21:28 GMT key_release_event on_dtmfwindow_key_event Thu, 15 Jul 1999 12:21:38 GMT delete_event on_dtmfwindow_delete_event Wed, 14 Jul 1999 17:49:02 GMT DTMF Keypad GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkVBox vbox4 False 0 GtkFrame frame4 5 0.01 GTK_SHADOW_ETCHED_IN 0 False True GtkHBox hbox2 False 0 GtkEntry dtmfentry True False True 0 0 True True GtkButton buttoncleardtmf 50 True clicked on_dtmfclear_clicked Wed, 14 Jul 1999 18:16:39 GMT 0 False False GtkFrame frame5 5 0.01 GTK_SHADOW_ETCHED_IN 0 True True GtkTable table4 4 4 False 0 0 GtkButton dtmf8 True pressed on_dtmf_key (gpointer)0x18 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x08 Wed, 14 Jul 1999 13:32:14 GMT 1 2 0 1 0 0 True True False False True True GtkButton dtmf9 True pressed on_dtmf_key (gpointer)0x19 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x09 Wed, 14 Jul 1999 13:32:14 GMT 2 3 0 1 0 0 True True False False True True GtkButton dtmfa True pressed on_dtmf_key (gpointer)0x1a Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x0a Wed, 14 Jul 1999 13:32:14 GMT 3 4 0 1 0 0 True True False False True True GtkButton dtmf4 True pressed on_dtmf_key (gpointer)0x14 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x04 Wed, 14 Jul 1999 13:32:14 GMT 0 1 1 2 0 0 True True False False True True GtkButton dtmf5 True pressed on_dtmf_key (gpointer)0x15 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x05 Wed, 14 Jul 1999 13:32:14 GMT 1 2 1 2 0 0 True True False False True True GtkButton dtmf6 True pressed on_dtmf_key (gpointer)0x16 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x06 Wed, 14 Jul 1999 13:32:14 GMT 2 3 1 2 0 0 True True False False True True GtkButton dtmfb True pressed on_dtmf_key (gpointer)0x1b Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x0b Wed, 14 Jul 1999 13:32:14 GMT 3 4 1 2 0 0 True True False False True True GtkButton dtmf1 True pressed on_dtmf_key (gpointer)0x11 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x01 Wed, 14 Jul 1999 13:32:14 GMT 0 1 2 3 0 0 True True False False True True GtkButton dtmf2 True pressed on_dtmf_key (gpointer)0x12 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x02 Wed, 14 Jul 1999 13:32:14 GMT 1 2 2 3 0 0 True True False False True True GtkButton dtmf3 True pressed on_dtmf_key (gpointer)0x13 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x03 Wed, 14 Jul 1999 13:32:14 GMT 2 3 2 3 0 0 True True False False True True GtkButton dtmfc True pressed on_dtmf_key (gpointer)0x1c Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x0c Wed, 14 Jul 1999 13:32:14 GMT 3 4 2 3 0 0 True True False False True True GtkButton dtmfe True pressed on_dtmf_key (gpointer)0x1e Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x0e Wed, 14 Jul 1999 13:32:14 GMT 0 1 3 4 0 0 True True False False True True GtkButton dtmf0 True pressed on_dtmf_key (gpointer)0x10 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x00 Wed, 14 Jul 1999 13:32:14 GMT 1 2 3 4 0 0 True True False False True True GtkButton dtmff True pressed on_dtmf_key (gpointer)0x1f Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x0f Wed, 14 Jul 1999 13:32:14 GMT 2 3 3 4 0 0 True True False False True True GtkButton dtmfd True pressed on_dtmf_key (gpointer)0x1d Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x0d Wed, 14 Jul 1999 13:32:14 GMT 3 4 3 4 0 0 True True False False True True GtkButton dtmf7 True pressed on_dtmf_key (gpointer)0x17 Wed, 14 Jul 1999 13:32:19 GMT released on_dtmf_key (gpointer)0x07 Wed, 14 Jul 1999 13:32:14 GMT 0 1 0 1 0 0 True True False False True True GtkWindow spkscopewindow delete_event on_spkscopewindow_delete_event Wed, 14 Jul 1999 17:49:17 GMT Baycom USB Speaker Scope GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb Custom scope 512 256 scope_new 128 0 Wed, 14 Jul 1999 18:01:10 GMT GtkWindow spkspectrumwindow delete_event on_spkspectrumwindow_delete_event Wed, 14 Jul 1999 17:49:32 GMT Baycom USB Speaker Spectrum GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb Custom spec 512 256 spectrum_new 256 0 Wed, 14 Jul 1999 18:01:21 GMT GtkWindow micscopewindow delete_event on_micscopewindow_delete_event Wed, 14 Jul 1999 17:49:17 GMT Baycom USB Microphone Scope GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb Custom scope 512 256 scope_new 128 0 Wed, 14 Jul 1999 18:01:10 GMT GtkWindow micspectrumwindow delete_event on_micspectrumwindow_delete_event Wed, 14 Jul 1999 17:49:32 GMT Baycom USB Microphone Spectrum GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb Custom spec 512 256 spectrum_new 256 0 Wed, 14 Jul 1999 18:01:21 GMT GtkWindow paramwindow delete_event on_paramwindow_delete_event Mon, 16 Jul 2001 21:56:34 GMT Baycom USB Adapter Parameters GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkVBox vbox10 False 0 GtkTable table9 1 3 False 0 0 0 True True GtkCheckButton paramenablepttpkt True False True 1 3 0 1 0 0 True False False False True False GtkLabel label151 GTK_JUSTIFY_CENTER False 0 0.5 5 0 0 1 0 1 0 0 False False False False True True GtkHButtonBox hbuttonbox9 GTK_BUTTONBOX_SPREAD 30 85 27 7 0 0 False True GtkButton paramok True True clicked on_paramwindowok_clicked Mon, 16 Jul 2001 21:30:38 GMT GtkButton paramcancel True True clicked on_paramwindowcancel_clicked Mon, 16 Jul 2001 21:30:47 GMT GtkWindow audiopwrwindow delete_event on_audiopwrwindow_delete_event Wed, 18 Jul 2001 14:28:29 GMT Baycom USB Audio Power Meters GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False True False baycomusb baycomusb GtkHBox hbox5 False 0 GtkFrame frame7 0 GTK_SHADOW_ETCHED_IN 0 True True GtkHBox hbox6 False 0 GtkFrame frame9 0.5 GTK_SHADOW_ETCHED_IN 0 True True GtkProgressBar audiomicsig -40 -40 0 GTK_PROGRESS_CONTINUOUS GTK_PROGRESS_BOTTOM_TO_TOP False False %P %% 0.5 0.5 GtkFrame frame8 0 GTK_SHADOW_ETCHED_IN 0 True True GtkHBox hbox7 False 0 GtkFrame frame10 0.5 GTK_SHADOW_ETCHED_IN 0 True True GtkProgressBar audiospksig -40 -40 0 GTK_PROGRESS_CONTINUOUS GTK_PROGRESS_BOTTOM_TO_TOP False False %P %% 0.5 0.5 GtkFrame frame11 0.5 GTK_SHADOW_ETCHED_IN 0 True True GtkProgressBar audiospknoise -40 -40 0 GTK_PROGRESS_CONTINUOUS GTK_PROGRESS_BOTTOM_TO_TOP False False %P %% 0.5 0.5 baycomusb-0.10.orig/trxapp/option1.png0100644000175100017510000000063507325134424016035 0ustar abaaba‰PNG  IHDR 2ϽgAMA† 1è–_TIDATx-»NA†ÿÙ &»Ä ]c¢±3ÆŠÆ·°ÑÇð1¬,h}"¡26j¢6³‰¥,A@¹,ò3ë xŠ©¾óÏw~ ÿS.—k¶mW àiš‚1Æ“$iAp¦M=¾ï·$TP1’É,N`f]ˆT„Í÷"UIŽãº®‹£ÝM¬ç-x¶€ƒ âA-ãåÖVWŽi©TªjšFt]½Å×k¶!£1˜©LŸÅàÆÒ–®œ0`úƒ›«sXÉ/ Y™kЧ†\hrƒêÊ‹K§a¯¶9Z@ˆK€çfœ€¨ë”xﻃn'Ä ßA qqy Ó¤KÛ åœzžwbÙζWN„3PyùóÓ'"&ðØ_FÖÖëózöü–©“‚+ºØpòÙER0ö`™4¼{x+ÎAÕåÁ¾_3tZI‰ c #414141", ", c #6A6057", "' c #6A5947", ") c #5D4730", "! c #4B331B", "~ c #35200A", "{ c #302D29", "] c #2F2C29", "^ c #FFFFFF", "/ c #9A7C5E", "( c #835F3B", "_ c #704A23", ": c #583410", "< c #402B16", "[ c #34302C", "} c #A1784F", "| c #9B6A39", "1 c #8D5924", "2 c #744312", "3 c #5D350E", "4 c #333231", "5 c #A56A2F", "6 c #9B6022", "7 c #8A4F14", "8 c #6F4011", "9 c #FFC55F", "0 c #905517", "a c #64401B", "b c #3C352E", "c c #864D15", "d c #3F352C", "e c #483D31", "f c #463B2F", " .+@#$. ", " $#%&*=-; ", ".#>,')!~{]", "+%,^/(_:<[", "@&'/}|1234", "#*)(|56784", "$=!_1690ab", ".-~:270cde", " ;{<38adf ", " ][44be "}; baycomusb-0.10.orig/trxapp/option2.png0100644000175100017510000000066107325134424016035 0ustar abaaba‰PNG  IHDR 2ϽgAMA† 1è–_hIDATx-»JQ†¿³g7îæ¢Yc¢Á  ŠZˆ …6B íÄÆ'ð |ßÀÎÚÖÆJˆH:–‚HDÄK"DÑ$h4’³ÇMpŠ>þùçü×éB,gŽØY7žçQ­¶•ß¹­nõÑo'K‰Ê\Ò™ˆ5ŽÑA4ù®y|†C<5õÛîõGRœ-Ærétxsjmg{ѽƒ‡"ªPã·Ðá5ìRosn:Q;w|¥äü!ºucÌÑ«Kê¦ÁnÖ¤mu½;tÛ‡Ä=Ddb‚3ŠPÐ’¦ÄCT›ð\„XÂ>$¾Áö÷)1 ²Æ×gKµëúªe¨ûp³ßG[^×BZJɽ„½šužº‡Ð]èùªï(ij—QL×¼Äs¹¯¤bÂjȨÁI¯mñUö‘o™ãrrö³¼ÝHä ÇÌÚ¾ñþ¬ ¥œ1™O½ ÿ¥d„ƒ&Õ×tIEND®B`‚baycomusb-0.10.orig/trxapp/option2.xpm0100644000175100017510000000273307325134424016057 0ustar abaaba/* XPM */ static char * option2_xpm[] = { "10 10 87 1", " c None", ". c #AF2B13", "+ c #B33A1B", "@ c #C44721", "# c #C2451F", "$ c #AF3216", "% c #AA3016", "& c #D0491F", "* c #E5531E", "= c #EE5517", "- c #ED400D", "; c #DF2E0B", "> c #CB3A16", ", c #AA3015", "' c #B52C13", ") c #D54C1F", "! c #F3863A", "~ c #FCD56F", "{ c #FDD047", "] c #FDAC1E", "^ c #FA710C", "/ c #EF3605", "( c #D34216", "_ c #C23A16", ": c #BE3C1B", "< c #EA551E", "[ c #FCD76F", "} c #FFFFFF", "| c #FEF680", "1 c #FEE42E", "2 c #FEBE11", "3 c #FC7607", "4 c #EF4909", "5 c #C7421A", "6 c #D04C21", "7 c #F25A17", "8 c #FDD347", "9 c #FEF780", "0 c #FEF75A", "a c #FEF12B", "b c #FEDF12", "c c #FDA807", "d c #F96C06", "e c #D24C1F", "f c #D34C1F", "g c #F3470D", "h c #FDB31E", "i c #FEE62E", "j c #FEF22B", "k c #FEF21D", "l c #FEE710", "m c #FEC408", "n c #FB8B07", "o c #D54E1F", "p c #C43816", "q c #EB360B", "r c #FC7B0C", "s c #FEC411", "t c #FEE112", "u c #FEE810", "v c #FFFE83", "w c #FDC90A", "x c #F9860C", "y c #D8531C", "z c #C63213", "A c #DE4216", "B c #F63E05", "C c #FD8007", "D c #FEAF07", "E c #FEC708", "F c #FECB0A", "G c #FDAC09", "H c #E95D1A", "I c #E4691F", "J c #C43615", "K c #E44C16", "L c #F55309", "M c #FB7406", "N c #FC9007", "O c #FA880C", "P c #EB5F1A", "Q c #DF5F1D", "R c #D54016", "S c #D7491A", "T c #DF531F", "U c #DE551C", "V c #E7691F", " .+@#$. ", " %&*=-;>, ", "')!~{]^/(_", ":<[}|12345", "67890abcde", "fghijklmno", "pqrstuvwxy", "zABCDEFGHI", " JKLMNOPQ ", " RSTTUV "}; baycomusb-0.10.orig/trxapp/src/0042755000175100017510000000000007340500013014512 5ustar abaababaycomusb-0.10.orig/trxapp/src/Makefile.in0100644000175100017510000002377607340500013016571 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ INCLUDES = -I$(top_srcdir)/intl @ORBIT_CFLAGS@ @GTK_CFLAGS@ @XMLCFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/trxapp -I$(top_srcdir)/trxapi @WIN32_TRUE@MWINDOWS = -mwindows @WIN32_FALSE@MWINDOWS = @WIN32_TRUE@RCOBJ = trxapp.res @WIN32_FALSE@RCOBJ = @WIN32_TRUE@DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32 @WIN32_FALSE@DIRECTXLIBS = bin_PROGRAMS = baycomusbtrx baycomusbtrx_SOURCES = trxapp.h main.c support.c support.h interface.c interface.h callbacks.h freqdb.c signalhist.h signalhist.c widgets.h widgets.c baycomusbtrx_LDADD = @INTLLIBS@ @GTK_LIBS@ ../../flexdrv/libtrxapi.a ../../misc/libmisc.a @ORBIT_LIBS@ @XMLLIBS@ $(RCOBJ) $(DIRECTXLIBS) baycomusbtrx_LDFLAGS = $(MWINDOWS) # $(INTLLIBS) EXTRA_DIST = trxapp.rc mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../config.h CONFIG_CLEAN_FILES = bin_PROGRAMS = baycomusbtrx$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I../.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ baycomusbtrx_OBJECTS = main.$(OBJEXT) support.$(OBJEXT) \ interface.$(OBJEXT) freqdb.$(OBJEXT) signalhist.$(OBJEXT) \ widgets.$(OBJEXT) @WIN32_TRUE@baycomusbtrx_DEPENDENCIES = ../../flexdrv/libtrxapi.a \ @WIN32_TRUE@../../misc/libmisc.a trxapp.res @WIN32_FALSE@baycomusbtrx_DEPENDENCIES = ../../flexdrv/libtrxapi.a \ @WIN32_FALSE@../../misc/libmisc.a CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(baycomusbtrx_SOURCES) OBJECTS = $(baycomusbtrx_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps trxapp/src/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 $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: baycomusbtrx$(EXEEXT): $(baycomusbtrx_OBJECTS) $(baycomusbtrx_DEPENDENCIES) @rm -f baycomusbtrx$(EXEEXT) $(LINK) $(baycomusbtrx_LDFLAGS) $(baycomusbtrx_OBJECTS) $(baycomusbtrx_LDADD) $(LIBS) 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = trxapp/src 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 interface.o: interface.c ../../config.h callbacks.h interface.h \ support.h main.o: main.c ../../config.h interface.h support.h signalhist.h \ callbacks.h trxapp.h ../../trxapi/trxapi.h ../../misc/sysdeps.h \ widgets.h ../../trxapp/option1.xpm ../../trxapp/option2.xpm support.o: support.c ../../config.h support.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-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: uninstall-am all-am: Makefile $(PROGRAMS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) 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-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 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 @WIN32_TRUE@trxapp.res: trxapp.rc @WIN32_TRUE@ $(WINDRES) $< -O coff -o $@ # 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: baycomusb-0.10.orig/trxapp/src/Makefile.am0100644000175100017510000000154107331022664016555 0ustar abaaba## Process this file with automake to produce Makefile.in INCLUDES = \ -I$(top_srcdir)/intl \ @ORBIT_CFLAGS@ @GTK_CFLAGS@ @XMLCFLAGS@ \ -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/trxapp -I$(top_srcdir)/trxapi if WIN32 MWINDOWS = -mwindows RCOBJ = trxapp.res DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32 else MWINDOWS = RCOBJ = DIRECTXLIBS = endif bin_PROGRAMS = baycomusbtrx baycomusbtrx_SOURCES = \ trxapp.h main.c \ support.c support.h \ interface.c interface.h \ callbacks.h freqdb.c \ signalhist.h signalhist.c \ widgets.h widgets.c baycomusbtrx_LDADD = @INTLLIBS@ @GTK_LIBS@ ../../flexdrv/libtrxapi.a ../../misc/libmisc.a @ORBIT_LIBS@ @XMLLIBS@ \ $(RCOBJ) $(DIRECTXLIBS) baycomusbtrx_LDFLAGS = $(MWINDOWS) if WIN32 trxapp.res: trxapp.rc $(WINDRES) $< -O coff -o $@ endif # $(INTLLIBS) EXTRA_DIST = trxapp.rc baycomusb-0.10.orig/trxapp/src/trxapp.h0100644000175100017510000000370407331020574016211 0ustar abaaba/*****************************************************************************/ /* * trxapp.h -- Trx Application Header File. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /*****************************************************************************/ #ifndef _TRXAPP_H #define _TRXAPP_H /* ---------------------------------------------------------------------- */ #define _GNU_SOURCE #define _REENTRANT #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "trxapi.h" /* ---------------------------------------------------------------------- */ #define MAXSTNNAME 64 struct stndb_entry { char name[MAXSTNNAME]; trxapi_frequency_t rx; trxapi_frequency_t tx; int mode; /* trxapi_baycomusb_mode_t or -1 */ unsigned long bitraterx, bitratetx; }; extern void stndb_open(void); extern void stndb_close(void); extern int stndb_delete(const char *name); extern int stndb_write(const struct stndb_entry *entry); extern int stndb_retrieve(struct stndb_entry *entry); extern GList *stndb_list(GList *list); extern void stndb_clist(GtkCList *clist); /* ---------------------------------------------------------------------- */ #endif /* _TRXAPP_H */ baycomusb-0.10.orig/trxapp/src/main.c0100644000175100017510000017642107340466427015634 0ustar abaaba/*****************************************************************************/ /* * main.c -- Trx Control Application. * * Copyright (C) 2000-2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "interface.h" #include "support.h" #include "signalhist.h" #include "callbacks.h" #ifndef WIN32 #include #include #endif #include #include #include #include #ifdef HAVE_GETOPT_H #include #else #include "getopt.h" #endif #include "trxapp.h" #include "trxapi.h" #include "widgets.h" /* ---------------------------------------------------------------------- */ #include "option1.xpm" #include "option2.xpm" /* ---------------------------------------------------------------------- */ static GtkWidget *mainwindow, *terminalwindow, *chmemorywindow, *chprogwindow, *freqlistwindow, *newstnwindow; static GtkWidget *modemselectwindow, *configwindow, *dtmfwindow, *spkscopewindow, *spkspectrumwindow; static GtkWidget *micscopewindow, *micspectrumwindow, *paramwindow, *audiopwrwindow; static unsigned int ledstatus = 0; static struct { struct trxapi *trx; const struct trxapi_description *desc; trxapi_mode_t mode; float rssimul; } trx = { NULL, NULL, trxapi_mode_unspec }; static struct { trxapi_frequency_t rx, tx; guint fchginhibit; } freq = { 0, 0, 0 }; static struct { int sel; int del; } freql = { -1, -1 }; static int selectmodem_sel = -1; static unsigned int notebook_pagemask = 0; static unsigned long rxuartptr = 0; static unsigned int pttmask = 0; #define PTTMASK_MANUAL 1 #define PTTMASK_1750 2 #define PTTMASK_DTMF 4 static struct { unsigned char enaptt; } params = { 0 }; static struct { unsigned int lptr; unsigned char rxline[256]; } uartline = { 0, }; static struct { int rx, tx; } chmem[10]; /* ---------------------------------------------------------------------- */ static void updatechmemwindow(void); /* ---------------------------------------------------------------------- */ static void paramstodialog(void) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(paramwindow), "paramenablepttpkt")), params.enaptt); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonptt")), trx.mode == trxapi_mode_audio || (trx.mode == trxapi_mode_packet && params.enaptt)); } static void trxnewmode(trxapi_mode_t newmode) { if (trx.mode != newmode) { gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "audio")), newmode == trxapi_mode_audio); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonptt")), newmode == trxapi_mode_audio || (newmode == trxapi_mode_packet && params.enaptt)); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "button1750")), newmode == trxapi_mode_audio); } trx.mode = newmode; } static void updatepttmask(void) { if (trx.trx == NULL) return; if (trxapi_set_ptt(trx.trx, !!pttmask)) lprintf(1, "trxapi_set_ptt error\n"); } static void closetrx(void) { if (trx.trx) trxapi_close(trx.trx); trx.trx = NULL; trx.desc = NULL; gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "modemconfig")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "audio")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "expert")), FALSE); trxnewmode(trxapi_mode_unspec); pttmask = 0; updatepttmask(); } static void newtrx(struct trxapi *api, const struct trxapi_description *desc) { const struct trxapi_baycomusb_adapter_audio_devs *audiodevs; float f; unsigned int i; char buf[1024]; GtkSpinButton *rxqrg, *txqrg; trxapi_frequency_t fmin, fmax, fstep; closetrx(); trx.trx = api; trx.desc = desc; /* set RSSI limits */ f = desc->rssimax - desc->rssimin; if (f < 0.0001) trx.rssimul = 0; else trx.rssimul = 255.0 / f; gtk_progress_configure(GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(mainwindow), "rssi")), desc->rssimin, desc->rssimin, desc->rssimax); /* set rxuart pointer to current value */ rxuartptr = 0; trxapi_uart_receive(trx.trx, &rxuartptr, buf, sizeof(buf)); /* clear UART received line */ uartline.lptr = 0; /* clear T7F memory */ for (i = 0; i < 10; i++) chmem[i].rx = chmem[i].tx = -1; updatechmemwindow(); /* cause T7F to transmit channel memory */ if (trxapi_uart_send(trx.trx, "\rE\r")) lprintf(1, "trxapi_uart_send error\n"); /* set frequency limits */ rxqrg = GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "rxqrg")); txqrg = GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "txqrg")); fmin = ~0ULL; fmax = 0ULL; fstep = 1000000ULL; for (i = 0; i < desc->nrrxbands; i++) { if (desc->rxbands[i].low < fmin) fmin = desc->rxbands[i].low; if (desc->rxbands[i].high > fmax) fmax = desc->rxbands[i].high; if (fstep > desc->rxbands[i].step) fstep = desc->rxbands[i].step; } gtk_spin_button_set_adjustment(rxqrg, GTK_ADJUSTMENT(gtk_adjustment_new(fmin * (1.0 / 1000000.0), fmin * (1.0 / 1000000.0), fmax * (1.0 / 1000000.0), fstep * (1.0 / 1000000.0), 1, 1))); fmin = ~0ULL; fmax = 0ULL; fstep = 1000000ULL; for (i = 0; i < desc->nrtxbands; i++) { if (desc->txbands[i].low < fmin) fmin = desc->txbands[i].low; if (desc->txbands[i].high > fmax) fmax = desc->txbands[i].high; if (fstep > desc->txbands[i].step) fstep = desc->txbands[i].step; } gtk_spin_button_set_adjustment(txqrg, GTK_ADJUSTMENT(gtk_adjustment_new(fmin * (1.0 / 1000000.0), fmin * (1.0 / 1000000.0), fmax * (1.0 / 1000000.0), fstep * (1.0 / 1000000.0), 1, 1))); gtk_widget_set_sensitive(GTK_WIDGET(rxqrg), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(txqrg), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "stnname")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "modemconfig")), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "expert")), TRUE); freq.rx = freq.tx = 0; paramstodialog(); pttmask = 0; updatepttmask(); /* Update dialog with list of audio devices */ audiodevs = trxapi_baycomusb_adapter_get_audiodevices(trx.trx); if (audiodevs) { GList *list; list = NULL; for (i = 0; i < audiodevs->nraudiodevsin; i++) list = g_list_append(list, audiodevs->audiodevsin[i]); if (list) { gtk_combo_set_popdown_strings(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptaudiodevin")), list); g_list_free(list); } list = NULL; for (i = 0; i < audiodevs->nraudiodevsout; i++) list = g_list_append(list, audiodevs->audiodevsout[i]); if (list) { gtk_combo_set_popdown_strings(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptaudiodevout")), list); g_list_free(list); } } } static void trxopenbyindex(unsigned int index) { struct trxapi *api; const struct trxapi_description *desc; if (!(api = trxapi_open_byindex(index))) return; if (!(desc = trxapi_get_description(api))) { trxapi_close(api); return; } newtrx(api, desc); } static void trxopenbymfgmodelserial(const char *mfg, const char *model, const char *serial) { struct trxapi *api; const struct trxapi_description *desc; unsigned int i; for (i = 0; ; i++) { if (!(api = trxapi_open_byindex(i))) return; if (!(desc = trxapi_get_description(api))) { trxapi_close(api); continue; } if (!strcmp(desc->manufacturer, mfg) && !strcmp(desc->model, model) && !strcmp(desc->instid, serial)) { newtrx(api, desc); return; } trxapi_close(api); } } /* ---------------------------------------------------------------------- */ static void setled(GtkPixmap *pixmap, int on) { GdkColormap *colormap; GdkPixmap *gdkpixmap; GdkBitmap *mask; colormap = gtk_widget_get_colormap(mainwindow); gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL, colormap, &mask, NULL, on ? option2_xpm : option1_xpm); gtk_pixmap_set(pixmap, gdkpixmap, mask); gdk_pixmap_unref(gdkpixmap); gdk_bitmap_unref(mask); } GtkWidget* create_led_pixmap(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) { GtkWidget *pixmap, *wnd; GdkColormap *colormap; GdkPixmap *gdkpixmap; GdkBitmap *mask; wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_ref(wnd); colormap = gtk_widget_get_colormap(wnd); gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL, colormap, &mask, NULL, option1_xpm); pixmap = gtk_pixmap_new(gdkpixmap, mask); gdk_pixmap_unref(gdkpixmap); gdk_bitmap_unref(mask); gtk_widget_unref(wnd); return pixmap; } /* ---------------------------------------------------------------------- */ static void updatechmemwindow(void) { char buf[8] = "ch0a"; char buf2[32]; unsigned int i; for (i = 0; i < 10; i++) { buf[2] = '0'+i; buf[3] = 'a'; if (chmem[i].rx == -1) snprintf(buf2, sizeof(buf2), "-"); else snprintf(buf2, sizeof(buf2), "%8.4fMHz", 430+chmem[i].rx * 0.0125); gtk_label_set_text(GTK_LABEL(gtk_object_get_data(GTK_OBJECT(chmemorywindow), buf)), buf2); buf[3] = 'b'; if (chmem[i].tx == -1) snprintf(buf2, sizeof(buf2), "-"); else snprintf(buf2, sizeof(buf2), "%8.4fMHz", 430+chmem[i].tx * 0.0125); gtk_label_set_text(GTK_LABEL(gtk_object_get_data(GTK_OBJECT(chmemorywindow), buf)), buf2); buf[3] = 'c'; if (chmem[i].rx == -1) snprintf(buf2, sizeof(buf2), "-"); else snprintf(buf2, sizeof(buf2), "%8.4fMHz", 430+chmem[i].rx * 0.025); gtk_label_set_text(GTK_LABEL(gtk_object_get_data(GTK_OBJECT(chmemorywindow), buf)), buf2); buf[3] = 'd'; if (chmem[i].tx == -1) snprintf(buf2, sizeof(buf2), "-"); else snprintf(buf2, sizeof(buf2), "%8.4fMHz", 430+chmem[i].tx * 0.025); gtk_label_set_text(GTK_LABEL(gtk_object_get_data(GTK_OBJECT(chmemorywindow), buf)), buf2); } } static void setstns(void) { GList *list = NULL; list = g_list_append(list, "-"); list = stndb_list(list); gtk_combo_set_popdown_strings(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(mainwindow), "stnname")), list); g_list_free(list); stndb_clist(GTK_CLIST(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "freqlist"))); } /* ---------------------------------------------------------------------- */ static void processuart(char *str) { static int chparse = -1; unsigned int tx, rx; printf("Processuart: \"%s\"\n", str); if (!strcmp(str, "E")) { chparse = 0; return; } if (chparse >= 0 && sscanf(str, " %x %x", &tx, &rx) == 2) { chmem[chparse].rx = rx; chmem[chparse].tx = tx; chparse++; if (chparse > 9) chparse = -1; updatechmemwindow(); return; } chparse = -1; } /* ---------------------------------------------------------------------- */ static void on_aboutok_clicked(GtkButton *button, gpointer user_data) { gtk_widget_hide(GTK_WIDGET(user_data)); gtk_widget_destroy(GTK_WIDGET(user_data)); } void on_about_activate(GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *dlg = create_aboutwindow(); gtk_signal_connect(GTK_OBJECT(gtk_object_get_data(GTK_OBJECT(dlg), "aboutok")), "clicked", GTK_SIGNAL_FUNC(on_aboutok_clicked), dlg); gtk_widget_show(dlg); } static void on_errorok_clicked(GtkButton *button, gpointer user_data) { gtk_widget_hide(GTK_WIDGET(user_data)); gtk_widget_destroy(GTK_WIDGET(user_data)); } void error_dialog(const gchar *text) { GtkWidget *dlg = create_errordialog(); gtk_signal_connect(GTK_OBJECT(gtk_object_get_data(GTK_OBJECT(dlg), "errorok")), "clicked", GTK_SIGNAL_FUNC(on_errorok_clicked), dlg); gtk_label_set_text(GTK_LABEL(gtk_object_get_data(GTK_OBJECT(dlg), "errorlabel")), text); gtk_widget_show(dlg); } gboolean on_mainwindow_destroy_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_main_quit(); return TRUE; } gboolean on_mainwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_main_quit(); return FALSE; } void on_quit_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_main_quit(); } void on_terminal_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(terminalwindow); } gboolean on_terminalwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(terminalwindow); return TRUE; } void on_buttonptt_toggled(GtkToggleButton *togglebutton, gpointer user_data) { if (trx.trx == NULL) return; if (gtk_toggle_button_get_active(togglebutton)) pttmask |= PTTMASK_MANUAL; else pttmask &= ~PTTMASK_MANUAL; updatepttmask(); } void on_button1750_pressed(GtkButton *button, gpointer user_data) { if (trx.trx == NULL) return; pttmask |= PTTMASK_1750; updatepttmask(); if (trx.mode == trxapi_mode_audio) { if (trxapi_set_audio_dtmf(trx.trx, 16)) lprintf(1, "trxapi_set_audio_dtmf error\n"); } } void on_button1750_released(GtkButton *button, gpointer user_data) { if (trx.trx == NULL) return; pttmask &= ~PTTMASK_1750; updatepttmask(); if (trx.mode == trxapi_mode_audio) { if (trxapi_set_audio_dtmf(trx.trx, -1)) lprintf(1, "trxapi_set_audio_dtmf error\n"); } } gboolean on_text_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { GtkText *txt; char c = event->keyval; char buf[2]; buf[0] = c; buf[1] = 0; printf("on_text_keypress_event: 0x%x %c state %u\n", event->keyval, (c >= ' ' && c <= 0x7f) ? c : '.', event->state); if (trx.trx == NULL) return FALSE; txt = GTK_TEXT(gtk_object_get_data(GTK_OBJECT(terminalwindow), "text")); if (event->keyval == GDK_Return) { buf[0] = '\r'; c = '\n'; if (!trxapi_uart_send(trx.trx, buf)) gtk_text_insert(txt, NULL, &(GTK_WIDGET(txt)->style->fg[GTK_WIDGET_STATE(GTK_WIDGET(txt))]), NULL, &c, 1); return TRUE; } if (event->keyval >= 32 && event->keyval < 128) { if (!trxapi_uart_send(trx.trx, buf)) gtk_text_insert(txt, NULL, &(GTK_WIDGET(txt)->style->fg[GTK_WIDGET_STATE(GTK_WIDGET(txt))]), NULL, &c, 1); return TRUE; } return FALSE; } gboolean on_text_key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { char c = event->keyval; printf("on_text_keyrelease_event: 0x%x %c state %u\n", event->keyval, (c >= ' ' && c <= 0x7f) ? c : '.', event->state); return TRUE; } /* ---------------------------------------------------------------------- */ static void set_frequencies(trxapi_frequency_t rx, trxapi_frequency_t tx) { GtkSpinButton *rxqrg, *txqrg; rxqrg = GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "rxqrg")); txqrg = GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "txqrg")); gtk_signal_disconnect_by_func(GTK_OBJECT(rxqrg), GTK_SIGNAL_FUNC(on_qrg_changed), NULL); gtk_signal_disconnect_by_func(GTK_OBJECT(txqrg), GTK_SIGNAL_FUNC(on_qrg_changed), NULL); gtk_spin_button_set_value(rxqrg, rx * (1.0 / 1000000.0)); gtk_spin_button_set_value(txqrg, tx * (1.0 / 1000000.0)); gtk_signal_connect(GTK_OBJECT(rxqrg), "changed", GTK_SIGNAL_FUNC(on_qrg_changed), NULL); gtk_signal_connect(GTK_OBJECT(txqrg), "changed", GTK_SIGNAL_FUNC(on_qrg_changed), NULL); } static void set_stnname(const char *name) { GtkEntry *entry; entry = GTK_ENTRY(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(mainwindow), "stnname"))->entry); gtk_signal_disconnect_by_func(GTK_OBJECT(entry), GTK_SIGNAL_FUNC(on_stn_changed), NULL); gtk_entry_set_text(entry, name); gtk_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(on_stn_changed), NULL); } static gint fchgtimeout(gpointer user_data) { freq.fchginhibit = 0; return FALSE; } static void set_station(const char *name) { struct stndb_entry stnent; struct trxapi_baycomusb_adapter_config adaptcfg; if (!name) return; memset(&stnent, 0, sizeof(stnent)); stnent.mode = -1; strncpy(stnent.name, name, sizeof(stnent.name)); if (stndb_retrieve(&stnent)) { printf("Station \"%s\" not found in database\n", stnent.name); return; } if (trx.trx != NULL) { if (stnent.mode == trxapi_baycomusb_mode_fsk || stnent.mode == trxapi_baycomusb_mode_afsk || stnent.mode == trxapi_baycomusb_mode_external || stnent.mode == trxapi_baycomusb_mode_audio) { if (trxapi_baycomusb_adapter_get_config(trx.trx, &adaptcfg)) { lprintf(1, "trxapi_baycomusb_adapter_get_config error\n"); } else { adaptcfg.mode = stnent.mode; if (stnent.mode == trxapi_baycomusb_mode_fsk) { adaptcfg.bitraterx = stnent.bitraterx; adaptcfg.bitratetx = stnent.bitratetx; } if (trxapi_baycomusb_adapter_set_config(trx.trx, &adaptcfg)) lprintf(1, "trxapi_baycomusb_adapter_set_config error\n"); } } if (trxapi_set_frequency(trx.trx, stnent.rx, stnent.tx)) { lprintf(1, "trxapi_set_frequency error\n"); return; } } set_frequencies(stnent.rx, stnent.tx); //set_stnname(stnent.name); freq.rx = stnent.rx; freq.tx = stnent.tx; if (freq.fchginhibit) gtk_timeout_remove(freq.fchginhibit); freq.fchginhibit = gtk_timeout_add(3000, fchgtimeout, NULL); } void on_qrg_changed(GtkEditable *editable, gpointer user_data) { gfloat rxqrg, txqrg; struct stndb_entry stnent; printf("on_qrg_changed\n"); memset(&stnent, 0, sizeof(stnent)); rxqrg = gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "rxqrg"))); txqrg = gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "txqrg"))); stnent.rx = rxqrg * 1000000; stnent.tx = txqrg * 1000000; stnent.rx = (stnent.rx + 50) / 100 * 100; stnent.tx = (stnent.tx + 50) / 100 * 100; if (trx.trx != NULL) { if (trxapi_set_frequency(trx.trx, stnent.rx, stnent.tx)) { lprintf(1, "trxapi_set_frequency error\n"); return; } } freq.rx = stnent.rx; freq.tx = stnent.tx; if (freq.fchginhibit) gtk_timeout_remove(freq.fchginhibit); freq.fchginhibit = gtk_timeout_add(3000, fchgtimeout, NULL); stnent.mode = -1; if (trx.trx != NULL) { struct trxapi_baycomusb_adapter_config adaptcfg; if (trxapi_baycomusb_adapter_get_config(trx.trx, &adaptcfg)) { lprintf(1, "trxapi_baycomusb_adapter_get_config error\n"); } else { stnent.mode = adaptcfg.mode; stnent.bitraterx = adaptcfg.bitraterx; stnent.bitratetx = adaptcfg.bitratetx; } } if (stndb_retrieve(&stnent) || !stnent.name[0]) strncpy(stnent.name, "-", sizeof(stnent.name)); set_stnname(stnent.name); } void on_stn_changed(GtkEditable *editable, gpointer user_data) { gchar *stnname = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(mainwindow), "stnname"))->entry)); printf("Station Name Change: %s\n", stnname); if (!strcmp(stnname, "-")) return; set_station(stnname); } /* ---------------------------------------------------------------------- */ void on_chprog_raster_toggled(GtkToggleButton *togglebutton, gpointer user_data) { unsigned int raster, rx, tx; GtkSpinButton *rxqrg, *txqrg; gfloat rxv, txv; raster = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "raster"))); rxqrg = GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "rxqrg")); txqrg = GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "txqrg")); rxv = gtk_spin_button_get_value_as_float(rxqrg); txv = gtk_spin_button_get_value_as_float(txqrg); if (raster) { rx = (rxv + (0.0125 / 2 - 430)) * (1.0 / 0.0125); tx = (txv + (0.0125 / 2 - 430)) * (1.0 / 0.0125); if (rx >= 800) rx = 799; if (tx >= 800) tx = 799; rxv = 430 + rx * 0.0125; txv = 430 + tx * 0.0125; gtk_spin_button_set_adjustment(rxqrg, GTK_ADJUSTMENT(gtk_adjustment_new(rxv, 430, 440, 0.0125, 1, 1))); gtk_spin_button_set_adjustment(txqrg, GTK_ADJUSTMENT(gtk_adjustment_new(txv, 430, 440, 0.0125, 1, 1))); } else { rx = (rxv + (0.025 / 2 - 430)) * (1.0 / 0.025); tx = (txv + (0.025 / 2 - 430)) * (1.0 / 0.025); if (rx >= 400) rx = 399; if (tx >= 400) tx = 399; rxv = 430 + rx * 0.025; txv = 430 + tx * 0.025; gtk_spin_button_set_adjustment(rxqrg, GTK_ADJUSTMENT(gtk_adjustment_new(rxv, 430, 440, 0.025, 1, 1))); gtk_spin_button_set_adjustment(txqrg, GTK_ADJUSTMENT(gtk_adjustment_new(txv, 430, 440, 0.025, 1, 1))); } gtk_spin_button_set_value(rxqrg, rxv); gtk_spin_button_set_value(txqrg, txv); } void on_chprog_channel_changed(GtkEditable *editable, gpointer user_data) { unsigned int ch, raster, divmax; gfloat r; ch = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "channel"))); raster = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "raster"))); r = raster ? 0.0125 : 0.025; divmax = raster ? 800 : 400; if (ch < 10) { if (chmem[ch].rx >= 0 && chmem[ch].rx <= divmax) gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "rxqrg")), 430 + r * chmem[ch].rx); if (chmem[ch].tx >= 0 && chmem[ch].tx <= divmax) gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "txqrg")), 430 + r * chmem[ch].tx); } } void on_chprogok_clicked(GtkButton *button, gpointer user_data) { unsigned int ch, raster, rx, tx, divmax; float rxqrg, txqrg, rst, rnd; char buf[256]; gtk_widget_hide(chprogwindow); ch = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "channel"))); raster = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "raster"))); rxqrg = gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "rxqrg"))); txqrg = gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(chprogwindow), "txqrg"))); rnd = raster ? (0.0125 / 2 - 430) : (0.025 / 2 - 430); rst = raster ? (1.0 / 0.0125) : (1.0 / 0.025); divmax = raster ? 800 : 400; rx = (rxqrg - rnd) * rst; tx = (txqrg - rnd) * rst; if (rx > divmax) rx = divmax; if (tx > divmax) tx = divmax; snprintf(buf, sizeof(buf), "\rC%1d%03d%03d\rE\r", ch, tx, rx); if (trx.trx == NULL) return; if (trxapi_uart_send(trx.trx, buf)) lprintf(1, "trxapi_uart_send error\n"); } void on_chprogcancel_clicked(GtkButton *button, gpointer user_data) { gtk_widget_hide(chprogwindow); } void on_channelwindow_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(chmemorywindow); } void on_progchmem_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(chprogwindow); } gboolean on_chmemorywindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(chmemorywindow); return TRUE; } gboolean on_chprogwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(chprogwindow); return TRUE; } /* ---------------------------------------------------------------------- */ gboolean on_newstationwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(newstnwindow); return TRUE; } void on_newstnok_clicked(GtkButton *button, gpointer user_data) { struct stndb_entry stnent; gfloat rxqrg, txqrg; gchar *text; GtkCList *clist; memset(&stnent, 0, sizeof(stnent)); rxqrg = gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(newstnwindow), "rxqrg"))); txqrg = gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(newstnwindow), "txqrg"))); stnent.rx = rxqrg * 1000000; stnent.tx = txqrg * 1000000; stnent.rx = (stnent.rx + 50) / 100 * 100; stnent.tx = (stnent.tx + 50) / 100 * 100; text = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(newstnwindow), "stnname"))); if (!text || !*text || !strcmp(text, "-")) { error_dialog("Invalid Name"); return; } strncpy(stnent.name, text, sizeof(stnent.name)); text = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(newstnwindow), "modeentry"))); if (!text) stnent.mode = -1; else if (!strcmp(text, "fsk")) stnent.mode = trxapi_baycomusb_mode_fsk; else if (!strcmp(text, "afsk")) stnent.mode = trxapi_baycomusb_mode_afsk; else if (!strcmp(text, "external")) stnent.mode = trxapi_baycomusb_mode_external; else if (!strcmp(text, "audio")) stnent.mode = trxapi_baycomusb_mode_audio; else stnent.mode = -1; stnent.bitraterx = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(newstnwindow), "bitraterx"))); stnent.bitratetx = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(newstnwindow), "bitratetx"))); if (freql.del != -1) { clist = GTK_CLIST(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "freqlist")); gtk_clist_get_text(clist, freql.del, 0, &text); stndb_delete(text); } freql.del = -1; if (stndb_write(&stnent)) { error_dialog("Cannot store station"); return; } gtk_widget_hide(newstnwindow); setstns(); } void on_newstncancel_clicked(GtkButton *button, gpointer user_data) { gtk_widget_hide(newstnwindow); } void on_newstnmodeentry_changed(GtkEditable *editable, gpointer user_data) { gboolean sensitive = !strcmp(gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(newstnwindow), "modeentry"))), "fsk"); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(newstnwindow), "bitraterx")), sensitive); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(newstnwindow), "bitratetx")), sensitive); } void on_freqlist_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(freqlistwindow); } gboolean on_freqlistwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(newstnwindow); gtk_widget_hide(freqlistwindow); return TRUE; } void on_freqlistset_clicked(GtkButton *button, gpointer user_data) { gchar *text; GtkCList *clist; if (freql.sel == -1) return; clist = GTK_CLIST(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "freqlist")); gtk_clist_get_text(clist, freql.sel, 0, &text); set_station(text); set_stnname(text); } void on_freqlistnew_clicked(GtkButton *button, gpointer user_data) { freql.del = -1; gtk_widget_show(newstnwindow); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(newstnwindow), "stnname")), ""); } void on_freqlistupdate_clicked(GtkButton *button, gpointer user_data) { struct stndb_entry stnent; gchar *text; GtkCList *clist; freql.del = freql.sel; gtk_widget_show(newstnwindow); if (freql.sel == -1) return; clist = GTK_CLIST(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "freqlist")); gtk_clist_get_text(clist, freql.sel, 0, &text); memset(&stnent, 0, sizeof(stnent)); stnent.mode = -1; strncpy(stnent.name, text, sizeof(stnent.name)); if (stndb_retrieve(&stnent)) { printf("Cannot retrieve station \"%s\"\n", text); return; } gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(newstnwindow), "stnname")), stnent.name); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(newstnwindow), "rxqrg")), stnent.rx*1e-6); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(newstnwindow), "txqrg")), stnent.tx*1e-6); switch (stnent.mode) { case trxapi_baycomusb_mode_fsk: text = "fsk"; break; case trxapi_baycomusb_mode_external: text = "external"; break; case trxapi_baycomusb_mode_afsk: text = "afsk"; break; case trxapi_baycomusb_mode_audio: text = "audio"; break; default: text = "-"; break; } gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(newstnwindow), "modeentry")), text); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(newstnwindow), "bitraterx")), stnent.bitraterx); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(newstnwindow), "bitratetx")), stnent.bitratetx); } void on_freqlistdelete_clicked(GtkButton *button, gpointer user_data) { gchar *text; GtkCList *clist; if (freql.sel == -1) return; clist = GTK_CLIST(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "freqlist")); gtk_clist_get_text(clist, freql.sel, 0, &text); stndb_delete(text); setstns(); gtk_clist_select_row(clist, freql.sel, 0); } void on_freqlist_select_row(GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data) { printf("Select row: %d\n", row); freql.sel = row; gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttonset")), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttonupdate")), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttondelete")), TRUE); } void on_freqlist_unselect_row(GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data) { printf("Unselect row: %d\n", row); freql.sel = -1; gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttonset")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttonupdate")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttondelete")), FALSE); } /* ---------------------------------------------------------------------- */ void on_selectmodem_activate(GtkMenuItem *menuitem, gpointer user_data) { struct trxapi *api; const struct trxapi_description *desc; unsigned int i; GtkCList *clist; gchar *buf[3]; clist = GTK_CLIST(gtk_object_get_data(GTK_OBJECT(modemselectwindow), "modemlist")); gtk_clist_freeze(clist); gtk_clist_clear(clist); for (i = 0; ; i++) { if (!(api = trxapi_open_byindex(i))) break; if (!(desc = trxapi_get_description(api))) { trxapi_close(api); continue; } /* explicit conversion to discard const */ buf[0] = (char *)desc->manufacturer; buf[1] = (char *)desc->model; buf[2] = (char *)desc->instid; gtk_clist_append(clist, buf); trxapi_close(api); } gtk_clist_thaw(clist); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(modemselectwindow), "modemselok")), FALSE); selectmodem_sel = -1; gtk_widget_show(modemselectwindow); } void on_modemlist_select_row(GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data) { selectmodem_sel = row; gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(modemselectwindow), "modemselok")), TRUE); } void on_modemlist_unselect_row(GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data) { selectmodem_sel = -1; gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(modemselectwindow), "modemselok")), FALSE); } void on_modemselok_clicked(GtkButton *button, gpointer user_data) { GtkCList *clist; gchar *mfg, *model, *serial; if (selectmodem_sel != -1) { clist = GTK_CLIST(gtk_object_get_data(GTK_OBJECT(modemselectwindow), "modemlist")); gtk_clist_get_text(clist, selectmodem_sel, 0, &mfg); gtk_clist_get_text(clist, selectmodem_sel, 1, &model); gtk_clist_get_text(clist, selectmodem_sel, 2, &serial); trxopenbymfgmodelserial(mfg, model, serial); } gtk_widget_hide(modemselectwindow); } void on_modemselcancel_clicked(GtkButton *button, gpointer user_data) { gtk_widget_hide(modemselectwindow); } gboolean on_modemselectwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(modemselectwindow); return TRUE; } static const char *filtmodestr[3] = { "0 - Default", "1 - Precomputed Filter", "2 - Ideal Lowpass Filter" }; static const char *loopbackstr[3] = { "Off", "Scrambler", "Modem" }; static const char *mdiscrxcstr[2] = { "Normal", "RxClock" }; static const char *mdisctxcstr[2] = { "Normal", "TxClock" }; static const char *mdisctxdstr[2] = { "Normal", "TxData" }; void on_modemconfig_activate(GtkMenuItem *menuitem, gpointer user_data) { GtkNotebook *notebk; struct trxapi_baycomusb_adapter_config adaptcfg; struct trxapi_channel_access_config chacccfg; struct trxapi_interface_config ifcfg; struct trxapi_modem_disconnect_config mdisccfg; unsigned int i; char buf[16]; char mbuf[8]; notebk = GTK_NOTEBOOK(gtk_object_get_data(GTK_OBJECT(configwindow), "confignotebook")); notebook_pagemask = 0; gtk_widget_hide(gtk_notebook_get_nth_page(notebk, 0)); gtk_widget_hide(gtk_notebook_get_nth_page(notebk, 1)); gtk_widget_hide(gtk_notebook_get_nth_page(notebk, 2)); gtk_widget_hide(gtk_notebook_get_nth_page(notebk, 3)); gtk_widget_hide(gtk_notebook_get_nth_page(notebk, 4)); if (!trx.trx) { gtk_widget_show(configwindow); return; } if (!trxapi_baycomusb_adapter_get_config(trx.trx, &adaptcfg)) { gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptmodeentry")), (adaptcfg.mode == trxapi_baycomusb_mode_external) ? "external" : (adaptcfg.mode == trxapi_baycomusb_mode_afsk) ? "afsk" : (adaptcfg.mode == trxapi_baycomusb_mode_audio) ? "audio" : "fsk"); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptfclk")), adaptcfg.fclk); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptbitraterx")), adaptcfg.bitraterx); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptbitratetx")), adaptcfg.bitratetx); if (adaptcfg.loopback > 2) adaptcfg.loopback = 2; gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptloopbackentry")), loopbackstr[adaptcfg.loopback]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptpttmute")), adaptcfg.pttmute); if (adaptcfg.filtmode > 2) adaptcfg.filtmode = 2; gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptfiltmodeentry")), filtmodestr[adaptcfg.filtmode]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptsamplerate")), adaptcfg.samplerate); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptgain")), adaptcfg.gain); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptaudiodevinentry")), adaptcfg.audiodevin); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptaudiodevoutentry")), adaptcfg.audiodevout); //gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptrfsquelch"))), // adaptcfg.rfsquelch); gtk_range_set_adjustment(GTK_RANGE(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptrfsquelch")), GTK_ADJUSTMENT(gtk_adjustment_new(adaptcfg.rfsquelch, trx.desc->rssimin, trx.desc->rssimax, 1, 1, 1))); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptaudiosquelch")), adaptcfg.audiosquelch); notebook_pagemask |= (1 << 0) | (1 << 1); gtk_widget_show(gtk_notebook_get_nth_page(notebk, 0)); gtk_widget_show(gtk_notebook_get_nth_page(notebk, 1)); } if (!trxapi_channel_access_get_config(trx.trx, &chacccfg)) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chacctxdelay")), chacccfg.txdelay); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chaccslottime")), chacccfg.slottime); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chacctxtail")), chacccfg.txtail); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chaccppersistence")), chacccfg.ppersistence); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chaccfullduplex")), chacccfg.fullduplex); notebook_pagemask |= 1 << 2; gtk_widget_show(gtk_notebook_get_nth_page(notebk, 2)); } if (!trxapi_interface_get_config(trx.trx, &ifcfg)) { gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfgifnameentry")), ifcfg.ifname); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfghwaddr")), ifcfg.hwaddr); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", ifcfg.ipaddr[0], ifcfg.ipaddr[1], ifcfg.ipaddr[2], ifcfg.ipaddr[3]); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfgipaddr")), buf); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", ifcfg.netmask[0], ifcfg.netmask[1], ifcfg.netmask[2], ifcfg.netmask[3]); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfgnetmask")), buf); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", ifcfg.broadcast[0], ifcfg.broadcast[1], ifcfg.broadcast[2], ifcfg.broadcast[3]); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfgbroadcast")), buf); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfggwhwaddr")), ifcfg.gwhwaddr); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", ifcfg.gwipaddr[0], ifcfg.gwipaddr[1], ifcfg.gwipaddr[2], ifcfg.gwipaddr[3]); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfggwipaddr")), buf); snprintf(buf, sizeof(buf), "%u.%u.%u.%u", ifcfg.gwnetmask[0], ifcfg.gwnetmask[1], ifcfg.gwnetmask[2], ifcfg.gwnetmask[3]); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfggwnetmask")), buf); gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfggwipmodeentry")), (ifcfg.gwipmode == 'V') ? _("Virtual Circuit") : (ifcfg.gwipmode == 'D') ? _("Datagram") : (ifcfg.gwipmode == 'C') ? _("Compressed") : _("Default")); notebook_pagemask |= 1 << 3; gtk_widget_show(gtk_notebook_get_nth_page(notebk, 3)); } if (!trxapi_modem_disconnect_get_config(trx.trx, &mdisccfg)) { strncpy(mbuf, "mdisc0l", sizeof(mbuf)); for (i = 0; i < 8; i++) { mbuf[5] = '0'+i; if (mdisccfg.direction & (1 << i)) mbuf[6] = 't'; else if (mdisccfg.output & (1 << i)) mbuf[6] = 'h'; else mbuf[6] = 'l'; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), mbuf)), TRUE); } if (mdisccfg.rxc > 1) mdisccfg.rxc = 1; gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "mdiscrxcentry")), mdiscrxcstr[mdisccfg.rxc]); if (mdisccfg.txc > 1) mdisccfg.txc = 1; gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "mdisctxcentry")), mdisctxcstr[mdisccfg.txc]); if (mdisccfg.txd > 1) mdisccfg.txd = 1; gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "mdisctxdentry")), mdisctxdstr[mdisccfg.txd]); notebook_pagemask |= 1 << 4; gtk_widget_show(gtk_notebook_get_nth_page(notebk, 4)); } gtk_widget_show(configwindow); } static void parseip(trxapi_ip_address_t addr, const char *cp) { unsigned int r1, r2, r3, r4; if (!cp || sscanf(cp, "%u.%u.%u.%u", &r1, &r2, &r3, &r4) != 4) { addr[0] = addr[1] = addr[2] = addr[3] = 0; return; } addr[0] = r1; addr[1] = r2; addr[2] = r3; addr[3] = r4; } void on_configwindowok_clicked(GtkButton *button, gpointer user_data) { struct trxapi_baycomusb_adapter_config adaptcfg; struct trxapi_channel_access_config chacccfg; struct trxapi_interface_config ifcfg; struct trxapi_modem_disconnect_config mdisccfg; char *cp; unsigned int dir, out, i, j; char mbuf[8]; if (notebook_pagemask & ((1 << 0)|(1 << 1))) { cp = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptmodeentry"))); if (!strcmp(cp, "fsk")) { adaptcfg.mode = trxapi_baycomusb_mode_fsk; } else if (!strcmp(cp, "external")) { adaptcfg.mode = trxapi_baycomusb_mode_external; } else if (!strcmp(cp, "afsk")) { adaptcfg.mode = trxapi_baycomusb_mode_afsk; } else if (!strcmp(cp, "audio")) { adaptcfg.mode = trxapi_baycomusb_mode_audio; } else adaptcfg.mode = trxapi_baycomusb_mode_fsk; adaptcfg.fclk = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptfclk"))); adaptcfg.bitraterx = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptbitraterx"))); adaptcfg.bitratetx = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptbitratetx"))); cp = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptloopbackentry"))); for (i = j = 0; i < 3; i++) if (!strcmp(cp, loopbackstr[i])) j = i; adaptcfg.loopback = j; adaptcfg.pttmute = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptpttmute"))); cp = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptfiltmodeentry"))); for (i = j = 0; i < 3; i++) if (!strcmp(cp, filtmodestr[i])) j = i; adaptcfg.filtmode = j; adaptcfg.samplerate = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptsamplerate"))); adaptcfg.gain = gtk_spin_button_get_value_as_float(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptgain"))); strncpy(adaptcfg.audiodevin, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptaudiodevinentry"))), sizeof(adaptcfg.audiodevin)); strncpy(adaptcfg.audiodevout, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptaudiodevoutentry"))), sizeof(adaptcfg.audiodevout)); adaptcfg.rfsquelch = gtk_range_get_adjustment(GTK_RANGE(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptrfsquelch")))->value; adaptcfg.audiosquelch = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptaudiosquelch"))); if (trx.trx != NULL) { if (adaptcfg.rfsquelch < trx.desc->rssimin) adaptcfg.rfsquelch = trx.desc->rssimin; if (adaptcfg.rfsquelch > trx.desc->rssimax) adaptcfg.rfsquelch = trx.desc->rssimax; } if (trxapi_baycomusb_adapter_set_config(trx.trx, &adaptcfg)) lprintf(1, "Error setting adapter config\n"); } if (notebook_pagemask & (1 << 2)) { chacccfg.txdelay = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chacctxdelay"))); chacccfg.slottime = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chaccslottime"))); chacccfg.txtail = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chacctxtail"))); chacccfg.ppersistence = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chaccppersistence"))); chacccfg.fullduplex = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), "chaccfullduplex"))); if (trxapi_channel_access_set_config(trx.trx, &chacccfg)) lprintf(1, "Error setting channel access parameters\n"); } if (notebook_pagemask & (1 << 3)) { strncpy(ifcfg.ifname, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfgifnameentry"))), sizeof(ifcfg.ifname)); strncpy(ifcfg.hwaddr, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfghwaddr"))), sizeof(ifcfg.hwaddr)); parseip(ifcfg.ipaddr, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfgipaddr")))); parseip(ifcfg.netmask, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfgnetmask")))); parseip(ifcfg.broadcast, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfgbroadcast")))); strncpy(ifcfg.gwhwaddr, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfggwhwaddr"))), sizeof(ifcfg.gwhwaddr)); parseip(ifcfg.gwipaddr, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfggwipaddr")))); parseip(ifcfg.gwnetmask, gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfggwnetmask")))); cp = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "ifcfggwipmodeentry"))); if (!strcmp(cp, _("Virtual Circuit"))) ifcfg.gwipmode = 'V'; else if (!strcmp(cp, _("Datagram"))) ifcfg.gwipmode = 'D'; else if (!strcmp(cp, _("Compressed"))) ifcfg.gwipmode = 'C'; else ifcfg.gwipmode = ' '; if (trxapi_interface_set_config(trx.trx, &ifcfg)) lprintf(1, "Error setting interface parameters\n"); } if (notebook_pagemask & (1 << 4)) { strncpy(mbuf, "mdisc0l", sizeof(mbuf)); for (dir = out = i = 0; i < 8; i++) { mbuf[5] = '0'+i; mbuf[6] = 't'; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), mbuf)))) dir |= (1 << i); mbuf[6] = 'h'; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(configwindow), mbuf)))) out |= (1 << i); } mdisccfg.output = out; mdisccfg.direction = dir; cp = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "mdiscrxcentry"))); for (i = j = 0; i < 2; i++) if (!strcmp(cp, mdiscrxcstr[i])) j = i; mdisccfg.rxc = j; cp = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "mdisctxcentry"))); for (i = j = 0; i < 2; i++) if (!strcmp(cp, mdisctxcstr[i])) j = i; mdisccfg.txc = j; cp = gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(configwindow), "mdisctxdentry"))); for (i = j = 0; i < 2; i++) if (!strcmp(cp, mdisctxdstr[i])) j = i; mdisccfg.txd = j; if (trxapi_modem_disconnect_set_config(trx.trx, &mdisccfg)) lprintf(1, "Error setting modem disconnect parameters\n"); } gtk_widget_hide(configwindow); } void on_configwindowcancel_clicked(GtkButton *button, gpointer user_data) { gtk_widget_hide(configwindow); } gboolean on_configwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(configwindow); return TRUE; } /* ---------------------------------------------------------------------- */ static gint periodic(gpointer user_data) { struct trxapi_state status; struct trxapi_audio_state audiostate; unsigned char audiosamples[1024]; gint16 audiosamp[1024]; char buf[256]; unsigned int i; int rssi; GtkText *txt; unsigned char *cp1, *cp2; GtkToggleButton *manualptt; struct stndb_entry stnent; if (trx.trx == NULL) { /* should do reopen */ return TRUE; } if (trxapi_get_state(trx.trx, &status)) { lprintf(1, "Error getting status\n"); closetrx(); /* should initialise reopening */ return TRUE; } trxnewmode(status.mode); /* update PTT & DCD leds */ i = (status.ptt ? 1 : 0) | (status.dcd ? 2 : 0); if ((ledstatus ^ i) & 2) setled(GTK_PIXMAP(gtk_object_get_data(GTK_OBJECT(mainwindow), "leddcd")), i & 2); if ((ledstatus ^ i) & 1) setled(GTK_PIXMAP(gtk_object_get_data(GTK_OBJECT(mainwindow), "ledptt")), i & 1); ledstatus = i; /* update RSSI */ gtk_progress_set_value(GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(mainwindow), "rssi")), status.rssi); /* add RSSI to running display */ rssi = (status.rssi - trx.desc->rssimin) * trx.rssimul; if (rssi < 0) rssi = 0; if (rssi > 255) rssi = 255; signalhistory_newdata(SIGNALHISTORY(gtk_object_get_data(GTK_OBJECT(mainwindow), "rssihistory")), status.ptt ? 250 : rssi, status.ptt ? 2 : (status.dcd ? 1 : 0)); /* check changes in rx/tx frequency */ if (!freq.fchginhibit && (status.rxfreq != freq.rx || status.txfreq != freq.tx)) { memset(&stnent, 0, sizeof(stnent)); stnent.rx = freq.rx = status.rxfreq; stnent.tx = freq.tx = status.txfreq; stnent.mode = -1; set_frequencies(freq.rx, freq.tx); if (trx.trx != NULL) { struct trxapi_baycomusb_adapter_config adaptcfg; if (!trxapi_baycomusb_adapter_get_config(trx.trx, &adaptcfg)) { stnent.mode = adaptcfg.mode; stnent.bitraterx = adaptcfg.bitraterx; stnent.bitratetx = adaptcfg.bitratetx; } } if (stndb_retrieve(&stnent) || !stnent.name[0]) strncpy(stnent.name, "-", sizeof(stnent.name)); set_stnname(stnent.name); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "rxqrg")), freq.rx != 0); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "txqrg")), freq.tx != 0); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "stnname")), freq.rx != 0 || freq.tx != 0); } /* check manual PTT */ manualptt = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonptt")); if ((!gtk_toggle_button_get_active(manualptt)) != (!status.manualptt)) { gtk_signal_disconnect_by_func(GTK_OBJECT(manualptt), GTK_SIGNAL_FUNC(on_buttonptt_toggled), NULL); gtk_toggle_button_set_active(manualptt, status.manualptt); gtk_signal_connect(GTK_OBJECT(manualptt), "toggled", GTK_SIGNAL_FUNC(on_buttonptt_toggled), NULL); } /* check if UART received chars */ if (!trxapi_uart_receive(trx.trx, &rxuartptr, buf, sizeof(buf))) { /* process input for widget */ for (cp1 = cp2 = buf; *cp2; cp2++) { if (*cp2 == '\r') { *cp1++ = '\n'; uartline.rxline[uartline.lptr] = 0; processuart(uartline.rxline); uartline.lptr = 0; } else if (*cp2 != '\n') { *cp1++ = *cp2; if (*cp2 >= 32 && *cp2 <= 127 && uartline.lptr < sizeof(uartline.rxline)-1) uartline.rxline[uartline.lptr++] = *cp2; } } if (buf != (char *)cp1) { txt = GTK_TEXT(gtk_object_get_data(GTK_OBJECT(terminalwindow), "text")); gtk_text_insert(txt, NULL, NULL, NULL, buf, cp1-(unsigned char *)buf); } } /* scope/spectrum windows */ if (trx.mode == trxapi_mode_audio) { if (trxapi_get_audio_state(trx.trx, &audiostate)) { lprintf(1, "trxapi_get_audio_state error\n"); } else { /* update audio levels */ gtk_progress_set_value(GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(audiopwrwindow), "audiomicsig")), audiostate.micsigpwr); gtk_progress_set_value(GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(audiopwrwindow), "audiospksig")), audiostate.spksigpwr); gtk_progress_set_value(GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(audiopwrwindow), "audiospknoise")), audiostate.spknoisepwr); /* send samples to scope and spectrum */ if (GTK_WIDGET_DRAWABLE(micscopewindow) || GTK_WIDGET_DRAWABLE(micspectrumwindow)) { if (trxapi_get_audio_mic_samples(trx.trx, (audiostate.micbufptr + audiostate.micbufsz - 1024) % audiostate.micbufsz, 1024, audiosamples)) { lprintf(1, "trxapi_get_audio_mic_samples error\n"); } else { for (i = 0; i < 1024; i++) audiosamp[i] = audiosamples[i] << 8; if (GTK_WIDGET_DRAWABLE(micscopewindow)) scope_addvalues(SCOPE(gtk_object_get_data(GTK_OBJECT(micscopewindow), "scope")), 1024, NULL, audiosamp); if (GTK_WIDGET_DRAWABLE(micspectrumwindow)) spectrum_addvalues(SPECTRUM(gtk_object_get_data(GTK_OBJECT(micspectrumwindow), "spec")), 1024, audiosamp); } } if (GTK_WIDGET_DRAWABLE(spkscopewindow) || GTK_WIDGET_DRAWABLE(spkspectrumwindow)) { if (trxapi_get_audio_spk_samples(trx.trx, (audiostate.spkbufptr + audiostate.spkbufsz - 1024) % audiostate.spkbufsz, 1024, audiosamples)) { lprintf(1, "trxapi_get_audio_spk_samples error\n"); } else { for (i = 0; i < 1024; i++) audiosamp[i] = audiosamples[i] << 8; if (GTK_WIDGET_DRAWABLE(spkscopewindow)) scope_addvalues(SCOPE(gtk_object_get_data(GTK_OBJECT(spkscopewindow), "scope")), 1024, NULL, audiosamp); if (GTK_WIDGET_DRAWABLE(spkspectrumwindow)) spectrum_addvalues(SPECTRUM(gtk_object_get_data(GTK_OBJECT(spkspectrumwindow), "spec")), 1024, audiosamp); } } } } return TRUE; } /* ---------------------------------------------------------------------- */ void on_dtmfclear_clicked(GtkButton *button, gpointer user_data) { GtkEntry *entry; entry = GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(dtmfwindow), "dtmfentry")); gtk_entry_set_text(entry, ""); } static gint dtmfkeyfunc(gpointer data) { return on_dtmfwindow_key_event(NULL, NULL, data); } gboolean on_dtmfwindow_key_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { static const char dtmfkeys[] = "0123456789ABCD*#"; static guint tmo = 0; static guint lastkey = -1; static guint currentkey = 0; GtkButton *but; gchar bname[6] = "dtmf0"; char *cp, c; if (!event) { tmo = 0; lastkey = currentkey; bname[4] += lastkey & 15; if ((lastkey & 15) >= 10) bname[4] += 'a'-'0'-10; but = GTK_BUTTON(gtk_object_get_data(GTK_OBJECT(dtmfwindow), bname)); if (lastkey & 16) gtk_button_pressed(but); else gtk_button_released(but); return FALSE; /* don't get called again */ } c = event->keyval; if (c >= 'a' && c <= 'z') c += 'A'-'a'; if (!(cp = strchr(dtmfkeys, c))) return FALSE; currentkey = cp - dtmfkeys + (event->type == GDK_KEY_PRESS ? 16 : 0); if (tmo) gtk_timeout_remove(tmo); if (currentkey != lastkey) tmo = gtk_timeout_add(10, dtmfkeyfunc, NULL); return TRUE; } void on_dtmf_key(GtkButton *button, gpointer user_data) { static const char dtmfkeys[] = "0123456789ABCD*#"; GtkEntry *entry; gchar txt[2]; guint key = (guint)user_data; printf("DTMF key: %u\n", key); if (trx.trx == NULL) return; if (key & 16) pttmask |= PTTMASK_DTMF; else pttmask &= ~PTTMASK_DTMF; updatepttmask(); if (trx.mode == trxapi_mode_audio) { if (trxapi_set_audio_dtmf(trx.trx, (key & 16) ? (key & 15) : -1)) lprintf(1, "trxapi_set_audio_dtmf error\n"); } if (key < 0x10 || key > 0x1f) return; txt[0] = dtmfkeys[key & 0xf]; txt[1] = 0; entry = GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(dtmfwindow), "dtmfentry")); gtk_entry_append_text(entry, txt); } gboolean on_dtmfwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(dtmfwindow); return TRUE; } void on_audiopwrs_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(audiopwrwindow); } void on_audiodtmf_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(dtmfwindow); } void on_audioparams_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(paramwindow); } void on_spkscope_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(spkscopewindow); } void on_spkspectrum_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(spkspectrumwindow); } void on_micscope_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(micscopewindow); } void on_micspectrum_activate(GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show(micspectrumwindow); } void on_paramwindowok_clicked(GtkButton *button, gpointer user_data) { gtk_widget_hide(paramwindow); params.enaptt = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(paramwindow), "paramenablepttpkt"))); paramstodialog(); } void on_paramwindowcancel_clicked(GtkButton *button, gpointer user_data) { gtk_widget_hide(paramwindow); paramstodialog(); } gboolean on_paramwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(paramwindow); return TRUE; } gboolean on_spkscopewindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(spkscopewindow); return TRUE; } gboolean on_spkspectrumwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(spkspectrumwindow); return TRUE; } gboolean on_micscopewindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(micscopewindow); return TRUE; } gboolean on_micspectrumwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(micspectrumwindow); return TRUE; } gboolean on_audiopwrwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_widget_hide(audiopwrwindow); return TRUE; } /* ---------------------------------------------------------------------- */ static void init_popdown(void) { static const char *modestr[] = { "fsk", "afsk", "external", "audio" }; GList *items; GtkCombo *combo; unsigned int i; combo = GTK_COMBO(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptfiltmode")); items = NULL; for (i = 0; i < sizeof(filtmodestr)/sizeof(filtmodestr[0]); i++) items = g_list_append(items, (gpointer)filtmodestr[i]); gtk_combo_set_popdown_strings(combo, items); gtk_entry_set_text(GTK_ENTRY(combo->entry), items->data); g_list_free(items); combo = GTK_COMBO(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptloopback")); items = NULL; for (i = 0; i < sizeof(loopbackstr)/sizeof(loopbackstr[0]); i++) items = g_list_append(items, (gpointer)loopbackstr[i]); gtk_combo_set_popdown_strings(combo, items); gtk_entry_set_text(GTK_ENTRY(combo->entry), items->data); g_list_free(items); combo = GTK_COMBO(gtk_object_get_data(GTK_OBJECT(configwindow), "adaptmode")); items = NULL; for (i = 0; i < sizeof(modestr)/sizeof(modestr[0]); i++) items = g_list_append(items, (gpointer)modestr[i]); gtk_combo_set_popdown_strings(combo, items); gtk_entry_set_text(GTK_ENTRY(combo->entry), items->data); g_list_free(items); combo = GTK_COMBO(gtk_object_get_data(GTK_OBJECT(newstnwindow), "mode")); items = g_list_append(NULL, "-"); for (i = 0; i < sizeof(modestr)/sizeof(modestr[0]); i++) items = g_list_append(items, (gpointer)modestr[i]); gtk_combo_set_popdown_strings(combo, items); gtk_entry_set_text(GTK_ENTRY(combo->entry), items->data); g_list_free(items); combo = GTK_COMBO(gtk_object_get_data(GTK_OBJECT(configwindow), "mdiscrxc")); items = NULL; for (i = 0; i < sizeof(mdiscrxcstr)/sizeof(mdiscrxcstr[0]); i++) items = g_list_append(items, (gpointer)mdiscrxcstr[i]); gtk_combo_set_popdown_strings(combo, items); gtk_entry_set_text(GTK_ENTRY(combo->entry), items->data); g_list_free(items); combo = GTK_COMBO(gtk_object_get_data(GTK_OBJECT(configwindow), "mdisctxc")); items = NULL; for (i = 0; i < sizeof(mdisctxcstr)/sizeof(mdisctxcstr[0]); i++) items = g_list_append(items, (gpointer)mdisctxcstr[i]); gtk_combo_set_popdown_strings(combo, items); gtk_entry_set_text(GTK_ENTRY(combo->entry), items->data); g_list_free(items); combo = GTK_COMBO(gtk_object_get_data(GTK_OBJECT(configwindow), "mdisctxd")); items = NULL; for (i = 0; i < sizeof(mdisctxdstr)/sizeof(mdisctxdstr[0]); i++) items = g_list_append(items, (gpointer)mdisctxdstr[i]); gtk_combo_set_popdown_strings(combo, items); gtk_entry_set_text(GTK_ENTRY(combo->entry), items->data); g_list_free(items); } /* ---------------------------------------------------------------------- */ int main(int argc, char *argv[]) { static const struct option long_options[] = { { "--expert", 0, 0, 'e' }, { 0, 0, 0, 0 } }; int c, err = 0; unsigned int expert = 0; guint tmid; printf("Baycom USB Transceiver Controller v" VERSION "\n"); #ifdef ENABLE_NLS bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR); textdomain(PACKAGE); #endif verboselevel = ~0; syslogmsg = 1; if (trxapi_init(&argc, argv)) exit(1); gtk_set_locale(); gtk_init(&argc, &argv); add_pixmap_directory(PACKAGE_DATA_DIR "/pixmaps"); add_pixmap_directory(PACKAGE_SOURCE_DIR "/pixmaps"); while ((c = getopt_long(argc, argv, "e", long_options, NULL)) != EOF) { switch (c) { case 'e': expert = 1; break; default: err++; break; } } if (err) { fprintf(stderr, "usage: %s [--expert]\n", argv[0]); exit(1); } stndb_open(); /* * The following code was added by Glade to create one of each component * (except popup menus), just so that you see something after building * the project. Delete any components that you don't want shown initially. */ mainwindow = create_mainwindow(); gtk_progress_configure(GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(mainwindow), "rssi")), -120, -120, -35); terminalwindow = create_terminalwindow(); chmemorywindow = create_chmemorywindow(); chprogwindow = create_chprogwindow(); freqlistwindow = create_freqlistwindow(); newstnwindow = create_newstationwindow(); modemselectwindow = create_modemselectwindow(); configwindow = create_configwindow(); dtmfwindow = create_dtmfwindow(); spkscopewindow = create_spkscopewindow(); spkspectrumwindow = create_spkspectrumwindow(); micscopewindow = create_micscopewindow(); micspectrumwindow = create_micspectrumwindow(); paramwindow = create_paramwindow(); audiopwrwindow = create_audiopwrwindow(); init_popdown(); updatechmemwindow(); setstns(); paramstodialog(); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttonset")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttonupdate")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(freqlistwindow), "buttondelete")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(modemselectwindow), "modemselok")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "rxqrg")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "txqrg")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "stnname")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "modemconfig")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "audio")), FALSE); if (!expert) gtk_widget_hide(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "expert"))); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonptt")), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "button1750")), FALSE); trx.mode = trxapi_mode_unspec; gtk_widget_show(mainwindow); trxopenbyindex(0); tmid = gtk_timeout_add(250, periodic, NULL); gtk_main(); gtk_timeout_remove(tmid); stndb_close(); if (trx.trx) trxapi_close(trx.trx); return 0; } baycomusb-0.10.orig/trxapp/src/support.c0100644000175100017510000001073607340461304016405 0ustar abaaba/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "support.h" /* This is an internally used function to check if a pixmap file exists. */ static gchar* check_file_exists (const gchar *directory, const gchar *filename); /* This is an internally used function to create pixmaps. */ static GtkWidget* create_dummy_pixmap (GtkWidget *widget); GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name) { GtkWidget *parent, *found_widget; for (;;) { if (GTK_IS_MENU (widget)) parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); else parent = widget->parent; if (parent == NULL) break; widget = parent; } found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), widget_name); if (!found_widget) g_warning ("Widget not found: %s", widget_name); return found_widget; } /* This is a dummy pixmap we use when a pixmap can't be found. */ static char *dummy_pixmap_xpm[] = { /* columns rows colors chars-per-pixel */ "1 1 1 1", " c None", /* pixels */ " " }; /* This is an internally used function to create pixmaps. */ static GtkWidget* create_dummy_pixmap (GtkWidget *widget) { GdkColormap *colormap; GdkPixmap *gdkpixmap; GdkBitmap *mask; GtkWidget *pixmap; colormap = gtk_widget_get_colormap (widget); gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, NULL, dummy_pixmap_xpm); if (gdkpixmap == NULL) g_error ("Couldn't create replacement pixmap."); pixmap = gtk_pixmap_new (gdkpixmap, mask); gdk_pixmap_unref (gdkpixmap); gdk_bitmap_unref (mask); return pixmap; } static GList *pixmaps_directories = NULL; /* Use this function to set the directory containing installed pixmaps. */ void add_pixmap_directory (const gchar *directory) { pixmaps_directories = g_list_prepend (pixmaps_directories, g_strdup (directory)); } /* This is an internally used function to create pixmaps. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename) { gchar *found_filename = NULL; GdkColormap *colormap; GdkPixmap *gdkpixmap; GdkBitmap *mask; GtkWidget *pixmap; GList *elem; if (!filename || !filename[0]) return create_dummy_pixmap (widget); /* We first try any pixmaps directories set by the application. */ elem = pixmaps_directories; while (elem) { found_filename = check_file_exists ((gchar*)elem->data, filename); if (found_filename) break; elem = elem->next; } /* If we haven't found the pixmap, try the source directory. */ if (!found_filename) { found_filename = check_file_exists ("../pixmaps", filename); } if (!found_filename) { g_warning (_("Couldn't find pixmap file: %s"), filename); return create_dummy_pixmap (widget); } colormap = gtk_widget_get_colormap (widget); gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, NULL, found_filename); if (gdkpixmap == NULL) { g_warning (_("Error loading pixmap file: %s"), found_filename); g_free (found_filename); return create_dummy_pixmap (widget); } g_free (found_filename); pixmap = gtk_pixmap_new (gdkpixmap, mask); gdk_pixmap_unref (gdkpixmap); gdk_bitmap_unref (mask); return pixmap; } /* This is an internally used function to check if a pixmap file exists. */ gchar* check_file_exists (const gchar *directory, const gchar *filename) { gchar *full_filename; struct stat s; gint status; full_filename = (gchar*) g_malloc (strlen (directory) + 1 + strlen (filename) + 1); strcpy (full_filename, directory); strcat (full_filename, G_DIR_SEPARATOR_S); strcat (full_filename, filename); status = stat (full_filename, &s); if (status == 0 && S_ISREG (s.st_mode)) return full_filename; g_free (full_filename); return NULL; } baycomusb-0.10.orig/trxapp/src/support.h0100644000175100017510000000302607340461304016404 0ustar abaaba/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include /* * Standard gettext macros. */ #ifdef ENABLE_NLS # include # undef _ # define _(String) dgettext (PACKAGE, String) # ifdef gettext_noop # define N_(String) gettext_noop (String) # else # define N_(String) (String) # endif #else # define textdomain(String) (String) # define gettext(String) (String) # define dgettext(Domain,Message) (Message) # define dcgettext(Domain,Message,Type) (Message) # define bindtextdomain(Domain,Directory) (Domain) # define _(String) (String) # define N_(String) (String) #endif /* * Public Functions. */ /* * This function returns a widget in a component created by Glade. * Call it with the toplevel widget in the component (i.e. a window/dialog), * or alternatively any widget in the component, and the name of the widget * you want returned. */ GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name); /* get_widget() is deprecated. Use lookup_widget instead. */ #define get_widget lookup_widget /* Use this function to set the directory containing installed pixmaps. */ void add_pixmap_directory (const gchar *directory); /* * Private Functions. */ /* This is used to create the pixmaps in the interface. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename); baycomusb-0.10.orig/trxapp/src/interface.c0100644000175100017510000057364507340461304016646 0ustar abaaba/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include "callbacks.h" #include "interface.h" #include "support.h" GtkWidget* create_mainwindow (void) { GtkWidget *mainwindow; GtkWidget *vbox1; GtkWidget *handlebox1; GtkWidget *menubar1; GtkWidget *file; GtkWidget *file_menu; GtkAccelGroup *file_menu_accels; GtkWidget *freqlist; GtkWidget *modemconfig; GtkWidget *selectmodem; GtkWidget *audioparams; GtkWidget *separator1; GtkWidget *quit; GtkWidget *audio; GtkWidget *audio_menu; GtkAccelGroup *audio_menu_accels; GtkWidget *spkscope; GtkWidget *spkspectrum; GtkWidget *micscope; GtkWidget *micspectrum; GtkWidget *audiodtmf; GtkWidget *audiopwrs; GtkWidget *expert; GtkWidget *expert_menu; GtkAccelGroup *expert_menu_accels; GtkWidget *terminal; GtkWidget *channelwindow; GtkWidget *progchmem; GtkWidget *help; GtkWidget *help_menu; GtkAccelGroup *help_menu_accels; GtkWidget *about; GtkWidget *hbox2; GtkWidget *vbox5; GtkWidget *frame2; GtkWidget *table4; GtkObject *rxqrg_adj; GtkWidget *rxqrg; GtkWidget *label58; GtkWidget *label57; GtkObject *txqrg_adj; GtkWidget *txqrg; GtkWidget *label124; GtkWidget *label125; GtkWidget *frame6; GtkWidget *hbox4; GtkWidget *stnname; GtkWidget *stnnameentry; GtkWidget *frame3; GtkWidget *hbox3; GtkWidget *buttonptt; GtkWidget *button1750; GtkWidget *labelptt; GtkWidget *ledptt; GtkWidget *labeldcd; GtkWidget *leddcd; GtkWidget *frame5; GtkWidget *rssi; GtkWidget *frame4; GtkWidget *rssihistory; GtkWidget *statusbar; GtkAccelGroup *accel_group; GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); accel_group = gtk_accel_group_new (); mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (mainwindow), "mainwindow", mainwindow); gtk_window_set_title (GTK_WINDOW (mainwindow), _("Baycom USB Transceiver Controller")); gtk_window_set_wmclass (GTK_WINDOW (mainwindow), "baycomusb", "baycomusb"); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox1); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox1", vbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (mainwindow), vbox1); handlebox1 = gtk_handle_box_new (); gtk_widget_ref (handlebox1); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "handlebox1", handlebox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (handlebox1); gtk_box_pack_start (GTK_BOX (vbox1), handlebox1, FALSE, TRUE, 0); menubar1 = gtk_menu_bar_new (); gtk_widget_ref (menubar1); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "menubar1", menubar1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menubar1); gtk_container_add (GTK_CONTAINER (handlebox1), menubar1); file = gtk_menu_item_new_with_label (_("File")); gtk_widget_ref (file); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file", file, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (file); gtk_container_add (GTK_CONTAINER (menubar1), file); file_menu = gtk_menu_new (); gtk_widget_ref (file_menu); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file_menu", file_menu, (GtkDestroyNotify) gtk_widget_unref); gtk_menu_item_set_submenu (GTK_MENU_ITEM (file), file_menu); file_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (file_menu)); freqlist = gtk_menu_item_new_with_label (_("Frequency List...")); gtk_widget_ref (freqlist); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "freqlist", freqlist, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (freqlist); gtk_container_add (GTK_CONTAINER (file_menu), freqlist); gtk_widget_add_accelerator (freqlist, "activate", accel_group, GDK_F, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); modemconfig = gtk_menu_item_new_with_label (_("Modem Configuration...")); gtk_widget_ref (modemconfig); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "modemconfig", modemconfig, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (modemconfig); gtk_container_add (GTK_CONTAINER (file_menu), modemconfig); gtk_widget_add_accelerator (modemconfig, "activate", accel_group, GDK_C, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); selectmodem = gtk_menu_item_new_with_label (_("Select Modem...")); gtk_widget_ref (selectmodem); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "selectmodem", selectmodem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (selectmodem); gtk_container_add (GTK_CONTAINER (file_menu), selectmodem); gtk_widget_add_accelerator (selectmodem, "activate", accel_group, GDK_S, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); audioparams = gtk_menu_item_new_with_label (_("Settings...")); gtk_widget_ref (audioparams); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "audioparams", audioparams, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (audioparams); gtk_container_add (GTK_CONTAINER (file_menu), audioparams); gtk_widget_add_accelerator (audioparams, "activate", accel_group, GDK_Z, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); separator1 = gtk_menu_item_new (); gtk_widget_ref (separator1); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "separator1", separator1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (separator1); gtk_container_add (GTK_CONTAINER (file_menu), separator1); gtk_widget_set_sensitive (separator1, FALSE); quit = gtk_menu_item_new_with_label (_("Quit")); gtk_widget_ref (quit); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "quit", quit, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (quit); gtk_container_add (GTK_CONTAINER (file_menu), quit); gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_Q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); audio = gtk_menu_item_new_with_label (_("Audio")); gtk_widget_ref (audio); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "audio", audio, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (audio); gtk_container_add (GTK_CONTAINER (menubar1), audio); audio_menu = gtk_menu_new (); gtk_widget_ref (audio_menu); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "audio_menu", audio_menu, (GtkDestroyNotify) gtk_widget_unref); gtk_menu_item_set_submenu (GTK_MENU_ITEM (audio), audio_menu); audio_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (audio_menu)); spkscope = gtk_menu_item_new_with_label (_("Speaker Scope")); gtk_widget_ref (spkscope); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "spkscope", spkscope, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (spkscope); gtk_container_add (GTK_CONTAINER (audio_menu), spkscope); spkspectrum = gtk_menu_item_new_with_label (_("Speaker Spectrum")); gtk_widget_ref (spkspectrum); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "spkspectrum", spkspectrum, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (spkspectrum); gtk_container_add (GTK_CONTAINER (audio_menu), spkspectrum); micscope = gtk_menu_item_new_with_label (_("Microphone Scope")); gtk_widget_ref (micscope); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "micscope", micscope, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (micscope); gtk_container_add (GTK_CONTAINER (audio_menu), micscope); micspectrum = gtk_menu_item_new_with_label (_("Microphone Spectrum")); gtk_widget_ref (micspectrum); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "micspectrum", micspectrum, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (micspectrum); gtk_container_add (GTK_CONTAINER (audio_menu), micspectrum); audiodtmf = gtk_menu_item_new_with_label (_("DTMF")); gtk_widget_ref (audiodtmf); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "audiodtmf", audiodtmf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (audiodtmf); gtk_container_add (GTK_CONTAINER (audio_menu), audiodtmf); audiopwrs = gtk_menu_item_new_with_label (_("Signal Levels")); gtk_widget_ref (audiopwrs); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "audiopwrs", audiopwrs, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (audiopwrs); gtk_container_add (GTK_CONTAINER (audio_menu), audiopwrs); expert = gtk_menu_item_new_with_label (_("Expert")); gtk_widget_ref (expert); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "expert", expert, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (expert); gtk_container_add (GTK_CONTAINER (menubar1), expert); expert_menu = gtk_menu_new (); gtk_widget_ref (expert_menu); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "expert_menu", expert_menu, (GtkDestroyNotify) gtk_widget_unref); gtk_menu_item_set_submenu (GTK_MENU_ITEM (expert), expert_menu); expert_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (expert_menu)); terminal = gtk_menu_item_new_with_label (_("Terminal")); gtk_widget_ref (terminal); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "terminal", terminal, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (terminal); gtk_container_add (GTK_CONTAINER (expert_menu), terminal); gtk_tooltips_set_tip (tooltips, terminal, _("Open Terminal Window"), NULL); gtk_widget_add_accelerator (terminal, "activate", accel_group, GDK_T, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); channelwindow = gtk_menu_item_new_with_label (_("Channel Window")); gtk_widget_ref (channelwindow); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "channelwindow", channelwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (channelwindow); gtk_container_add (GTK_CONTAINER (expert_menu), channelwindow); gtk_widget_add_accelerator (channelwindow, "activate", accel_group, GDK_M, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); progchmem = gtk_menu_item_new_with_label (_("Program Channel Memory")); gtk_widget_ref (progchmem); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "progchmem", progchmem, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (progchmem); gtk_container_add (GTK_CONTAINER (expert_menu), progchmem); gtk_widget_add_accelerator (progchmem, "activate", accel_group, GDK_P, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); help = gtk_menu_item_new_with_label (_("Help")); gtk_widget_ref (help); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help", help, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (help); gtk_container_add (GTK_CONTAINER (menubar1), help); gtk_menu_item_right_justify (GTK_MENU_ITEM (help)); help_menu = gtk_menu_new (); gtk_widget_ref (help_menu); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help_menu", help_menu, (GtkDestroyNotify) gtk_widget_unref); gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu); help_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (help_menu)); about = gtk_menu_item_new_with_label (_("About")); gtk_widget_ref (about); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "about", about, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (about); gtk_container_add (GTK_CONTAINER (help_menu), about); gtk_widget_add_accelerator (about, "activate", accel_group, GDK_A, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); hbox2 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox2); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox2", hbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox1), hbox2, TRUE, TRUE, 0); vbox5 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox5); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox5", vbox5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox5); gtk_box_pack_start (GTK_BOX (hbox2), vbox5, TRUE, TRUE, 0); frame2 = gtk_frame_new (_("QRG")); gtk_widget_ref (frame2); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "frame2", frame2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame2); gtk_box_pack_start (GTK_BOX (vbox5), frame2, TRUE, TRUE, 0); table4 = gtk_table_new (2, 3, FALSE); gtk_widget_ref (table4); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "table4", table4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table4); gtk_container_add (GTK_CONTAINER (frame2), table4); rxqrg_adj = gtk_adjustment_new (0, 0, 99999, 0.0125, 1, 1); rxqrg = gtk_spin_button_new (GTK_ADJUSTMENT (rxqrg_adj), 1, 4); gtk_widget_ref (rxqrg); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "rxqrg", rxqrg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (rxqrg); gtk_table_attach (GTK_TABLE (table4), rxqrg, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 4, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (rxqrg), TRUE); label58 = gtk_label_new (_("TX")); gtk_widget_ref (label58); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "label58", label58, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label58); gtk_table_attach (GTK_TABLE (table4), label58, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label58), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label58), 5, 0); label57 = gtk_label_new (_("RX")); gtk_widget_ref (label57); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "label57", label57, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label57); gtk_table_attach (GTK_TABLE (table4), label57, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label57), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label57), 5, 0); txqrg_adj = gtk_adjustment_new (0, 0, 99999, 0.0125, 1, 1); txqrg = gtk_spin_button_new (GTK_ADJUSTMENT (txqrg_adj), 1, 4); gtk_widget_ref (txqrg); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "txqrg", txqrg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (txqrg); gtk_table_attach (GTK_TABLE (table4), txqrg, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (txqrg), TRUE); label124 = gtk_label_new (_("MHz")); gtk_widget_ref (label124); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "label124", label124, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label124); gtk_table_attach (GTK_TABLE (table4), label124, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (label124), 5, 0); label125 = gtk_label_new (_("MHz")); gtk_widget_ref (label125); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "label125", label125, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label125); gtk_table_attach (GTK_TABLE (table4), label125, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (label125), 5, 0); frame6 = gtk_frame_new (_("Station Name")); gtk_widget_ref (frame6); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "frame6", frame6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame6); gtk_box_pack_start (GTK_BOX (vbox5), frame6, TRUE, TRUE, 0); hbox4 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox4); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox4", hbox4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbox4); gtk_container_add (GTK_CONTAINER (frame6), hbox4); stnname = gtk_combo_new (); gtk_widget_ref (stnname); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "stnname", stnname, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (stnname); gtk_box_pack_start (GTK_BOX (hbox4), stnname, TRUE, TRUE, 0); stnnameentry = GTK_COMBO (stnname)->entry; gtk_widget_ref (stnnameentry); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "stnnameentry", stnnameentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (stnnameentry); gtk_entry_set_editable (GTK_ENTRY (stnnameentry), FALSE); frame3 = gtk_frame_new (_("Status")); gtk_widget_ref (frame3); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "frame3", frame3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame3); gtk_box_pack_start (GTK_BOX (vbox5), frame3, TRUE, TRUE, 0); hbox3 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox3); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox3", hbox3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbox3); gtk_container_add (GTK_CONTAINER (frame3), hbox3); buttonptt = gtk_toggle_button_new_with_label (_("PTT")); gtk_widget_ref (buttonptt); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonptt", buttonptt, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (buttonptt); gtk_box_pack_start (GTK_BOX (hbox3), buttonptt, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (buttonptt), 6); button1750 = gtk_button_new_with_label (_("1750")); gtk_widget_ref (button1750); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "button1750", button1750, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (button1750); gtk_box_pack_start (GTK_BOX (hbox3), button1750, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (button1750), 6); labelptt = gtk_label_new (_("PTT")); gtk_widget_ref (labelptt); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "labelptt", labelptt, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (labelptt); gtk_box_pack_start (GTK_BOX (hbox3), labelptt, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (labelptt), 1, 0.5); gtk_misc_set_padding (GTK_MISC (labelptt), 5, 0); ledptt = create_led_pixmap ("ledptt", NULL, NULL, 0, 0); gtk_widget_ref (ledptt); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "ledptt", ledptt, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ledptt); gtk_box_pack_start (GTK_BOX (hbox3), ledptt, FALSE, TRUE, 4); GTK_WIDGET_UNSET_FLAGS (ledptt, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (ledptt, GTK_CAN_DEFAULT); labeldcd = gtk_label_new (_("DCD")); gtk_widget_ref (labeldcd); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "labeldcd", labeldcd, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (labeldcd); gtk_box_pack_start (GTK_BOX (hbox3), labeldcd, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (labeldcd), 1, 0.5); gtk_misc_set_padding (GTK_MISC (labeldcd), 5, 0); leddcd = create_led_pixmap ("leddcd", NULL, NULL, 0, 0); gtk_widget_ref (leddcd); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "leddcd", leddcd, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (leddcd); gtk_box_pack_start (GTK_BOX (hbox3), leddcd, FALSE, TRUE, 4); GTK_WIDGET_UNSET_FLAGS (leddcd, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (leddcd, GTK_CAN_DEFAULT); frame5 = gtk_frame_new (_("S")); gtk_widget_ref (frame5); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "frame5", frame5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame5); gtk_box_pack_start (GTK_BOX (hbox2), frame5, FALSE, FALSE, 0); gtk_frame_set_label_align (GTK_FRAME (frame5), 0.5, 0.5); rssi = gtk_progress_bar_new (); gtk_widget_ref (rssi); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "rssi", rssi, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (rssi); gtk_container_add (GTK_CONTAINER (frame5), rssi); gtk_progress_configure (GTK_PROGRESS (rssi), 255, 255, 255); gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (rssi), GTK_PROGRESS_BOTTOM_TO_TOP); gtk_progress_set_show_text (GTK_PROGRESS (rssi), TRUE); gtk_progress_set_format_string (GTK_PROGRESS (rssi), _("%v")); frame4 = gtk_frame_new (_("S-Meter History")); gtk_widget_ref (frame4); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "frame4", frame4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame4); gtk_box_pack_start (GTK_BOX (vbox1), frame4, FALSE, FALSE, 0); rssihistory = signalhistory_new ("rssihistory", NULL, NULL, 0, 0); gtk_widget_ref (rssihistory); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "rssihistory", rssihistory, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (rssihistory); gtk_container_add (GTK_CONTAINER (frame4), rssihistory); gtk_widget_set_usize (rssihistory, 256, 64); GTK_WIDGET_UNSET_FLAGS (rssihistory, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (rssihistory, GTK_CAN_DEFAULT); statusbar = gtk_statusbar_new (); gtk_widget_ref (statusbar); gtk_object_set_data_full (GTK_OBJECT (mainwindow), "statusbar", statusbar, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (statusbar); gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (mainwindow), "destroy_event", GTK_SIGNAL_FUNC (on_mainwindow_destroy_event), NULL); gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event", GTK_SIGNAL_FUNC (on_mainwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (freqlist), "activate", GTK_SIGNAL_FUNC (on_freqlist_activate), NULL); gtk_signal_connect (GTK_OBJECT (modemconfig), "activate", GTK_SIGNAL_FUNC (on_modemconfig_activate), NULL); gtk_signal_connect (GTK_OBJECT (selectmodem), "activate", GTK_SIGNAL_FUNC (on_selectmodem_activate), NULL); gtk_signal_connect (GTK_OBJECT (audioparams), "activate", GTK_SIGNAL_FUNC (on_audioparams_activate), NULL); gtk_signal_connect (GTK_OBJECT (quit), "activate", GTK_SIGNAL_FUNC (on_quit_activate), NULL); gtk_signal_connect (GTK_OBJECT (spkscope), "activate", GTK_SIGNAL_FUNC (on_spkscope_activate), NULL); gtk_signal_connect (GTK_OBJECT (spkspectrum), "activate", GTK_SIGNAL_FUNC (on_spkspectrum_activate), NULL); gtk_signal_connect (GTK_OBJECT (micscope), "activate", GTK_SIGNAL_FUNC (on_micscope_activate), NULL); gtk_signal_connect (GTK_OBJECT (micspectrum), "activate", GTK_SIGNAL_FUNC (on_micspectrum_activate), NULL); gtk_signal_connect (GTK_OBJECT (audiodtmf), "activate", GTK_SIGNAL_FUNC (on_audiodtmf_activate), NULL); gtk_signal_connect (GTK_OBJECT (audiopwrs), "activate", GTK_SIGNAL_FUNC (on_audiopwrs_activate), NULL); gtk_signal_connect (GTK_OBJECT (terminal), "activate", GTK_SIGNAL_FUNC (on_terminal_activate), NULL); gtk_signal_connect (GTK_OBJECT (channelwindow), "activate", GTK_SIGNAL_FUNC (on_channelwindow_activate), NULL); gtk_signal_connect (GTK_OBJECT (progchmem), "activate", GTK_SIGNAL_FUNC (on_progchmem_activate), NULL); gtk_signal_connect (GTK_OBJECT (about), "activate", GTK_SIGNAL_FUNC (on_about_activate), NULL); gtk_signal_connect (GTK_OBJECT (rxqrg), "changed", GTK_SIGNAL_FUNC (on_qrg_changed), NULL); gtk_signal_connect (GTK_OBJECT (txqrg), "changed", GTK_SIGNAL_FUNC (on_qrg_changed), NULL); gtk_signal_connect (GTK_OBJECT (stnnameentry), "changed", GTK_SIGNAL_FUNC (on_stn_changed), NULL); gtk_signal_connect (GTK_OBJECT (buttonptt), "toggled", GTK_SIGNAL_FUNC (on_buttonptt_toggled), NULL); gtk_signal_connect (GTK_OBJECT (button1750), "pressed", GTK_SIGNAL_FUNC (on_button1750_pressed), NULL); gtk_signal_connect (GTK_OBJECT (button1750), "released", GTK_SIGNAL_FUNC (on_button1750_released), NULL); gtk_object_set_data (GTK_OBJECT (mainwindow), "tooltips", tooltips); gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group); return mainwindow; } GtkWidget* create_aboutwindow (void) { GtkWidget *aboutwindow; GtkWidget *dialog_vbox1; GtkWidget *frame1; GtkWidget *vbox4; GtkWidget *label13; GtkWidget *label14; GtkWidget *dialog_action_area1; GtkWidget *hbuttonbox1; GtkWidget *aboutok; aboutwindow = gtk_dialog_new (); gtk_object_set_data (GTK_OBJECT (aboutwindow), "aboutwindow", aboutwindow); gtk_window_set_title (GTK_WINDOW (aboutwindow), _("About Baycom USB Transceiver Controller")); gtk_window_set_policy (GTK_WINDOW (aboutwindow), TRUE, TRUE, FALSE); gtk_window_set_wmclass (GTK_WINDOW (aboutwindow), "baycomusb", "baycomusb"); dialog_vbox1 = GTK_DIALOG (aboutwindow)->vbox; gtk_object_set_data (GTK_OBJECT (aboutwindow), "dialog_vbox1", dialog_vbox1); gtk_widget_show (dialog_vbox1); frame1 = gtk_frame_new (_("Baycom USB Transceiver Controller")); gtk_widget_ref (frame1); gtk_object_set_data_full (GTK_OBJECT (aboutwindow), "frame1", frame1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame1); gtk_box_pack_start (GTK_BOX (dialog_vbox1), frame1, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (frame1), 6); gtk_frame_set_label_align (GTK_FRAME (frame1), 0.5, 0.5); gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_ETCHED_OUT); vbox4 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox4); gtk_object_set_data_full (GTK_OBJECT (aboutwindow), "vbox4", vbox4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox4); gtk_container_add (GTK_CONTAINER (frame1), vbox4); label13 = gtk_label_new (_("Copyright 2000-2001")); gtk_widget_ref (label13); gtk_object_set_data_full (GTK_OBJECT (aboutwindow), "label13", label13, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label13); gtk_box_pack_start (GTK_BOX (vbox4), label13, TRUE, TRUE, 0); label14 = gtk_label_new (_("Thomas Sailer, HB9JNX")); gtk_widget_ref (label14); gtk_object_set_data_full (GTK_OBJECT (aboutwindow), "label14", label14, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label14); gtk_box_pack_start (GTK_BOX (vbox4), label14, TRUE, TRUE, 0); dialog_action_area1 = GTK_DIALOG (aboutwindow)->action_area; gtk_object_set_data (GTK_OBJECT (aboutwindow), "dialog_action_area1", dialog_action_area1); gtk_widget_show (dialog_action_area1); gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 10); hbuttonbox1 = gtk_hbutton_box_new (); gtk_widget_ref (hbuttonbox1); gtk_object_set_data_full (GTK_OBJECT (aboutwindow), "hbuttonbox1", hbuttonbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbuttonbox1); gtk_box_pack_start (GTK_BOX (dialog_action_area1), hbuttonbox1, FALSE, FALSE, 0); aboutok = gtk_button_new_with_label (_("Ok")); gtk_widget_ref (aboutok); gtk_object_set_data_full (GTK_OBJECT (aboutwindow), "aboutok", aboutok, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (aboutok); gtk_container_add (GTK_CONTAINER (hbuttonbox1), aboutok); GTK_WIDGET_SET_FLAGS (aboutok, GTK_CAN_DEFAULT); return aboutwindow; } GtkWidget* create_errordialog (void) { GtkWidget *errordialog; GtkWidget *dialog_vbox3; GtkWidget *errorlabel; GtkWidget *dialog_action_area3; GtkWidget *hbuttonbox3; GtkWidget *errorok; GtkAccelGroup *accel_group; accel_group = gtk_accel_group_new (); errordialog = gtk_dialog_new (); gtk_object_set_data (GTK_OBJECT (errordialog), "errordialog", errordialog); gtk_window_set_title (GTK_WINDOW (errordialog), _("Error")); gtk_window_set_modal (GTK_WINDOW (errordialog), TRUE); gtk_window_set_policy (GTK_WINDOW (errordialog), TRUE, TRUE, FALSE); gtk_window_set_wmclass (GTK_WINDOW (errordialog), "baycomusb", "baycomusb"); dialog_vbox3 = GTK_DIALOG (errordialog)->vbox; gtk_object_set_data (GTK_OBJECT (errordialog), "dialog_vbox3", dialog_vbox3); gtk_widget_show (dialog_vbox3); errorlabel = gtk_label_new (_("Error")); gtk_widget_ref (errorlabel); gtk_object_set_data_full (GTK_OBJECT (errordialog), "errorlabel", errorlabel, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (errorlabel); gtk_box_pack_start (GTK_BOX (dialog_vbox3), errorlabel, TRUE, TRUE, 0); gtk_label_set_line_wrap (GTK_LABEL (errorlabel), TRUE); gtk_misc_set_padding (GTK_MISC (errorlabel), 6, 6); dialog_action_area3 = GTK_DIALOG (errordialog)->action_area; gtk_object_set_data (GTK_OBJECT (errordialog), "dialog_action_area3", dialog_action_area3); gtk_widget_show (dialog_action_area3); gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area3), 10); hbuttonbox3 = gtk_hbutton_box_new (); gtk_widget_ref (hbuttonbox3); gtk_object_set_data_full (GTK_OBJECT (errordialog), "hbuttonbox3", hbuttonbox3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbuttonbox3); gtk_box_pack_start (GTK_BOX (dialog_action_area3), hbuttonbox3, TRUE, TRUE, 0); errorok = gtk_button_new_with_label (_("OK")); gtk_widget_ref (errorok); gtk_object_set_data_full (GTK_OBJECT (errordialog), "errorok", errorok, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (errorok); gtk_container_add (GTK_CONTAINER (hbuttonbox3), errorok); GTK_WIDGET_SET_FLAGS (errorok, GTK_CAN_DEFAULT); gtk_widget_add_accelerator (errorok, "clicked", accel_group, GDK_Return, 0, GTK_ACCEL_VISIBLE); gtk_window_add_accel_group (GTK_WINDOW (errordialog), accel_group); return errordialog; } GtkWidget* create_terminalwindow (void) { GtkWidget *terminalwindow; GtkWidget *scrolledwindow1; GtkWidget *text; terminalwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (terminalwindow), "terminalwindow", terminalwindow); gtk_window_set_title (GTK_WINDOW (terminalwindow), _("T7F Terminal")); gtk_window_set_default_size (GTK_WINDOW (terminalwindow), 250, 150); gtk_window_set_policy (GTK_WINDOW (terminalwindow), TRUE, TRUE, FALSE); gtk_window_set_wmclass (GTK_WINDOW (terminalwindow), "baycomusb", "baycomusb"); scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (scrolledwindow1); gtk_object_set_data_full (GTK_OBJECT (terminalwindow), "scrolledwindow1", scrolledwindow1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (scrolledwindow1); gtk_container_add (GTK_CONTAINER (terminalwindow), scrolledwindow1); text = gtk_text_new (NULL, NULL); gtk_widget_ref (text); gtk_object_set_data_full (GTK_OBJECT (terminalwindow), "text", text, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (text); gtk_container_add (GTK_CONTAINER (scrolledwindow1), text); gtk_widget_set_events (text, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_signal_connect (GTK_OBJECT (terminalwindow), "delete_event", GTK_SIGNAL_FUNC (on_terminalwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (text), "key_press_event", GTK_SIGNAL_FUNC (on_text_key_press_event), NULL); gtk_signal_connect (GTK_OBJECT (text), "key_release_event", GTK_SIGNAL_FUNC (on_text_key_release_event), NULL); gtk_widget_grab_focus (text); return terminalwindow; } GtkWidget* create_chmemorywindow (void) { GtkWidget *chmemorywindow; GtkWidget *table5; GtkWidget *label61; GtkWidget *label62; GtkWidget *label63; GtkWidget *label64; GtkWidget *label65; GtkWidget *label66; GtkWidget *label67; GtkWidget *label68; GtkWidget *label69; GtkWidget *label70; GtkWidget *label71; GtkWidget *label73; GtkWidget *label72; GtkWidget *label77; GtkWidget *label76; GtkWidget *label75; GtkWidget *label74; GtkWidget *ch0a; GtkWidget *ch1a; GtkWidget *ch2a; GtkWidget *ch3a; GtkWidget *ch4a; GtkWidget *ch5a; GtkWidget *ch6a; GtkWidget *ch7a; GtkWidget *ch8a; GtkWidget *ch9a; GtkWidget *ch9b; GtkWidget *ch8b; GtkWidget *ch7b; GtkWidget *ch6b; GtkWidget *ch5b; GtkWidget *ch4b; GtkWidget *ch3b; GtkWidget *ch2b; GtkWidget *ch1b; GtkWidget *ch0b; GtkWidget *ch0c; GtkWidget *ch1c; GtkWidget *ch2c; GtkWidget *ch3c; GtkWidget *ch4c; GtkWidget *ch5c; GtkWidget *ch6c; GtkWidget *ch7c; GtkWidget *ch8c; GtkWidget *ch9c; GtkWidget *ch0d; GtkWidget *ch1d; GtkWidget *ch2d; GtkWidget *ch3d; GtkWidget *ch4d; GtkWidget *ch5d; GtkWidget *ch6d; GtkWidget *ch7d; GtkWidget *ch8d; GtkWidget *ch9d; chmemorywindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (chmemorywindow), "chmemorywindow", chmemorywindow); gtk_window_set_title (GTK_WINDOW (chmemorywindow), _("T7F Channel Memory")); gtk_window_set_wmclass (GTK_WINDOW (chmemorywindow), "baycomusb", "baycomusb"); table5 = gtk_table_new (12, 5, FALSE); gtk_widget_ref (table5); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "table5", table5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table5); gtk_container_add (GTK_CONTAINER (chmemorywindow), table5); label61 = gtk_label_new (_("Channel")); gtk_widget_ref (label61); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label61", label61, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label61); gtk_table_attach (GTK_TABLE (table5), label61, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (label61), 5, 0); label62 = gtk_label_new (_("0")); gtk_widget_ref (label62); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label62", label62, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label62); gtk_table_attach (GTK_TABLE (table5), label62, 0, 1, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label63 = gtk_label_new (_("1")); gtk_widget_ref (label63); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label63", label63, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label63); gtk_table_attach (GTK_TABLE (table5), label63, 0, 1, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label64 = gtk_label_new (_("2")); gtk_widget_ref (label64); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label64", label64, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label64); gtk_table_attach (GTK_TABLE (table5), label64, 0, 1, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label65 = gtk_label_new (_("3")); gtk_widget_ref (label65); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label65", label65, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label65); gtk_table_attach (GTK_TABLE (table5), label65, 0, 1, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label66 = gtk_label_new (_("4")); gtk_widget_ref (label66); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label66", label66, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label66); gtk_table_attach (GTK_TABLE (table5), label66, 0, 1, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label67 = gtk_label_new (_("5")); gtk_widget_ref (label67); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label67", label67, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label67); gtk_table_attach (GTK_TABLE (table5), label67, 0, 1, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label68 = gtk_label_new (_("6")); gtk_widget_ref (label68); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label68", label68, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label68); gtk_table_attach (GTK_TABLE (table5), label68, 0, 1, 8, 9, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label69 = gtk_label_new (_("7")); gtk_widget_ref (label69); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label69", label69, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label69); gtk_table_attach (GTK_TABLE (table5), label69, 0, 1, 9, 10, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label70 = gtk_label_new (_("8")); gtk_widget_ref (label70); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label70", label70, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label70); gtk_table_attach (GTK_TABLE (table5), label70, 0, 1, 10, 11, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label71 = gtk_label_new (_("9")); gtk_widget_ref (label71); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label71", label71, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label71); gtk_table_attach (GTK_TABLE (table5), label71, 0, 1, 11, 12, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label73 = gtk_label_new (_("25kHz Raster")); gtk_widget_ref (label73); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label73", label73, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label73); gtk_table_attach (GTK_TABLE (table5), label73, 3, 5, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (label73), 5, 0); label72 = gtk_label_new (_("12.5kHz Raster")); gtk_widget_ref (label72); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label72", label72, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label72); gtk_table_attach (GTK_TABLE (table5), label72, 1, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (label72), 5, 0); label77 = gtk_label_new (_("TX")); gtk_widget_ref (label77); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label77", label77, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label77); gtk_table_attach (GTK_TABLE (table5), label77, 4, 5, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label76 = gtk_label_new (_("RX")); gtk_widget_ref (label76); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label76", label76, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label76); gtk_table_attach (GTK_TABLE (table5), label76, 3, 4, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label75 = gtk_label_new (_("TX")); gtk_widget_ref (label75); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label75", label75, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label75); gtk_table_attach (GTK_TABLE (table5), label75, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); label74 = gtk_label_new (_("RX")); gtk_widget_ref (label74); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "label74", label74, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label74); gtk_table_attach (GTK_TABLE (table5), label74, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); ch0a = gtk_label_new (_("-")); gtk_widget_ref (ch0a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch0a", ch0a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch0a); gtk_table_attach (GTK_TABLE (table5), ch0a, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch0a), 5, 0); ch1a = gtk_label_new (_("-")); gtk_widget_ref (ch1a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch1a", ch1a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch1a); gtk_table_attach (GTK_TABLE (table5), ch1a, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch1a), 5, 0); ch2a = gtk_label_new (_("-")); gtk_widget_ref (ch2a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch2a", ch2a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch2a); gtk_table_attach (GTK_TABLE (table5), ch2a, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch2a), 5, 0); ch3a = gtk_label_new (_("-")); gtk_widget_ref (ch3a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch3a", ch3a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch3a); gtk_table_attach (GTK_TABLE (table5), ch3a, 1, 2, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch3a), 5, 0); ch4a = gtk_label_new (_("-")); gtk_widget_ref (ch4a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch4a", ch4a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch4a); gtk_table_attach (GTK_TABLE (table5), ch4a, 1, 2, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch4a), 5, 0); ch5a = gtk_label_new (_("-")); gtk_widget_ref (ch5a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch5a", ch5a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch5a); gtk_table_attach (GTK_TABLE (table5), ch5a, 1, 2, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch5a), 5, 0); ch6a = gtk_label_new (_("-")); gtk_widget_ref (ch6a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch6a", ch6a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch6a); gtk_table_attach (GTK_TABLE (table5), ch6a, 1, 2, 8, 9, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch6a), 5, 0); ch7a = gtk_label_new (_("-")); gtk_widget_ref (ch7a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch7a", ch7a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch7a); gtk_table_attach (GTK_TABLE (table5), ch7a, 1, 2, 9, 10, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch7a), 5, 0); ch8a = gtk_label_new (_("-")); gtk_widget_ref (ch8a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch8a", ch8a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch8a); gtk_table_attach (GTK_TABLE (table5), ch8a, 1, 2, 10, 11, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch8a), 5, 0); ch9a = gtk_label_new (_("-")); gtk_widget_ref (ch9a); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch9a", ch9a, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch9a); gtk_table_attach (GTK_TABLE (table5), ch9a, 1, 2, 11, 12, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch9a), 5, 0); ch9b = gtk_label_new (_("-")); gtk_widget_ref (ch9b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch9b", ch9b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch9b); gtk_table_attach (GTK_TABLE (table5), ch9b, 2, 3, 11, 12, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch9b), 5, 0); ch8b = gtk_label_new (_("-")); gtk_widget_ref (ch8b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch8b", ch8b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch8b); gtk_table_attach (GTK_TABLE (table5), ch8b, 2, 3, 10, 11, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch8b), 5, 0); ch7b = gtk_label_new (_("-")); gtk_widget_ref (ch7b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch7b", ch7b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch7b); gtk_table_attach (GTK_TABLE (table5), ch7b, 2, 3, 9, 10, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch7b), 5, 0); ch6b = gtk_label_new (_("-")); gtk_widget_ref (ch6b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch6b", ch6b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch6b); gtk_table_attach (GTK_TABLE (table5), ch6b, 2, 3, 8, 9, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch6b), 5, 0); ch5b = gtk_label_new (_("-")); gtk_widget_ref (ch5b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch5b", ch5b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch5b); gtk_table_attach (GTK_TABLE (table5), ch5b, 2, 3, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch5b), 5, 0); ch4b = gtk_label_new (_("-")); gtk_widget_ref (ch4b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch4b", ch4b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch4b); gtk_table_attach (GTK_TABLE (table5), ch4b, 2, 3, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch4b), 5, 0); ch3b = gtk_label_new (_("-")); gtk_widget_ref (ch3b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch3b", ch3b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch3b); gtk_table_attach (GTK_TABLE (table5), ch3b, 2, 3, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch3b), 5, 0); ch2b = gtk_label_new (_("-")); gtk_widget_ref (ch2b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch2b", ch2b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch2b); gtk_table_attach (GTK_TABLE (table5), ch2b, 2, 3, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch2b), 5, 0); ch1b = gtk_label_new (_("-")); gtk_widget_ref (ch1b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch1b", ch1b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch1b); gtk_table_attach (GTK_TABLE (table5), ch1b, 2, 3, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch1b), 5, 0); ch0b = gtk_label_new (_("-")); gtk_widget_ref (ch0b); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch0b", ch0b, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch0b); gtk_table_attach (GTK_TABLE (table5), ch0b, 2, 3, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch0b), 5, 0); ch0c = gtk_label_new (_("-")); gtk_widget_ref (ch0c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch0c", ch0c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch0c); gtk_table_attach (GTK_TABLE (table5), ch0c, 3, 4, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch0c), 5, 0); ch1c = gtk_label_new (_("-")); gtk_widget_ref (ch1c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch1c", ch1c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch1c); gtk_table_attach (GTK_TABLE (table5), ch1c, 3, 4, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch1c), 5, 0); ch2c = gtk_label_new (_("-")); gtk_widget_ref (ch2c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch2c", ch2c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch2c); gtk_table_attach (GTK_TABLE (table5), ch2c, 3, 4, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch2c), 5, 0); ch3c = gtk_label_new (_("-")); gtk_widget_ref (ch3c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch3c", ch3c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch3c); gtk_table_attach (GTK_TABLE (table5), ch3c, 3, 4, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch3c), 5, 0); ch4c = gtk_label_new (_("-")); gtk_widget_ref (ch4c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch4c", ch4c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch4c); gtk_table_attach (GTK_TABLE (table5), ch4c, 3, 4, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch4c), 5, 0); ch5c = gtk_label_new (_("-")); gtk_widget_ref (ch5c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch5c", ch5c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch5c); gtk_table_attach (GTK_TABLE (table5), ch5c, 3, 4, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch5c), 5, 0); ch6c = gtk_label_new (_("-")); gtk_widget_ref (ch6c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch6c", ch6c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch6c); gtk_table_attach (GTK_TABLE (table5), ch6c, 3, 4, 8, 9, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch6c), 5, 0); ch7c = gtk_label_new (_("-")); gtk_widget_ref (ch7c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch7c", ch7c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch7c); gtk_table_attach (GTK_TABLE (table5), ch7c, 3, 4, 9, 10, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch7c), 5, 0); ch8c = gtk_label_new (_("-")); gtk_widget_ref (ch8c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch8c", ch8c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch8c); gtk_table_attach (GTK_TABLE (table5), ch8c, 3, 4, 10, 11, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch8c), 5, 0); ch9c = gtk_label_new (_("-")); gtk_widget_ref (ch9c); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch9c", ch9c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch9c); gtk_table_attach (GTK_TABLE (table5), ch9c, 3, 4, 11, 12, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch9c), 5, 0); ch0d = gtk_label_new (_("-")); gtk_widget_ref (ch0d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch0d", ch0d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch0d); gtk_table_attach (GTK_TABLE (table5), ch0d, 4, 5, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch0d), 5, 0); ch1d = gtk_label_new (_("-")); gtk_widget_ref (ch1d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch1d", ch1d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch1d); gtk_table_attach (GTK_TABLE (table5), ch1d, 4, 5, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch1d), 5, 0); ch2d = gtk_label_new (_("-")); gtk_widget_ref (ch2d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch2d", ch2d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch2d); gtk_table_attach (GTK_TABLE (table5), ch2d, 4, 5, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch2d), 5, 0); ch3d = gtk_label_new (_("-")); gtk_widget_ref (ch3d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch3d", ch3d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch3d); gtk_table_attach (GTK_TABLE (table5), ch3d, 4, 5, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch3d), 5, 0); ch4d = gtk_label_new (_("-")); gtk_widget_ref (ch4d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch4d", ch4d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch4d); gtk_table_attach (GTK_TABLE (table5), ch4d, 4, 5, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch4d), 5, 0); ch5d = gtk_label_new (_("-")); gtk_widget_ref (ch5d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch5d", ch5d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch5d); gtk_table_attach (GTK_TABLE (table5), ch5d, 4, 5, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch5d), 5, 0); ch6d = gtk_label_new (_("-")); gtk_widget_ref (ch6d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch6d", ch6d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch6d); gtk_table_attach (GTK_TABLE (table5), ch6d, 4, 5, 8, 9, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch6d), 5, 0); ch7d = gtk_label_new (_("-")); gtk_widget_ref (ch7d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch7d", ch7d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch7d); gtk_table_attach (GTK_TABLE (table5), ch7d, 4, 5, 9, 10, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch7d), 5, 0); ch8d = gtk_label_new (_("-")); gtk_widget_ref (ch8d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch8d", ch8d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch8d); gtk_table_attach (GTK_TABLE (table5), ch8d, 4, 5, 10, 11, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch8d), 5, 0); ch9d = gtk_label_new (_("-")); gtk_widget_ref (ch9d); gtk_object_set_data_full (GTK_OBJECT (chmemorywindow), "ch9d", ch9d, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ch9d); gtk_table_attach (GTK_TABLE (table5), ch9d, 4, 5, 11, 12, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (ch9d), 5, 0); gtk_signal_connect (GTK_OBJECT (chmemorywindow), "delete_event", GTK_SIGNAL_FUNC (on_chmemorywindow_delete_event), NULL); return chmemorywindow; } GtkWidget* create_chprogwindow (void) { GtkWidget *chprogwindow; GtkWidget *vbox6; GtkWidget *table6; GtkObject *rxqrg_adj; GtkWidget *rxqrg; GtkObject *txqrg_adj; GtkWidget *txqrg; GtkWidget *label119; GtkWidget *label118; GtkWidget *label120; GtkWidget *label121; GtkObject *channel_adj; GtkWidget *channel; GtkWidget *raster; GtkWidget *label123; GtkWidget *label122; GtkWidget *hbuttonbox4; GtkWidget *chprogcancel; GtkWidget *chprogok; chprogwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (chprogwindow), "chprogwindow", chprogwindow); gtk_window_set_title (GTK_WINDOW (chprogwindow), _("Program Channel")); gtk_window_set_wmclass (GTK_WINDOW (chprogwindow), "baycomusb", "baycomusb"); vbox6 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox6); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "vbox6", vbox6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox6); gtk_container_add (GTK_CONTAINER (chprogwindow), vbox6); table6 = gtk_table_new (4, 3, FALSE); gtk_widget_ref (table6); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "table6", table6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table6); gtk_box_pack_start (GTK_BOX (vbox6), table6, TRUE, TRUE, 0); rxqrg_adj = gtk_adjustment_new (430, 430, 440, 0.025, 1, 1); rxqrg = gtk_spin_button_new (GTK_ADJUSTMENT (rxqrg_adj), 1, 4); gtk_widget_ref (rxqrg); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "rxqrg", rxqrg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (rxqrg); gtk_table_attach (GTK_TABLE (table6), rxqrg, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 3, 3); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (rxqrg), TRUE); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (rxqrg), TRUE); txqrg_adj = gtk_adjustment_new (430, 430, 440, 0.025, 1, 1); txqrg = gtk_spin_button_new (GTK_ADJUSTMENT (txqrg_adj), 1, 4); gtk_widget_ref (txqrg); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "txqrg", txqrg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (txqrg); gtk_table_attach (GTK_TABLE (table6), txqrg, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 3, 3); label119 = gtk_label_new (_("12.5kHz Raster")); gtk_widget_ref (label119); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "label119", label119, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label119); gtk_table_attach (GTK_TABLE (table6), label119, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label119), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label119), 5, 0); label118 = gtk_label_new (_("Channel")); gtk_widget_ref (label118); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "label118", label118, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label118); gtk_table_attach (GTK_TABLE (table6), label118, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label118), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label118), 5, 0); label120 = gtk_label_new (_("RX Frequency")); gtk_widget_ref (label120); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "label120", label120, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label120); gtk_table_attach (GTK_TABLE (table6), label120, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label120), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label120), 5, 0); label121 = gtk_label_new (_("TX Frequency")); gtk_widget_ref (label121); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "label121", label121, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label121); gtk_table_attach (GTK_TABLE (table6), label121, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label121), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label121), 5, 0); channel_adj = gtk_adjustment_new (0, 0, 9, 1, 1, 1); channel = gtk_spin_button_new (GTK_ADJUSTMENT (channel_adj), 1, 0); gtk_widget_ref (channel); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "channel", channel, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (channel); gtk_table_attach (GTK_TABLE (table6), channel, 1, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 3, 3); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (channel), TRUE); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (channel), TRUE); raster = gtk_check_button_new_with_label (""); gtk_widget_ref (raster); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "raster", raster, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (raster); gtk_table_attach (GTK_TABLE (table6), raster, 1, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 3, 3); label123 = gtk_label_new (_("MHz")); gtk_widget_ref (label123); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "label123", label123, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label123); gtk_table_attach (GTK_TABLE (table6), label123, 2, 3, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label123), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label123), 5, 0); label122 = gtk_label_new (_("MHz")); gtk_widget_ref (label122); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "label122", label122, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label122); gtk_table_attach (GTK_TABLE (table6), label122, 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label122), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label122), 5, 0); hbuttonbox4 = gtk_hbutton_box_new (); gtk_widget_ref (hbuttonbox4); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "hbuttonbox4", hbuttonbox4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbuttonbox4); gtk_box_pack_start (GTK_BOX (vbox6), hbuttonbox4, FALSE, TRUE, 0); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox4), GTK_BUTTONBOX_SPREAD); chprogcancel = gtk_button_new_with_label (_("Cancel")); gtk_widget_ref (chprogcancel); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "chprogcancel", chprogcancel, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (chprogcancel); gtk_container_add (GTK_CONTAINER (hbuttonbox4), chprogcancel); GTK_WIDGET_SET_FLAGS (chprogcancel, GTK_CAN_DEFAULT); chprogok = gtk_button_new_with_label (_("OK")); gtk_widget_ref (chprogok); gtk_object_set_data_full (GTK_OBJECT (chprogwindow), "chprogok", chprogok, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (chprogok); gtk_container_add (GTK_CONTAINER (hbuttonbox4), chprogok); GTK_WIDGET_SET_FLAGS (chprogok, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (chprogwindow), "delete_event", GTK_SIGNAL_FUNC (on_chprogwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (channel), "changed", GTK_SIGNAL_FUNC (on_chprog_channel_changed), NULL); gtk_signal_connect (GTK_OBJECT (raster), "toggled", GTK_SIGNAL_FUNC (on_chprog_raster_toggled), NULL); gtk_signal_connect (GTK_OBJECT (chprogcancel), "clicked", GTK_SIGNAL_FUNC (on_chprogcancel_clicked), NULL); gtk_signal_connect (GTK_OBJECT (chprogok), "clicked", GTK_SIGNAL_FUNC (on_chprogok_clicked), NULL); return chprogwindow; } GtkWidget* create_freqlistwindow (void) { GtkWidget *freqlistwindow; GtkWidget *vbox7; GtkWidget *scrolledwindow2; GtkWidget *freqlist; GtkWidget *label126; GtkWidget *label127; GtkWidget *label128; GtkWidget *label129; GtkWidget *hbuttonbox5; GtkWidget *buttonset; GtkWidget *buttonnew; GtkWidget *buttonupdate; GtkWidget *buttondelete; freqlistwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (freqlistwindow), "freqlistwindow", freqlistwindow); gtk_widget_set_usize (freqlistwindow, 600, 200); gtk_window_set_title (GTK_WINDOW (freqlistwindow), _("Frequency List")); gtk_window_set_wmclass (GTK_WINDOW (freqlistwindow), "baycomusb", "baycomusb"); vbox7 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox7); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "vbox7", vbox7, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox7); gtk_container_add (GTK_CONTAINER (freqlistwindow), vbox7); scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (scrolledwindow2); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "scrolledwindow2", scrolledwindow2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (scrolledwindow2); gtk_box_pack_start (GTK_BOX (vbox7), scrolledwindow2, TRUE, TRUE, 0); freqlist = gtk_clist_new (4); gtk_widget_ref (freqlist); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "freqlist", freqlist, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (freqlist); gtk_container_add (GTK_CONTAINER (scrolledwindow2), freqlist); gtk_clist_set_column_width (GTK_CLIST (freqlist), 0, 303); gtk_clist_set_column_width (GTK_CLIST (freqlist), 1, 80); gtk_clist_set_column_width (GTK_CLIST (freqlist), 2, 80); gtk_clist_set_column_width (GTK_CLIST (freqlist), 3, 80); gtk_clist_column_titles_show (GTK_CLIST (freqlist)); label126 = gtk_label_new (_("Station Name")); gtk_widget_ref (label126); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "label126", label126, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label126); gtk_clist_set_column_widget (GTK_CLIST (freqlist), 0, label126); label127 = gtk_label_new (_("RX")); gtk_widget_ref (label127); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "label127", label127, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label127); gtk_clist_set_column_widget (GTK_CLIST (freqlist), 1, label127); label128 = gtk_label_new (_("TX")); gtk_widget_ref (label128); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "label128", label128, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label128); gtk_clist_set_column_widget (GTK_CLIST (freqlist), 2, label128); label129 = gtk_label_new (_("Mode")); gtk_widget_ref (label129); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "label129", label129, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label129); gtk_clist_set_column_widget (GTK_CLIST (freqlist), 3, label129); hbuttonbox5 = gtk_hbutton_box_new (); gtk_widget_ref (hbuttonbox5); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "hbuttonbox5", hbuttonbox5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbuttonbox5); gtk_box_pack_start (GTK_BOX (vbox7), hbuttonbox5, FALSE, TRUE, 4); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox5), GTK_BUTTONBOX_SPREAD); buttonset = gtk_button_new_with_label (_("Set")); gtk_widget_ref (buttonset); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "buttonset", buttonset, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (buttonset); gtk_container_add (GTK_CONTAINER (hbuttonbox5), buttonset); GTK_WIDGET_SET_FLAGS (buttonset, GTK_CAN_DEFAULT); buttonnew = gtk_button_new_with_label (_("New")); gtk_widget_ref (buttonnew); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "buttonnew", buttonnew, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (buttonnew); gtk_container_add (GTK_CONTAINER (hbuttonbox5), buttonnew); GTK_WIDGET_SET_FLAGS (buttonnew, GTK_CAN_DEFAULT); buttonupdate = gtk_button_new_with_label (_("Update")); gtk_widget_ref (buttonupdate); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "buttonupdate", buttonupdate, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (buttonupdate); gtk_container_add (GTK_CONTAINER (hbuttonbox5), buttonupdate); GTK_WIDGET_SET_FLAGS (buttonupdate, GTK_CAN_DEFAULT); buttondelete = gtk_button_new_with_label (_("Delete")); gtk_widget_ref (buttondelete); gtk_object_set_data_full (GTK_OBJECT (freqlistwindow), "buttondelete", buttondelete, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (buttondelete); gtk_container_add (GTK_CONTAINER (hbuttonbox5), buttondelete); GTK_WIDGET_SET_FLAGS (buttondelete, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (freqlistwindow), "delete_event", GTK_SIGNAL_FUNC (on_freqlistwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (freqlist), "select_row", GTK_SIGNAL_FUNC (on_freqlist_select_row), NULL); gtk_signal_connect (GTK_OBJECT (freqlist), "unselect_row", GTK_SIGNAL_FUNC (on_freqlist_unselect_row), NULL); gtk_signal_connect (GTK_OBJECT (buttonset), "clicked", GTK_SIGNAL_FUNC (on_freqlistset_clicked), NULL); gtk_signal_connect (GTK_OBJECT (buttonnew), "clicked", GTK_SIGNAL_FUNC (on_freqlistnew_clicked), NULL); gtk_signal_connect (GTK_OBJECT (buttonupdate), "clicked", GTK_SIGNAL_FUNC (on_freqlistupdate_clicked), NULL); gtk_signal_connect (GTK_OBJECT (buttondelete), "clicked", GTK_SIGNAL_FUNC (on_freqlistdelete_clicked), NULL); return freqlistwindow; } GtkWidget* create_newstationwindow (void) { GtkWidget *newstationwindow; GtkWidget *vbox8; GtkWidget *table7; GtkWidget *label129; GtkWidget *label130; GtkWidget *label131; GtkWidget *stnname; GtkObject *rxqrg_adj; GtkWidget *rxqrg; GtkObject *txqrg_adj; GtkWidget *txqrg; GtkWidget *label133; GtkWidget *label132; GtkWidget *label141; GtkWidget *label142; GtkWidget *label147; GtkWidget *mode; GList *mode_items = NULL; GtkWidget *modeentry; GtkObject *bitraterx_adj; GtkWidget *bitraterx; GtkObject *bitratetx_adj; GtkWidget *bitratetx; GtkWidget *label143; GtkWidget *label146; GtkWidget *hbuttonbox6; GtkWidget *buttonok; GtkWidget *buttoncancel; newstationwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (newstationwindow), "newstationwindow", newstationwindow); gtk_window_set_title (GTK_WINDOW (newstationwindow), _("New Station")); gtk_window_set_policy (GTK_WINDOW (newstationwindow), FALSE, FALSE, FALSE); gtk_window_set_wmclass (GTK_WINDOW (newstationwindow), "baycomusb", "baycomusb"); vbox8 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox8); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "vbox8", vbox8, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox8); gtk_container_add (GTK_CONTAINER (newstationwindow), vbox8); table7 = gtk_table_new (6, 3, FALSE); gtk_widget_ref (table7); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "table7", table7, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table7); gtk_box_pack_start (GTK_BOX (vbox8), table7, FALSE, TRUE, 0); label129 = gtk_label_new (_("RX")); gtk_widget_ref (label129); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label129", label129, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label129); gtk_table_attach (GTK_TABLE (table7), label129, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label129), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label129), 5, 0); label130 = gtk_label_new (_("TX")); gtk_widget_ref (label130); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label130", label130, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label130); gtk_table_attach (GTK_TABLE (table7), label130, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label130), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label130), 5, 0); label131 = gtk_label_new (_("Station Name")); gtk_widget_ref (label131); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label131", label131, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label131); gtk_table_attach (GTK_TABLE (table7), label131, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label131), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label131), 5, 0); stnname = gtk_entry_new (); gtk_widget_ref (stnname); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "stnname", stnname, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (stnname); gtk_table_attach (GTK_TABLE (table7), stnname, 1, 3, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_widget_set_usize (stnname, 215, -2); rxqrg_adj = gtk_adjustment_new (430, 430, 440, 0.0125, 1, 1); rxqrg = gtk_spin_button_new (GTK_ADJUSTMENT (rxqrg_adj), 1, 4); gtk_widget_ref (rxqrg); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "rxqrg", rxqrg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (rxqrg); gtk_table_attach (GTK_TABLE (table7), rxqrg, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 4, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (rxqrg), TRUE); txqrg_adj = gtk_adjustment_new (430, 430, 440, 0.0125, 1, 1); txqrg = gtk_spin_button_new (GTK_ADJUSTMENT (txqrg_adj), 1, 4); gtk_widget_ref (txqrg); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "txqrg", txqrg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (txqrg); gtk_table_attach (GTK_TABLE (table7), txqrg, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 4, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (txqrg), TRUE); label133 = gtk_label_new (_("MHz")); gtk_widget_ref (label133); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label133", label133, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label133); gtk_table_attach (GTK_TABLE (table7), label133, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label133), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label133), 5, 0); label132 = gtk_label_new (_("MHz")); gtk_widget_ref (label132); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label132", label132, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label132); gtk_table_attach (GTK_TABLE (table7), label132, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label132), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label132), 5, 0); label141 = gtk_label_new (_("Mode")); gtk_widget_ref (label141); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label141", label141, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label141); gtk_table_attach (GTK_TABLE (table7), label141, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label141), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label141), 5, 0); label142 = gtk_label_new (_("Bitrate RX")); gtk_widget_ref (label142); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label142", label142, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label142); gtk_table_attach (GTK_TABLE (table7), label142, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label142), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label142), 5, 0); label147 = gtk_label_new (_("Bitrate TX")); gtk_widget_ref (label147); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label147", label147, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label147); gtk_table_attach (GTK_TABLE (table7), label147, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label147), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label147), 5, 0); mode = gtk_combo_new (); gtk_widget_ref (mode); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "mode", mode, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mode); gtk_table_attach (GTK_TABLE (table7), mode, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 4, 4); gtk_combo_set_value_in_list (GTK_COMBO (mode), TRUE, FALSE); mode_items = g_list_append (mode_items, _("-")); mode_items = g_list_append (mode_items, _("fsk")); mode_items = g_list_append (mode_items, _("afsk")); mode_items = g_list_append (mode_items, _("audio")); mode_items = g_list_append (mode_items, _("external")); gtk_combo_set_popdown_strings (GTK_COMBO (mode), mode_items); g_list_free (mode_items); modeentry = GTK_COMBO (mode)->entry; gtk_widget_ref (modeentry); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "modeentry", modeentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (modeentry); gtk_entry_set_editable (GTK_ENTRY (modeentry), FALSE); gtk_entry_set_text (GTK_ENTRY (modeentry), _("-")); bitraterx_adj = gtk_adjustment_new (9600, 1200, 310000, 1200, 9600, 9600); bitraterx = gtk_spin_button_new (GTK_ADJUSTMENT (bitraterx_adj), 1, 0); gtk_widget_ref (bitraterx); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "bitraterx", bitraterx, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (bitraterx); gtk_table_attach (GTK_TABLE (table7), bitraterx, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 4, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (bitraterx), TRUE); bitratetx_adj = gtk_adjustment_new (9600, 1200, 310000, 1200, 9600, 9600); bitratetx = gtk_spin_button_new (GTK_ADJUSTMENT (bitratetx_adj), 1, 0); gtk_widget_ref (bitratetx); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "bitratetx", bitratetx, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (bitratetx); gtk_table_attach (GTK_TABLE (table7), bitratetx, 1, 2, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 4, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (bitratetx), TRUE); label143 = gtk_label_new (_("Bit/s")); gtk_widget_ref (label143); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label143", label143, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label143); gtk_table_attach (GTK_TABLE (table7), label143, 2, 3, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label143), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label143), 5, 0); label146 = gtk_label_new (_("Bit/s")); gtk_widget_ref (label146); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "label146", label146, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label146); gtk_table_attach (GTK_TABLE (table7), label146, 2, 3, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label146), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label146), 5, 0); hbuttonbox6 = gtk_hbutton_box_new (); gtk_widget_ref (hbuttonbox6); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "hbuttonbox6", hbuttonbox6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbuttonbox6); gtk_box_pack_start (GTK_BOX (vbox8), hbuttonbox6, FALSE, TRUE, 5); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox6), GTK_BUTTONBOX_SPREAD); buttonok = gtk_button_new_with_label (_("OK")); gtk_widget_ref (buttonok); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "buttonok", buttonok, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (buttonok); gtk_container_add (GTK_CONTAINER (hbuttonbox6), buttonok); GTK_WIDGET_SET_FLAGS (buttonok, GTK_CAN_DEFAULT); buttoncancel = gtk_button_new_with_label (_("Cancel")); gtk_widget_ref (buttoncancel); gtk_object_set_data_full (GTK_OBJECT (newstationwindow), "buttoncancel", buttoncancel, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (buttoncancel); gtk_container_add (GTK_CONTAINER (hbuttonbox6), buttoncancel); GTK_WIDGET_SET_FLAGS (buttoncancel, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (newstationwindow), "delete_event", GTK_SIGNAL_FUNC (on_newstationwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (modeentry), "changed", GTK_SIGNAL_FUNC (on_newstnmodeentry_changed), NULL); gtk_signal_connect (GTK_OBJECT (buttonok), "clicked", GTK_SIGNAL_FUNC (on_newstnok_clicked), NULL); gtk_signal_connect (GTK_OBJECT (buttoncancel), "clicked", GTK_SIGNAL_FUNC (on_newstncancel_clicked), NULL); return newstationwindow; } GtkWidget* create_modemselectwindow (void) { GtkWidget *modemselectwindow; GtkWidget *vbox9; GtkWidget *scrolledwindow3; GtkWidget *modemlist; GtkWidget *label134; GtkWidget *label135; GtkWidget *label136; GtkWidget *hbuttonbox7; GtkWidget *modemselok; GtkWidget *modemselcancel; modemselectwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (modemselectwindow), "modemselectwindow", modemselectwindow); gtk_window_set_title (GTK_WINDOW (modemselectwindow), _("Modem/Transceiver Selection")); gtk_window_set_wmclass (GTK_WINDOW (modemselectwindow), "baycomusb", "baycomusb"); vbox9 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox9); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "vbox9", vbox9, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox9); gtk_container_add (GTK_CONTAINER (modemselectwindow), vbox9); scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (scrolledwindow3); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "scrolledwindow3", scrolledwindow3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (scrolledwindow3); gtk_box_pack_start (GTK_BOX (vbox9), scrolledwindow3, TRUE, TRUE, 0); modemlist = gtk_clist_new (3); gtk_widget_ref (modemlist); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "modemlist", modemlist, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (modemlist); gtk_container_add (GTK_CONTAINER (scrolledwindow3), modemlist); gtk_clist_set_column_width (GTK_CLIST (modemlist), 0, 141); gtk_clist_set_column_width (GTK_CLIST (modemlist), 1, 103); gtk_clist_set_column_width (GTK_CLIST (modemlist), 2, 80); gtk_clist_column_titles_show (GTK_CLIST (modemlist)); label134 = gtk_label_new (_("Manufacturer")); gtk_widget_ref (label134); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "label134", label134, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label134); gtk_clist_set_column_widget (GTK_CLIST (modemlist), 0, label134); label135 = gtk_label_new (_("Model")); gtk_widget_ref (label135); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "label135", label135, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label135); gtk_clist_set_column_widget (GTK_CLIST (modemlist), 1, label135); label136 = gtk_label_new (_("Serial Number")); gtk_widget_ref (label136); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "label136", label136, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label136); gtk_clist_set_column_widget (GTK_CLIST (modemlist), 2, label136); hbuttonbox7 = gtk_hbutton_box_new (); gtk_widget_ref (hbuttonbox7); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "hbuttonbox7", hbuttonbox7, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbuttonbox7); gtk_box_pack_start (GTK_BOX (vbox9), hbuttonbox7, FALSE, TRUE, 0); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox7), GTK_BUTTONBOX_SPREAD); modemselok = gtk_button_new_with_label (_("OK")); gtk_widget_ref (modemselok); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "modemselok", modemselok, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (modemselok); gtk_container_add (GTK_CONTAINER (hbuttonbox7), modemselok); GTK_WIDGET_SET_FLAGS (modemselok, GTK_CAN_DEFAULT); modemselcancel = gtk_button_new_with_label (_("Cancel")); gtk_widget_ref (modemselcancel); gtk_object_set_data_full (GTK_OBJECT (modemselectwindow), "modemselcancel", modemselcancel, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (modemselcancel); gtk_container_add (GTK_CONTAINER (hbuttonbox7), modemselcancel); GTK_WIDGET_SET_FLAGS (modemselcancel, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (modemselectwindow), "delete_event", GTK_SIGNAL_FUNC (on_modemselectwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (modemlist), "select_row", GTK_SIGNAL_FUNC (on_modemlist_select_row), NULL); gtk_signal_connect (GTK_OBJECT (modemlist), "unselect_row", GTK_SIGNAL_FUNC (on_modemlist_unselect_row), NULL); gtk_signal_connect (GTK_OBJECT (modemselok), "clicked", GTK_SIGNAL_FUNC (on_modemselok_clicked), NULL); gtk_signal_connect (GTK_OBJECT (modemselcancel), "clicked", GTK_SIGNAL_FUNC (on_modemselcancel_clicked), NULL); return modemselectwindow; } GtkWidget* create_configwindow (void) { GtkWidget *configwindow; GtkWidget *vbox1; GtkWidget *confignotebook; GtkWidget *table1; GtkWidget *label22; GtkWidget *label23; GtkWidget *label24; GtkWidget *label144; GtkWidget *adaptmode; GList *adaptmode_items = NULL; GtkWidget *adaptmodeentry; GtkObject *adaptfclk_adj; GtkWidget *adaptfclk; GtkWidget *label29; GtkObject *adaptbitraterx_adj; GtkWidget *adaptbitraterx; GtkWidget *label65; GtkObject *adaptbitratetx_adj; GtkWidget *adaptbitratetx; GtkWidget *label145; GtkWidget *label25; GtkWidget *label26; GtkWidget *adaptpttmute; GtkWidget *label27; GtkWidget *adaptfiltmode; GtkWidget *adaptfiltmodeentry; GtkWidget *adaptloopback; GList *adaptloopback_items = NULL; GtkWidget *adaptloopbackentry; GtkWidget *label18; GtkWidget *table8; GtkWidget *label64; GtkWidget *label28; GtkWidget *label66; GtkObject *adaptsamplerate_adj; GtkWidget *adaptsamplerate; GtkObject *adaptgain_adj; GtkWidget *adaptgain; GtkWidget *label150; GtkWidget *label149; GtkWidget *adaptaudiodevin; GtkWidget *adaptaudiodevinentry; GtkWidget *adaptaudiodevout; GtkWidget *adaptaudiodevoutentry; GtkWidget *adaptaudiosquelch; GtkWidget *adaptrfsquelch; GtkWidget *label152; GtkWidget *label153; GtkWidget *label148; GtkWidget *table2; GtkWidget *chaccfullduplex; GtkWidget *label34; GtkWidget *label33; GtkWidget *label32; GtkWidget *label31; GtkWidget *label30; GtkWidget *label35; GtkWidget *label36; GtkWidget *label37; GtkObject *chaccppersistence_adj; GtkWidget *chaccppersistence; GtkObject *chaccslottime_adj; GtkWidget *chaccslottime; GtkObject *chacctxtail_adj; GtkWidget *chacctxtail; GtkObject *chacctxdelay_adj; GtkWidget *chacctxdelay; GtkWidget *label19; GtkWidget *table3; GtkWidget *ifcfgifname; GList *ifcfgifname_items = NULL; GtkWidget *ifcfgifnameentry; GtkWidget *ifcfghwaddr; GtkWidget *ifcfgipaddr; GtkWidget *ifcfgnetmask; GtkWidget *ifcfgbroadcast; GtkWidget *label39; GtkWidget *label40; GtkWidget *label41; GtkWidget *label42; GtkWidget *label43; GtkWidget *label137; GtkWidget *label138; GtkWidget *label139; GtkWidget *label140; GtkWidget *ifcfggwhwaddr; GtkWidget *ifcfggwipaddr; GtkWidget *ifcfggwnetmask; GtkWidget *ifcfggwipmode; GList *ifcfggwipmode_items = NULL; GtkWidget *ifcfggwipmodeentry; GtkWidget *label20; GtkWidget *table5; GtkWidget *label53; GtkWidget *label52; GtkWidget *label51; GtkWidget *label50; GtkWidget *label49; GtkWidget *label48; GtkWidget *label47; GtkWidget *label46; GSList *mdisc4_group = NULL; GtkWidget *mdisc4l; GSList *mdisc5_group = NULL; GtkWidget *mdisc5l; GSList *mdisc6_group = NULL; GtkWidget *mdisc6l; GSList *mdisc7_group = NULL; GtkWidget *mdisc7l; GSList *mdisc3_group = NULL; GtkWidget *mdisc3l; GSList *mdisc1_group = NULL; GtkWidget *mdisc1l; GSList *mdisc2_group = NULL; GtkWidget *mdisc2l; GSList *mdisc0_group = NULL; GtkWidget *mdisc0l; GtkWidget *mdisc0h; GtkWidget *mdisc2h; GtkWidget *mdisc1h; GtkWidget *mdisc3h; GtkWidget *mdisc4h; GtkWidget *mdisc5h; GtkWidget *mdisc6h; GtkWidget *mdisc7h; GtkWidget *mdisc0t; GtkWidget *mdisc2t; GtkWidget *mdisc1t; GtkWidget *mdisc3t; GtkWidget *mdisc4t; GtkWidget *mdisc5t; GtkWidget *mdisc6t; GtkWidget *mdisc7t; GtkWidget *label55; GtkWidget *label54; GtkWidget *label56; GtkWidget *label57; GtkWidget *label58; GtkWidget *label59; GtkWidget *label60; GtkWidget *label61; GtkWidget *mdisctxd; GList *mdisctxd_items = NULL; GtkWidget *mdisctxdentry; GtkWidget *mdiscrxc; GList *mdiscrxc_items = NULL; GtkWidget *mdiscrxcentry; GtkWidget *mdisctxc; GList *mdisctxc_items = NULL; GtkWidget *mdisctxcentry; GtkWidget *label21; GtkWidget *hbuttonbox8; GtkWidget *configok; GtkWidget *configcancel; GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); configwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (configwindow), "configwindow", configwindow); gtk_window_set_title (GTK_WINDOW (configwindow), _("Baycom USB Adapter Configuration")); gtk_window_set_wmclass (GTK_WINDOW (configwindow), "baycomusb", "baycomusb"); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox1); gtk_object_set_data_full (GTK_OBJECT (configwindow), "vbox1", vbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (configwindow), vbox1); confignotebook = gtk_notebook_new (); gtk_widget_ref (confignotebook); gtk_object_set_data_full (GTK_OBJECT (configwindow), "confignotebook", confignotebook, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (confignotebook); gtk_box_pack_start (GTK_BOX (vbox1), confignotebook, TRUE, TRUE, 0); table1 = gtk_table_new (7, 3, FALSE); gtk_widget_ref (table1); gtk_object_set_data_full (GTK_OBJECT (configwindow), "table1", table1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table1); gtk_container_add (GTK_CONTAINER (confignotebook), table1); label22 = gtk_label_new (_("Mode")); gtk_widget_ref (label22); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label22", label22, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label22); gtk_table_attach (GTK_TABLE (table1), label22, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label22), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label22), 5, 0); label23 = gtk_label_new (_("FPGA clock")); gtk_widget_ref (label23); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label23", label23, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label23); gtk_table_attach (GTK_TABLE (table1), label23, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label23), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label23), 5, 0); label24 = gtk_label_new (_("Bitrate RX")); gtk_widget_ref (label24); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label24", label24, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label24); gtk_table_attach (GTK_TABLE (table1), label24, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label24), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label24), 5, 0); label144 = gtk_label_new (_("Bitrate TX")); gtk_widget_ref (label144); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label144", label144, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label144); gtk_table_attach (GTK_TABLE (table1), label144, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label144), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label144), 5, 0); adaptmode = gtk_combo_new (); gtk_widget_ref (adaptmode); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptmode", adaptmode, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptmode); gtk_table_attach (GTK_TABLE (table1), adaptmode, 1, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_combo_set_value_in_list (GTK_COMBO (adaptmode), TRUE, FALSE); gtk_combo_set_case_sensitive (GTK_COMBO (adaptmode), TRUE); adaptmode_items = g_list_append (adaptmode_items, _("fsk")); adaptmode_items = g_list_append (adaptmode_items, _("afsk")); adaptmode_items = g_list_append (adaptmode_items, _("external")); adaptmode_items = g_list_append (adaptmode_items, _("audio")); gtk_combo_set_popdown_strings (GTK_COMBO (adaptmode), adaptmode_items); g_list_free (adaptmode_items); adaptmodeentry = GTK_COMBO (adaptmode)->entry; gtk_widget_ref (adaptmodeentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptmodeentry", adaptmodeentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptmodeentry); gtk_entry_set_text (GTK_ENTRY (adaptmodeentry), _("fsk")); adaptfclk_adj = gtk_adjustment_new (1.96666e+07, 1e+06, 2.5e+07, 1, 10, 10); adaptfclk = gtk_spin_button_new (GTK_ADJUSTMENT (adaptfclk_adj), 1, 0); gtk_widget_ref (adaptfclk); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptfclk", adaptfclk, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptfclk); gtk_table_attach (GTK_TABLE (table1), adaptfclk, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); label29 = gtk_label_new (_("Hz")); gtk_widget_ref (label29); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label29", label29, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label29); gtk_table_attach (GTK_TABLE (table1), label29, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label29), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label29), 5, 0); adaptbitraterx_adj = gtk_adjustment_new (9600, 10, 310000, 1200, 9600, 9600); adaptbitraterx = gtk_spin_button_new (GTK_ADJUSTMENT (adaptbitraterx_adj), 1, 0); gtk_widget_ref (adaptbitraterx); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptbitraterx", adaptbitraterx, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptbitraterx); gtk_table_attach (GTK_TABLE (table1), adaptbitraterx, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_tooltips_set_tip (tooltips, adaptbitraterx, _("used only in FSK and EXTERNAL mode"), NULL); label65 = gtk_label_new (_("Bits/s")); gtk_widget_ref (label65); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label65", label65, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label65); gtk_table_attach (GTK_TABLE (table1), label65, 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label65), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label65), 5, 0); adaptbitratetx_adj = gtk_adjustment_new (9600, 10, 310000, 1200, 9600, 9600); adaptbitratetx = gtk_spin_button_new (GTK_ADJUSTMENT (adaptbitratetx_adj), 1, 0); gtk_widget_ref (adaptbitratetx); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptbitratetx", adaptbitratetx, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptbitratetx); gtk_table_attach (GTK_TABLE (table1), adaptbitratetx, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_tooltips_set_tip (tooltips, adaptbitratetx, _("used only in FSK and EXTERNAL mode"), NULL); label145 = gtk_label_new (_("Bits/s")); gtk_widget_ref (label145); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label145", label145, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label145); gtk_table_attach (GTK_TABLE (table1), label145, 2, 3, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label145), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label145), 5, 0); label25 = gtk_label_new (_("Loopback")); gtk_widget_ref (label25); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label25", label25, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label25); gtk_table_attach (GTK_TABLE (table1), label25, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label25), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label25), 5, 0); label26 = gtk_label_new (_("PTT Mute")); gtk_widget_ref (label26); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label26", label26, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label26); gtk_table_attach (GTK_TABLE (table1), label26, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label26), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label26), 5, 0); adaptpttmute = gtk_check_button_new_with_label (""); gtk_widget_ref (adaptpttmute); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptpttmute", adaptpttmute, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptpttmute); gtk_table_attach (GTK_TABLE (table1), adaptpttmute, 1, 3, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); label27 = gtk_label_new (_("Filter Mode")); gtk_widget_ref (label27); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label27", label27, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label27); gtk_table_attach (GTK_TABLE (table1), label27, 0, 1, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label27), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label27), 5, 0); adaptfiltmode = gtk_combo_new (); gtk_widget_ref (adaptfiltmode); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptfiltmode", adaptfiltmode, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptfiltmode); gtk_table_attach (GTK_TABLE (table1), adaptfiltmode, 1, 3, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_combo_set_value_in_list (GTK_COMBO (adaptfiltmode), TRUE, FALSE); gtk_combo_set_case_sensitive (GTK_COMBO (adaptfiltmode), TRUE); adaptfiltmodeentry = GTK_COMBO (adaptfiltmode)->entry; gtk_widget_ref (adaptfiltmodeentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptfiltmodeentry", adaptfiltmodeentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptfiltmodeentry); gtk_entry_set_text (GTK_ENTRY (adaptfiltmodeentry), _("0")); adaptloopback = gtk_combo_new (); gtk_widget_ref (adaptloopback); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptloopback", adaptloopback, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptloopback); gtk_table_attach (GTK_TABLE (table1), adaptloopback, 1, 3, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_combo_set_value_in_list (GTK_COMBO (adaptloopback), TRUE, FALSE); gtk_combo_set_case_sensitive (GTK_COMBO (adaptloopback), TRUE); adaptloopback_items = g_list_append (adaptloopback_items, _("0")); gtk_combo_set_popdown_strings (GTK_COMBO (adaptloopback), adaptloopback_items); g_list_free (adaptloopback_items); adaptloopbackentry = GTK_COMBO (adaptloopback)->entry; gtk_widget_ref (adaptloopbackentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptloopbackentry", adaptloopbackentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptloopbackentry); gtk_entry_set_text (GTK_ENTRY (adaptloopbackentry), _("0")); label18 = gtk_label_new (_("Adapter")); gtk_widget_ref (label18); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label18", label18, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label18); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confignotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confignotebook), 0), label18); table8 = gtk_table_new (6, 3, FALSE); gtk_widget_ref (table8); gtk_object_set_data_full (GTK_OBJECT (configwindow), "table8", table8, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table8); gtk_container_add (GTK_CONTAINER (confignotebook), table8); label64 = gtk_label_new (_("Sample Rate")); gtk_widget_ref (label64); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label64", label64, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label64); gtk_table_attach (GTK_TABLE (table8), label64, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label64), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label64), 5, 0); label28 = gtk_label_new (_("Gain")); gtk_widget_ref (label28); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label28", label28, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label28); gtk_table_attach (GTK_TABLE (table8), label28, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label28), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label28), 5, 0); label66 = gtk_label_new (_("Samples/s")); gtk_widget_ref (label66); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label66", label66, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label66); gtk_table_attach (GTK_TABLE (table8), label66, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label66), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label66), 5, 0); adaptsamplerate_adj = gtk_adjustment_new (8000, 8000, 24000, 1000, 8000, 8000); adaptsamplerate = gtk_spin_button_new (GTK_ADJUSTMENT (adaptsamplerate_adj), 1, 0); gtk_widget_ref (adaptsamplerate); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptsamplerate", adaptsamplerate, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptsamplerate); gtk_table_attach (GTK_TABLE (table8), adaptsamplerate, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_tooltips_set_tip (tooltips, adaptsamplerate, _("used only in AUDIO mode"), NULL); adaptgain_adj = gtk_adjustment_new (1, 0, 100, 0.1, 1, 10); adaptgain = gtk_spin_button_new (GTK_ADJUSTMENT (adaptgain_adj), 1, 3); gtk_widget_ref (adaptgain); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptgain", adaptgain, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptgain); gtk_table_attach (GTK_TABLE (table8), adaptgain, 1, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); label150 = gtk_label_new (_("Speaker Audio Device")); gtk_widget_ref (label150); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label150", label150, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label150); gtk_table_attach (GTK_TABLE (table8), label150, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label150), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label150), 5, 0); label149 = gtk_label_new (_("Microphone Audio Device")); gtk_widget_ref (label149); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label149", label149, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label149); gtk_table_attach (GTK_TABLE (table8), label149, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label149), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label149), 5, 0); adaptaudiodevin = gtk_combo_new (); gtk_widget_ref (adaptaudiodevin); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptaudiodevin", adaptaudiodevin, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptaudiodevin); gtk_table_attach (GTK_TABLE (table8), adaptaudiodevin, 1, 3, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_combo_set_case_sensitive (GTK_COMBO (adaptaudiodevin), TRUE); adaptaudiodevinentry = GTK_COMBO (adaptaudiodevin)->entry; gtk_widget_ref (adaptaudiodevinentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptaudiodevinentry", adaptaudiodevinentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptaudiodevinentry); gtk_entry_set_text (GTK_ENTRY (adaptaudiodevinentry), _("/dev/dsp")); adaptaudiodevout = gtk_combo_new (); gtk_widget_ref (adaptaudiodevout); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptaudiodevout", adaptaudiodevout, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptaudiodevout); gtk_table_attach (GTK_TABLE (table8), adaptaudiodevout, 1, 3, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_combo_set_case_sensitive (GTK_COMBO (adaptaudiodevout), TRUE); adaptaudiodevoutentry = GTK_COMBO (adaptaudiodevout)->entry; gtk_widget_ref (adaptaudiodevoutentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptaudiodevoutentry", adaptaudiodevoutentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptaudiodevoutentry); gtk_entry_set_text (GTK_ENTRY (adaptaudiodevoutentry), _("/dev/dsp")); adaptaudiosquelch = gtk_check_button_new_with_label (""); gtk_widget_ref (adaptaudiosquelch); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptaudiosquelch", adaptaudiosquelch, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptaudiosquelch); gtk_table_attach (GTK_TABLE (table8), adaptaudiosquelch, 1, 3, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); adaptrfsquelch = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (-120, -120, -35, 0, 0, 0))); gtk_widget_ref (adaptrfsquelch); gtk_object_set_data_full (GTK_OBJECT (configwindow), "adaptrfsquelch", adaptrfsquelch, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (adaptrfsquelch); gtk_table_attach (GTK_TABLE (table8), adaptrfsquelch, 1, 3, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_widget_set_usize (adaptrfsquelch, 150, -2); label152 = gtk_label_new (_("RF Squelch Level")); gtk_widget_ref (label152); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label152", label152, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label152); gtk_table_attach (GTK_TABLE (table8), label152, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label152), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label152), 5, 0); label153 = gtk_label_new (_("Audio Squelch")); gtk_widget_ref (label153); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label153", label153, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label153); gtk_table_attach (GTK_TABLE (table8), label153, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label153), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label153), 5, 0); label148 = gtk_label_new (_("Audio")); gtk_widget_ref (label148); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label148", label148, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label148); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confignotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confignotebook), 1), label148); table2 = gtk_table_new (5, 3, FALSE); gtk_widget_ref (table2); gtk_object_set_data_full (GTK_OBJECT (configwindow), "table2", table2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table2); gtk_container_add (GTK_CONTAINER (confignotebook), table2); chaccfullduplex = gtk_check_button_new_with_label (""); gtk_widget_ref (chaccfullduplex); gtk_object_set_data_full (GTK_OBJECT (configwindow), "chaccfullduplex", chaccfullduplex, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (chaccfullduplex); gtk_table_attach (GTK_TABLE (table2), chaccfullduplex, 1, 3, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 3, 3); label34 = gtk_label_new (_("Full Duplex")); gtk_widget_ref (label34); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label34", label34, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label34); gtk_table_attach (GTK_TABLE (table2), label34, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label34), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label34), 5, 0); label33 = gtk_label_new (_("P-Persistence")); gtk_widget_ref (label33); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label33", label33, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label33); gtk_table_attach (GTK_TABLE (table2), label33, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label33), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label33), 5, 0); label32 = gtk_label_new (_("SlotTime")); gtk_widget_ref (label32); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label32", label32, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label32); gtk_table_attach (GTK_TABLE (table2), label32, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label32), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label32), 5, 0); label31 = gtk_label_new (_("TxTail")); gtk_widget_ref (label31); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label31", label31, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label31); gtk_table_attach (GTK_TABLE (table2), label31, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label31), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label31), 5, 0); label30 = gtk_label_new (_("TxDelay")); gtk_widget_ref (label30); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label30", label30, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label30); gtk_table_attach (GTK_TABLE (table2), label30, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label30), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label30), 5, 0); label35 = gtk_label_new (_("ms")); gtk_widget_ref (label35); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label35", label35, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label35); gtk_table_attach (GTK_TABLE (table2), label35, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (label35), 5, 0); label36 = gtk_label_new (_("ms")); gtk_widget_ref (label36); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label36", label36, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label36); gtk_table_attach (GTK_TABLE (table2), label36, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (label36), 5, 0); label37 = gtk_label_new (_("ms")); gtk_widget_ref (label37); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label37", label37, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label37); gtk_table_attach (GTK_TABLE (table2), label37, 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_padding (GTK_MISC (label37), 5, 0); chaccppersistence_adj = gtk_adjustment_new (40, 0, 255, 1, 10, 10); chaccppersistence = gtk_spin_button_new (GTK_ADJUSTMENT (chaccppersistence_adj), 1, 0); gtk_widget_ref (chaccppersistence); gtk_object_set_data_full (GTK_OBJECT (configwindow), "chaccppersistence", chaccppersistence, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (chaccppersistence); gtk_table_attach (GTK_TABLE (table2), chaccppersistence, 1, 3, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); chaccslottime_adj = gtk_adjustment_new (100, 0, 2550, 10, 100, 100); chaccslottime = gtk_spin_button_new (GTK_ADJUSTMENT (chaccslottime_adj), 1, 0); gtk_widget_ref (chaccslottime); gtk_object_set_data_full (GTK_OBJECT (configwindow), "chaccslottime", chaccslottime, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (chaccslottime); gtk_table_attach (GTK_TABLE (table2), chaccslottime, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); chacctxtail_adj = gtk_adjustment_new (30, 0, 2550, 10, 100, 100); chacctxtail = gtk_spin_button_new (GTK_ADJUSTMENT (chacctxtail_adj), 1, 0); gtk_widget_ref (chacctxtail); gtk_object_set_data_full (GTK_OBJECT (configwindow), "chacctxtail", chacctxtail, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (chacctxtail); gtk_table_attach (GTK_TABLE (table2), chacctxtail, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); chacctxdelay_adj = gtk_adjustment_new (150, 0, 2550, 10, 100, 100); chacctxdelay = gtk_spin_button_new (GTK_ADJUSTMENT (chacctxdelay_adj), 1, 0); gtk_widget_ref (chacctxdelay); gtk_object_set_data_full (GTK_OBJECT (configwindow), "chacctxdelay", chacctxdelay, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (chacctxdelay); gtk_table_attach (GTK_TABLE (table2), chacctxdelay, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); label19 = gtk_label_new (_("Channel Access")); gtk_widget_ref (label19); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label19", label19, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label19); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confignotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confignotebook), 2), label19); table3 = gtk_table_new (9, 3, FALSE); gtk_widget_ref (table3); gtk_object_set_data_full (GTK_OBJECT (configwindow), "table3", table3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table3); gtk_container_add (GTK_CONTAINER (confignotebook), table3); ifcfgifname = gtk_combo_new (); gtk_widget_ref (ifcfgifname); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfgifname", ifcfgifname, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfgifname); gtk_table_attach (GTK_TABLE (table3), ifcfgifname, 1, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); ifcfgifname_items = g_list_append (ifcfgifname_items, _("bcu0")); ifcfgifname_items = g_list_append (ifcfgifname_items, _("bcu1")); ifcfgifname_items = g_list_append (ifcfgifname_items, _("bcu2")); ifcfgifname_items = g_list_append (ifcfgifname_items, _("bcu3")); gtk_combo_set_popdown_strings (GTK_COMBO (ifcfgifname), ifcfgifname_items); g_list_free (ifcfgifname_items); ifcfgifnameentry = GTK_COMBO (ifcfgifname)->entry; gtk_widget_ref (ifcfgifnameentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfgifnameentry", ifcfgifnameentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfgifnameentry); gtk_entry_set_text (GTK_ENTRY (ifcfgifnameentry), _("bcu0")); ifcfghwaddr = gtk_entry_new_with_max_length (9); gtk_widget_ref (ifcfghwaddr); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfghwaddr", ifcfghwaddr, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfghwaddr); gtk_table_attach (GTK_TABLE (table3), ifcfghwaddr, 1, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); ifcfgipaddr = gtk_entry_new_with_max_length (15); gtk_widget_ref (ifcfgipaddr); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfgipaddr", ifcfgipaddr, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfgipaddr); gtk_table_attach (GTK_TABLE (table3), ifcfgipaddr, 1, 3, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_entry_set_text (GTK_ENTRY (ifcfgipaddr), _("10.0.0.1")); ifcfgnetmask = gtk_entry_new_with_max_length (15); gtk_widget_ref (ifcfgnetmask); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfgnetmask", ifcfgnetmask, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfgnetmask); gtk_table_attach (GTK_TABLE (table3), ifcfgnetmask, 1, 3, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_entry_set_text (GTK_ENTRY (ifcfgnetmask), _("255.255.255.0")); ifcfgbroadcast = gtk_entry_new_with_max_length (15); gtk_widget_ref (ifcfgbroadcast); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfgbroadcast", ifcfgbroadcast, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfgbroadcast); gtk_table_attach (GTK_TABLE (table3), ifcfgbroadcast, 1, 3, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_entry_set_text (GTK_ENTRY (ifcfgbroadcast), _("10.0.0.255")); label39 = gtk_label_new (_("Interface Name")); gtk_widget_ref (label39); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label39", label39, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label39); gtk_table_attach (GTK_TABLE (table3), label39, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label39), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label39), 5, 0); label40 = gtk_label_new (_("Callsign")); gtk_widget_ref (label40); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label40", label40, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label40); gtk_table_attach (GTK_TABLE (table3), label40, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label40), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label40), 5, 0); label41 = gtk_label_new (_("IP Address")); gtk_widget_ref (label41); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label41", label41, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label41); gtk_table_attach (GTK_TABLE (table3), label41, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label41), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label41), 5, 0); label42 = gtk_label_new (_("Netmask")); gtk_widget_ref (label42); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label42", label42, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label42); gtk_table_attach (GTK_TABLE (table3), label42, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label42), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label42), 5, 0); label43 = gtk_label_new (_("IP Broadcast Address")); gtk_widget_ref (label43); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label43", label43, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label43); gtk_table_attach (GTK_TABLE (table3), label43, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label43), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label43), 5, 0); label137 = gtk_label_new (_("Gateway AX.25 Path")); gtk_widget_ref (label137); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label137", label137, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label137); gtk_table_attach (GTK_TABLE (table3), label137, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label137), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label137), 5, 0); label138 = gtk_label_new (_("Gateway IP Address")); gtk_widget_ref (label138); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label138", label138, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label138); gtk_table_attach (GTK_TABLE (table3), label138, 0, 1, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label138), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label138), 5, 0); label139 = gtk_label_new (_("Gateway Genmask")); gtk_widget_ref (label139); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label139", label139, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label139); gtk_table_attach (GTK_TABLE (table3), label139, 0, 1, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label139), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label139), 5, 0); label140 = gtk_label_new (_("Gateway IP Mode")); gtk_widget_ref (label140); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label140", label140, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label140); gtk_table_attach (GTK_TABLE (table3), label140, 0, 1, 8, 9, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label140), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label140), 5, 0); ifcfggwhwaddr = gtk_entry_new_with_max_length (80); gtk_widget_ref (ifcfggwhwaddr); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfggwhwaddr", ifcfggwhwaddr, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfggwhwaddr); gtk_table_attach (GTK_TABLE (table3), ifcfggwhwaddr, 1, 3, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); ifcfggwipaddr = gtk_entry_new_with_max_length (15); gtk_widget_ref (ifcfggwipaddr); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfggwipaddr", ifcfggwipaddr, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfggwipaddr); gtk_table_attach (GTK_TABLE (table3), ifcfggwipaddr, 1, 3, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); ifcfggwnetmask = gtk_entry_new_with_max_length (15); gtk_widget_ref (ifcfggwnetmask); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfggwnetmask", ifcfggwnetmask, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfggwnetmask); gtk_table_attach (GTK_TABLE (table3), ifcfggwnetmask, 1, 3, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); ifcfggwipmode = gtk_combo_new (); gtk_widget_ref (ifcfggwipmode); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfggwipmode", ifcfggwipmode, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfggwipmode); gtk_table_attach (GTK_TABLE (table3), ifcfggwipmode, 1, 3, 8, 9, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 3, 3); gtk_combo_set_value_in_list (GTK_COMBO (ifcfggwipmode), TRUE, FALSE); ifcfggwipmode_items = g_list_append (ifcfggwipmode_items, _("Default")); ifcfggwipmode_items = g_list_append (ifcfggwipmode_items, _("Virtual Circuit")); ifcfggwipmode_items = g_list_append (ifcfggwipmode_items, _("Datagram")); ifcfggwipmode_items = g_list_append (ifcfggwipmode_items, _("Compressed")); gtk_combo_set_popdown_strings (GTK_COMBO (ifcfggwipmode), ifcfggwipmode_items); g_list_free (ifcfggwipmode_items); ifcfggwipmodeentry = GTK_COMBO (ifcfggwipmode)->entry; gtk_widget_ref (ifcfggwipmodeentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "ifcfggwipmodeentry", ifcfggwipmodeentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ifcfggwipmodeentry); gtk_entry_set_text (GTK_ENTRY (ifcfggwipmodeentry), _("Default")); label20 = gtk_label_new (_("Interface")); gtk_widget_ref (label20); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label20", label20, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label20); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confignotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confignotebook), 3), label20); table5 = gtk_table_new (8, 6, FALSE); gtk_widget_ref (table5); gtk_object_set_data_full (GTK_OBJECT (configwindow), "table5", table5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table5); gtk_container_add (GTK_CONTAINER (confignotebook), table5); label53 = gtk_label_new (_("Pin 5")); gtk_widget_ref (label53); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label53", label53, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label53); gtk_table_attach (GTK_TABLE (table5), label53, 0, 1, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label53), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label53), 5, 0); label52 = gtk_label_new (_("Pin 7")); gtk_widget_ref (label52); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label52", label52, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label52); gtk_table_attach (GTK_TABLE (table5), label52, 0, 1, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label52), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label52), 5, 0); label51 = gtk_label_new (_("Pin 9")); gtk_widget_ref (label51); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label51", label51, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label51); gtk_table_attach (GTK_TABLE (table5), label51, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label51), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label51), 5, 0); label50 = gtk_label_new (_("Pin 11")); gtk_widget_ref (label50); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label50", label50, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label50); gtk_table_attach (GTK_TABLE (table5), label50, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label50), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label50), 5, 0); label49 = gtk_label_new (_("Pin 13")); gtk_widget_ref (label49); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label49", label49, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label49); gtk_table_attach (GTK_TABLE (table5), label49, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label49), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label49), 5, 0); label48 = gtk_label_new (_("Pin 15")); gtk_widget_ref (label48); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label48", label48, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label48); gtk_table_attach (GTK_TABLE (table5), label48, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label48), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label48), 5, 0); label47 = gtk_label_new (_("Pin 17")); gtk_widget_ref (label47); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label47", label47, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label47); gtk_table_attach (GTK_TABLE (table5), label47, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label47), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label47), 5, 0); label46 = gtk_label_new (_("Pin 19")); gtk_widget_ref (label46); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label46", label46, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label46); gtk_table_attach (GTK_TABLE (table5), label46, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label46), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label46), 5, 0); mdisc4l = gtk_radio_button_new_with_label (mdisc4_group, _("0")); mdisc4_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc4l)); gtk_widget_ref (mdisc4l); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc4l", mdisc4l, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc4l); gtk_table_attach (GTK_TABLE (table5), mdisc4l, 2, 3, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc5l = gtk_radio_button_new_with_label (mdisc5_group, _("0")); mdisc5_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc5l)); gtk_widget_ref (mdisc5l); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc5l", mdisc5l, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc5l); gtk_table_attach (GTK_TABLE (table5), mdisc5l, 2, 3, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc6l = gtk_radio_button_new_with_label (mdisc6_group, _("0")); mdisc6_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc6l)); gtk_widget_ref (mdisc6l); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc6l", mdisc6l, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc6l); gtk_table_attach (GTK_TABLE (table5), mdisc6l, 2, 3, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc7l = gtk_radio_button_new_with_label (mdisc7_group, _("0")); mdisc7_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc7l)); gtk_widget_ref (mdisc7l); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc7l", mdisc7l, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc7l); gtk_table_attach (GTK_TABLE (table5), mdisc7l, 2, 3, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc3l = gtk_radio_button_new_with_label (mdisc3_group, _("0")); mdisc3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc3l)); gtk_widget_ref (mdisc3l); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc3l", mdisc3l, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc3l); gtk_table_attach (GTK_TABLE (table5), mdisc3l, 2, 3, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc1l = gtk_radio_button_new_with_label (mdisc1_group, _("0")); mdisc1_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc1l)); gtk_widget_ref (mdisc1l); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc1l", mdisc1l, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc1l); gtk_table_attach (GTK_TABLE (table5), mdisc1l, 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc2l = gtk_radio_button_new_with_label (mdisc2_group, _("0")); mdisc2_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc2l)); gtk_widget_ref (mdisc2l); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc2l", mdisc2l, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc2l); gtk_table_attach (GTK_TABLE (table5), mdisc2l, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc0l = gtk_radio_button_new_with_label (mdisc0_group, _("0")); mdisc0_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc0l)); gtk_widget_ref (mdisc0l); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc0l", mdisc0l, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc0l); gtk_table_attach (GTK_TABLE (table5), mdisc0l, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc0h = gtk_radio_button_new_with_label (mdisc0_group, _("1")); mdisc0_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc0h)); gtk_widget_ref (mdisc0h); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc0h", mdisc0h, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc0h); gtk_table_attach (GTK_TABLE (table5), mdisc0h, 3, 4, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc2h = gtk_radio_button_new_with_label (mdisc2_group, _("1")); mdisc2_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc2h)); gtk_widget_ref (mdisc2h); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc2h", mdisc2h, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc2h); gtk_table_attach (GTK_TABLE (table5), mdisc2h, 3, 4, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc1h = gtk_radio_button_new_with_label (mdisc1_group, _("1")); mdisc1_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc1h)); gtk_widget_ref (mdisc1h); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc1h", mdisc1h, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc1h); gtk_table_attach (GTK_TABLE (table5), mdisc1h, 3, 4, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc3h = gtk_radio_button_new_with_label (mdisc3_group, _("1")); mdisc3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc3h)); gtk_widget_ref (mdisc3h); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc3h", mdisc3h, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc3h); gtk_table_attach (GTK_TABLE (table5), mdisc3h, 3, 4, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc4h = gtk_radio_button_new_with_label (mdisc4_group, _("1")); mdisc4_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc4h)); gtk_widget_ref (mdisc4h); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc4h", mdisc4h, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc4h); gtk_table_attach (GTK_TABLE (table5), mdisc4h, 3, 4, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc5h = gtk_radio_button_new_with_label (mdisc5_group, _("1")); mdisc5_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc5h)); gtk_widget_ref (mdisc5h); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc5h", mdisc5h, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc5h); gtk_table_attach (GTK_TABLE (table5), mdisc5h, 3, 4, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc6h = gtk_radio_button_new_with_label (mdisc6_group, _("1")); mdisc6_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc6h)); gtk_widget_ref (mdisc6h); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc6h", mdisc6h, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc6h); gtk_table_attach (GTK_TABLE (table5), mdisc6h, 3, 4, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc7h = gtk_radio_button_new_with_label (mdisc7_group, _("1")); mdisc7_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc7h)); gtk_widget_ref (mdisc7h); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc7h", mdisc7h, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc7h); gtk_table_attach (GTK_TABLE (table5), mdisc7h, 3, 4, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); mdisc0t = gtk_radio_button_new_with_label (mdisc0_group, _("Input")); mdisc0_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc0t)); gtk_widget_ref (mdisc0t); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc0t", mdisc0t, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc0t); gtk_table_attach (GTK_TABLE (table5), mdisc0t, 4, 5, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mdisc0t), TRUE); mdisc2t = gtk_radio_button_new_with_label (mdisc2_group, _("Input")); mdisc2_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc2t)); gtk_widget_ref (mdisc2t); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc2t", mdisc2t, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc2t); gtk_table_attach (GTK_TABLE (table5), mdisc2t, 4, 5, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mdisc2t), TRUE); mdisc1t = gtk_radio_button_new_with_label (mdisc1_group, _("Input")); mdisc1_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc1t)); gtk_widget_ref (mdisc1t); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc1t", mdisc1t, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc1t); gtk_table_attach (GTK_TABLE (table5), mdisc1t, 4, 5, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mdisc1t), TRUE); mdisc3t = gtk_radio_button_new_with_label (mdisc3_group, _("Input")); mdisc3_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc3t)); gtk_widget_ref (mdisc3t); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc3t", mdisc3t, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc3t); gtk_table_attach (GTK_TABLE (table5), mdisc3t, 4, 5, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mdisc3t), TRUE); mdisc4t = gtk_radio_button_new_with_label (mdisc4_group, _("Input")); mdisc4_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc4t)); gtk_widget_ref (mdisc4t); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc4t", mdisc4t, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc4t); gtk_table_attach (GTK_TABLE (table5), mdisc4t, 4, 5, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mdisc4t), TRUE); mdisc5t = gtk_radio_button_new_with_label (mdisc5_group, _("Input")); mdisc5_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc5t)); gtk_widget_ref (mdisc5t); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc5t", mdisc5t, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc5t); gtk_table_attach (GTK_TABLE (table5), mdisc5t, 4, 5, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mdisc5t), TRUE); mdisc6t = gtk_radio_button_new_with_label (mdisc6_group, _("Input")); mdisc6_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc6t)); gtk_widget_ref (mdisc6t); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc6t", mdisc6t, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc6t); gtk_table_attach (GTK_TABLE (table5), mdisc6t, 4, 5, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mdisc6t), TRUE); mdisc7t = gtk_radio_button_new_with_label (mdisc7_group, _("Input")); mdisc7_group = gtk_radio_button_group (GTK_RADIO_BUTTON (mdisc7t)); gtk_widget_ref (mdisc7t); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisc7t", mdisc7t, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisc7t); gtk_table_attach (GTK_TABLE (table5), mdisc7t, 4, 5, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 5, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mdisc7t), TRUE); label55 = gtk_label_new (_("RXC")); gtk_widget_ref (label55); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label55", label55, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label55); gtk_table_attach (GTK_TABLE (table5), label55, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label55), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label55), 5, 0); label54 = gtk_label_new (_("TXC")); gtk_widget_ref (label54); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label54", label54, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label54); gtk_table_attach (GTK_TABLE (table5), label54, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label54), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label54), 5, 0); label56 = gtk_label_new (_("RXD")); gtk_widget_ref (label56); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label56", label56, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label56); gtk_table_attach (GTK_TABLE (table5), label56, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label56), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label56), 5, 0); label57 = gtk_label_new (_("TXD")); gtk_widget_ref (label57); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label57", label57, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label57); gtk_table_attach (GTK_TABLE (table5), label57, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label57), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label57), 5, 0); label58 = gtk_label_new (_("/RTS")); gtk_widget_ref (label58); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label58", label58, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label58); gtk_table_attach (GTK_TABLE (table5), label58, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label58), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label58), 5, 0); label59 = gtk_label_new (_("/CTS")); gtk_widget_ref (label59); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label59", label59, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label59); gtk_table_attach (GTK_TABLE (table5), label59, 1, 2, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label59), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label59), 5, 0); label60 = gtk_label_new (_("/DCD")); gtk_widget_ref (label60); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label60", label60, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label60); gtk_table_attach (GTK_TABLE (table5), label60, 1, 2, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label60), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label60), 5, 0); label61 = gtk_label_new (_("/RES")); gtk_widget_ref (label61); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label61", label61, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label61); gtk_table_attach (GTK_TABLE (table5), label61, 1, 2, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label61), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label61), 5, 0); mdisctxd = gtk_combo_new (); gtk_widget_ref (mdisctxd); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisctxd", mdisctxd, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisctxd); gtk_table_attach (GTK_TABLE (table5), mdisctxd, 5, 6, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_combo_set_value_in_list (GTK_COMBO (mdisctxd), TRUE, FALSE); gtk_combo_set_case_sensitive (GTK_COMBO (mdisctxd), TRUE); mdisctxd_items = g_list_append (mdisctxd_items, _("Normal")); mdisctxd_items = g_list_append (mdisctxd_items, _("TxData")); gtk_combo_set_popdown_strings (GTK_COMBO (mdisctxd), mdisctxd_items); g_list_free (mdisctxd_items); mdisctxdentry = GTK_COMBO (mdisctxd)->entry; gtk_widget_ref (mdisctxdentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisctxdentry", mdisctxdentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisctxdentry); gtk_widget_set_usize (mdisctxdentry, 60, -2); gtk_tooltips_set_tip (tooltips, mdisctxdentry, _("selects the output signal if the internal FSK mode is used"), NULL); gtk_entry_set_text (GTK_ENTRY (mdisctxdentry), _("Normal")); mdiscrxc = gtk_combo_new (); gtk_widget_ref (mdiscrxc); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdiscrxc", mdiscrxc, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdiscrxc); gtk_table_attach (GTK_TABLE (table5), mdiscrxc, 5, 6, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_combo_set_value_in_list (GTK_COMBO (mdiscrxc), TRUE, FALSE); gtk_combo_set_case_sensitive (GTK_COMBO (mdiscrxc), TRUE); mdiscrxc_items = g_list_append (mdiscrxc_items, _("Normal")); mdiscrxc_items = g_list_append (mdiscrxc_items, _("TxData")); gtk_combo_set_popdown_strings (GTK_COMBO (mdiscrxc), mdiscrxc_items); g_list_free (mdiscrxc_items); mdiscrxcentry = GTK_COMBO (mdiscrxc)->entry; gtk_widget_ref (mdiscrxcentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdiscrxcentry", mdiscrxcentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdiscrxcentry); gtk_widget_set_usize (mdiscrxcentry, 60, -2); gtk_tooltips_set_tip (tooltips, mdiscrxcentry, _("selects the output signal if the internal FSK mode is used"), NULL); gtk_entry_set_text (GTK_ENTRY (mdiscrxcentry), _("Normal")); mdisctxc = gtk_combo_new (); gtk_widget_ref (mdisctxc); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisctxc", mdisctxc, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisctxc); gtk_table_attach (GTK_TABLE (table5), mdisctxc, 5, 6, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_combo_set_value_in_list (GTK_COMBO (mdisctxc), TRUE, FALSE); gtk_combo_set_case_sensitive (GTK_COMBO (mdisctxc), TRUE); mdisctxc_items = g_list_append (mdisctxc_items, _("Normal")); mdisctxc_items = g_list_append (mdisctxc_items, _("TxData")); gtk_combo_set_popdown_strings (GTK_COMBO (mdisctxc), mdisctxc_items); g_list_free (mdisctxc_items); mdisctxcentry = GTK_COMBO (mdisctxc)->entry; gtk_widget_ref (mdisctxcentry); gtk_object_set_data_full (GTK_OBJECT (configwindow), "mdisctxcentry", mdisctxcentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (mdisctxcentry); gtk_widget_set_usize (mdisctxcentry, 60, -2); gtk_tooltips_set_tip (tooltips, mdisctxcentry, _("selects the output signal if the internal FSK mode is used"), NULL); gtk_entry_set_text (GTK_ENTRY (mdisctxcentry), _("Normal")); label21 = gtk_label_new (_("Modem Disc")); gtk_widget_ref (label21); gtk_object_set_data_full (GTK_OBJECT (configwindow), "label21", label21, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label21); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confignotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confignotebook), 4), label21); hbuttonbox8 = gtk_hbutton_box_new (); gtk_widget_ref (hbuttonbox8); gtk_object_set_data_full (GTK_OBJECT (configwindow), "hbuttonbox8", hbuttonbox8, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbuttonbox8); gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox8, FALSE, FALSE, 0); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox8), GTK_BUTTONBOX_SPREAD); configok = gtk_button_new_with_label (_("OK")); gtk_widget_ref (configok); gtk_object_set_data_full (GTK_OBJECT (configwindow), "configok", configok, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (configok); gtk_container_add (GTK_CONTAINER (hbuttonbox8), configok); GTK_WIDGET_SET_FLAGS (configok, GTK_CAN_DEFAULT); configcancel = gtk_button_new_with_label (_("Cancel")); gtk_widget_ref (configcancel); gtk_object_set_data_full (GTK_OBJECT (configwindow), "configcancel", configcancel, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (configcancel); gtk_container_add (GTK_CONTAINER (hbuttonbox8), configcancel); GTK_WIDGET_SET_FLAGS (configcancel, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (configwindow), "delete_event", GTK_SIGNAL_FUNC (on_configwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (configok), "clicked", GTK_SIGNAL_FUNC (on_configwindowok_clicked), NULL); gtk_signal_connect (GTK_OBJECT (configcancel), "clicked", GTK_SIGNAL_FUNC (on_configwindowcancel_clicked), NULL); gtk_object_set_data (GTK_OBJECT (configwindow), "tooltips", tooltips); return configwindow; } GtkWidget* create_dtmfwindow (void) { GtkWidget *dtmfwindow; GtkWidget *vbox4; GtkWidget *frame4; GtkWidget *hbox2; GtkWidget *dtmfentry; GtkWidget *buttoncleardtmf; GtkWidget *frame5; GtkWidget *table4; GtkWidget *dtmf8; GtkWidget *dtmf9; GtkWidget *dtmfa; GtkWidget *dtmf4; GtkWidget *dtmf5; GtkWidget *dtmf6; GtkWidget *dtmfb; GtkWidget *dtmf1; GtkWidget *dtmf2; GtkWidget *dtmf3; GtkWidget *dtmfc; GtkWidget *dtmfe; GtkWidget *dtmf0; GtkWidget *dtmff; GtkWidget *dtmfd; GtkWidget *dtmf7; dtmfwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (dtmfwindow), "dtmfwindow", dtmfwindow); gtk_widget_set_events (dtmfwindow, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_window_set_title (GTK_WINDOW (dtmfwindow), _("DTMF Keypad")); gtk_window_set_wmclass (GTK_WINDOW (dtmfwindow), "baycomusb", "baycomusb"); vbox4 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox4); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "vbox4", vbox4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox4); gtk_container_add (GTK_CONTAINER (dtmfwindow), vbox4); frame4 = gtk_frame_new (_("Keys transmitted")); gtk_widget_ref (frame4); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "frame4", frame4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame4); gtk_box_pack_start (GTK_BOX (vbox4), frame4, FALSE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (frame4), 5); gtk_frame_set_label_align (GTK_FRAME (frame4), 0.01, 0.5); hbox2 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox2); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "hbox2", hbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbox2); gtk_container_add (GTK_CONTAINER (frame4), hbox2); dtmfentry = gtk_entry_new (); gtk_widget_ref (dtmfentry); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfentry", dtmfentry, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmfentry); gtk_box_pack_start (GTK_BOX (hbox2), dtmfentry, TRUE, TRUE, 0); gtk_entry_set_editable (GTK_ENTRY (dtmfentry), FALSE); buttoncleardtmf = gtk_button_new_with_label (_("Clear")); gtk_widget_ref (buttoncleardtmf); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "buttoncleardtmf", buttoncleardtmf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (buttoncleardtmf); gtk_box_pack_start (GTK_BOX (hbox2), buttoncleardtmf, FALSE, FALSE, 0); gtk_widget_set_usize (buttoncleardtmf, 50, -2); frame5 = gtk_frame_new (_("Keypad")); gtk_widget_ref (frame5); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "frame5", frame5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame5); gtk_box_pack_start (GTK_BOX (vbox4), frame5, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (frame5), 5); gtk_frame_set_label_align (GTK_FRAME (frame5), 0.01, 0.5); table4 = gtk_table_new (4, 4, FALSE); gtk_widget_ref (table4); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "table4", table4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table4); gtk_container_add (GTK_CONTAINER (frame5), table4); dtmf8 = gtk_button_new_with_label (_("8")); gtk_widget_ref (dtmf8); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf8", dtmf8, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf8); gtk_table_attach (GTK_TABLE (table4), dtmf8, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf9 = gtk_button_new_with_label (_("9")); gtk_widget_ref (dtmf9); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf9", dtmf9, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf9); gtk_table_attach (GTK_TABLE (table4), dtmf9, 2, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmfa = gtk_button_new_with_label (_("A")); gtk_widget_ref (dtmfa); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfa", dtmfa, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmfa); gtk_table_attach (GTK_TABLE (table4), dtmfa, 3, 4, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf4 = gtk_button_new_with_label (_("4")); gtk_widget_ref (dtmf4); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf4", dtmf4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf4); gtk_table_attach (GTK_TABLE (table4), dtmf4, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf5 = gtk_button_new_with_label (_("5")); gtk_widget_ref (dtmf5); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf5", dtmf5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf5); gtk_table_attach (GTK_TABLE (table4), dtmf5, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf6 = gtk_button_new_with_label (_("6")); gtk_widget_ref (dtmf6); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf6", dtmf6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf6); gtk_table_attach (GTK_TABLE (table4), dtmf6, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmfb = gtk_button_new_with_label (_("B")); gtk_widget_ref (dtmfb); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfb", dtmfb, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmfb); gtk_table_attach (GTK_TABLE (table4), dtmfb, 3, 4, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf1 = gtk_button_new_with_label (_("1")); gtk_widget_ref (dtmf1); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf1", dtmf1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf1); gtk_table_attach (GTK_TABLE (table4), dtmf1, 0, 1, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf2 = gtk_button_new_with_label (_("2")); gtk_widget_ref (dtmf2); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf2", dtmf2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf2); gtk_table_attach (GTK_TABLE (table4), dtmf2, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf3 = gtk_button_new_with_label (_("3")); gtk_widget_ref (dtmf3); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf3", dtmf3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf3); gtk_table_attach (GTK_TABLE (table4), dtmf3, 2, 3, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmfc = gtk_button_new_with_label (_("C")); gtk_widget_ref (dtmfc); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfc", dtmfc, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmfc); gtk_table_attach (GTK_TABLE (table4), dtmfc, 3, 4, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmfe = gtk_button_new_with_label (_("*")); gtk_widget_ref (dtmfe); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfe", dtmfe, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmfe); gtk_table_attach (GTK_TABLE (table4), dtmfe, 0, 1, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf0 = gtk_button_new_with_label (_("0")); gtk_widget_ref (dtmf0); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf0", dtmf0, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf0); gtk_table_attach (GTK_TABLE (table4), dtmf0, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmff = gtk_button_new_with_label (_("#")); gtk_widget_ref (dtmff); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmff", dtmff, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmff); gtk_table_attach (GTK_TABLE (table4), dtmff, 2, 3, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmfd = gtk_button_new_with_label (_("D")); gtk_widget_ref (dtmfd); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfd", dtmfd, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmfd); gtk_table_attach (GTK_TABLE (table4), dtmfd, 3, 4, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); dtmf7 = gtk_button_new_with_label (_("7")); gtk_widget_ref (dtmf7); gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf7", dtmf7, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dtmf7); gtk_table_attach (GTK_TABLE (table4), dtmf7, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_signal_connect (GTK_OBJECT (dtmfwindow), "key_press_event", GTK_SIGNAL_FUNC (on_dtmfwindow_key_event), NULL); gtk_signal_connect (GTK_OBJECT (dtmfwindow), "key_release_event", GTK_SIGNAL_FUNC (on_dtmfwindow_key_event), NULL); gtk_signal_connect (GTK_OBJECT (dtmfwindow), "delete_event", GTK_SIGNAL_FUNC (on_dtmfwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (buttoncleardtmf), "clicked", GTK_SIGNAL_FUNC (on_dtmfclear_clicked), NULL); gtk_signal_connect (GTK_OBJECT (dtmf8), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x18); gtk_signal_connect (GTK_OBJECT (dtmf8), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x08); gtk_signal_connect (GTK_OBJECT (dtmf9), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x19); gtk_signal_connect (GTK_OBJECT (dtmf9), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x09); gtk_signal_connect (GTK_OBJECT (dtmfa), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x1a); gtk_signal_connect (GTK_OBJECT (dtmfa), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x0a); gtk_signal_connect (GTK_OBJECT (dtmf4), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x14); gtk_signal_connect (GTK_OBJECT (dtmf4), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x04); gtk_signal_connect (GTK_OBJECT (dtmf5), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x15); gtk_signal_connect (GTK_OBJECT (dtmf5), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x05); gtk_signal_connect (GTK_OBJECT (dtmf6), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x16); gtk_signal_connect (GTK_OBJECT (dtmf6), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x06); gtk_signal_connect (GTK_OBJECT (dtmfb), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x1b); gtk_signal_connect (GTK_OBJECT (dtmfb), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x0b); gtk_signal_connect (GTK_OBJECT (dtmf1), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x11); gtk_signal_connect (GTK_OBJECT (dtmf1), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x01); gtk_signal_connect (GTK_OBJECT (dtmf2), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x12); gtk_signal_connect (GTK_OBJECT (dtmf2), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x02); gtk_signal_connect (GTK_OBJECT (dtmf3), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x13); gtk_signal_connect (GTK_OBJECT (dtmf3), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x03); gtk_signal_connect (GTK_OBJECT (dtmfc), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x1c); gtk_signal_connect (GTK_OBJECT (dtmfc), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x0c); gtk_signal_connect (GTK_OBJECT (dtmfe), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x1e); gtk_signal_connect (GTK_OBJECT (dtmfe), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x0e); gtk_signal_connect (GTK_OBJECT (dtmf0), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x10); gtk_signal_connect (GTK_OBJECT (dtmf0), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x00); gtk_signal_connect (GTK_OBJECT (dtmff), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x1f); gtk_signal_connect (GTK_OBJECT (dtmff), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x0f); gtk_signal_connect (GTK_OBJECT (dtmfd), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x1d); gtk_signal_connect (GTK_OBJECT (dtmfd), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x0d); gtk_signal_connect (GTK_OBJECT (dtmf7), "pressed", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x17); gtk_signal_connect (GTK_OBJECT (dtmf7), "released", GTK_SIGNAL_FUNC (on_dtmf_key), (gpointer)0x07); return dtmfwindow; } GtkWidget* create_spkscopewindow (void) { GtkWidget *spkscopewindow; GtkWidget *scope; spkscopewindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (spkscopewindow), "spkscopewindow", spkscopewindow); gtk_window_set_title (GTK_WINDOW (spkscopewindow), _("Baycom USB Speaker Scope")); gtk_window_set_wmclass (GTK_WINDOW (spkscopewindow), "baycomusb", "baycomusb"); scope = scope_new ("scope", NULL, NULL, 128, 0); gtk_widget_ref (scope); gtk_object_set_data_full (GTK_OBJECT (spkscopewindow), "scope", scope, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (scope); gtk_container_add (GTK_CONTAINER (spkscopewindow), scope); gtk_widget_set_usize (scope, 512, 256); GTK_WIDGET_UNSET_FLAGS (scope, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (scope, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (spkscopewindow), "delete_event", GTK_SIGNAL_FUNC (on_spkscopewindow_delete_event), NULL); return spkscopewindow; } GtkWidget* create_spkspectrumwindow (void) { GtkWidget *spkspectrumwindow; GtkWidget *spec; spkspectrumwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (spkspectrumwindow), "spkspectrumwindow", spkspectrumwindow); gtk_window_set_title (GTK_WINDOW (spkspectrumwindow), _("Baycom USB Speaker Spectrum")); gtk_window_set_wmclass (GTK_WINDOW (spkspectrumwindow), "baycomusb", "baycomusb"); spec = spectrum_new ("spec", NULL, NULL, 256, 0); gtk_widget_ref (spec); gtk_object_set_data_full (GTK_OBJECT (spkspectrumwindow), "spec", spec, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (spec); gtk_container_add (GTK_CONTAINER (spkspectrumwindow), spec); gtk_widget_set_usize (spec, 512, 256); GTK_WIDGET_UNSET_FLAGS (spec, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (spec, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (spkspectrumwindow), "delete_event", GTK_SIGNAL_FUNC (on_spkspectrumwindow_delete_event), NULL); return spkspectrumwindow; } GtkWidget* create_micscopewindow (void) { GtkWidget *micscopewindow; GtkWidget *scope; micscopewindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (micscopewindow), "micscopewindow", micscopewindow); gtk_window_set_title (GTK_WINDOW (micscopewindow), _("Baycom USB Microphone Scope")); gtk_window_set_wmclass (GTK_WINDOW (micscopewindow), "baycomusb", "baycomusb"); scope = scope_new ("scope", NULL, NULL, 128, 0); gtk_widget_ref (scope); gtk_object_set_data_full (GTK_OBJECT (micscopewindow), "scope", scope, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (scope); gtk_container_add (GTK_CONTAINER (micscopewindow), scope); gtk_widget_set_usize (scope, 512, 256); GTK_WIDGET_UNSET_FLAGS (scope, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (scope, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (micscopewindow), "delete_event", GTK_SIGNAL_FUNC (on_micscopewindow_delete_event), NULL); return micscopewindow; } GtkWidget* create_micspectrumwindow (void) { GtkWidget *micspectrumwindow; GtkWidget *spec; micspectrumwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (micspectrumwindow), "micspectrumwindow", micspectrumwindow); gtk_window_set_title (GTK_WINDOW (micspectrumwindow), _("Baycom USB Microphone Spectrum")); gtk_window_set_wmclass (GTK_WINDOW (micspectrumwindow), "baycomusb", "baycomusb"); spec = spectrum_new ("spec", NULL, NULL, 256, 0); gtk_widget_ref (spec); gtk_object_set_data_full (GTK_OBJECT (micspectrumwindow), "spec", spec, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (spec); gtk_container_add (GTK_CONTAINER (micspectrumwindow), spec); gtk_widget_set_usize (spec, 512, 256); GTK_WIDGET_UNSET_FLAGS (spec, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (spec, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (micspectrumwindow), "delete_event", GTK_SIGNAL_FUNC (on_micspectrumwindow_delete_event), NULL); return micspectrumwindow; } GtkWidget* create_paramwindow (void) { GtkWidget *paramwindow; GtkWidget *vbox10; GtkWidget *table9; GtkWidget *paramenablepttpkt; GtkWidget *label151; GtkWidget *hbuttonbox9; GtkWidget *paramok; GtkWidget *paramcancel; paramwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (paramwindow), "paramwindow", paramwindow); gtk_window_set_title (GTK_WINDOW (paramwindow), _("Baycom USB Adapter Parameters")); gtk_window_set_wmclass (GTK_WINDOW (paramwindow), "baycomusb", "baycomusb"); vbox10 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox10); gtk_object_set_data_full (GTK_OBJECT (paramwindow), "vbox10", vbox10, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox10); gtk_container_add (GTK_CONTAINER (paramwindow), vbox10); table9 = gtk_table_new (1, 3, FALSE); gtk_widget_ref (table9); gtk_object_set_data_full (GTK_OBJECT (paramwindow), "table9", table9, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table9); gtk_box_pack_start (GTK_BOX (vbox10), table9, TRUE, TRUE, 0); paramenablepttpkt = gtk_check_button_new_with_label (""); gtk_widget_ref (paramenablepttpkt); gtk_object_set_data_full (GTK_OBJECT (paramwindow), "paramenablepttpkt", paramenablepttpkt, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (paramenablepttpkt); gtk_table_attach (GTK_TABLE (table9), paramenablepttpkt, 1, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); label151 = gtk_label_new (_("Enable PTT for Packet")); gtk_widget_ref (label151); gtk_object_set_data_full (GTK_OBJECT (paramwindow), "label151", label151, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label151); gtk_table_attach (GTK_TABLE (table9), label151, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_misc_set_alignment (GTK_MISC (label151), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label151), 5, 0); hbuttonbox9 = gtk_hbutton_box_new (); gtk_widget_ref (hbuttonbox9); gtk_object_set_data_full (GTK_OBJECT (paramwindow), "hbuttonbox9", hbuttonbox9, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbuttonbox9); gtk_box_pack_start (GTK_BOX (vbox10), hbuttonbox9, FALSE, TRUE, 0); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox9), GTK_BUTTONBOX_SPREAD); paramok = gtk_button_new_with_label (_("OK")); gtk_widget_ref (paramok); gtk_object_set_data_full (GTK_OBJECT (paramwindow), "paramok", paramok, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (paramok); gtk_container_add (GTK_CONTAINER (hbuttonbox9), paramok); GTK_WIDGET_SET_FLAGS (paramok, GTK_CAN_DEFAULT); paramcancel = gtk_button_new_with_label (_("Cancel")); gtk_widget_ref (paramcancel); gtk_object_set_data_full (GTK_OBJECT (paramwindow), "paramcancel", paramcancel, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (paramcancel); gtk_container_add (GTK_CONTAINER (hbuttonbox9), paramcancel); GTK_WIDGET_SET_FLAGS (paramcancel, GTK_CAN_DEFAULT); gtk_signal_connect (GTK_OBJECT (paramwindow), "delete_event", GTK_SIGNAL_FUNC (on_paramwindow_delete_event), NULL); gtk_signal_connect (GTK_OBJECT (paramok), "clicked", GTK_SIGNAL_FUNC (on_paramwindowok_clicked), NULL); gtk_signal_connect (GTK_OBJECT (paramcancel), "clicked", GTK_SIGNAL_FUNC (on_paramwindowcancel_clicked), NULL); return paramwindow; } GtkWidget* create_audiopwrwindow (void) { GtkWidget *audiopwrwindow; GtkWidget *hbox5; GtkWidget *frame7; GtkWidget *hbox6; GtkWidget *frame9; GtkWidget *audiomicsig; GtkWidget *frame8; GtkWidget *hbox7; GtkWidget *frame10; GtkWidget *audiospksig; GtkWidget *frame11; GtkWidget *audiospknoise; audiopwrwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (audiopwrwindow), "audiopwrwindow", audiopwrwindow); gtk_window_set_title (GTK_WINDOW (audiopwrwindow), _("Baycom USB Audio Power Meters")); gtk_window_set_wmclass (GTK_WINDOW (audiopwrwindow), "baycomusb", "baycomusb"); hbox5 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox5); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "hbox5", hbox5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbox5); gtk_container_add (GTK_CONTAINER (audiopwrwindow), hbox5); frame7 = gtk_frame_new (_("Mic")); gtk_widget_ref (frame7); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "frame7", frame7, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame7); gtk_box_pack_start (GTK_BOX (hbox5), frame7, TRUE, TRUE, 0); hbox6 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox6); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "hbox6", hbox6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbox6); gtk_container_add (GTK_CONTAINER (frame7), hbox6); frame9 = gtk_frame_new (_("S")); gtk_widget_ref (frame9); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "frame9", frame9, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame9); gtk_box_pack_start (GTK_BOX (hbox6), frame9, TRUE, TRUE, 0); gtk_frame_set_label_align (GTK_FRAME (frame9), 0.5, 0.5); audiomicsig = gtk_progress_bar_new (); gtk_widget_ref (audiomicsig); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "audiomicsig", audiomicsig, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (audiomicsig); gtk_container_add (GTK_CONTAINER (frame9), audiomicsig); gtk_progress_configure (GTK_PROGRESS (audiomicsig), -40, -40, 0); gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (audiomicsig), GTK_PROGRESS_BOTTOM_TO_TOP); frame8 = gtk_frame_new (_("Spkr")); gtk_widget_ref (frame8); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "frame8", frame8, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame8); gtk_box_pack_start (GTK_BOX (hbox5), frame8, TRUE, TRUE, 0); hbox7 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox7); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "hbox7", hbox7, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (hbox7); gtk_container_add (GTK_CONTAINER (frame8), hbox7); frame10 = gtk_frame_new (_("S")); gtk_widget_ref (frame10); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "frame10", frame10, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame10); gtk_box_pack_start (GTK_BOX (hbox7), frame10, TRUE, TRUE, 0); gtk_frame_set_label_align (GTK_FRAME (frame10), 0.5, 0.5); audiospksig = gtk_progress_bar_new (); gtk_widget_ref (audiospksig); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "audiospksig", audiospksig, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (audiospksig); gtk_container_add (GTK_CONTAINER (frame10), audiospksig); gtk_progress_configure (GTK_PROGRESS (audiospksig), -40, -40, 0); gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (audiospksig), GTK_PROGRESS_BOTTOM_TO_TOP); frame11 = gtk_frame_new (_("N")); gtk_widget_ref (frame11); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "frame11", frame11, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame11); gtk_box_pack_start (GTK_BOX (hbox7), frame11, TRUE, TRUE, 0); gtk_frame_set_label_align (GTK_FRAME (frame11), 0.5, 0.5); audiospknoise = gtk_progress_bar_new (); gtk_widget_ref (audiospknoise); gtk_object_set_data_full (GTK_OBJECT (audiopwrwindow), "audiospknoise", audiospknoise, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (audiospknoise); gtk_container_add (GTK_CONTAINER (frame11), audiospknoise); gtk_progress_configure (GTK_PROGRESS (audiospknoise), -40, -40, 0); gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (audiospknoise), GTK_PROGRESS_BOTTOM_TO_TOP); gtk_signal_connect (GTK_OBJECT (audiopwrwindow), "delete_event", GTK_SIGNAL_FUNC (on_audiopwrwindow_delete_event), NULL); return audiopwrwindow; } baycomusb-0.10.orig/trxapp/src/interface.h0100644000175100017510000000135407340461304016632 0ustar abaaba/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ GtkWidget* create_mainwindow (void); GtkWidget* create_aboutwindow (void); GtkWidget* create_errordialog (void); GtkWidget* create_terminalwindow (void); GtkWidget* create_chmemorywindow (void); GtkWidget* create_chprogwindow (void); GtkWidget* create_freqlistwindow (void); GtkWidget* create_newstationwindow (void); GtkWidget* create_modemselectwindow (void); GtkWidget* create_configwindow (void); GtkWidget* create_dtmfwindow (void); GtkWidget* create_spkscopewindow (void); GtkWidget* create_spkspectrumwindow (void); GtkWidget* create_micscopewindow (void); GtkWidget* create_micspectrumwindow (void); GtkWidget* create_paramwindow (void); GtkWidget* create_audiopwrwindow (void); baycomusb-0.10.orig/trxapp/src/callbacks.h0100644000175100017510000002656007340437572016631 0ustar abaaba#include gboolean on_mainwindow_destroy_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); gboolean on_mainwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_freqlist_activate (GtkMenuItem *menuitem, gpointer user_data); void on_modemconfig_activate (GtkMenuItem *menuitem, gpointer user_data); void on_selectmodem_activate (GtkMenuItem *menuitem, gpointer user_data); void on_audioparams_activate (GtkMenuItem *menuitem, gpointer user_data); void on_quit_activate (GtkMenuItem *menuitem, gpointer user_data); void on_spkscope_activate (GtkMenuItem *menuitem, gpointer user_data); void on_spkspectrum_activate (GtkMenuItem *menuitem, gpointer user_data); void on_micscope_activate (GtkMenuItem *menuitem, gpointer user_data); void on_micspectrum_activate (GtkMenuItem *menuitem, gpointer user_data); void on_audiodtmf_activate (GtkMenuItem *menuitem, gpointer user_data); void on_audiopwrs_activate (GtkMenuItem *menuitem, gpointer user_data); void on_terminal_activate (GtkMenuItem *menuitem, gpointer user_data); void on_channelwindow_activate (GtkMenuItem *menuitem, gpointer user_data); void on_progchmem_activate (GtkMenuItem *menuitem, gpointer user_data); void on_about_activate (GtkMenuItem *menuitem, gpointer user_data); void on_qrg_changed (GtkEditable *editable, gpointer user_data); void on_stn_changed (GtkEditable *editable, gpointer user_data); void on_buttonptt_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_button1750_pressed (GtkButton *button, gpointer user_data); void on_button1750_released (GtkButton *button, gpointer user_data); GtkWidget* create_led_pixmap (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); GtkWidget* create_led_pixmap (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); GtkWidget* signalhistory_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); gboolean on_terminalwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); gboolean on_text_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); gboolean on_text_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); gboolean on_chmemorywindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); gboolean on_chprogwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_chprog_channel_changed (GtkEditable *editable, gpointer user_data); void on_chprog_raster_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_chprogcancel_clicked (GtkButton *button, gpointer user_data); void on_chprogok_clicked (GtkButton *button, gpointer user_data); gboolean on_freqlistwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_freqlist_select_row (GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data); void on_freqlist_unselect_row (GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data); void on_freqlistset_clicked (GtkButton *button, gpointer user_data); void on_freqlistnew_clicked (GtkButton *button, gpointer user_data); void on_freqlistupdate_clicked (GtkButton *button, gpointer user_data); void on_freqlistdelete_clicked (GtkButton *button, gpointer user_data); gboolean on_newstationwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_newstnmodeentry_changed (GtkEditable *editable, gpointer user_data); void on_newstnok_clicked (GtkButton *button, gpointer user_data); void on_newstncancel_clicked (GtkButton *button, gpointer user_data); gboolean on_modemselectwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_modemlist_select_row (GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data); void on_modemlist_unselect_row (GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data); void on_modemselok_clicked (GtkButton *button, gpointer user_data); void on_modemselcancel_clicked (GtkButton *button, gpointer user_data); gboolean on_configwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_configwindowok_clicked (GtkButton *button, gpointer user_data); void on_configwindowcancel_clicked (GtkButton *button, gpointer user_data); gboolean on_dtmfwindow_key_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); gboolean on_dtmfwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_dtmfclear_clicked (GtkButton *button, gpointer user_data); void on_dtmf_key (GtkButton *button, gpointer user_data); gboolean on_spkscopewindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); GtkWidget* scope_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); gboolean on_spkspectrumwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); GtkWidget* spectrum_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); gboolean on_micscopewindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); GtkWidget* scope_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); gboolean on_micspectrumwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); GtkWidget* spectrum_new (gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2); gboolean on_paramwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_paramwindowok_clicked (GtkButton *button, gpointer user_data); void on_paramwindowcancel_clicked (GtkButton *button, gpointer user_data); gboolean on_audiopwrwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); baycomusb-0.10.orig/trxapp/src/freqdb.c0100644000175100017510000006066507331546510016145 0ustar abaaba/*****************************************************************************/ /* * freqdb.c -- Station/Frequency "Data Base". * * Copyright (C) 2000, 2001 * Thomas Sailer (t.sailer@alumni.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include "trxapp.h" #ifdef WIN32 #include #else /* libxml includes */ #include #include #endif #include #include #include #include #include "sysdeps.h" /* ---------------------------------------------------------------------- */ #define MAXSTATIONS 256 static struct { unsigned int nrstn; struct stndb_entry stn[MAXSTATIONS]; } stns; /* ---------------------------------------------------------------------- */ #define DIGI(rx,tx,nm,md,br) { nm, rx*1e6, tx*1e6, md, br } #define RELAIS(rx,tx,nm) { nm, rx*1e6, tx*1e6, trxapi_baycomusb_mode_audio, 9600 } static const struct stndb_entry default_stations[] = { DIGI(430.600, 438.200, "HB9AJ-8 Biberstein JN47AJ DIEBOX", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.600, 438.200, "HB9IAP Onex/GE JN36BE RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.600, 438.200, "HB9IAC-11 Beauregard/NE JN37IB RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.625, 438.225, "HB9PD Ahorn, Eriswil JN37WB RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.650, 438.250, "HB9EAS Stierenberg JN37SH RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.650, 438.250, "HB9IAP Onex/GE JN36BE RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.650, 438.250, "HB9GR-7 Weisshorn GR JN46TT RMNC", trxapi_baycomusb_mode_afsk, 1200), //DIGI(430.675, 438.275, "HB9P/E Bütschelegg/BE JN36RU Echo", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.675, 438.275, "HB9P/E Buetschelegg/BE JN36RU Echo", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.725, 430.725, "HB9C-8 Bern JN36QV TCP/IP", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.725, 430.725, "HB9C-10 Bern JN36RW TCP/IP", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.750, 430.750, "HB9IG Gurten JN36RW XNET", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.750, 430.750, "HB9CC-11 St. Gallen JN47OK JNOS", trxapi_baycomusb_mode_fsk, 9600), DIGI(430.750, 430.750, "HB9CC Eggersriet JN47RK RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.800, 430.800, "HB9EI Motto Rotondo JN46KC RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.800, 438.400, "HB9IAP Onex/GE JN36BE RMNC", trxapi_baycomusb_mode_fsk, 9600), DIGI(430.875, 430.875, "HB9RF Rigi Staffel JN47FB RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.875, 430.875, "HB9CC-9 Berg TG JN47NN RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(430.975, 438.575, "HB9PD-7 Bern Spiegel JN36RW RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(433.625, 433.625, "HB9EA Corvatsch GR JN46VK RMNC", trxapi_baycomusb_mode_afsk, 1200), //DIGI(433.625, 433.625, "HB9IAP-10 Mont Pélerin VD JN36JL THENET", trxapi_baycomusb_mode_afsk, 1200), DIGI(433.625, 433.625, "HB9IAP-10 Mont Pelerin VD JN36JL THENET", trxapi_baycomusb_mode_afsk, 1200), DIGI(433.675, 433.675, "HB9PD-7 Bern Spiegel JN36RW RMNC", trxapi_baycomusb_mode_fsk, 9600), DIGI(433.725, 433.725, "HB9PB-7 Montoz JN37OF RMNC", trxapi_baycomusb_mode_afsk, 1200), //DIGI(433.725, 433.725, "HB9X Moléson JN36MN RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(433.725, 433.725, "HB9X Moleson JN36MN RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(433.725, 433.725, "HB9Y-8 Brig JN36XH F6FBB", trxapi_baycomusb_mode_afsk, 1200), DIGI(433.725, 433.725, "HB9Y-10 Moosalpe JN36WG RMNC", trxapi_baycomusb_mode_afsk, 1200), //DIGI(433.725, 433.725, "HB9GL Näfels JN47MC RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(433.725, 433.725, "HB9GL Naefels JN47MC RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(433.750, 433.750, "HB9FS Bad Ramsach BL JN37WJ RMNC", trxapi_baycomusb_mode_fsk, 9600), DIGI(433.775, 433.775, "HB9N Niederhorn JN36VR XNET", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.025, 438.025, "HB9H Bellinz./Artore JN46ME RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.050, 438.050, "HB9EAS-7 Basel/Bruderholz JN37SM RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.050, 438.050, "HB9OS-7 Siebnen SZ JN47KE RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.050, 438.050, "HB9C-8 Bern JN36QV TCP/IP", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.050, 438.050, "HB9F Ulmizberg JN36RV TNOS", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.075, 438.075, "HB9LU Luzern JN47CA RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.075, 438.075, "HB9HAI Weissfluhgipfel JN46VU RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.075, 438.075, "HB9HB Biel JN37OD TNOS", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.075, 438.075, "HB9HB Biel JN37OD TNOS", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.100, 438.100, "HB9FS Bad Ramsach BL JN37WJ RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.100, 438.100, "HB9IAC La Barillette JN36BK RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.125, 438.125, "HB9BI Lueg JN37UB RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.125, 438.125, "HB9CGB-8 Basel/Klybeck JN37TN DX-Clu", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.125, 438.125, "HB9AU Schaffhausen JN47HR TNN", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.125, 438.125, "HB9AU Schaffhausen JN47HR TNN", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.150, 438.150, "HB9FG-8 Fribourg JN36NT DIEBOX", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.150, 438.150, "HB9EAS-12 Basel/Bruderholz JN37SM RMNC", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.175, 438.175, "HB9CGB Basel/Rosental JN37TN RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.175, 438.175, "HB9N-7 Niederhorn JN36VR RMNC", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.225, 430.625, "HB9OS-7 Siebnen SZ JN47KE RMNC", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.275, 430.675, "HB9VC Kloten JN47HL RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.325, 430.725, "HB9F Ulmizberg JN36RV TNOS", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.375, 430.775, "HB9RF-7 Zugerberg JN47GD RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.375, 430.775, "HB9EH Burgdorf JN37TB TCP/IP", trxapi_baycomusb_mode_afsk, 1200), //DIGI(438.375, 430.775, "HB9X Moléson JN36MN RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.375, 430.775, "HB9X Moleson JN36MN RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.400, 430.800, "HB9LU Luzern JN47CA RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.400, 430.800, "HB9GR Buchserberg JN47RD RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.400, 430.800, "HB9W-14 Winterthur JN47IL RMNC", trxapi_baycomusb_mode_fsk, 9600), //DIGI(438.425, 430.825, "HB9OS Chäserrugg JN47PD RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.425, 430.825, "HB9OS Chaeserrugg JN47PD RMNC", trxapi_baycomusb_mode_afsk, 1200), //DIGI(438.425, 430.825, "HB9DA Nütziweid JN47BD RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.425, 430.825, "HB9DA Nuetziweid JN47BD RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.425, 430.825, "HB9CGB Basel/Rosental JN37TN RMNC", trxapi_baycomusb_mode_afsk, 1200), //DIGI(438.425, 430.825, "HB9IAP-13 Tête de Ran JN37KA RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.425, 430.825, "HB9IAP-13 Tete de Ran JN37KA RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.450, 430.850, "HB9IAC La Barillette JN36BK RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.450, 430.850, "HB9OK Alpe Foppa JN46KC RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.450, 430.850, "HB9OK Alpe Foppa JN46KC RMNC", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.475, 430.875, "HB9OK Alpe Foppa JN46KC RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.550, 430.950, "HB9ZRH Uetliberg JN47FI XNET", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.550, 430.950, "HB9ZRH Uetliberg JN47FI XNET", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.575, 430.975, "HB9CF Rigi Scheidegg JN47GA RMNC", trxapi_baycomusb_mode_afsk, 1200), //DIGI(438.600, 431.000, "HB9AK Hörnli JN47LI XNET", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.600, 431.000, "HB9AK Hoernli JN47LI XNET", trxapi_baycomusb_mode_afsk, 1200), //DIGI(438.600, 431.000, "HB9AK Hörnli JN47LI XNET", trxapi_baycomusb_mode_fsk, 9600), DIGI(438.600, 431.000, "HB9AK Hoernli JN47LI XNET", trxapi_baycomusb_mode_fsk, 9600), //DIGI(438.625, 431.025, "HB9W Brütten ZH JN47IL RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(438.625, 431.025, "HB9W Bruetten ZH JN47IL RMNC", trxapi_baycomusb_mode_afsk, 1200), DIGI(439.925, 432.325, "HB9IAP/E La Praz JN36FQ Echo", trxapi_baycomusb_mode_afsk, 1200), RELAIS(438.650, 431.050, "HB9UF Uetliberg JN47GI 870m ID \"U\" (UTO)"), RELAIS(438.650, 431.050, "HB9RW Chur JN46SU 590m"), RELAIS(438.650, 431.050, "HB9Y Roc Blanc JN36NI 1704m"), RELAIS(438.675, 431.075, "HB9RF Zug JN47FE 510m"), RELAIS(438.675, 431.075, "HB9BS Muttenz Basel JN37TM 285m"), RELAIS(438.675, 431.075, "HB9EI Monte Bar Lugano JN46MC 1816m <> Corvatsch /95"), RELAIS(438.675, 431.075, "HB9HAI Weissfluhgipfel JN46VT 2843m"), RELAIS(438.675, 431.075, "HB9Y Moosalpe JN36XH 1998m"), RELAIS(438.700, 431.100, "HB9BA Weissenstein JN37SG 1280m"), RELAIS(438.725, 431.125, "HB9XC Chasseral JN37MD 1607m"), //RELAIS(438.750, 431.150, "HB9UF Säntis JN47QG 2502m <> Corvatsch"), RELAIS(438.750, 431.150, "HB9UF Saentis JN47QG 2502m <> Corvatsch"), RELAIS(438.775, 431.175, "HB9FS Sissacherflue JN37VL 701m"), RELAIS(438.800, 431.200, "HB9UF Pilatus JN46DX 2120m ID \"P\""), RELAIS(438.825, 431.225, "HB9CF Fronalpstock SZ JN46HX 1900m"), RELAIS(438.850, 431.250, "HB9MM La Praz Lausanne JN36FQ 890m"), RELAIS(438.925, 431.325, "HB9F Bern JN36RW 540m"), //RELAIS(438.925, 431.325, "HB9HD Zürich Stadt m Projekt 7.1.96"), RELAIS(438.925, 431.325, "HB9HD Zuerich Stadt m Projekt 7.1.96"), RELAIS(438.925, 431.325, "HB9HD Kyburg JN47IL 625m <> Frauenfeld"), RELAIS(438.950, 431.350, "HB9AG Strihen JN47AK 850m"), RELAIS(438.975, 431.375, "HB9F Interlaken JN36WQ 593m"), RELAIS(438.975, 431.375, "HB9GL Mollis Fronalp JN47NB 1390m ID \"G\""), RELAIS(439.000, 431.400, "HB9FG Le Gibloux JN36MQ 1250m"), RELAIS(439.025, 431.425, "HB0FL Buchserberg JN47RD 1411m"), RELAIS(439.050, 431.450, "HB9F Niesen JN36TP 2362m"), RELAIS(439.050, 431.450, "HB9OK San Salvatore JN45LX 912m <> Monti Malmera"), RELAIS(439.050, 431.450, "HB9F Schilthorn JN36VN 2970m"), RELAIS(439.100, 431.500, "HB9G Petit Lancy JN36BE 450m"), RELAIS(439.100, 431.500, "HB9KF Basel JN37TN 270m"), RELAIS(439.150, 431.550, "HB9W Winterthur JN47IL 502m ID \"W\""), RELAIS(439.150, 431.550, "HB9F Burgdorf JN37TB 691m <> Ulmizberg"), RELAIS(439.225, 431.625, "HB9ZO Uster JN47II 460m"), RELAIS(439.375, 431.775, "HB9UF Corvatsch JN46VK 3295m <> HB9UF Säntis"), RELAIS(439.375, 431.775, "HB9XC Loveresse JN37OG 1224m") }; #undef DIGI #undef RELAIS /* ---------------------------------------------------------------------- */ static int updatelist(void); #ifdef WIN32 #define REGISTRYPATH "SOFTWARE\\FlexNet\\T7F" #define REGISTRYSTNPATH "Stations" #define REGISTRYKEY HKEY_CURRENT_USER static int deletekeyx(HKEY key) { char name[128]; LONG err; DWORD len; HKEY key2; int ret = 0; for (;;) { len = sizeof(name); if ((RegEnumKeyEx(key, 0, name, &len, NULL, NULL, NULL, NULL)) != ERROR_SUCCESS) return ret; if ((err = RegOpenKeyEx(key, name, 0, KEY_ALL_ACCESS, &key2)) != ERROR_SUCCESS) { g_printerr("RegOpenKeyEx(%s) returned 0x%lx\n", name, err); return -1; } ret |= deletekeyx(key2); RegCloseKey(key2); RegDeleteKey(key, name); } return ret; } static int deletekey(const char *name) { HKEY key; int ret; DWORD err; if ((err = RegOpenKeyEx(REGISTRYKEY, name, 0, KEY_ALL_ACCESS, &key)) != ERROR_SUCCESS) { g_printerr("RegOpenKeyEx(%s) returned 0x%lx\n", name, err); return -1; } ret = deletekeyx(key); RegCloseKey(key); RegDeleteKey(REGISTRYKEY, name); return ret; } static int deletestn(const char *newname) { char name[256]; snprintf(name, sizeof(name), "%s\\%s\\%s", REGISTRYPATH, REGISTRYSTNPATH, newname); return deletekey(name); } static int writestn(const struct stndb_entry *ent) { char name[256]; HKEY key; DWORD err, val; snprintf(name, sizeof(name), "%s\\%s\\%s", REGISTRYPATH, REGISTRYSTNPATH, ent->name); if ((err = RegCreateKeyEx(REGISTRYKEY, name, 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &key, NULL)) != ERROR_SUCCESS) { g_printerr("RegCreateKeyEx(%s) returned 0x%lx\n", name, err); return -1; } val = ent->rx; err = RegSetValueEx(key, "RX", 0, REG_DWORD, &val, sizeof(DWORD)); if (err != ERROR_SUCCESS) { RegCloseKey(key); g_printerr("RegSetValueEx(RX) returned 0x%lx\n", err); return -1; } val = ent->tx; err = RegSetValueEx(key, "TX", 0, REG_DWORD, &val, sizeof(DWORD)); if (err != ERROR_SUCCESS) { RegCloseKey(key); g_printerr("RegSetValueEx(TX) returned 0x%lx\n", err); return -1; } val = ent->mode; err = RegSetValueEx(key, "Mode", 0, REG_DWORD, &val, sizeof(DWORD)); if (err != ERROR_SUCCESS) { RegCloseKey(key); g_printerr("RegSetValueEx(Mode) returned 0x%lx\n", err); return -1; } val = ent->bitraterx; err = RegSetValueEx(key, "BitrateRx", 0, REG_DWORD, &val, sizeof(DWORD)); if (err != ERROR_SUCCESS) { RegCloseKey(key); g_printerr("RegSetValueEx(BitrateRx) returned 0x%lx\n", err); return -1; } val = ent->bitratetx; err = RegSetValueEx(key, "BitrateTx", 0, REG_DWORD, &val, sizeof(DWORD)); if (err != ERROR_SUCCESS) { RegCloseKey(key); g_printerr("RegSetValueEx(BitrateTx) returned 0x%lx\n", err); return -1; } RegCloseKey(key); return 0; } static int readstns(void) { char name[256]; HKEY regkey, regkey2; LONG err; DWORD regtype, regval, len; DWORD index = 0; stns.nrstn = 0; snprintf(name, sizeof(name), "%s\\%s", REGISTRYPATH, REGISTRYSTNPATH); if ((err = RegOpenKeyEx(REGISTRYKEY, name, 0, KEY_READ, ®key)) != ERROR_SUCCESS) { g_printerr("RegOpenKeyEx(%s) returned 0x%lx\n", name, err); return -1; } while (stns.nrstn < MAXSTATIONS) { len = sizeof(stns.stn[stns.nrstn].name); if ((RegEnumKeyEx(regkey, index, stns.stn[stns.nrstn].name, &len, NULL, NULL, NULL, NULL)) != ERROR_SUCCESS) break; index++; /* read RX and TX frequency */ if ((err = RegOpenKeyEx(regkey, stns.stn[stns.nrstn].name, 0, KEY_READ, ®key2)) != ERROR_SUCCESS) { g_printerr("RegOpenKeyEx(%s) returned 0x%lx\n", stns.stn[stns.nrstn].name, err); continue; } len = sizeof(regval); if (RegQueryValueEx(regkey2, "RX", NULL, ®type, (void *)®val, &len) != ERROR_SUCCESS || regtype != REG_DWORD) { g_printerr("RegQueryValueEx(RX) error\n"); regval = 435000; } stns.stn[stns.nrstn].rx = regval; len = sizeof(regval); if (RegQueryValueEx(regkey2, "TX", NULL, ®type, (void *)®val, &len) != ERROR_SUCCESS || regtype != REG_DWORD) { g_printerr("RegQueryValueEx(TX) error\n"); regval = 435000; } stns.stn[stns.nrstn].tx = regval; len = sizeof(regval); if (RegQueryValueEx(regkey2, "Mode", NULL, ®type, (void *)®val, &len) != ERROR_SUCCESS || regtype != REG_DWORD) { g_printerr("RegQueryValueEx(Mode) error\n"); regval = -1; } stns.stn[stns.nrstn].mode = regval; len = sizeof(regval); if (RegQueryValueEx(regkey2, "BitrateRx", NULL, ®type, (void *)®val, &len) != ERROR_SUCCESS || regtype != REG_DWORD) { g_printerr("RegQueryValueEx(BitrateRx) error\n"); regval = 9600; } stns.stn[stns.nrstn].bitraterx = regval; len = sizeof(regval); if (RegQueryValueEx(regkey2, "BitrateTx", NULL, ®type, (void *)®val, &len) != ERROR_SUCCESS || regtype != REG_DWORD) { g_printerr("RegQueryValueEx(BitrateTx) error\n"); regval = 9600; } stns.stn[stns.nrstn].bitratetx = regval; RegCloseKey(regkey2); stns.nrstn++; } RegCloseKey(regkey); return 0; } void stndb_open(void) { unsigned int i; if (updatelist()) { for (i = 0; i < sizeof(default_stations)/sizeof(default_stations[0]); i++) writestn(&default_stations[i]); } updatelist(); } void stndb_close(void) { } #else /* WIN32 */ static xmlDocPtr doc = NULL; static char cfgfile[512] = "/tmp/t7fstndb"; static int deletestn(const char *newname) { xmlNodePtr node; const char *name; for (node = doc->root->childs; node; node = node->next) { if (!node->name || strcmp(node->name, "station")) continue; name = xmlGetProp(node, "name"); if (!name) continue; if (!strcmp(name, newname)) { xmlUnlinkNode(node); xmlFreeNode(node); return 0; } } return -1; } static int writestn(const struct stndb_entry *ent) { xmlNodePtr node; char buf[32]; deletestn(ent->name); node = xmlNewChild(doc->root, NULL, "station", NULL); if (!node) return -1; xmlSetProp(node, "name", ent->name); snprintf(buf, sizeof(buf), "%lu", (unsigned long)ent->rx); xmlSetProp(node, "rx", buf); snprintf(buf, sizeof(buf), "%lu", (unsigned long)ent->tx); xmlSetProp(node, "tx", buf); snprintf(buf, sizeof(buf), "%d", ent->mode); xmlSetProp(node, "mode", buf); snprintf(buf, sizeof(buf), "%lu", ent->bitraterx); xmlSetProp(node, "bitraterx", buf); snprintf(buf, sizeof(buf), "%lu", ent->bitratetx); xmlSetProp(node, "bitratetx", buf); return 0; } static int readstns(void) { xmlNodePtr node; const char *name; stns.nrstn = 0; for (node = doc->root->childs; node; node = node->next) { if (!node->name || strcmp(node->name, "station")) continue; name = xmlGetProp(node, "name"); if (!name) continue; strncpy(stns.stn[stns.nrstn].name, name, sizeof(stns.stn[stns.nrstn].name)); stns.stn[stns.nrstn].rx = stns.stn[stns.nrstn].tx = 435000000; stns.stn[stns.nrstn].mode = -1; stns.stn[stns.nrstn].bitraterx = stns.stn[stns.nrstn].bitratetx = 9600; if ((name = xmlGetProp(node, "rx"))) stns.stn[stns.nrstn].rx = strtoul(name, NULL, 0); if ((name = xmlGetProp(node, "tx"))) stns.stn[stns.nrstn].tx = strtoul(name, NULL, 0); if ((name = xmlGetProp(node, "mode"))) stns.stn[stns.nrstn].mode = strtol(name, NULL, 0); if ((name = xmlGetProp(node, "bitraterx"))) stns.stn[stns.nrstn].bitraterx = strtoul(name, NULL, 0); if ((name = xmlGetProp(node, "bitratetx"))) stns.stn[stns.nrstn].bitratetx = strtoul(name, NULL, 0); stns.nrstn++; } return 0; } void stndb_open(void) { unsigned int i; char *home; if ((home = getenv("HOME"))) snprintf(cfgfile, sizeof(cfgfile), "%s/.t7fstndb", home); doc = xmlParseFile(cfgfile); if (doc && (!doc->root || !doc->root->name || strcmp(doc->root->name, "t7fstations"))) { g_printerr("t7f: Invalid configuration file %s\n", cfgfile); xmlFreeDoc(doc); doc = NULL; } if (!doc && (doc = xmlNewDoc("1.0"))) { doc->root = xmlNewDocNode(doc, NULL, "t7fstations", NULL); for (i = 0; i < sizeof(default_stations)/sizeof(default_stations[0]); i++) writestn(&default_stations[i]); } if (!doc || !doc->root) { g_printerr("t7f: out of memory\n"); exit(1); } updatelist(); } void stndb_close(void) { if (!xmlSaveFile(cfgfile, doc)) g_printerr("baycomusbtrx: error saving configuration file %s\n", cfgfile); xmlFreeDoc(doc); doc = NULL; } #endif /* WIN32 */ /* ---------------------------------------------------------------------- */ int stndb_delete(const char *name) { char n[MAXSTNNAME]; int ret; if (!name) return -1; strncpy(n, name, sizeof(n)); ret = deletestn(n); updatelist(); return ret; } int stndb_write(const struct stndb_entry *entry) { int ret; if (!entry->name[0]) return -1; ret = writestn(entry); updatelist(); return ret; } static int stncompare(struct stndb_entry *i, struct stndb_entry *j) { return strcmp(i->name, j->name); } static int updatelist(void) { int r; stns.nrstn = 0; r = readstns(); if (r) return r; if (!stns.nrstn) return 0; qsort(&stns.stn[0], stns.nrstn, sizeof(stns.stn[0]), stncompare); return 0; } GList *stndb_list(GList *list) { unsigned int i; for (i = 0; i < stns.nrstn; i++) list = g_list_append(list, stns.stn[i].name); return list; } void stndb_clist(GtkCList *clist) { unsigned int i; char buf[4][MAXSTNNAME]; gchar *xbuf[4]; gtk_clist_freeze(clist); gtk_clist_clear(clist); xbuf[0] = buf[0]; xbuf[1] = buf[1]; xbuf[2] = buf[2]; xbuf[3] = buf[3]; for (i = 0; i < stns.nrstn; i++) { strncpy(buf[0], stns.stn[i].name, sizeof(buf[0])); snprintf(buf[1], sizeof(buf[1]), "%9.4f", stns.stn[i].rx * (1.0 / 1000000.0)); snprintf(buf[2], sizeof(buf[2]), "%9.4f", stns.stn[i].tx * (1.0 / 1000000.0)); switch (stns.stn[i].mode) { case trxapi_baycomusb_mode_fsk: snprintf(buf[3], sizeof(buf[3]), "fsk %lu/%lu", stns.stn[i].bitraterx, stns.stn[i].bitratetx); break; case trxapi_baycomusb_mode_external: snprintf(buf[3], sizeof(buf[3]), "external"); break; case trxapi_baycomusb_mode_afsk: snprintf(buf[3], sizeof(buf[3]), "afsk"); break; case trxapi_baycomusb_mode_audio: snprintf(buf[3], sizeof(buf[3]), "audio"); break; default: snprintf(buf[3], sizeof(buf[3]), "-"); break; } gtk_clist_append(clist, xbuf); } gtk_clist_thaw(clist); } int stndb_retrieve(struct stndb_entry *entry) { unsigned int i; for (i = 0; i < stns.nrstn; i++) { #if 0 printf("Station %s RX %llu %llu TX %llu %llu\n", stns.stn[i].name, stns.stn[i].rx, rx, stns.stn[i].tx, tx); #endif if (entry->name[0] && strcmp(entry->name, stns.stn[i].name)) continue; if (entry->rx && entry->rx != stns.stn[i].rx) continue; if (entry->tx && entry->tx != stns.stn[i].tx) continue; if (entry->mode != -1 && stns.stn[i].mode != -1) { if (entry->mode != stns.stn[i].mode) continue; if (entry->mode == trxapi_baycomusb_mode_fsk) { if (entry->bitraterx && abs(entry->bitraterx - stns.stn[i].bitraterx) > 100) continue; if (entry->bitratetx && abs(entry->bitratetx - stns.stn[i].bitratetx) > 100) continue; } } *entry = stns.stn[i]; return 0; } return -1; } baycomusb-0.10.orig/trxapp/src/signalhist.h0100644000175100017510000000427007325134424017042 0ustar abaaba/* * Signal History Widget * Copyright (C) 2000 Thomas Sailer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __SIGNALHISTORY_H__ #define __SIGNALHISTORY_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define SIGNALHISTORY(obj) GTK_CHECK_CAST(obj, signalhistory_get_type(), Signalhistory) #define SIGNALHISTORY_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, signalhistory_get_type(), SignalhistoryClass) #define IS_SIGNALHISTORY(obj) GTK_CHECK_TYPE(obj, signalhistory_get_type()) typedef struct _Signalhistory Signalhistory; typedef struct _SignalhistoryClass SignalhistoryClass; #define SIGNALHISTORY_NUMSAMPLES 256 #define SIGNALHISTORY_WIDTH (SIGNALHISTORY_NUMSAMPLES) #define SIGNALHISTORY_HEIGHT 64 struct _Signalhistory { GtkWidget widget; guint idlefunc; GdkGC *col0_gc; GdkGC *col1_gc; GdkGC *col2_gc; GdkColor col0; GdkColor col1; GdkColor col2; GdkPixmap *pixmap; unsigned int ptr; struct signalhistdata { unsigned char sample; unsigned char col; } data[SIGNALHISTORY_WIDTH]; }; struct _SignalhistoryClass { GtkWidgetClass parent_class; }; guint signalhistory_get_type(void); GtkWidget* signalhistory_new(gchar *name, gchar *string1, gchar *string2, gint int1, gint int2); void signalhistory_newdata(Signalhistory *signalhistory, unsigned char sample, unsigned char col); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __SIGNALHISTORY_H__ */ baycomusb-0.10.orig/trxapp/src/signalhist.c0100644000175100017510000002511307325134424017034 0ustar abaaba/* * Signal History Widget * Copyright (C) 2000 Thomas Sailer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "signalhist.h" #include #include #include #include #include /* --------------------------------------------------------------------- */ #define PRIO G_PRIORITY_LOW static void signalhistory_class_init(SignalhistoryClass *klass); static void signalhistory_init(Signalhistory *signalhistory); static void signalhistory_finalize(GtkObject *object); static gint signalhistory_expose(GtkWidget *widget, GdkEventExpose *event); static void signalhistory_realize(GtkWidget *widget); static void signalhistory_unrealize(GtkWidget *widget); static void signalhistory_size_allocate(GtkWidget *widget, GtkAllocation *allocation); static void signalhistory_send_configure (Signalhistory *signalhistory); static gint idle_callback(gpointer data); static GtkWidgetClass *parent_class = NULL; static SignalhistoryClass *signalhistory_class = NULL; guint signalhistory_get_type(void) { static guint signalhistory_type = 0; if (!signalhistory_type) { static const GtkTypeInfo signalhistory_info = { "Signalhistory", sizeof(Signalhistory), sizeof(SignalhistoryClass), (GtkClassInitFunc)signalhistory_class_init, (GtkObjectInitFunc)signalhistory_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc)NULL, }; signalhistory_type = gtk_type_unique(gtk_widget_get_type(), &signalhistory_info); } return signalhistory_type; } static void signalhistory_class_init(SignalhistoryClass *klass) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*)klass; widget_class = (GtkWidgetClass*)klass; parent_class = gtk_type_class(gtk_widget_get_type()); signalhistory_class = klass; object_class->finalize = signalhistory_finalize; widget_class->expose_event = signalhistory_expose; widget_class->realize = signalhistory_realize; widget_class->unrealize = signalhistory_unrealize; widget_class->size_allocate = signalhistory_size_allocate; } static void signalhistory_init(Signalhistory *signalhistory) { signalhistory->idlefunc = 0; /* initialize the colors */ signalhistory->col0.red = 39322; signalhistory->col0.green = 60948; signalhistory->col0.blue = 39322; signalhistory->col1.red = 3277; signalhistory->col1.green = 60948; signalhistory->col1.blue = 0; signalhistory->col2.red = 65535; signalhistory->col2.green = 15073; signalhistory->col2.blue = 0; signalhistory->col0_gc = signalhistory->col1_gc = signalhistory->col2_gc = NULL; signalhistory->pixmap = NULL; /* initialize the data */ memset(&signalhistory->data, 0, sizeof(signalhistory->data)); signalhistory->ptr = 0; } static void signalhistory_realize(GtkWidget *widget) { Signalhistory *signalhistory; GdkWindowAttr attributes; gint attributes_mask; GdkGCValues gc_values; g_return_if_fail(widget != NULL); g_return_if_fail(IS_SIGNALHISTORY(widget)); signalhistory = SIGNALHISTORY(widget); GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.colormap = gtk_widget_get_colormap(widget); attributes.event_mask = gtk_widget_get_events(widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gdk_window_set_user_data(widget->window, signalhistory); widget->style = gtk_style_attach(widget->style, widget->window); gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL); /* gc's if necessary */ if (!gdk_color_alloc(widget->style->colormap, &signalhistory->col0)) g_warning("unable to allocate color: ( %d %d %d )", signalhistory->col0.red, signalhistory->col0.green, signalhistory->col0.blue); gc_values.foreground = signalhistory->col0; signalhistory->col0_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); if (!gdk_color_alloc(widget->style->colormap, &signalhistory->col1)) g_warning("unable to allocate color: ( %d %d %d )", signalhistory->col1.red, signalhistory->col1.green, signalhistory->col1.blue); gc_values.foreground = signalhistory->col1; signalhistory->col1_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); if (!gdk_color_alloc(widget->style->colormap, &signalhistory->col2)) g_warning("unable to allocate color: ( %d %d %d )", signalhistory->col2.red, signalhistory->col2.green, signalhistory->col2.blue); gc_values.foreground = signalhistory->col2; signalhistory->col2_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); /* create backing store */ signalhistory->pixmap = gdk_pixmap_new(widget->window, SIGNALHISTORY_WIDTH, SIGNALHISTORY_HEIGHT, -1); signalhistory_send_configure(SIGNALHISTORY(widget)); } static void signalhistory_unrealize(GtkWidget *widget) { Signalhistory *signalhistory; g_return_if_fail(widget != NULL); g_return_if_fail(IS_SIGNALHISTORY(widget)); signalhistory = SIGNALHISTORY(widget); if (signalhistory->idlefunc) gtk_idle_remove(signalhistory->idlefunc); if (signalhistory->col0_gc) gtk_gc_release(signalhistory->col0_gc); if (signalhistory->col1_gc) gtk_gc_release(signalhistory->col1_gc); if (signalhistory->col2_gc) gtk_gc_release(signalhistory->col2_gc); signalhistory->col0_gc = signalhistory->col1_gc = signalhistory->col2_gc = NULL; if (signalhistory->pixmap) gdk_pixmap_unref(signalhistory->pixmap); signalhistory->pixmap = NULL; if (GTK_WIDGET_CLASS(parent_class)->unrealize) (*GTK_WIDGET_CLASS(parent_class)->unrealize)(widget); } static void signalhistory_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { g_return_if_fail(widget != NULL); g_return_if_fail(IS_SIGNALHISTORY(widget)); g_return_if_fail(allocation != NULL); widget->allocation = *allocation; widget->allocation.width = SIGNALHISTORY_WIDTH; widget->allocation.height = SIGNALHISTORY_HEIGHT; if (GTK_WIDGET_REALIZED(widget)) { gdk_window_move_resize (widget->window, allocation->x, allocation->y, allocation->width, allocation->height); signalhistory_send_configure(SIGNALHISTORY(widget)); } } static void signalhistory_send_configure(Signalhistory *signalhistory) { GtkWidget *widget; GdkEventConfigure event; widget = GTK_WIDGET(signalhistory); event.type = GDK_CONFIGURE; event.window = widget->window; event.send_event = TRUE; event.x = widget->allocation.x; event.y = widget->allocation.y; event.width = widget->allocation.width; event.height = widget->allocation.height; gtk_widget_event(widget, (GdkEvent*)&event); } GtkWidget* signalhistory_new(gchar *name, gchar *string1, gchar *string2, gint int1, gint int2) { Signalhistory *signalhistory; signalhistory = gtk_type_new(signalhistory_get_type()); memset(&signalhistory->data, 0, sizeof(signalhistory->data)); signalhistory->ptr = 0; return GTK_WIDGET(signalhistory); } static void signalhistory_finalize(GtkObject *object) { g_return_if_fail(object != NULL); g_return_if_fail(IS_SIGNALHISTORY(object)); (*GTK_OBJECT_CLASS(parent_class)->finalize)(object); } static gint signalhistory_expose(GtkWidget *widget, GdkEventExpose *event) { Signalhistory *signalhistory; g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(IS_SIGNALHISTORY(widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE(widget)) { signalhistory = SIGNALHISTORY(widget); if (!signalhistory->idlefunc) signalhistory->idlefunc = gtk_idle_add_priority(PRIO, idle_callback, signalhistory); } return FALSE; } static void draw(Signalhistory *signalhistory) { guint i, j, ptr; GdkPoint pt[SIGNALHISTORY_WIDTH+1]; GtkWidget *widget; unsigned char col; widget = GTK_WIDGET(signalhistory); g_return_if_fail(GTK_WIDGET_DRAWABLE(widget)); g_return_if_fail(signalhistory->pixmap); /* clear window */ gdk_draw_rectangle(signalhistory->pixmap, widget->style->base_gc[widget->state], TRUE, 0, 0, widget->allocation.width, widget->allocation.height); /* draw data points */ ptr = signalhistory->ptr; for (i = 0; i < SIGNALHISTORY_WIDTH; ) { col = signalhistory->data[ptr].col; for (j = 0; i < SIGNALHISTORY_WIDTH;) { pt[j].x = i; pt[j].y = ((255-signalhistory->data[ptr].sample)*SIGNALHISTORY_HEIGHT) >> 8; j++; if (col != signalhistory->data[ptr].col) break; i++; ptr = (ptr + 1) % SIGNALHISTORY_WIDTH; } gdk_draw_lines(signalhistory->pixmap, (col == 0) ? signalhistory->col0_gc : ((col == 1) ? signalhistory->col1_gc : signalhistory->col2_gc), pt, j); } /* draw to screen */ gdk_draw_pixmap(widget->window, widget->style->base_gc[widget->state], signalhistory->pixmap, 0, 0, 0, 0, widget->allocation.width, widget->allocation.height); } static gint idle_callback(gpointer data) { g_return_val_if_fail(data != NULL, FALSE); g_return_val_if_fail(IS_SIGNALHISTORY(data), FALSE); SIGNALHISTORY(data)->idlefunc = 0; if (!GTK_WIDGET_DRAWABLE(GTK_WIDGET(data))) return FALSE; draw(SIGNALHISTORY(data)); return FALSE; /* don't call this callback again */ } void signalhistory_newdata(Signalhistory *signalhistory, unsigned char sample, unsigned char col) { g_return_if_fail(signalhistory != NULL); g_return_if_fail(IS_SIGNALHISTORY(signalhistory)); signalhistory->data[signalhistory->ptr].sample = sample; signalhistory->data[signalhistory->ptr].col = col; signalhistory->ptr = (signalhistory->ptr + 1) % SIGNALHISTORY_WIDTH; if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(signalhistory))) { if (!signalhistory->idlefunc) signalhistory->idlefunc = gtk_idle_add_priority(PRIO, idle_callback, signalhistory); } } baycomusb-0.10.orig/trxapp/src/widgets.h0100644000175100017510000000520607325134424016343 0ustar abaaba/* * Custom Widgets * Copyright (C) 1999 Thomas Sailer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __WIDGETS_H__ #define __WIDGETS_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define SCOPE(obj) GTK_CHECK_CAST(obj, scope_get_type(), Scope) #define SCOPE_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, scope_get_type(), ScopeClass) #define IS_SCOPE(obj) GTK_CHECK_TYPE(obj, scope_get_type()) typedef struct _Scope Scope; typedef struct _ScopeClass ScopeClass; struct _Scope { GtkWidget widget; guint idlefunc; GdkGC *zeroline_gc; GdkGC *sampling_gc; GdkColor zerolinecol; GdkColor samplingcol; struct _ScopePoint *pt; guint ptnum, ptptr; }; struct _ScopeClass { GtkWidgetClass parent_class; }; guint scope_get_type(void); GtkWidget* scope_new(gchar *widget_name, gchar *str1, gchar *str2, gint int1, gint int2); void scope_addvalue(Scope *trace, guint16 deltax, gint16 y, guint flags); void scope_addvalues(Scope *trace, guint num, guint16 *deltax, gint16 *y); #define SPECTRUM(obj) GTK_CHECK_CAST(obj, spectrum_get_type(), Spectrum) #define SPECTRUM_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, spectrum_get_type(), SpectrumClass) #define IS_SPECTRUM(obj) GTK_CHECK_TYPE(obj, spectrum_get_type()) typedef struct _Spectrum Spectrum; typedef struct _SpectrumClass SpectrumClass; struct _Spectrum { GtkWidget widget; guint idlefunc; GdkGC *grid_gc; GdkGC *sampling_gc; GdkColor gridcol; GdkColor samplingcol; gint16 *pt; guint ptnum, ptptr; }; struct _SpectrumClass { GtkWidgetClass parent_class; }; guint spectrum_get_type(void); GtkWidget* spectrum_new(gchar *widget_name, gchar *str1, gchar *str2, gint int1, gint int2); void spectrum_addvalue(Spectrum *trace, gint16 y); void spectrum_addvalues(Spectrum *trace, guint num, gint16 *y); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __WIDGETS_H__ */ baycomusb-0.10.orig/trxapp/src/widgets.c0100644000175100017510000004442607325134424016345 0ustar abaaba/* * Custom Widgets * Copyright (C) 1999 Thomas Sailer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "widgets.h" #include #include #define SCOPEMAXPOINTS 512 #define PRIO G_PRIORITY_LOW struct _ScopePoint { guint16 dx; guint16 y; }; static void scope_class_init(ScopeClass *klass); static void scope_init(Scope *trace); static void scope_finalize(GtkObject *object); static gint scope_expose(GtkWidget *widget, GdkEventExpose *event); static void scope_size_request(GtkWidget *widget, GtkRequisition *requisition); static gint scope_idle_callback(gpointer data); static GtkWidgetClass *scope_parent_class = NULL; static ScopeClass *scope_class = NULL; guint scope_get_type(void) { static guint trace_type = 0; if (!trace_type) { static const GtkTypeInfo trace_info = { "Scope", sizeof(Scope), sizeof(ScopeClass), (GtkClassInitFunc) scope_class_init, (GtkObjectInitFunc) scope_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc) NULL, }; trace_type = gtk_type_unique(gtk_widget_get_type(), &trace_info); } return trace_type; } static void scope_class_init(ScopeClass *klass) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*)klass; widget_class = (GtkWidgetClass*)klass; scope_parent_class = gtk_type_class(gtk_widget_get_type()); scope_class = klass; object_class->finalize = scope_finalize; widget_class->size_request = scope_size_request; widget_class->expose_event = scope_expose; } static void scope_init(Scope *trace) { GTK_WIDGET_SET_FLAGS(trace, GTK_NO_WINDOW); trace->idlefunc = 0; /* initialize the colors */ trace->zerolinecol.red = 65535; trace->zerolinecol.green = 13107; trace->zerolinecol.blue = 0; trace->samplingcol.red = 13763; trace->samplingcol.green = 42598; trace->samplingcol.blue = 5243; trace->zeroline_gc = trace->sampling_gc = NULL; /* initialize the trace history */ trace->ptnum = trace->ptptr = 0; trace->pt = NULL; } static void scope_size_request(GtkWidget *widget, GtkRequisition *requisition) { Scope *trace; g_return_if_fail(widget != NULL); g_return_if_fail(IS_SCOPE(widget)); g_return_if_fail(requisition != NULL); trace = SCOPE(widget); requisition->width = MIN(trace->ptnum * 4, 512); requisition->height = 256; } GtkWidget* scope_new(char *name, char *str1, char *str2, gint int1, gint int2) { Scope *trace; trace = gtk_type_new(scope_get_type()); trace->ptnum = CLAMP(int1, 2, SCOPEMAXPOINTS);; trace->pt = g_malloc0(trace->ptnum * sizeof(struct _ScopePoint)); return GTK_WIDGET(trace); } static void scope_finalize(GtkObject *object) { Scope *trace; g_return_if_fail(object != NULL); g_return_if_fail(IS_SCOPE(object)); trace = SCOPE(object); if (trace->idlefunc) gtk_idle_remove(trace->idlefunc); if (trace->zeroline_gc) gtk_gc_release(trace->zeroline_gc); if (trace->sampling_gc) gtk_gc_release(trace->sampling_gc); if (trace->pt) g_free(trace->pt); (*GTK_OBJECT_CLASS(scope_parent_class)->finalize)(object); } static gint scope_expose(GtkWidget *widget, GdkEventExpose *event) { Scope *trace; g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(IS_SCOPE(widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE(widget)) { trace = SCOPE(widget); if (!trace->idlefunc) trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace); } return FALSE; } static void scope_draw(Scope *trace) { GdkGCValues gc_values; guint totx, idx, i, si; guint32 mulx, muly, zeroy, x; GdkPoint p[SCOPEMAXPOINTS+1]; GdkSegment s[SCOPEMAXPOINTS]; /* init gc's if necessary */ if (!trace->zeroline_gc) { if (!gdk_color_alloc(trace->widget.style->colormap, &trace->zerolinecol)) g_warning("unable to allocate color: ( %d %d %d )", trace->zerolinecol.red, trace->zerolinecol.green, trace->zerolinecol.blue); gc_values.foreground = trace->zerolinecol; trace->zeroline_gc = gtk_gc_get(trace->widget.style->depth, trace->widget.style->colormap, &gc_values, GDK_GC_FOREGROUND); } if (!trace->sampling_gc) { if (!gdk_color_alloc(trace->widget.style->colormap, &trace->samplingcol)) g_warning("unable to allocate color: ( %d %d %d )", trace->samplingcol.red, trace->samplingcol.green, trace->samplingcol.blue); gc_values.foreground = trace->samplingcol; trace->sampling_gc = gtk_gc_get(trace->widget.style->depth, trace->widget.style->colormap, &gc_values, GDK_GC_FOREGROUND); } /* first determine the total x size and calculate multiplication factors */ for (totx = 0, idx = trace->ptptr, i = 1; i < trace->ptnum; i++) { idx++; if (idx >= trace->ptnum) idx = 0; totx += trace->pt[idx].dx & 0x7fff; } mulx = (((guint32)trace->widget.allocation.width) << 16) / MAX(totx, 1); muly = trace->widget.allocation.height; zeroy = (0x8000 * muly) >> 16; /* prepare sampling ticks and lines */ for (si = x = i = 0, idx = trace->ptptr; i < trace->ptnum; i++) { p[i].x = trace->widget.allocation.x + ((x * mulx) >> 16); p[i].y = trace->widget.allocation.y + ((trace->pt[idx].y * muly) >> 16); if (trace->pt[idx].dx & 0x8000) { s[si].x1 = s[si].x2 = p[i].x; s[si].y1 = trace->widget.allocation.y + zeroy - 4; s[si].y2 = trace->widget.allocation.y + zeroy + 4; si++; } idx++; if (idx >= trace->ptnum) idx = 0; x += trace->pt[idx].dx & 0x7fff; } /* now draw everything */ gdk_draw_rectangle(trace->widget.window, trace->widget.style->base_gc[trace->widget.state], TRUE, trace->widget.allocation.x, trace->widget.allocation.y, trace->widget.allocation.x+trace->widget.allocation.width, trace->widget.allocation.y+trace->widget.allocation.height); gdk_draw_line(trace->widget.window, trace->zeroline_gc, trace->widget.allocation.x, trace->widget.allocation.y+zeroy, trace->widget.allocation.x+trace->widget.allocation.width-1, trace->widget.allocation.y+zeroy); gdk_draw_segments(trace->widget.window, trace->sampling_gc, s, si); gdk_draw_lines(trace->widget.window, trace->widget.style->fg_gc[trace->widget.state], p, trace->ptnum); } static gint scope_idle_callback(gpointer data) { g_return_val_if_fail(data != NULL, FALSE); g_return_val_if_fail(IS_SCOPE(data), FALSE); SCOPE(data)->idlefunc = 0; if (!GTK_WIDGET_DRAWABLE(GTK_WIDGET(data))) return FALSE; if (!SCOPE(data)->pt || !SCOPE(data)->ptnum) return FALSE; scope_draw(SCOPE(data)); return FALSE; /* don't call this callback again */ } void scope_addvalue(Scope *trace, guint16 deltax, gint16 y, guint flags) { g_return_if_fail(trace != NULL); g_return_if_fail(IS_SCOPE(trace)); trace->pt[trace->ptptr].y = 32767-y; trace->pt[trace->ptptr].dx = deltax & 0x7fff; if (flags) trace->pt[trace->ptptr].dx |= 0x8000; trace->ptptr++; if (trace->ptptr >= trace->ptnum) trace->ptptr = 0; if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) { if (!trace->idlefunc) trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace); } } void scope_addvalues(Scope *trace, guint num, guint16 *deltax, gint16 *y) { guint i; g_return_if_fail(trace != NULL); g_return_if_fail(IS_SCOPE(trace)); g_return_if_fail(y != NULL); for (i = 0; i < num; i++) { trace->pt[trace->ptptr].y = 32767-y[i]; trace->pt[trace->ptptr].dx = deltax ? (deltax[i] & 0x7fff) : 1; trace->ptptr++; if (trace->ptptr >= trace->ptnum) trace->ptptr = 0; } if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) { if (!trace->idlefunc) trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace); } } /* ---------------------------------------------------------------------- */ /* * This fft routine is from ~gabriel/src/filters/fft/fft.c; * I am unsure of the original source. The file contains no * copyright notice or description. * The declaration is changed to the prototype form but the * function body is unchanged. (J. T. Buck) */ #define SWAP(a, b) tempr=(a); (a)=(b); (b)=tempr /* * Replace data by its discrete Fourier transform, if isign is * input as 1, or by its inverse discrete Fourier transform, if * "isign" is input as -1. "data'"is a complex array of length "nn", * input as a real array data[0..2*nn-1]. "nn" MUST be an integer * power of 2 (this is not checked for!?) */ static void fft_rif(float *data, int nn, int isign) { int n; int mmax; int m, j, istep, i; float wtemp, wr, wpr, wpi, wi, theta; float tempr, tempi; data--; n = nn << 1; j = 1; for (i = 1; i < n; i += 2) { if(j > i) { SWAP(data[j], data[i]); SWAP(data[j+1], data[i+1]); } m= n >> 1; while (m >= 2 && j >m) { j -= m; m >>= 1; } j += m; } mmax = 2; while (n > mmax) { istep = 2*mmax; theta = -6.28318530717959/(isign*mmax); wtemp = sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi = sin(theta); wr = 1.0; wi = 0.0; for (m = 1; m < mmax; m += 2) { for (i = m; i < n; i += istep) { j = i + mmax; tempr = wr*data[j] - wi*data[j+1]; tempi = wr*data[j+1] + wi*data[j]; data[j] = data[i] - tempr; data[j+1] = data[i+1] - tempi; data[i] += tempr; data[i+1] += tempi; } wr = (wtemp=wr)*wpr - wi*wpi+wr; wi = wi*wpr + wtemp*wpi + wi; } mmax = istep; } } #undef SWAP static inline float hamming(float x) { return 0.54-0.46*cos(2*M_PI*x); } /* ---------------------------------------------------------------------- */ #define SPECTRUMMAXPOINTS 1024 static void spectrum_class_init(SpectrumClass *klass); static void spectrum_init(Spectrum *trace); static void spectrum_finalize(GtkObject *object); static gint spectrum_expose(GtkWidget *widget, GdkEventExpose *event); static void spectrum_size_request(GtkWidget *widget, GtkRequisition *requisition); static gint spectrum_idle_callback(gpointer data); static GtkWidgetClass *spectrum_parent_class = NULL; static SpectrumClass *spectrum_class = NULL; guint spectrum_get_type(void) { static guint trace_type = 0; if (!trace_type) { static const GtkTypeInfo trace_info = { "Spectrum", sizeof(Spectrum), sizeof(SpectrumClass), (GtkClassInitFunc) spectrum_class_init, (GtkObjectInitFunc) spectrum_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, (GtkClassInitFunc) NULL, }; trace_type = gtk_type_unique(gtk_widget_get_type(), &trace_info); } return trace_type; } static void spectrum_class_init(SpectrumClass *klass) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*)klass; widget_class = (GtkWidgetClass*)klass; spectrum_parent_class = gtk_type_class(gtk_widget_get_type()); spectrum_class = klass; object_class->finalize = spectrum_finalize; widget_class->size_request = spectrum_size_request; widget_class->expose_event = spectrum_expose; } static void spectrum_init(Spectrum *trace) { GTK_WIDGET_SET_FLAGS(trace, GTK_NO_WINDOW); trace->idlefunc = 0; /* initialize the colors */ trace->gridcol.red = 65535; trace->gridcol.green = 13107; trace->gridcol.blue = 0; trace->samplingcol.red = 13763; trace->samplingcol.green = 42598; trace->samplingcol.blue = 5243; trace->grid_gc = trace->sampling_gc = NULL; /* initialize the trace history */ trace->ptnum = trace->ptptr = 0; trace->pt = NULL; } static void spectrum_size_request(GtkWidget *widget, GtkRequisition *requisition) { Spectrum *trace; g_return_if_fail(widget != NULL); g_return_if_fail(IS_SPECTRUM(widget)); g_return_if_fail(requisition != NULL); trace = SPECTRUM(widget); requisition->width = MIN(trace->ptnum * 4, 512); requisition->height = 256; } GtkWidget* spectrum_new(char *name, char *str1, char *str2, gint int1, gint int2) { guint i, j; Spectrum *trace; trace = gtk_type_new(spectrum_get_type()); i = CLAMP(int1, 4, SPECTRUMMAXPOINTS); j = 0; while (i > 1) { i >>= 1; j++; } trace->ptnum = 1 << j; trace->pt = g_malloc0(trace->ptnum * sizeof(gint16)); return GTK_WIDGET(trace); } static void spectrum_finalize(GtkObject *object) { Spectrum *trace; g_return_if_fail(object != NULL); g_return_if_fail(IS_SPECTRUM(object)); trace = SPECTRUM(object); if (trace->idlefunc) gtk_idle_remove(trace->idlefunc); if (trace->grid_gc) gtk_gc_release(trace->grid_gc); if (trace->sampling_gc) gtk_gc_release(trace->sampling_gc); if (trace->pt) g_free(trace->pt); (*GTK_OBJECT_CLASS(spectrum_parent_class)->finalize)(object); } static gint spectrum_expose(GtkWidget *widget, GdkEventExpose *event) { Spectrum *trace; g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(IS_SPECTRUM(widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE(widget)) { trace = SPECTRUM(widget); if (!trace->idlefunc) trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace); } return FALSE; } static void spectrum_draw(Spectrum *trace) { GdkGCValues gc_values; guint idx, i; guint32 mulx; gint y; GdkPoint p[SPECTRUMMAXPOINTS/2+1]; float f[2*SPECTRUMMAXPOINTS]; float ftmp1, ftmp2, ftmp3; /* init gc's if necessary */ if (!trace->grid_gc) { if (!gdk_color_alloc(trace->widget.style->colormap, &trace->gridcol)) g_warning("unable to allocate color: ( %d %d %d )", trace->gridcol.red, trace->gridcol.green, trace->gridcol.blue); gc_values.foreground = trace->gridcol; trace->grid_gc = gtk_gc_get(trace->widget.style->depth, trace->widget.style->colormap, &gc_values, GDK_GC_FOREGROUND); } if (!trace->sampling_gc) { if (!gdk_color_alloc(trace->widget.style->colormap, &trace->samplingcol)) g_warning("unable to allocate color: ( %d %d %d )", trace->samplingcol.red, trace->samplingcol.green, trace->samplingcol.blue); gc_values.foreground = trace->samplingcol; trace->sampling_gc = gtk_gc_get(trace->widget.style->depth, trace->widget.style->colormap, &gc_values, GDK_GC_FOREGROUND); } /* first determine the total x size and calculate multiplication factors */ ftmp1 = 1.0 / (float)trace->ptnum; for (idx = trace->ptptr, i = 0; i < trace->ptnum; i++) { f[2*i] = trace->pt[idx] * hamming((float)i * ftmp1); f[2*i+1] = 0; idx++; if (idx >= trace->ptnum) idx = 0; } fft_rif(f, trace->ptnum, 1); mulx = (((guint32)trace->widget.allocation.width) << 17) / trace->ptnum; /* prepare sampling ticks and lines */ ftmp2 = trace->widget.allocation.height * 0.0723824136504; /* 1/ln(10^6) */ ftmp3 = 21.4875015613 + 4.6; for (i = 0; i < trace->ptnum / 2; i++) { ftmp1 = f[2*i] * f[2*i] + f[2*i+1] * f[2*i+1]; if (ftmp1 < 2168) p[i].y = trace->widget.allocation.y + trace->widget.allocation.height - 1; else { y = ftmp2 * (ftmp3 - log(ftmp1)); y = CLAMP(y, 0, trace->widget.allocation.height-1); p[i].y = trace->widget.allocation.y + y; } p[i].x = trace->widget.allocation.x + ((i * mulx) >> 16); } /* now draw everything */ gdk_draw_rectangle(trace->widget.window, trace->widget.style->base_gc[trace->widget.state], TRUE, trace->widget.allocation.x, trace->widget.allocation.y, trace->widget.allocation.x+trace->widget.allocation.width, trace->widget.allocation.y+trace->widget.allocation.height); for (i = 0; i < 3; i++) gdk_draw_line(trace->widget.window, trace->grid_gc, trace->widget.allocation.x, trace->widget.allocation.y+i*(trace->widget.allocation.height/3), trace->widget.allocation.x+trace->widget.allocation.width-1, trace->widget.allocation.y+i*(trace->widget.allocation.height/3)); gdk_draw_line(trace->widget.window, trace->grid_gc, trace->widget.allocation.x, trace->widget.allocation.y+trace->widget.allocation.height-1, trace->widget.allocation.x+trace->widget.allocation.width-1, trace->widget.allocation.y+trace->widget.allocation.height-1); gdk_draw_lines(trace->widget.window, trace->widget.style->fg_gc[trace->widget.state], p, trace->ptnum / 2); } static gint spectrum_idle_callback(gpointer data) { g_return_val_if_fail(data != NULL, FALSE); g_return_val_if_fail(IS_SPECTRUM(data), FALSE); SPECTRUM(data)->idlefunc = 0; if (!GTK_WIDGET_DRAWABLE(GTK_WIDGET(data))) return FALSE; if (!SPECTRUM(data)->pt || !SPECTRUM(data)->ptnum) return FALSE; spectrum_draw(SPECTRUM(data)); return FALSE; /* don't call this callback again */ } void spectrum_addvalue(Spectrum *trace, gint16 y) { g_return_if_fail(trace != NULL); g_return_if_fail(IS_SPECTRUM(trace)); trace->pt[trace->ptptr] = y; trace->ptptr++; if (trace->ptptr >= trace->ptnum) trace->ptptr = 0; if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) { if (!trace->idlefunc) trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace); } } void spectrum_addvalues(Spectrum *trace, guint num, gint16 *y) { guint i; g_return_if_fail(trace != NULL); g_return_if_fail(IS_SPECTRUM(trace)); g_return_if_fail(y != NULL); for (i = 0; i < num; i++) { trace->pt[trace->ptptr] = y[i]; trace->ptptr++; if (trace->ptptr >= trace->ptnum) trace->ptptr = 0; } if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) { if (!trace->idlefunc) trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace); } } baycomusb-0.10.orig/trxapp/src/trxapp.rc0100644000175100017510000000206107325412544016366 0ustar abaaba#include LANGUAGE LANG_GERMAN, SUBLANG_GERMAN VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x0L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "Baycom Ingenieurbuero GBR\0" VALUE "FileDescription", "Baycom USBFLEX T7F Transceiver Control Application\0" VALUE "FileVersion", "1, 0, 0, 2\0" VALUE "InternalName", "baycomusbtrx\0" VALUE "LegalCopyright", "Copyright © 1999-2001\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "baycomusbtrx.exe\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "USBFLEX\0" VALUE "ProductVersion", "1.01a\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END baycomusb-0.10.orig/coinstaller/0042755000175100017510000000000007340500014014725 5ustar abaababaycomusb-0.10.orig/coinstaller/Makefile.in0100644000175100017510000002256607340500014017000 0ustar abaaba# Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 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 = : build_alias = @build_alias@ build_triplet = @build@ host_alias = @host_alias@ host_triplet = @host@ target_alias = @target_alias@ target_triplet = @target@ AR = @AR@ AS = @AS@ AS8051 = @AS8051@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ DATADIRNAME = @DATADIRNAME@ DLLTOOL = @DLLTOOL@ DRVLIBOBJS = @DRVLIBOBJS@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GT_NO = @GT_NO@ GT_YES = @GT_YES@ HAVE_BITTYPES = @HAVE_BITTYPES@ HAVE_DIRECTX = @HAVE_DIRECTX@ HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@ HAVE_MKISS = @HAVE_MKISS@ INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ INSTOBJEXT = @INSTOBJEXT@ INTLDEPS = @INTLDEPS@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ LD8051 = @LD8051@ LIBOBJS = @LIBOBJS@ LIBTHREAD = @LIBTHREAD@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ M_PI = @M_PI@ OBJEXT = @OBJEXT@ ORBITIPC = @ORBITIPC@ ORBIT_CFLAGS = @ORBIT_CFLAGS@ ORBIT_CONFIG = @ORBIT_CONFIG@ ORBIT_EXEC_PREFIX = @ORBIT_EXEC_PREFIX@ ORBIT_IDL = @ORBIT_IDL@ ORBIT_LIBS = @ORBIT_LIBS@ ORBIT_VERSION = @ORBIT_VERSION@ PACKAGE = @PACKAGE@ POFILES = @POFILES@ POSUB = @POSUB@ RANLIB = @RANLIB@ USEMMX = @USEMMX@ USERMODEDRV = @USERMODEDRV@ USEVIS = @USEVIS@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WIN32 = @WIN32@ WINDRES = @WINDRES@ XMLCFLAGS = @XMLCFLAGS@ XMLLIBS = @XMLLIBS@ XML_CONFIG = @XML_CONFIG@ l = @l@ EXTRA_DIST = setupapi.h coinst.def coinst.c setupapi.def README INCLUDES = -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/main @WIN32_TRUE@noinst_LIBRARIES = libcoinst.a @WIN32_TRUE@libcoinst_a_SOURCES = coinst.c @WIN32_TRUE@DLLNAME = baycomusbcoinst @WIN32_TRUE@DLLOBJ = coinst.o libsetupapi.a ../misc/libmisc.a @WIN32_TRUE@DLLLDARGS = @WIN32_TRUE@DLLDEF = --def $(srcdir)/coinst.def @WIN32_TRUE@noinst_SCRIPTS = $(DLLNAME).dll @WIN32_TRUE@BUILT_SOURCES = libsetupapi.a @WIN32_TRUE@CLEANFILES = libsetupapi.a mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libcoinst_a_LIBADD = @WIN32_TRUE@libcoinst_a_OBJECTS = coinst.$(OBJEXT) SCRIPTS = $(noinst_SCRIPTS) CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = README Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best SOURCES = $(libcoinst_a_SOURCES) OBJECTS = $(libcoinst_a_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .obj .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps coinstaller/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status mostlyclean-noinstLIBRARIES: clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) distclean-noinstLIBRARIES: maintainer-clean-noinstLIBRARIES: .c.o: $(COMPILE) -c $< # FIXME: We should only use cygpath when building on Windows, # and only if it is available. .c.obj: $(COMPILE) -c `cygpath -w $<` .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core -rm -f *.$(OBJEXT) clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: libcoinst.a: $(libcoinst_a_OBJECTS) $(libcoinst_a_DEPENDENCIES) -rm -f libcoinst.a $(AR) cru libcoinst.a $(libcoinst_a_OBJECTS) $(libcoinst_a_LIBADD) $(RANLIB) libcoinst.a 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 $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) subdir = coinstaller 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 $(LIBRARIES) $(SCRIPTS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: 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 "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-noinstLIBRARIES distclean-compile \ distclean-tags distclean-generic clean-am distclean: distclean-am maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ 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-noinstLIBRARIES distclean-noinstLIBRARIES \ clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile 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 @WIN32_TRUE@$(DLLNAME).dll: $(DLLOBJ) libsetupapi.a @WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) @WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ) @WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) @WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ) @WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) @WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --output-lib lib$(DLLNAME).a $(DLLOBJ) @WIN32_TRUE@libsetupapi.a: setupapi.def @WIN32_TRUE@ $(DLLTOOL) --as=$(AS) -k --dllname setupapi.dll --output-lib $@ --def $< # 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: baycomusb-0.10.orig/coinstaller/README0100644000175100017510000000020307325134424015606 0ustar abaabaNOTE: in order to compile this you need to copy a CR-stripped version of the setupapi.h header file contained in the Win2000 DDK. baycomusb-0.10.orig/coinstaller/Makefile.am0100644000175100017510000000233107325134424016766 0ustar abaabaEXTRA_DIST = setupapi.h coinst.def coinst.c setupapi.def README INCLUDES = -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/main if WIN32 noinst_LIBRARIES = libcoinst.a libcoinst_a_SOURCES = coinst.c DLLNAME = baycomusbcoinst DLLOBJ = coinst.o libsetupapi.a ../misc/libmisc.a DLLLDARGS = DLLDEF = --def $(srcdir)/coinst.def noinst_SCRIPTS = $(DLLNAME).dll $(DLLNAME).dll: $(DLLOBJ) libsetupapi.a $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ) $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ) $(CC) -mdll -mno-cygwin -Wl,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS) $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --output-lib lib$(DLLNAME).a $(DLLOBJ) BUILT_SOURCES = libsetupapi.a CLEANFILES = libsetupapi.a libsetupapi.a: setupapi.def $(DLLTOOL) --as=$(AS) -k --dllname setupapi.dll --output-lib $@ --def $< endif baycomusb-0.10.orig/coinstaller/setupapi.h0100644000175100017510000047164007325134424016752 0ustar abaaba/*++ Copyright (c) 1995-1999 Microsoft Corporation Module Name: setupapi.h Abstract: Public header file for Windows NT Setup and Device Installer services Dll. --*/ #ifndef _INC_SETUPAPI #define _INC_SETUPAPI #if _MSC_VER > 1000 #pragma once #endif // // Define API decoration for direct importing of DLL references. // #if !defined(_SETUPAPI_) #define WINSETUPAPI DECLSPEC_IMPORT #else #define WINSETUPAPI #endif #ifndef __LPGUID_DEFINED__ #define __LPGUID_DEFINED__ typedef GUID *LPGUID; #endif // // Include commctrl.h for our use of HIMAGELIST and wizard support. // #include #include // Assume byte packing throughout #ifdef __cplusplus extern "C" { #endif // // Define maximum string length constants as specified by // Windows 95. // #define LINE_LEN 256 // Win95-compatible maximum for displayable // strings coming from a device INF. #define MAX_INF_STRING_LENGTH 4096 // Actual maximum size of an INF string // (including string substitutions). #define MAX_TITLE_LEN 60 #define MAX_INSTRUCTION_LEN 256 #define MAX_LABEL_LEN 30 #define MAX_SERVICE_NAME_LEN 256 #define MAX_SUBTITLE_LEN 256 // // Define maximum length of a machine name in the format expected by ConfigMgr32 // CM_Connect_Machine (i.e., "\\\\MachineName\0"). // #define SP_MAX_MACHINENAME_LENGTH (MAX_PATH + 3) // // Define type for reference to loaded inf file // typedef PVOID HINF; // // Inf context structure. Applications must not interpret or // overwrite values in these structures. // typedef struct _INFCONTEXT { PVOID Inf; PVOID CurrentInf; UINT Section; UINT Line; } INFCONTEXT, *PINFCONTEXT; // // Inf file information structure. // typedef struct _SP_INF_INFORMATION { DWORD InfStyle; DWORD InfCount; BYTE VersionData[ANYSIZE_ARRAY]; } SP_INF_INFORMATION, *PSP_INF_INFORMATION; // // Define structure for passing alternate platform info into // SetupSetFileQueueAlternatePlatform and SetupQueryInfOriginalFileInformation. // typedef struct _SP_ALTPLATFORM_INFO { DWORD cbSize; // // platform to use (VER_PLATFORM_WIN32_WINDOWS or VER_PLATFORM_WIN32_NT) // DWORD Platform; // // major and minor version numbers to use // DWORD MajorVersion; DWORD MinorVersion; // // processor architecture to use (PROCESSOR_ARCHITECTURE_INTEL, // PROCESSOR_ARCHITECTURE_ALPHA, PROCESSOR_ARCHITECTURE_IA64, or // PROCESSOR_ARCHITECTURE_ALPHA64) // WORD ProcessorArchitecture; WORD Reserved; // must be zero. } SP_ALTPLATFORM_INFO, *PSP_ALTPLATFORM_INFO; // // Define structure that is filled in by SetupQueryInfOriginalFileInformation // to indicate the INF's original name and the original name of the (potentially // platform-specific) catalog file specified by that INF. // typedef struct _SP_ORIGINAL_FILE_INFO_A { DWORD cbSize; CHAR OriginalInfName[MAX_PATH]; CHAR OriginalCatalogName[MAX_PATH]; } SP_ORIGINAL_FILE_INFO_A, *PSP_ORIGINAL_FILE_INFO_A; typedef struct _SP_ORIGINAL_FILE_INFO_W { DWORD cbSize; WCHAR OriginalInfName[MAX_PATH]; WCHAR OriginalCatalogName[MAX_PATH]; } SP_ORIGINAL_FILE_INFO_W, *PSP_ORIGINAL_FILE_INFO_W; #ifdef UNICODE typedef SP_ORIGINAL_FILE_INFO_W SP_ORIGINAL_FILE_INFO; typedef PSP_ORIGINAL_FILE_INFO_W PSP_ORIGINAL_FILE_INFO; #else typedef SP_ORIGINAL_FILE_INFO_A SP_ORIGINAL_FILE_INFO; typedef PSP_ORIGINAL_FILE_INFO_A PSP_ORIGINAL_FILE_INFO; #endif // // SP_INF_INFORMATION.InfStyle values // #define INF_STYLE_NONE 0x00000000 // unrecognized or non-existent #define INF_STYLE_OLDNT 0x00000001 // winnt 3.x #define INF_STYLE_WIN4 0x00000002 // Win95 // // Additional InfStyle flags that may be specified when calling SetupOpenInfFile. // // #define INF_STYLE_CACHE_ENABLE 0x00000010 // always cache INF, even outside of %windir%\Inf #define INF_STYLE_CACHE_DISABLE 0x00000020 // delete cached INF information // // Target directory specs. // #define DIRID_ABSOLUTE -1 // real 32-bit -1 #define DIRID_ABSOLUTE_16BIT 0xffff // 16-bit -1 for compat w/setupx #define DIRID_NULL 0 #define DIRID_SRCPATH 1 #define DIRID_WINDOWS 10 #define DIRID_SYSTEM 11 // system32 #define DIRID_DRIVERS 12 #define DIRID_IOSUBSYS DIRID_DRIVERS #define DIRID_INF 17 #define DIRID_HELP 18 #define DIRID_FONTS 20 #define DIRID_VIEWERS 21 #define DIRID_COLOR 23 #define DIRID_APPS 24 #define DIRID_SHARED 25 #define DIRID_BOOT 30 #define DIRID_SYSTEM16 50 #define DIRID_SPOOL 51 #define DIRID_SPOOLDRIVERS 52 #define DIRID_USERPROFILE 53 #define DIRID_LOADER 54 #define DIRID_PRINTPROCESSOR 55 #define DIRID_DEFAULT DIRID_SYSTEM // // The following DIRIDs are for commonly-used shell "special folders". The // complete list of such folders is contained in shlobj.h. In that headerfile, // each folder is assigned a CSIDL_* value. The DIRID values below are created // by taking the CSIDL value in shlobj.h and OR'ing it with 0x4000. Thus, if // an INF needs to reference other special folders not defined below, it may // generate one using the above mechanism, and setupapi will automatically deal // with it and use the corresponding shell's path where appropriate. (Remember // that DIRIDs must be specified in decimal, not hex, in an INF when used for // string substitution.) // #define DIRID_COMMON_STARTMENU 16406 // All Users\Start Menu #define DIRID_COMMON_PROGRAMS 16407 // All Users\Start Menu\Programs #define DIRID_COMMON_STARTUP 16408 // All Users\Start Menu\Programs\Startup #define DIRID_COMMON_DESKTOPDIRECTORY 16409 // All Users\Desktop #define DIRID_COMMON_FAVORITES 16415 // All Users\Favorites #define DIRID_COMMON_APPDATA 16419 // All Users\Application Data #define DIRID_PROGRAM_FILES 16422 // Program Files #define DIRID_SYSTEM_X86 16425 // system32 on RISC #define DIRID_PROGRAM_FILES_X86 16426 // Program Files on RISC #define DIRID_PROGRAM_FILES_COMMON 16427 // Program Files\Common #define DIRID_PROGRAM_FILES_COMMONX86 16428 // x86 Program Files\Common on RISC #define DIRID_COMMON_TEMPLATES 16429 // All Users\Templates #define DIRID_COMMON_DOCUMENTS 16430 // All Users\Documents // // First user-definable dirid. See SetupSetDirectoryId(). // #define DIRID_USER 0x8000 // // Setup callback notification routine type // typedef UINT (CALLBACK* PSP_FILE_CALLBACK_A)( IN PVOID Context, IN UINT Notification, IN UINT_PTR Param1, IN UINT_PTR Param2 ); typedef UINT (CALLBACK* PSP_FILE_CALLBACK_W)( IN PVOID Context, IN UINT Notification, IN UINT_PTR Param1, IN UINT_PTR Param2 ); #ifdef UNICODE #define PSP_FILE_CALLBACK PSP_FILE_CALLBACK_W #else #define PSP_FILE_CALLBACK PSP_FILE_CALLBACK_A #endif // // Operation/queue start/end notification. These are ordinal values. // #define SPFILENOTIFY_STARTQUEUE 0x00000001 #define SPFILENOTIFY_ENDQUEUE 0x00000002 #define SPFILENOTIFY_STARTSUBQUEUE 0x00000003 #define SPFILENOTIFY_ENDSUBQUEUE 0x00000004 #define SPFILENOTIFY_STARTDELETE 0x00000005 #define SPFILENOTIFY_ENDDELETE 0x00000006 #define SPFILENOTIFY_DELETEERROR 0x00000007 #define SPFILENOTIFY_STARTRENAME 0x00000008 #define SPFILENOTIFY_ENDRENAME 0x00000009 #define SPFILENOTIFY_RENAMEERROR 0x0000000a #define SPFILENOTIFY_STARTCOPY 0x0000000b #define SPFILENOTIFY_ENDCOPY 0x0000000c #define SPFILENOTIFY_COPYERROR 0x0000000d #define SPFILENOTIFY_NEEDMEDIA 0x0000000e #define SPFILENOTIFY_QUEUESCAN 0x0000000f // // These are used with SetupIterateCabinet(). // #define SPFILENOTIFY_CABINETINFO 0x00000010 #define SPFILENOTIFY_FILEINCABINET 0x00000011 #define SPFILENOTIFY_NEEDNEWCABINET 0x00000012 #define SPFILENOTIFY_FILEEXTRACTED 0x00000013 #define SPFILENOTIFY_FILEOPDELAYED 0x00000014 // // These are used for backup operations // #define SPFILENOTIFY_STARTBACKUP 0x00000015 #define SPFILENOTIFY_BACKUPERROR 0x00000016 #define SPFILENOTIFY_ENDBACKUP 0x00000017 // // Extended notification for SetupScanFileQueue(Flags=SPQ_SCAN_USE_CALLBACKEX) // #define SPFILENOTIFY_QUEUESCAN_EX 0x00000018 // // Copy notification. These are bit flags that may be combined. // #define SPFILENOTIFY_LANGMISMATCH 0x00010000 #define SPFILENOTIFY_TARGETEXISTS 0x00020000 #define SPFILENOTIFY_TARGETNEWER 0x00040000 // // File operation codes and callback outcomes. // #define FILEOP_COPY 0 #define FILEOP_RENAME 1 #define FILEOP_DELETE 2 #define FILEOP_BACKUP 3 #define FILEOP_ABORT 0 #define FILEOP_DOIT 1 #define FILEOP_SKIP 2 #define FILEOP_RETRY FILEOP_DOIT #define FILEOP_NEWPATH 4 // // Flags in inf copy sections // #define COPYFLG_WARN_IF_SKIP 0x00000001 // warn if user tries to skip file #define COPYFLG_NOSKIP 0x00000002 // disallow skipping this file #define COPYFLG_NOVERSIONCHECK 0x00000004 // ignore versions and overwrite target #define COPYFLG_FORCE_FILE_IN_USE 0x00000008 // force file-in-use behavior #define COPYFLG_NO_OVERWRITE 0x00000010 // do not copy if file exists on target #define COPYFLG_NO_VERSION_DIALOG 0x00000020 // do not copy if target is newer #define COPYFLG_OVERWRITE_OLDER_ONLY 0x00000040 // leave target alone if version same as source #define COPYFLG_REPLACEONLY 0x00000400 // copy only if file exists on target #define COPYFLG_NODECOMP 0x00000800 // don't attempt to decompress file; copy as-is #define COPYFLG_REPLACE_BOOT_FILE 0x00001000 // file must be present upon reboot (i.e., it's // needed by the loader); this flag implies a reboot #define COPYFLG_NOPRUNE 0x00002000 // never prune this file // // Flags in inf delete sections // New flags go in high word // #define DELFLG_IN_USE 0x00000001 // queue in-use file for delete #define DELFLG_IN_USE1 0x00010000 // high-word version of DELFLG_IN_USE // // Source and file paths. Used when notifying queue callback // of SPFILENOTIFY_STARTxxx, SPFILENOTIFY_ENDxxx, and SPFILENOTIFY_xxxERROR. // typedef struct _FILEPATHS_A { PCSTR Target; PCSTR Source; // not used for delete operations UINT Win32Error; DWORD Flags; // such as SP_COPY_NOSKIP for copy errors } FILEPATHS_A, *PFILEPATHS_A; typedef struct _FILEPATHS_W { PCWSTR Target; PCWSTR Source; // not used for delete operations UINT Win32Error; DWORD Flags; // such as SP_COPY_NOSKIP for copy errors } FILEPATHS_W, *PFILEPATHS_W; #ifdef UNICODE typedef FILEPATHS_W FILEPATHS; typedef PFILEPATHS_W PFILEPATHS; #else typedef FILEPATHS_A FILEPATHS; typedef PFILEPATHS_A PFILEPATHS; #endif // // Structure used with SPFILENOTIFY_NEEDMEDIA // typedef struct _SOURCE_MEDIA_A { PCSTR Reserved; PCSTR Tagfile; // may be NULL PCSTR Description; // // Pathname part and filename part of source file // that caused us to need the media. // PCSTR SourcePath; PCSTR SourceFile; DWORD Flags; // subset of SP_COPY_xxx } SOURCE_MEDIA_A, *PSOURCE_MEDIA_A; typedef struct _SOURCE_MEDIA_W { PCWSTR Reserved; PCWSTR Tagfile; // may be NULL PCWSTR Description; // // Pathname part and filename part of source file // that caused us to need the media. // PCWSTR SourcePath; PCWSTR SourceFile; DWORD Flags; // subset of SP_COPY_xxx } SOURCE_MEDIA_W, *PSOURCE_MEDIA_W; #ifdef UNICODE typedef SOURCE_MEDIA_W SOURCE_MEDIA; typedef PSOURCE_MEDIA_W PSOURCE_MEDIA; #else typedef SOURCE_MEDIA_A SOURCE_MEDIA; typedef PSOURCE_MEDIA_A PSOURCE_MEDIA; #endif // // Structure used with SPFILENOTIFY_CABINETINFO and // SPFILENOTIFY_NEEDNEWCABINET // typedef struct _CABINET_INFO_A { PCSTR CabinetPath; PCSTR CabinetFile; PCSTR DiskName; USHORT SetId; USHORT CabinetNumber; } CABINET_INFO_A, *PCABINET_INFO_A; typedef struct _CABINET_INFO_W { PCWSTR CabinetPath; PCWSTR CabinetFile; PCWSTR DiskName; USHORT SetId; USHORT CabinetNumber; } CABINET_INFO_W, *PCABINET_INFO_W; #ifdef UNICODE typedef CABINET_INFO_W CABINET_INFO; typedef PCABINET_INFO_W PCABINET_INFO; #else typedef CABINET_INFO_A CABINET_INFO; typedef PCABINET_INFO_A PCABINET_INFO; #endif // // Structure used with SPFILENOTIFY_FILEINCABINET // typedef struct _FILE_IN_CABINET_INFO_A { PCSTR NameInCabinet; DWORD FileSize; DWORD Win32Error; WORD DosDate; WORD DosTime; WORD DosAttribs; CHAR FullTargetName[MAX_PATH]; } FILE_IN_CABINET_INFO_A, *PFILE_IN_CABINET_INFO_A; typedef struct _FILE_IN_CABINET_INFO_W { PCWSTR NameInCabinet; DWORD FileSize; DWORD Win32Error; WORD DosDate; WORD DosTime; WORD DosAttribs; WCHAR FullTargetName[MAX_PATH]; } FILE_IN_CABINET_INFO_W, *PFILE_IN_CABINET_INFO_W; #ifdef UNICODE typedef FILE_IN_CABINET_INFO_W FILE_IN_CABINET_INFO; typedef PFILE_IN_CABINET_INFO_W PFILE_IN_CABINET_INFO; #else typedef FILE_IN_CABINET_INFO_A FILE_IN_CABINET_INFO; typedef PFILE_IN_CABINET_INFO_A PFILE_IN_CABINET_INFO; #endif // // Define type for setup file queue // typedef PVOID HSPFILEQ; // // Structure used with SetupQueueCopyIndirect // typedef struct _SP_FILE_COPY_PARAMS_A { DWORD cbSize; HSPFILEQ QueueHandle; PCSTR SourceRootPath; OPTIONAL PCSTR SourcePath; OPTIONAL PCSTR SourceFilename; PCSTR SourceDescription; OPTIONAL PCSTR SourceTagfile; OPTIONAL PCSTR TargetDirectory; PCSTR TargetFilename; OPTIONAL DWORD CopyStyle; HINF LayoutInf; OPTIONAL PCSTR SecurityDescriptor; OPTIONAL } SP_FILE_COPY_PARAMS_A, *PSP_FILE_COPY_PARAMS_A; typedef struct _SP_FILE_COPY_PARAMS_W { DWORD cbSize; HSPFILEQ QueueHandle; PCWSTR SourceRootPath; OPTIONAL PCWSTR SourcePath; OPTIONAL PCWSTR SourceFilename; PCWSTR SourceDescription; OPTIONAL PCWSTR SourceTagfile; OPTIONAL PCWSTR TargetDirectory; PCWSTR TargetFilename; OPTIONAL DWORD CopyStyle; HINF LayoutInf; OPTIONAL PCWSTR SecurityDescriptor; OPTIONAL } SP_FILE_COPY_PARAMS_W, *PSP_FILE_COPY_PARAMS_W; #ifdef UNICODE typedef SP_FILE_COPY_PARAMS_W SP_FILE_COPY_PARAMS; typedef PSP_FILE_COPY_PARAMS_W PSP_FILE_COPY_PARAMS; #else typedef SP_FILE_COPY_PARAMS_A SP_FILE_COPY_PARAMS; typedef PSP_FILE_COPY_PARAMS_A PSP_FILE_COPY_PARAMS; #endif // // Define type for setup disk space list // typedef PVOID HDSKSPC; // // Define type for reference to device information set // typedef PVOID HDEVINFO; // // Device information structure (references a device instance // that is a member of a device information set) // typedef struct _SP_DEVINFO_DATA { DWORD cbSize; GUID ClassGuid; DWORD DevInst; // DEVINST handle ULONG_PTR Reserved; } SP_DEVINFO_DATA, *PSP_DEVINFO_DATA; // // Device interface information structure (references a device // interface that is associated with the device information // element that owns it). // typedef struct _SP_DEVICE_INTERFACE_DATA { DWORD cbSize; GUID InterfaceClassGuid; DWORD Flags; ULONG_PTR Reserved; } SP_DEVICE_INTERFACE_DATA, *PSP_DEVICE_INTERFACE_DATA; // // Flags for SP_DEVICE_INTERFACE_DATA.Flags field. // #define SPINT_ACTIVE 0x00000001 #define SPINT_DEFAULT 0x00000002 #define SPINT_REMOVED 0x00000004 // // Backward compatibility--do not use. // typedef SP_DEVICE_INTERFACE_DATA SP_INTERFACE_DEVICE_DATA; typedef PSP_DEVICE_INTERFACE_DATA PSP_INTERFACE_DEVICE_DATA; #define SPID_ACTIVE SPINT_ACTIVE #define SPID_DEFAULT SPINT_DEFAULT #define SPID_REMOVED SPINT_REMOVED typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_A { DWORD cbSize; CHAR DevicePath[ANYSIZE_ARRAY]; } SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A; typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA_W { DWORD cbSize; WCHAR DevicePath[ANYSIZE_ARRAY]; } SP_DEVICE_INTERFACE_DETAIL_DATA_W, *PSP_DEVICE_INTERFACE_DETAIL_DATA_W; #ifdef UNICODE typedef SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_DEVICE_INTERFACE_DETAIL_DATA; typedef PSP_DEVICE_INTERFACE_DETAIL_DATA_W PSP_DEVICE_INTERFACE_DETAIL_DATA; #else typedef SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_DEVICE_INTERFACE_DETAIL_DATA; typedef PSP_DEVICE_INTERFACE_DETAIL_DATA_A PSP_DEVICE_INTERFACE_DETAIL_DATA; #endif // // Backward compatibility--do not use. // typedef SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_INTERFACE_DEVICE_DETAIL_DATA_W; typedef PSP_DEVICE_INTERFACE_DETAIL_DATA_W PSP_INTERFACE_DEVICE_DETAIL_DATA_W; typedef SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_INTERFACE_DEVICE_DETAIL_DATA_A; typedef PSP_DEVICE_INTERFACE_DETAIL_DATA_A PSP_INTERFACE_DEVICE_DETAIL_DATA_A; #ifdef UNICODE typedef SP_INTERFACE_DEVICE_DETAIL_DATA_W SP_INTERFACE_DEVICE_DETAIL_DATA; typedef PSP_INTERFACE_DEVICE_DETAIL_DATA_W PSP_INTERFACE_DEVICE_DETAIL_DATA; #else typedef SP_INTERFACE_DEVICE_DETAIL_DATA_A SP_INTERFACE_DEVICE_DETAIL_DATA; typedef PSP_INTERFACE_DEVICE_DETAIL_DATA_A PSP_INTERFACE_DEVICE_DETAIL_DATA; #endif // // Structure for detailed information on a device information set (used for // SetupDiGetDeviceInfoListDetail which supercedes the functionality of // SetupDiGetDeviceInfoListClass). // typedef struct _SP_DEVINFO_LIST_DETAIL_DATA_A { DWORD cbSize; GUID ClassGuid; HANDLE RemoteMachineHandle; CHAR RemoteMachineName[SP_MAX_MACHINENAME_LENGTH]; } SP_DEVINFO_LIST_DETAIL_DATA_A, *PSP_DEVINFO_LIST_DETAIL_DATA_A; typedef struct _SP_DEVINFO_LIST_DETAIL_DATA_W { DWORD cbSize; GUID ClassGuid; HANDLE RemoteMachineHandle; WCHAR RemoteMachineName[SP_MAX_MACHINENAME_LENGTH]; } SP_DEVINFO_LIST_DETAIL_DATA_W, *PSP_DEVINFO_LIST_DETAIL_DATA_W; #ifdef UNICODE typedef SP_DEVINFO_LIST_DETAIL_DATA_W SP_DEVINFO_LIST_DETAIL_DATA; typedef PSP_DEVINFO_LIST_DETAIL_DATA_W PSP_DEVINFO_LIST_DETAIL_DATA; #else typedef SP_DEVINFO_LIST_DETAIL_DATA_A SP_DEVINFO_LIST_DETAIL_DATA; typedef PSP_DEVINFO_LIST_DETAIL_DATA_A PSP_DEVINFO_LIST_DETAIL_DATA; #endif // // Class installer function codes // #define DIF_SELECTDEVICE 0x00000001 #define DIF_INSTALLDEVICE 0x00000002 #define DIF_ASSIGNRESOURCES 0x00000003 #define DIF_PROPERTIES 0x00000004 #define DIF_REMOVE 0x00000005 #define DIF_FIRSTTIMESETUP 0x00000006 #define DIF_FOUNDDEVICE 0x00000007 #define DIF_SELECTCLASSDRIVERS 0x00000008 #define DIF_VALIDATECLASSDRIVERS 0x00000009 #define DIF_INSTALLCLASSDRIVERS 0x0000000A #define DIF_CALCDISKSPACE 0x0000000B #define DIF_DESTROYPRIVATEDATA 0x0000000C #define DIF_VALIDATEDRIVER 0x0000000D #define DIF_MOVEDEVICE 0x0000000E #define DIF_DETECT 0x0000000F #define DIF_INSTALLWIZARD 0x00000010 #define DIF_DESTROYWIZARDDATA 0x00000011 #define DIF_PROPERTYCHANGE 0x00000012 #define DIF_ENABLECLASS 0x00000013 #define DIF_DETECTVERIFY 0x00000014 #define DIF_INSTALLDEVICEFILES 0x00000015 #define DIF_UNREMOVE 0x00000016 #define DIF_SELECTBESTCOMPATDRV 0x00000017 #define DIF_ALLOW_INSTALL 0x00000018 #define DIF_REGISTERDEVICE 0x00000019 #define DIF_NEWDEVICEWIZARD_PRESELECT 0x0000001A #define DIF_NEWDEVICEWIZARD_SELECT 0x0000001B #define DIF_NEWDEVICEWIZARD_PREANALYZE 0x0000001C #define DIF_NEWDEVICEWIZARD_POSTANALYZE 0x0000001D #define DIF_NEWDEVICEWIZARD_FINISHINSTALL 0x0000001E #define DIF_UNUSED1 0x0000001F #define DIF_INSTALLINTERFACES 0x00000020 #define DIF_DETECTCANCEL 0x00000021 #define DIF_REGISTER_COINSTALLERS 0x00000022 #define DIF_ADDPROPERTYPAGE_ADVANCED 0x00000023 #define DIF_ADDPROPERTYPAGE_BASIC 0x00000024 #define DIF_RESERVED1 0x00000025 #define DIF_TROUBLESHOOTER 0x00000026 #define DIF_POWERMESSAGEWAKE 0x00000027 typedef UINT DI_FUNCTION; // Function type for device installer // // Device installation parameters structure (associated with a // particular device information element, or globally with a device // information set) // typedef struct _SP_DEVINSTALL_PARAMS_A { DWORD cbSize; DWORD Flags; DWORD FlagsEx; HWND hwndParent; PSP_FILE_CALLBACK InstallMsgHandler; PVOID InstallMsgHandlerContext; HSPFILEQ FileQueue; ULONG_PTR ClassInstallReserved; DWORD Reserved; CHAR DriverPath[MAX_PATH]; } SP_DEVINSTALL_PARAMS_A, *PSP_DEVINSTALL_PARAMS_A; typedef struct _SP_DEVINSTALL_PARAMS_W { DWORD cbSize; DWORD Flags; DWORD FlagsEx; HWND hwndParent; PSP_FILE_CALLBACK InstallMsgHandler; PVOID InstallMsgHandlerContext; HSPFILEQ FileQueue; ULONG_PTR ClassInstallReserved; DWORD Reserved; WCHAR DriverPath[MAX_PATH]; } SP_DEVINSTALL_PARAMS_W, *PSP_DEVINSTALL_PARAMS_W; #ifdef UNICODE typedef SP_DEVINSTALL_PARAMS_W SP_DEVINSTALL_PARAMS; typedef PSP_DEVINSTALL_PARAMS_W PSP_DEVINSTALL_PARAMS; #else typedef SP_DEVINSTALL_PARAMS_A SP_DEVINSTALL_PARAMS; typedef PSP_DEVINSTALL_PARAMS_A PSP_DEVINSTALL_PARAMS; #endif // // SP_DEVINSTALL_PARAMS.Flags values // // Flags for choosing a device // #define DI_SHOWOEM 0x00000001L // support Other... button #define DI_SHOWCOMPAT 0x00000002L // show compatibility list #define DI_SHOWCLASS 0x00000004L // show class list #define DI_SHOWALL 0x00000007L // both class & compat list shown #define DI_NOVCP 0x00000008L // don't create a new copy queue--use // caller-supplied FileQueue #define DI_DIDCOMPAT 0x00000010L // Searched for compatible devices #define DI_DIDCLASS 0x00000020L // Searched for class devices #define DI_AUTOASSIGNRES 0x00000040L // No UI for resources if possible // flags returned by DiInstallDevice to indicate need to reboot/restart #define DI_NEEDRESTART 0x00000080L // Reboot required to take effect #define DI_NEEDREBOOT 0x00000100L // "" // flags for device installation #define DI_NOBROWSE 0x00000200L // no Browse... in InsertDisk // Flags set by DiBuildDriverInfoList #define DI_MULTMFGS 0x00000400L // Set if multiple manufacturers in // class driver list // Flag indicates that device is disabled #define DI_DISABLED 0x00000800L // Set if device disabled // Flags for Device/Class Properties #define DI_GENERALPAGE_ADDED 0x00001000L #define DI_RESOURCEPAGE_ADDED 0x00002000L // Flag to indicate the setting properties for this Device (or class) caused a change // so the Dev Mgr UI probably needs to be updatd. #define DI_PROPERTIES_CHANGE 0x00004000L // Flag to indicate that the sorting from the INF file should be used. #define DI_INF_IS_SORTED 0x00008000L // Flag to indicate that only the the INF specified by SP_DEVINSTALL_PARAMS.DriverPath // should be searched. #define DI_ENUMSINGLEINF 0x00010000L // Flag that prevents ConfigMgr from removing/re-enumerating devices during device // registration, installation, and deletion. #define DI_DONOTCALLCONFIGMG 0x00020000L // The following flag can be used to install a device disabled #define DI_INSTALLDISABLED 0x00040000L // Flag that causes SetupDiBuildDriverInfoList to build a device's compatible driver // list from its existing class driver list, instead of the normal INF search. #define DI_COMPAT_FROM_CLASS 0x00080000L // This flag is set if the Class Install params should be used. #define DI_CLASSINSTALLPARAMS 0x00100000L // This flag is set if the caller of DiCallClassInstaller does NOT // want the internal default action performed if the Class installer // returns ERROR_DI_DO_DEFAULT. #define DI_NODI_DEFAULTACTION 0x00200000L // The setupx flag, DI_NOSYNCPROCESSING (0x00400000L) is not support in the Setup APIs. // flags for device installation #define DI_QUIETINSTALL 0x00800000L // don't confuse the user with // questions or excess info #define DI_NOFILECOPY 0x01000000L // No file Copy necessary #define DI_FORCECOPY 0x02000000L // Force files to be copied from install path #define DI_DRIVERPAGE_ADDED 0x04000000L // Prop provider added Driver page. #define DI_USECI_SELECTSTRINGS 0x08000000L // Use Class Installer Provided strings in the Select Device Dlg #define DI_OVERRIDE_INFFLAGS 0x10000000L // Override INF flags #define DI_PROPS_NOCHANGEUSAGE 0x20000000L // No Enable/Disable in General Props #define DI_NOSELECTICONS 0x40000000L // No small icons in select device dialogs #define DI_NOWRITE_IDS 0x80000000L // Don't write HW & Compat IDs on install // // SP_DEVINSTALL_PARAMS.FlagsEx values // #define DI_FLAGSEX_USEOLDINFSEARCH 0x00000001L // Inf Search functions should not use Index Search #define DI_FLAGSEX_AUTOSELECTRANK0 0x00000002L // SetupDiSelectDevice doesn't prompt user if rank 0 match #define DI_FLAGSEX_CI_FAILED 0x00000004L // Failed to Load/Call class installer #define DI_FLAGSEX_DIDINFOLIST 0x00000010L // Did the Class Info List #define DI_FLAGSEX_DIDCOMPATINFO 0x00000020L // Did the Compat Info List #define DI_FLAGSEX_FILTERCLASSES 0x00000040L #define DI_FLAGSEX_SETFAILEDINSTALL 0x00000080L #define DI_FLAGSEX_DEVICECHANGE 0x00000100L #define DI_FLAGSEX_ALWAYSWRITEIDS 0x00000200L #define DI_FLAGSEX_PROPCHANGE_PENDING 0x00000400L // One or more device property sheets have had changes made // to them, and need to have a DIF_PROPERTYCHANGE occur. #define DI_FLAGSEX_ALLOWEXCLUDEDDRVS 0x00000800L #define DI_FLAGSEX_NOUIONQUERYREMOVE 0x00001000L #define DI_FLAGSEX_USECLASSFORCOMPAT 0x00002000L // Use the device's class when building compat drv list. // (Ignored if DI_COMPAT_FROM_CLASS flag is specified.) #define DI_FLAGSEX_OLDINF_IN_CLASSLIST 0x00004000L // Search legacy INFs when building class driver list. #define DI_FLAGSEX_NO_DRVREG_MODIFY 0x00008000L // Don't run AddReg and DelReg for device's software (driver) key. #define DI_FLAGSEX_IN_SYSTEM_SETUP 0x00010000L // Installation is occurring during initial system setup. #define DI_FLAGSEX_INET_DRIVER 0x00020000L // Driver came from Windows Update #define DI_FLAGSEX_APPENDDRIVERLIST 0x00040000L // Cause SetupDiBuildDriverInfoList to append // a new driver list to an existing list. #define DI_FLAGSEX_PREINSTALLBACKUP 0x00080000L // backup all files required by old inf before install #define DI_FLAGSEX_BACKUPONREPLACE 0x00100000L // backup files required by old inf as they are replaced #define DI_FLAGSEX_DRIVERLIST_FROM_URL 0x00200000L // build driver list from INF(s) retrieved from URL specified // in SP_DEVINSTALL_PARAMS.DriverPath (empty string means // Windows Update website) #define DI_FLAGSEX_RESERVED1 0x00400000L #define DI_FLAGSEX_EXCLUDE_OLD_INET_DRIVERS 0x00800000L // Don't include old Internet drivers when building // a driver list. #define DI_FLAGSEX_POWERPAGE_ADDED 0x01000000L // class installer added their own power page // // Class installation parameters header. This must be the first field of any // class install parameter structure. The InstallFunction field must be set to // the function code corresponding to the structure, and the cbSize field must // be set to the size of the header structure. E.g., // // SP_ENABLECLASS_PARAMS EnableClassParams; // // EnableClassParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); // EnableClassParams.ClassInstallHeader.InstallFunction = DIF_ENABLECLASS; // typedef struct _SP_CLASSINSTALL_HEADER { DWORD cbSize; DI_FUNCTION InstallFunction; } SP_CLASSINSTALL_HEADER, *PSP_CLASSINSTALL_HEADER; // // Structure corresponding to a DIF_ENABLECLASS install function. // typedef struct _SP_ENABLECLASS_PARAMS { SP_CLASSINSTALL_HEADER ClassInstallHeader; GUID ClassGuid; DWORD EnableMessage; } SP_ENABLECLASS_PARAMS, *PSP_ENABLECLASS_PARAMS; #define ENABLECLASS_QUERY 0 #define ENABLECLASS_SUCCESS 1 #define ENABLECLASS_FAILURE 2 // // Structure corresponding to a DIF_MOVEDEVICE install function. // typedef struct _SP_MOVEDEV_PARAMS { SP_CLASSINSTALL_HEADER ClassInstallHeader; SP_DEVINFO_DATA SourceDeviceInfoData; } SP_MOVEDEV_PARAMS, *PSP_MOVEDEV_PARAMS; // // Values indicating a change in a device's state // #define DICS_ENABLE 0x00000001 #define DICS_DISABLE 0x00000002 #define DICS_PROPCHANGE 0x00000003 #define DICS_START 0x00000004 #define DICS_STOP 0x00000005 // // Values specifying the scope of a device property change // #define DICS_FLAG_GLOBAL 0x00000001 // make change in all hardware profiles #define DICS_FLAG_CONFIGSPECIFIC 0x00000002 // make change in specified profile only #define DICS_FLAG_CONFIGGENERAL 0x00000004 // 1 or more hardware profile-specific // changes to follow. // // Structure corresponding to a DIF_PROPERTYCHANGE install function. // typedef struct _SP_PROPCHANGE_PARAMS { SP_CLASSINSTALL_HEADER ClassInstallHeader; DWORD StateChange; DWORD Scope; DWORD HwProfile; } SP_PROPCHANGE_PARAMS, *PSP_PROPCHANGE_PARAMS; // // Structure corresponding to a DIF_REMOVE install function. // typedef struct _SP_REMOVEDEVICE_PARAMS { SP_CLASSINSTALL_HEADER ClassInstallHeader; DWORD Scope; DWORD HwProfile; } SP_REMOVEDEVICE_PARAMS, *PSP_REMOVEDEVICE_PARAMS; #define DI_REMOVEDEVICE_GLOBAL 0x00000001 #define DI_REMOVEDEVICE_CONFIGSPECIFIC 0x00000002 // // Structure corresponding to a DIF_UNREMOVE install function. // typedef struct _SP_UNREMOVEDEVICE_PARAMS { SP_CLASSINSTALL_HEADER ClassInstallHeader; DWORD Scope; DWORD HwProfile; } SP_UNREMOVEDEVICE_PARAMS, *PSP_UNREMOVEDEVICE_PARAMS; #define DI_UNREMOVEDEVICE_CONFIGSPECIFIC 0x00000002 // // Structure corresponding to a DIF_SELECTDEVICE install function. // typedef struct _SP_SELECTDEVICE_PARAMS_A { SP_CLASSINSTALL_HEADER ClassInstallHeader; CHAR Title[MAX_TITLE_LEN]; CHAR Instructions[MAX_INSTRUCTION_LEN]; CHAR ListLabel[MAX_LABEL_LEN]; CHAR SubTitle[MAX_SUBTITLE_LEN]; BYTE Reserved[2]; // DWORD size alignment } SP_SELECTDEVICE_PARAMS_A, *PSP_SELECTDEVICE_PARAMS_A; typedef struct _SP_SELECTDEVICE_PARAMS_W { SP_CLASSINSTALL_HEADER ClassInstallHeader; WCHAR Title[MAX_TITLE_LEN]; WCHAR Instructions[MAX_INSTRUCTION_LEN]; WCHAR ListLabel[MAX_LABEL_LEN]; WCHAR SubTitle[MAX_SUBTITLE_LEN]; } SP_SELECTDEVICE_PARAMS_W, *PSP_SELECTDEVICE_PARAMS_W; #ifdef UNICODE typedef SP_SELECTDEVICE_PARAMS_W SP_SELECTDEVICE_PARAMS; typedef PSP_SELECTDEVICE_PARAMS_W PSP_SELECTDEVICE_PARAMS; #else typedef SP_SELECTDEVICE_PARAMS_A SP_SELECTDEVICE_PARAMS; typedef PSP_SELECTDEVICE_PARAMS_A PSP_SELECTDEVICE_PARAMS; #endif // // Callback routine for giving progress notification during detection // typedef BOOL (CALLBACK* PDETECT_PROGRESS_NOTIFY)( IN PVOID ProgressNotifyParam, IN DWORD DetectComplete ); // where: // ProgressNotifyParam - value supplied by caller requesting detection. // DetectComplete - Percent completion, to be incremented by class // installer, as it steps thru its detection. // // Return Value - If TRUE, then detection is cancelled. Allows caller // requesting detection to stop detection asap. // // // Structure corresponding to a DIF_DETECT install function. // typedef struct _SP_DETECTDEVICE_PARAMS { SP_CLASSINSTALL_HEADER ClassInstallHeader; PDETECT_PROGRESS_NOTIFY DetectProgressNotify; PVOID ProgressNotifyParam; } SP_DETECTDEVICE_PARAMS, *PSP_DETECTDEVICE_PARAMS; // // 'Add New Device' installation wizard structure (backward-compatibility // only--respond to DIF_NEWDEVICEWIZARD_* requests instead). // // Structure corresponding to a DIF_INSTALLWIZARD install function. // (NOTE: This structure is also applicable for DIF_DESTROYWIZARDDATA, // but DIF_INSTALLWIZARD is the associated function code in the class // installation parameter structure in both cases.) // // Define maximum number of dynamic wizard pages that can be added to // hardware install wizard. // #define MAX_INSTALLWIZARD_DYNAPAGES 20 typedef struct _SP_INSTALLWIZARD_DATA { SP_CLASSINSTALL_HEADER ClassInstallHeader; DWORD Flags; HPROPSHEETPAGE DynamicPages[MAX_INSTALLWIZARD_DYNAPAGES]; DWORD NumDynamicPages; DWORD DynamicPageFlags; DWORD PrivateFlags; LPARAM PrivateData; HWND hwndWizardDlg; } SP_INSTALLWIZARD_DATA, *PSP_INSTALLWIZARD_DATA; // // SP_INSTALLWIZARD_DATA.Flags values // #define NDW_INSTALLFLAG_DIDFACTDEFS 0x00000001 #define NDW_INSTALLFLAG_HARDWAREALLREADYIN 0x00000002 #define NDW_INSTALLFLAG_NEEDRESTART DI_NEEDRESTART #define NDW_INSTALLFLAG_NEEDREBOOT DI_NEEDREBOOT #define NDW_INSTALLFLAG_NEEDSHUTDOWN 0x00000200 #define NDW_INSTALLFLAG_EXPRESSINTRO 0x00000400 #define NDW_INSTALLFLAG_SKIPISDEVINSTALLED 0x00000800 #define NDW_INSTALLFLAG_NODETECTEDDEVS 0x00001000 #define NDW_INSTALLFLAG_INSTALLSPECIFIC 0x00002000 #define NDW_INSTALLFLAG_SKIPCLASSLIST 0x00004000 #define NDW_INSTALLFLAG_CI_PICKED_OEM 0x00008000 #define NDW_INSTALLFLAG_PCMCIAMODE 0x00010000 #define NDW_INSTALLFLAG_PCMCIADEVICE 0x00020000 #define NDW_INSTALLFLAG_USERCANCEL 0x00040000 #define NDW_INSTALLFLAG_KNOWNCLASS 0x00080000 // // SP_INSTALLWIZARD_DATA.DynamicPageFlags values // // This flag is set if a Class installer has added pages to the install wizard. // #define DYNAWIZ_FLAG_PAGESADDED 0x00000001 // // Set this flag if you jump to the analyze page, and want it to // handle conflicts for you. NOTE. You will not get control back // in the event of a conflict if you set this flag. // #define DYNAWIZ_FLAG_ANALYZE_HANDLECONFLICT 0x00000008 // // The following flags are not used by the Windows NT hardware wizard. // #define DYNAWIZ_FLAG_INSTALLDET_NEXT 0x00000002 #define DYNAWIZ_FLAG_INSTALLDET_PREV 0x00000004 // // Reserve a range of wizard page resource IDs for internal use. Some of // these IDs are for use by class installers that respond to the obsolete // DIF_INSTALLWIZARD/DIF_DESTROYWIZARDDATA messages. These IDs are listed // below. // #define MIN_IDD_DYNAWIZ_RESOURCE_ID 10000 #define MAX_IDD_DYNAWIZ_RESOURCE_ID 11000 // // Define wizard page resource IDs to be used when adding custom pages to the // hardware install wizard via DIF_INSTALLWIZARD. Pages marked with // (CLASS INSTALLER PROVIDED) _must_ be supplied by the class installer if it // responds to the DIF_INSTALLWIZARD request. // // // Resource ID for the first page that the install wizard will go to after // adding the class installer pages. (CLASS INSTALLER PROVIDED) // #define IDD_DYNAWIZ_FIRSTPAGE 10000 // // Resource ID for the page that the Select Device page will go back to. // (CLASS INSTALLER PROVIDED) // #define IDD_DYNAWIZ_SELECT_PREVPAGE 10001 // // Resource ID for the page that the Select Device page will go forward to. // (CLASS INSTALLER PROVIDED) // #define IDD_DYNAWIZ_SELECT_NEXTPAGE 10002 // // Resource ID for the page that the Analyze dialog should go back to // This will only be used in the event that there is a problem, and the user // selects Back from the analyze proc. (CLASS INSTALLER PROVIDED) // #define IDD_DYNAWIZ_ANALYZE_PREVPAGE 10003 // // Resource ID for the page that the Analyze dialog should go to if it // continues from the analyze proc. (CLASS INSTALLER PROVIDED) // #define IDD_DYNAWIZ_ANALYZE_NEXTPAGE 10004 // // Resource ID of the hardware install wizard's select device page. // This ID can be used to go directly to the hardware install wizard's select // device page. (This is the resource ID of the Select Device wizard page // retrieved via SetupDiGetWizardPage when SPWPT_SELECTDEVICE is the requested // PageType.) // #define IDD_DYNAWIZ_SELECTDEV_PAGE 10009 // // Resource ID of the hardware install wizard's device analysis page. // This ID can be use to go directly to the hardware install wizard's analysis // page. // #define IDD_DYNAWIZ_ANALYZEDEV_PAGE 10010 // // Resource ID of the hardware install wizard's install detected devices page. // This ID can be use to go directly to the hardware install wizard's install // detected devices page. // #define IDD_DYNAWIZ_INSTALLDETECTEDDEVS_PAGE 10011 // // Resource ID of the hardware install wizard's select class page. // This ID can be use to go directly to the hardware install wizard's select // class page. // #define IDD_DYNAWIZ_SELECTCLASS_PAGE 10012 // // The following class installer-provided wizard page resource IDs are not used // by the Windows NT hardware wizard. // #define IDD_DYNAWIZ_INSTALLDETECTED_PREVPAGE 10006 #define IDD_DYNAWIZ_INSTALLDETECTED_NEXTPAGE 10007 #define IDD_DYNAWIZ_INSTALLDETECTED_NODEVS 10008 // // Structure corresponding to the following DIF_NEWDEVICEWIZARD_* install // functions: // // DIF_NEWDEVICEWIZARD_PRESELECT // DIF_NEWDEVICEWIZARD_SELECT // DIF_NEWDEVICEWIZARD_PREANALYZE // DIF_NEWDEVICEWIZARD_POSTANALYZE // DIF_NEWDEVICEWIZARD_FINISHINSTALL // typedef struct _SP_NEWDEVICEWIZARD_DATA { SP_CLASSINSTALL_HEADER ClassInstallHeader; DWORD Flags; // presently unused--must be zero. HPROPSHEETPAGE DynamicPages[MAX_INSTALLWIZARD_DYNAPAGES]; DWORD NumDynamicPages; HWND hwndWizardDlg; } SP_NEWDEVICEWIZARD_DATA, *PSP_NEWDEVICEWIZARD_DATA; typedef SP_NEWDEVICEWIZARD_DATA SP_ADDPROPERTYPAGE_DATA; typedef PSP_NEWDEVICEWIZARD_DATA PSP_ADDPROPERTYPAGE_DATA; // // Structure corresponding to the DIF_TROUBLESHOOTER install function // typedef struct _SP_TROUBLESHOOTER_PARAMS_A { SP_CLASSINSTALL_HEADER ClassInstallHeader; CHAR ChmFile[MAX_PATH]; CHAR HtmlTroubleShooter[MAX_PATH]; } SP_TROUBLESHOOTER_PARAMS_A, *PSP_TROUBLESHOOTER_PARAMS_A; typedef struct _SP_TROUBLESHOOTER_PARAMS_W { SP_CLASSINSTALL_HEADER ClassInstallHeader; WCHAR ChmFile[MAX_PATH]; WCHAR HtmlTroubleShooter[MAX_PATH]; } SP_TROUBLESHOOTER_PARAMS_W, *PSP_TROUBLESHOOTER_PARAMS_W; #ifdef UNICODE typedef SP_TROUBLESHOOTER_PARAMS_W SP_TROUBLESHOOTER_PARAMS; typedef PSP_TROUBLESHOOTER_PARAMS_W PSP_TROUBLESHOOTER_PARAMS; #else typedef SP_TROUBLESHOOTER_PARAMS_A SP_TROUBLESHOOTER_PARAMS; typedef PSP_TROUBLESHOOTER_PARAMS_A PSP_TROUBLESHOOTER_PARAMS; #endif // // Structure corresponding to the DIF_POWERMESSAGEWAKE install function // typedef struct _SP_POWERMESSAGEWAKE_PARAMS_A { SP_CLASSINSTALL_HEADER ClassInstallHeader; CHAR PowerMessageWake[LINE_LEN*2]; } SP_POWERMESSAGEWAKE_PARAMS_A, *PSP_POWERMESSAGEWAKE_PARAMS_A; typedef struct _SP_POWERMESSAGEWAKE_PARAMS_W { SP_CLASSINSTALL_HEADER ClassInstallHeader; WCHAR PowerMessageWake[LINE_LEN*2]; } SP_POWERMESSAGEWAKE_PARAMS_W, *PSP_POWERMESSAGEWAKE_PARAMS_W; #ifdef UNICODE typedef SP_POWERMESSAGEWAKE_PARAMS_W SP_POWERMESSAGEWAKE_PARAMS; typedef PSP_POWERMESSAGEWAKE_PARAMS_W PSP_POWERMESSAGEWAKE_PARAMS; #else typedef SP_POWERMESSAGEWAKE_PARAMS_A SP_POWERMESSAGEWAKE_PARAMS; typedef PSP_POWERMESSAGEWAKE_PARAMS_A PSP_POWERMESSAGEWAKE_PARAMS; #endif // // Driver information structure (member of a driver info list that may be associated // with a particular device instance, or (globally) with a device information set) // typedef struct _SP_DRVINFO_DATA_V2_A { DWORD cbSize; DWORD DriverType; ULONG_PTR Reserved; CHAR Description[LINE_LEN]; CHAR MfgName[LINE_LEN]; CHAR ProviderName[LINE_LEN]; FILETIME DriverDate; DWORDLONG DriverVersion; } SP_DRVINFO_DATA_V2_A, *PSP_DRVINFO_DATA_V2_A; typedef struct _SP_DRVINFO_DATA_V2_W { DWORD cbSize; DWORD DriverType; ULONG_PTR Reserved; WCHAR Description[LINE_LEN]; WCHAR MfgName[LINE_LEN]; WCHAR ProviderName[LINE_LEN]; FILETIME DriverDate; DWORDLONG DriverVersion; } SP_DRVINFO_DATA_V2_W, *PSP_DRVINFO_DATA_V2_W; // // Version 1 of the SP_DRVINFO_DATA structures, used only for compatibility // with Windows NT 4.0/Windows 95/98 SETUPAPI.DLL // typedef struct _SP_DRVINFO_DATA_V1_A { DWORD cbSize; DWORD DriverType; ULONG_PTR Reserved; CHAR Description[LINE_LEN]; CHAR MfgName[LINE_LEN]; CHAR ProviderName[LINE_LEN]; } SP_DRVINFO_DATA_V1_A, *PSP_DRVINFO_DATA_V1_A; typedef struct _SP_DRVINFO_DATA_V1_W { DWORD cbSize; DWORD DriverType; ULONG_PTR Reserved; WCHAR Description[LINE_LEN]; WCHAR MfgName[LINE_LEN]; WCHAR ProviderName[LINE_LEN]; } SP_DRVINFO_DATA_V1_W, *PSP_DRVINFO_DATA_V1_W; #ifdef UNICODE typedef SP_DRVINFO_DATA_V1_W SP_DRVINFO_DATA_V1; typedef PSP_DRVINFO_DATA_V1_W PSP_DRVINFO_DATA_V1; typedef SP_DRVINFO_DATA_V2_W SP_DRVINFO_DATA_V2; typedef PSP_DRVINFO_DATA_V2_W PSP_DRVINFO_DATA_V2; #else typedef SP_DRVINFO_DATA_V1_A SP_DRVINFO_DATA_V1; typedef PSP_DRVINFO_DATA_V1_A PSP_DRVINFO_DATA_V1; typedef SP_DRVINFO_DATA_V2_A SP_DRVINFO_DATA_V2; typedef PSP_DRVINFO_DATA_V2_A PSP_DRVINFO_DATA_V2; #endif #if USE_SP_DRVINFO_DATA_V1 // use version 1 driver info data structure typedef SP_DRVINFO_DATA_V1_A SP_DRVINFO_DATA_A; typedef PSP_DRVINFO_DATA_V1_A PSP_DRVINFO_DATA_A; typedef SP_DRVINFO_DATA_V1_W SP_DRVINFO_DATA_W; typedef PSP_DRVINFO_DATA_V1_W PSP_DRVINFO_DATA_W; typedef SP_DRVINFO_DATA_V1 SP_DRVINFO_DATA; typedef PSP_DRVINFO_DATA_V1 PSP_DRVINFO_DATA; #else // use version 2 driver info data structure typedef SP_DRVINFO_DATA_V2_A SP_DRVINFO_DATA_A; typedef PSP_DRVINFO_DATA_V2_A PSP_DRVINFO_DATA_A; typedef SP_DRVINFO_DATA_V2_W SP_DRVINFO_DATA_W; typedef PSP_DRVINFO_DATA_V2_W PSP_DRVINFO_DATA_W; typedef SP_DRVINFO_DATA_V2 SP_DRVINFO_DATA; typedef PSP_DRVINFO_DATA_V2 PSP_DRVINFO_DATA; #endif // use current version of driver info data structure // // Driver information details structure (provides detailed information about a // particular driver information structure) // typedef struct _SP_DRVINFO_DETAIL_DATA_A { DWORD cbSize; FILETIME InfDate; DWORD CompatIDsOffset; DWORD CompatIDsLength; ULONG_PTR Reserved; CHAR SectionName[LINE_LEN]; CHAR InfFileName[MAX_PATH]; CHAR DrvDescription[LINE_LEN]; CHAR HardwareID[ANYSIZE_ARRAY]; } SP_DRVINFO_DETAIL_DATA_A, *PSP_DRVINFO_DETAIL_DATA_A; typedef struct _SP_DRVINFO_DETAIL_DATA_W { DWORD cbSize; FILETIME InfDate; DWORD CompatIDsOffset; DWORD CompatIDsLength; ULONG_PTR Reserved; WCHAR SectionName[LINE_LEN]; WCHAR InfFileName[MAX_PATH]; WCHAR DrvDescription[LINE_LEN]; WCHAR HardwareID[ANYSIZE_ARRAY]; } SP_DRVINFO_DETAIL_DATA_W, *PSP_DRVINFO_DETAIL_DATA_W; #ifdef UNICODE typedef SP_DRVINFO_DETAIL_DATA_W SP_DRVINFO_DETAIL_DATA; typedef PSP_DRVINFO_DETAIL_DATA_W PSP_DRVINFO_DETAIL_DATA; #else typedef SP_DRVINFO_DETAIL_DATA_A SP_DRVINFO_DETAIL_DATA; typedef PSP_DRVINFO_DETAIL_DATA_A PSP_DRVINFO_DETAIL_DATA; #endif // // Driver installation parameters (associated with a particular driver // information element) // typedef struct _SP_DRVINSTALL_PARAMS { DWORD cbSize; DWORD Rank; DWORD Flags; DWORD_PTR PrivateData; DWORD Reserved; } SP_DRVINSTALL_PARAMS, *PSP_DRVINSTALL_PARAMS; // // SP_DRVINSTALL_PARAMS.Flags values // #define DNF_DUPDESC 0x00000001 // Multiple providers have same desc #define DNF_OLDDRIVER 0x00000002 // Driver node specifies old/current driver #define DNF_EXCLUDEFROMLIST 0x00000004 // If set, this driver node will not be // displayed in any driver select dialogs. #define DNF_NODRIVER 0x00000008 // if we want to install no driver // (e.g no mouse drv) #define DNF_LEGACYINF 0x00000010 // this driver node comes from an old-style INF #define DNF_CLASS_DRIVER 0x00000020 // Driver node represents a class driver #define DNF_COMPATIBLE_DRIVER 0x00000040 // Driver node represents a compatible driver #define DNF_INET_DRIVER 0x00000080 // Driver comes from an internet source #define DNF_UNUSED1 0x00000100 #define DNF_INDEXED_DRIVER 0x00000200 // Driver is contained in the Windows Driver Index #define DNF_OLD_INET_DRIVER 0x00000400 // Driver came from the Internet, but we don't currently // have access to it's source files. Never attempt to // install a driver with this flag! #define DNF_BAD_DRIVER 0x00000800 // Driver node should not be used at all #define DNF_DUPPROVIDER 0x00001000 // Multiple drivers have the same provider and desc // //Rank values (the lower the Rank number, the better the Rank) // #define DRIVER_HARDWAREID_RANK 0x00000FFF // Any rank less than or equal to // this value is a HardwareID match // // Setup callback routine for comparing detection signatures // typedef DWORD (CALLBACK* PSP_DETSIG_CMPPROC)( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA NewDeviceData, IN PSP_DEVINFO_DATA ExistingDeviceData, IN PVOID CompareContext OPTIONAL ); // // Define context structure handed to co-installers // typedef struct _COINSTALLER_CONTEXT_DATA { BOOL PostProcessing; DWORD InstallResult; PVOID PrivateData; } COINSTALLER_CONTEXT_DATA, *PCOINSTALLER_CONTEXT_DATA; // // Structure containing class image list information. // typedef struct _SP_CLASSIMAGELIST_DATA { DWORD cbSize; HIMAGELIST ImageList; ULONG_PTR Reserved; } SP_CLASSIMAGELIST_DATA, *PSP_CLASSIMAGELIST_DATA; // // Structure to be passed as first parameter (LPVOID lpv) to ExtensionPropSheetPageProc // entry point in setupapi.dll or to "EnumPropPages32" or "BasicProperties32" entry // points provided by class/device property page providers. Used to retrieve a handle // (or, potentially, multiple handles) to property pages for a specified property page type. // typedef struct _SP_PROPSHEETPAGE_REQUEST { DWORD cbSize; DWORD PageRequested; HDEVINFO DeviceInfoSet; PSP_DEVINFO_DATA DeviceInfoData; } SP_PROPSHEETPAGE_REQUEST, *PSP_PROPSHEETPAGE_REQUEST; // // Property sheet codes used in SP_PROPSHEETPAGE_REQUEST.PageRequested // #define SPPSR_SELECT_DEVICE_RESOURCES 1 // supplied by setupapi.dll #define SPPSR_ENUM_BASIC_DEVICE_PROPERTIES 2 // supplied by device's BasicProperties32 provider #define SPPSR_ENUM_ADV_DEVICE_PROPERTIES 3 // supplied by class and/or device's EnumPropPages32 provider // // Structure used with SetupGetBackupQueue // typedef struct _SP_BACKUP_QUEUE_PARAMS_A { DWORD cbSize; CHAR FullInfPath[MAX_PATH]; // buffer to hold ANSI pathname of INF file INT FilenameOffset; // offset in CHAR's of filename part (after '\') } SP_BACKUP_QUEUE_PARAMS_A, *PSP_BACKUP_QUEUE_PARAMS_A; typedef struct _SP_BACKUP_QUEUE_PARAMS_W { DWORD cbSize; WCHAR FullInfPath[MAX_PATH]; // buffer to hold UNICODE pathname of INF file INT FilenameOffset; // offset in WCHAR's of filename part (after '\') } SP_BACKUP_QUEUE_PARAMS_W, *PSP_BACKUP_QUEUE_PARAMS_W; #ifdef UNICODE typedef SP_BACKUP_QUEUE_PARAMS_W SP_BACKUP_QUEUE_PARAMS; typedef PSP_BACKUP_QUEUE_PARAMS_W PSP_BACKUP_QUEUE_PARAMS; #else typedef SP_BACKUP_QUEUE_PARAMS_A SP_BACKUP_QUEUE_PARAMS; typedef PSP_BACKUP_QUEUE_PARAMS_A PSP_BACKUP_QUEUE_PARAMS; #endif // // Setupapi-specific error codes // // Inf parse outcomes // #define ERROR_EXPECTED_SECTION_NAME (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0) #define ERROR_BAD_SECTION_NAME_LINE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|1) #define ERROR_SECTION_NAME_TOO_LONG (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|2) #define ERROR_GENERAL_SYNTAX (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|3) // // Inf runtime errors // #define ERROR_WRONG_INF_STYLE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x100) #define ERROR_SECTION_NOT_FOUND (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x101) #define ERROR_LINE_NOT_FOUND (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x102) #define ERROR_NO_BACKUP (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x103) // // Device Installer/other errors // #define ERROR_NO_ASSOCIATED_CLASS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x200) #define ERROR_CLASS_MISMATCH (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x201) #define ERROR_DUPLICATE_FOUND (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x202) #define ERROR_NO_DRIVER_SELECTED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x203) #define ERROR_KEY_DOES_NOT_EXIST (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x204) #define ERROR_INVALID_DEVINST_NAME (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x205) #define ERROR_INVALID_CLASS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x206) #define ERROR_DEVINST_ALREADY_EXISTS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x207) #define ERROR_DEVINFO_NOT_REGISTERED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x208) #define ERROR_INVALID_REG_PROPERTY (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x209) #define ERROR_NO_INF (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20A) #define ERROR_NO_SUCH_DEVINST (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20B) #define ERROR_CANT_LOAD_CLASS_ICON (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20C) #define ERROR_INVALID_CLASS_INSTALLER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20D) #define ERROR_DI_DO_DEFAULT (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20E) #define ERROR_DI_NOFILECOPY (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x20F) #define ERROR_INVALID_HWPROFILE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x210) #define ERROR_NO_DEVICE_SELECTED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x211) #define ERROR_DEVINFO_LIST_LOCKED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x212) #define ERROR_DEVINFO_DATA_LOCKED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x213) #define ERROR_DI_BAD_PATH (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x214) #define ERROR_NO_CLASSINSTALL_PARAMS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x215) #define ERROR_FILEQUEUE_LOCKED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x216) #define ERROR_BAD_SERVICE_INSTALLSECT (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x217) #define ERROR_NO_CLASS_DRIVER_LIST (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x218) #define ERROR_NO_ASSOCIATED_SERVICE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x219) #define ERROR_NO_DEFAULT_DEVICE_INTERFACE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21A) #define ERROR_DEVICE_INTERFACE_ACTIVE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21B) #define ERROR_DEVICE_INTERFACE_REMOVED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21C) #define ERROR_BAD_INTERFACE_INSTALLSECT (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21D) #define ERROR_NO_SUCH_INTERFACE_CLASS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21E) #define ERROR_INVALID_REFERENCE_STRING (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x21F) #define ERROR_INVALID_MACHINENAME (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x220) #define ERROR_REMOTE_COMM_FAILURE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x221) #define ERROR_MACHINE_UNAVAILABLE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x222) #define ERROR_NO_CONFIGMGR_SERVICES (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x223) #define ERROR_INVALID_PROPPAGE_PROVIDER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x224) #define ERROR_NO_SUCH_DEVICE_INTERFACE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x225) #define ERROR_DI_POSTPROCESSING_REQUIRED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x226) #define ERROR_INVALID_COINSTALLER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x227) #define ERROR_NO_COMPAT_DRIVERS (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x228) #define ERROR_NO_DEVICE_ICON (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x229) #define ERROR_INVALID_INF_LOGCONFIG (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22A) #define ERROR_DI_DONT_INSTALL (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22B) #define ERROR_INVALID_FILTER_DRIVER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22C) #define ERROR_NON_WINDOWS_NT_DRIVER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22D) #define ERROR_NON_WINDOWS_DRIVER (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22E) #define ERROR_NO_CATALOG_FOR_OEM_INF (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x22F) #define ERROR_DEVINSTALL_QUEUE_NONNATIVE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x230) #define ERROR_NOT_DISABLEABLE (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x231) #define ERROR_CANT_REMOVE_DEVINST (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x232) // // Backward compatibility--do not use. // #define ERROR_NO_DEFAULT_INTERFACE_DEVICE ERROR_NO_DEFAULT_DEVICE_INTERFACE #define ERROR_INTERFACE_DEVICE_ACTIVE ERROR_DEVICE_INTERFACE_ACTIVE #define ERROR_INTERFACE_DEVICE_REMOVED ERROR_DEVICE_INTERFACE_REMOVED #define ERROR_NO_SUCH_INTERFACE_DEVICE ERROR_NO_SUCH_DEVICE_INTERFACE // // Win9x migration DLL error code // #define ERROR_NOT_INSTALLED (APPLICATION_ERROR_MASK|ERROR_SEVERITY_ERROR|0x1000) WINSETUPAPI BOOL WINAPI SetupGetInfInformationA( IN LPCVOID InfSpec, IN DWORD SearchControl, OUT PSP_INF_INFORMATION ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetInfInformationW( IN LPCVOID InfSpec, IN DWORD SearchControl, OUT PSP_INF_INFORMATION ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); // // SearchControl flags for SetupGetInfInformation // #define INFINFO_INF_SPEC_IS_HINF 1 #define INFINFO_INF_NAME_IS_ABSOLUTE 2 #define INFINFO_DEFAULT_SEARCH 3 #define INFINFO_REVERSE_DEFAULT_SEARCH 4 #define INFINFO_INF_PATH_LIST_SEARCH 5 #ifdef UNICODE #define SetupGetInfInformation SetupGetInfInformationW #else #define SetupGetInfInformation SetupGetInfInformationA #endif WINSETUPAPI BOOL WINAPI SetupQueryInfFileInformationA( IN PSP_INF_INFORMATION InfInformation, IN UINT InfIndex, OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupQueryInfFileInformationW( IN PSP_INF_INFORMATION InfInformation, IN UINT InfIndex, OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupQueryInfFileInformation SetupQueryInfFileInformationW #else #define SetupQueryInfFileInformation SetupQueryInfFileInformationA #endif WINSETUPAPI BOOL WINAPI SetupQueryInfOriginalFileInformationA( IN PSP_INF_INFORMATION InfInformation, IN UINT InfIndex, IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo, OPTIONAL OUT PSP_ORIGINAL_FILE_INFO_A OriginalFileInfo ); WINSETUPAPI BOOL WINAPI SetupQueryInfOriginalFileInformationW( IN PSP_INF_INFORMATION InfInformation, IN UINT InfIndex, IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo, OPTIONAL OUT PSP_ORIGINAL_FILE_INFO_W OriginalFileInfo ); #ifdef UNICODE #define SetupQueryInfOriginalFileInformation SetupQueryInfOriginalFileInformationW #else #define SetupQueryInfOriginalFileInformation SetupQueryInfOriginalFileInformationA #endif WINSETUPAPI BOOL WINAPI SetupQueryInfVersionInformationA( IN PSP_INF_INFORMATION InfInformation, IN UINT InfIndex, IN PCSTR Key, OPTIONAL OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupQueryInfVersionInformationW( IN PSP_INF_INFORMATION InfInformation, IN UINT InfIndex, IN PCWSTR Key, OPTIONAL OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupQueryInfVersionInformation SetupQueryInfVersionInformationW #else #define SetupQueryInfVersionInformation SetupQueryInfVersionInformationA #endif WINSETUPAPI BOOL WINAPI SetupGetInfFileListA( IN PCSTR DirectoryPath, OPTIONAL IN DWORD InfStyle, OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetInfFileListW( IN PCWSTR DirectoryPath, OPTIONAL IN DWORD InfStyle, OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupGetInfFileList SetupGetInfFileListW #else #define SetupGetInfFileList SetupGetInfFileListA #endif WINSETUPAPI HINF WINAPI SetupOpenInfFileW( IN PCWSTR FileName, IN PCWSTR InfClass, OPTIONAL IN DWORD InfStyle, OUT PUINT ErrorLine OPTIONAL ); WINSETUPAPI HINF WINAPI SetupOpenInfFileA( IN PCSTR FileName, IN PCSTR InfClass, OPTIONAL IN DWORD InfStyle, OUT PUINT ErrorLine OPTIONAL ); #ifdef UNICODE #define SetupOpenInfFile SetupOpenInfFileW #else #define SetupOpenInfFile SetupOpenInfFileA #endif WINSETUPAPI HINF WINAPI SetupOpenMasterInf( VOID ); WINSETUPAPI BOOL WINAPI SetupOpenAppendInfFileW( IN PCWSTR FileName, OPTIONAL IN HINF InfHandle, OUT PUINT ErrorLine OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupOpenAppendInfFileA( IN PCSTR FileName, OPTIONAL IN HINF InfHandle, OUT PUINT ErrorLine OPTIONAL ); #ifdef UNICODE #define SetupOpenAppendInfFile SetupOpenAppendInfFileW #else #define SetupOpenAppendInfFile SetupOpenAppendInfFileA #endif WINSETUPAPI VOID WINAPI SetupCloseInfFile( IN HINF InfHandle ); WINSETUPAPI BOOL WINAPI SetupFindFirstLineA( IN HINF InfHandle, IN PCSTR Section, IN PCSTR Key, OPTIONAL OUT PINFCONTEXT Context ); WINSETUPAPI BOOL WINAPI SetupFindFirstLineW( IN HINF InfHandle, IN PCWSTR Section, IN PCWSTR Key, OPTIONAL OUT PINFCONTEXT Context ); #ifdef UNICODE #define SetupFindFirstLine SetupFindFirstLineW #else #define SetupFindFirstLine SetupFindFirstLineA #endif WINSETUPAPI BOOL WINAPI SetupFindNextLine( IN PINFCONTEXT ContextIn, OUT PINFCONTEXT ContextOut ); WINSETUPAPI BOOL WINAPI SetupFindNextMatchLineA( IN PINFCONTEXT ContextIn, IN PCSTR Key, OPTIONAL OUT PINFCONTEXT ContextOut ); WINSETUPAPI BOOL WINAPI SetupFindNextMatchLineW( IN PINFCONTEXT ContextIn, IN PCWSTR Key, OPTIONAL OUT PINFCONTEXT ContextOut ); #ifdef UNICODE #define SetupFindNextMatchLine SetupFindNextMatchLineW #else #define SetupFindNextMatchLine SetupFindNextMatchLineA #endif WINSETUPAPI BOOL WINAPI SetupGetLineByIndexA( IN HINF InfHandle, IN PCSTR Section, IN DWORD Index, OUT PINFCONTEXT Context ); WINSETUPAPI BOOL WINAPI SetupGetLineByIndexW( IN HINF InfHandle, IN PCWSTR Section, IN DWORD Index, OUT PINFCONTEXT Context ); #ifdef UNICODE #define SetupGetLineByIndex SetupGetLineByIndexW #else #define SetupGetLineByIndex SetupGetLineByIndexA #endif WINSETUPAPI LONG WINAPI SetupGetLineCountA( IN HINF InfHandle, IN PCSTR Section ); WINSETUPAPI LONG WINAPI SetupGetLineCountW( IN HINF InfHandle, IN PCWSTR Section ); #ifdef UNICODE #define SetupGetLineCount SetupGetLineCountW #else #define SetupGetLineCount SetupGetLineCountA #endif WINSETUPAPI BOOL WINAPI SetupGetLineTextA( IN PINFCONTEXT Context, OPTIONAL IN HINF InfHandle, OPTIONAL IN PCSTR Section, OPTIONAL IN PCSTR Key, OPTIONAL OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetLineTextW( IN PINFCONTEXT Context, OPTIONAL IN HINF InfHandle, OPTIONAL IN PCWSTR Section, OPTIONAL IN PCWSTR Key, OPTIONAL OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupGetLineText SetupGetLineTextW #else #define SetupGetLineText SetupGetLineTextA #endif WINSETUPAPI DWORD WINAPI SetupGetFieldCount( IN PINFCONTEXT Context ); WINSETUPAPI BOOL WINAPI SetupGetStringFieldA( IN PINFCONTEXT Context, IN DWORD FieldIndex, OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetStringFieldW( IN PINFCONTEXT Context, IN DWORD FieldIndex, OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupGetStringField SetupGetStringFieldW #else #define SetupGetStringField SetupGetStringFieldA #endif WINSETUPAPI BOOL WINAPI SetupGetIntField( IN PINFCONTEXT Context, IN DWORD FieldIndex, OUT PINT IntegerValue ); WINSETUPAPI BOOL WINAPI SetupGetMultiSzFieldA( IN PINFCONTEXT Context, IN DWORD FieldIndex, OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT LPDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetMultiSzFieldW( IN PINFCONTEXT Context, IN DWORD FieldIndex, OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT LPDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupGetMultiSzField SetupGetMultiSzFieldW #else #define SetupGetMultiSzField SetupGetMultiSzFieldA #endif WINSETUPAPI BOOL WINAPI SetupGetBinaryField( IN PINFCONTEXT Context, IN DWORD FieldIndex, OUT PBYTE ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT LPDWORD RequiredSize OPTIONAL ); WINSETUPAPI DWORD WINAPI SetupGetFileCompressionInfoA( IN PCSTR SourceFileName, OUT PSTR *ActualSourceFileName, OUT PDWORD SourceFileSize, OUT PDWORD TargetFileSize, OUT PUINT CompressionType ); WINSETUPAPI DWORD WINAPI SetupGetFileCompressionInfoW( IN PCWSTR SourceFileName, OUT PWSTR *ActualSourceFileName, OUT PDWORD SourceFileSize, OUT PDWORD TargetFileSize, OUT PUINT CompressionType ); #ifdef UNICODE #define SetupGetFileCompressionInfo SetupGetFileCompressionInfoW #else #define SetupGetFileCompressionInfo SetupGetFileCompressionInfoA #endif // // Compression types // #define FILE_COMPRESSION_NONE 0 #define FILE_COMPRESSION_WINLZA 1 #define FILE_COMPRESSION_MSZIP 2 #define FILE_COMPRESSION_NTCAB 3 WINSETUPAPI DWORD WINAPI SetupDecompressOrCopyFileA( IN PCSTR SourceFileName, IN PCSTR TargetFileName, IN PUINT CompressionType OPTIONAL ); WINSETUPAPI DWORD WINAPI SetupDecompressOrCopyFileW( IN PCWSTR SourceFileName, IN PCWSTR TargetFileName, IN PUINT CompressionType OPTIONAL ); #ifdef UNICODE #define SetupDecompressOrCopyFile SetupDecompressOrCopyFileW #else #define SetupDecompressOrCopyFile SetupDecompressOrCopyFileA #endif WINSETUPAPI BOOL WINAPI SetupGetSourceFileLocationA( IN HINF InfHandle, IN PINFCONTEXT InfContext, OPTIONAL IN PCSTR FileName, OPTIONAL OUT PUINT SourceId, OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetSourceFileLocationW( IN HINF InfHandle, IN PINFCONTEXT InfContext, OPTIONAL IN PCWSTR FileName, OPTIONAL OUT PUINT SourceId, OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupGetSourceFileLocation SetupGetSourceFileLocationW #else #define SetupGetSourceFileLocation SetupGetSourceFileLocationA #endif WINSETUPAPI BOOL WINAPI SetupGetSourceFileSizeA( IN HINF InfHandle, IN PINFCONTEXT InfContext, OPTIONAL IN PCSTR FileName, OPTIONAL IN PCSTR Section, OPTIONAL OUT PDWORD FileSize, IN UINT RoundingFactor OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetSourceFileSizeW( IN HINF InfHandle, IN PINFCONTEXT InfContext, OPTIONAL IN PCWSTR FileName, OPTIONAL IN PCWSTR Section, OPTIONAL OUT PDWORD FileSize, IN UINT RoundingFactor OPTIONAL ); #ifdef UNICODE #define SetupGetSourceFileSize SetupGetSourceFileSizeW #else #define SetupGetSourceFileSize SetupGetSourceFileSizeA #endif WINSETUPAPI BOOL WINAPI SetupGetTargetPathA( IN HINF InfHandle, IN PINFCONTEXT InfContext, OPTIONAL IN PCSTR Section, OPTIONAL OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetTargetPathW( IN HINF InfHandle, IN PINFCONTEXT InfContext, OPTIONAL IN PCWSTR Section, OPTIONAL OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupGetTargetPath SetupGetTargetPathW #else #define SetupGetTargetPath SetupGetTargetPathA #endif // // Define flags for SourceList APIs. // #define SRCLIST_TEMPORARY 0x00000001 #define SRCLIST_NOBROWSE 0x00000002 #define SRCLIST_SYSTEM 0x00000010 #define SRCLIST_USER 0x00000020 #define SRCLIST_SYSIFADMIN 0x00000040 #define SRCLIST_SUBDIRS 0x00000100 #define SRCLIST_APPEND 0x00000200 #define SRCLIST_NOSTRIPPLATFORM 0x00000400 WINSETUPAPI BOOL WINAPI SetupSetSourceListA( IN DWORD Flags, IN PCSTR *SourceList, IN UINT SourceCount ); WINSETUPAPI BOOL WINAPI SetupSetSourceListW( IN DWORD Flags, IN PCWSTR *SourceList, IN UINT SourceCount ); #ifdef UNICODE #define SetupSetSourceList SetupSetSourceListW #else #define SetupSetSourceList SetupSetSourceListA #endif WINSETUPAPI BOOL WINAPI SetupCancelTemporarySourceList( VOID ); WINSETUPAPI BOOL WINAPI SetupAddToSourceListA( IN DWORD Flags, IN PCSTR Source ); WINSETUPAPI BOOL WINAPI SetupAddToSourceListW( IN DWORD Flags, IN PCWSTR Source ); #ifdef UNICODE #define SetupAddToSourceList SetupAddToSourceListW #else #define SetupAddToSourceList SetupAddToSourceListA #endif WINSETUPAPI BOOL WINAPI SetupRemoveFromSourceListA( IN DWORD Flags, IN PCSTR Source ); WINSETUPAPI BOOL WINAPI SetupRemoveFromSourceListW( IN DWORD Flags, IN PCWSTR Source ); #ifdef UNICODE #define SetupRemoveFromSourceList SetupRemoveFromSourceListW #else #define SetupRemoveFromSourceList SetupRemoveFromSourceListA #endif WINSETUPAPI BOOL WINAPI SetupQuerySourceListA( IN DWORD Flags, OUT PCSTR **List, OUT PUINT Count ); WINSETUPAPI BOOL WINAPI SetupQuerySourceListW( IN DWORD Flags, OUT PCWSTR **List, OUT PUINT Count ); #ifdef UNICODE #define SetupQuerySourceList SetupQuerySourceListW #else #define SetupQuerySourceList SetupQuerySourceListA #endif WINSETUPAPI BOOL WINAPI SetupFreeSourceListA( IN OUT PCSTR **List, IN UINT Count ); WINSETUPAPI BOOL WINAPI SetupFreeSourceListW( IN OUT PCWSTR **List, IN UINT Count ); #ifdef UNICODE #define SetupFreeSourceList SetupFreeSourceListW #else #define SetupFreeSourceList SetupFreeSourceListA #endif WINSETUPAPI UINT WINAPI SetupPromptForDiskA( IN HWND hwndParent, IN PCSTR DialogTitle, OPTIONAL IN PCSTR DiskName, OPTIONAL IN PCSTR PathToSource, OPTIONAL IN PCSTR FileSought, IN PCSTR TagFile, OPTIONAL IN DWORD DiskPromptStyle, OUT PSTR PathBuffer, IN DWORD PathBufferSize, OUT PDWORD PathRequiredSize ); WINSETUPAPI UINT WINAPI SetupPromptForDiskW( IN HWND hwndParent, IN PCWSTR DialogTitle, OPTIONAL IN PCWSTR DiskName, OPTIONAL IN PCWSTR PathToSource, OPTIONAL IN PCWSTR FileSought, IN PCWSTR TagFile, OPTIONAL IN DWORD DiskPromptStyle, OUT PWSTR PathBuffer, IN DWORD PathBufferSize, OUT PDWORD PathRequiredSize ); #ifdef UNICODE #define SetupPromptForDisk SetupPromptForDiskW #else #define SetupPromptForDisk SetupPromptForDiskA #endif WINSETUPAPI UINT WINAPI SetupCopyErrorA( IN HWND hwndParent, IN PCSTR DialogTitle, OPTIONAL IN PCSTR DiskName, OPTIONAL IN PCSTR PathToSource, IN PCSTR SourceFile, IN PCSTR TargetPathFile, OPTIONAL IN UINT Win32ErrorCode, IN DWORD Style, OUT PSTR PathBuffer, OPTIONAL IN DWORD PathBufferSize, OUT PDWORD PathRequiredSize OPTIONAL ); WINSETUPAPI UINT WINAPI SetupCopyErrorW( IN HWND hwndParent, IN PCWSTR DialogTitle, OPTIONAL IN PCWSTR DiskName, OPTIONAL IN PCWSTR PathToSource, IN PCWSTR SourceFile, IN PCWSTR TargetPathFile, OPTIONAL IN UINT Win32ErrorCode, IN DWORD Style, OUT PWSTR PathBuffer, OPTIONAL IN DWORD PathBufferSize, OUT PDWORD PathRequiredSize OPTIONAL ); #ifdef UNICODE #define SetupCopyError SetupCopyErrorW #else #define SetupCopyError SetupCopyErrorA #endif WINSETUPAPI UINT WINAPI SetupRenameErrorA( IN HWND hwndParent, IN PCSTR DialogTitle, OPTIONAL IN PCSTR SourceFile, IN PCSTR TargetFile, IN UINT Win32ErrorCode, IN DWORD Style ); WINSETUPAPI UINT WINAPI SetupRenameErrorW( IN HWND hwndParent, IN PCWSTR DialogTitle, OPTIONAL IN PCWSTR SourceFile, IN PCWSTR TargetFile, IN UINT Win32ErrorCode, IN DWORD Style ); #ifdef UNICODE #define SetupRenameError SetupRenameErrorW #else #define SetupRenameError SetupRenameErrorA #endif WINSETUPAPI UINT WINAPI SetupDeleteErrorA( IN HWND hwndParent, IN PCSTR DialogTitle, OPTIONAL IN PCSTR File, IN UINT Win32ErrorCode, IN DWORD Style ); WINSETUPAPI UINT WINAPI SetupDeleteErrorW( IN HWND hwndParent, IN PCWSTR DialogTitle, OPTIONAL IN PCWSTR File, IN UINT Win32ErrorCode, IN DWORD Style ); #ifdef UNICODE #define SetupDeleteError SetupDeleteErrorW #else #define SetupDeleteError SetupDeleteErrorA #endif WINSETUPAPI UINT WINAPI SetupBackupErrorA( IN HWND hwndParent, IN PCSTR DialogTitle, OPTIONAL IN PCSTR BackupFile, IN PCSTR TargetFile, IN UINT Win32ErrorCode, IN DWORD Style ); WINSETUPAPI UINT WINAPI SetupBackupErrorW( IN HWND hwndParent, IN PCWSTR DialogTitle, OPTIONAL IN PCWSTR BackupFile, IN PCWSTR TargetFile, IN UINT Win32ErrorCode, IN DWORD Style ); #ifdef UNICODE #define SetupBackupError SetupBackupErrorW #else #define SetupBackupError SetupBackupErrorA #endif // // Styles for SetupPromptForDisk, SetupCopyError, // SetupRenameError, SetupDeleteError // #define IDF_NOBROWSE 0x00000001 #define IDF_NOSKIP 0x00000002 #define IDF_NODETAILS 0x00000004 #define IDF_NOCOMPRESSED 0x00000008 #define IDF_CHECKFIRST 0x00000100 #define IDF_NOBEEP 0x00000200 #define IDF_NOFOREGROUND 0x00000400 #define IDF_WARNIFSKIP 0x00000800 #define IDF_OEMDISK 0x80000000 // // Return values for SetupPromptForDisk, SetupCopyError, // SetupRenameError, SetupDeleteError, SetupBackupError // #define DPROMPT_SUCCESS 0 #define DPROMPT_CANCEL 1 #define DPROMPT_SKIPFILE 2 #define DPROMPT_BUFFERTOOSMALL 3 #define DPROMPT_OUTOFMEMORY 4 WINSETUPAPI BOOL WINAPI SetupSetDirectoryIdA( IN HINF InfHandle, IN DWORD Id, OPTIONAL IN PCSTR Directory OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupSetDirectoryIdW( IN HINF InfHandle, IN DWORD Id, OPTIONAL IN PCWSTR Directory OPTIONAL ); #ifdef UNICODE #define SetupSetDirectoryId SetupSetDirectoryIdW #else #define SetupSetDirectoryId SetupSetDirectoryIdA #endif WINSETUPAPI BOOL WINAPI SetupSetDirectoryIdExA( IN HINF InfHandle, IN DWORD Id, OPTIONAL IN PCSTR Directory, OPTIONAL IN DWORD Flags, IN DWORD Reserved1, IN PVOID Reserved2 ); WINSETUPAPI BOOL WINAPI SetupSetDirectoryIdExW( IN HINF InfHandle, IN DWORD Id, OPTIONAL IN PCWSTR Directory, OPTIONAL IN DWORD Flags, IN DWORD Reserved1, IN PVOID Reserved2 ); #ifdef UNICODE #define SetupSetDirectoryIdEx SetupSetDirectoryIdExW #else #define SetupSetDirectoryIdEx SetupSetDirectoryIdExA #endif // // Flags for SetupSetDirectoryIdEx // #define SETDIRID_NOT_FULL_PATH 0x00000001 WINSETUPAPI BOOL WINAPI SetupGetSourceInfoA( IN HINF InfHandle, IN UINT SourceId, IN UINT InfoDesired, OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupGetSourceInfoW( IN HINF InfHandle, IN UINT SourceId, IN UINT InfoDesired, OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupGetSourceInfo SetupGetSourceInfoW #else #define SetupGetSourceInfo SetupGetSourceInfoA #endif // // InfoDesired values for SetupGetSourceInfo // #define SRCINFO_PATH 1 #define SRCINFO_TAGFILE 2 #define SRCINFO_DESCRIPTION 3 #define SRCINFO_FLAGS 4 WINSETUPAPI BOOL WINAPI SetupInstallFileA( IN HINF InfHandle, OPTIONAL IN PINFCONTEXT InfContext, OPTIONAL IN PCSTR SourceFile, OPTIONAL IN PCSTR SourcePathRoot, OPTIONAL IN PCSTR DestinationName, OPTIONAL IN DWORD CopyStyle, IN PSP_FILE_CALLBACK_A CopyMsgHandler, OPTIONAL IN PVOID Context OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupInstallFileW( IN HINF InfHandle, OPTIONAL IN PINFCONTEXT InfContext, OPTIONAL IN PCWSTR SourceFile, OPTIONAL IN PCWSTR SourcePathRoot, OPTIONAL IN PCWSTR DestinationName, OPTIONAL IN DWORD CopyStyle, IN PSP_FILE_CALLBACK_W CopyMsgHandler, OPTIONAL IN PVOID Context OPTIONAL ); #ifdef UNICODE #define SetupInstallFile SetupInstallFileW #else #define SetupInstallFile SetupInstallFileA #endif WINSETUPAPI BOOL WINAPI SetupInstallFileExA( IN HINF InfHandle, OPTIONAL IN PINFCONTEXT InfContext, OPTIONAL IN PCSTR SourceFile, OPTIONAL IN PCSTR SourcePathRoot, OPTIONAL IN PCSTR DestinationName, OPTIONAL IN DWORD CopyStyle, IN PSP_FILE_CALLBACK_A CopyMsgHandler, OPTIONAL IN PVOID Context, OPTIONAL OUT PBOOL FileWasInUse ); WINSETUPAPI BOOL WINAPI SetupInstallFileExW( IN HINF InfHandle, OPTIONAL IN PINFCONTEXT InfContext, OPTIONAL IN PCWSTR SourceFile, OPTIONAL IN PCWSTR SourcePathRoot, OPTIONAL IN PCWSTR DestinationName, OPTIONAL IN DWORD CopyStyle, IN PSP_FILE_CALLBACK_W CopyMsgHandler, OPTIONAL IN PVOID Context, OPTIONAL OUT PBOOL FileWasInUse ); #ifdef UNICODE #define SetupInstallFileEx SetupInstallFileExW #else #define SetupInstallFileEx SetupInstallFileExA #endif // // CopyStyle values for copy and queue-related APIs // #define SP_COPY_DELETESOURCE 0x0000001 // delete source file on successful copy #define SP_COPY_REPLACEONLY 0x0000002 // copy only if target file already present #define SP_COPY_NEWER 0x0000004 // copy only if source newer than or same as target #define SP_COPY_NEWER_OR_SAME SP_COPY_NEWER #define SP_COPY_NOOVERWRITE 0x0000008 // copy only if target doesn't exist #define SP_COPY_NODECOMP 0x0000010 // don't decompress source file while copying #define SP_COPY_LANGUAGEAWARE 0x0000020 // don't overwrite file of different language #define SP_COPY_SOURCE_ABSOLUTE 0x0000040 // SourceFile is a full source path #define SP_COPY_SOURCEPATH_ABSOLUTE 0x0000080 // SourcePathRoot is the full path #define SP_COPY_IN_USE_NEEDS_REBOOT 0x0000100 // System needs reboot if file in use #define SP_COPY_FORCE_IN_USE 0x0000200 // Force target-in-use behavior #define SP_COPY_NOSKIP 0x0000400 // Skip is disallowed for this file or section #define SP_FLAG_CABINETCONTINUATION 0x0000800 // Used with need media notification #define SP_COPY_FORCE_NOOVERWRITE 0x0001000 // like NOOVERWRITE but no callback nofitication #define SP_COPY_FORCE_NEWER 0x0002000 // like NEWER but no callback nofitication #define SP_COPY_WARNIFSKIP 0x0004000 // system critical file: warn if user tries to skip #define SP_COPY_NOBROWSE 0x0008000 // Browsing is disallowed for this file or section #define SP_COPY_NEWER_ONLY 0x0010000 // copy only if source file newer than target #define SP_COPY_SOURCE_SIS_MASTER 0x0020000 // source is single-instance store master #define SP_COPY_OEMINF_CATALOG_ONLY 0x0040000 // (SetupCopyOEMInf only) don't copy INF--just catalog #define SP_COPY_REPLACE_BOOT_FILE 0x0080000 // file must be present upon reboot (i.e., it's // needed by the loader); this flag implies a reboot #define SP_COPY_NOPRUNE 0x0100000 // never prune this file WINSETUPAPI HSPFILEQ WINAPI SetupOpenFileQueue( VOID ); WINSETUPAPI BOOL WINAPI SetupCloseFileQueue( IN HSPFILEQ QueueHandle ); WINSETUPAPI BOOL WINAPI SetupSetFileQueueAlternatePlatformA( IN HSPFILEQ QueueHandle, IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo, OPTIONAL IN PCSTR AlternateDefaultCatalogFile OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupSetFileQueueAlternatePlatformW( IN HSPFILEQ QueueHandle, IN PSP_ALTPLATFORM_INFO AlternatePlatformInfo, OPTIONAL IN PCWSTR AlternateDefaultCatalogFile OPTIONAL ); #ifdef UNICODE #define SetupSetFileQueueAlternatePlatform SetupSetFileQueueAlternatePlatformW #else #define SetupSetFileQueueAlternatePlatform SetupSetFileQueueAlternatePlatformA #endif WINSETUPAPI BOOL WINAPI SetupSetPlatformPathOverrideA( IN PCSTR Override OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupSetPlatformPathOverrideW( IN PCWSTR Override OPTIONAL ); #ifdef UNICODE #define SetupSetPlatformPathOverride SetupSetPlatformPathOverrideW #else #define SetupSetPlatformPathOverride SetupSetPlatformPathOverrideA #endif WINSETUPAPI BOOL WINAPI SetupQueueCopyA( IN HSPFILEQ QueueHandle, IN PCSTR SourceRootPath, OPTIONAL IN PCSTR SourcePath, OPTIONAL IN PCSTR SourceFilename, IN PCSTR SourceDescription, OPTIONAL IN PCSTR SourceTagfile, OPTIONAL IN PCSTR TargetDirectory, IN PCSTR TargetFilename, OPTIONAL IN DWORD CopyStyle ); WINSETUPAPI BOOL WINAPI SetupQueueCopyW( IN HSPFILEQ QueueHandle, IN PCWSTR SourceRootPath, OPTIONAL IN PCWSTR SourcePath, OPTIONAL IN PCWSTR SourceFilename, IN PCWSTR SourceDescription, OPTIONAL IN PCWSTR SourceTagfile, OPTIONAL IN PCWSTR TargetDirectory, IN PCWSTR TargetFilename, OPTIONAL IN DWORD CopyStyle ); #ifdef UNICODE #define SetupQueueCopy SetupQueueCopyW #else #define SetupQueueCopy SetupQueueCopyA #endif WINSETUPAPI BOOL WINAPI SetupQueueCopyIndirectA( IN PSP_FILE_COPY_PARAMS_A CopyParams ); WINSETUPAPI BOOL WINAPI SetupQueueCopyIndirectW( IN PSP_FILE_COPY_PARAMS_W CopyParams ); #ifdef UNICODE #define SetupQueueCopyIndirect SetupQueueCopyIndirectW #else #define SetupQueueCopyIndirect SetupQueueCopyIndirectA #endif WINSETUPAPI BOOL WINAPI SetupQueueDefaultCopyA( IN HSPFILEQ QueueHandle, IN HINF InfHandle, IN PCSTR SourceRootPath, IN PCSTR SourceFilename, IN PCSTR TargetFilename, IN DWORD CopyStyle ); WINSETUPAPI BOOL WINAPI SetupQueueDefaultCopyW( IN HSPFILEQ QueueHandle, IN HINF InfHandle, IN PCWSTR SourceRootPath, IN PCWSTR SourceFilename, IN PCWSTR TargetFilename, IN DWORD CopyStyle ); #ifdef UNICODE #define SetupQueueDefaultCopy SetupQueueDefaultCopyW #else #define SetupQueueDefaultCopy SetupQueueDefaultCopyA #endif WINSETUPAPI BOOL WINAPI SetupQueueCopySectionA( IN HSPFILEQ QueueHandle, IN PCSTR SourceRootPath, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCSTR Section, IN DWORD CopyStyle ); WINSETUPAPI BOOL WINAPI SetupQueueCopySectionW( IN HSPFILEQ QueueHandle, IN PCWSTR SourceRootPath, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCWSTR Section, IN DWORD CopyStyle ); #ifdef UNICODE #define SetupQueueCopySection SetupQueueCopySectionW #else #define SetupQueueCopySection SetupQueueCopySectionA #endif WINSETUPAPI BOOL WINAPI SetupQueueDeleteA( IN HSPFILEQ QueueHandle, IN PCSTR PathPart1, IN PCSTR PathPart2 OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupQueueDeleteW( IN HSPFILEQ QueueHandle, IN PCWSTR PathPart1, IN PCWSTR PathPart2 OPTIONAL ); #ifdef UNICODE #define SetupQueueDelete SetupQueueDeleteW #else #define SetupQueueDelete SetupQueueDeleteA #endif WINSETUPAPI BOOL WINAPI SetupQueueDeleteSectionA( IN HSPFILEQ QueueHandle, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCSTR Section ); WINSETUPAPI BOOL WINAPI SetupQueueDeleteSectionW( IN HSPFILEQ QueueHandle, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCWSTR Section ); #ifdef UNICODE #define SetupQueueDeleteSection SetupQueueDeleteSectionW #else #define SetupQueueDeleteSection SetupQueueDeleteSectionA #endif WINSETUPAPI BOOL WINAPI SetupQueueRenameA( IN HSPFILEQ QueueHandle, IN PCSTR SourcePath, IN PCSTR SourceFilename, OPTIONAL IN PCSTR TargetPath, OPTIONAL IN PCSTR TargetFilename ); WINSETUPAPI BOOL WINAPI SetupQueueRenameW( IN HSPFILEQ QueueHandle, IN PCWSTR SourcePath, IN PCWSTR SourceFilename, OPTIONAL IN PCWSTR TargetPath, OPTIONAL IN PCWSTR TargetFilename ); #ifdef UNICODE #define SetupQueueRename SetupQueueRenameW #else #define SetupQueueRename SetupQueueRenameA #endif WINSETUPAPI BOOL WINAPI SetupQueueRenameSectionA( IN HSPFILEQ QueueHandle, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCSTR Section ); WINSETUPAPI BOOL WINAPI SetupQueueRenameSectionW( IN HSPFILEQ QueueHandle, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCWSTR Section ); #ifdef UNICODE #define SetupQueueRenameSection SetupQueueRenameSectionW #else #define SetupQueueRenameSection SetupQueueRenameSectionA #endif WINSETUPAPI BOOL WINAPI SetupCommitFileQueueA( IN HWND Owner, OPTIONAL IN HSPFILEQ QueueHandle, IN PSP_FILE_CALLBACK_A MsgHandler, IN PVOID Context ); WINSETUPAPI BOOL WINAPI SetupCommitFileQueueW( IN HWND Owner, OPTIONAL IN HSPFILEQ QueueHandle, IN PSP_FILE_CALLBACK_W MsgHandler, IN PVOID Context ); #ifdef UNICODE #define SetupCommitFileQueue SetupCommitFileQueueW #else #define SetupCommitFileQueue SetupCommitFileQueueA #endif WINSETUPAPI BOOL WINAPI SetupScanFileQueueA( IN HSPFILEQ FileQueue, IN DWORD Flags, IN HWND Window, OPTIONAL IN PSP_FILE_CALLBACK_A CallbackRoutine, OPTIONAL IN PVOID CallbackContext, OPTIONAL OUT PDWORD Result ); WINSETUPAPI BOOL WINAPI SetupScanFileQueueW( IN HSPFILEQ FileQueue, IN DWORD Flags, IN HWND Window, OPTIONAL IN PSP_FILE_CALLBACK_W CallbackRoutine, OPTIONAL IN PVOID CallbackContext, OPTIONAL OUT PDWORD Result ); #ifdef UNICODE #define SetupScanFileQueue SetupScanFileQueueW #else #define SetupScanFileQueue SetupScanFileQueueA #endif // // Define flags for SetupScanFileQueue. // #define SPQ_SCAN_FILE_PRESENCE 0x00000001 #define SPQ_SCAN_FILE_VALIDITY 0x00000002 #define SPQ_SCAN_USE_CALLBACK 0x00000004 #define SPQ_SCAN_USE_CALLBACKEX 0x00000008 #define SPQ_SCAN_INFORM_USER 0x00000010 #define SPQ_SCAN_PRUNE_COPY_QUEUE 0x00000020 // // Define flags used with Param2 for SPFILENOTIFY_QUEUESCAN // #define SPQ_DELAYED_COPY 0x00000001 // file was in use; registered for delayed copy // // Define OEM Source Type values for use in SetupCopyOEMInf. // #define SPOST_NONE 0 #define SPOST_PATH 1 #define SPOST_URL 2 #define SPOST_MAX 3 WINSETUPAPI BOOL WINAPI SetupCopyOEMInfA( IN PCSTR SourceInfFileName, IN PCSTR OEMSourceMediaLocation, OPTIONAL IN DWORD OEMSourceMediaType, IN DWORD CopyStyle, OUT PSTR DestinationInfFileName, OPTIONAL IN DWORD DestinationInfFileNameSize, OUT PDWORD RequiredSize, OPTIONAL OUT PSTR *DestinationInfFileNameComponent OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupCopyOEMInfW( IN PCWSTR SourceInfFileName, IN PCWSTR OEMSourceMediaLocation, OPTIONAL IN DWORD OEMSourceMediaType, IN DWORD CopyStyle, OUT PWSTR DestinationInfFileName, OPTIONAL IN DWORD DestinationInfFileNameSize, OUT PDWORD RequiredSize, OPTIONAL OUT PWSTR *DestinationInfFileNameComponent OPTIONAL ); #ifdef UNICODE #define SetupCopyOEMInf SetupCopyOEMInfW #else #define SetupCopyOEMInf SetupCopyOEMInfA #endif // // Disk space list APIs // WINSETUPAPI HDSKSPC WINAPI SetupCreateDiskSpaceListA( IN PVOID Reserved1, IN DWORD Reserved2, IN UINT Flags ); WINSETUPAPI HDSKSPC WINAPI SetupCreateDiskSpaceListW( IN PVOID Reserved1, IN DWORD Reserved2, IN UINT Flags ); #ifdef UNICODE #define SetupCreateDiskSpaceList SetupCreateDiskSpaceListW #else #define SetupCreateDiskSpaceList SetupCreateDiskSpaceListA #endif // // Flags for SetupCreateDiskSpaceList // #define SPDSL_IGNORE_DISK 0x00000001 // ignore deletes and on-disk files in copies #define SPDSL_DISALLOW_NEGATIVE_ADJUST 0x00000002 WINSETUPAPI HDSKSPC WINAPI SetupDuplicateDiskSpaceListA( IN HDSKSPC DiskSpace, IN PVOID Reserved1, IN DWORD Reserved2, IN UINT Flags ); WINSETUPAPI HDSKSPC WINAPI SetupDuplicateDiskSpaceListW( IN HDSKSPC DiskSpace, IN PVOID Reserved1, IN DWORD Reserved2, IN UINT Flags ); #ifdef UNICODE #define SetupDuplicateDiskSpaceList SetupDuplicateDiskSpaceListW #else #define SetupDuplicateDiskSpaceList SetupDuplicateDiskSpaceListA #endif WINSETUPAPI BOOL WINAPI SetupDestroyDiskSpaceList( IN OUT HDSKSPC DiskSpace ); WINSETUPAPI BOOL WINAPI SetupQueryDrivesInDiskSpaceListA( IN HDSKSPC DiskSpace, OUT PSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupQueryDrivesInDiskSpaceListW( IN HDSKSPC DiskSpace, OUT PWSTR ReturnBuffer, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupQueryDrivesInDiskSpaceList SetupQueryDrivesInDiskSpaceListW #else #define SetupQueryDrivesInDiskSpaceList SetupQueryDrivesInDiskSpaceListA #endif WINSETUPAPI BOOL WINAPI SetupQuerySpaceRequiredOnDriveA( IN HDSKSPC DiskSpace, IN PCSTR DriveSpec, OUT LONGLONG *SpaceRequired, IN PVOID Reserved1, IN UINT Reserved2 ); WINSETUPAPI BOOL WINAPI SetupQuerySpaceRequiredOnDriveW( IN HDSKSPC DiskSpace, IN PCWSTR DriveSpec, OUT LONGLONG *SpaceRequired, IN PVOID Reserved1, IN UINT Reserved2 ); #ifdef UNICODE #define SetupQuerySpaceRequiredOnDrive SetupQuerySpaceRequiredOnDriveW #else #define SetupQuerySpaceRequiredOnDrive SetupQuerySpaceRequiredOnDriveA #endif WINSETUPAPI BOOL WINAPI SetupAdjustDiskSpaceListA( IN HDSKSPC DiskSpace, IN LPCSTR DriveRoot, IN LONGLONG Amount, IN PVOID Reserved1, IN UINT Reserved2 ); WINSETUPAPI BOOL WINAPI SetupAdjustDiskSpaceListW( IN HDSKSPC DiskSpace, IN LPCWSTR DriveRoot, IN LONGLONG Amount, IN PVOID Reserved1, IN UINT Reserved2 ); #ifdef UNICODE #define SetupAdjustDiskSpaceList SetupAdjustDiskSpaceListW #else #define SetupAdjustDiskSpaceList SetupAdjustDiskSpaceListA #endif WINSETUPAPI BOOL WINAPI SetupAddToDiskSpaceListA( IN HDSKSPC DiskSpace, IN PCSTR TargetFilespec, IN LONGLONG FileSize, IN UINT Operation, IN PVOID Reserved1, IN UINT Reserved2 ); WINSETUPAPI BOOL WINAPI SetupAddToDiskSpaceListW( IN HDSKSPC DiskSpace, IN PCWSTR TargetFilespec, IN LONGLONG FileSize, IN UINT Operation, IN PVOID Reserved1, IN UINT Reserved2 ); #ifdef UNICODE #define SetupAddToDiskSpaceList SetupAddToDiskSpaceListW #else #define SetupAddToDiskSpaceList SetupAddToDiskSpaceListA #endif WINSETUPAPI BOOL WINAPI SetupAddSectionToDiskSpaceListA( IN HDSKSPC DiskSpace, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCSTR SectionName, IN UINT Operation, IN PVOID Reserved1, IN UINT Reserved2 ); WINSETUPAPI BOOL WINAPI SetupAddSectionToDiskSpaceListW( IN HDSKSPC DiskSpace, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCWSTR SectionName, IN UINT Operation, IN PVOID Reserved1, IN UINT Reserved2 ); #ifdef UNICODE #define SetupAddSectionToDiskSpaceList SetupAddSectionToDiskSpaceListW #else #define SetupAddSectionToDiskSpaceList SetupAddSectionToDiskSpaceListA #endif WINSETUPAPI BOOL WINAPI SetupAddInstallSectionToDiskSpaceListA( IN HDSKSPC DiskSpace, IN HINF InfHandle, IN HINF LayoutInfHandle, OPTIONAL IN PCSTR SectionName, IN PVOID Reserved1, IN UINT Reserved2 ); WINSETUPAPI BOOL WINAPI SetupAddInstallSectionToDiskSpaceListW( IN HDSKSPC DiskSpace, IN HINF InfHandle, IN HINF LayoutInfHandle, OPTIONAL IN PCWSTR SectionName, IN PVOID Reserved1, IN UINT Reserved2 ); #ifdef UNICODE #define SetupAddInstallSectionToDiskSpaceList SetupAddInstallSectionToDiskSpaceListW #else #define SetupAddInstallSectionToDiskSpaceList SetupAddInstallSectionToDiskSpaceListA #endif WINSETUPAPI BOOL WINAPI SetupRemoveFromDiskSpaceListA( IN HDSKSPC DiskSpace, IN PCSTR TargetFilespec, IN UINT Operation, IN PVOID Reserved1, IN UINT Reserved2 ); WINSETUPAPI BOOL WINAPI SetupRemoveFromDiskSpaceListW( IN HDSKSPC DiskSpace, IN PCWSTR TargetFilespec, IN UINT Operation, IN PVOID Reserved1, IN UINT Reserved2 ); #ifdef UNICODE #define SetupRemoveFromDiskSpaceList SetupRemoveFromDiskSpaceListW #else #define SetupRemoveFromDiskSpaceList SetupRemoveFromDiskSpaceListA #endif WINSETUPAPI BOOL WINAPI SetupRemoveSectionFromDiskSpaceListA( IN HDSKSPC DiskSpace, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCSTR SectionName, IN UINT Operation, IN PVOID Reserved1, IN UINT Reserved2 ); WINSETUPAPI BOOL WINAPI SetupRemoveSectionFromDiskSpaceListW( IN HDSKSPC DiskSpace, IN HINF InfHandle, IN HINF ListInfHandle, OPTIONAL IN PCWSTR SectionName, IN UINT Operation, IN PVOID Reserved1, IN UINT Reserved2 ); #ifdef UNICODE #define SetupRemoveSectionFromDiskSpaceList SetupRemoveSectionFromDiskSpaceListW #else #define SetupRemoveSectionFromDiskSpaceList SetupRemoveSectionFromDiskSpaceListA #endif WINSETUPAPI BOOL WINAPI SetupRemoveInstallSectionFromDiskSpaceListA( IN HDSKSPC DiskSpace, IN HINF InfHandle, IN HINF LayoutInfHandle, OPTIONAL IN PCSTR SectionName, IN PVOID Reserved1, IN UINT Reserved2 ); WINSETUPAPI BOOL WINAPI SetupRemoveInstallSectionFromDiskSpaceListW( IN HDSKSPC DiskSpace, IN HINF InfHandle, IN HINF LayoutInfHandle, OPTIONAL IN PCWSTR SectionName, IN PVOID Reserved1, IN UINT Reserved2 ); #ifdef UNICODE #define SetupRemoveInstallSectionFromDiskSpaceList SetupRemoveInstallSectionFromDiskSpaceListW #else #define SetupRemoveInstallSectionFromDiskSpaceList SetupRemoveInstallSectionFromDiskSpaceListA #endif // // Cabinet APIs // WINSETUPAPI BOOL WINAPI SetupIterateCabinetA( IN PCSTR CabinetFile, IN DWORD Reserved, IN PSP_FILE_CALLBACK_A MsgHandler, IN PVOID Context ); WINSETUPAPI BOOL WINAPI SetupIterateCabinetW( IN PCWSTR CabinetFile, IN DWORD Reserved, IN PSP_FILE_CALLBACK_W MsgHandler, IN PVOID Context ); #ifdef UNICODE #define SetupIterateCabinet SetupIterateCabinetW #else #define SetupIterateCabinet SetupIterateCabinetA #endif WINSETUPAPI INT WINAPI SetupPromptReboot( IN HSPFILEQ FileQueue, OPTIONAL IN HWND Owner, IN BOOL ScanOnly ); // // Define flags that are returned by SetupPromptReboot // #define SPFILEQ_FILE_IN_USE 0x00000001 #define SPFILEQ_REBOOT_RECOMMENDED 0x00000002 #define SPFILEQ_REBOOT_IN_PROGRESS 0x00000004 WINSETUPAPI PVOID WINAPI SetupInitDefaultQueueCallback( IN HWND OwnerWindow ); WINSETUPAPI PVOID WINAPI SetupInitDefaultQueueCallbackEx( IN HWND OwnerWindow, IN HWND AlternateProgressWindow, OPTIONAL IN UINT ProgressMessage, IN DWORD Reserved1, IN PVOID Reserved2 ); WINSETUPAPI VOID WINAPI SetupTermDefaultQueueCallback( IN PVOID Context ); WINSETUPAPI UINT WINAPI SetupDefaultQueueCallbackA( IN PVOID Context, IN UINT Notification, IN UINT_PTR Param1, IN UINT_PTR Param2 ); WINSETUPAPI UINT WINAPI SetupDefaultQueueCallbackW( IN PVOID Context, IN UINT Notification, IN UINT_PTR Param1, IN UINT_PTR Param2 ); #ifdef UNICODE #define SetupDefaultQueueCallback SetupDefaultQueueCallbackW #else #define SetupDefaultQueueCallback SetupDefaultQueueCallbackA #endif // // Flags for AddReg section lines in INF. The corresponding value // is in the AddReg line format given below: // // ,,,,... // // The low word contains basic flags concerning the general data type // and AddReg action. The high word contains values that more specifically // identify the data type of the registry value. The high word is ignored // by the 16-bit Windows 95 SETUPX APIs. // #define FLG_ADDREG_BINVALUETYPE ( 0x00000001 ) #define FLG_ADDREG_NOCLOBBER ( 0x00000002 ) #define FLG_ADDREG_DELVAL ( 0x00000004 ) #define FLG_ADDREG_APPEND ( 0x00000008 ) // Currently supported only // for REG_MULTI_SZ values. #define FLG_ADDREG_KEYONLY ( 0x00000010 ) // Just create the key, ignore value #define FLG_ADDREG_OVERWRITEONLY ( 0x00000020 ) // Set only if value already exists #define FLG_ADDREG_TYPE_MASK ( 0xFFFF0000 | FLG_ADDREG_BINVALUETYPE ) #define FLG_ADDREG_TYPE_SZ ( 0x00000000 ) #define FLG_ADDREG_TYPE_MULTI_SZ ( 0x00010000 ) #define FLG_ADDREG_TYPE_EXPAND_SZ ( 0x00020000 ) #define FLG_ADDREG_TYPE_BINARY ( 0x00000000 | FLG_ADDREG_BINVALUETYPE ) #define FLG_ADDREG_TYPE_DWORD ( 0x00010000 | FLG_ADDREG_BINVALUETYPE ) #define FLG_ADDREG_TYPE_NONE ( 0x00020000 | FLG_ADDREG_BINVALUETYPE ) // // Flags for BitReg section lines in INF. // #define FLG_BITREG_CLEARBITS ( 0x00000000 ) #define FLG_BITREG_SETBITS ( 0x00000001 ) // // Flags for RegSvr section lines in INF // #define FLG_REGSVR_DLLREGISTER ( 0x00000001 ) #define FLG_REGSVR_DLLINSTALL ( 0x00000002 ) // Flags for RegSvr section lines in INF // #define FLG_PROFITEM_CURRENTUSER ( 0x00000001 ) #define FLG_PROFITEM_DELETE ( 0x00000002 ) #define FLG_PROFITEM_GROUP ( 0x00000004 ) #define FLG_PROFITEM_CSIDL ( 0x00000008 ) // // The INF may supply any arbitrary data type ordinal in the highword except // for the following: REG_NONE, REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ. If this // technique is used, then the data is given in binary format, one byte per // field. // WINSETUPAPI BOOL WINAPI SetupInstallFromInfSectionA( IN HWND Owner, IN HINF InfHandle, IN PCSTR SectionName, IN UINT Flags, IN HKEY RelativeKeyRoot, OPTIONAL IN PCSTR SourceRootPath, OPTIONAL IN UINT CopyFlags, OPTIONAL IN PSP_FILE_CALLBACK_A MsgHandler, OPTIONAL IN PVOID Context, OPTIONAL IN HDEVINFO DeviceInfoSet, OPTIONAL IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupInstallFromInfSectionW( IN HWND Owner, IN HINF InfHandle, IN PCWSTR SectionName, IN UINT Flags, IN HKEY RelativeKeyRoot, OPTIONAL IN PCWSTR SourceRootPath, OPTIONAL IN UINT CopyFlags, OPTIONAL IN PSP_FILE_CALLBACK_W MsgHandler, OPTIONAL IN PVOID Context, OPTIONAL IN HDEVINFO DeviceInfoSet, OPTIONAL IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); #ifdef UNICODE #define SetupInstallFromInfSection SetupInstallFromInfSectionW #else #define SetupInstallFromInfSection SetupInstallFromInfSectionA #endif // // Flags for SetupInstallFromInfSection // #define SPINST_LOGCONFIG 0x00000001 #define SPINST_INIFILES 0x00000002 #define SPINST_REGISTRY 0x00000004 #define SPINST_INI2REG 0x00000008 #define SPINST_FILES 0x00000010 #define SPINST_BITREG 0x00000020 #define SPINST_REGSVR 0x00000040 #define SPINST_UNREGSVR 0x00000080 #define SPINST_PROFILEITEMS 0x00000100 #define SPINST_ALL 0x000001ff #define SPINST_SINGLESECTION 0x00010000 #define SPINST_LOGCONFIG_IS_FORCED 0x00020000 #define SPINST_LOGCONFIGS_ARE_OVERRIDES 0x00040000 WINSETUPAPI BOOL WINAPI SetupInstallFilesFromInfSectionA( IN HINF InfHandle, IN HINF LayoutInfHandle, OPTIONAL IN HSPFILEQ FileQueue, IN PCSTR SectionName, IN PCSTR SourceRootPath, OPTIONAL IN UINT CopyFlags ); WINSETUPAPI BOOL WINAPI SetupInstallFilesFromInfSectionW( IN HINF InfHandle, IN HINF LayoutInfHandle, OPTIONAL IN HSPFILEQ FileQueue, IN PCWSTR SectionName, IN PCWSTR SourceRootPath, OPTIONAL IN UINT CopyFlags ); #ifdef UNICODE #define SetupInstallFilesFromInfSection SetupInstallFilesFromInfSectionW #else #define SetupInstallFilesFromInfSection SetupInstallFilesFromInfSectionA #endif // // Flags for SetupInstallServicesFromInfSection(Ex). These flags are also used // in the flags field of AddService or DelService lines in a device INF. Some // of these flags are not permitted in the non-Ex API. These flags are marked // as such below. // // // (AddService) move service's tag to front of its group order list // #define SPSVCINST_TAGTOFRONT (0x00000001) // // (AddService) **Ex API only** mark this service as the function driver for the // device being installed // #define SPSVCINST_ASSOCSERVICE (0x00000002) // // (DelService) delete the associated event log entry for a service specified in // a DelService entry // #define SPSVCINST_DELETEEVENTLOGENTRY (0x00000004) // // (AddService) don't overwrite display name if it already exists // #define SPSVCINST_NOCLOBBER_DISPLAYNAME (0x00000008) // // (AddService) don't overwrite start type value if service already exists // #define SPSVCINST_NOCLOBBER_STARTTYPE (0x00000010) // // (AddService) don't overwrite error control value if service already exists // #define SPSVCINST_NOCLOBBER_ERRORCONTROL (0x00000020) // // (AddService) don't overwrite load order group if it already exists // #define SPSVCINST_NOCLOBBER_LOADORDERGROUP (0x00000040) // // (AddService) don't overwrite dependencies list if it already exists // #define SPSVCINST_NOCLOBBER_DEPENDENCIES (0x00000080) // // (AddService) don't overwrite description if it already exists // #define SPSVCINST_NOCLOBBER_DESCRIPTION (0x00000100) // // (DelService) stop the associated service specified in // a DelService entry before deleting the service // #define SPSVCINST_STOPSERVICE (0x00000200) WINSETUPAPI BOOL WINAPI SetupInstallServicesFromInfSectionA( IN HINF InfHandle, IN PCSTR SectionName, IN DWORD Flags ); WINSETUPAPI BOOL WINAPI SetupInstallServicesFromInfSectionW( IN HINF InfHandle, IN PCWSTR SectionName, IN DWORD Flags ); #ifdef UNICODE #define SetupInstallServicesFromInfSection SetupInstallServicesFromInfSectionW #else #define SetupInstallServicesFromInfSection SetupInstallServicesFromInfSectionA #endif WINSETUPAPI BOOL WINAPI SetupInstallServicesFromInfSectionExA( IN HINF InfHandle, IN PCSTR SectionName, IN DWORD Flags, IN HDEVINFO DeviceInfoSet, OPTIONAL IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PVOID Reserved1, IN PVOID Reserved2 ); WINSETUPAPI BOOL WINAPI SetupInstallServicesFromInfSectionExW( IN HINF InfHandle, IN PCWSTR SectionName, IN DWORD Flags, IN HDEVINFO DeviceInfoSet, OPTIONAL IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PVOID Reserved1, IN PVOID Reserved2 ); #ifdef UNICODE #define SetupInstallServicesFromInfSectionEx SetupInstallServicesFromInfSectionExW #else #define SetupInstallServicesFromInfSectionEx SetupInstallServicesFromInfSectionExA #endif // // Define handle type for Setup file log. // typedef PVOID HSPFILELOG; WINSETUPAPI HSPFILELOG WINAPI SetupInitializeFileLogA( IN PCSTR LogFileName, OPTIONAL IN DWORD Flags ); WINSETUPAPI HSPFILELOG WINAPI SetupInitializeFileLogW( IN PCWSTR LogFileName, OPTIONAL IN DWORD Flags ); #ifdef UNICODE #define SetupInitializeFileLog SetupInitializeFileLogW #else #define SetupInitializeFileLog SetupInitializeFileLogA #endif // // Flags for SetupInitializeFileLog // #define SPFILELOG_SYSTEMLOG 0x00000001 // use system log -- must be Administrator #define SPFILELOG_FORCENEW 0x00000002 // not valid with SPFILELOG_SYSTEMLOG #define SPFILELOG_QUERYONLY 0x00000004 // allows non-administrators to read system log WINSETUPAPI BOOL WINAPI SetupTerminateFileLog( IN HSPFILELOG FileLogHandle ); WINSETUPAPI BOOL WINAPI SetupLogFileA( IN HSPFILELOG FileLogHandle, IN PCSTR LogSectionName, OPTIONAL IN PCSTR SourceFilename, IN PCSTR TargetFilename, IN DWORD Checksum, OPTIONAL IN PCSTR DiskTagfile, OPTIONAL IN PCSTR DiskDescription, OPTIONAL IN PCSTR OtherInfo, OPTIONAL IN DWORD Flags ); WINSETUPAPI BOOL WINAPI SetupLogFileW( IN HSPFILELOG FileLogHandle, IN PCWSTR LogSectionName, OPTIONAL IN PCWSTR SourceFilename, IN PCWSTR TargetFilename, IN DWORD Checksum, OPTIONAL IN PCWSTR DiskTagfile, OPTIONAL IN PCWSTR DiskDescription, OPTIONAL IN PCWSTR OtherInfo, OPTIONAL IN DWORD Flags ); #ifdef UNICODE #define SetupLogFile SetupLogFileW #else #define SetupLogFile SetupLogFileA #endif // // Flags for SetupLogFile // #define SPFILELOG_OEMFILE 0x00000001 WINSETUPAPI BOOL WINAPI SetupRemoveFileLogEntryA( IN HSPFILELOG FileLogHandle, IN PCSTR LogSectionName, OPTIONAL IN PCSTR TargetFilename OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupRemoveFileLogEntryW( IN HSPFILELOG FileLogHandle, IN PCWSTR LogSectionName, OPTIONAL IN PCWSTR TargetFilename OPTIONAL ); #ifdef UNICODE #define SetupRemoveFileLogEntry SetupRemoveFileLogEntryW #else #define SetupRemoveFileLogEntry SetupRemoveFileLogEntryA #endif // // Items retrievable from SetupQueryFileLog() // typedef enum { SetupFileLogSourceFilename, SetupFileLogChecksum, SetupFileLogDiskTagfile, SetupFileLogDiskDescription, SetupFileLogOtherInfo, SetupFileLogMax } SetupFileLogInfo; WINSETUPAPI BOOL WINAPI SetupQueryFileLogA( IN HSPFILELOG FileLogHandle, IN PCSTR LogSectionName, OPTIONAL IN PCSTR TargetFilename, IN SetupFileLogInfo DesiredInfo, OUT PSTR DataOut, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupQueryFileLogW( IN HSPFILELOG FileLogHandle, IN PCWSTR LogSectionName, OPTIONAL IN PCWSTR TargetFilename, IN SetupFileLogInfo DesiredInfo, OUT PWSTR DataOut, OPTIONAL IN DWORD ReturnBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupQueryFileLog SetupQueryFileLogW #else #define SetupQueryFileLog SetupQueryFileLogA #endif // // Text logging APIs // #define LogSeverity DWORD #define LogSevInformation 0x00000000 #define LogSevWarning 0x00000001 #define LogSevError 0x00000002 #define LogSevFatalError 0x00000003 #define LogSevMaximum 0x00000004 WINSETUPAPI BOOL WINAPI SetupOpenLog ( BOOL Erase ); WINSETUPAPI BOOL WINAPI SetupLogErrorA ( IN LPCSTR MessageString, IN LogSeverity Severity ); WINSETUPAPI BOOL WINAPI SetupLogErrorW ( IN LPCWSTR MessageString, IN LogSeverity Severity ); #ifdef UNICODE #define SetupLogError SetupLogErrorW #else #define SetupLogError SetupLogErrorA #endif WINSETUPAPI VOID WINAPI SetupCloseLog ( VOID ); // // Backup Information API // WINSETUPAPI BOOL WINAPI SetupGetBackupInformationA( IN HSPFILEQ QueueHandle, OUT PSP_BACKUP_QUEUE_PARAMS_A BackupParams ); WINSETUPAPI BOOL WINAPI SetupGetBackupInformationW( IN HSPFILEQ QueueHandle, OUT PSP_BACKUP_QUEUE_PARAMS_W BackupParams ); #ifdef UNICODE #define SetupGetBackupInformation SetupGetBackupInformationW #else #define SetupGetBackupInformation SetupGetBackupInformationA #endif // // Device Installer APIs // WINSETUPAPI HDEVINFO WINAPI SetupDiCreateDeviceInfoList( IN CONST GUID *ClassGuid, OPTIONAL IN HWND hwndParent OPTIONAL ); WINSETUPAPI HDEVINFO WINAPI SetupDiCreateDeviceInfoListExA( IN CONST GUID *ClassGuid, OPTIONAL IN HWND hwndParent, OPTIONAL IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI HDEVINFO WINAPI SetupDiCreateDeviceInfoListExW( IN CONST GUID *ClassGuid, OPTIONAL IN HWND hwndParent, OPTIONAL IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiCreateDeviceInfoListEx SetupDiCreateDeviceInfoListExW #else #define SetupDiCreateDeviceInfoListEx SetupDiCreateDeviceInfoListExA #endif WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInfoListClass( IN HDEVINFO DeviceInfoSet, OUT LPGUID ClassGuid ); WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInfoListDetailA( IN HDEVINFO DeviceInfoSet, OUT PSP_DEVINFO_LIST_DETAIL_DATA_A DeviceInfoSetDetailData ); WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInfoListDetailW( IN HDEVINFO DeviceInfoSet, OUT PSP_DEVINFO_LIST_DETAIL_DATA_W DeviceInfoSetDetailData ); #ifdef UNICODE #define SetupDiGetDeviceInfoListDetail SetupDiGetDeviceInfoListDetailW #else #define SetupDiGetDeviceInfoListDetail SetupDiGetDeviceInfoListDetailA #endif // // Flags for SetupDiCreateDeviceInfo // #define DICD_GENERATE_ID 0x00000001 #define DICD_INHERIT_CLASSDRVS 0x00000002 WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInfoA( IN HDEVINFO DeviceInfoSet, IN PCSTR DeviceName, IN CONST GUID *ClassGuid, IN PCSTR DeviceDescription, OPTIONAL IN HWND hwndParent, OPTIONAL IN DWORD CreationFlags, OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInfoW( IN HDEVINFO DeviceInfoSet, IN PCWSTR DeviceName, IN CONST GUID *ClassGuid, IN PCWSTR DeviceDescription, OPTIONAL IN HWND hwndParent, OPTIONAL IN DWORD CreationFlags, OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); #ifdef UNICODE #define SetupDiCreateDeviceInfo SetupDiCreateDeviceInfoW #else #define SetupDiCreateDeviceInfo SetupDiCreateDeviceInfoA #endif // // Flags for SetupDiOpenDeviceInfo // #define DIOD_INHERIT_CLASSDRVS 0x00000002 #define DIOD_CANCEL_REMOVE 0x00000004 WINSETUPAPI BOOL WINAPI SetupDiOpenDeviceInfoA( IN HDEVINFO DeviceInfoSet, IN PCSTR DeviceInstanceId, IN HWND hwndParent, OPTIONAL IN DWORD OpenFlags, OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiOpenDeviceInfoW( IN HDEVINFO DeviceInfoSet, IN PCWSTR DeviceInstanceId, IN HWND hwndParent, OPTIONAL IN DWORD OpenFlags, OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); #ifdef UNICODE #define SetupDiOpenDeviceInfo SetupDiOpenDeviceInfoW #else #define SetupDiOpenDeviceInfo SetupDiOpenDeviceInfoA #endif WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInstanceIdA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OUT PSTR DeviceInstanceId, IN DWORD DeviceInstanceIdSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInstanceIdW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OUT PWSTR DeviceInstanceId, IN DWORD DeviceInstanceIdSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupDiGetDeviceInstanceId SetupDiGetDeviceInstanceIdW #else #define SetupDiGetDeviceInstanceId SetupDiGetDeviceInstanceIdA #endif WINSETUPAPI BOOL WINAPI SetupDiDeleteDeviceInfo( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData ); WINSETUPAPI BOOL WINAPI SetupDiEnumDeviceInfo( IN HDEVINFO DeviceInfoSet, IN DWORD MemberIndex, OUT PSP_DEVINFO_DATA DeviceInfoData ); WINSETUPAPI BOOL WINAPI SetupDiDestroyDeviceInfoList( IN HDEVINFO DeviceInfoSet ); WINSETUPAPI BOOL WINAPI SetupDiEnumDeviceInterfaces( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN CONST GUID *InterfaceClassGuid, IN DWORD MemberIndex, OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ); // // Backward compatibility--do not use // #define SetupDiEnumInterfaceDevice SetupDiEnumDeviceInterfaces WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInterfaceA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN CONST GUID *InterfaceClassGuid, IN PCSTR ReferenceString, OPTIONAL IN DWORD CreationFlags, OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInterfaceW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN CONST GUID *InterfaceClassGuid, IN PCWSTR ReferenceString, OPTIONAL IN DWORD CreationFlags, OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL ); #ifdef UNICODE #define SetupDiCreateDeviceInterface SetupDiCreateDeviceInterfaceW #else #define SetupDiCreateDeviceInterface SetupDiCreateDeviceInterfaceA #endif // // Backward compatibility--do not use. // #define SetupDiCreateInterfaceDeviceW SetupDiCreateDeviceInterfaceW #define SetupDiCreateInterfaceDeviceA SetupDiCreateDeviceInterfaceA #ifdef UNICODE #define SetupDiCreateInterfaceDevice SetupDiCreateDeviceInterfaceW #else #define SetupDiCreateInterfaceDevice SetupDiCreateDeviceInterfaceA #endif // // Flags for SetupDiOpenDeviceInterface // #define DIODI_NO_ADD 0x00000001 WINSETUPAPI BOOL WINAPI SetupDiOpenDeviceInterfaceA( IN HDEVINFO DeviceInfoSet, IN PCSTR DevicePath, IN DWORD OpenFlags, OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiOpenDeviceInterfaceW( IN HDEVINFO DeviceInfoSet, IN PCWSTR DevicePath, IN DWORD OpenFlags, OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData OPTIONAL ); #ifdef UNICODE #define SetupDiOpenDeviceInterface SetupDiOpenDeviceInterfaceW #else #define SetupDiOpenDeviceInterface SetupDiOpenDeviceInterfaceA #endif // // Backward compatibility--do not use // #define SetupDiOpenInterfaceDeviceW SetupDiOpenDeviceInterfaceW #define SetupDiOpenInterfaceDeviceA SetupDiOpenDeviceInterfaceA #ifdef UNICODE #define SetupDiOpenInterfaceDevice SetupDiOpenDeviceInterfaceW #else #define SetupDiOpenInterfaceDevice SetupDiOpenDeviceInterfaceA #endif WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInterfaceAlias( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN CONST GUID *AliasInterfaceClassGuid, OUT PSP_DEVICE_INTERFACE_DATA AliasDeviceInterfaceData ); // // Backward compatibility--do not use. // #define SetupDiGetInterfaceDeviceAlias SetupDiGetDeviceInterfaceAlias WINSETUPAPI BOOL WINAPI SetupDiDeleteDeviceInterfaceData( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ); // // Backward compatibility--do not use. // #define SetupDiDeleteInterfaceDeviceData SetupDiDeleteDeviceInterfaceData WINSETUPAPI BOOL WINAPI SetupDiRemoveDeviceInterface( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData ); // // Backward compatibility--do not use. // #define SetupDiRemoveInterfaceDevice SetupDiRemoveDeviceInterface WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInterfaceDetailA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData, OPTIONAL IN DWORD DeviceInterfaceDetailDataSize, OUT PDWORD RequiredSize, OPTIONAL OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInterfaceDetailW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, OUT PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, OPTIONAL IN DWORD DeviceInterfaceDetailDataSize, OUT PDWORD RequiredSize, OPTIONAL OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); #ifdef UNICODE #define SetupDiGetDeviceInterfaceDetail SetupDiGetDeviceInterfaceDetailW #else #define SetupDiGetDeviceInterfaceDetail SetupDiGetDeviceInterfaceDetailA #endif // // Backward compatibility--do not use. // #define SetupDiGetInterfaceDeviceDetailW SetupDiGetDeviceInterfaceDetailW #define SetupDiGetInterfaceDeviceDetailA SetupDiGetDeviceInterfaceDetailA #ifdef UNICODE #define SetupDiGetInterfaceDeviceDetail SetupDiGetDeviceInterfaceDetailW #else #define SetupDiGetInterfaceDeviceDetail SetupDiGetDeviceInterfaceDetailA #endif // // Default install handler for DIF_INSTALLINTERFACES. // WINSETUPAPI BOOL WINAPI SetupDiInstallDeviceInterfaces( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData ); // // Backward compatibility--do not use. // #define SetupDiInstallInterfaceDevices SetupDiInstallDeviceInterfaces // // Default install handler for DIF_REGISTERDEVICE // // // Flags for SetupDiRegisterDeviceInfo // #define SPRDI_FIND_DUPS 0x00000001 WINSETUPAPI BOOL WINAPI SetupDiRegisterDeviceInfo( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Flags, IN PSP_DETSIG_CMPPROC CompareProc, OPTIONAL IN PVOID CompareContext, OPTIONAL OUT PSP_DEVINFO_DATA DupDeviceInfoData OPTIONAL ); // // Ordinal values distinguishing between class drivers and // device drivers. // (Passed in 'DriverType' parameter of driver information list APIs) // #define SPDIT_NODRIVER 0x00000000 #define SPDIT_CLASSDRIVER 0x00000001 #define SPDIT_COMPATDRIVER 0x00000002 WINSETUPAPI BOOL WINAPI SetupDiBuildDriverInfoList( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN DWORD DriverType ); WINSETUPAPI BOOL WINAPI SetupDiCancelDriverInfoSearch( IN HDEVINFO DeviceInfoSet ); WINSETUPAPI BOOL WINAPI SetupDiEnumDriverInfoA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN DWORD DriverType, IN DWORD MemberIndex, OUT PSP_DRVINFO_DATA_A DriverInfoData ); WINSETUPAPI BOOL WINAPI SetupDiEnumDriverInfoW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN DWORD DriverType, IN DWORD MemberIndex, OUT PSP_DRVINFO_DATA_W DriverInfoData ); #ifdef UNICODE #define SetupDiEnumDriverInfo SetupDiEnumDriverInfoW #else #define SetupDiEnumDriverInfo SetupDiEnumDriverInfoA #endif WINSETUPAPI BOOL WINAPI SetupDiGetSelectedDriverA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL OUT PSP_DRVINFO_DATA_A DriverInfoData ); WINSETUPAPI BOOL WINAPI SetupDiGetSelectedDriverW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL OUT PSP_DRVINFO_DATA_W DriverInfoData ); #ifdef UNICODE #define SetupDiGetSelectedDriver SetupDiGetSelectedDriverW #else #define SetupDiGetSelectedDriver SetupDiGetSelectedDriverA #endif WINSETUPAPI BOOL WINAPI SetupDiSetSelectedDriverA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN OUT PSP_DRVINFO_DATA_A DriverInfoData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiSetSelectedDriverW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN OUT PSP_DRVINFO_DATA_W DriverInfoData OPTIONAL ); #ifdef UNICODE #define SetupDiSetSelectedDriver SetupDiSetSelectedDriverW #else #define SetupDiSetSelectedDriver SetupDiSetSelectedDriverA #endif WINSETUPAPI BOOL WINAPI SetupDiGetDriverInfoDetailA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_DRVINFO_DATA_A DriverInfoData, OUT PSP_DRVINFO_DETAIL_DATA_A DriverInfoDetailData, OPTIONAL IN DWORD DriverInfoDetailDataSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetDriverInfoDetailW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_DRVINFO_DATA_W DriverInfoData, OUT PSP_DRVINFO_DETAIL_DATA_W DriverInfoDetailData, OPTIONAL IN DWORD DriverInfoDetailDataSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupDiGetDriverInfoDetail SetupDiGetDriverInfoDetailW #else #define SetupDiGetDriverInfoDetail SetupDiGetDriverInfoDetailA #endif WINSETUPAPI BOOL WINAPI SetupDiDestroyDriverInfoList( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN DWORD DriverType ); // // Flags controlling what is included in the device information set built // by SetupDiGetClassDevs // #define DIGCF_DEFAULT 0x00000001 // only valid with DIGCF_DEVICEINTERFACE #define DIGCF_PRESENT 0x00000002 #define DIGCF_ALLCLASSES 0x00000004 #define DIGCF_PROFILE 0x00000008 #define DIGCF_DEVICEINTERFACE 0x00000010 // // Backward compatibility--do not use. // #define DIGCF_INTERFACEDEVICE DIGCF_DEVICEINTERFACE WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsA( IN CONST GUID *ClassGuid, OPTIONAL IN PCSTR Enumerator, OPTIONAL IN HWND hwndParent, OPTIONAL IN DWORD Flags ); WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsW( IN CONST GUID *ClassGuid, OPTIONAL IN PCWSTR Enumerator, OPTIONAL IN HWND hwndParent, OPTIONAL IN DWORD Flags ); #ifdef UNICODE #define SetupDiGetClassDevs SetupDiGetClassDevsW #else #define SetupDiGetClassDevs SetupDiGetClassDevsA #endif WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsExA( IN CONST GUID *ClassGuid, OPTIONAL IN PCSTR Enumerator, OPTIONAL IN HWND hwndParent, OPTIONAL IN DWORD Flags, IN HDEVINFO DeviceInfoSet, OPTIONAL IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsExW( IN CONST GUID *ClassGuid, OPTIONAL IN PCWSTR Enumerator, OPTIONAL IN HWND hwndParent, OPTIONAL IN DWORD Flags, IN HDEVINFO DeviceInfoSet, OPTIONAL IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiGetClassDevsEx SetupDiGetClassDevsExW #else #define SetupDiGetClassDevsEx SetupDiGetClassDevsExA #endif WINSETUPAPI BOOL WINAPI SetupDiGetINFClassA( IN PCSTR InfName, OUT LPGUID ClassGuid, OUT PSTR ClassName, IN DWORD ClassNameSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetINFClassW( IN PCWSTR InfName, OUT LPGUID ClassGuid, OUT PWSTR ClassName, IN DWORD ClassNameSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupDiGetINFClass SetupDiGetINFClassW #else #define SetupDiGetINFClass SetupDiGetINFClassA #endif // // Flags controlling exclusion from the class information list built // by SetupDiBuildClassInfoList(Ex) // #define DIBCI_NOINSTALLCLASS 0x00000001 #define DIBCI_NODISPLAYCLASS 0x00000002 WINSETUPAPI BOOL WINAPI SetupDiBuildClassInfoList( IN DWORD Flags, OUT LPGUID ClassGuidList, IN DWORD ClassGuidListSize, OUT PDWORD RequiredSize ); WINSETUPAPI BOOL WINAPI SetupDiBuildClassInfoListExA( IN DWORD Flags, OUT LPGUID ClassGuidList, IN DWORD ClassGuidListSize, OUT PDWORD RequiredSize, IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiBuildClassInfoListExW( IN DWORD Flags, OUT LPGUID ClassGuidList, IN DWORD ClassGuidListSize, OUT PDWORD RequiredSize, IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiBuildClassInfoListEx SetupDiBuildClassInfoListExW #else #define SetupDiBuildClassInfoListEx SetupDiBuildClassInfoListExA #endif WINSETUPAPI BOOL WINAPI SetupDiGetClassDescriptionA( IN CONST GUID *ClassGuid, OUT PSTR ClassDescription, IN DWORD ClassDescriptionSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetClassDescriptionW( IN CONST GUID *ClassGuid, OUT PWSTR ClassDescription, IN DWORD ClassDescriptionSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupDiGetClassDescription SetupDiGetClassDescriptionW #else #define SetupDiGetClassDescription SetupDiGetClassDescriptionA #endif WINSETUPAPI BOOL WINAPI SetupDiGetClassDescriptionExA( IN CONST GUID *ClassGuid, OUT PSTR ClassDescription, IN DWORD ClassDescriptionSize, OUT PDWORD RequiredSize, OPTIONAL IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiGetClassDescriptionExW( IN CONST GUID *ClassGuid, OUT PWSTR ClassDescription, IN DWORD ClassDescriptionSize, OUT PDWORD RequiredSize, OPTIONAL IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiGetClassDescriptionEx SetupDiGetClassDescriptionExW #else #define SetupDiGetClassDescriptionEx SetupDiGetClassDescriptionExA #endif WINSETUPAPI BOOL WINAPI SetupDiCallClassInstaller( IN DI_FUNCTION InstallFunction, IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); // // Default install handler for DIF_SELECTDEVICE // WINSETUPAPI BOOL WINAPI SetupDiSelectDevice( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); // // Default install handler for DIF_SELECTBESTCOMPATDRV // WINSETUPAPI BOOL WINAPI SetupDiSelectBestCompatDrv( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); // // Default install handler for DIF_INSTALLDEVICE // WINSETUPAPI BOOL WINAPI SetupDiInstallDevice( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData ); // // Default install handler for DIF_INSTALLDEVICEFILES // WINSETUPAPI BOOL WINAPI SetupDiInstallDriverFiles( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData ); // // Default install handler for DIF_REGISTER_COINSTALLERS // WINSETUPAPI BOOL WINAPI SetupDiRegisterCoDeviceInstallers( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData ); // // Default install handler for DIF_REMOVE // WINSETUPAPI BOOL WINAPI SetupDiRemoveDevice( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData ); // // Default install handler for DIF_UNREMOVE // WINSETUPAPI BOOL WINAPI SetupDiUnremoveDevice( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData ); // // Default install handler for DIF_MOVEDEVICE // WINSETUPAPI BOOL WINAPI SetupDiMoveDuplicateDevice( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DestinationDeviceInfoData ); // // Default install handler for DIF_PROPERTYCHANGE // WINSETUPAPI BOOL WINAPI SetupDiChangeState( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData ); WINSETUPAPI BOOL WINAPI SetupDiInstallClassA( IN HWND hwndParent, OPTIONAL IN PCSTR InfFileName, IN DWORD Flags, IN HSPFILEQ FileQueue OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiInstallClassW( IN HWND hwndParent, OPTIONAL IN PCWSTR InfFileName, IN DWORD Flags, IN HSPFILEQ FileQueue OPTIONAL ); #ifdef UNICODE #define SetupDiInstallClass SetupDiInstallClassW #else #define SetupDiInstallClass SetupDiInstallClassA #endif WINSETUPAPI BOOL WINAPI SetupDiInstallClassExA( IN HWND hwndParent, OPTIONAL IN PCSTR InfFileName, OPTIONAL IN DWORD Flags, IN HSPFILEQ FileQueue, OPTIONAL IN CONST GUID *InterfaceClassGuid, OPTIONAL IN PVOID Reserved1, IN PVOID Reserved2 ); WINSETUPAPI BOOL WINAPI SetupDiInstallClassExW( IN HWND hwndParent, OPTIONAL IN PCWSTR InfFileName, OPTIONAL IN DWORD Flags, IN HSPFILEQ FileQueue, OPTIONAL IN CONST GUID *InterfaceClassGuid, OPTIONAL IN PVOID Reserved1, IN PVOID Reserved2 ); #ifdef UNICODE #define SetupDiInstallClassEx SetupDiInstallClassExW #else #define SetupDiInstallClassEx SetupDiInstallClassExA #endif WINSETUPAPI HKEY WINAPI SetupDiOpenClassRegKey( IN CONST GUID *ClassGuid, OPTIONAL IN REGSAM samDesired ); // // Flags for SetupDiOpenClassRegKeyEx // #define DIOCR_INSTALLER 0x00000001 // class installer registry branch #define DIOCR_INTERFACE 0x00000002 // interface class registry branch WINSETUPAPI HKEY WINAPI SetupDiOpenClassRegKeyExA( IN CONST GUID *ClassGuid, OPTIONAL IN REGSAM samDesired, IN DWORD Flags, IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI HKEY WINAPI SetupDiOpenClassRegKeyExW( IN CONST GUID *ClassGuid, OPTIONAL IN REGSAM samDesired, IN DWORD Flags, IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiOpenClassRegKeyEx SetupDiOpenClassRegKeyExW #else #define SetupDiOpenClassRegKeyEx SetupDiOpenClassRegKeyExA #endif WINSETUPAPI HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved, IN REGSAM samDesired, IN HINF InfHandle, OPTIONAL IN PCSTR InfSectionName OPTIONAL ); WINSETUPAPI HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved, IN REGSAM samDesired, IN HINF InfHandle, OPTIONAL IN PCWSTR InfSectionName OPTIONAL ); #ifdef UNICODE #define SetupDiCreateDeviceInterfaceRegKey SetupDiCreateDeviceInterfaceRegKeyW #else #define SetupDiCreateDeviceInterfaceRegKey SetupDiCreateDeviceInterfaceRegKeyA #endif // // Backward compatibility--do not use. // #define SetupDiCreateInterfaceDeviceRegKeyW SetupDiCreateDeviceInterfaceRegKeyW #define SetupDiCreateInterfaceDeviceRegKeyA SetupDiCreateDeviceInterfaceRegKeyA #ifdef UNICODE #define SetupDiCreateInterfaceDeviceRegKey SetupDiCreateDeviceInterfaceRegKeyW #else #define SetupDiCreateInterfaceDeviceRegKey SetupDiCreateDeviceInterfaceRegKeyA #endif WINSETUPAPI HKEY WINAPI SetupDiOpenDeviceInterfaceRegKey( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved, IN REGSAM samDesired ); // // Backward compatibility--do not use. // #define SetupDiOpenInterfaceDeviceRegKey SetupDiOpenDeviceInterfaceRegKey WINSETUPAPI BOOL WINAPI SetupDiDeleteDeviceInterfaceRegKey( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, IN DWORD Reserved ); // // Backward compatibility--do not use. // #define SetupDiDeleteInterfaceDeviceRegKey SetupDiDeleteDeviceInterfaceRegKey // // KeyType values for SetupDiCreateDevRegKey, SetupDiOpenDevRegKey, and // SetupDiDeleteDevRegKey. // #define DIREG_DEV 0x00000001 // Open/Create/Delete device key #define DIREG_DRV 0x00000002 // Open/Create/Delete driver key #define DIREG_BOTH 0x00000004 // Delete both driver and Device key WINSETUPAPI HKEY WINAPI SetupDiCreateDevRegKeyA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Scope, IN DWORD HwProfile, IN DWORD KeyType, IN HINF InfHandle, OPTIONAL IN PCSTR InfSectionName OPTIONAL ); WINSETUPAPI HKEY WINAPI SetupDiCreateDevRegKeyW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Scope, IN DWORD HwProfile, IN DWORD KeyType, IN HINF InfHandle, OPTIONAL IN PCWSTR InfSectionName OPTIONAL ); #ifdef UNICODE #define SetupDiCreateDevRegKey SetupDiCreateDevRegKeyW #else #define SetupDiCreateDevRegKey SetupDiCreateDevRegKeyA #endif WINSETUPAPI HKEY WINAPI SetupDiOpenDevRegKey( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Scope, IN DWORD HwProfile, IN DWORD KeyType, IN REGSAM samDesired ); WINSETUPAPI BOOL WINAPI SetupDiDeleteDevRegKey( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Scope, IN DWORD HwProfile, IN DWORD KeyType ); WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileList( OUT PDWORD HwProfileList, IN DWORD HwProfileListSize, OUT PDWORD RequiredSize, OUT PDWORD CurrentlyActiveIndex OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileListExA( OUT PDWORD HwProfileList, IN DWORD HwProfileListSize, OUT PDWORD RequiredSize, OUT PDWORD CurrentlyActiveIndex, OPTIONAL IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileListExW( OUT PDWORD HwProfileList, IN DWORD HwProfileListSize, OUT PDWORD RequiredSize, OUT PDWORD CurrentlyActiveIndex, OPTIONAL IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiGetHwProfileListEx SetupDiGetHwProfileListExW #else #define SetupDiGetHwProfileListEx SetupDiGetHwProfileListExA #endif // // Device registry property codes // (Codes marked as read-only (R) may only be used for // SetupDiGetDeviceRegistryProperty) // // These values should cover the same set of registry properties // as defined by the CM_DRP codes in cfgmgr32.h. // #define SPDRP_DEVICEDESC (0x00000000) // DeviceDesc (R/W) #define SPDRP_HARDWAREID (0x00000001) // HardwareID (R/W) #define SPDRP_COMPATIBLEIDS (0x00000002) // CompatibleIDs (R/W) #define SPDRP_UNUSED0 (0x00000003) // unused #define SPDRP_SERVICE (0x00000004) // Service (R/W) #define SPDRP_UNUSED1 (0x00000005) // unused #define SPDRP_UNUSED2 (0x00000006) // unused #define SPDRP_CLASS (0x00000007) // Class (R--tied to ClassGUID) #define SPDRP_CLASSGUID (0x00000008) // ClassGUID (R/W) #define SPDRP_DRIVER (0x00000009) // Driver (R/W) #define SPDRP_CONFIGFLAGS (0x0000000A) // ConfigFlags (R/W) #define SPDRP_MFG (0x0000000B) // Mfg (R/W) #define SPDRP_FRIENDLYNAME (0x0000000C) // FriendlyName (R/W) #define SPDRP_LOCATION_INFORMATION (0x0000000D) // LocationInformation (R/W) #define SPDRP_PHYSICAL_DEVICE_OBJECT_NAME (0x0000000E) // PhysicalDeviceObjectName (R) #define SPDRP_CAPABILITIES (0x0000000F) // Capabilities (R) #define SPDRP_UI_NUMBER (0x00000010) // UiNumber (R) #define SPDRP_UPPERFILTERS (0x00000011) // UpperFilters (R/W) #define SPDRP_LOWERFILTERS (0x00000012) // LowerFilters (R/W) #define SPDRP_BUSTYPEGUID (0x00000013) // BusTypeGUID (R) #define SPDRP_LEGACYBUSTYPE (0x00000014) // LegacyBusType (R) #define SPDRP_BUSNUMBER (0x00000015) // BusNumber (R) #define SPDRP_ENUMERATOR_NAME (0x00000016) // Enumerator Name (R) #define SPDRP_SECURITY (0x00000017) // Security (R/W, binary form) #define SPDRP_SECURITY_SDS (0x00000018) // Security (W, SDS form) #define SPDRP_DEVTYPE (0x00000019) // Device Type (R/W) #define SPDRP_EXCLUSIVE (0x0000001A) // Device is exclusive-access (R/W) #define SPDRP_CHARACTERISTICS (0x0000001B) // Device Characteristics (R/W) #define SPDRP_ADDRESS (0x0000001C) // Device Address (R) #define SPDRP_UI_NUMBER_DESC_FORMAT (0X0000001E) // UiNumberDescFormat (R/W) #define SPDRP_MAXIMUM_PROPERTY (0x0000001F) // Upper bound on ordinals // // Class registry property codes // (Codes marked as read-only (R) may only be used for // SetupDiGetClassRegistryProperty) // // These values should cover the same set of registry properties // as defined by the CM_CRP codes in cfgmgr32.h. // they should also have a 1:1 correspondence with Device registers, where applicable // but no overlap otherwise // #define SPCRP_SECURITY (0x00000017) // Security (R/W, binary form) #define SPCRP_SECURITY_SDS (0x00000018) // Security (W, SDS form) #define SPCRP_DEVTYPE (0x00000019) // Device Type (R/W) #define SPCRP_EXCLUSIVE (0x0000001A) // Device is exclusive-access (R/W) #define SPCRP_CHARACTERISTICS (0x0000001B) // Device Characteristics (R/W) #define SPCRP_MAXIMUM_PROPERTY (0x0000001C) // Upper bound on ordinals WINSETUPAPI BOOL WINAPI SetupDiGetDeviceRegistryPropertyA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Property, OUT PDWORD PropertyRegDataType, OPTIONAL OUT PBYTE PropertyBuffer, IN DWORD PropertyBufferSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetDeviceRegistryPropertyW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Property, OUT PDWORD PropertyRegDataType, OPTIONAL OUT PBYTE PropertyBuffer, IN DWORD PropertyBufferSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupDiGetDeviceRegistryProperty SetupDiGetDeviceRegistryPropertyW #else #define SetupDiGetDeviceRegistryProperty SetupDiGetDeviceRegistryPropertyA #endif WINSETUPAPI BOOL WINAPI SetupDiGetClassRegistryPropertyA( IN LPGUID ClassGuid, IN DWORD Property, OUT PDWORD PropertyRegDataType, OPTIONAL OUT PBYTE PropertyBuffer, IN DWORD PropertyBufferSize, OUT PDWORD RequiredSize, OPTIONAL IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiGetClassRegistryPropertyW( IN LPGUID ClassGuid, IN DWORD Property, OUT PDWORD PropertyRegDataType, OPTIONAL OUT PBYTE PropertyBuffer, IN DWORD PropertyBufferSize, OUT PDWORD RequiredSize, OPTIONAL IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiGetClassRegistryProperty SetupDiGetClassRegistryPropertyW #else #define SetupDiGetClassRegistryProperty SetupDiGetClassRegistryPropertyA #endif WINSETUPAPI BOOL WINAPI SetupDiSetDeviceRegistryPropertyA( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Property, IN CONST BYTE* PropertyBuffer, OPTIONAL IN DWORD PropertyBufferSize ); WINSETUPAPI BOOL WINAPI SetupDiSetDeviceRegistryPropertyW( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Property, IN CONST BYTE* PropertyBuffer, OPTIONAL IN DWORD PropertyBufferSize ); #ifdef UNICODE #define SetupDiSetDeviceRegistryProperty SetupDiSetDeviceRegistryPropertyW #else #define SetupDiSetDeviceRegistryProperty SetupDiSetDeviceRegistryPropertyA #endif WINSETUPAPI BOOL WINAPI SetupDiSetClassRegistryPropertyA( IN LPGUID ClassGuid, IN DWORD Property, IN CONST BYTE* PropertyBuffer, OPTIONAL IN DWORD PropertyBufferSize, IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiSetClassRegistryPropertyW( IN LPGUID ClassGuid, IN DWORD Property, IN CONST BYTE* PropertyBuffer, OPTIONAL IN DWORD PropertyBufferSize, IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiSetClassRegistryProperty SetupDiSetClassRegistryPropertyW #else #define SetupDiSetClassRegistryProperty SetupDiSetClassRegistryPropertyA #endif WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInstallParamsA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL OUT PSP_DEVINSTALL_PARAMS_A DeviceInstallParams ); WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInstallParamsW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams ); #ifdef UNICODE #define SetupDiGetDeviceInstallParams SetupDiGetDeviceInstallParamsW #else #define SetupDiGetDeviceInstallParams SetupDiGetDeviceInstallParamsA #endif WINSETUPAPI BOOL WINAPI SetupDiGetClassInstallParamsA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL OUT PSP_CLASSINSTALL_HEADER ClassInstallParams, OPTIONAL IN DWORD ClassInstallParamsSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetClassInstallParamsW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL OUT PSP_CLASSINSTALL_HEADER ClassInstallParams, OPTIONAL IN DWORD ClassInstallParamsSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupDiGetClassInstallParams SetupDiGetClassInstallParamsW #else #define SetupDiGetClassInstallParams SetupDiGetClassInstallParamsA #endif WINSETUPAPI BOOL WINAPI SetupDiSetDeviceInstallParamsA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_DEVINSTALL_PARAMS_A DeviceInstallParams ); WINSETUPAPI BOOL WINAPI SetupDiSetDeviceInstallParamsW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_DEVINSTALL_PARAMS_W DeviceInstallParams ); #ifdef UNICODE #define SetupDiSetDeviceInstallParams SetupDiSetDeviceInstallParamsW #else #define SetupDiSetDeviceInstallParams SetupDiSetDeviceInstallParamsA #endif WINSETUPAPI BOOL WINAPI SetupDiSetClassInstallParamsA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_CLASSINSTALL_HEADER ClassInstallParams, OPTIONAL IN DWORD ClassInstallParamsSize ); WINSETUPAPI BOOL WINAPI SetupDiSetClassInstallParamsW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_CLASSINSTALL_HEADER ClassInstallParams, OPTIONAL IN DWORD ClassInstallParamsSize ); #ifdef UNICODE #define SetupDiSetClassInstallParams SetupDiSetClassInstallParamsW #else #define SetupDiSetClassInstallParams SetupDiSetClassInstallParamsA #endif WINSETUPAPI BOOL WINAPI SetupDiGetDriverInstallParamsA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_DRVINFO_DATA_A DriverInfoData, OUT PSP_DRVINSTALL_PARAMS DriverInstallParams ); WINSETUPAPI BOOL WINAPI SetupDiGetDriverInstallParamsW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_DRVINFO_DATA_W DriverInfoData, OUT PSP_DRVINSTALL_PARAMS DriverInstallParams ); #ifdef UNICODE #define SetupDiGetDriverInstallParams SetupDiGetDriverInstallParamsW #else #define SetupDiGetDriverInstallParams SetupDiGetDriverInstallParamsA #endif WINSETUPAPI BOOL WINAPI SetupDiSetDriverInstallParamsA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_DRVINFO_DATA_A DriverInfoData, IN PSP_DRVINSTALL_PARAMS DriverInstallParams ); WINSETUPAPI BOOL WINAPI SetupDiSetDriverInstallParamsW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_DRVINFO_DATA_W DriverInfoData, IN PSP_DRVINSTALL_PARAMS DriverInstallParams ); #ifdef UNICODE #define SetupDiSetDriverInstallParams SetupDiSetDriverInstallParamsW #else #define SetupDiSetDriverInstallParams SetupDiSetDriverInstallParamsA #endif WINSETUPAPI BOOL WINAPI SetupDiLoadClassIcon( IN CONST GUID *ClassGuid, OUT HICON *LargeIcon, OPTIONAL OUT PINT MiniIconIndex OPTIONAL ); // // Flags controlling the drawing of mini-icons // #define DMI_MASK 0x00000001 #define DMI_BKCOLOR 0x00000002 #define DMI_USERECT 0x00000004 WINSETUPAPI INT WINAPI SetupDiDrawMiniIcon( IN HDC hdc, IN RECT rc, IN INT MiniIconIndex, IN DWORD Flags ); WINSETUPAPI BOOL WINAPI SetupDiGetClassBitmapIndex( IN CONST GUID *ClassGuid, OPTIONAL OUT PINT MiniIconIndex ); WINSETUPAPI BOOL WINAPI SetupDiGetClassImageList( OUT PSP_CLASSIMAGELIST_DATA ClassImageListData ); WINSETUPAPI BOOL WINAPI SetupDiGetClassImageListExA( OUT PSP_CLASSIMAGELIST_DATA ClassImageListData, IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiGetClassImageListExW( OUT PSP_CLASSIMAGELIST_DATA ClassImageListData, IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiGetClassImageListEx SetupDiGetClassImageListExW #else #define SetupDiGetClassImageListEx SetupDiGetClassImageListExA #endif WINSETUPAPI BOOL WINAPI SetupDiGetClassImageIndex( IN PSP_CLASSIMAGELIST_DATA ClassImageListData, IN CONST GUID *ClassGuid, OUT PINT ImageIndex ); WINSETUPAPI BOOL WINAPI SetupDiDestroyClassImageList( IN PSP_CLASSIMAGELIST_DATA ClassImageListData ); // // PropertySheetType values for the SetupDiGetClassDevPropertySheets API // #define DIGCDP_FLAG_BASIC 0x00000001 #define DIGCDP_FLAG_ADVANCED 0x00000002 WINSETUPAPI BOOL WINAPI SetupDiGetClassDevPropertySheetsA( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN LPPROPSHEETHEADERA PropertySheetHeader, IN DWORD PropertySheetHeaderPageListSize, OUT PDWORD RequiredSize, OPTIONAL IN DWORD PropertySheetType ); WINSETUPAPI BOOL WINAPI SetupDiGetClassDevPropertySheetsW( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN LPPROPSHEETHEADERW PropertySheetHeader, IN DWORD PropertySheetHeaderPageListSize, OUT PDWORD RequiredSize, OPTIONAL IN DWORD PropertySheetType ); #ifdef UNICODE #define SetupDiGetClassDevPropertySheets SetupDiGetClassDevPropertySheetsW #else #define SetupDiGetClassDevPropertySheets SetupDiGetClassDevPropertySheetsA #endif // // Define ICON IDs publicly exposed from setupapi. // #define IDI_RESOURCEFIRST 159 #define IDI_RESOURCE 159 #define IDI_RESOURCELAST 161 #define IDI_RESOURCEOVERLAYFIRST 161 #define IDI_RESOURCEOVERLAYLAST 161 #define IDI_CONFLICT 161 #define IDI_CLASSICON_OVERLAYFIRST 500 #define IDI_CLASSICON_OVERLAYLAST 502 #define IDI_PROBLEM_OVL 500 #define IDI_DISABLED_OVL 501 #define IDI_FORCED_OVL 502 WINSETUPAPI BOOL WINAPI SetupDiAskForOEMDisk( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiSelectOEMDrv( IN HWND hwndParent, OPTIONAL IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiClassNameFromGuidA( IN CONST GUID *ClassGuid, OUT PSTR ClassName, IN DWORD ClassNameSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiClassNameFromGuidW( IN CONST GUID *ClassGuid, OUT PWSTR ClassName, IN DWORD ClassNameSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupDiClassNameFromGuid SetupDiClassNameFromGuidW #else #define SetupDiClassNameFromGuid SetupDiClassNameFromGuidA #endif WINSETUPAPI BOOL WINAPI SetupDiClassNameFromGuidExA( IN CONST GUID *ClassGuid, OUT PSTR ClassName, IN DWORD ClassNameSize, OUT PDWORD RequiredSize, OPTIONAL IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiClassNameFromGuidExW( IN CONST GUID *ClassGuid, OUT PWSTR ClassName, IN DWORD ClassNameSize, OUT PDWORD RequiredSize, OPTIONAL IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiClassNameFromGuidEx SetupDiClassNameFromGuidExW #else #define SetupDiClassNameFromGuidEx SetupDiClassNameFromGuidExA #endif WINSETUPAPI BOOL WINAPI SetupDiClassGuidsFromNameA( IN PCSTR ClassName, OUT LPGUID ClassGuidList, IN DWORD ClassGuidListSize, OUT PDWORD RequiredSize ); WINSETUPAPI BOOL WINAPI SetupDiClassGuidsFromNameW( IN PCWSTR ClassName, OUT LPGUID ClassGuidList, IN DWORD ClassGuidListSize, OUT PDWORD RequiredSize ); #ifdef UNICODE #define SetupDiClassGuidsFromName SetupDiClassGuidsFromNameW #else #define SetupDiClassGuidsFromName SetupDiClassGuidsFromNameA #endif WINSETUPAPI BOOL WINAPI SetupDiClassGuidsFromNameExA( IN PCSTR ClassName, OUT LPGUID ClassGuidList, IN DWORD ClassGuidListSize, OUT PDWORD RequiredSize, IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiClassGuidsFromNameExW( IN PCWSTR ClassName, OUT LPGUID ClassGuidList, IN DWORD ClassGuidListSize, OUT PDWORD RequiredSize, IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiClassGuidsFromNameEx SetupDiClassGuidsFromNameExW #else #define SetupDiClassGuidsFromNameEx SetupDiClassGuidsFromNameExA #endif WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileFriendlyNameA( IN DWORD HwProfile, OUT PSTR FriendlyName, IN DWORD FriendlyNameSize, OUT PDWORD RequiredSize OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileFriendlyNameW( IN DWORD HwProfile, OUT PWSTR FriendlyName, IN DWORD FriendlyNameSize, OUT PDWORD RequiredSize OPTIONAL ); #ifdef UNICODE #define SetupDiGetHwProfileFriendlyName SetupDiGetHwProfileFriendlyNameW #else #define SetupDiGetHwProfileFriendlyName SetupDiGetHwProfileFriendlyNameA #endif WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileFriendlyNameExA( IN DWORD HwProfile, OUT PSTR FriendlyName, IN DWORD FriendlyNameSize, OUT PDWORD RequiredSize, OPTIONAL IN PCSTR MachineName, OPTIONAL IN PVOID Reserved ); WINSETUPAPI BOOL WINAPI SetupDiGetHwProfileFriendlyNameExW( IN DWORD HwProfile, OUT PWSTR FriendlyName, IN DWORD FriendlyNameSize, OUT PDWORD RequiredSize, OPTIONAL IN PCWSTR MachineName, OPTIONAL IN PVOID Reserved ); #ifdef UNICODE #define SetupDiGetHwProfileFriendlyNameEx SetupDiGetHwProfileFriendlyNameExW #else #define SetupDiGetHwProfileFriendlyNameEx SetupDiGetHwProfileFriendlyNameExA #endif // // PageType values for SetupDiGetWizardPage API // #define SPWPT_SELECTDEVICE 0x00000001 // // Flags for SetupDiGetWizardPage API // #define SPWP_USE_DEVINFO_DATA 0x00000001 WINSETUPAPI HPROPSHEETPAGE WINAPI SetupDiGetWizardPage( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN PSP_INSTALLWIZARD_DATA InstallWizardData, IN DWORD PageType, IN DWORD Flags ); WINSETUPAPI BOOL WINAPI SetupDiGetSelectedDevice( IN HDEVINFO DeviceInfoSet, OUT PSP_DEVINFO_DATA DeviceInfoData ); WINSETUPAPI BOOL WINAPI SetupDiSetSelectedDevice( IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData ); WINSETUPAPI BOOL WINAPI SetupDiGetActualSectionToInstallA( IN HINF InfHandle, IN PCSTR InfSectionName, OUT PSTR InfSectionWithExt, OPTIONAL IN DWORD InfSectionWithExtSize, OUT PDWORD RequiredSize, OPTIONAL OUT PSTR *Extension OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetActualSectionToInstallW( IN HINF InfHandle, IN PCWSTR InfSectionName, OUT PWSTR InfSectionWithExt, OPTIONAL IN DWORD InfSectionWithExtSize, OUT PDWORD RequiredSize, OPTIONAL OUT PWSTR *Extension OPTIONAL ); #ifdef UNICODE #define SetupDiGetActualSectionToInstall SetupDiGetActualSectionToInstallW #else #define SetupDiGetActualSectionToInstall SetupDiGetActualSectionToInstallA #endif #ifdef __cplusplus } #endif #include #endif // _INC_SETUPAPI baycomusb-0.10.orig/coinstaller/coinst.def0100644000175100017510000000005407325134424016711 0ustar abaabaLIBRARY COINST EXPORTS CoDeviceInstall@16 baycomusb-0.10.orig/coinstaller/coinst.c0100644000175100017510000000471607326565664016425 0ustar abaaba/*****************************************************************************/ /* * coinst.c -- Windows Coinstaller (downloads firmware). * * Copyright (C) 2000-2001 Thomas Sailer (sailer@ife.ee.ethz.ch) * * 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /*****************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include //typedef UINT * UINT_PTR; //typedef ULONG * ULONG_PTR; //typedef DWORD * DWORD_PTR; #include #include /* ---------------------------------------------------------------------- */ int lprintf(unsigned vl, const char *format, ...) __attribute__ ((format (printf, 2, 3))); int lprintf(unsigned vl, const char *format, ...) { va_list ap; char buf[512]; int i; va_start(ap, format); i = vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); OutputDebugString(buf); return i; } /* ---------------------------------------------------------------------- */ _stdcall HRESULT CoDeviceInstall(IN DI_FUNCTION InstallFunction, IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData, OPTIONAL IN OUT PCOINSTALLER_CONTEXT_DATA Context) { OutputDebugString("My Co Device Installer\n"); switch (InstallFunction) { case DIF_INSTALLDEVICE: if (!Context->PostProcessing) { lprintf(0, "DIF_INSTALLDEVICE: preprocessing\n"); return ERROR_DI_POSTPROCESSING_REQUIRED; } lprintf(0, "DIF_INSTALLDEVICE: postprocessing\n"); return NO_ERROR; case DIF_REMOVE: lprintf(0, "DIF_REMOVE: postprocessing\n"); return NO_ERROR; default: return NO_ERROR; } } baycomusb-0.10.orig/coinstaller/setupapi.def0100644000175100017510000002131407325134424017246 0ustar abaabaEXPORTS AcquireSCMLock AddMiniIconToList AddTagToGroupOrderListEntry AppendStringToMultiSz AssertFail CaptureAndConvertAnsiArg CaptureStringArg CenterWindowRelativeToParent ConcatenatePaths DelayedMove DelimStringToMultiSz DestroyTextFileReadBuffer DoInstallActionWithParams DoesUserHavePrivilege DuplicateString EnablePrivilege ExtensionPropSheetPageProc FileExists FreeStringArray GetNewInfName GetSetFileTimestamp GetVersionInfoFromImage InfIsFromOemLocation InstallHinfSection InstallHinfSectionA InstallHinfSectionW InstallStop IsUserAdmin LookUpStringInTable MemoryInitialize MultiByteToUnicode MultiSzFromSearchControl MyFree MyGetFileTitle MyMalloc MyRealloc OpenAndMapFileForRead OutOfMemory QueryMultiSzValueToArray QueryRegistryValue ReadAsciiOrUnicodeTextFile RegistryDelnode RetreiveFileSecurity RetrieveServiceConfig SearchForInfFile SetArrayToMultiSzValue SetupAddInstallSectionToDiskSpaceListA SetupAddInstallSectionToDiskSpaceListW SetupAddSectionToDiskSpaceListA SetupAddSectionToDiskSpaceListW SetupAddToDiskSpaceListA SetupAddToDiskSpaceListW SetupAddToSourceListA SetupAddToSourceListW SetupAdjustDiskSpaceListA SetupAdjustDiskSpaceListW SetupCancelTemporarySourceList SetupCloseFileQueue SetupCloseInfFile SetupCloseLog SetupCommitFileQueue SetupCommitFileQueueA SetupCommitFileQueueW SetupCopyErrorA SetupCopyErrorW SetupCopyOEMInfA SetupCopyOEMInfW SetupCreateDiskSpaceListA SetupCreateDiskSpaceListW SetupDecompressOrCopyFileA SetupDecompressOrCopyFileW SetupDefaultQueueCallback SetupDefaultQueueCallbackA SetupDefaultQueueCallbackW SetupDeleteErrorA SetupDeleteErrorW SetupDestroyDiskSpaceList SetupDiAskForOEMDisk SetupDiBuildClassInfoList SetupDiBuildClassInfoListExA SetupDiBuildClassInfoListExW SetupDiBuildDriverInfoList SetupDiCallClassInstaller SetupDiCancelDriverInfoSearch SetupDiChangeState SetupDiClassGuidsFromNameA SetupDiClassGuidsFromNameExA SetupDiClassGuidsFromNameExW SetupDiClassGuidsFromNameW SetupDiClassNameFromGuidA SetupDiClassNameFromGuidExA SetupDiClassNameFromGuidExW SetupDiClassNameFromGuidW SetupDiCreateDevRegKeyA SetupDiCreateDevRegKeyW SetupDiCreateDeviceInfoA SetupDiCreateDeviceInfoList SetupDiCreateDeviceInfoListExA SetupDiCreateDeviceInfoListExW SetupDiCreateDeviceInfoW SetupDiCreateDeviceInterfaceA SetupDiCreateDeviceInterfaceRegKeyA SetupDiCreateDeviceInterfaceRegKeyW SetupDiCreateDeviceInterfaceW SetupDiDeleteDevRegKey SetupDiDeleteDeviceInfo SetupDiDeleteDeviceInterfaceData SetupDiDeleteDeviceInterfaceRegKey SetupDiDestroyClassImageList SetupDiDestroyDeviceInfoList SetupDiDestroyDriverInfoList SetupDiDrawMiniIcon SetupDiEnumDeviceInfo SetupDiEnumDeviceInterfaces SetupDiEnumDriverInfoA SetupDiEnumDriverInfoW SetupDiGetActualSectionToInstallA SetupDiGetActualSectionToInstallW SetupDiGetClassBitmapIndex SetupDiGetClassDescriptionA SetupDiGetClassDescriptionExA SetupDiGetClassDescriptionExW SetupDiGetClassDescriptionW SetupDiGetClassDevPropertySheetsA SetupDiGetClassDevPropertySheetsW SetupDiGetClassDevsA SetupDiGetClassDevsExA SetupDiGetClassDevsExW SetupDiGetClassDevsW SetupDiGetClassImageIndex SetupDiGetClassImageList SetupDiGetClassImageListExA SetupDiGetClassImageListExW SetupDiGetClassInstallParamsA SetupDiGetClassInstallParamsW SetupDiGetDeviceInfoListClass SetupDiGetDeviceInfoListDetailA SetupDiGetDeviceInfoListDetailW SetupDiGetDeviceInstallParamsA SetupDiGetDeviceInstallParamsW SetupDiGetDeviceInstanceIdA SetupDiGetDeviceInstanceIdW SetupDiGetDeviceInterfaceAlias SetupDiGetDeviceInterfaceDetailA SetupDiGetDeviceInterfaceDetailW SetupDiGetDeviceRegistryPropertyA@28 SetupDiGetDeviceRegistryPropertyW SetupDiGetDriverInfoDetailA@24 SetupDiGetDriverInfoDetailW SetupDiGetDriverInstallParamsA SetupDiGetDriverInstallParamsW SetupDiGetHwProfileFriendlyNameA SetupDiGetHwProfileFriendlyNameExA SetupDiGetHwProfileFriendlyNameExW SetupDiGetHwProfileFriendlyNameW SetupDiGetHwProfileList SetupDiGetHwProfileListExA SetupDiGetHwProfileListExW SetupDiGetINFClassA SetupDiGetINFClassW SetupDiGetSelectedDevice SetupDiGetSelectedDriverA@12 SetupDiGetSelectedDriverW SetupDiGetWizardPage SetupDiInstallClassA SetupDiInstallClassExA SetupDiInstallClassExW SetupDiInstallClassW SetupDiInstallDevice SetupDiInstallDeviceInterfaces SetupDiInstallDriverFiles SetupDiLoadClassIcon SetupDiMoveDuplicateDevice SetupDiOpenClassRegKey SetupDiOpenClassRegKeyExA SetupDiOpenClassRegKeyExW SetupDiOpenDevRegKey SetupDiOpenDeviceInfoA SetupDiOpenDeviceInfoW SetupDiOpenDeviceInterfaceA SetupDiOpenDeviceInterfaceRegKey SetupDiOpenDeviceInterfaceW SetupDiRegisterCoDeviceInstallers SetupDiRegisterDeviceInfo SetupDiRemoveDevice SetupDiRemoveDeviceInterface SetupDiSelectBestCompatDrv SetupDiSelectDevice SetupDiSelectOEMDrv SetupDiSetClassInstallParamsA SetupDiSetClassInstallParamsW SetupDiSetDeviceInstallParamsA SetupDiSetDeviceInstallParamsW SetupDiSetDeviceRegistryPropertyA@20 SetupDiSetDeviceRegistryPropertyW SetupDiSetDriverInstallParamsA SetupDiSetDriverInstallParamsW SetupDiSetSelectedDevice SetupDiSetSelectedDriverA SetupDiSetSelectedDriverW SetupDiUnremoveDevice SetupDuplicateDiskSpaceListA SetupDuplicateDiskSpaceListW SetupFindFirstLineA@16 SetupFindFirstLineW SetupFindNextLine SetupFindNextMatchLineA SetupFindNextMatchLineW SetupFreeSourceListA SetupFreeSourceListW SetupGetBinaryField SetupGetFieldCount SetupGetFileCompressionInfoA SetupGetFileCompressionInfoW SetupGetInfFileListA SetupGetInfFileListW SetupGetInfInformationA SetupGetInfInformationW SetupGetInfSections SetupGetIntField SetupGetLineByIndexA SetupGetLineByIndexW SetupGetLineCountA SetupGetLineCountW SetupGetLineTextA SetupGetLineTextW SetupGetMultiSzFieldA SetupGetMultiSzFieldW SetupGetSourceFileLocationA SetupGetSourceFileLocationW SetupGetSourceFileSizeA SetupGetSourceFileSizeW SetupGetSourceInfoA SetupGetSourceInfoW SetupGetStringFieldA SetupGetStringFieldW SetupGetTargetPathA SetupGetTargetPathW SetupInitDefaultQueueCallback SetupInitDefaultQueueCallbackEx SetupInitializeFileLogA SetupInitializeFileLogW SetupInstallFileA SetupInstallFileExA SetupInstallFileExW SetupInstallFileW SetupInstallFilesFromInfSectionA SetupInstallFilesFromInfSectionW SetupInstallFromInfSectionA SetupInstallFromInfSectionW SetupInstallServicesFromInfSectionA SetupInstallServicesFromInfSectionExA SetupInstallServicesFromInfSectionExW SetupInstallServicesFromInfSectionW SetupIterateCabinetA SetupIterateCabinetW SetupLogErrorA SetupLogErrorW SetupLogFileA SetupLogFileW SetupOpenAppendInfFileA SetupOpenAppendInfFileW SetupOpenFileQueue SetupOpenInfFileA@16 SetupOpenInfFileW SetupOpenLog SetupOpenMasterInf SetupPromptForDiskA SetupPromptForDiskW SetupPromptReboot SetupQueryDrivesInDiskSpaceListA SetupQueryDrivesInDiskSpaceListW SetupQueryFileLogA SetupQueryFileLogW SetupQueryInfFileInformationA SetupQueryInfFileInformationW SetupQueryInfVersionInformationA SetupQueryInfVersionInformationW SetupQuerySourceListA SetupQuerySourceListW SetupQuerySpaceRequiredOnDriveA SetupQuerySpaceRequiredOnDriveW SetupQueueCopyA SetupQueueCopySectionA SetupQueueCopySectionW SetupQueueCopyW SetupQueueDefaultCopyA SetupQueueDefaultCopyW SetupQueueDeleteA SetupQueueDeleteSectionA SetupQueueDeleteSectionW SetupQueueDeleteW SetupQueueRenameA SetupQueueRenameSectionA SetupQueueRenameSectionW SetupQueueRenameW SetupRemoveFileLogEntryA SetupRemoveFileLogEntryW SetupRemoveFromDiskSpaceListA SetupRemoveFromDiskSpaceListW SetupRemoveFromSourceListA SetupRemoveFromSourceListW SetupRemoveInstallSectionFromDiskSpaceListA SetupRemoveInstallSectionFromDiskSpaceListW SetupRemoveSectionFromDiskSpaceListA SetupRemoveSectionFromDiskSpaceListW SetupRenameErrorA SetupRenameErrorW SetupScanFileQueue SetupScanFileQueueA SetupScanFileQueueW SetupSetDirectoryIdA SetupSetDirectoryIdExA SetupSetDirectoryIdExW SetupSetDirectoryIdW SetupSetPlatformPathOverrideA SetupSetPlatformPathOverrideW SetupSetSourceListA SetupSetSourceListW SetupTermDefaultQueueCallback SetupTerminateFileLog ShouldDeviceBeExcluded StampFileSecurity StringTableAddString StringTableAddStringEx StringTableDestroy StringTableDuplicate StringTableEnum StringTableGetExtraData StringTableInitialize StringTableInitializeEx StringTableLookUpString StringTableLookUpStringEx StringTableSetExtraData StringTableStringFromId StringTableTrim TakeOwnershipOfFile UnicodeToMultiByte UnmapAndCloseFile pSetupDiGetDeviceInfoContext pSetupDiSetDeviceInfoContext pSetupDirectoryIdToPath pSetupGetField pSetupGetOsLoaderDriveAndPath pSetupGetVersionDatum pSetupGuidFromString pSetupIsGuidNull pSetupMakeSurePathExists pSetupSetSystemSourcePath pSetupStringFromGuid