 +---------------------------------------------------------------------+
 |      WHATSNEW.DOC  REVISION HISTORY FOR TMS320C31 DSK SOFTWARE      |
 +---------------------------------------------------------------------+

  This file contains information covering new applications, features and
fixes that have been incorporated since rev 1.10 of the C3x DSK Software.

=========================================================================
APPLICATIONS CODE (versions after 1.10)
=========================================================================
-APPHELP.HLP  This files, which are actually source files for building
-CMDHELP.HLP  some DSK applications contain the text strings for various
-HARDWARE.HLP help screens.  They are plain text and can be viewed or
	      printed with almost any program.

-DSK3HELP.EXE This application can be used in a seperate DOS box alongside
	      the debugger and other applications to view the debuggers
	      help screens as well as a new external help file 'APPHELP.HLP'
	      that contains lots of tips and tricks for DSK code and
	      hardware development.  You can also copy these help screens
	      to files the same as if you were viewing them in the debugger.

-LOADPROM.EXE This application is a utility that reads in *.HEX files,
	      which are bootloadable images, and writes each byte to the
	      DSK's external interface using the DSK debugger.  This makes
	      it easier to create EEPROM based daughter cards that can
	      be both used with the DSK debugger and used in a standalone
	      mode.  Note that you MUST convert your application files to
	      the *.HEX format to use this utility

-DSK_SG.EXE   Generates precision sine wave, triangle or sawtooth signals
              using an interpolated table lookup.  Up to 14 signals can be
              added together (limited by screen display) be added together.
              Includes White noise and DC level shifting.  Includes AIC
              control hot keys.
              -DSKSG.ASM    TMS320C3x source code for DSK_SG.EXE
              -SAWT_SG.ASM  TMS320C3x source code for creating wave tables
              -SINE_SG.ASM  TMS320C3x source code for creating wave tables
              -RAMP_SG.ASM  TMS320C3x source code for creating wave tables
              -RAND_SG.ASM  TMS320C3x source code for creating wave tables

-DSK_DTMF.EXE Generates precision 32 bit floating point accurate sine wave
              signals using a complex vector rotation.  Up to 14 sine waves
              can be added together (limited by screen display).  The number
              keys are mapped to create DTMF tones.  Includes White noise
              and DC level shifting.  Includes AIC control hot keys.
              -DSKDTMF.ASM  TMS320C3x source code for DSK_DTMF.EXE

-FFT_1024.EXE A 1024 point complex radix 2 FFT that runs 100% on-chip.  This
              is made possible by using a packed short float format (4:1:11)
              similar to float immediate values.  There is very little loss
              in SNR.  Data and twiddles are packed two per memory slot in
              REAL:IMAG pairs.  Pack/unpack routines are also included for
              float16() 8:1:7 format.  Includes AIC control hot keys.
              -FFT1024.ASM  TMS320C3x source code for FFT_1024.EXE

-FFT_512.EXE  Traditional 512 point FFT using 32 bit floating point arithmetic.
              The FFT is written for readability not for size or speed since
              the majority of time is spent in the host updating the display.
              Includes AIC control hot keys and analog loop back of a sawtooth
              signal.
              -FFT512.ASM   TMS320C3x source code for FFT_512.EXE

-FFT_256.EXE  Traditional 256 point FFT using 32 bit floating point arithmetic.
              The FFT is written for readability not for size or speed since
              the majority of time is spent in the host updating the display.
              Includes AIC control hot keys and analog loop back of a sawtooth
              signal.
              -FFT256.ASM   TMS320C3x source code for FFT_256.EXE

-FFT_256B.EXE Same as 256 point FFT except that the host display uses the
              oscilloscope interface. Includes AIC control hot keys and analog
              loop back of a sawtooth signal.
              -FFT256B.ASM  TMS320C3x source code for FFT_256B.EXE

-FFT_OSC.EXE  Data collection and display as an oscilloscope I/F.  Hot keys
              allow control of the AIC, volts/div, offset and other parameters.
              With the bandpass filter removed, the TLC32040 will accurately
              convert and display square, triangle and sawtooth signals.
              Note that the analog loop back of a sawtooth signal will show
              some ringing.  This is because of the DAC reconstruction filter
              which cannot be defeated is bandwidth limited.
              -DSKOSC.ASM   TMS320C3x source code for DSK_OSC.EXE

-DSK_PWM.EXE  This program is written to give the user finer control over
              the two timers that are used to create the R-Y-G LED cycling.
              Additionally a 0Hz frequency can be specified with a known
              duty cycle between the two timers for a DC output.
              -DSKPWM.ASM   TMS320C3x source code for DSK_OSC.EXE

-DSK_TEST.EXE This program is used in the factory to test the DSK's
              functionality.  Includes an internal memory checker and a
              routine for checking the external data bus for stuck bits.
              Be sure to not have the DSK's data bus connected to an external
              load before running this test.
              -DSKTEST.ASM  TMS320C3x source code for DSK_TEST.EXE

-MANDEL3X.EXE This program uses the DSK to calculate the Mandelbrot set much
              faster than most PC's.  Guessing algorithms are not used as in
              most popular Mandelbrot viewers.  Note that in many cases a
              high percentage of the time is used to move the data, not
              calculate it!
              -MANDEL.ASM   TMS320C3x source code for MANDLE3X.EXE
	      NOTE: This application requires an external BGI driver
		    SVGA256.BGI to operate.  See README.DOC for details

-DSK3LOAD.EXE Loader/Bootloader utility that will either load or bootload a
              DSK, COFF or HEX file to the DSK.  Also includes a FILE2HEX
              converter and NOLOAD option.

-DSK_HLL.EXE  By loading the symbols of the last loaded DSK3D debugger file
              (contents of DASMFILE.FIL) this utility can get the value of the
              current PC and cross reference that value back to a line of
              C level source code.  This application can be run concurrent
              to DSK3D.EXE in a separate DOS window in either Windows 3.1 or
              Windows 95.  OS/2 will not allow multiple devices to access the
              printer port at the same time.

-MEMVIEW.EXE  Use this utility concurrently in a second Windows DOS box
              to asynchronously pole the status of the DSK and display both
              a block of memory and on-chip memory mapped registers.

-REGVIEW.EXE  Similar to MEMVIEW.EXE except that the display is of the context
              save area giving an update of the register values as a program is
              run.  Also, the memory dump can be in either HEX or FLOAT.

