



		
		 
 The current Glulx compiler doesn't support the custom opcode function
-- the one that lets you compile opcodes that postdate the compiler itself. Apply the following patch to asm.c. 
					
			
		
				 
		About Patches   
				
					 
			Issue C63107     [previous patch]
					
	
	 
	Glulx support for custom opcodes 
		Submitted by: Andrew Plotkin
		    Appeared in: Compiler 6.31 or before
		    Fixed in: -
	Problem 
 Solution 
 *** inform63-unicode/asm.c      2006-10-24 17:26:11.000000000 -0400
--- inform/asm.c        2006-10-25 15:26:14.000000000 -0400
***************
*** 2746,2754 ****
    opcode_names.enabled = FALSE;
    if (token_type == DQ_TT) {
!     error("Runtime assembly definitions are not yet supported in Glulx.");
!     panic_mode_error_recovery();
!     return;
    }
    else {
      if (token_type != OPCODE_NAME_TT) {
--- 2746,2815 ----
    opcode_names.enabled = FALSE;
    if (token_type == DQ_TT) {
!     char *cx;
!     int badflags;
!
!     AI.internal_number = -1;
!
!     /* The format is @"FlagsCount:Code". Flags (which are optional)
!        can include "S" for store, "SS" for two stores, "B" for branch
!        format, "R" if execution never continues after the opcode. The
!        Count is the number of arguments (currently limited to 0-9),
!        and the Code is a decimal integer representing the opcode
!        number.
!
!        So: @"S3:123" for a three-argument opcode (load, load, store)
!        whose opcode number is (decimal) 123. Or: @"2:234" for a
!        two-argument opcode (load, load) whose number is 234. */
!
!     custom_opcode_g.name = (uchar *) token_text;
!     custom_opcode_g.flags = 0;
!     custom_opcode_g.op_rules = 0;
!     custom_opcode_g.no = 0;
!
!     badflags = FALSE;
!
!     for (cx = token_text; *cx && *cx != ':'; cx++) {
!       if (badflags)
!       continue;
!
!       switch (*cx) {
!       case 'S':
!       if (custom_opcode_g.flags & St)
!         custom_opcode_g.flags |= St2;
!       else
!         custom_opcode_g.flags |= St;
!       break;
!       case 'B':
!       custom_opcode_g.flags |= Br;
!       break;
!       case 'R':
!       custom_opcode_g.flags |= Rf;
!       break;
!       default:
!       if (isdigit(*cx)) {
!         custom_opcode_g.no = (*cx) - '0';
!         break;
!       }
!       badflags = TRUE;
!       error("Unknown custom opcode flag: options are B (branch), \
! S (store), SS (two stores), R (execution never continues)");
!       break;
!       }
!     }
!
!     if (*cx != ':') {
!       error("Custom opcode must have colon");
!     }
!     else {
!       cx++;
!       if (!(*cx))
!       error("Custom opcode must have colon followed by opcode number");
!       else
!       custom_opcode_g.code = atoi(cx);
!     }
!
!     O = custom_opcode_g;
    }
    else {
      if (token_type != OPCODE_NAME_TT) {
	
						
					
					
					
					
  
    Last updated 17 April 2013.
  
  This site is no longer supported; information may be out of date.
  Maintained as a historical archive by the Interactive Fiction Technology Foundation.
  Copyright 1993-2018 IFTF, CC-BY-SA unless otherwise noted.
  
    This page was originally managed by Roger Firth.