The Latest Version of Toad Hall's TOADCPM.COM
                   (Version 2.2, 10 Dec 83)


    Using various patches (credit given below), I've patched CPM
2.2 to add some things I've found very useful:


PRINTER:   In  Version  2.1,  it's  configured for  a  9600  baud
printer,  using  the Data Ready protocol (donno if it's the  best
for  my Mannesman Tally,  but it works!).   Version 2.2  now  has
XON/XOFF,  which  works just fine using exactly the same cabling.
Seems to cause a bit less delay when simultaneously printing  and
making  keyboard  entries  during  UNSPOOL  or  WordStar's  PRINT
utility.   [Note:   As of 10 Dec I went back to Xon/Xoff, just to
see if there was a difference.  None, really.]


ASSEMBLY SETTINGS:  (Look at the TOADBIOS.ASM listing for details
-- it's for the XON/XOFF, 19200 baud Version 2.2, but all changes
are  fully  documented.)  You'll see it's for a 64K  system  with
DEBUG set to ON to give me various sizes and locations during MAC
assembly, and NONSTANDARD set to 1 (donno why; I thought Morrow's
BIOS  was conventional,  but I'm just following the advice of  my
vendor/-confidant  Jack  Long at Cost Plus Computers -- and  he's
batting a thousand so far!).   The original CBIOS&.ASM had at one
point a value set to DECISION I I/O instead of Mult/IO; suspecting
this  might  be giving me some problems in  using  the  clock,  I
changed it to Mult/IO, which is exactly what's in my Decision I.


DUPLICATE *.COM  FILES:   I  dislike  having  to  duplicate  .COM
programs  (utilities and other files) in different User Areas and
disks when my trusty 5 Meg hard disk is just sitting there as the
default A disk most of the time.

   I've  used DUPUSR.COM (a program to put a kind of pointer  in
each User area directory so you get the name of a program or file
in that directory, but not the actual file.  This means no actual
disk  storage  space  used.),  but  DUPUSR  has  one  SEVERE  AND
DANGEROUS problem:   if you erase a DUPUSR-created file name  and
don't  hit  CTRL  C right after the erasure,  you can  have  some
SEVERE directory damage!   About the third time I trashed my hard
disk  directory through carelessness like this,  I decided  there
had to be a better way!

    I  read an article out in Netland by Neil Maron that gave  a
patch to make the system look on drive A: if your .COM file isn't
on the logged in drive.   Additionally,  if it isn't on A: in the
same  User Area,  it'll look to User Area 0 for that file  before
giving  up.   This means I can keep all the common utilities  and
COM files in User Area 0 on my hard disk,  configure my CP/M  to
always use the hard disk as A:, and I'm in business.

    There are only a couple of places where this fails me.

   a.   WordStar:   You can have WS.COM on disk A,  User Area 0,
all  right,  BUT  you  must have the *.OVR files it uses  in  the
default disk (A for me) and the User Area you're working in!   WS
can  be  installed or patched to look to a default disk  for  its
OVR files,  but it does NOT know how to look to User Area 0!  No
problem,  really  -- this  is  where I take the  chance  and  use
DUPUSR.   I  DUPUSR the .OVR files to all appropriate User  Areas
where  I might want to run WS.COM.   I naturally use STAT to make
the  .OVR  files Read/Only and $SYS so they don't clutter  up  my
directory  and I won't erase them by accident.   I  don't  bother
copying  WS or the .OVR files to other disks,  but instead depend
on the default disk (A).

    b.  MBASIC (Microsoft BASIC v.  5.1) doesn't seem to want to
accept  a  compound command line like MBASIC STARTREK  if  MBASIC
isn't actually on that disk or in that User Area.   (I think it's
a function of Neil's patch only looking at the .COM file name and
not handling the STARTREK extension properly.)  No big problem --
I  have  two options:   (1)  RUN MBASIC (which works  just  fine,
reaching  out to A:  and then if necessary User Area 0 on  A:  to
find  MBASIC)  and then when in MBASIC,  LOAD or RUN  whatever  I
want; or (2) DUPUSR MBASIC into necessary User Areas so I'll know
it's there.  (Again protect it with R/O and $SYS.)

   c.  SUBMIT may give some problems.  So far I've had none, but