-SIMPLE.EXE   This program is a stripped down version of MEMVIEW.EXE to help
              a novice code writer learn how to write host interface code for
              the DSK.  For example you can change the memory display to
              a different format by changing the printf() statement or maybe
              add graphics routines for a display.  Note that the opposite
              of getting a block of memory, getmem(DSPaddr,length,&HOSTaddr)
              is putmem(DSPaddr,length,&HOSTaddr) making it easy to create
              a DSK memory modifier.

-C3X.ASM      TMS320C3x DSK Communications and debug kernel source code

-C3XMMRS.ASM  TMS320C3x Memory mapped register definitions

-LOOPAIC.ASM  Stand alone AIC code for either analog loop back or sawtooth
              signal generation.  The mode is changed by a code variable.

-SFFT.ASM     The Sliding FFT or SFFT is a method of calculating an entire
	      FFT output within the span of one input sample.  The technique
	      uses the previous FFT and applies a vector rotation to each
	      output bin before summing in the new input.  Since the vector
	      rotation operation on a DSP is quite fast, the SFFT can be
	      very efficient.  This demo will either create a spectrum analyzer
	      output, which is viewed with an oscilloscope connected to Vout,
	      or as a sum of all REAL's or all IMAG's.  IOW an all pass filter 
              of either 0 or 90 degrees phase shift.

-TOGGLE.ASM   Stand alone code for making the LED toggle R-G-R-G

-IDLE2.ASM    Stand alone code showing how to use a feature of the IDLE2
              instruction to freeze a write in progress on the bus to
              eliminate the need for pull up, pull down resistors for low power

-RAND.ASM     Stand alone code showing a code loop which calculates 32 bit
              random numbers.

-FIR.ASM      A 16 tap FIR filter example implementing the Z transform
			  -15
	      H[z] = 1 - z     which is a simple comb filter

-MATH.ASM     A piece of looped code that calls various math functions
	      for evaluation.  Includes inverse float, square root, log2
	      and ultra-fast log2.  These math functions are written for
	      readability not for speed.  By using the debugger and utility
	      interfaces the functions can be analyzed to determine how
	      they work.  Read the notices contained within the source file
	      for more information.

-SCANNER.EXE  Host control and display code for a TSL1402 256x1 line scanner
              Requires that a daughter card be constructed.  The daughter
              card electronics require a TSL1402, 14 pin socket, bypass
              capacitor and 330 ohm resistor.  You will also need a short
              focal length lens and some kind of mounting hardware unless
              you only want to see that shadows showing up on the line.
              Read the documentation at the top of the *.CPP and *.ASM source
              files on how to construct the daughter card.
              -SCAN.ASM TMS320C3x source code for SCANNER.EXE

              NOTE: These files are not compiled or pulled down into the
              DSK3TOOLS directory since this application requires the
              construction of a daughter card.  Also, there is not much
              space leftover on the disk for very many more applications!

              - The TLC32040 that is used on the DSK is able to convert
                each sample coming from the TSL1402 without being dependent
                on the previous samples since the input filter can be
                bypassed on that particular AIC.  Other types of AIC's are
                usually not suitable for this kind of application.  TI also
                makes a low cost 8 bit flash converter (TLC5510) but this
                does require considerably more effort to breadboard so it
                is not used in this application.

	      NOTE: This application requires an external BGI driver
		    SVGA256.BGI to operate.  See README.DOC for details

==========================================================================
DEBUGGER COMMANDS AND OTHER FEATURES ADDED AFTER VER 1.10

NOTE:  THE DSK3D HELP MENU CONTAINS A LISTING OF DSK3D FEATURES
==========================================================================
 FSTEP <n>            Step through functions <n> times
 MEM   <addr>         View memory @<addr> - 32 bit hex
 MEMX  <addr>         ''
 MEMI  <addr>         View memory @<addr> - signed
 MEMD  <addr>         ''
 MEML  <addr>         ''
 MEMUI <addr>         View memory @<addr> - unsigned
 MEMUD <addr>         ''
 MEMUL <addr>         ''
 MEMU  <addr>         ''
 MEMF  <addr>         View memory @<addr> - TMS float

 FILE2HEX <file>      .dsk|.out conversion to HEX
 DSK2HEX  <file>      .dsk conversion to HEX
 COFF2HEX <file>      .out conversion to HEX
 HEX2COFF file        .hex conversion to COFF
 DSK2COFF file        .dsk conversion to COFF
 MEM2HEX  file,a,l    Write memory at address for length to HEX file
 MEM2COFF file,a,l    Write memory at address for length to COFF file
 MAXFLEN  val         Set max output file length
 MOVE/MOV src,dst,n   Move memory from src->dst n<256 times

Added functions (assembler and debugger)
----------------------------------------
    rand()    32 bit long or +/- 1.0 normalized float random
    srand(x)  Seeded version of rand()
    float()   32 bit hex of TI float 8:1:23 format
    float8()   4 bit hex of TI float 4:1:3  format
    float16() 16 bit hex of TI float 8:1:7  format
    sfloat()  16 bit hex of TI float 4:1:11 format
    .psfloat  Packed sfloat() used for 1024 FFT

========================================================================
REVISION HISTORY - COVERS NEW FEATURES AND BUG FIXES
========================================================================
New for version 1.11
========================================================================
  - Improved message passing between functions
  - COFF loader loads more symbols.  Also more descriptive
  - COFF loader now loads HLL cross reference table
  - Now loads and writes DSK, COFF, HEX and MEM to and from files
  - File translation
  - Last loaded file for debugger is now written to file DASMFILE.FIL
  - Memory display and type over modify in HEX, DECIMAL and FLOAT
  - Added HEX file support.  Hex files are hex ascii bootloader images
  - Command buffer highlighting
  - Improved online help
  - Source and executable code is now compressed to fit on disk
  - Added an INSTALL.BAT to help installing the code
  - The distribution disk now expands into a structured tree

