{-- Misc. pcodes -----------------------------------------------} { } { dc_cns - generate a constant value } { } { GenL1(dc_cns, lval, count); } { GenQ1(dc_cns, qval, count); } { GenR1t(dc_cns, rval, count, type); } { Gen2t(dc_cns, ival, count, type); } { GenS(dc_cns, sptr); } { } { Creates COUNT occurrences of the constant lval, qval, rval } { or ival, based on the type. In Gen2t can accept byte or } { word types. In the case of GenS, the operand is a string } { constant, and no repeat count is allowed. } { } { } { dc_glb - generate global label } { } { Gen2Name(dc_glb, r, q, lab) } { } { Creates a global label in the current segment with the name } { LAB^. If Q is 1, the label is marked as private to the } { current segment, otherwise it is marked as public. R bytes } { of space are reserved. } { } { } { dc_dst - generate global storage } { } { Gen1(dc_dst, q) } { } { Creates q bytes of storage (initialized to 0) at the } { current location. } { } { } { pc_lnm - line number } { } { Gen2Name(pc_lnm, lc, flag, nil) } { Gen2Name(pc_lnm, lc, flag, pointer(filename)) } { } { Sets the current line number for the traceback facility and } { debugger. This p-code should only be generated after the } { pc_ent and pc_nam (if any), and should not be generated } { outside of a subroutine. Lc is the line number, while flag } { indicates the type of debugging action on this line: } { } { 0 - step/trace } { 1 - break point } { 2 - auto-go } { } { If filename is not nil, it is a pointer to a GS/OS output } { string giving the source file name. This is used to change } { the file name within a function that spans multiple files. } { } { } { pc_mov - move memory } { } { Gen2(pc_mov, banks, bytes) } { } { The top of stack contains a source address, and TOS-1 has a } { destination address. The source address is removed, } { and BYTES bytes are moved from the source to the } { destination. BANKS is the number of full banks to move; it } { is used when 64K or more must be moved. The memory areas } { must not overlap. } { } { } { pc_nam - subroutine name } { } { GenS(pc_nam, str) } { } { Sets the subroutine name for the traceback facility, } { debugger, and profiler. Str is a pointer to the subroutine } { name. The following global variables should be set to } { appropriate values when this p-code is used: } { } { debugFlag - are we generating debug code? } { profileFlag - are we profiling? } { traceBack - are we doing tracebacks? } { debugSourceFileGS - current source file name } { } { } { pc_nat - native code generation } { } { Gen0(pc_nat) } { } { Generate a native code instruction. The parameters are set } { in a special section in asm.pas. } { } { s - operation code } { q - operand value } { r - addressing mode } { lab - label name } { flags - shift flags } { } {-- Pcodes involved expressions --------------------------------} { } { pc_adi - integer addition } { pc_adl - long addition } { pc_adq - long long addition } { pc_adr - real addition } { } { Gen0(pc_adi) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_adl) cgLong,cgULong } { Gen0(pc_adq) cgQuad,cgUQuad } { Gen0(pc_adr) cgReal,cgDouble,cgComp,cgExtended } { } { The two values on the top of the evaluation stack are } { removed and added. The result is placed back on the stack. } { } { } { pc_and - logical and } { pc_lnd - long logical and } { } { Gen0(pc_and) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_lnd) cgLong,cgULong } { } { The two values on the top of the evaluation stack are } { removed and anded. The result is placed back on the stack. } { Zero is treated as false, and any other value as true. The } { and is a logical and. See pc_bnd for a bitwise and. } { } { If the first operand is false, the second operand is not } { evaluated. } { } { } { pc_bnd - bitwise and } { pc_bal - long bitwise and } { pc_baq - long long bitwise and } { } { Gen0(pc_bnd) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_bal) cgLong,cgULong } { Gen0(pc_baq) cgQuad,cgUQuad } { } { The two values on the top of the evaluation stack are } { removed and anded. The result is placed back on the stack. } { } { } { pc_bno - binary operand no-operation } { } { Gen0t(pc_bno, type) } { } { The left operand is evaluated and discarded, followed by } { the evaluation of the right operand. The type is the type } { of the right operand; it is used in case a pc_pop is } { attached to remove a result left on the stack. This } { instruction is used by C for the comma operator and for } { parameter lists for function and procedure calls, and by } { pc_tri to hold the two expressions. } { } { } { pc_bnt - bitwise negation } { pc_bnl - long bitwise negation } { pc_bnq - long long bitwise negation } { } { Gen0(pc_bnt) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_bnl) cgLong,cgULong } { Gen0(pc_bnq) cgQuad,cgUQuad } { } { The value on the top of the evaluation stack is removed, } { exclusive ored with $FFFF, and replaced. (One's compliment.)} { } { } { pc_bor - bitwise or } { pc_blr - long bitwise or } { pc_bqr - long long bitwise or } { } { Gen0(pc_bor) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_blr) cgLong,cgULong } { Gen0(pc_bqr) cgQuad,cgUQuad } { } { The two values on the top of the evaluation stack are } { removed and ored. The result is placed back on the stack. } { } { } { pc_bxr - exclusive or } { pc_blx - long exclusive or } { pc_bqx - long long exclusive or } { } { Gen0(pc_bxr) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_blx) cgLong,cgULong } { Gen0(pc_bqx) cgQuad,cgUQuad } { } { The two values on the top of the evaluation stack are } { removed and exclusive ored. The result is placed back on } { the stack. } { } { } { pc_cbf - copy bit field } { } { Gen2t(pc_cbf, disp, size, type) } { } { An integer is removed from the top of the evaluation stack } { and saved at the address on the evaluation stack. The } { address is removed, but the integer remains intact. The } { value is saved DISP bits past the address, and is treated as } { a SIZE bit value. Extra bits are dropped. } { } { } { pc_ckp - check for null pointer } { } { Gen0(pc_ckp) } { Gen0(pc_ckn) } { } { Make sure a pointer value is not null. The pc_ckp form } { checks the value at tos; pc_ckn checks the value at tos-1. } { } { } { pc_cop - copy to a local variable } { } { Gen2t(pc_cop, label, disp, type) } { } { Saves the value on the top of the evaluation stack to DISP } { bytes past the local label LABEL. TYPE is the type of the } { value being saved. } { } { } { pc_cnv - convert from one scalar type to another } { pc_cnn - convert from one scalar type to another } { } { Gen2(pc_cnv, from, to) } { Gen2(pc_cnn, from, to) } { } { Converts from one scalar type to another. The from and to } { parameters are ordinal values of type baseTypeEnum. The } { table below shows what from values (along the left edge) and } { to values (along the top) are allowed, and what action is } { taken for each combination. CgDouble, cgComp or cgExtended } { may be used anywhere that cgReal is used, with the same } { results. } { } { The pc_cnn form converts the value at tos-1. The value at } { tos is assumed to be the same size as the result type. } { } { cgByte cgUByte cgWord cgUWord cgLong cgULong cgReal } { cgByte extend extend float } { cgUByte padd padd float } { cgWord extend extend float } { cgUWord extend extend float } { cgLong discard discard discard discard float } { cgULong discard discard discard discard float } { cgReal trunc trunc trunc trunc trunc trunc } { } { The meaning of the operations shown in the table is: } { } { (blank) No action is taken, but the instruction is } { accepted by the code generator. } { extend The value is sign extended to the proper length.} { padd The value is padded on the left with zero bits } { to extend it to the proper length. } { discard Extra bits are discarded to reach the proper } { length, starting with the most significant bit. } { float An integer value is converted to a real value. } { trunc A real value is converted to the largest } { integer value that is less than or equal to the } { real value. } { } { } { pc_cpi - copy indirect } { } { Gen0t(pc_cpi, type) } { } { Two values are removed from the evaluation stack. The first } { is of type TYPE, while the second is a pointer. The first } { value is stored at the location pointed to by the pointer. } { The value is then placed back on the stack. } { } { } { pc_cpo - copy to a global variable } { } { Gen1tName (pc_cpo, disp, type, name) } { } { Saves the value on the top of the evaluation stack to the } { global label NAME. DISP is a fixed displacement past the } { names label to load from. (Used for records.) TYPE is } { the type of the value being loaded. } { } { } { pc_dec - decrement } { } { Gen1t(pc_dec, val, type) } { } { The value on the top of the stack is removed, decremented by } { VAL and returned to the stack. Type may be cgByte, cgUByte, } { cgWord, cgUWord, cgLong or cgULong. In all cases, the } { amount to decrement by is a positive signed integer. } { } { } { pc_dvi - integer divide } { pc_udi - unsigned integer divide } { pc_dvl - long integer divide } { pc_udl - unsigned long divide } { pc_dvq - long long integer divide } { pc_udq - unsigned long long divide } { pc_dvr - real divide } { } { Gen0(pc_dvi) cgByte,cgWord } { Gen0(pc_udi) cgUByte,cgUWord } { Gen0(pc_dvl) cgLong } { Gen0(pc_udl) cgULong } { Gen0(pc_dvq) cgQuad } { Gen0(pc_udq) cgUQuad } { Gen0(pc_dvr) cgReal,cgDouble,cgComp,cgExtended } { } { The two values on the top of the evaluation stack are } { removed and divided. The result is placed back on the } { stack. The result type is the same as the argument type. } { } { } { pc_equ,pc_geq,pc_grt,pc_leq,pc_les,pc_neq - compares } { } { Gen0t(pc_equ, type) } { } { The two values on the top of the evaluation stack are } { removed and compared. A boolean result is placed back on } { the stack. } { } { } { pc_fix - fix a floating-point variable } { } { Gen1t(pc_fix, lab, type) } { } { Change a floating-point value (generally a passed parameter) } { from extended to cgReal, cgDouble,or cgComp. } { } { } { pc_gil - increment and load from a global variable } { pc_gli - load a global variable, then inc the original } { pc_gdl - decrement and load from a global variable } { pc_gld - load a global variable, then dec the original } { } { Gen2tName (pc_gli, inc, disp, type, name) } { } { Loads a value from the global label NAME and places it on } { the evaluation stack. DISP is a fixed displacement past the } { names label to load from. (Used for records.) TYPE is } { the type of the value being loaded. } { } { In addition to loading the value, these instructions also } { increment or decrement the value, as indicated in the } { comment by the instruction name. The operand is incremented } { or decremented by INC. INC must be 1 for one and two byte } { operands. } { } { } { pc_iil - increment and load indirect } { pc_ili - load indirect, then inc the original } { pc_idl - decrement and load indirect } { pc_ild - load indirect, then dec the original } { } { Gen0t (pc_ili, type) } { } { Loads a value from the indirect address on the top of the } { stack, performing either an increment or decrement in the } { process. TYPE may be cgByte, cgUByte, cgWord or cgUWord. } { } { } { pc_inc - increment } { } { Gen1t(pc_inc, val, type) } { } { The value on the top of the stack is removed, incremented by } { VAL and returned to the stack. Type may be cgByte, cgUByte, } { cgWord, cgUWord, cgLong or cgULong. In all cases, the } { amount to increment by is a positive signed integer. } { } { } { pc_ind - load indirect } { } { Gen2t (pc_ind, volatile, disp, type) } { } { A value of type TYPE is loaded from DISP bytes past the } { address that is on the evaluation stack. The address is } { removed from the stack and replaced with the value. } { VOLATILE is non-zero for a volatile load, or 0 otherwise. } { } { } { pc_ior - logical or } { pc_lor - long logical or } { } { Gen0(pc_ior) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_lor) cgLong,cgULong } { } { The two values on the top of the evaluation stack are } { removed and ored. The result is placed back on the stack. } { Zero is treated as false, and any other value as true. The } { or is a logical or. See pc_bor for a bitwise or. } { } { } { pc_ixa - integer indexed address } { } { Gen0t(pc_ixa, type) } { } { TOS is an integer, which is added to TOS-1, which is a long } { integer. This instruction is generally used for computing } { short array indexes. } { } { TYPE can be cgWord or cgUWord; the type indicates whether } { the addition is signed or unsigned. } { } { } { pc_lad - load the address of a subroutine } { } { Gen0Name(pc_lad, name); } { } { Loads the address of the subroutine NAME. } { } { } { pc_lao - load a global address } { } { Gen1Name(pc_lao, disp, name); } { } { Loads the address of DISP bytes past the global variable } { NAME onto the stack. } { } { } { pc_lbf - load bit field } { pc_lbu - load unsigned bit field } { } { Gen2t(pc_lbf, disp, size, type) } { Gen2t(pc_lbu, disp, size, type) } { } { A bit field SIZE bits wide is loaded from DISP bits past the } { address on the top of the evaluation stack. The address is } { removed from the evaluation stack in the process. pc_lbf } { loads a signed value, while pc_lbu loads an unsigned value. } { } { } { pc_lca - load a string constant address } { } { GenS(pc_lca, str) } { } { Loads the address of a string onto the stack. Str is a } { pointer to a string constant. No null terminator is added; } { it should be explicitly included in str if desired. } { } { } { pc_lda - load a local address } { } { Gen2(pc_lda, label, disp) } { } { Loads the address of DISP bytes past the local label LABEL. } { } { } { pc_ldc - load a constant } { } { Gen1t(pc_ldc, val, type) } { GenLdcLong(val) } { GenLdcQuad(val) } { GenLdcReal(val) } { } { Loads a constant value. Special calls for long, quad & real } { values are provided due to the unique parameter requirements.} { } { } { pc_ldo - load from a global variable } { } { Gen1tName (pc_ldo, disp, type, name) } { } { Loads a value from the global label NAME and places it on } { the evaluation stack. DISP is a fixed displacement past the } { names label to load from. (Used for records.) TYPE is } { the type of the value being loaded. } { } { } { pc_lil - increment and load from a local variable } { pc_lli - load a local variable, then inc the original } { pc_ldl - decrement and load from a local variable } { pc_lld - load a local variable, then dec the original } { } { Gen2t(pc_lli, label, inc, type) } { } { Loads a value from the local label LABEL and places it on } { the evaluation stack. TYPE is the type of the value being } { loaded. INC is the number to increment or decrement by. } { } { In addition to loading the value, these instructions also } { increment or decrement the value, as indicated in the } { comment by the instruction name. The operand is incremented } { or decremented by INC. INC must be 1 for one and two byte } { operands. } { } { } { pc_lod - load from a local variable } { } { Gen2t(pc_lod, label, disp, type) } { } { Loads a value from DISP bytes past the local label LABEL and } { places it on the evaluation stack. TYPE is the type is the } { value being loaded. } { } { } { pc_mod - integer remainder } { pc_uim - unsigned integer modulus/remainder } { pc_mdl - long remainder } { pc_ulm - unsigned long modulus/remainder } { pc_mdq - long long remainder } { pc_uqm - unsigned long long modulus/remainder } { } { Gen0(pc_mod) cgByte,cgWord } { Gen0(pc_uim) cgUByte,cgUWord } { Gen0(pc_mdl) cgLong } { Gen0(pc_ulm) cgULong } { Gen0(pc_mdq) cgQuad } { Gen0(pc_uqm) cgUQuad } { } { The two values on the top of the evaluation stack are } { removed and the remainder after division is calculated. } { The result is placed back on the stack. The result, like } { the arguments, is an integer. } { } { } { pc_mpi - integer multiply } { pc_umi - unsigned integer multiply } { pc_mpl - long integer multiply } { pc_uml - unsigned long multiply } { pc_mpq - long long integer multiply } { pc_umq - unsigned long long multiply } { pc_mpr - real multiply } { } { Gen0(pc_mpi) cgByte,cgWord } { Gen0(pc_umi) cgUByte,cgUWord } { Gen0(pc_mpl) cgLong } { Gen0(pc_uml) cgULong } { Gen0(pc_mpq) cgQuad } { Gen0(pc_umq) cgUQuad } { Gen0(pc_mpr) cgReal,cgDouble,cgComp,cgExtended } { } { The two values on the top of the evaluation stack are } { removed and multiplied. The result is placed back on the } { stack. The result type is the same as the argument type. } { } { } { pc_ngi - integer negation } { pc_ngl - long negation } { pc_ngq - long long negation } { pc_ngr - real negation } { } { Gen0(pc_ngi) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_ngl) cgLong,cgULong } { Gen0(pc_ngq) cgQuad,cgUQuad } { Gen0(pc_ngr) cgReal,cgDouble,cgComp,cgExtended } { } { The value on the top of the evaluation stack is removed, } { subtracted from 0, and replaced. (Two's compliment.) } { } { } { Gen0(pc_nop) } { } { This operand is a leaf node. It does nothing. It is used } { to create a null expression tree for functions and } { procedures that have no parameters. } { } { } { pc_not - logical negation } { } { Gen0(pc_not) } { } { The value on the top of the evaluation stack is removed, } { logically negated, and replaced. } { } { } { pc_pop - pop a value from the stack } { } { Gen0t(pc_pop, type) } { } { The value on the top of the evaluation stack is removed. } { } { } { pc_psh - push bytes on the stack } { } { Gen0(pc_psh) } { } { Removes the size (a word) and the source address (a long) } { from the evaluation stack, and pushes size bytes from the } { source address onto the stack. } { } { } { pc_rbo - reverse byte order } { } { Gen0(pc_rbo) cgWord,cgUWord } { } { The value on the top of the evaluation stack is removed, has } { the order of its constituent bytes reversed, and is replaced.} { } { } { pc_sbf - save bit field } { } { Gen2t(pc_sbf, disp, size, type) } { } { An integer is removed from the top of the evaluation stack } { and saved at the address on the evaluation stack. The } { value is saved DISP bits past the address, and is treated as } { a SIZE bit value. Extra bits are dropped. } { } { } { pc_sbi - integer subtraction } { pc_sbl - long subtraction } { pc_sbq - long long subtraction } { pc_sbr - real subtraction } { } { Gen0(pc_sbi) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_sbl) cgLong,cgULong } { Gen0(pc_sbq) cgQuad,cgUQuad } { Gen0(pc_sbr) cgReal,cgDouble,cgComp,cgExtended } { } { The two values on the top of the evaluation stack are } { removed. TOS-1 - TOS is placed back on the stack. } { } { } { pc_shl - shift left } { pc_sll - shift left long } { pc_slq - shift left long long } { } { Gen0(pc_shl) cgByte,cgUByte,cgWord,cgUWord } { Gen0(pc_sll) cgLong,cgULong } { Gen0(pc_slq) cgQuad,cgUQuad (tos-1) / cgWord (tos) } { } { The value at tos-1 is shifted left by the number of bits } { specified by tos. The result is an integer, which replaces } { the operands on the stack. The right bit positions are } { filled with zeros. For pc_slq, only the value at tos-1 is } { cgQuad/cgUQuad; the shift count at tos is cgWord or cgUWord. } { } { } { pc_shr - shift right } { pc_usr - unsigned shift right } { pc_slr - long shift right } { pc_vsr - unsigned long shift right } { pc_sqr - long long shift right } { pc_wsr - unsigned long long shift right } { } { Gen0(pc_shr) cgByte,cgWord } { Gen0(pc_usr) cgUByte,cgUWord } { Gen0(pc_slr) cgLong } { Gen0(pc_vsr) cgULong } { Gen0(pc_sqr) cgQuad (tos-1) / cgWord (tos) } { Gen0(pc_wsr) cgUQuad (tos-1) / cgWord (tos) } { } { The value at tos-1 is shifted right by the number of bits } { specified by tos. The result is an integer, which replaces } { the operands on the stack. This is a signed shift: the } { leftmost bit position is filled in with a copy of the } { original leftmost bit. } { } { Pc_usr is the unsigned form. The operation is the same, } { except that the leftmost bit is replaced with a zero. } { Pc_vsr is used for unsigned long operations, and pc_wsr is } { used for unsigned long long operations. } { } { } { pc_stk - stack an operand } { } { Gen0t(pc_stk, type) } { } { The value on top of the evaluation stack is to be left there } { as a parameter to a subsequent procedure or function call. } { This p-code "caps" the expression tree, giving the code } { generator something to do with the expression result. } { } { } { pc_sro - store to a global variable } { } { Gen1tName (pc_sro, disp, type, name) } { } { Saves the value from the top of the evaluation stack to the } { global label NAME. DISP is a fixed displacement past the } { names label to load from. (Used for records.) TYPE is } { the type of the value being loaded. } { } { } { pc_sto - store indirect } { } { Gen0t(pc_sto, type) } { } { Two values are removed from the evaluation stack. TOS is of } { type TYPE, while TOS-1 is a pointer. The value is stored at } { the location pointed to by the pointer. } { } { } { pc_str - store to a local variable } { } { Gen2t(pc_str, label, disp, type) } { } { Saves the value on the top of the evaluation stack to DISP } { bytes past the local label LABEL. TYPE is the type of the } { value being saved. } { } { } { pc_tri - C trinary operator } { } { Gen0t(pc_tri, type) } { } { Implements the C trinary operator. TOS is the false } { expression, TOS-1 the true expression, and TOS-2 the } { condition expression. The condition expression is } { evaluated. If it is non-zero, the true expression is } { evaluated. If it is zero, the false expression is } { evaluated. The result type of the true and false } { expressions must be the same. } { } { Internally, pc_bno is used for the right operand; the } { operands for pc_bno are the two expressions. } { } {-- Flow of control --------------------------------------------} { } { dc_lab - define a label } { } { Gen1(dc_lab, lab) } { } { Defines label number lab at the current location. } { } { } { pc_add - address } { } { Gen1(pc_add, lab) } { } { Generates a two-byte address that points to the label lab. } { This is used to create branch tables for pc_xjp } { instructions. } { } { } { pc_fjp - jump if false } { } { Gen1(pc_fjp, lab) } { } { A boolean value is removed from the top of the evaluation } { stack. If the value is false, execution continues with the } { instruction after the label lab; otherwise execution } { continues with the instruction after this one. } { } { } { pc_tjp - jump if true } { } { Gen1(pc_tjp, lab) } { } { A boolean value is removed from the top of the evaluation } { stack. If the value is true, execution continues with the } { instruction after the label lab; otherwise execution } { continues with the instruction after this one. } { } { } { pc_ujp - jump } { } { Gen1(pc_ujp, lab) } { } { Execution continues with the instruction after the label lab.} { } { } { pc_xjp - indexed jump } { } { Gen1(pc_xjp, val) } { } { The top of stack contains an integer, which is removed. If } { it is less than zero or greater than VAL, it is replaced by } { VAL. The result is then used to index into a jump table, } { formed using pc_add instructions, which follows immediately } { after the pc_xjp instruction. } { } {-- Pcodes involved with calling and defining procedures -------} { } { dc_str - start a segment } { } { Gen2Name(dc_str, p1, p2, name) } { } { Starts a new object segment with the name name^. P1 is the } { segment kind, while p2 is the length code (1 for data, 0 for } { code segments). } { } { } { dc_pin - procedure entry point } { } { Gen0(dc_pin) } { } { A code segment does not have to be entered at the first byte } { when called. This directive is used one time in each code } { segment to indicate the actual entry point. } { } { } { dc_enp - end a segment } { } { Gen0(dc_enp) } { } { This directive closes the current segment. } { } { } { pc_ent - enter a subroutine } { } { Gen0(pc_ent) } { } { This pcode is used at the beginning of every subroutine. It } { marks the beginning of a new stack frame definition. } { Subsequent dc_loc and dc_prm cause space to be allocated } { from this stack frame. } { } { } { pc_ret - return from a subroutine } { } { Gen0t(pc_ret, type) } { } { This pcode is used to return from a function or a procedure. } { The type is the type of the function, and is used to tell } { the code generator what type of value to return. The value } { to return is assumed to be stored defaultStackSize bytes } { into the stack frame. } { } { } { pc_rev - return a value from a subroutine } { } { Gen0t(pc_rev, type) } { } { This pcode is used to return from a function. The type is } { the type of the function, and is used to tell the code } { generator what type of value to return. It may be cgByte, } { cgUByte, cgWord, cgUWord, cgLong, or cgULong. The value } { to return is removed from the evaluation stack. } { } { } { pc_cui - call user procedure, indirect } { } { Gen1t(pc_cui, repair, ftype) } { } { Calls a user procedure or function through the address on } { the top of the evaluation stack. FTYPE is the return type. } { Repair is 1 if stack repair should be forced, -1 if stack } { repair and checking should be disabled, or 0 if the regular } { settings should be used. } { } { } { pc_cup - call user procedure } { } { Gen1tName(pc_cup, repair, ftype, name) } { } { Calls a user procedure or function. Ftype is the type. } { Repair is 1 if stack repair should be forced, -1 if stack } { repair and checking should be disabled, or 0 if the regular } { settings should be used. NAME is the name of the procedure. } { } { } { dc_loc - define local label } { } { Gen2(dc_loc, label, size) } { } { Defines a local label using the label parameter as a label } { number. Size bytes are reserved on the stack frame. Label } { numbers should be assigned by the compiler, starting with } { number 1. Label 0 is reserved for referring to the return } { value of a function (if any). } { } { } { dc_prm - define parameter } { } { Gen3(dc_prm, label, size, disp) } { } { Defines a label used to refer to a parameter. See dc_loc } { for a discussion of the label and size parameters. The disp } { parameter is the number of bytes of parameter that will be } { pushed after this one; i.e., the disp from the return addr } { to this parameter. } { } { } { pc_tl1 - call a tool } { } { GenTool(pc_tl1, toolNum, retSize, dispatcher) } { } { Calls a tool. The tool number is toolNum; the tool is } { called at location dispatcher. The tool returns a result } { that is retSize bytes long. } { } { } { dc_sym - generate a symbol table } { } { Gen1Name(dc_sym, doGLobals, pointer(table) } { } { Generates a symbol table for the debugger. TABLE is the } { address of the symbol table, which will be passed back to a } { subroutine called GenSymbols, which must be supplied by the } { compiler. DOGLOBALS is a flag the compiler can set for its } { own purposes. C uses the flag to note that the symbol } { table being created is for main, so global symbols should be } { included. } { }