there are lots of fancy applications,  modified SUBMITs, etc. out
there  where  this may hang up.   If there's a problem  with  any
SUBMIT applications,  just DUPUSR it into the User Area requiring
SUBMIT applications and forget about it.

   d.   My library is a bit limited,  but if you have any  other
fancy  programs  that  do lots of overlaying,  calling  in  other
programs,  etc.,  you'd better not depend on this A:  User Area 0
patch working correctly.   I suspect Visicalc, DBaseII, and those
kinds of application programs won't take kindly to it!

    One  thing -- if you DON'T have your hard disk set up as  A,
then you need to change those JMPs around.   Make CP/M first look
to User Area 0 on the present disk,  and then to Drive  A.   That
way,  if  you're working in your hard disk,  it'll check out User
Area  0  there  first before running off to  look  at  some  poor
innocent floppy.


USER AREA WITH > PROMPT:   I HATE not knowing which User Area I'm
in,  and  I've had some real problems.   Examples:   You get  the
infamous  BDOS ERR ON d:  error message;  you get kicked back  to
User  Area  0 automatically;  you don't know or remember  it  and
erase or do something to a file;  and successfully trash the very
special,  unique,  and  wonderful file in User Area 0 you had  NO
intention of messing with!

   In any case,  it's a pain having to go back to the right User
Area  again.   The  original  code was written by  Bruce  Kendall
(address unknown)  7-12-80,  and  tightened up  by  Bruce  Ratoff
11-17-80.  I made all the Morrow Decision CP/M-specific stuff.
    Basically, it patches a little CALL into the portion of your
CCP  that prints the > prompt,  reaches out to a wee little patch
that was poked into an area of NOPs in the CCP that gets the User
Area and then displays current disk,  user area (in hex  -- sorry
abot that -- had to keep it small),  and > prompt, and goes right
on about its business!   Real simple.  [Note:  I grabbed a little
routine  from another program (donno where),  and made this patch
now print the User Area in decimal after the disk.   Couldn't  do
this  with  a  "hot patch" in the actual BIOS;  had to do  it  in
assembler in the source code.  If you HAVE source code, great!]

   The  TOADCPM.COM  on this disk (assuming you have  the  disk)
includes that patch.   The code is at the end of this article  if
you  want  to  implement  it yourself in  your  own  BIOS.   It's
definitely nice to have,  and not at all hard to implement.  Note
that  I  did NOT make this a stand-alone little  program  that'll
reach out and patch your CP/M in memory.   You'll have to use DDT
for this,  and if you aren't sure of the procedures,  a  step-by-
step  (hopefully eminently logical and easy to follow)  procedure
is  outlined right after the source code.

   The  memory locations given are for Morrow Design's CP/M  for
their Decision I (where the CCP starts at 0B00H in the DDT image,
and at D400H in real memory).  If your CCP starts somewhere else,
you'll  have to figure out your own locations for  COUT  (console
out), GTCMD (Get Command), PATCH (my patch in the NOP area of the
CCP),  etc.   Not  very hard -- you can use the H tool in DDT  to
figure  out some offsets.   (If you're doing these hacks in  your
own CCP and BIOS,  it's time for you to figure out DDT,  offsets,
DDT images, real images, etc. anyway!)


AUTOSTART:   There  have  been several articles around on how  to
make   a  "turn-key"  system  with  CP/M  and   its   "Autostart"
capability.   Basically,  they  involve making a version of  CP/M
that has a .COM file name already in the CCP where CP/M looks for
a  program  name  to execute.   When you boot up (cold  or  warm,
depending),  that program will run.  One article fully explaining
it is "'Turn-Key' CP/M Systems" by James J.  Frantz, published in
Creative Computing,  December 1979.   (It's for CP/M Version 1.4,
but not to worry - that part still is the same in Ver 2.2.)

   One little problem with this,  though!  Morrow's CBIOS& has a
kind of switch (variable name AUTOST) in the source code that you
have to turn on for Autostart to work!  You have several options:
Never, only on cold boot, only on warm boot, and on both cold and
warm boot.   This version is engaged for warm and cold boot.  The
default command "AUTO" is plugged in at the front of the CCP, but
will  have  absolutely  no  effect so long as you  don't  have  a
AUTO.COM file in User Area 0!  If you do ... it'll run!  (You can
get  rid of this with DDT by replacing from 0B07H (DDT image)  up
to the remaining 20's with 20, and then SAVE 48 TOADCPM.COM.

    If  you're  hacking  up  a special  CP/M  for  an  Autostart