========================================================================
New for version 1.12
========================================================================
  - Improved expression analyzer stability
  - Trapping of math overflow errors
  - Black out of various windows on error
  - LOAD (no arg) before first file is loaded no longer causes a crash
  - Worked auto detection of long and float values
  - pow(a,b)
  - Fixed sfloat, vsfloat rounding of negative numbers
  - Long commands no longer cause the command buffer to 'blank out'
  - Better tracking of code in the disassembler window
  - Labels and symbols not recognized
  - Packed float address count in pass1 assembly
  - LABEL;  comment ignored
  - Comment preceding || of parallel code was ignored
  - FFT analyzers were moving 2x data necessary for display
  - Added TMSFLOAT.CPP to distribution disk
  - LOOPAIC.ASM AIC initialization routine was corrupted.

  - Can now force stepping using 'shift' function steps (SF8/SF10)
    through even code that turns off, masks, or loses the host
    interrupt enables.  Usually shows up as a load to the IE register

  - Can now set a breakpoint at the end of a repeat block.  Previously
    the breakpoint (a trap) would wrap around to the repeat start and
    therefor not step properly

  - The TRAP binary opcode value was missing an offset of 32,
    causing the TRAPs to begin at address zero, overlapping the
    normal interrupts.  Note: The DSK uses this feature to create
    TRAPs that execute the standard interrupts.

            As defined in the UG, this bit
            pre-adds an offset of 32 to a TRAP. ------+
                                                      |
    C3x TRAP = 0x74000020 = 011101000000000000000000001xxxxx

  - An error in the indirect addressing filter would get confused in the
    following case.  Basically '+' within the offset field would be seen
    as a post modifier add (it was trailing the ARx field) and generate
    a bad code.

    Ex.   LDF  *-AR0(1+1)  <- Generates bad code
          LDF  *+AR0(1+1)  <- This worked

  - The following, improperly written code, would not generate an error

    Ex.   LDF  *-AR0(1)%   <- The % modifier was ignored

  - If a block of code was disabled " .if 0", and a parallel code was
    inside the disabled block, the second line of the opcode would
    generate an error.  Example.

       .if  0          ; Turn off code block
       ldf  *AR0,R1    ;
   ||  ldf  *AR1,R2    ; Error generated here
       .endif

  - If a breakpoint was set within an ISR as shown the debugger would
    loose synch, in version 1.11 but not previous versions.  This bug
    was created by a routine that was added for benchmarking (the _dT
    option in the debugger).  The new routine would force a single step
    of a known opcode (a branch) and use it as a standard value for
    timing calculations.  Since the DSK uses a low priority interrupt
    for debugging it was possible to loose the debugger interrupt. By
    forcing all interrupts to return to the SSTEP routine, all cases
    were guarenteed to return.  This bug was fixed using the singlestep
    forcing feature (previous bug fix).

    ISR  nop      ; Enters with GIE=0
         b   ISR  ;
         reti     ;

========================================================================
New for version 1.15                                            12/15/96
========================================================================
  - Lost Host Communications

    If 0xC4 (XINT1,RINT1,INT2) is not logically OR'ed with IE, the
    DSK kernel communications link can be lost.  The effect is that
    singlestepping or running can crash or be eratic.

    - If host communications fail, the user is notified that 0xC4
      should be logically OR'ed with IE

  - Higher level interrupts block host communications

    If a higher level interrupt is pending, and during its execution
    fails to fully recover E (OR of 0xC4), the CPU can miss the host
    communications interrupt, failing to return to the command state.

    - If singlestep or run synchronization fails, the user is notified
      that 0xC4 should OR'ed with IE and that SF8/SF10 can be used
      to override all interrupts, forcing all interrupts to point back
      to the singlestep routine.

  - A BreakPoint (BP), which is a TRAP opcode, can now be set in
    most locations including repeat blocks.

    When a break point (TRAP) is executed the program counter (PC) is
    loaded with the TRAP address+1.  By then cross referencing the PC
    with known BP locations, the host can then properly back up and
    execute the code that was in the BP location.

    However in the case that a BP is set at the end of a repeat block
    the PC value will not be BP address +1.  Instead the PC will be
    reloaded with the starting address of the repeat block and the
    RC decremented.

    By verifying that the apparent BP location was not in the active
    BP list, that PC=RS, and that a BP was set at the end of the
    repeat block, a recovery can be made.

    Conditions that cannot covered include

    1) A BP cannot be set at both the end of a repeat block and
       at the position RS-1.  A warning will be displayed if this
       condition is detected.

    2) A BP cannot be set within the three opcodes immediately
       following a delayed instruction.  This condition is not
       allowed since interrupts, and TRAPs are disabled during
       those cycles.

       Note: A TRAP within 3 instruction of a delayed code will be
             taken after the 3rd opcode, without regard to the PC
             load of the delayed instruction.  A recovery is not
             possible.  An error is generated if this condition is
             detected.

  - Not all operands for parallel enhanced opcodes (PG 6 and above)
    were allowed.  IE use of non floating point registers and some
    special opcode orderings where missing.

  - Consolodated the display and source managment of help files as
    follows.

    - TXT2SRC.EXE utility was created to convert *.HLP text files into
      properly formatted C strings.  The resulting *.CPP file is then
      #included into the code.  TXT2SRCE was also added to the Transfer
      Utility in the IDE such that auto-dependenct builds will work.

    - All help files are now managed through a single display function.

  - DSK_reset() function was cleaned up to eliminate dead or inefficient
    code and to also make it easier to port to a Windows DLL.
  - Known screen update errors and lost messages were fixed
  - Saved Help files now have a *.HLP extension
  - The command buffer depth was increased to 16 commands
  - Can now to save the symbol table to a file.
  - Changed rev to 1.15 (1.20 will be the formal release level)
  - The assembler now accepts F0-F7 as valid arguments for float regs
  - The assemblers defined register are now fully table driven.
  - 'FP' is now accepted as 'AR3' the C frame pointer

  - CREAD (TAKE) <filename> has been added to allow execution of
    debugger commands stored in a file.

  - CSAVE          Saves command buffers, window positions, PC and SP
    CSAVEALL       Same as above, but also saves all onchip memory to
    CSAVEALLCOFF   FULLSAVE.HEX or FULLSAVE.OUT (COFF version)

  - A new command 'CMDxx string' copies 'string' to command buffer xx
    'PAUSE' and 'END' functions were also added
  - Consolodated the command processor switch tables.
  - Can now 'SAVE x,y,DASM' memory in DASM format to a file
  - fcloseall() statements in DSK_COFF.CPP were changed to fclose()
    of localy open files
  - New commands DASM0-3 now allow various amounts of information
    to be written to the DASM window.
  - The 40 bit and floating point display now persist after hitting
    the F2 or F3 keys.  Can now edit the CPU registers as both
    hexadecimal or float
  - Now use ExeCmdStrg(char *) to execute command entries, rather
    than seperate command processors in several boxes.
  - DSK3A labels to floats ("F0 .float 1.4") are now properly listed
    in the symbol table at the end of the DSK file and are properly
    read in and used by the debugger

