Merge commit 'v3.3.0' into upstream
[debian/gnuradio] / usrp / firmware / src / common / _startup.a51.brittle
diff --git a/usrp/firmware/src/common/_startup.a51.brittle b/usrp/firmware/src/common/_startup.a51.brittle
new file mode 100644 (file)
index 0000000..2996275
--- /dev/null
@@ -0,0 +1,78 @@
+;;; -*- asm -*-
+;;;
+;;; Copyright 2003 Free Software Foundation, Inc.
+;;; 
+;;; This file is part of GNU Radio
+;;; 
+;;; GNU Radio 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 3, or (at your option)
+;;; any later version.
+;;; 
+;;; GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to
+;;; the Free Software Foundation, Inc., 51 Franklin Street,
+;;; Boston, MA 02110-1301, USA.
+
+    
+;;; The default external memory initialization provided by sdcc is not
+;;; appropriate to the FX2.  This is derived from the sdcc code, but uses 
+;;; the FX2 specific _MPAGE sfr.
+
+
+       .area XISEG   (XDATA)   ; the initialized external data area
+       .area XINIT   (CODE)    ; the code space consts to init XISEG
+       .area XSEG    (XDATA)   ; zero initialized xdata
+       .area USBDESCSEG (XDATA); usb descriptors
+
+       
+       ;; BIG TIME KLUDGE!
+       ;; Look at usrp_main.rst and count the bytes from our
+       ;; "normal return location" to the first instruction following
+       ;; the comment: "_mcs51_getRAMCLEAR () start"
+       
+       INSTRUCTION_BYTES_TO_SKIP = 0x29         ; valid for sdcc 2.4.0 
+       
+
+       .area CSEG    (CODE)
+
+       ;; sfr that sets upper address byte of MOVX using @r0 or @r1
+       _MPAGE  =       0x0092
+
+__sdcc_external_startup::
+;      _mcs51_genXINIT() start
+       mov     r1,#l_XINIT
+       mov     a,r1
+       orl     a,#(l_XINIT >> 8)
+       jz      00003$
+       mov     r2,#((l_XINIT+255) >> 8)
+       mov     dptr,#s_XINIT
+       mov     r0,#s_XISEG
+       mov     _MPAGE,#(s_XISEG >> 8)
+00001$:        clr     a
+       movc    a,@a+dptr
+       movx    @r0,a
+       inc     dptr
+       inc     r0
+       cjne    r0,#0,00002$
+       inc     _MPAGE
+00002$:        djnz    r1,00001$
+       djnz    r2,00001$
+       mov     _MPAGE,#0xFF
+00003$:
+
+       ;; Danger! Total KLUDGE!
+       ;; We pop the return address, add a magic number to it
+       ;; then jump to that address.  Believe it or not, this
+       ;; looks like the least kludgy way to handle this,
+       ;; short of patching the compiler...
+
+       pop     dph
+       pop     dpl
+       mov     a,#INSTRUCTION_BYTES_TO_SKIP
+       jmp     @a+dptr