|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 5194 (0x144a)
Types: TextFile
Notes: UNIX file
Names: »bcmch.h«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦f4b8d8c84⟧ UNIX Filesystem
└─⟦this⟧ »cmd/bc/bcmch.h«
/*
* The typedef rvalue defines the basic entity upon which bc
* operates.
*/
typedef struct {
mint mantissa;
int scale;
} rvalue;
/*
* The typedef array defines the concept of an array of rvalues.
*/
typedef struct {
rvalue *avalue;
int size;
} array;
/*
* The typedef bcstate is used to hold the state of the bc-
* pseudo machine which should be restored when returning from
* a function call.
*/
typedef struct {
union code *spc; /* pc to return to */
union stkent *sfp, /* frame pointer to return to */
*stos; /* stack pointer to return to */
} bcstate;
/*
* The typedef stkent defines the union used for run-time stack
* entries.
*/
typedef union stkent {
rvalue rvalue,
*lvalue;
array *alvalue;
bcstate bcstate;
} stkent;
/*
* The typedef opcode is the list of opcodes for the hypothetical
* bc-machine.
*/
typedef enum {
LOAD, /*
* Convert TOS from an l_value to an r_value.
*/
LIBASE, LOBASE, LSCALE,
/*
* Push the r_value of the special variable ibase
* (resp. obase, scale).
*/
STORE, /*
* Store the r_value TOS at the l_value
* TOS[-1]. Leave the r_value on the stack
* but remove the l_value.
*/
SIBASE, SOBASE, SSCALE,
/*
* Copy the r_value in TOS into ibase (rep. obase,
* scale). Also, check to see that the value is
* acceptable.
*/
POP, /*
* Throw away the r_value TOS.
*/
PRVAL, /*
* Push the r_value corresponding to the l_value TOS
* onto the stack. Note that the old TOS is left
* on the stack.
*/
PGLSC, PLOSC, /*
* Push the l_value of a global (local) scalar onto
* the stack. The address (resp. stack frame offset)
* of the scalar follows the opcode.
*/
PGLAE, PLOAE, /*
* Push the l_value of a global (local) array
* element onto the stack. The address (resp. stack
* frame offset) of the array follows the opcode
* and TOS is the subscript. Note that the subscript
* is first removed from the stack.
*/
PGLAR, PLOAR, /*
* Push the l_value of a global (local) array onto
* the stack. The address (resp. stack fram offset)
* of the array follows the opcode. (Used to pass
* an entire array as a function argument.)
*/
STOP, /*
* Stop interpreting bc-machine pseudo-instructions
* and return. This is only used at the end of
* the code compiled for immediate execution.
*/
CALL, /*
* Call the function whoose dictionary entry
* is pointed to by the word following this
* opcode. The number of arguments is contained
* in the word following that.
* Just before the CALL, the stack looks like:
* TOS-> last parameter
* ...
* first parameter
* rest of stack
* and just after the CALL, it looks like:
* TOS-> state to return to
* last automatic variable
* ...
* first automatic variable
* last parameter
* ...
* FRAME-> first parameter
* rest of stack
*/
RETURN, /*
* Return from the function whoose dictionary entry
* is pointed to by the word following this opcode.
* Just before the RETURN, the stack looks like:
* TOS-> r_value to return
* state to return to
* last automatic variable
* ...
* first automatic variable
* last parameter
* ...
* FRAME-> first parameter
* rest of stack
* Just after the RETURN, the stack looks like:
* TOS-> r_value returned
* rest of stack
* Note that all prameters and automatic variables
* must be freed and removed from the stack.
*/
INC, DEC, /*
* Add 1 (resp. -1) to the r_value TOS.
*/
PRNUM, /*
* Print the r_value TOS and then remove it from
* the stack.
*/
PRSTR, /*
* Print the string whoose address follows this
* opcode. Note that no newline is added.
*/
PRNL, /*
* Print a new line character.
*/
LENGTH, SCALE, SQRT,
/*
* Replace the r_value TOS with its length in bytes,
* scale factor, or square root respectively.
*/
ADD, SUB, MUL, DIV, REM, EXP,
/*
* Replace the r_values TOS and TOS[-1] with
* TOS + TOS[-1] (resp. TOS - TOS[-1], TOS * TOS[-1],
* TOS / TOS[-1], TOS % TOS[-1], TOS ^ TOS[-1]).
*/
NEG, /*
* Replace the r_value TOS with -TOS.
*/
BRALW, BRNEV, /*
* Branch always (respectively never). The new
* pc will be the address of the following code
* item plus its contents.
*/
BRLT, BRLE, BREQ, BRGE, BRGT, BRNE
/*
* Branch if the r_value TOS[-1] is less than
* (respectively less or equal, equal,
* greater or equal, greater and unequal)
* then the r_value TOS. Note that both TOS and
* TOS[-1] are removed from the stack.
*/
} opcode;
/*
* The typedef code is the type of entry in the array of
* pseudo-code which the pseudo-machine executes.
*/
typedef union code {
opcode opcode;
int address; /* relative code address */
rvalue *lvalue; /* global scalar or constant */
array *alvalue; /* global array */
char *svalue; /* string */
int ivalue; /* stack offset and misc. counts */
struct dicent *dvalue; /* function name */
} code;