========================================================================
New for version 1.16                                              1/6/97
========================================================================
  - 43/50 row screen modes are now supported using a new command
    line option 'C4350'
  - The MEM window start address can now be entered while the MEM window
    is active using the F2 function key.  The edit box that is opened
    can accpet numerical or symbolic expressions similar to the command
    line and assembler.
  - Preservation of the last used cell for the MEM and CPU windows
    makes it easier to go back to the location that was last edited
  - The DASM window cursor location now tracks the PC value when the
    window is first opened

========================================================================
New for version 1.17                                              2/6/97
========================================================================
  - New help utility DSK3HELP.EXE
  - More help files, especially for applications
  - New utility LOADPROM.EXE reads *.HEX files into DSK memory assuming
    that an EEPROM is present.
  - INSTALL.BAT now includes version stamp recognition
  - DSK3LOAD now recognizes when no file is specified
  - Disassembler routines now use a hash table for faster code lookup
  - TI Floating Point Tools Version 5.0 support.  A new COFF file
    version was added.  Changed some structure definitions
  - Q format view and edit of the memory window
========================================================================
New for version 1.18                                              3/7/97
========================================================================
  - Added more application information to APPHELP.HLP
  - Added DSK_WAV.EXE (DSK_WAV.CPP/DSKWAV.ASM) wave file play and record
  - Improved LOADPROM.EXE user interface to have highlighted data
    and reconstructed data (byte->long) for easy verify.  Also set
    wait state generator to maximum for slow devices.
  - Added PICK.EXE ot INSTALL.BAT to replace DOS 'CHOICE' command.
    CHOICE was not available before DOS 6.0 and was therefor giving
    users installation errors.
  - Fixed a DSK3A bug that was causing load errors
    Within a .if section that was disabled, directives were not being
    shown as 'nocode' lines.  As a result the loader would see a .sect
    that should have been disabled as active.

     0x809800 directive   .if 0         ; turn off assembly
     0x809800 directive   .sect "JUNK"  ; section
     0x809800 directive   .endif        ;

     0x809800 directive   .if 0         ; turn off assembly
     0x809800 nocode      .sect "JUNK"  ; section
     0x809800 nocode      .endif        ;

  - Immediate short float values (4/1/11 format) with Exp=-8, should
    disassemble to zero.  This is bypassed for the DSK3A assembler
    loopback test mode which is used to verify binary exactness for
    disassembled -> re-assembled binary opcodes.

  - Added a commented out line of in TMSFLOAT.CPP, function TMS_IEEE(), that
    can be used for the conversion of 'Denormal' IEEE floating point numbers.
    Denormal numbers occur when the exponent is -127 and fall outside of the
    IEEE range of 2^-127 < 2^127.  Denormal numbers may not be faithfully
    represented or operated on in an IEEE number format.  These numbers are
    either treated as zero values, or as 2^-127 * Q23(frac).  The C3x/C4x
    on the other hand uses the range specified for denormal numbers for
    floating point representation.

  - An '.brstart' (or any other section change statement) imbedded into
    the comment field of a section which was supposed to be turned off
    in a .if block was causing the section loader to fail.

  - DSK_TEST.EXE, TXT2SRC.EXE and FFT_256B.EXE were removed from the software
    installation diskette to make room to fit into 1.4MB diskettes.  The
    source and project files for these applications are still included.

========================================================================
New for version 1.19                                              4/2/97
========================================================================
  - Made changes to DASMC40 to remove the use of 32 bit bit fields in
    the disassembler forms.  This practice was not ANSI-C compliant

  - Added function 'int isC4code(int);' to the dasm/assm to avoid testing
    each code explicitly within the assm/dasm form functions

  - Worked on STIK, TOIEEE, FRIEEE and LDA C4x codes

  - dasm_assm loop now only prints to screen in verbose mode.

  - STI R0,*+AR0(VeryLongName) the buffer array was limited to 16 chars
    and subsequent string copies were corrupting the other data.

  - WS chars are no longer appended to .include file names for people
    porting the assembler

  - Added code to detect section names with >16 chars.  Now returns
    an error

  - .word, .float etc... with no argument did not generate an error

  - Bump up the rev ID for all tools and apps to 1.19