program,  the warm boot and cold boot commands can be entered  as
DB's  right  around  page  12 of Morrow's CBIOS  Revision  E  for
Version  2.2  (Mar 4 1982) as provided with my  Decision  I.   In
memory,  if you want to poke it into your CCP,  it's right at the
very  start  of your CCP (0B00H in the DDT image  on  my  system)
where you can see the Digital Research copyright.

    I'm not going to give that full procedure here -- plenty  of
other references out there already published.  But you can put it
right in your CBIOS while editing it a lot easier than looking up
hex and poking into memory.   Remember,  though -- just poking in
the  Autostart command (with its accompanying requirements,  like
length of command in CCP+7, and a NOP or 00 after the command) is
NOT sufficient with Morrow's CBIOS!   You HAVE to turn that Auto-
start switch on!  (Drove me crazy for a while until I figured out
that was the problem!)


COLDBOOT  TO  YOUR HARD DISK:   My system originally used  an  8"
floppy  to cold-boot,  and then I had to run "BOOTMW" to make  my
hard disk A:.  This was a bit of bother, and I accidentally found
the  answer:   Load the Hard Disk version of CP/M on the  floppy!

    Morrow  supplied me with MOVCPM-5 to create a CP/M for my  5
Meg hard disk,  and that's what I used (SYSGENing it to the  hard
disk,  etc.).   Fine  and  dandy -- saved a nice CPM-HD on  file.
Then  I accidentally used DDT to do some patches on THAT  version
of CP/M,  saved it,  and SYSGENed it onto an 8"  floppy!   (Never
would  have  done  it on purpose -- obviously a  hard  disk  CP/M
shouldn't  be on a floppy!)  Damned if it didn't work just  fine!
I put in the floppy, do a reset, she boots, and bingo -- the cold
boot message comes on, showing the HDCMA hard disk as A:, and the
8"  as  B:.   And in fact,  that's what's happened -- not just  a
bogus message.  Works fine, and I've had no problems whatsoever.

   One  little  thing:   You  need the new  improved  CP/M  with
improved  TDBIOS on your hard disk too,  else the warm boot  just
boots up the old normal CP/M.  So SYSGEN TOADCPM (or your version
of your hard disk CP/M with TOADBIOS.ASM) onto both your floppies
and  your  hard disk.   Works - guaranteed.   (Keep a  couple  of
floppies around with a normal (i.e., A: is a floppy) just in case
your hard disk goes down some day!)


TERMINAL/SERIAL BAUD UPGRADE:   Version 2.2 relies on a different
approach.   Jack  Long  at  Cost-Plus said he tried  to  set  the
switches  on the CPU board to have the Decision I do a cold  boot
from the hard disk.   Worked,  OK,  but then refused to recognize
any  other  disks!   This put me off for a while,  but  found  my
technique of booting from a floppy and switching over to the hard
disk  was giving me problems when I tried to upgrade my I/O board
and terminal to 19,200 baud.

    The Mult/IO board has no baud rate switches at all, and will
initialize at 9600 baud.  On a cold boot, the Morrow Designs CP/M
bots from the floppy, loads the monitor (the FFFF: business), and
then  expects some sort of monitor command.   ("B" is all  that's
necessary  to tell it to boot off the PROM.)   Unfortunately,  if
the  Mult/IO board is running at a default 9600  baud,  and  your
terminal  is set to 19200,  the doggoned monitor can't read  that
"B",  and you never WILL get booted!  Real hassle, that -- and if
you  cold boot with everything set at 9600,  then you have to use
Morrow Design's BAUD.COM to kick up the CPU board and Mult/IO  to
19200,  physically  kick  up the terminal to 19200 (can't send  a
command to it,  you know -- not if the serial port's putting  out
twice as fast as the terminal can read!) ... a real pain!

    Finally  got it working by setting the console default  baud
