pcs/schemed.equ

539 lines
20 KiB
Plaintext
Raw Normal View History

2023-05-20 05:57:06 -04:00
; =====> SCHEMED.EQU
page 60,132
; TIPC Scheme Runtime Data Structure Equates
; Copyright 1984,1985 by Texas Instruments Incorporated.
; All Rights Reserved.
;
; Last Update:
;
; tc 10 Feb 1987 - Modified Page 5 special symbols to reflect #T
; per the R^3 Report.
include memtype.equ
; The following equates set the limits on the virtual memory (paging)
; system:
NUMPAGES equ 128 ; Total number of pages
DEDPAGES equ 8 ; Number of dedicated pages
PreAlloc equ DEDPAGES+1 ; Pre-allocated pages
PAGEINCR equ 2
PAGEMASK equ 000FEH
PTRMASK equ MIN_PAGESIZE-1
WORDSIZE equ 16 ; The computer's word size (16 bits/word)
WORDINCR equ 2 ; The number of address units per word
HT_SIZE equ 211 ; The oblist's hash table size
OHT_SIZE equ 17 ; The object hash table's size
STKSIZE equ 900 ; Length of Scheme's internal stack (bytes)
NUM_REGS equ 64 ; Number of general regs in the Scheme VM
SB_CHECK equ 16 ; Iteration count for shift-break checks
; Page attribute bits
ATOM equ 08000H ; 1 = Atomic data
LISTCELL equ 04000H ; 1 = List (cons) cells
FIXNUMS equ 02000H ; 1 = 16-bit integer data
FLONUMS equ 01000H ; 1 = 32-bit floating point data
BIGNUMS equ 00800H ; 1 = big integer values
SYMBOLS equ 00400H ; 1 = symbols
STRINGS equ 00200H ; 1 = strings
VECTORS equ 00100H ; 1 = vector (array) storage
NOMEMORY equ 00080H ; 1 = no memory allocated
READONLY equ 00040H ; 1 = memory is read only (constant)
CONTINU equ 00020H ; 1 = continuation object
CLOSURE equ 00010H ; 1 = closure object
REFS equ 00008H ; 1 = ref cells
PORTS equ 00004H ; 1 = I/O ports
CODE equ 00002H ; 1 = code block
CHARS equ 00001H ; 1 = characters
NUMBERS equ FIXNUMS+FLONUMS+BIGNUMS ; number (fixnums, flonums, bignums)
; Data type equates (classes of data objects)
NUMTYPES equ 15 ; Number of data types
LISTTYPE equ 0
FIXTYPE equ 1
FLOTYPE equ 2
BIGTYPE equ 3
SYMTYPE equ 4
STRTYPE equ 5
VECTTYPE equ 6
CONTTYPE equ 7
CLOSTYPE equ 8
FREETYPE equ 9
CODETYPE equ 10
REFTYPE equ 11
PORTTYPE equ 12
CHARTYPE equ 13
ENVTYPE equ 14
; Data type lengths for fixed length objects
BLK_OVHD equ 3 ; size of a block header
PTRSIZE equ 3 ; size of a Scheme pointer (3 bytes)
FLOSIZE equ 9
; Special pre-allocated pages
SPECCHAR equ 1
SPECFIX equ 3
SPECFLO equ 4
SPECSYM equ 5
SPECPOR equ 6
SPECCODE equ 7
; Predefined constants
T_PAGE equ SPECSYM ; symbol 't' (representing true)
T_DISP equ 0000H
UN_PAGE equ SPECSYM ; symbol '#!unassigned' (unbound variable)
UN_DISP equ 0009H
NTN_PAGE equ SPECSYM ; symbol '#!not-a-number'
NTN_DISP equ 001CH
DIV0_PAGE equ SPECSYM ; symbol for divide by 0
DIV0_DISP equ 001CH
EOF_PAGE equ SPECSYM ; symbol for '#!EOF
EOF_DISP equ 00031H
NPR_PAGE equ SPECSYM ; symbol for '#!unprintable'
NPR_DISP equ 003DH
NIL_PAGE equ 0 ; symbol 'nil' (representing itself)
NIL_DISP equ 0
IN_PAGE equ SPECPOR ; standard input port
IN_DISP equ 0
OUT_PAGE equ SPECPOR ; standard output port
OUT_DISP equ 0
WHO_PAGE equ SPECPOR ; "who-line"
WHO_DISP equ 0123H
; End of linked list indicator
END_LIST equ 07FFFH
; Garbage Collector "marked" bit
GC_BIT equ 080H
NOT_GC_BI equ 07FH
; Special Characters
CR equ 0DH ; ASCII Carriage Return
LF equ 0AH ; ASCII Line Feed
; Numeric operator sub-opcodes
ADD_OP equ 0 ; add
SUB_OP equ 1 ; subtract
MUL_OP equ 2 ; multiply
DIV_OP equ 3 ; divide
MOD_OP equ 4 ; modulo
AND_OP equ 5 ; bitwise-and
OR_OP equ 6 ; bitwise-or
MINUS_OP equ 7 ; minus
EQ_OP equ 8 ; = (equal comparison)
NE_OP equ 9 ; <> (not equal comparison)
LT_OP equ 10 ; < (less than comparison)
GT_OP equ 11 ; > (greater than comparison)
LE_OP equ 12 ; <= (less than or equal comparison)
GE_OP equ 13 ; >= (greater than or equal comparison)
ABS_OP equ 14 ; absolute value
QUOT_OP equ 15 ; quotient (integer division)
ZERO_OP equ 21 ; zero?
POS_OP equ 22 ; positive?
NEG_OP equ 23 ; negative?
XOR_OP equ 24 ; bitwise-xor
; Numeric Error Codes
REF_GLOBAL_ERROR equ 1 ; reference of unbound global variable
SET_GLOBAL_ERROR equ 2 ; SET! error-- global not defined
REF_LEXICAL_ERROR equ 3 ; reference of unbound lexical variable
SET_LEXICAL_ERROR equ 4 ; SET! error-- lexical variable not defined
REF_FLUID_ERROR equ 5 ; reference of unbound fluid variable
SET_FLUID_ERROR equ 6 ; SET-FLUID! error-- fluid not bound
VECTOR_OFFSET_ERROR equ 7 ; vector index out of range
STRING_OFFSET_ERROR equ 8 ; string index out of range
SUBSTRING_RANGE_ERROR equ 9 ; invalid substring range
INVALID_OPERAND_ERROR equ 10 ; Invalid operand to VM instruction
SHIFT_BREAK_CONDITION equ 11 ; SHFT-BRK key was depressed by user
NON_PROCEDURE_ERROR equ 12 ; Attempted to call non-procedural object
TIMEOUT_CONDITION equ 13 ; Timer interrupt
WINDOW_FAULT_CONDITION equ 14 ; Attempt to do I/O to a de-exposed window
FLONUM_OVERFLOW_ERROR equ 15 ; Flonum Over/Under-flow
ZERO_DIVIDE_ERROR equ 16 ; Division by zero
NUMERIC_OPERAND_ERROR equ 17 ; non-numeric operand
APPLY_ARG_LIMIT_ERROR equ 18 ; too many arguments for APPLY to handle
VECTOR_SIZE_LIMIT_ERROR equ 19 ; attempt to allocate vector which is too big
STRING_SIZE_LIMIT_ERROR equ 20 ; attempt to allocate string which is too big
IO_ERRORS_START equ 21 ; Errors between 21 and 84 are DOS I/O errors
DOS_FATAL_ERROR equ 21 ; Generic fatal I/O error
EXTEND_START_ERROR_CODE equ 1 ; Extended error codes from INT 59h
EXTEND_END_ERROR_CODE equ 88
DISK_FULL_ERROR equ 200 ; Our own home-grown error codes
LAST_ERROR equ 200 ; Future errors should start here
; List Cell
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-------------+-+-+-----+-----------------------+
; | car page no.|0|g|0 0 0| car displacement |
; +-------------+-+-+-----+-----------------------+
; | cdr page no.|0|0 0 0 0| cdr displacement |
; +-------------+-+-------+-----------------------+
; where g = used during garbage collection
listdef struc
car_page db ? ; CAR's page number
car dw ? ; CAR's displacement
cdr_page db ? ; CDR's page number
cdr dw ? ; CDR's displacement
listdef ends
list_gc equ car+1 ; High order bit used by GC
LISTSIZE equ size listdef
; Bignum
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-+-------------+-------------------------------+
; |g| type | length in bytes |
; +-+-------------+-------------------------------+
; | sign | least significant word |
; +---------------+--------------------------------
; : :
; ----------------+-------------------------------+
; | most significant word |
; ----------------+-------------------------------+
; where g = used during garbage collection
bigdef struc
big_type db BIGTYPE ; tag = bignum
big_len dw ? ; length of entire data structure in bytes
big_sign db ? ; sign of the bignum
big_data dw ? ; data bits, stored with least significant
; bits appearing first
big_2nd dw ? ; second word of significant bits
bigdef ends
big_gc equ big_type
; Flonum
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-+-------------+---------------+---------------+
; |g| type | 64 bit IEEE floating |
; +-+-------------+---------------+---------------+
; | |
; +---------------+---------------+---------------+
; | |
; +---------------+---------------+---------------+
; where g = used during garbage collection
flodef struc
flo_type db FLOTYPE ; tag = flonum
flo_data db 8 dup (?) ; IEEE floating point number
flodef ends
flo_gc equ flo_type
; Vector (Array)
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-+-+-----------+-------------------------------+
; |g|b| type | length in bytes |
; +-+-+-----------+-------------------------------+
; | first data element, second, ...
; +------------------------------------------------
; : :
; ------------------------------------------------+
; ..., last data element |
; ------------------------------------------------+
; where g = used during garbage collection
; b = unboxed array (contains no type info)
vecdef struc
vec_type db VECTTYPE
vec_len dw ?
vec_page db ?
vec_disp dw ?
vecdef ends
vec_gc equ vec_type
vec_data equ vec_page
; Symbol
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-+-------------+-------------------------------+
; |g| SYMTYPE | length in bytes |
; +-+-------------+-------------------------------+
; | link page no. | link displacement |
; +-+-------------+-------------------------------+
; | hash value | characters ...
; +---------------+-------------------------------
; : :
; ------------------------------------------------+
; where g = used during garbage collection
symdef struc
sym_type db SYMTYPE ; tag = symbol
sym_len dw ? ; length of symbol structure in bytes
sym_page db ? ; link field page number
sym_disp dw ? ; link field displacement
sym_hkey db ? ; hash key
sym_data db ? ; character(s) in symbol
symdef ends
sym_gc equ sym_type
sym_ovhd equ sym_data-sym_type ; # bytes of overhead in symbol object
; String
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-+-------------+-------------------------------+
; |g| STRTYPE | length in bytes |
; +-+-------------+-------------------------------+
; | characters ...
; +---------------+---------------+----------------
; : :
; ----------------+---------------+---------------+
; where g = used during garbage collection
strdef struc
str_type db strTYPE ; tag = string
str_len dw ? ; length of string structure in bytes
str_data db ? ; character(s) in string
strdef ends
str_gc equ str_type
str_ovhd equ str_data-str_type ; # bytes of overhead in string object
; Closure
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-+-------------+-------------------------------+
; |g| CLOSTYPE | length in bytes |
; +-+-------------+-------------------------------+
; | Information Operand Pointer |
; +---------------+-------------------------------+
; | heap page no. | heap environment displacement |
; +---------------+-------------------------------+
; | CB page no. | CB displacement |
; +---------------+-------------------------------+
; | SPECFIX*2 | Entry Point Displacement |
; +---------------+-------------------------------+
; | SPECFIX*2 | Number of Arguments |
; +---------------+-------------------------------+
; where g = used during garbage collection
closdef struc
clo_type db CLOSTYPE ; tag = closure
clo_len dw ? ; length of closure object in bytes
clo_ipag db ? ; information operand page number
clo_idis dw ? ; information operand displacement
clo_hpag db ? ; heap environment pointer page number
clo_hdis dw ? ; heap environment pointer displacement
clo_cb_p db ? ; code base page number
clo_cb_d dw ? ; code base displacement pointer
clo_etag db SPECFIX*2 ; entry point tag = immediate
clo_edis dw ? ; entry point displacement
clo_atag db SPECFIX*2 ; number of arguments tag = immediate
clo_narg dw ? ; number of arguments
clo_dbug db ? ; optional debugging information?
closdef ends
clo_gc equ clo_type ; garbage collection mark bit field
CLO_OVHD equ clo_dbug-clo_type ; number of bytes of overhead in a closure
; Continuation
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-+-------------+-------------------------------+
; |g| CONTTYPE | length in bytes |
; +-+-------------+-------------------------------+
; | tag=fixnum | stack base of continuation |
; +---------------+-------------------------------+
; | return address code base pointer |\
; +---------------+-------------------------------+ | return address
; | tag=fixnum | return address displacement |/
; +---------------+-------------------------------+
; | tag=fixnum | caller's dynamic link (FP) |
; +---------------+-------------------------------+
; | fluid environment pointer (FNV_reg) |
; +---------------+-------------------------------+
; | previous stack segment (continuation) pointer |
; +---------------+-------------------------------+
; | global environment pointer (GNV_reg) |
; +---------------+-------------------------------+
; : :< - BASE
; : [contents of stack at call/cc] :
; : :< - TOS
; +-----------------------------------------------+
; where g = used during garbage collection
contdef struc
con_type db CONTTYPE ; tag = continuation
con_len dw ? ; length of continuation structure in bytes
con_btag db SPECFIX*2 ; stack base of continuation object
con_base dw ?
con_cb_p db ? ; return address code base pointer
con_cb_d dw ?
con_rtag db SPECFIX*2 ; return address displacement
con_ret dw ?
con_dtag db SPECFIX*2 ; caller's dynamic link
con_ddis dw ?
con_fl_p db ? ; fluid environment pointer
con_fl_d dw ?
con_spag db ? ; previous stack segment pointer
con_sdis dw ?
con_gl_p db ? ; global environment pointer
con_gl_d dw ?
con_data db ? ; contents of stack at call/cc
contdef ends
con_gc equ con_type
; Code Block
;
; +-----------------------------------------------------+
; | 2 2 2 2 1 1 1 1 1 1 1 1 1 1 |
; | 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 |
; | +-+-------------+-------------------------------+ |
; | |g| CODETYPE | length in bytes | |
; | +-+-------------+-------------------------------+ |
; | | FIXTYPE*2 | entry offset |--+
; | +---------------+-------------------------------+
; | | page | displacement |\
; | +---------------+-------------------------------+ |
; | : : : > constants
; | +---------------+-------------------------------+ | area
; | | page | displacement |/
; | +---------------+---------------+---------------+
; +->| code | code | code |\
; +---------------+---------------+---------------+ |
; : : : : > code
; +---------------+---------------+---------------+ |
; | code | code | code |/
; +---------------+---------------+---------------+
; where g = used during garbage collection
codedef struc
cod_type db CODETYPE ; tag = code block
cod_len dw ? ; length of code block in bytes
cod_etag db FIXTYPE*2 ; entry offset tag = fixnum
cod_entr dw ? ; entry offset in bytes
cod_cpag db ? ; code block constants area
cod_cdis dw ?
codedef ends
cod_gc equ cod_type ; garbage collection tag field
; Environment Data Object
;
; 2 2 2 2 1 1 1 1 1 1 1 1 1 1
; 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
; +-+-------------+-------------------------------+
; |g| type | length in bytes |
; +-+-------------+-------------------------------+
; | parent pointer |
; +---------------+-------------------------------+
; | list of symbols (linked through cdr field) |
; +---------------+-------------------------------+
; | list of values (linked through car field) |
; +---------------+-------------------------------+
; where g = used during garbage collection
envdef struc
env_tag db ENVTYPE ; tag = environment
env_len dw ? ; length in bytes
env_ppag db ? ; parent pointer page number
env_pdis dw ? ; parent pointer displacement
env_npag db ? ; list of names page number
env_ndis dw ? ; list of names displacement
env_vpag db ? ; list of values page number
env_vdis dw ? ; list of values displacement
envdef ends
ENV_SIZE equ size envdef
; Port
; +--------+--------+--------+
; 0 |tag=port| length in bytes |
; +--------+--------+--------+
; 3 | string source pointer |
; +--------+--------+--------+--------+
; 6 | port flags | handle |
; +-----------------+-----------------+
; 10 | cursor line | cursor column |
; +-----------------+-----------------+
; 14 | upper left line |upper left column|
; +-----------------+-----------------+
; 18 | number of lines |number of columns|
; +-----------------+-----------------+
; 22 |border attributes| text attributes |
; +-----------------+-----------------+
; 26 | window flags | buffer position |
; +-----------------+-----------------+
; 30 | buffer end |
; +--------+--------+--------+--------+----... -----+
; 32 | input/output buffer |
; +--------+--------+-----------------+-------...---+
; | window label/file pathname |
; +--------+--------+-----------------+---------...-+
; where g = used during garbage collection
;
; 7 6 5 4 3 2 1 0
; +-+-+-+-+-+-+---+
;port flags: | |s|b|t|o|w|mod|
; +-+-+-+-+-+-+---+
;
; mod - mode: 0=read
; 1=write
; 2=read and write
; w - window/file: 0=file
; 1=window
; o - open/closed: 0=closed
; 1=open
; t - transcript: 0=disabled
; 1=enabled
; b - binary: 0=test file/window
; 1=binary file/window
; s - string I/O: 0=file/window I/O
; 1=string I/O
;
; 7 6 5 4 3 2 1 0
; +-----+-+-+-+-+-+
;window flags: | |e|w|
; +-----+-+-+-+-+-+
;
; w - wrap/clip: 0=clip
; 1=wrap
; e - exposed: 0=exposed
; 1=(partially) covered
;
portdef struc
pt_type db PORTTYPE ; tag = port
pt_len dw ? ; length of port structure in bytes
pt_ptr db ?,?,? ; pointer to string, if any
pt_pflgs dw ? ; port flags
pt_handl dw ? ; file's handle
pt_cline dw ? ; cursor line number
pt_ccol dw ? ; cursor column number
pt_ullin dw ? ; upper left hand corner's line number
pt_ulcol dw ? ; upper left hand corner's column number
pt_nline dw ? ; number of lines
pt_ncols dw ? ; number of columns/line length
pt_bordr dw ? ; window's border attributes
pt_text dw ? ; window's text attributes
pt_wflgs dw ? ; window flags
pt_bfpos dw ? ; buffer position (offset)
pt_bfend dw ? ; end of buffer offset
pt_buffr dw ? ; input/output buffer
portdef ends
port_gc equ pt_type
pt_chunk equ pt_ullin
W_CLIP equ 00h
W_WRAP equ 01h
READ_ONLY equ 00h
WRITE_ONLY equ 01h
READWRITE equ 02h
WINDOW equ 04h
OPEN equ 08h
TRANSCRI equ 10h
BINARY equ 20h
STRIO equ 40h
DIRTY equ 80h
; The following is the format of a scheme pointer as far as
; Lattice C is concerned:
C_ptr struc
C_disp dw ?
C_page dw ?
C_ptr ends