========================================================================
New for version 1.20                                             5/12/97
========================================================================
  - Bumped up version number to 1.20
  - Changed primary bus control word during file conversion to bootable
    HEX format to 0x10F8.  This sets WS = 7 (max) which is the safest
    for very 'slow' boot.
  - Edited C3X.ASM to better explain primary/secondary vectors
  - Added a C31/C32 command line switch option to indicate target types
  - Moved to DSK.H
    SIZELOC is where printer port readback mode information is
    TESTLOC is where R/W verification determines if kernel load is OK
    VECTLOC is where the primary or secondary vector table is located
    STEPLOC is where _dT is tested.  SIZELOC was used since the contents
            of SIZELOC which are either 3 or 7 decode to ABSF instructions
  - Removed several unused enumerated MSGS to free up much needed string
    space.  Was once again getting 'dgroup exceeds 64K' linker error

  - For C32 HEX files, the section destination address is used to
    determine which STRB space to use.  IE bottom two hex are

    0x00 Internal
    0x60 IOSTRB
    0x64 STRB0
    0x68 STRB1

  - Added following command line switches for controlling the default
    Wait state setup for the bus control registers of the C31 and C32.
    NOTE:
     - NO white spaces are allowed on either side of the '='
     - Values are either C style hexidecimal or decimal
     - If 'WS=x' command is used for a C31 target, the WS value
       will overwrite the WS field as defined in the 'pbuscon=xxxx' field
       For a C32 target the 'WS=xx' command is not used for the default
       strobe setups, but is used for subsection loads.

         ws=3                defines default WS for all strobes
         pbuscon=0x1038
    -or- p_buscon=0x1038     boot p_buscon value
         IOSTRB=0x10F8       boot IOSTRB value
         STRB0=0x10F8        boot STRB0 value
         STRB1=0x10F8        boot STRB1 value

  - Added a getch(); pause in DSK3A to see errors/warnings when the
    assembler is run from a batch file or IDE shell.

  - Detect and do not load DSK files that did not completely assemble.
    All valid files (no errors) end with ">>>> END DSK" string.

  - Finished code for two channel AIC swapping (DSK_OSC2.EXE stereo ADC!)

  - Added section to describe porting C31-C32 systems
    - Vector tables -vs- branch tables
    - PAL synchronization of H3 instead of H1
    - Hardcoded values passed as elements in symbol table

  - Added serial to parallel PAL circuit description to APPHELP.HLP

  - Added valid C32 memory ranges to the hard coded memory map of the
    C31.  Some memory locations will appear to be valid that are not
    actually there.  (See to do list)

  - Added target identification switch to kernel

  - Added "C3X.DSK" "C32.DSK" kernel name switch when C32 command line
    option is used to select a C32 target system

  - Fixed bug in interim 1.20 beta release regarding R0 not updating
    in the debugger.  The cause was that when the STEP_LOC variable
    was added to the kernel, the location being singlestepped was
    corrupting R0.  Changed STEP_LOC to point to a benign 1 cycle
    opcode.

  - When the -cr option was used with the C compiler, the FILE2HEX
    converter did not substitute the .bss start address for the
    beginning of the .cinit section

  - Expression analyzer errors that were caused by executing
    operators in the wrong order when expressions where nested
    within parenthesis of a function have now been fixed.  The
    implimented fix is a function which scans for parenthesis
    and then evaluate each subexpression, replacing the contents
    with a temporary variable (foo_var).

          .float  32000*sin(($-SinWave)*2*PI/N)
    zzz   .sdef  $-SineWave
          .float  32000*sin(zzz*2*PI/N)  ; This works

  - The symbol table number type and symbol type flags are no longer
    hardcoded values.  IE INTEGER, FLOAT, AUTO are now enumerated.
    However, to compact the symbol table, these types are stored as
    characters in the SYM[] structure.  If you plan to work on the
    SYM[] tables or symbol processing, go into SYMBOLS.H and change
    these back to enumerated values to enable type checking by the
    compiler.  Note however that this will cause the symbol table
    size to increase, likely causing a 'DATA GROUP EXCEEDS 64K' error
    from the linker.  Either temporarily decrease the size of the
    symbol storage array, or compile with the huge model.  If you
    compile with the huge model, be aware that the objects that are
    created will NOT be compatible with the other DSK project builds,
    the code size of DSK3D will get much larger and will execute
    slower.  This is because all pointers will be converted to 32 bit
    huge pointers.

  - Added a switch to the symbol listing to show the contents at a
    memory location 'LABEL'.  The display is cycled between the value
    of the label, hexadecimal contents and floating point (if NUM_TYPE
    is FLOAT) by pressing the space bar.  A check is also made to make
    sure the address does not point to the host port interface address.

  - Added a C32 target switch to the DASM_WINDOW routine (SCREEN.CPP)
    to force data reads to 32 bits when fetching external program
    words to be disassembled.

  - Added another variable to the C3X.ASM symbol table to indicate the
    starting point of the host port interface.  At this time the host
    does not use the value of this symbol for any data accesses but it
    may be important for C32 support.

  - memqxx memory view and edit windows now support fractional Q formats.
    The assembler was not affected since this was already supported.

    memq15.5  3.1415926   Note: Decimal point is not at a bit boundary
      .q15.5  3.1415926

  - CPU register window cell edit did not recognize white space characters
    and would concatenate fields before conversion 0.5 3e-1 became 0.053

  - Wrote a HEX2ROM utility.  The utility converts DSK, HEX and OUT files
    to INTEL, MOT_S1, MOT_S2, MOT_S3, TEKTRONIX, TI-TAG and ASCII ROM
    formats.  LS/MS Swapping is supported as well as any combination of
    ROMS and ROMWIDTH.  This utility will also generate a HEX30.CMD file
    that can be used with the COFF tools HEX30 utility.  HEX30.CMD was
    used to ensure that HEX2ROM output matched HEX30.  The user interface
    is fully interactive and includes a sample display window showing
    how the ROM output will look.

    This utility uses a HEX file input and will convert DSK and OUT files
    to either C31 or C32 bootable hex files.  The C32 options for setting
    up the bus control registers are selected on the command line.

    At this time, the converter assumes that ROM output is that of a
    bootable file, and not a ROM that will be used in uP mode.

  - In the symbol listing menu, changed to a curly brace around the
    contents of a 'fix label' in sym listing.  Also, like the contents
    of a float, an integer now displays as decimal and hexadecimal as
    the output type is cycled

  - Found that the STEPLOC that was being used, though a valid code, was
    also changing the value of R0.  This only affects the beta version
    1.20.  The new safe STEPLOC location was set to spin0  (or 4,IE).
    This opcode is benign and does not affect the IE since the value
    must has bit 0x4 set to run the kernel anyway.

  - PUSH/POP of ST register was not required for host receive and transmit
    routines in the C3X.ASM kernel.  These are functions and not ISRs.
    Saved several lines of code.

  - XREAD and XWRITE had several lines of common code in the lead-in.
    Effectively reused several lines by adding a BUD instruction as shown

R_HOST  bud     R_HOSTx       ; BUD allows reuse of 3 lines of code
W_HOST  push    AR0           ;1 common
        push    AR1           ;2 common
        push    DP            ;3 common
        ldp     HPADDR        ; begin non-common code
        ||      ||            ;
;====================================================
R_HOSTx ldp     HPADDR        ; begin non-common code
        ||      ||

  - Changed load of host port address to facilitate porting kernel to the
    C30_EVM and other targets.  Does require one more memory location, but
    made this back in removing ST push/pop and common code overlay.

         ldi    0xF000,AR0   ; LDI sign extends to 0xFF000, OK for DSK

         ldi    @HPADDR,AR0  ; Load from a memory location ok for all