rate  to  19200,  setting  the terminal switches  to  19200,  and
setting  Switch 6 on the Morrow CPU board to ON (engages  a  cold
boot from the floppy,  skips the monitor, and boots right up with
no  terminal  input required.   The CBIOS initializes the  serial
port to 19200,  using that default baud rate, before the terminal
ever comes into play.

    One little side effect I STILL haven't figured out:   every-
thing  boots  up  fine (provided you gave the  hard  disk  a  few
seconds  to  come up to speed before hitting that reset  button),
but  after  the cold boot message and A0> prompt,  I  get  a  ^Q!
Donno  why  - think I'm overflowing the buffer with my cold  boot
message.  No big thing; hope to fix it soon.

    I  have  not yet tried to cold boot from the hard  disk  (by
setting switches 1 through 5 to ON ON ON ON ON.   I don't  really
like  the  idea since it demands a lot of a barely  running  hard
disk that MIGHT not be up to speed yet!

[Note:   I've now added modem port (serial port 3) initialization
to 1200 baud on cold boot and port  initializations.   Sorry,  no
code  here  since it's quite Morrow-specific;  will add  to  this
document later.]

COMPANY  CREDIT LINE ON COLD BOOT:   You can see the little "Toad
Hall" logo come on,  plus some patch comments,  on the cold  boot
message.   Easy  - just added it into the CBIOS when editing  it.
That's on page 76 of Morrow's CBIOS& listing, way toward the end.
Just add in whatever you want (well,  keep it reasonable -- don't
want  to make this CBIOS TOO big,  you know!)  Don't forget  ACRs
and ALFs (carriage returns and line feeds) where appropriate.   I
mentioned above that ^Q problem after a cold boot.   I suspect it
comes  from an excessive cold boot message,  so be  warned!   [It
didn't!   Still don't know the answer.  Suspect just some garbage
left  around  the  Multi I/O board that wasn't  purged  correctly
after  initialization  that shows when running  the  terminal  at
19200 baud!]


MISCELLANEOUS LOCATIONS:  If you MAC TOADBIOS.ASM, you'll get most
of these as a DEBUG message.  However, just for your information:

    OFFSETC        3700           Offset in CP/M when R'ing
                                  TOADBIOS.HEX on top of your
                                  CPM64.COM in DDT.
    CCP            D400           Start of CCP in real memory
    CCP            0B00           Start of CCP in DDT image
    BDOS           DC00           Start of BDOS in real memory
    BIOS           EA00           Start of TOADBIOS in real memory
    BIOSLN         16             Length of TOADBIOS in pages.
    BIOSHEXLN      0F00           Length of TOADBIOS in hex.
    CCPLEN         800            Length of CCP in hex.

    USRPTCH1       0E8D           Actual location in DDT image
                                  of first User Area Patch.
    USRPTCH2       20F0           Beginning of second User Area
                                  patch in NOP area of DDT image
                                  of CCP.
                   CAD3           First patch in CCP to
                                  jump to second patch in CCP

        for A: User Area 0 default.
                   1DB3           Location in DDT image of
                                  first patch.
    PATCH          12F2           DDT image location of larger
                                  patch in CCP for default A:.
    PATCH1         EC50           Real memory location in
                                  TOADBIOS of default code.

                   - - - - - - - -

USER AREA DISPLAY CODE:

DDT IMAGE      INSTRS & REAL MEMORY LOCATIONS

0E82      LXI  SP,DBAB        ;original code
0E85      CALL D498           ;    "    ", flush
0E88      CALL D5D0           ;    "    ", get drive
0E8B      ADI  41             ;    "    ", 'A'
- - - - - and here's the patch - - - - -
0E8D      CALL E9F0           ;patch - was CALL D48C, console out
- - - - - end of patch - - - - -
         MVI  A,3E           ;original code - '>'
         CALL D48C           ;    "    ", console out
         CALL D539           ;    "    ", get cmd


ext patch is in an area of NOPs in the CCP - check to be sure!
(And  don't  get  too  low in  that  area:   I  think  it's  disk
parameters  or something!   Go too low with your patch and  it'll
get  overlaid  and eaten up!)  If something's  there,  just  find
about  1 1/2 lines of NOPs somewhere in your CCP where this  will
fit  (maybe  just  before the BDOS where there's  sometimes  some
room).   Use DDT's A (for Assembly) instruction to stick in  this
stuff just like you see it.   If your CCP does NOT start at D400,
then you'll have to figure out an offset.  Best place to do this,
of  course,  is  in your CBIOS in assembly -- makes it  all  much
easier to squeeze.

DDT LOC   REAL MEMORY LOCATIONS

20F0      CALL D48C           ;console out routine
         CALL D513           ;get user routine
         ADI  90H            ;routine to convert to number
         DAA
         ACI  40H
         DAA
         JMP  D48C           ;console out again, which returns
                             ;us automatically to right after
                             ;the first patch at 0E8D where
                             ;things continue like normal.
[Note:   above  was per the original patch.   My patch NOW  reads
like this to produce the decimal user area:

USRPTCH:
         CALL 0D48CH         ; Console Out routine.
         CALL 0D513H         ; Get User routine.
         CPI  10             ; If User # >9, print leading 1.
         JC   DUX
         PUSH PSW            ; Save A w/User #.
         MVI  A,'1'          ; Load the 10 digit for Conout
         CALL 0D48CH         ; Conout.
         POP  PSW            ; Get A w/User # back.
         SUI  10
DUX:      ADI  '0'
         ORA  A              ; Clear flags.
         JMP  0D48CH         ; Print second digit.
; End of patch

I include the original code below,  just for reference.   It has
the original locations, plus my patched Morrow locations.

;  --- PATCH TO CP/M 2.X TO LIST USER # IN DRIVE PROMPT ---
;           ( VALID FOR CP/M 2.0, 2.1, AND 2.2)
;               BY BRUCE KENDALL (TKI)
;                     7/12/80
;               TIGHTENED UP BY BRUCE RATOFF
;                    11/17/80
;
;       IF YOU HAVE TRIED PLAYING WITH THE  'USER' COMMAND
;       IN CP/M 2.X, YOU MAY HAVE BECOME ANNOYED THAT THERE
;       WAS NO WAY OF TELLING WHAT USER AREA YOU WERE IN.  THIS
;       PATCH SOLVES THIS PROBLEM BY DISPLAYING THE USER NUMBER
;       IN HEX ( A SINGLE CHARACTER SINCE USER # : 0-15 ARE VALID)
;       BETWEEN THE DRIVE NAME LETTER AND THE '>'. THAT IS, A USER
;       LOGGED INTO USER AREA #4 WOULD SEE THE STANDARD CP/M
;       PROMPT (MODIFIED BY THIS PATCH) AS:
;               A4>       ( INSTEAD OF JUST A>)
;
MSIZE   EQU     64      ; CP/M SYSTEM SIZE IN KB
;
DELTA   EQU     1000H   ; OFFSET FROM STD CP/M SIZE
                       ; THIS WOULD BE SET TO 400H IF
                       ; THE 20K CP/M WAS ACTUALLY A 19K
                       ; CP/M (WHEN COMPARED TO THE STD
                       ; 20K CP/M DESCRIBED IN THE CP/M
                       ; MANUALS FROM DIGITAL RESEARCH).
;
BIAS    EQU     (MSIZE-20)*1024-DELTA ; OFFSET FROM 20K CP/M
CCP     EQU     3400H+BIAS
;
OFFSET  EQU     980H-CCP ; OFFSET USED WITH  DDT IN
                       ; SYSTEM CONFIGURATION (ASSUMES
                       ; THAT 'CCP' OCCURES AT 980H IN THE
                       ; SYSGEN MEMORY IMAGE).
;
COUT    EQU     CCP+8CH ; CCP CONSOLE OUTPUT ROUTINE
GTUSR   EQU     CCP+113H ; CCP GET USER # ROUTINE
;
       ORG     CCP+38DH
;
       CALL    PATCH   ; THIS WAS A   CALL  COUT
;
; -----------------------------------------------
; NOTE THE CODE IN THE NEIGHBORHOOD OF THIS PATCH WAS
; USED TO PRINT OUT THE 'A>' PROMPT:
;
; CCP+382H:
;       LXI SP,----
;       CALL    FLUSH   ; RESET BUFFERS
;       CALL    GTDRV   ; GET DRIVE #
;       ADI     'A'     ; ADD IN ASCII BIAS
;       CALL    COUT    ; <--- MAKE PATCH HERE
;       MVI     A,'>'   ; GET '>'
;       CALL    COUT    ; PRINT IT OUT
;       CALL    GTCOMD  ; GET CONSOLE COMMAND
;         .
;         .
; -------------------------------------------------
;
       ORG     CCP+15F0H       ; PATCH AREA AT END OF BDOS
;
PATCH:  CALL    COUT    ; OUTPUT CHAR. IN ACC TO CONSOLE
       CALL    GTUSR   ; GET USER #
       ADI     90H     ; USE INTEL HEX/ASCII TRICK
       DAA
       ACI     40H
       DAA
       JMP     COUT    ; PRINT OUT AND RETURN
;
; ------------------------------------------------------
; NOTE: THE 'GTUSR' COMMAND IS JUST A SHORT ROUTINE:
;
;GTUSR: MVI     E,0FFH
;       MVI     C,32
;       JMP     05
; ------------------------------------------------------
;
       END
                        - - - - - -


DEFAULT TO A: 0 CODE

I  gave you CCP+n locations this time so you can offset from  your
DDT  image  of  the start of your CCP.   You still  have  my  own
values, given my real memory CCP at D400 and BIOS at EA00.

                             REAL MEMORY LOCATIONS
                             IN MY SYSTEM

CCP       EQU  0D400          D400      ;start of CCP
GTUSR     EQU  CCP+113H       D513      ;Get user number routine
STUSR     EQU  CCP+115H       D515      ;Set user number
CCPMFCB   EQU  CCP+0D0H       D4D0      ;Open file at CPMFCB$
CPMTYPE$  EQU  CCP+7D6H       DBD6      ;type field in CPMFCB$
CMDSK$    EQU  CCP+7F0H       DBF0      ;loc of disk given in cmd
CMDERR    EQU  CCP+76BH       DB6B      ;loc to type error in cmd
WIN       EQU  CCP+6DEH       DADE      ;go here if we get file open

DDT IMAGE      INSTRS & REAL MEMORY LOCATIONS

11DB      JZ   CCP+6DBH       DADB      ;replaces JZ DB6B in my
                                       ;system.  Loc of cmd err
12F2      PATCH:              DDF2      ;replaces an unused area
                                       ;of NOPs - check!!
         LXI  H,CMDSK$       DBF0      ;get drive from curr cmd
         ORA  M                        ;A=0 on entry, so fetches
                                       ;drive
;in next line, if explicit drive given go try User 0
;(this will be escape even if we force A: in our cmd line
         JNZ  PATCH1         EC50      ;Wherever you put that
                                       ;new code in your CBIOS.
                                       ;I put it here -- you can
                                       ;find it by looking up
                                       ;PATCH1 in the SYM table
                                       ;generated by MAC
         INR  M                        ;force explicit reference
                                       ;to drive A
         LXI  D,CPMTYPE$     DBD6      ;need DE set up to this
                                       ;on entry to CCP
         JMP  CCP+6CDH       DACD      ;Now to reenter CCP

The  following  code must be patched into a blank  area  of  your
CBIOS  or entered into CBIOS&.ASM prior to assembly.   Be sure to
call it PATCH1 or something distinctive (and NOT like anything in
CBIOS&  or you'll have problems!) so you can find it in  the  SYM
table.

Arrive here because explicit drive set or can't find file on A:

    PATCH1:                  EC50      ;in my TOADBIOS version
         CALL GTUSR          D513      ;get user code
         ORA  A                        ;set flags
         JZ   CMDERR         DB6B      ;already user 0 so we
                                       ;fail - .COM file isn't
                                       ;anywhere!
         MOV  E,A                      ;get old value into E
                                       ;for later
         PUSH D                        ;save it
         MVI  E,0                      ;set USER=0
         CALL STUSR          D515
         CALL OCPMFCB        D4D0      ;try Open again
         POP  D                        ;get old user code back
                                       ;before we save flags
         PUSH PSW                      ;now save flags from call
         CALL STUSR          D515      ;now go set back to old
                                       ;user number
         POP  PSW                      ;get flags back from
                                       ;OPEN call
         JNZ  WIN            DADE      ;we found it!
         JMP  CMDERR         DB6B      ;nope, nowhere!
                        - - - - - - - -

That's  the code.   Hopefully you can make it work.   I'm only  a
novice Assembler programmer, and managed just fine!  Kind of fun,
too!  (Kind of nice at parties -- "What, you don't read hex?  And
don't work in Assembler either?")

                      David P Kirschbaum
                         SGM, US Army
                           Toad Hall
                      7573 Jennings Lane
                    Fayetteville NC  28303