home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / source / longlabl.seq < prev    next >
Text File  |  1990-12-17  |  4KB  |  120 lines

  1. \\ LONGLABL.SEQ         Modified local labels for long branches
  2.  
  3. {
  4.  
  5. : %"ERRMSG3     ( cfa A1 N1 -- )        \ a dummy filler till real one
  6.                 cr type drop ;
  7.  
  8. DEFER "ERRMSG3  ' %"errmsg3 is "errmsg3
  9.  
  10. ASSEMBLER DEFINITIONS ALSO
  11.  
  12. \ following defined in DIS05:
  13. \ DEFER T@        FORTH ' @       ASSEMBLER IS T@
  14.  
  15. ' HERE ALIAS ASMHERE
  16.  
  17. }
  18.  =========================================================
  19.                BEGIN LOCAL LABELS SECTION:
  20.  =========================================================
  21.  
  22. {
  23.  
  24. FORTH DEFINITIONS
  25.  
  26.   0 value ?long
  27.   0 value ?long_lib
  28.  
  29. : long_branch   ( -- )
  30.                 on> ?long ;
  31.  
  32. : short_branch  ( -- )
  33.                 off> ?long ;
  34.  
  35. : long_library  ( -- )
  36.                 on> ?long_lib ;
  37.  
  38. : short_library ( -- )
  39.                 off> ?long_lib ;
  40.  
  41. short_branch            \ default to short branches
  42. short_library           \ also use short branches in library
  43.  
  44. ASSEMBLER DEFINITIONS
  45.  
  46. }
  47.  Translates a label reference to the appropriate dictionary
  48.  location and sets the "ever referenced?" flag.
  49.  
  50.  If the reference is a forward reference, then a linked list
  51.  of the forward references themselves is built using the
  52.  dictionary byte locations where the jump offsets are
  53.  "compiled".  The reason for using this technique at all is
  54.  that it allows an arbitrary number of forward references per
  55.  label to be made (within the jump offset limitations of
  56.  course) and that it requires table space only for the linked
  57.  list head pointer.  The technique is eloquent if convoluted
  58.  and, as a minimum, needs explanation.
  59. {
  60.  
  61. ' $ ALIAS $|    ( n1 -- n2 )
  62.  
  63. }
  64.  Resolves all local label forward references for a given
  65.  label.
  66. {
  67.  
  68. : >resL ( ^line -- )
  69.         [ FORTH ]
  70.         2+ @ dup 0=     \ if nothing to resolve
  71.         IF      drop exit           \   then exit
  72.         THEN    DUP>R
  73.      1+ BEGIN                       \ stack contains directory address of
  74.                                     \   displacement to be resolved
  75.                 DUP 1- TC@ $E9 =        \ if we have a JMP WORD instruction
  76.                 IF      DUP T@ >R               \ save link for now
  77.                         ASMHERE OVER - 2-       \ calculate displacement
  78.                         OVER T!                 \ and put in jump instruction
  79.                         R> $FFFD OVER <>        \ $FFFD signifies end of list
  80.                 ELSE    DUP TC@ >R
  81.                         ASMHERE OVER - 1-
  82.                         DUP $7F U>
  83.                         if      0 " Branch out of range, use LONG_BRANCH"
  84.                                 "errmsg3 abort
  85.                         then
  86.                         OVER TC! R> $FE OVER <> \ $FE signifies end of list
  87.                 THEN
  88.         WHILE
  89.                 R@ TC@ $E9 <>
  90.                 IF      $ff00 or    \ sign extend since link is backward
  91.                 THEN
  92.                 + 2+                \ now move to next item on list
  93.         REPEAT
  94.         R>DROP  2DROP ;
  95.  
  96. : $$:f  ( n -- )                \ defines a local label
  97.         [ FORTH ]
  98.         true !> ll-used?        \ set "labels used?" flag
  99.         llab>line
  100.         dup @ 0<>
  101.         if      0 " Label can't be multiply defined" "errmsg3 abort
  102.         then
  103.         dup >resL               \ resolve forward references if needed
  104.         ASMHERE swap ! ;        \ and set label for subsequent refs
  105.  
  106. : $:|   ( n -- )        \ allow use as prefix/postfix
  107.         [ FORTH ]
  108.         ?LONG 0=
  109.         IF      ['] $:f
  110.         ELSE    ['] $$:f
  111.         THEN    a;! a; ;
  112.  
  113. ONLY FORTH ALSO DEFINITIONS
  114.  
  115. }
  116.  =========================================================
  117.                 END LOCAL LABELS SECTION:
  118.  =========================================================
  119.  
  120.