HPADDR   .word  HP_ADDR      ; 32 bit HPA value stored here

  - DSK3A Overlay detection did not printf to screen, DSK3A listing output
    file was OK.  Fixed by turning off quiet (quiet=0).

  - Changed DASM of several DForm0 (LSH,ASH,RPTS...) instructions to
    disassemble with decimal immediate values rather than hexadecimal.

  - Added MEM2 (base 2) memory window format to allow easy bit manipulation

  - Added expression analysis editing (F3 key) of memory window values

  - Re-compiled all code using Borland C++ 4.51 to locate more potential
    porting problems for users who are porting the code to other OS and
    platforms.  Borland 4.51 identified many new warnings and some errors.
    The warning count is now down to 2 warnings during DSK3D build.

  - Added BCBUILD.BAT, MKTOOLS.BAT to DSK3SRCE batch build
  - Changed *.DOC and *.HLP files to *.TXT file extensions
  - Added SFFT.TXT and DSK_WAV.TXT copy to root in BUILDASM.BAT
  - Added Freq peak and measure (acurate to 1 hz) to all FFT_xxxx.EXE apps.

  - FFT_1024 now works concurrently with MEMVIEW.  A non graphics mode
    was added otherwise graphics routines like DSK_OSC will halt while
    a background task.

  - STEPLOC default value was not set properly.  Now using INT2 branch
    code.  INT2 is a better choice than spin0 since spin0 can move with
    C3X.ASM versions whereas the INT2 branch is fixed.

  - Bumped up version ID to 1.21

  - Added instruction promotion where syntax using fewer operands or
    abreviated syntax is allowed.  Note that the COFF tools recognizes
    *AR4%  as *AR4.  An error or *AR4++(1)% would be a more logical choice
    Promotion of MPYF||ADDF to MPYF3||ADDF3 (and similar) was added to
    OPCODES2.CPP table but is temporarily disabled (via comment) because
    of a DGROUP>64 K linker error.  Need to shrink total mem usage again

      Original                 Promoted
      --------                 --------
      CMPI  AR4,*AR5     ->    CMPI3 AR4,*AR5
      LDF   *AR4%,R0     ->    LDF   *AR4,R0
      ABSF  R0           ->    ABSF  R0,R0
      NEGI  R1           ->    NEGI  R1,R1
      MPYF  R1,R0,R2     ->    MPYF3 R1,R0,R2
      RND   R1           ->    RND   R1,R1
      MPYF  R1,R0,R2     ->    MPYF3 R1,R0,R2       ; Currently disabled
   || ADDF  *AR1,*AR0,R2 -> || ADDF3 *AR1,*AR0,R2   ; see note

========================================================================
New for version 1.21                                              9/1/97
========================================================================
  - DGROUP > 64 K linker error was resolved by merging common strings.
    Next code shrink can be done by specifying an x386/x486 as the minimum
    processor, followed by a numeric coprocessor.  The last option is to
    promote all projects to the HUGE memory model.

  - DSK functions and global variables have been extended to be Windows
    DLL compatable using the following construct.  Basicaly if a DLL or
    Windows application is being created, __DSKWINAPP is defined and the
    DLLEXTEND keyword expands to include the 'FAR PASCAL _export'
    keywords.  If Windows is not the target, DLLEXTEND is replaced with
    a NULL string.  This is currently defined in 'TYPEDEFS.H' which will
    probably get changed soon as this is not a logical place to look for
    such things.

    #ifdef  __DSKWINAPP
    #define DLLEXTEND FAR PASCAL _export
    #else
    #define DLLEXTEND
    #endif

  - The Windows application, currently named 'IMPLCALL.EXE' is essentialy
    a glorified memory dump window.  However, this window is capable of
    displaying data in many formats.  The user can enable column information
    for displaying the address, symbols, and data either in hex or auto
    detect mode depending on the symbol storage type.

    A disassembler mode was also added making this application essentialy
    capable of showing the same information as the DSK3D disassembly, CPU
    register and memory dump windows.  Currently cell editing is not
    included.

  - Added C32 target options to the online documentation

  - Added C32 specific lines to the autogenerated HEX30.CMD in HEX2ROM

  - Added 'DLLEXTEND' to some additional global variables and functions
    for supporting windows applications.

  - With the code now reasonably stable, DSK.H is now all inclusive of
    all sub header information.

  - Renamed Windows application 'IMPLCALL.EXE' to 'CHAINSAW.EXE'

  - Added '-byte' support to the HEX2ROM.EXE utility

  - Edited SFFT.TXT

  - Improved and edited SFFT.ASM.  Application now requires fewer setup
    parameters.  Both REAL and IMAG summation are now included in the
    inner SFFT loop calculation.  Speed is now 7 cycles/bin if both
    REAL and IMAG sums are calculated.

  - C level applications now written include simple AIC loop program
    'LOOP_C.C', SFFT general application for filtering 'SFFT_C.C' and
    host interactive SFFT analyzer/signal generator 'DSK_BODE.C' and
    'DSKBODE.CPP'.

