home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-12-02 | 2.3 KB | 95 lines | [04] ASCII Text (0x0000) |
- \ OBJECTS - ASSEMBLER WORDS TO CREATE FORTH OBJECTS
-
- \ WORDS ARE USED AS FOLLOWS:
- \
- \ <# BYTES IN PARM AREA>
- \ OBJECT <NAME OF OBJECT>
- \ <CODE TO FETCH PARAMETERS WHEN INVOKED FROM FORTH>
- \ <ADJUST STACK BY MANIPULATING X REGISTER>
- \ <DON'T NEED RTS, - WILL BE COMPILED BY OBJ-CODE WORD>
- \
- \ OBJ-CODE
- \ <SAVES X REGISTER, UPDATES CODE ADRS IN HEADER>
- \ <YOUR FUNCTION CODE GOES HERE>
- \
- \ OBJ-CALL <NAME OF OBJECT TO CALL>
- \ <TO JSR TO THE OBJ-CODE OF ANOTHER OBJECT>
- \
- \ OBJ-EXIT
- \ <USED IF FUNCTION EXITS IN MIDDLE OF CODE>
- \ < COMPILES CODE TO RESTORE X REGISTER & RTS >
- \
- \ OBJ-ENDCODE
- \ <RESTORES X REGISTER, RTS, AND END-CODE>
-
-
- ASSEMBLER DEFINITIONS
-
- VARIABLE CODEADRS
- VARIABLE PARMLEN
-
- : OBJ-HEADER
- 255 MIN 0 MAX \ MAKE SURE PARM IS IN RANGE
- PARMLEN ! \ SAVE THE PARM - & CLEANS UP STACK
- [COMPILE] CODE \ GETS NAME OF OBJECT & CREATES HEADER
- PARMLEN @
- DUP HERE 13 + + JSR, \ CALC ADRS OF PARM MANIPULATION CODE
- HERE 6 + JSR, \ JSR TO CODEJUMP
- NEXT JMP, \ RETURNS TO FORTH
- HERE 1+ CODEADRS ! \ SAVE CODE ADDRESS FOR LATER
- HERE JMP, \ COMPILE DUMMY CODE ADDRESS FOR NOW
- DUP C, ALLOT \ PUT IN PARM LENGTH AND ALLOCATE
- ; IMMEDIATE \ PARM AREA
-
- : OBJ-CODE
- RTS, \ END THE PREVIOUS SECTION
- HERE CODEADRS @ ! \ UPDATE THE CODEJUMP IN HEADER
- XSAVE STX, \ SAVE FORTH PARM STACK POINTER
- ;
-
- : OBJ-EXIT
- XSAVE LDX, \ RESTORE PARM STACK POINTER
- RTS, \ EXIT THE SUBROUTINE
- ;
-
- : OBJ-END
- OBJ-EXIT
- [COMPILE] END-CODE
- ; IMMEDIATE
-
- : OBJ-CALL \ FOLLOWED BY WORD OF OBJECT TO CALL
- [COMPILE] ' ?DUP IF \ GET PFA OF WORD & CHECK FOR ZERO
- 9 + \ GET ADRS OF CODEJUMP
- XSAVE LDX, \ LOAD X REGISTER - SUB WILL SAVE IT
- JSR, \ JSR TO THE CODEJUMP ADDRESS
- ELSE
- 3 ERROR
- THEN
- ;
-
- : PARM ( N --- ADRS )
- \ GET ADRS OF N'TH PARM OF CURRENT WORD BEING ASSEMBLED
- \ OR LAST WORD THAT WAS JUST ASSEMBLED
- CODEADRS @ 2 + +
- ;
-
- FORTH DEFINITIONS
-
- : 'PARM ( N --- ADRS ) ( WORD )
- \ GET ADRS OF NTH PARM OF AN EXISTING WORD
- [COMPILE] ' ?DUP IF
- 12 + +
- ELSE
- 3 ERROR
- THEN
- ;
-
- : OBJECT
- DEPTH 0= IF 3 ERROR THEN \ CHECK IF PARM IS ON STACK
- ASSEMBLER
- [COMPILE] ASSEMBLER
- [COMPILE] OBJ-HEADER
- ; IMMEDIATE
-
- FORTH
-