|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 21566 (0x543e)
Types: TextFile
Names: »prims.h«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/microcode/prims.h«
/* Hey EMACS, this is -*- C -*- code! */
/****************************************************************
* *
* Copyright (c) 1984 *
* Massachusetts Institute of Technology *
* *
* This material was developed by the Scheme project at the *
* Massachusetts Institute of Technology, Department of *
* Electrical Engineering and Computer Science. Permission to *
* copy this software, to redistribute it, and to use it for any *
* purpose is granted, subject to the following restrictions and *
* understandings. *
* *
* 1. Any copy made of this software must include this copyright *
* notice in full. *
* *
* 2. Users of this software agree to make their best efforts (a)*
* to return to the MIT Scheme project any improvements or *
* extensions that they make, so that these may be included in *
* future releases; and (b) to inform MIT of noteworthy uses of *
* this software. *
* *
* 3. All materials developed as a consequence of the use of *
* this software shall duly acknowledge such use, in accordance *
* with the usual standards of acknowledging credit in academic *
* research. *
* *
* 4. MIT has made no warrantee or representation that the *
* operation of this software will be error-free, and MIT is *
* under no obligation to provide any services, by way of *
* maintenance, update, or otherwise. *
* *
* 5. In conjunction with products arising from the use of this *
* material, there shall be no use of the name of the *
* Massachusetts Institute of Technology nor of any adaptation *
* thereof in any advertising, promotional, or sales literature *
* without prior written consent from MIT in each case. *
* *
****************************************************************/
/* File: PRIMS.H
* This file contains the information needed for the basic primitives.
*/
\f
/* Information on primitives:
*
* Primitives are routines written in the interpreter implementation
* language (C in this case) which accept Scheme objects as arguments
* and return a Scheme object as their value. Some of them (APPLY,
* SCODE-EVAL, CATCH) are really entry points into the interpreter,
* and in other languages or implementations would be special forms.
* These depend on the way the interpreter works and should not be
* modified. Most (all?) of these "interpreter hooks" live in the
* file HOOKS.C
*
* Most primitives are basic in some sense. Their functionality
* cannot easily be achieved with a Scheme procedure unless they are
* defined (eg, CAR, PRIMITIVE-TYPE, GET-CHARACTER, etc). Some exist
* only for efficiency, they are very common and easily written in
* the interpreter implementation language, and this extra work is
* worth the speed that they provide (eg LENGTH, MEMQ, etc).
*
* The runtime system depends on many primitives (the others are
* fossils or used by specialized subsystems only). Users may,
* however, add new primitives to suit their applications (graphics,
* matrix multiplication, etc.), and are encouraged to do so.
*
* The system provides some facilities for declaring new primitives,
* which can then be accessed from Scheme. The linking of the C code
* which implements these user-supplied (we call them "external")
* primitives is done at system (microcode) generation time (e.g.
* when you use "make" to link a new version of scheme under Unix).
* These externals are handled in such a way that Scheme programs
* which use them can be loaded on any system, including
* systems that do not have those primitives. If you run a program
* which tries to apply one of these undefined externals to arguments,
* you will, of course, get an error.
\f
* The original primitives (provided with Cscheme) are not linked in
* the same way for historical reasons, and must always exist. They
* will eventually be linked in the same or similar way that user
* defined primitives are linked, and then there will be no difference
* between both kinds. Currently, there are tables in STORAGE.C with
* information on these original, or "built in" primitives. These
* tables are needed for the old linking mechanism, but need not be
* extended when adding user defined primitives, since the equivalent
* tables are constructed at microcode generation time. If you are
* curious, look at the files USRDEF.C, created at microcode generation
* time, and FINDPRIM.C, the program which creates it.
*
* Primitives have 2 fixed names: The C name (the name of the C
* routine that implements them), and the Scheme linking name. The
* latter is the name which when given to MAKE-PRIMITIVE-PROCEDURE
* will return the appropriate procedure object. Note that this name
* is not usually initially bound in Scheme, and it may be bound to
* anything at all, though for some of the most common primitives it
* is bound to the primitive object. In other words, you must choose
* names for your primitives so that neither the C name nor the
* linking name have conflicts with other linked primitives, but you
* need not worry about name conflicts with the Scheme environment.
* Note also that this name is currently ignored for "built in",
* required primitives.
*
* Define_Primitive is a macro used to declare a primitive to the
* linking mechanism. It is both a C macro (defined in primitive.h)
* and a special name used by the program Findprim to generate a
* special file used when a new scheme microcode is linked together.
* Notice that you must be sure to run Findprim ONLY on the files
* containing user defined primitives, and NOT the system supplied
* primitives. For UNIX users, you should look at the top few lines
* of the Makefile and add the names of your files. In particular,
* this means that you cannot have both kinds of primitives in one
* file. Don't add primitives to "system" files, add your own files
* instead.
*
* Define_Primitive expects 3 arguments which are the C name, the
* number of arguments that the primitive expects (currently
* primitives cannot receive variable numbers of arguments), and the
* Scheme linking name. Original primitives make use of
* Built_In_Primitive and the primitive numbers defined below for
* linking purposes instead of using this symbolic linking mechanism.
*
* One last note: Unless very special care is taken (and we do not
* recommend it), primitives cannot call other primitives. If you
* want to share code between two primitives, write a third procedure
* which implements the common work, and have both primitives call it
* as appropriate. The reason for this is that the primitive calling
* convention may change without notice, and the way arguments
* are accessed may therefore change. As long as you only use
* Primitive_N_Args to access them, your code will continue to work.
* In particular, if you write primitives which do not expect any
* arguments, make sure to invoke Primitive_0_Args anyway since it will
* take care of any initialization needed. Define_Primitive,
* Built_In_Primitive, Primitive_N_Args, and other utilities for
* primitives are defined in the file PRIMITIVE.H.
*
* For examples of user defined primitives, look at the files SAMPLE.C
* and XDEBUG.C. For an example on how to access these primitives
* from scheme look at sample.scm and xdebug.scm.
*/
\f
/************************/
/* PRIMITIVE OPERATIONS */
/************************/
#define PC_LEXICAL_ASSIGNMENT 0x00
#define PC_LOCAL_REFERENCE 0x01
#define PC_LOCAL_ASSIGNMENT 0x02
#define PC_CATCH 0x03
#define PC_SCODE_EVAL 0x04
#define PC_APPLY 0x05
#define PC_SET_INTERRUPT_ENABLES 0x06
/* UNUSED (will be STRING->SYMBOL) 0x07 */
#define PC_GET_WORK 0x08 /* Futures only */
/* UNUSED 0x09 */
/* UNUSED 0x0A */
/* UNUSED 0x0B */
#define PC_NOT 0x0C
#define PC_EQ 0x0D
#define PC_STRING_EQUAL 0x0E
#define PC_PRIM_TYPE_QM 0x0F
#define PC_PRIM_TYPE 0x10
#define PC_PRIMITIVE_SET_TYPE 0x11
#define PC_LEXICAL_REFERENCE 0x12
#define PC_UNREFERENCEABLE_TEST 0x13
/* UNUSED 0x14 */
/* UNUSED 0x15 */
#define PC_NON_RESTARTABLE_EXIT 0x16
/* UNUSED 0x17 */
#define PC_UNASSIGNED_TEST 0x18
#define PC_INSERT_NON_MARKED_VECTOR 0x19
#define PC_RESTARTABLE_EXIT 0x1A
/* UNUSED 0x1B */
#define PC_MEMQ 0x1C
#define PC_INSERT_STRING 0x1D
#define PC_ENABLE_INTERRUPTS 0x1E
#define PC_MAKE_EMPTY_STRING 0x1F
#define PC_CONS 0x20
#define PC_CAR 0x21
#define PC_CDR 0x22
#define PC_SET_CAR 0x23
#define PC_SET_CDR 0x24
/* Primitive operations continue on the next page */
\f
/* Primitive operations, continued */
#define PC_PRINT_STRING 0x25
#define PC_GET_CURSOR 0x26
#define PC_GENERAL_CAR_CDR 0x27
#define PC_HUNK3_CONS 0x28
#define PC_HUNK3_CXR 0x29
#define PC_HUNK3_SET_CXR 0x2A
#define PC_OVERWRITE_STRING 0x2B
#define PC_VECTOR_CONS 0x2C
#define PC_VECTOR_SIZE 0x2D
#define PC_VECTOR_REF 0x2E
#define PC_SET_CURRENT_HISTORY 0x2F
#define PC_VECTOR_SET 0x30
#define PC_NON_MARKED_VECTOR_CONS 0x31
#define PC_GET_CHAR 0x32
#define PC_UNBOUND_TEST 0x33
/* UNUSED 0x34 */
/* UNUSED 0x35 */
/* UNUSED 0x36 */
/* UNUSED 0x37 */
/* UNUSED 0x38 */
/* UNUSED 0x39 */
#define PC_GARBAGE_COLLECT 0x3A
#define PC_PLUS_FIXNUM 0x3B
#define PC_MINUS_FIXNUM 0x3C
#define PC_MULTIPLY_FIXNUM 0x3D
#define PC_DIVIDE_FIXNUM 0x3E
#define PC_EQUAL_FIXNUM 0x3F
#define PC_LESS_FIXNUM 0x40
#define PC_POSITIVE_FIXNUM 0x41
#define PC_ONE_PLUS_FIXNUM 0x42
#define PC_M_ONE_PLUS_FIXNUM 0x43
#define PC_TRUNCATE_STRING 0x44
#define PC_SUBSTRING 0x45
#define PC_ZERO_FIXNUM 0x46
#define PC_UNDANGERIZE 0x47
#define PC_DANGERIZE 0x48
#define PC_DANGEROUS_QM 0x49
#define PC_SUBSTRING_TO_LIST 0x4A
#define PC_MAKE_FILLED_STRING 0x4B
#define PC_PLUS_BIGNUM 0x4C
#define PC_MINUS_BIGNUM 0x4D
#define PC_MULTIPLY_BIGNUM 0x4E
#define PC_DIVIDE_BIGNUM 0x4F
/* Primitive operations continue on the next page */
\f
/* Primitive operations, continued */
#define PC_LISTIFY_BIGNUM 0x50
#define PC_EQUAL_BIGNUM 0x51
#define PC_LESS_BIGNUM 0x52
#define PC_POSITIVE_BIGNUM 0x53
/* Unused 0x54 */
/* Unused 0x55 */
#define PC_PRIMITIVE_FASDUMP 0x56
#define PC_FASLOAD 0x57
#define PC_STRING_POSITION 0x58
#define PC_STRING_LESS 0x59
#define PC_OBJECT_HASH 0x5A
#define PC_OBJECT_UNHASH 0x5B
#define PC_REHASH_GC_DAEMON 0x5C
#define PC_LENGTH 0x5D
#define PC_ASSQ 0x5E
#define PC_BUILD_STRING_FROM_LIST 0x5F
#define PC_EQUAL_STRING_TO_LIST 0x60
#define PC_MAKE_CELL 0x61
#define PC_CELL_CONTENTS 0x62
#define PC_CELL 0x63
#define PC_RAISE_CHAR 0x64
#define PC_CHARACTER_LIST_HASH 0x65
#define PC_GCD_FIXNUM 0x66
#define PC_FIX_TO_BIG 0x67
#define PC_BIG_TO_FIX 0x68
#define PC_PLUS_FLONUM 0x69
#define PC_MINUS_FLONUM 0x6A
#define PC_MULTIPLY_FLONUM 0x6B
#define PC_DIVIDE_FLONUM 0x6C
#define PC_EQUAL_FLONUM 0x6D
#define PC_LESS_FLONUM 0x6E
#define PC_ZERO_BIGNUM 0x6F
#define PC_TRUNCATE_FLONUM 0x70
#define PC_ROUND_FLONUM 0x71
#define PC_INT_TO_FLOAT 0x72
#define PC_SINE_FLONUM 0x73
#define PC_COSINE_FLONUM 0x74
#define PC_ARCTAN_FLONUM 0x75
#define PC_EXP_FLONUM 0x76
#define PC_LN_FLONUM 0x77
/* Primitive operations continue on the next page */
\f
/* Primitive operations, continued */
#define PC_SQRT_FLONUM 0x78
#define PC_ASCII_FASLOAD 0x79
#define PC_GET_FIXED_OBJECTS_VECTOR 0x7A
#define PC_SET_FIXED_OBJECTS_VECTOR 0x7B
#define PC_LIST_TO_VECTOR 0x7C
#define PC_SUBVECTOR_TO_LIST 0x7D
#define PC_PAIR 0x7E
#define PC_NEGATIVE_FIXNUM 0x7F
#define PC_NEGATIVE_BIGNUM 0x80
#define PC_GREATER_FIXNUM 0x81
#define PC_GREATER_BIGNUM 0x82
#define PC_STRING_HASH 0x83
#define PC_SYS_PAIR_CONS 0x84
#define PC_SYS_PAIR 0x85
#define PC_SYS_PAIR_CAR 0x86
#define PC_SYS_PAIR_CDR 0x87
#define PC_SYS_SET_CAR 0x88
#define PC_SYS_SET_CDR 0x89
#define PC_INITIALIZE_OBJECT_HASH 0x8A
#define PC_GET_CHAR_IMMEDIATE 0x8B
#define PC_SET_CELL_CONTENTS 0x8C
#define PC_EQUAL_BIT_STRING 0x8D
#define PC_SYS_H3_0 0x8E
#define PC_SYS_H3_SET_0 0x8F
#define PC_MAP_ADDRESS_TO_CODE 0x90
#define PC_SYS_H3_1 0x91
#define PC_SYS_H3_SET_1 0x92
#define PC_MAP_CODE_TO_ADDRESS 0x93
#define PC_SYS_H3_2 0x94
#define PC_SYS_H3_SET_2 0x95
#define PC_MAP_PRIM_ADDRESS_TO_ARITY 0x96
#define PC_SYS_LIST_TO_VECTOR 0x97
#define PC_SYS_SUBVECTOR_TO_LIST 0x98
#define PC_SYS_VECTOR 0x99
#define PC_SYS_VECTOR_REF 0x9A
#define PC_SYS_VECTOR_SET 0x9B
#define PC_WITH_HISTORY_DISABLED 0x9C
/* Primitive operations continue on the next page */
\f
/* Primitive operations, continued */
#define PC_VECTOR_1B_CONS 0x9D
#define PC_VECTOR_1B 0x9E
#define PC_VECTOR_1B_REF 0x9F
#define PC_VECTOR_1B_SET 0xA0
#define PC_VEC_1B_SET_FALSE 0xA1
#define PC_VEC_1B_SET_TRUE 0xA2
#define PC_VECTOR_8B_CONS 0xA3
#define PC_VECTOR_8B 0xA4
#define PC_VECTOR_8B_REF 0xA5
#define PC_VECTOR_8B_SET 0xA6
#define PC_ZERO_FLONUM 0xA7
#define PC_POSITIVE_FLONUM 0xA8
#define PC_NEGATIVE_FLONUM 0xA9
#define PC_GREATER_FLONUM 0xAA
#define PC_INTERN_CHARACTER_LIST 0xAB
#define PC_VECTOR_1B_SIZE 0xAC
#define PC_VECTOR_8B_SIZE 0xAD
#define PC_SYS_VECTOR_SIZE 0xAE
#define PC_FORCE 0xAF
#define PC_PRIMITIVE_DATUM 0xB0
#define PC_MAKE_NON_POINTER 0xB1
#define PC_TEMP_PRINTER 0xB2
#define PC_RAISE_STRING 0xB3
#define PC_PRIMITIVE_PURIFY 0xB4
/* UNUSED 0xB5 */
#define PC_COMPLETE_GARBAGE_COLLECT 0xB6
#define PC_BAND_DUMP 0xB7
#define PC_SUBSTRING_SEARCH 0xB8
#define PC_BAND_LOAD 0xB9
#define PC_CONSTANT_P 0xBA
#define PC_PURE_P 0xBB
#define PC_GC_TYPE 0xBC
#define PC_IMPURIFY 0xBD
#define PC_WITH_THREADED_STACK 0xBE
#define PC_WITHIN_CONTROL_POINT 0xBF
#define PC_SET_RUN_LIGHT 0xC0
/* UNUSED 0xC1 */
/* UNUSED 0xC2 */
/* UNUSED 0xC3 */
/* UNUSED 0xC4 */
/* UNUSED 0xC5 */
/* UNUSED 0xC6 */
/* Primitive operations continue on the next page */
\f
/* Primitive operations, continued */
#define PC_CLOSE_LOST_OPEN_FILES 0xC7
#define PC_PUT_CHAR_TO_OUTPUT_CHANNEL 0xC8
#define PC_MASK_INTERRUPT_ENABLES 0xC9
#define PC_EVAL_STEP 0xCA
#define PC_APPLY_STEP 0xCB
#define PC_RETURN_STEP 0xCC
/* UNUSED 0xCD */
/* UNUSED 0xCE */
/* UNUSED 0xCF */
/* UNUSED 0xD0 */
#define PC_MAKE_UNFILLED_BIT_STRING 0xD1
#define PC_MAKE_FILLED_BIT_STRING 0xD2
#define PC_BIT_STRING_QM 0xD3
#define PC_BIT_STRING_SIZE 0xD4
#define PC_BIT_STRING_REF 0xD5
#define PC_BIT_STR_SET 0xD6
#define PC_BIT_STR_SET_TRUE 0xD7
#define PC_BIT_STR_SET_FALSE 0xD8
#define PC_BIT_SUBSTRING 0xD9
#define PC_INST_BIT_STR 0xDA
#define PC_INST_BIT_STR_EXCL 0xDB
#define PC_INTEGER_TO_BIT_STRING 0xDC
#define PC_BIT_STRING_TO_INTEGER 0xDD
#define PC_REVERSE_BIT_STRING 0xDE
#define PC_READ_BITS 0xDF
#define PC_WRITE_BITS 0xE0
#define PC_MAKE_STATE_SPACE 0xE1
#define PC_EXECUTE_AT_NEW_POINT 0xE2
#define PC_TRANSLATE_TO_POINT 0xE3
#define PC_GET_NEXT_CONSTANT 0xE4
/* Primitive operations continue on the next page */
\f
/* Primitive operations, continued */
#define PC_MICROCODE_IDENTIFY 0xE5
#define PC_ZERO 0xE6
#define PC_POSITIVE 0xE7
#define PC_NEGATIVE 0xE8
#define PC_EQUAL_NUMBER 0xE9
#define PC_LESS 0xEA
#define PC_GREATER 0xEB
#define PC_PLUS 0xEC
#define PC_MINUS 0xED
#define PC_MULTIPLY 0xEE
#define PC_DIVIDE 0xEF
#define PC_INTEGER_DIVIDE 0xF0
#define PC_ONE_PLUS 0xF1
#define PC_M_ONE_PLUS 0xF2
#define PC_TRUNCATE 0xF3
#define PC_ROUND 0xF4
#define PC_FLOOR 0xF5
#define PC_CEILING 0xF6
#define PC_SQRT 0xF7
#define PC_EXP 0xF8
#define PC_LN 0xF9
#define PC_SINE 0xFA
#define PC_COSINE 0xFB
#define PC_ARCTAN 0xFC
/* UNUSED 0xFD */
/* UNUSED 0xFE */
/* UNUSED 0xFF */
/* UNUSED 0x100 */
#define PC_GET_EXTERNAL_COUNTS 0x101
#define PC_GET_EXT_NAME 0x102
#define PC_GET_EXT_NUMBER 0x103
#define PC_OPEN_CHANNEL 0x104
#define PC_CLOSE_PHYSICAL_CHANNEL 0x105
#define PC_GET_NEXT_INTERRUPT_CHAR 0x106
#define PC_CHK_AND_CLN_INPUT_CHANNEL 0x107
#define PC_INITIALIZE_MICROCODE_DEBUG 0x108
#define PC_SYSTEM_CLOCK 0x109
#define PC_FILE_EXISTS 0x10A
#define PC_DELETE_FILE 0x10B
#define PC_MOVE_CURSOR 0x10C
#define PC_INTERNAL_PHOTO 0x10D
#define PC_CURRENT_DATE 0x10E
/* Primitive operations continue on the next page */
\f
/* Primitive operations, continued */
#define PC_CURRENT_TIME 0x10F
#define PC_TRANSLATE_FILE 0x110
#define PC_COPY_FILE 0x111
#define PC_RENAME_FILE 0x112
#define PC_REMOVE_FILE 0x113
#define PC_LINK_FILE 0x114
#define PC_MAKE_DIRECTORY 0x115
#define PC_VOLUME_NAME 0x116
#define PC_PREFIX_VOLUME 0x117
#define PC_OPEN_CATALOG 0x118
#define PC_CLOSE_CATALOG 0x119
#define PC_NEXT_FILE 0x11A
#define PC_CAT_NAME 0x11B
#define PC_CAT_KIND 0x11C
#define PC_CAT_PSIZE 0x11D
#define PC_CAT_LSIZE 0x11E
#define PC_CAT_INFO 0x11F
#define PC_CAT_BLOCK 0x120
#define PC_CAT_CREATE_DATE 0x121
#define PC_CAT_CREATE_TIME 0x122
#define PC_CAT_LAST_DATE 0x123
#define PC_CAT_LAST_TIME 0x124
#define PC_ERROR_MESSAGE 0x125
#define PC_CURRENT_YEAR 0x126
#define PC_CURRENT_MONTH 0x127
#define PC_CURRENT_DAY 0x128
#define PC_CURRENT_HOUR 0x129
#define PC_CURRENT_MINUTE 0x12A
#define PC_CURRENT_SECOND 0x12B
#define PC_INIT_FLOPPY 0x12C
#define PC_ZERO_FLOPPY 0x12D
#define PC_PACK_VOLUME 0x12E
#define PC_LOAD_PICTURE 0x12F
#define PC_STORE_PICTURE 0x130
#define PC_LOOKUP_SYSTEM_SYMBOL 0x131
/* Unix specialized primitives start here */
/* Unused 0x132 */
#define PC_CLEAR_SCREEN 0x133
#define PC_CLEAR_TO_END_OF_LINE 0x134
#define PC_NUMBER_OF_COLUMNS 0x135
#define PC_NUMBER_OF_LINES 0x136
/* And a new primitive ... */
#define PC_WITH_INTERRUPT_MASK 0x137
\f
/* Be sure to change MAX_PRIMITIVE_NUMBER, below,
* and the tables in STORAGE.
*/
#define MAX_PRIMITIVE_NUMBER 0x137