========================================================================
New for version 1.22
========================================================================

  - Bumped rev information number up to 1.22

  - Worked on all of the source code to make it compatible between DOS and
    windows applications.  Platforms that can now compile code with no
    warnings and errors include Borland 3.1 (all DOS apps), Borland 4.51
    (all DOS and all Windows apps), and MicroSoft Visual C (Chainsaw
    Windows app only).  Porting of the Windows graphical shell for the
    FFT/OSC display has not been started yet.

    Note that the code is somewhat cabagged (not pretty) and includes
    '#if _WIN32' statements in many places for conditional compiling.
    _WIN32 is used since it is specific to MSVC and __WIN32 to Borland.
    A new #define will be created in the near future to make the operation
    of the switch more apparant.

    MultiTask protection is temporarily disabled if MSVC is used to build
    an application

  - Worked on a Borland 4.51 IDE message translator extension for DSK3A.
    This translator will filter DSK3A Warning and Error messages for
    display in the IDEs message window.  By then clicking on a line in
    the IDE message box, the IDE will open up the offending file and point
    directly to the error.  Also plan to retrofit this work to the Borland
    3.1 IDE (I prefer this DOS editor over all else!), and MicroSoft
    Visual C++ IDE.

  - Created a DSKGRAPH.EXE program to graph the memory contents at an
    address.  Need to add support for LIN-LIN, LIN-LOG, LOG_LIN, LOG-LOG
    graphing, file load/boot run functions.

  - Message stating 'DSKAPP.DSK not found' is misleading in Windows app

  - Added fgetmem() and fputmem() wrappers to getmem() and putmem().
    These functions will convert and transfer arrays of TMS float to
    and from IEEE arrays.

  - Fixed some syntactical anomalies that have caused trouble for a
    customer using Borland C++ 5.00, Borland 4.51 and MS DEV STUDIO
    do not seem to recognize these.

    In "SYMBOLS.H"
    typedef enum E_SYM_TYPE
    {
      SYM_FOO     ,
      SYM_VAR     , // VAR_ADD     ,
      SYM_LBL     , // LBL_ADD     ,
      SYM_DEF       // DEF_ADD     ,
    };
     ^------ need a symbol here.

    'x' is not defined outside the braces... 2 locations in 'ARGSPLIT.CPP'
    for(int x=posn;x<maxargs;x++)
    {
      <code deleted>
    }
    return x;   <--  x is out of scope after this point

  - While typing in hexidecimal representations in the CPU window for F0-F7
    the entry parser suddenly says 'bad expression', expecting the input to
    be an expression and not hex

    Problem was traced back to a hardcoded value for CPU_mode (display mode)
    Ver 1.22 Used NT_INTEGER, NT_FLOAT... enumerations

  - 'float 1024,R0' ASM/DASM assumed a 16 bit immediate short float value
    should be a 16 bit signed integer.

  - Internal Beta 1.22  'BW=8' force bi-dir was temporarily broken.

========================================================================
New for version 1.23                                              3/28/98
========================================================================

  - Updated version stamp

  - DSK3D support for the EVM with base address set using command line
    PORT=0x240.  C3XEVM.OUT kernel is loaded using EVMLOAD utility running
    in a DOS shell.

  - F10 step over of a BP within a function caused the BP opcode to be
    replaced by debug TRAP 8.  Found an extra set_all_bp() in FSTEP_Cmd().

  - Verified ver 5.0 COFF support

  - asm patch routine using long expressions now update the screen but
    do not high light the change.  Previously, the update did not occur.

    asm 0x809801 .float (3.14*.01)    Works
    asm 0x809801 .float (3.1415*.01)  Fails to highlight changes

  - HEX2ROM improperly printed long section names like "_Default_Sect"
    with non printable chars.  Fixed within print statement

  - Symbol tables are now malloc'd freeing up data segment memory

  - Increased HLL_limit to 1024 entries, added HLL_LIMIT error message

  - SAVE data.bin,0x809a00,256,W produced a binary byte dump.

  - SAVE DASMFILE.ASM,0x809800,256,d  Address column was off by one
    Also added label field to output file

  - MEM2HEX, csaveall in C30_EVM mode would not output the HEX file header

  - 'memq31 _R0' switch ignored the address field

  - HEX file buscontrol word is now set by 'WS=7' command line

  - Opening command messages informs users of new features in WHATSNEW.TXT

  - Project builds of the DSK driver API assumed that the target was a
    DOS app or a DLL.  Linking the drivers directly into a windows
    applications EXE is now supported by setting the WINDOWS_LINK_ALL
    switch in TYPEDEFS.H

  - Added COFF converter to DSK3LOAD and and alias commands: DSK2COFF,
    FILE2COFF, 2COFF, COFF2HEX, DSK2HEX, 2HEX, FILE2HEX

  - Created FILECVT.EXE from DSK3LOAD as a standalone file converter

  - Added a fix to Create_Sym() to initialize the symbol pointers
    even when the startup is not via normal boot process.

  - Fixed the .brstart which was not properly detecting 2^N input
    arguments nor advancing to the proper address boundaries.  The
    expression analyzers circ() or br() functions (same operation),
    also did not properly detect that the input operand must be 2^N.
    Verified SFFT.ASM, FFT1024 and FFT512.ASM work.

  - Found that if fclose was called on a FILE * that did not exist,
    it would GPF.  Created a my_fclose() that looks for NULL values
    and is a little more sane.  Also, set all DSK_COFF 'FILE *fptr=NULL'

  - Added '#define __DSKWINAPP 1' to WINDOWS_LINK_ALL and added
    windows.h to DRIVER.CPP

  - Added Numeric keypad entry to DSK3D.  NumLock must be on.

  - In WIN32 applications, integers are promoted to 32 bit values.
    Since COFF files have defiend bit fields, byte packing each element
    of an array, plus making sure each element of the structure is on a
    byte boundary must be forced.  This is done using '#pragma pack(1)'

    WIN32 defines a 16 bit integer as WORD, and 8 bit chars as BYTE

  - FFT_256.EXE and FFT_512.EXE have been merged into FFT_XXX.EXE.
    The FFT butterfly has been somewhat optimized using PG6 opcodes
    (there is a switch to turn this on and off), as well as general
    cleanups for readability.

    The post FFT windowing and log magnitude conversion routines have
    also been restructured to make them easier to find and understand.
    Also, this new restructuring allowed the host to query the DSK
    for the raw magnitude data in 'R^2+I2' form.  From this, even more
    accurate Frequency estimations using a centroid method are possible.
    The new F resolution is essentialy that of a floating point number.
    For example, 1000.00 and 1000.01 Hz can be resolved as seperate
    frequencies using a 512 point FFT.

    The mantissa mask filter has been replaced with a variable mask
    of a logarithmic differential compression compressor and decompressor.
    This allows the user to see how LDC affects data.  Note however that
    a reconstruction filter is NOT used, which says that the practical
    audio noise floor is actualy much lower.

  - Cleaned up and improved FIR_IIR.ASM routine.

