home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / prog1 / 4th_86.lzh / ARRAY.4TH < prev    next >
Text File  |  1989-02-28  |  3KB  |  95 lines

  1. ( forget new
  2. : new ;
  3. off printload )
  4. ( FILE: ARRAY)
  5.  
  6. ( this file conatins an example of a defining word)
  7.  
  8. ( ARRAY is a compiler word to define a two dim. array.
  9.   The defined word, when executed, returns the address
  10.   of specified cell (tos is row, nos is column)
  11.   Each cell is 16 bits.  For example,
  12.         8 3 ARRAY XYZ   ( 3 rows (0 to 2), 8 columns (0 to 7))
  13.         0 4 0 XYZ !     ( store 0 in 0th row, 4th column)
  14.         7 2 XYZ @       ( fetch last cell in array)
  15.  
  16.   No error checking at compile time or run time, add it if
  17.   needed.
  18.   More comments below
  19. )
  20.  
  21. CROSS @ 0= IFTRUE ( see notes below)
  22.  
  23. : ARRAY ( col row -- word)
  24.   0 DEFINE  ( put name in dictionary)
  25.   e8H HEADB! ' XARRAY 
  26.  
  27.   head @ 2+ - cross @ if base @ + then
  28.  
  29.   HEAD! ( put a call to run time code)
  30.   OVER OVER * 2 * LUM @ SWAP - DUP LUM ! ( alloc memory)
  31.   HEAD! ( store base address after call)
  32.   HEAD! ( store number rows) ( for later error checking)
  33.   2 * HEAD! ( store # bytes/row )
  34. ; IMMEDIATE
  35.  
  36. ENDIF
  37.  
  38. ( ARRAY builds the following code:
  39.         CALL xarray   ;call runtime, tos will have adr of dw's
  40.         DW   base     ;base of data space allocated
  41.         DW   #rows-1
  42.         DW   #cols-1
  43.  
  44.   REMEMBER, in high mode, tick (') does not try to look up
  45.   the address of following word.  Instead, it stores string
  46.   in-line so word can be looked up when ARRAY (or other
  47.   defining word) executes (because you may want to look in
  48.   the "cross" dictionary).
  49. )
  50. ( ---------------------------------------------------- )
  51. ( ** IF you want to make a COM (or ROM) file of a program
  52.   that uses ARRAY, then everything above the dotted line
  53.   loads before you enter CROSS-COMPILE mode, and
  54.   everything after the line loads after cross mode.
  55.   Because of the IFTRUE...ENDIF above, you can load this
  56.   same file twice.  For example, during development,
  57.                " ARRAY.4TH" LOAD
  58.                " USERPROG" LOAD
  59.   When ready to make a COM file:
  60.                " ARRAY.4TH" LOAD
  61.                " MAKECOM.4TH" LOAD
  62.   MAKECOM would prompt you for a filename and you there are
  63.   two (out of hundreds) approaches you could take:
  64.        1. Answer MAKECOM with filename PROGX, where PROGX
  65.           contains:
  66.                " ARRAY.4TH" LOAD
  67.                " USERPROG" LOAD
  68.        2. Answer MAKECOM with USERPROG, and have the following
  69.           line in USERPROG:
  70.                CROSS @ IFTRUE " ARRAY.4TH" LOAD ENDIF
  71.  
  72.    In either case, what you are doing is: (1) defining
  73.    the compile time activity of ARRAY before entering
  74.    cross mode, and (2) defining the run time activity
  75.    of ARRAY while in cross mode.
  76.  
  77.    Hint: when you create new defining words that you use
  78.    all the time, put a "load" in MAKECOM to pick up the run
  79.    time part, and use ATTACH to make both parts (compile and
  80.    run) a permanent part of your system.
  81. )
  82.  
  83. ( run time for ARRAY)
  84. ( the call at the definition put the adr of the parameters
  85.   for the def. on the stack. We could do the work in asm
  86.   lang code for speed, but hi-level is pretty quick for
  87.   most applications.
  88. )
  89. : XARRAY ( col row -- adr)
  90.   SWAP OVER 4 + @ ( get 'column*2' dimension)
  91.   * ( offset to correct row)
  92.   SWAP @ ( get array base adr) + ( baseadr + rowofset)
  93.   SWAP DUP + ( column offset) + ( got adr of cell)
  94. ;
  95.