! Inform file created from 20_parser.t


! Version-specific constants - Ifdef these to test only certain versions
Iftrue #version_number >= 4;
   Constant V4PLUS = 1;
Endif;
Iftrue #version_number >= 5;
   Constant V5PLUS = 1;
Endif;

Release 1;
Serial "314159";

Global G0;
Global G1;
Array arr -> 512;
Array arr2 -> 512;

! Object stuff
! First objects are qw(Class Object Routine String)
! It appears that the first declared property (propa) is #4
! First declared attr is 0
Attribute attr1;
Attribute attr2;
Attribute attr3;
Attribute attr4;
Property propa 11;
Property propb 12;
Property propc 13;
Property propd 14;
Property prope 15;

Object Obj1 "Test Object #1"
  has   attr1 attr2
  with  propa 1,
	propb 2,
	propd 4 5 6;

Object Obj2 "Test Object #2" Obj1
  has   attr3 attr4
  with  propa 2,
	propd 4;

Object Obj3 "Test Object #3" Obj1
  with  propa 3,
	propd 4;

Object Obj4 "Test Object #4" Obj3
  with  propa 4,
	propd 4;

#Ifdef V4PLUS; ! limit of 4-byte properties
! This object is only valid on standard 1.0 interpreters because of
! the 64 byte property.
Object Obj5 ""
 with  propa 1,
       propb 1 2 3,
       propc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29,
       prope 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32;
#Endif;

[ Main i j; 
   ! Math
   @add 3 2 -> i;
   @sub 3 2 -> G0;
   @mul 3 2 -> sp;
   @div 12 i -> sp;
   @mod 9 sp -> i;
   @random 3 -> i;
   ! TODO indirect

   ! Binary math
   @or 4 3 -> j;
   @and 4 3 -> j;
   @not 1 -> i;
   @art_shift 4 1 -> i;
   @log_shift 4 65535 -> i;

   ! Prints
   @print_num G0;
   @print_char 'A';
   @new_line;

   ! Input
   @read_char 1 -> i;
   ! Note aread won't work for v4
   @aread arr arr2 -> i;
   @tokenise arr arr2;

   ! Fancy I/O
#Ifdef V4PLUS;
   @buffer_mode 1;
#Endif;
#Ifdef V5PLUS;
   @output_stream 3 arr;
#Ifnot;
   @output_stream 4;
#Endif;
   @input_stream 0; ! no effect

   ! Memory
   @loadw $0c 0 -> G1;
   @loadb G1 1 -> j; ! g00
   @storeb i 1 3; ! change g00

   @store i arr;
   @storew i 0 $11aa; ! 4 13 10: Shift-He
   @storew i 1 $4634; ! 17 17 20: llo
   @print_addr i;
   @store i "This is a long string that Inform will put in high memory.";
   @print_paddr i;

   ! Variables
   @inc i;
   .b0;
   @inc_chk i 5 ?b1;
   @dec [i];
   .b1;
   @dec_chk j (-10) ?~b0;
   @store i 17;
   @load i -> j;

   ! Calls
   @call_1s sub1 -> sp;
   @call_1n sub1;
   @call_2s sub1 sp -> i;
   @call_2n sub1 j;
   @call_vs sub1 j 2 G0 -> i;
   @call_vn sub1;
   @call_vs2 sub1 1 2 3 4 5 6 7 -> i;
   @call_vn2 sub1 1 2 3 4 5 6 7;
   @store j sub1;
   @call_1n j;

   ! Objects
   @print_obj Obj1;
   @insert_obj Obj3 Obj2;
   @jin Obj4 Obj2 ?b2;
   @remove_obj Obj4;
   .b2;
   @get_sibling Obj1 -> i ?b3;
   @get_child Obj1 -> i ?b3;
   @get_parent Obj2 -> i;
   .b3;

   @get_prop Obj1 propa -> i;
   @get_next_prop Obj1 propa -> i;
   @get_prop_addr Obj1 propd -> i;
   @get_prop_len i -> j;
   @put_prop Obj1 propa 17;

   @test_attr Obj1 attr1 ?b4;
   @set_attr Obj1 attr3;
   .b4;
   @clear_attr Obj2 attr3;

   ! GUI
   @split_window 10;
   @set_window 1;
   @erase_window -1;
   @get_cursor arr;
   @set_cursor 3 4;
   @erase_line 5;
   @set_text_style 0;

   ! Game state
   @save_undo -> i;
   @restore_undo -> i;
   @save -> i;
   @restore -> i;
   quit;
];

[ sub1 a b c;
   ! Jumps / branches / returns
   .j0;
   @jl 1 2 ?~j2;
   @push 3;
#Ifdef V5PLUS;
   @piracy ?~j4;
   @check_arg_count 3 ?~j4;
#Endif;
   @ret_popped;
   .j4;
   @jz 1 ?rfalse;
   @je 1 1 ?~rtrue;
   @je 1 2 3 ?j3;
   @jg a 5 ?j1;
   jump j0; ! using @jump seems to break Inform
   .j1;
   @nop;
   @ret c;
   .j2;
   @test 7 3 ?j5;
   @rtrue;
   .j3;

   @verify ?j5;
   @pull b;
   @print "Hello, ";
   @print_ret "world!^";
   .j5;

   @rfalse;
];