========================================================================
New for version 1.24                                        6/30/98
========================================================================

  - Updated version stamp

  - Floating point saturation of expressions are now clipped to valid
    levels.  Also added global variables that can be polled to determine
    if saturation has occured, 'f_saturation' and 'l_saturation'.
        0 =  No saturation
       +1 = pos saturation
       -1 = neg saturation

  - Added disassembly to FILE2HEX converter.  This option is enabled using
    a #if directive at the top of DSK_COFF.CPP.  Note that most of the files
    in subdir COMMON2 need to be linked if this option is enabled.

  - Added support for Loading and bootloading both C31 and C32 HEX files
    NOTE: A C32 DSK platform was not available, so bootloading is untested.
    Loading is via the kernel (ie smart), so format is not an issue.

  - Added mneumonic "BD" as an alias to "BUD"

  - Added graphing to MEM window.  Activation is through the 'G' key.
    The graphics plot data type and range are then set via 'M', 'D' and
    F1-F6 function keys.

  - Added C HLL-level debug.  C level debug is enabled for COFF files
    compiled (or assembled) using the -g command.  Activation is via
    the 'F4' key or 'DASM4' command

  - During the rewrite of FFT512.ASM into a common FFT routine (FFTXXX.ASM)
    the log2() conversion was temporarily broken by shifting the wrong
    register to clear the sign bit.  This should only affect a few beta
    versions.

  - if a parallel operator appearing in column 1 within a disabled
    .if/.endif directive would be decoded as an erroneous character

    MPYF    R1,*+AR4(IR1),R3   ;
||  STF     R3,*+AR0           ; No error
    .if     0                  ;
    MPYF3   R1,*+AR4(IR1),R3   ;
 || STF     R3,*+AR0(1)        ; No error (col 1 is blank)
    .endif                     ;
    .if     0                  ;
    MPYF3   R1,*+AR4(IR1),R3   ;
||  STF     R3,*+AR0(1)        ; '||' in column 1 causes error
    .endif

  - The .xon and .xoff directives were being processed even when a
    section of code was turned off.

  - COFF file translation to HEX files were corrupted if the COFF file
    was generated using -cr.

  - Changed DSK3D default screen mode to 43/50 row mode (C4350)
    Low res mode is still available using L or LV force switch.  The
    odds of DSK3D starting on a non-EGA graphics mode PC, running DOS
    is very low.

  - Created keyset() function to set 'Num_Lock=OFF' on startup of DSK3D.
    Used int86(0x16,regs,regs), so not portable to Windows.

  - Added Windows help to Windows FFT/OSC demo

  - Rewrote FFT_XXX demos as a single FFT demo using FFT_RR2.ASM as the
    FFT core (Real FFT).  FFT.EXE can be used for 256-1024 point FFTs.

  - Can now specify any kernel name from the command line using
    'k=xxxx.dsk', 'k=xxxx.out' etc...

  - Removed hardcoded exit() on GRAPH mode quit

  - Removed hard coded NUM_TYPE in asci_num(): ASCIINUM.CPP

TO DO
-----
  - Windows app:
    Rename BEAMER3.EXE to something more meaningful
      FFT_OSC, SIGANLZR, BENCH3X etc...
    LPT1-LPT3 and port type select dialog box on startup
    What DLLs need to be included (Win16 or Win32)

  - Check MEMF dump accuracy.  Seems to be off.

  - signal() math error catcher does not work in Win32 DLL

  - COFF FILE_HDR.date is 32 bit (Y2K problem?) currently do not use

  - Y2K for DSK format?

  - DSK3LOAD error (John Storrs)
    linked object file does not have to be called to break working code
    Mere fact of linking does it.

    Example:
    void functionX(void)
    {
      functionY(0xC00000);
    }
    Working code breaks if this code is linked using -cr (RAM model).
    Appears OK using -c (which I will now use).

  - Text in command line help needs formatting

  - DSK_WAV 'DSKWAV.DSK not found error' did not print name of file

  - HLL symbols w/o prepended underscore?

  - Convert DSK data storage types to those used in COFF format

  - Improve Graphing and HLL debug features

  - Add Logarithmic Differential Compression to DSKWAV and FIR_IIR

  - Add file IN/OUT attach to breakpoints

  - Disallow writes to INT2, XINT1, RINT1. Feature or bug?

  - Investigate using DSK3LOAD as a shell program to run and start apps.
    minimizing linked code.  However, p-port configuration is then hidden.

  - There are 'goto' statements in argsplit... ick!

  - LOADPROM.EXE - File formats other than *.HEX should create and load
    *.HEX files.

  - Add HEX2ROM sub menues to set WS and other params.

  - Load COFF labels from the MAP file if it exists.  This bypasses
    filtering and loading from the COFF file itself.

  - Add HLL tracking to DSK3D

  - DSK3D 'reset' does not reload DASMBGN for dasm window. Feature or bug?

  - Add to FFT/SFFT documents topic that the Impulse response will be
    affected by the time of arrival relative to the window.

  - When command overruns the CMD box, causing the window to grow, the
    memory window highlight is lost

  - XXX .set 1,2   Multiple values should generate an error

  - FFT_XXX.EXE does not disable_Mtask() before PSTRB=0 allowing printer
    DLLs to see PERR=0, ...assuming printer has crashed.

  - Add '//' and /* */ style comment operators to DSK3A

  - Cell edits using the the expression analyzer, or patch assembler will
    add those functions.

  - Adding command (Load, RUN, HALT...) adds command line entry features
    to cell editing functions.

    NOTE: The symbol table, expression analyzer and assembler are currently
    linked into the DLL but various function calls may need to be
    'DLLEXTEND'ed to make this a reality.

  - Write seperate functions for detect power and DSK active.  Pull out
    should make init easier for windows port.  Fall back one layer,
    passing tokenized messages.

  - Add CIO functions like printf to the host side code?  If a breakpoint
    is found evaluate an expression and display the result?  Pipe to a file?

  - Modify SFFT.ASM to be used as a graphic equalizer.  Essentialy go
    through the Fbins and multiply by a magnitude value before
    reconstruction.

  - Add C32 extension information to online help

  - Add an editor to the symbol listing to allow modification of
    variables and contents of memory locations.  LIkely implimentation
    will be similar to the command line ASM patch.

  - When running to a breakpoint, the singlestep operation (step away from
    current opcode) allows ISRs to run in the background.  Feature?

  - User defined memory maps (currently hardcoded). mapoff command?

  - File loading forces registers back to 'reset' state.  Possible boot
    trouble or overwrite of the previous state.  Feature or bug?

  - Add MMR edit of individual bit fields as an external application.

  - Add DSK2HEX and COFF2HEX file conversion to LOADPROM utility.
    Currently use DSK3LOAD utility which has the converter built in.
    HEX2ROM, which reads and converts files.

  - Cant debug in LOWPOWER mode. Recall earlier version working... Timeout?

  - Add EEPROM page write to LOADPROM.EXE for faster loading of large files

KEL  2/15/99

