Annotation of qemu/roms/SLOF/slof/fs/fcode/locals.fs, revision 1.1.1.1

1.1       root        1: \ *****************************************************************************
                      2: \ * Copyright (c) 2011 IBM Corporation
                      3: \ * All rights reserved.
                      4: \ * This program and the accompanying materials
                      5: \ * are made available under the terms of the BSD License
                      6: \ * which accompanies this distribution, and is available at
                      7: \ * http://www.opensource.org/licenses/bsd-license.php
                      8: \ *
                      9: \ * Contributors:
                     10: \ *     IBM Corporation - initial implementation
                     11: \ ****************************************************************************/
                     12: \ *
                     13: \ * Support for old-fashioned local values in FCODE.
                     14: \ *
                     15: \ * There is one old FCODE tokenizer that uses the FCODE opcodes in the range
                     16: \ * of 0x407 to 0x41f for supporting Forth local values. Each locals stack
                     17: \ * frame contains 8 variables. The opcodes from 0x407 to 0x40f are used to
                     18: \ * push 0 up to 8 values from the normal data stack into the current locals
                     19: \ * stack frame. All other variables in the current stack frame are not
                     20: \ * pre-initialized.
                     21: \ * The opcodes from 0x410 to 0x417 can be used for reading the first, second,
                     22: \ * ... eighth value out of the locals stack frame, and the opcode from 0x418
                     23: \ * to 0x41f can be used to set the first, second, ... eighth value in the
                     24: \ * stack frame respectively.
                     25: \ *
                     26: 
                     27: 80 cells CONSTANT LOCALS-STACK-SIZE
                     28: 
                     29: LOCALS-STACK-SIZE BUFFER: localsstackbuf
                     30: 
                     31: localsstackbuf VALUE localsstack
                     32: 
                     33: 
                     34: : fc-local@  ( n -- val )
                     35:    cells localsstack swap - @
                     36: ;
                     37: 
                     38: : fc-local-1-@  1 fc-local@ ;
                     39: : fc-local-2-@  2 fc-local@ ;
                     40: : fc-local-3-@  3 fc-local@ ;
                     41: : fc-local-4-@  4 fc-local@ ;
                     42: : fc-local-5-@  5 fc-local@ ;
                     43: : fc-local-6-@  6 fc-local@ ;
                     44: : fc-local-7-@  7 fc-local@ ;
                     45: : fc-local-8-@  8 fc-local@ ;
                     46: 
                     47: 
                     48: : fc-local!  ( val n -- )
                     49:    cells localsstack swap - !
                     50: ;
                     51: 
                     52: : fc-local-1-!  1 fc-local! ;
                     53: : fc-local-2-!  2 fc-local! ;
                     54: : fc-local-3-!  3 fc-local! ;
                     55: : fc-local-4-!  4 fc-local! ;
                     56: : fc-local-5-!  5 fc-local! ;
                     57: : fc-local-6-!  6 fc-local! ;
                     58: : fc-local-7-!  7 fc-local! ;
                     59: : fc-local-8-!  8 fc-local! ;
                     60: 
                     61: 
                     62: 0 VALUE uses-locals?
                     63: 
                     64: \ Create space for the current function on the locals stack.
                     65: \ Pre-initialized the n first locals with the n top-most data stack items.
                     66: \ Note: Each function can use up to 8 (initialized or uninitialized) locals.
                     67: : (fc-push-locals)  ( ... n -- )
                     68:    \ cr ." pushing " dup . ." locals" cr
                     69:    8 cells localsstack + TO localsstack
                     70:    localsstack localsstackbuf -
                     71:    LOCALS-STACK-SIZE > ABORT" Locals stack exceeded!"
                     72:    ?dup IF
                     73:       ( ... n ) 1 swap DO
                     74:          i fc-local!              \ Store pre-initialized locals
                     75:       -1 +LOOP
                     76:    THEN
                     77: ;
                     78: 
                     79: : fc-push-locals  ( n -- )
                     80:    \ cr ." compiling push for " dup . ." locals" cr
                     81:    uses-locals? ABORT" Definition pushes locals multiple times!"
                     82:    true TO uses-locals?
                     83:    ( n ) ['] literal execute
                     84:    ['] (fc-push-locals) compile,
                     85: ;
                     86: 
                     87: : fc-push-0-locals  0 fc-push-locals ;
                     88: : fc-push-1-locals  1 fc-push-locals ;
                     89: : fc-push-2-locals  2 fc-push-locals ;
                     90: : fc-push-3-locals  3 fc-push-locals ;
                     91: : fc-push-4-locals  4 fc-push-locals ;
                     92: : fc-push-5-locals  5 fc-push-locals ;
                     93: : fc-push-6-locals  6 fc-push-locals ;
                     94: : fc-push-7-locals  7 fc-push-locals ;
                     95: : fc-push-8-locals  8 fc-push-locals ;
                     96: 
                     97: 
                     98: : fc-pop-locals  ( -- )
                     99:    \ ." popping locals" cr
                    100:    localsstack 8 cells - TO localsstack
                    101:    localsstack localsstackbuf - 0 < ABORT" Locals stack undeflow!"
                    102: ;
                    103: 
                    104: 
                    105: : fc-locals-exit
                    106:    uses-locals? IF
                    107:       \ ." compiling pop-locals for exit" cr
                    108:       ['] fc-pop-locals compile,
                    109:    THEN
                    110:    ['] exit compile,
                    111: ;
                    112: 
                    113: : fc-locals-b(;)
                    114:    uses-locals? IF
                    115:       \ ." compiling pop-locals for b(;)" cr
                    116:       ['] fc-pop-locals compile,
                    117:    THEN
                    118:    false TO uses-locals?
                    119:    ['] b(;) execute
                    120: ;
                    121: 
                    122: 
                    123: : fc-set-locals-tokens  ( -- )
                    124:    ['] fc-push-0-locals 1 407 set-token
                    125:    ['] fc-push-1-locals 1 408 set-token
                    126:    ['] fc-push-2-locals 1 409 set-token
                    127:    ['] fc-push-3-locals 1 40a set-token
                    128:    ['] fc-push-4-locals 1 40b set-token
                    129:    ['] fc-push-5-locals 1 40c set-token
                    130:    ['] fc-push-6-locals 1 40d set-token
                    131:    ['] fc-push-7-locals 1 40e set-token
                    132:    ['] fc-push-8-locals 1 40f set-token
                    133: 
                    134:    ['] fc-local-1-@ 0 410 set-token
                    135:    ['] fc-local-2-@ 0 411 set-token
                    136:    ['] fc-local-3-@ 0 412 set-token
                    137:    ['] fc-local-4-@ 0 413 set-token
                    138:    ['] fc-local-5-@ 0 414 set-token
                    139:    ['] fc-local-6-@ 0 415 set-token
                    140:    ['] fc-local-7-@ 0 416 set-token
                    141:    ['] fc-local-8-@ 0 417 set-token
                    142: 
                    143:    ['] fc-local-1-! 0 418 set-token
                    144:    ['] fc-local-2-! 0 419 set-token
                    145:    ['] fc-local-3-! 0 41a set-token
                    146:    ['] fc-local-4-! 0 41b set-token
                    147:    ['] fc-local-5-! 0 41c set-token
                    148:    ['] fc-local-6-! 0 41d set-token
                    149:    ['] fc-local-7-! 0 41e set-token
                    150:    ['] fc-local-8-! 0 41f set-token
                    151: 
                    152:    ['] fc-locals-exit 1 33 set-token
                    153:    ['] fc-locals-b(;) 1 c2 set-token
                    154: ;
                    155: fc-set-locals-tokens

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.