package main

type Os9ApiCall struct {
	Name                   string
	Desc                   string
	Number                 byte
	A, B, D, X, Y, U       string
	RA, RB, RD, RX, RY, RU string

	// a_off, b_off, d_off, x_off, y_off, u_off       int
	// ra_off, rb_off, rd_off, rx_off, ry_off, ru_off int
}

var Os9ApiCalls = []*Os9ApiCall{
	{
		Name:   "F$VIRQ",
		Desc:   "Install virtual irq handler",
		Number: 0x27,
		D:      "initial_count_value",
		X:      "install_1_or_delete_0",
        Y:      "addr_of_5_byte_packet",
	},
	{
		Name:   "F$PErr",
		Desc:   "Print Error",
		Number: 0x0F,
		B:      "errnum",
	},
	{
		Name:   "F$LDABY",
		Desc:   "Load A from 0,X in task B",
		Number: 0x49,
		B:      "b",
		X:      "x",
		Y:      "dat_image_addr",
		RA:     "result",
	},
	{
		Name:   "F$LDDDXY",
		Desc:   "Get two bytes (Load D [D+X,[Y]])",
		Number: 0x48,
		D:      "d",
		X:      "x",
		Y:      "dat_image_addr",
		RD:     "result",
	},
	{
		Name:   "F$DelTsk",
		Desc:   "De-alloc process task Number",
		Number: 0x40,
		X:      "proc_desc_addr",
	},
	{
		Name:   "F$AllTsk",
		Desc:   "Alloc process task Number",
		Number: 0x3f,
		X:      "proc_desc_addr",
	},
	{
		Name:   "F$FreeHB",
		Desc:   "Get Free High Block",
		Number: 0x3E,
		B:      "num_blocks",
		Y:      "DAT_image_pointer",
		RA:     "starting_block_number",
	},
	{
		Name:   "F$DelPrc",
		Desc:   "Deallocate Process Descriptor",
		Number: 0x4C,
		A:      "proc_id",
	},
	{
		Name:   "F$SetImg",
		Desc:   "Set Process DAT Image",
		Number: 0x3C,
		A:      "starting_block",
		B:      "num_blocks",
		X:      "proc_desc_addr",
		U:      "new_image_ptr",
	},
	{
		Name:   "F$AllImg",
		Desc:   "Alloc RAM blocks for process DAT image",
		Number: 0x3a,
		A:      "starting_block",
		B:      "num_blocks",
		X:      "proc_desc_addr",
	},
	{
		Name:   "F$Move",
		Desc:   "Move data across addr spaces",
		Number: 0x38,
		A:      "src_task",
		B:      "dest_task",
		X:      "src_ptr",
		Y:      "byte_count",
		U:      "dest_ptr",
	},
	{
		Name:   "F$GProcP",
		Desc:   "Get Process Desc Ptr",
		Number: 0x37,
		A:      "proc_id",
		RY:     "proc_desc_addr",
	},
	{
		Name:   "F$AllPrc",
		Desc:   "Allocate Process Descriptor",
		Number: 0x4B,
		U:      "proc_desc_ptr",
	},
	{
		Name:   "F$DelImg",
		Desc:   "De-allocate Image RAM Blocks",
		Number: 0x3B,
		A:      "starting_block_number",
		B:      "block_count",
		X:      "proc_desc_ptr",
	},
	{
		Name:   "F$BtMem",
		Desc:   "Bootstrap memory request",
		Number: 0x36,
		D:      "byte_count_requested",
		RD:     "byte_count_granted",
		RU:     "pointer_to_mem",
	},
	{
		Name:   "F$Boot",
		Desc:   "Bootstrap system",
		Number: 0x35,
	},
	{
		Name:   "F$NMLink",
		Desc:   "Non-Mapping Link to a module",
		Number: 0x21,
		A:      "module_type",
		X:      "$module_name",
		RA:     "module_type",
		RB:     "module_revision",
		RY:     "storage_requirement",
	},
	{
		Name:   "F$NMLoad",
		Desc:   "Load modules but do not map into user space",
		Number: 0x22,
		A:      "module_type",
		X:      "$module_name",
		RA:     "module_type",
		RB:     "module_revision",
		RY:     "storage_requirement",
	},
	{
		Name:   "F$SLink",
		Desc:   "System Link",
		Number: 0x34,
		A:      "module_type",
		X:      "$module_name",
		Y:      "name_string_DAT_image_ptr",
		RA:     "module_type",
		RB:     "module_revision",
		RY:     "entry_point",
		RU:     "module_pointer",
	},
	{
		Name:   "F$FModul",
		Desc:   "Find Module Directory Entry",
		Number: 0x4E,
		A:      "module_type",
		X:      "$module_name",
		Y:      "name_string_DAT_image_ptr",
	},
	{
		Name:   "F$SSvc",
		Desc:   "Service Request Table init",
		Number: 0x32,
		Y:      "init_table_addr",
	},
	{
		Name:   "F$Ret64",
		Desc:   "Return 64 byte block",
		Number: 0x31,
		A:      "block_number",
		X:      "base_addr",
	},
	{
		Name:   "F$All64",
		Desc:   "Alloc 64 byte block",
		Number: 0x30,
		X:      "base_addr",
		RA:     "block_number",
		RX:     "base_addr_out",
		RY:     "address_of_block",
	},
	{
		Name:   "F$Find64",
		Desc:   "Find 64 byte block",
		Number: 0x2f,
		A:      "block_number",
		X:      "base_addr",
		RY:     "address_of_block",
	},
	{
		Name:   "F$VModul",
		Desc:   "Validate Module",
		Number: 0x2e,
		D:      "DAT_image_ptr",
		X:      "new_module_block_offset",
		RU:     "module_directory_entry_addr",
	},
	{
		Name:   "F$NProc",
		Desc:   "Start next process",
		Number: 0x2d,
	},
	{
		Name:   "F$AProc",
		Desc:   "Enter active process queue",
		Number: 0x2c,
		X:      "addr_of_process_desc",
	},
	{
		Name:   "F$IRQ",
		Desc:   "Insert to IRQ Polling Table",
		Number: 0x2a,
		D:      "polling_addr",
		X:      "packet_addr",
		Y:      "service_routine",
		U:      "memory_area",
	},
	{
		Name:   "F$SRtMem",
		Desc:   "System Return Memory",
		Number: 0x29,
		D:      "byte_count",
		U:      "starting_addr",
	},
	{
		Name:   "F$SRqMem",
		Desc:   "System Request Memory",
		Number: 0x28,
		D:      "byte_count",
		RD:     "actual_size",
		RU:     "starting_addr",
	},
	{
		Name:   "F$GPrDsc",
		Desc:   "Get Process Descriptor",
		Number: 0x18,
		A:      "process_id",
		X:      "buffer_512",
	},
	{
		Name:   "F$STime",
		Desc:   "Set Time",
		Number: 0x16,
		X:      "time_packet_ptr",
	},
	{
		Name:   "F$PrsNam",
		Desc:   "Parse Name",
		Number: 0x10,
		X:      "$name",
		RA:     "trailing_byte",
		RB:     "name_length",
		RX:     "last_slash_plus1",
		RY:     "last_char_plus1",
	},
	{
		Name:   "F$CmpNam",
		Desc:   "Compare Name",
		Number: 0x11,
		B:      "name1_length",
		X:      "$name1",
		Y:      "$name2",
	},
	{
		Name:   "F$SchBit",
		Desc:   "Search Bits",
		Number: 0x12,
		D:      "starting_bit_num",
		X:      "start_of_map",
		Y:      "bit_count",
		U:      "end_of_map",
		RD:     "ret_starting_bit_num",
		RY:     "ret_bit_count",
	},
	{
		Name:   "F$AllBit",
		Desc:   "Allocate Bits",
		Number: 0x12,
		D:      "starting_bit_num",
		X:      "start_of_map",
		Y:      "bit_count",
	},
	{
		Name:   "F$SPrior",
		Desc:   "Set Process Priority",
		Number: 0x0d,
		RA:     "process_id",
		RU:     "priority",
	},
	{
		Name:   "F$ID",
		Desc:   "Get Process ID and User ID",
		Number: 0x0c,
		RA:     "proc_id",
		RU:     "user_id",
	},
	{
		Name:   "F$Icpt",
		Desc:   "Set signal intercept",
		Number: 0x09,
		X:      "func_address",
		U:      "start_memory_area",
	},
	{
		Name:   "F$Link",
		Desc:   "Link A memory module",
		Number: 0x00,
		A:      "lang_and_type",
		X:      "$module_name_ptr",
		RA:     "lang_and_type",
		RB:     "attr_and_rev",
		RX:     "$after_module_name",
		RY:     "absolute_entry_addr",
		RU:     "absolute_header_addr",
	},
	{
		Name:   "F$Chain",
		Desc:   "Create A child process",
		Number: 0x05,
		A:      "lang_and_type",
		B:      "data_pages",
		X:      "$module_name_ptr",
		Y:      "size_of_param_area",
		U:      "start_of_param_area",
	},
	{
		Name:   "F$Fork",
		Desc:   "Create A child process",
		Number: 0x03,
		A:      "lang_and_type",
		X:      "$module_name_ptr",
		Y:      "size_of_param_area",
		U:      "start_of_param_area",
		RA:     "new_process_number",
	},
	{
		Name:   "F$Load",
		Desc:   "Load A module from a file",
		Number: 0x01,
		A:      "lang_and_type_code",
		X:      "$module_name_ptr",
		RA:     "lang_and_type",
		RB:     "attr_and_rev",
		RX:     "$after_module_name",
		RY:     "absolute_entry_addr",
		RU:     "absolute_header_addr",
	},
	{
		Name:   "F$UnLoad",
		Desc:   "Unlink a Module By Name",
		Number: 0x1D,
		A:      "module_type",
		X:      "$module_name",
	},
	{
		Name:   "F$UnLink",
		Desc:   "Unlink A memory module",
		Number: 0x02,
		U:      "module_hdr_ptr",
	},
	{
		Name:   "F$MapBlk",
		Desc:   "Map mem blocks into process space",
		Number: 0x4F,
		B:      "num_blocks",
		X:      "first_block",
		RU:     "addr_of_first_block",
	},
	{
		Name:   "F$Mem",
		Desc:   "Change process data area size",
		Number: 0x07,
		D:      "num_bytes_wanted",
		RY:     "end_of_memory",
		RD:     "actual_num_bytes",
	},
	{
		Name:   "F$Sleep",
		Desc:   "Sleep the process",
		Number: 0x0A,
		X:      "num_ticks",
		RX:     "num_ticks_left",
	},
	{
		Name:   "F$Exit",
		Desc:   "Terminates the calling process",
		Number: 0x06,
		B:      "exit_status",
	},
	{
		Name:   "F$Wait",
		Desc:   "Wait for child death",
		Number: 0x04,
		RA:     "child_process_id",
		RB:     "child_exit_status",
	},
	{
		Name:   "I$Close",
		Desc:   "Close I/O path",
		Number: 0x8F,
		A:      "path",
	},
	{
		Name:   "I$Create",
		Desc:   "Create and open file",
		Number: 0x83,
		A:      "access_mode",
		B:      "attrs",
		X:      "$pathname",
		RA:     "path",
		RX:     "$after_pathname",
	},
	{
		Name:   "I$Delete",
		Desc:   "Delete A file",
		Number: 0x87,
		X:      "$pathname",
		RX:     "$after_pathname",
	},
	{
		Name:   "I$DeleteX",
		Desc:   "Delete A file from cwd or cxd",
		Number: 0x87,
		A:      "access_mode",
		X:      "$pathname",
		RX:     "$after_pathname",
	},
	{
		Name:   "I$Dup",
		Desc:   "Return A synonymous path Number",
		Number: 0x82,
		A:      "path",
		RA:     "new_path",
	},
	{
		Name:   "I$ChgDir",
		Desc:   "Change working directory",
		Number: 0x86,
		A:      "mode",
		X:      "$pathname",
		RX:     "$after_pathname",
	},
	{
		Name:   "I$MakDir",
		Desc:   "Create A directory",
		Number: 0x85,
		B:      "function_code",
		X:      "$pathname",
		RX:     "$after_pathname",
	},
	{
		Name:   "I$ModDsc", // EOU Beta 5
		Desc:   "Modify bytes in file desc",
		Number: 0x91,
		B:      "num_bytes_to_change",
		X:      "$module_name",
		U:      "offset_and_data_byte_pairs",
	},
	{
		Name:   "I$Attach",
		Desc:   "Attach A device",
		Number: 0x80,
		A:      "access_mode",
		X:      "$pathname",
		RX:     "$after_pathname",
		RU:     "device_table_entry_addr",
	},
	{
		Name:   "I$Detach",
		Desc:   "Detach A device",
		Number: 0x81,
		U:      "device_table_entry_addr",
	},
	{
		Name:   "I$Open",
		Desc:   "Open A file",
		Number: 0x84,
		A:      "access_mode",
		X:      "$pathname",
		RA:     "path",
		RX:     "$after_pathname",
	},
	{
		Name:   "I$Read",
		Desc:   "Read from file",
		Number: 0x89,
		A:      "path",
		X:      "buffer",
		Y:      "num_bytes",
		RY:     "actual_num_bytes",
	},
	{
		Name:   "I$ReadLn",
		Desc:   "Read line from file",
		Number: 0x8B,
		A:      "path",
		X:      "buffer",
		Y:      "num_bytes",
		RY:     "actual_num_bytes",
	},
	{
		Name:   "I$Write",
		Desc:   "Write to file",
		Number: 0x8A,
		A:      "path",
		X:      "buffer",
		Y:      "num_bytes",
		RY:     "actual_num_bytes",
	},
	{
		Name:   "I$WritLn",
		Desc:   "Write line to file",
		Number: 0x8C,
		A:      "path",
		X:      "buffer",
		Y:      "num_bytes",
		RY:     "actual_num_bytes",
	},
	{
		Name:   "I$Seek",
		Desc:   "Seek position in file",
		Number: 0x88,
		A:      "path",
		X:      "upper_16_bits",
		U:      "lower_16_bits",
	},
	{
		Name:   "I$GetStt",
		Desc:   "Get status",
		Number: 0x8D,
		A:      "path",
		B:      "function_code",
		X:      "x_arg",
		Y:      "y_arg",
		U:      "u_arg",
		RD:     "d_result",
		RX:     "x_result",
		RY:     "y_result",
		RU:     "u_result",
	},
	{
		Name:   "I$SetStt",
		Desc:   "Set status",
		Number: 0x8E,
		A:      "path",
		B:      "function_code",
		X:      "x_arg",
		Y:      "y_arg",
		U:      "u_arg",
		RD:     "d_result",
		RX:     "x_result",
		RY:     "y_result",
		RU:     "u_result",
	},
}

var Os9ApiCallOf map[byte]*Os9ApiCall

func init() {
	Os9ApiCallOf = make(map[byte]*Os9ApiCall)
	for _, rec := range Os9ApiCalls {
		Os9ApiCallOf[rec.Number] = rec
	}
}
