🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.sources.apple2
1 messages
1 total messages Started by Jonathan A. Chandross Sat, 01 Jun 1991 16:21
v001SRC057: coff -- Dump OMF Files Under Orca (GS), Part02/04
#58
Author: Jonathan A. Chandross
Date: Sat, 01 Jun 1991 16:21
2745 lines
60573 bytes
Submitted-by: Albert Chin (acmfiu@fiu.edu)
Posting-number: Volume 1, Source:57
Archive-name: util/gs/shell/orca/coff/part02
Architecture: ONLY_2gs
Version-number: 1.00


=coff.c
-/*
-	utility to dump contents of OMF files
-
-	1990-1991, The UNIX Consortium developer project
-
-	albert chin-a-young ... acmfiu@fiu.edu ... 26285659t@servax.fiu.edu
-
-	-------------------------------------------------------------------
-
-	calling parameters:
-		coff [-OPTIONS] filename [segments..] [loadsegments..]
-
-	OPTIONS 	DESCRIPTION
-	-v [+version]	display coff's version number
-	-d [+asm]	dump segment body in 65816-format disassembly
-	-T [+tool]	interpret Toolbox, GS/OS, ProDOS, ROM calls
-	-x [+hex]	dump segment body in hex (can be used with '+asm')
-	-l [+label]	print expressions using labels (default is offsets)
-	-t [+infix]	display expressions in infix form
-	-p [+postfix]	display expressions in postfix form (default)
-	-m [+merlin]	format of '+asm' to use merlin opcodes (default)
-	-o [+orca]	format of '+asm' to use orca/m opcodes
-	-a [+shorta]	8-bit accumulator
-	-i [+shorti]	8-bit index registers
-	-s [+header]	dump segment headers only
-	-n [+noheader]	do not print segment headers
-	-f [+nooffset]	do not print offset into file
-	-h [+help]	print this information, then quit
-
-	filename	name of file to dump
-	[segments]	names of segments in file to dump
-	[loadsegments]	names of load segments in file to dump
-
-	----------------------------------------------------------------------
-
-	history:
-
-	v1.0d	may 2, 1991					albert chin
-		+longa, +longi removed and replaced by
-			+shorta, +shorti
-		fixed bug if OMF file looked like
-			pea	$<num>
-			jsl	><name>
-			(thanks tim meekins)
-		fixed bug for dangling asm opcodes at end
-			of OMF segment
-			(thanks tim meekins)
-
-	v1.0c	april 30, 1991					albert chin
-		new implementation of hex mode
-			(thanks to tim meekins)
-		+tool option recognizes toolbox, GS/OS,
-			ProDOS calls, ROM addresses
-			(thanks to morgan davis, dave lyons)
-		removed all global variables except flags
-		removed inline asm bug fix (my fault)
-		cleaned up code
-		minimal speed improvement
-		program name changed to 'coff' to match UNIX
-		minor bug fixes
-		bug fix to 65816 expression at end of CONST
-			record. parsing the syntax of this opcode
-			was dead wrong.
-		minimize parentheses routine for disassembly
-			(thanks to tim meekins)
-
-	v1.0b	january 22, 1991				albert chin
-		fix pause, oa-period
-			(thanks to jawaid bazyar, tim meekins)
-		fix to disassembly routines
-		set reload bit
-
-	v0.9b	january 12, 1991				albert chin
-		fix to disasm routines
-		fix to displacement, code counter
-		+infix option working
-		+nooffset option working
-		+postfix option added
-		+label option added
-		all file i/o converted to GS/OS calls
-		added record tyep: BEXPR
-
-	v0.8b	december 21, 1990				albert chin
-		support for OMF v2.0 headers
-		added record type: LCONST
-
-	v0.7b	december 19, 1990				albert chin
-		added record types: GEQU, MEM, EQU
-
-	v0.6b	december 18, 1990				albert chin
-		initial release of beta
- */
-
-
-#include "coff.h"
-
-asm short
-key (void)
-{
-		sep	#0x20
-		lda	>0xe0c000
-		bpl	end
-		cmp	#0xae			/* oa-period */
-		bne	wait
-		lda	>0xe0c025
-		and	#0x80
-		beq	wait
-
-		lda	>0xe0c010
-		rep	#0x20
-		lda	#TRUE
-		rtl
-
-	wait:	lda	>0xe0c010
-	rdkey:	lda	>0xe0c000
-		bpl	rdkey
-		lda	>0xe0c010
-
-	end:	rep	#0x20
-		lda	#FALSE
-		rtl
-}
-
-void
-bye (HEADER *omf)
-{
-	GSOSclose (omf->refNum);
-	free (omf);
-	ResourceShutDown ();
-	MMShutDown (userID);
-
-	exit (1);
-}
-
-void
-read_header (HEADER *omf)
-{
-	unsigned char kind, lablen;
-
-	read_long (omf->refNum, omf->bytecnt);
-	read_long (omf->refNum, omf->resspc);
-	read_long (omf->refNum, omf->length);
-	read_char (omf->refNum, kind);
-	omf->kind = kind;
-	read_char (omf->refNum, omf->lablen);
-	read_char (omf->refNum, omf->numlen);
-	read_char (omf->refNum, omf->version);
-	omf->revision = 0;
-	read_long (omf->refNum, omf->banksize);
-	if (omf->version != 1)
-	{
-		unsigned short unused;
-
-		read_int (omf->refNum, omf->kind);
-		read_int (omf->refNum, unused);
-	}
-	else
-	{
-		unsigned long unused;
-
-		read_long (omf->refNum, unused);
-	}
-	read_long (omf->refNum, omf->org);
-	read_long (omf->refNum, omf->align);
-	read_char (omf->refNum, omf->numsex);
-	read_char (omf->refNum, omf->lcbank);		/* not visible in OMF 2.x */
-	read_int (omf->refNum, omf->segnum);
-	read_long (omf->refNum, omf->entry);
-	read_int (omf->refNum, omf->dispname);
-	read_int (omf->refNum, omf->dispdata);
-	if (omf->version != 1)
-		read_long (omf->refNum, omf->temporg);
-
-	GSOSset_mark (omf->refNum, omf->offset + omf->dispname);
-	GSOSread (omf->refNum, omf->loadname, LOADNAME_LEN);
-	omf->loadname[LOADNAME_LEN] = '\0';
-	if (omf->lablen)
-		lablen = omf->lablen;
-	else
-		read_char (omf->refNum, lablen);
-
-	omf->segname = malloc (lablen + 1);
-	GSOSread (omf->refNum, omf->segname, lablen);
-	omf->segname[lablen] = '\0';
-}
-
-void
-print_header (HEADER *omf)
-{
-	printf ("%s   : $%0.8lx%35lu\n", (omf->version >= 2 ? "byte count " : "block count"), omf->bytecnt, omf->bytecnt);
-	printf ("reserved space: $%0.8lx%35lu\n", omf->resspc, omf->resspc);
-	printf ("length        : $%0.8lx%35lu\n", omf->length, omf->length);
-	printf ("label length  : $%0.2x%41u\n", (unsigned short)omf->lablen, (unsigned short)omf->lablen);
-	printf ("number length : $%0.2x%41u\n", (unsigned short)omf->numlen, (unsigned short)omf->numlen);
-	printf ("version       : $%0.2x%41u\n", (unsigned short)omf->version, (unsigned short)omf->version);
-	if (omf->revision)
-		printf ("revision      : $%0.2x%41u\n", (unsigned short)omf->revision, (unsigned short)omf->revision);
-	printf ("bank size     : $%0.8lx%35lu\n", omf->banksize, omf->banksize);
-	if (omf->version == 1)
-		printf ("kind	       : $%0.2x%41s\n", omf->kind, parse_kind_1 (omf->kind));
-	else
-		printf ("kind	       : $%0.4x%39s\n", omf->kind, parse_kind_2 (omf->kind));
-	printf ("org	       : $%0.8lx%35lu\n", omf->org, omf->org);
-	printf ("alignment     : $%0.8lx%35lu\n", omf->align, omf->align);
-	printf ("number sex    : $%0.2x%41u\n", (unsigned short)omf->numsex, (unsigned short)omf->numsex);
-	printf ("segment number: $%0.4x%39u\n", omf->segnum, omf->segnum);
-	printf ("entry	       : $%0.8lx%35lu\n", omf->entry, omf->entry);
-	printf ("disp to names : $%0.4x%39u\n", omf->dispname, omf->dispname);
-	printf ("disp to data  : $%0.4x%39u\n", omf->dispdata, omf->dispdata);
-	printf ("load name     : %s\n", omf->loadname);
-	printf ("segment name  : %s\n\n", omf->segname);
-}
-
-char *
-parse_kind_1 (unsigned short kind)
-{
-	static char kind_str[KIND_LEN];
-	unsigned short i, type[] = { POSITION_INDEPENDENT, PRIVATE };
-
-	kind_str[0] = '\0';
-
-	if (kind & DYNAMIC)
-		strcat (kind_str, "dynamic");
-	else
-		strcat (kind_str, "static");
-
-	for (i = 0; i < 2; ++i)
-		switch ((kind << 8) & type[i])
-		{
-			case POSITION_INDEPENDENT:
-				strcat (kind_str, " position independent");
-				break;
-
-			case PRIVATE:
-				strcat (kind_str, " private");
-				break;
-		}
-
-	if ((kind & 0x1f) == 0)
-		strcat (kind_str, " code");
-	if ((kind & DATA) == DATA)
-		strcat (kind_str, " data");
-	if ((kind & JUMP_TABLE) == JUMP_TABLE)
-		strcat (kind_str, " jump-table");
-	if ((kind & PATHNAME) == PATHNAME)
-		strcat (kind_str, " pathname");
-	if ((kind & LIBRARY_DICTIONARY) == LIBRARY_DICTIONARY)
-		strcat (kind_str, " library dictionary");
-	if ((kind & INITIALIZATION) == INITIALIZATION)
-		strcat (kind_str, " initialization");
-	if ((kind & ABSOLUTE_BANK_SEG) == ABSOLUTE_BANK_SEG)
-		strcat (kind_str, " absolute_bank");
-	if ((kind & DIRECT_PAGE) == DIRECT_PAGE)
-		strcat (kind_str, " direct-page/stack");
-
-	return (kind_str);
-}
-
-char *
-parse_kind_2 (unsigned short kind)
-{
-	static char kind_str[KIND_LEN];
-	unsigned short i, type[] = {	PRIVATE, POSITION_INDEPENDENT,
-					ABSOLUTE_BANK, RELOAD, SKIP,
-					BANK_RELATIVE };
-
-	kind_str[0] = '\0';
-
-	if (kind & DYNAMIC)
-		strcat (kind_str, "dynamic");
-	else
-		strcat (kind_str, "static");
-
-	for (i = 0; i < 6; ++i)
-		switch (kind & type[i])
-		{
-			case BANK_RELATIVE:
-				strcat (kind_str, " bank-relative");
-				break;
-
-			case SKIP:
-				strcat (kind_str, " skip");
-				break;
-
-			case RELOAD:
-				strcat (kind_str, " reload");
-				break;
-
-			case ABSOLUTE_BANK:
-				strcat (kind_str, " absolute_bank");
-				break;
-
-			case POSITION_INDEPENDENT:
-				strcat (kind_str, " position independent");
-				break;
-
-			case PRIVATE:
-				strcat (kind_str, " private");
-				break;
-		}
-
-	if ((kind & 0xfffe) == CODE)
-		strcat (kind_str, " code");
-	if ((kind & DATA) == DATA)
-		strcat (kind_str, " data");
-	if ((kind & JUMP_TABLE) == JUMP_TABLE)
-		strcat (kind_str, " jump-table");
-	if ((kind & PATHNAME) == PATHNAME)
-		strcat (kind_str, " pathname");
-	if ((kind & LIBRARY_DICTIONARY) == LIBRARY_DICTIONARY)
-		strcat (kind_str, " library dictionary");
-	if ((kind & INITIALIZATION) == INITIALIZATION)
-		strcat (kind_str, " initialization");
-	if ((kind & DIRECT_PAGE) == DIRECT_PAGE)
-		strcat (kind_str, " direct-page/stack");
-
-	return (kind_str);
-}
-
-void
-display_header_asm (HEADER *omf)
-{
-	switch (assembler)
-	{
-		case merlin:
-			if (!nooffset)
-				printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-			puts (" 	  xc");
-			if (!nooffset)
-				printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-			puts (" 	  xc");
-			asm_status_bit (omf, LONGA);
-			if (!nooffset)
-				printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-			printf ("%-10s equ    *\n", omf->segname);
-			break;
-
-		case orca:
-			asm_status_bit (omf, LONGA);
-			asm_status_bit (omf, LONGI);
-			if (!nooffset)
-				printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-			printf ("%-10s %s\n", omf->segname, ((omf->kind & DATA == DATA) ? "data" : "start"));
-			break;
-	}
-}
-
-void
-asm_status_bit (HEADER *omf, unsigned short status_bit)
-{
-	if (!nooffset)
-		printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-	printf ("	    ");
-
-	switch (assembler)
-	{
-		case merlin:
-			printf ("mx	%%%u%u\n", (unsigned short)shorta,
-				(unsigned short)shorti);
-			break;
-
-		case orca:
-			if (status_bit == LONGA)
-				printf ("longa	%s\n", (shorta ? "on" : "off"));
-			else
-				printf ("longi	%s\n", (shorti ? "on" : "off"));
-			break;
-	}
-
-}
-
-void
-parse_opcode_1 (HEADER *omf, unsigned char opcode)
-{
-	printf ("%s    ", opcodes[opcode].syntax);
-	if (opcodes[opcode].mode == ACCUMULATOR && assembler == orca)
-		putchar ('a');
-	else
-		putchar (' ');
-	print_hex_ascii (opcode, 0, 1, 8);
-
-	++omf->displacement;
-	++omf->counter;
-}
-
-unsigned long
-parse_opcode_2 (HEADER *omf, LABEL *lab, unsigned long count, unsigned char opcode)
-{
-	unsigned short uval;
-	signed short sval;
-
-	if ((opcodes[opcode].m && !shorta) || (opcodes[opcode].i && !shorti))
-	{
-		if (count >= 3)
-		{
-			omf->displacement += 3;
-			omf->counter += 3;
-			read_int (omf->refNum, sval);
-			uval = sval;
-			if (tool && opcode == LDX)
-				count = parse_stack (omf, opcode, uval, count);
-			else
-				print_opcode_3 (omf, opcode, sval);
-
-			return (count -= 3);
-		}
-		else
-			if ((omf->counter + 3) >= omf->length)
-				print_byte (omf, count, opcode);
-			else
-				parse_expr_asm (omf, lab, opcode);
-	}
-	else
-	{
-		if (count >= 2)
-		{
-			print_opcode_2 (omf, opcode);
-			return (count -= 2);
-		}
-		else
-			if ((omf->counter + 2) >= omf->length)
-				print_byte (omf, count, opcode);
-			else
-				parse_expr_asm (omf, lab, opcode);
-	}
-
-	return (0);
-}
-
-void
-print_opcode_2 (HEADER *omf, unsigned char opcode)
-{
-	signed char sval;
-	unsigned char uval;
-	unsigned int tmp, num;
-
-	read_char (omf->refNum, sval);
-	uval = sval;
-	if (opcodes[opcode].mode == PC_RELATIVE)
-	{
-		printf (opcodes[opcode].syntax, (unsigned short)(omf->counter + sval + 2), &tmp);
-		num = tmp;
-		printf ("     {%c%0.2x}%n", (sval < 0 ? '-' : '+'),
-			(unsigned short)(sval > 0 ? sval : -sval), &num);
-		num += tmp;
-	}
-	else
-		printf (opcodes[opcode].syntax, uval, &num);
-
-	print_hex_ascii (opcode, uval, 2, num);
-	if (opcode == REP || opcode == SEP)
-		parse_rep_sep (omf, opcode, uval);
-	omf->displacement += 2;
-	omf->counter += 2;
-}
-
-unsigned long
-parse_opcode_3 (HEADER *omf, LABEL *lab, unsigned long count, unsigned char opcode)
-{
-	unsigned long tmp;
-	signed short sval;
-	unsigned short uval;
-
-	if (count >= 3)
-	{
-		omf->displacement += 3;
-		omf->counter += 3;
-		read_int (omf->refNum, sval);
-		uval = sval;
-		if (tool)
-		{
-			if (opcode == JSR)
-			{
-				tmp = parse_inline_3 (omf, lab, uval, count);
-				if (tmp == count)
-					print_opcode_3 (omf, opcode, sval);
-				else
-					count = tmp;
-			}
-			else
-				if (opcode == PEA)
-					count = parse_stack (omf, opcode, uval, count);
-				else
-					print_opcode_3 (omf, opcode, sval);
-		}
-		else
-			print_opcode_3 (omf, opcode, sval);
-
-		return (count -= 3);
-	}
-	else
-		if ((omf->counter + 3) >= omf->length)
-			print_byte (omf, count, opcode);
-		else
-			parse_expr_asm (omf, lab, opcode);
-
-	return (0);
-}
-
-void
-print_opcode_3 (HEADER *omf, unsigned char opcode, signed short sval)
-{
-	unsigned short uval = sval;
-	unsigned int tmp, num;
-	Handle name = NULL;
-
-	if (tool && opcodes[opcode].mode == ABSOLUTE)
-	{
-		name = LoadResource (rROM, (Longword)uval);
-		if (name)
-			printf ("%.3s	 %s%n", opcodes[opcode].syntax, *name, &num);
-		else
-			printf (opcodes[opcode].syntax, uval, &num);
-	}
-	else
-		if (opcodes[opcode].mode == PC_RELATIVE_LONG)
-		{
-			printf (opcodes[opcode].syntax, (unsigned short)(omf->counter + sval + 2), &tmp);
-			num = tmp;
-			printf ("   {%c%0.4x}%n", (sval < 0 ? '-' : '+'),
-				(unsigned short)(sval > 0 ? sval : -sval), &num);
-			num += tmp;
-		}
-		else
-			printf (opcodes[opcode].syntax, uval, &num);
-
-	print_hex_ascii (opcode, uval, 3, num);
-}
-
-unsigned long
-parse_inline_3 (HEADER *omf, LABEL *lab, unsigned short toolnum, unsigned long count)
-{
-	Handle name = NULL;
-	enum assembler tmp_asm = assembler;
-	unsigned char callnum;
-	unsigned short parmblock;
-	unsigned long mark;
-
-	if (toolnum != PRODOS_MLI)
-		return (count);
-
-	mark = GSOSget_mark (omf->refNum);
-	switch (count)
-	{
-		case 3:
-			return (count);
-			break;
-
-		case 4:
-			read_char (omf->refNum, callnum);
-			name = LoadResource (rGSOS, (Longword)callnum);
-			if (!name)
-			{
-				GSOSset_mark (omf->refNum, mark);
-				return (count);
-			}
-			++omf->displacement;
-			++omf->counter;
-			printf ("_%s ", *name);
-			assembler = merlin;
-			parse_expr_asm (omf, lab, DC);
-			assembler = tmp_asm;
-			return (3);
-			break;
-
-		default:
-			read_char (omf->refNum, callnum);
-			read_int (omf->refNum, parmblock);
-			name = LoadResource (rGSOS, (Longword)callnum);
-			if (!name)
-			{
-				GSOSset_mark (omf->refNum, mark);
-				return (count);
-			}
-			printf ("_%s $%x\n", *name, parmblock);
-			omf->displacement += 3;
-			omf->counter += 3;
-			return (count -= 3);
-			break;
-	}
-}
-
-unsigned long
-parse_stack (HEADER *omf, unsigned char opcode, unsigned short callnum, unsigned long count)
-{
-	unsigned long mark, toolnum = 0;
-	signed short sval = callnum;
-	unsigned char jsl;
-
-	if (count >= 7)
-	{
-		mark = GSOSget_mark (omf->refNum);
-		read_char (omf->refNum, jsl);
-		GSOSread (omf->refNum, &toolnum, 3);
-		if (tool && jsl == JSL && (toolnum == GSOS_STACK || toolnum == TOOL_STACK || toolnum == TOOL_STACK_ALT))
-		{
-			Handle name = NULL;
-
-			if (toolnum == GSOS_STACK)
-				name = LoadResource (rGSOS, (Longword)callnum);
-			else
-				name = LoadResource (rTool, (Longword)callnum);
-
-			if (name)
-			{
-				omf->displacement += 4;
-				omf->counter += 4;
-				printf ("_%s\n", *name);
-				count -= 4;
-			}
-			else
-			{
-				GSOSset_mark (omf->refNum, mark);
-				print_opcode_3 (omf, opcode, sval);
-			}
-		}
-		else
-		{
-			GSOSset_mark (omf->refNum, mark);
-			print_opcode_3 (omf, opcode, sval);
-		}
-	}
-	else
-		print_opcode_3 (omf, opcode, sval);
-
-	return (count);
-}
-
-unsigned long
-parse_opcode_4 (HEADER *omf, LABEL *lab, unsigned long count, unsigned char opcode)
-{
-	unsigned long val = 0, tmp;
-
-	if (count >= 4)
-	{
-		omf->displacement += 4;
-		omf->counter += 4;
-		GSOSread (omf->refNum, &val, 3);
-		if (tool && opcode == JSL)
-		{
-			tmp = parse_inline_4 (omf, lab, val, count);
-			if (tmp == count)
-				print_opcode_4 (omf, opcode, val);
-			else
-				count = tmp;
-		}
-		else
-			print_opcode_4 (omf, opcode, val);
-
-		return (count -= 4);
-	}
-	else
-		if ((omf->counter + 4) >= omf->length)
-			print_byte (omf, count, opcode);
-		else
-			parse_expr_asm (omf, lab, opcode);
-
-	return (0);
-}
-
-void
-print_opcode_4 (HEADER *omf, unsigned char opcode, unsigned long val)
-{
-	unsigned int num;
-	unsigned char bank;
-	unsigned short addr;
-	Handle name = NULL;
-
-	if (tool && opcodes[opcode].mode == ABSOLUTE_LONG)
-	{
-		bank = (char)((val & 0xff0000) >> 16);
-		addr = (unsigned short)(val & 0x00ffff);
-		if (bank == 0xe0)
-			name = LoadResource (rROM, (Longword)addr);
-		else
-			name = LoadResource (rROM, val);
-		if (name)
-			printf ("%.7s%s%s%n", opcodes[opcode].syntax,
-				bank == 0xe0 ? "e0_" : "", *name, &num);
-		else
-			printf (opcodes[opcode].syntax, (assembler == merlin ? '|' : '>'), val, &num);
-	}
-	else
-		printf (opcodes[opcode].syntax, (assembler == merlin ? '|' : '>'), val, &num);
-
-	print_hex_ascii (opcode, val, 4, num);
-}
-
-unsigned long
-parse_inline_4 (HEADER *omf, LABEL *lab, unsigned long toolnum, unsigned long count)
-{
-	Handle name = NULL;
-	enum assembler tmp_asm = assembler;
-	unsigned short callnum;
-	unsigned long parmblock, mark;
-
-	if (toolnum != GSOS_INLINE)
-		return (count);
-
-	mark = GSOSget_mark (omf->refNum);
-	switch (count)
-	{
-		case 4:
-			return (count);
-			break;
-
-		case 6:
-			read_int (omf->refNum, callnum);
-			name = LoadResource (rGSOS, (Longword)callnum);
-			if (!name)
-			{
-				GSOSset_mark (omf->refNum, mark);
-				return (count);
-			}
-			omf->displacement += 2;
-			omf->counter += 2;
-			printf ("_%s ", *name);
-			assembler = merlin;
-			parse_expr_asm (omf, lab, DC);
-			assembler = tmp_asm;
-			return (4);
-			break;
-
-		default:
-			read_int (omf->refNum, callnum);
-			read_long (omf->refNum, parmblock);
-			name = LoadResource (rGSOS, (Longword)callnum);
-			if (!name)
-			{
-				GSOSset_mark (omf->refNum, mark);
-				return (count);
-			}
-			printf ("_%s $%lx\n", *name, parmblock);
-			omf->displacement += 6;
-			omf->counter += 6;
-			return (count -= 6);
-			break;
-	}
-}
-
-void
-print_hex_ascii (unsigned char opcode, unsigned long val, unsigned short bytes, unsigned int num)
-{
-	unsigned char val1 = val;
-	unsigned short val2 = val;
-	unsigned long val4 = val;
-
-	if (!hex)
-	{
-		putchar ('\n');
-		return;
-	}
-
-	printf ("%*c", 33 - num, ' ');
-	switch (bytes)
-	{
-		case 1:
-			printf ("%0.2x		- ", (unsigned short)opcode);
-			if (isprint (opcode))
-				putchar (opcode);
-			else
-				putchar ('.');
-			break;
-
-		case 2:
-			printf ("%0.2x %0.2x	   - ", (unsigned short)opcode,
-				(unsigned short)val1);
-			if (isprint (opcode))
-				putchar (opcode);
-			else
-				putchar ('.');
-			if (isprint (val1))
-				putchar (val1);
-			else
-				putchar ('.');
-			break;
-
-		case 3:
-			printf ("%0.2x %0.2x %0.2x    - ", (unsigned short)opcode,
-				val2 & 0x00ff, (val2 & 0xff00) >> 8);
-			if (isprint (opcode))
-				putchar (opcode);
-			else
-				putchar ('.');
-			if (isprint ((char)(val2 & 0x00ff)))
-				putchar ((char)(val2 & 0x00ff));
-			else
-				putchar ('.');
-			if (isprint ((char)((val2 & 0xff00) >> 8)))
-				putchar ((char)((val2 & 0xff00) >> 8));
-			else
-				putchar ('.');
-			break;
-
-		case 4:
-			printf ("%0.2x %0.2lx %0.2lx %0.2lx - ", (unsigned short)opcode,
-				val4 & 0x0000ff, (val4 & 0x00ff00) >> 8, (val4 & 0xff0000) >> 16);
-			if (isprint (opcode))
-				putchar (opcode);
-			else
-				putchar ('.');
-			if (isprint ((char)(val4 & 0x0000ff)))
-				putchar ((char)(val4 & 0x0000ff));
-			else
-				putchar ('.');
-			if (isprint ((char)((val4 & 0x00ff00) >> 8)))
-				putchar ((char)((val4 & 0x00ff00) >> 8));
-			else
-				putchar ('.');
-			if (isprint ((char)((val4 & 0xff0000) >> 16)))
-				putchar ((char)((val4 & 0xff0000) >> 16));
-			else
-				putchar ('.');
-			break;
-	}
-
-	putchar ('\n');
-}
-
-void
-parse_expr_asm (HEADER *omf, LABEL *lab, unsigned short opcode)
-{
-	unsigned char record;
-	unsigned short n;
-	char *syntax, *str;
-
-	read_char (omf->refNum, record);
-	if (recognize_record (record))
-	{
-		print_byte (omf, 1, opcode);
-
-		if (!nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-		n = parse_record (omf, lab, record, FALSE, 0);
-		if (n > 0)
-			puts (assembler == merlin ? "" : "\'");
-	}
-	else
-		if (opcode != DC)
-		{
-			enum assembler tmp = assembler;
-
-			switch (opcodes[opcode].mode)
-			{
-				case ABSOLUTE_LONG:
-				case ABSOLUTE_LONG_INDEX_X:
-					syntax = opcodes[opcode].syntax;
-					str = strchr (syntax, '%');
-					printf ("%.*s %c", (int)(str - syntax - 1), syntax, assembler == merlin ? '|' : '>');
-					assembler = merlin;
-					n = parse_record (omf, lab, record, FALSE, 0);
-					str = strchr (str, 'x');
-					if (strlen (str) - 3)
-						printf ("%.*s", (int)(strlen (str) - 3), str + 1);
-					putchar ('\n');
-					break;
-
-				case BLOCK_MOVE:
-					assembler = merlin;
-					syntax = opcodes[opcode].syntax;
-					str = strchr (syntax, '%');
-					printf ("%.*s", (int)(str - syntax - 1), syntax);
-					n = parse_record (omf, lab, record, FALSE, 0);
-					printf (", ");
-					read_char (omf->refNum, record);
-					n = parse_record (omf, lab, record, FALSE, n + 2);
-					putchar ('\n');
-					break;
-
-				default:
-					assembler = merlin;
-					syntax = opcodes[opcode].syntax;
-					str = strchr (syntax, '%');
-					printf ("%.*s", (int)(str - syntax - 1), syntax);
-					parse_record (omf, lab, record, FALSE, 0);
-					str = strchr (str, 'x');
-					if (strlen (str) - 3)
-						printf ("%.*s", (int)(strlen (str) - 3), str + 1);
-					putchar ('\n');
-					break;
-			}
-
-			assembler = tmp;
-			++omf->counter;
-		}
-		else
-		{
-			n = parse_record (omf, lab, record, FALSE, 0);
-			if (n > 0)
-				putchar ('\n');
-		}
-
-	++omf->displacement;
-}
-
-void
-print_byte (HEADER *omf, unsigned long count, unsigned char opcode)
-{
-	unsigned char val;
-	unsigned short num = 2, i, j = count;
-	char ptr[5];
-
-	omf->displacement += count;
-	omf->counter += count;
-	if (assembler == merlin)
-		printf ("hex	%0.2x", (unsigned short)opcode);
-	else
-		printf ("dc	h'%0.2x", (unsigned short)opcode);
-
-	ptr[count] = opcode;
-	while (--count)
-	{
-		read_char (omf->refNum, val);
-		printf ("%0.2x", (unsigned short)val);
-		ptr[count] = val;
-		num += 2;
-	}
-
-	if (assembler == orca)
-		putchar ('\'');
-	if (hex)
-	{
-		printf ("%*c", 26 - num - (assembler == merlin ? 0 : 2), ' ');
-		for (i = j; i > 0; --i)
-			printf ("%0.2x ", (unsigned short)ptr[i]);
-		printf ("%*c- ", (int)(12 - (3 * j)), ' ');
-		for (i = j; i > 0; --i)
-			if (isprint (ptr[i]))
-				putchar (ptr[i]);
-			else
-				putchar ('.');
-	}
-
-	putchar ('\n');
-}
-
-void
-parse_rep_sep (HEADER *omf, unsigned char opcode, unsigned char val)
-{
-	switch (opcode)
-	{
-		case REP:
-			if (val & LONGA)
-			{
-				shorta = FALSE;
-				if (assembler == orca)
-					asm_status_bit (omf, LONGA);
-			}
-			if (val & LONGI)
-			{
-				shorti = FALSE;
-				if (assembler == orca)
-					asm_status_bit (omf, LONGI);
-			}
-			if (assembler == merlin)
-				asm_status_bit (omf, LONGA);
-			break;
-
-		case SEP:
-			if (val & LONGA)
-			{
-				shorta = TRUE;
-				if (assembler == orca)
-					asm_status_bit (omf, LONGA);
-			}
-			if (val & LONGI)
-			{
-				shorti = TRUE;
-				if (assembler == orca)
-					asm_status_bit (omf, LONGI);
-			}
-			if (assembler == merlin)
-				asm_status_bit (omf, LONGI);
-			break;
-	}
-}
-
-void
-parse_segment_hex (HEADER *omf)
-{
-	unsigned long num = omf->offset;
-
-	if (omf->version == 1)
-		num += (512 * omf->bytecnt);
-	else
-		num += omf->bytecnt;
-
-	while (omf->displacement <= num)
-	{
-		unsigned short loop;
-		Longword tmp;
-		char ptr[20];
-
-		if (key ())
-			bye (omf);
-
-		tmp = GSOSread (omf->refNum, ptr, 15);
-		if (toolerror () || (tmp == 0))
-			break;
-
-		printf ("%0.6lx | ", omf->displacement);
-		omf->displacement += tmp;
-
-		for (loop = 0; loop < tmp; ++loop)
-			printf ("%0.2x ", (unsigned short)ptr[loop]);
-
-		printf ("%*s", (int)(3 * (15 - tmp) + 2), "- ");
-
-		for (loop = 0; loop < tmp; ++loop)
-		{
-			if (isprint (ptr[loop]))
-				putchar (ptr[loop]);
-			else
-				putchar ('.');
-		}
-		putchar ('\n');
-	}
-	putchar ('\n');
-}
-
-void
-parse_segment (HEADER *omf, LABEL *lab)
-{
-	unsigned char record;
-
-	if (assembly)
-		display_header_asm (omf);
-
-	GSOSset_mark (omf->refNum, omf->displacement);
-	do
-	{
-		if (key ())
-			bye (omf);
-
-		if (!nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-		read_char (omf->refNum, record);
-		++omf->displacement;
-		parse_record (omf, lab, record, TRUE, 0);
-	} while (record != END);
-
-	if (assembly)
-		printf ("%14s\n\n", "end");
-	else
-		puts ("END	(00)\n");
-
-	delete_labels (lab, LOCAL);
-}
-
-unsigned short
-parse_record (HEADER *omf, LABEL *lab, unsigned char record, unsigned short space, unsigned short n)
-{
-	unsigned char truncate_size;
-
-	switch (record)
-	{
-		case END:
-			break;
-
-		case USING:
-			parse_USING (omf, record);
-			break;
-
-		case STRONG:
-			parse_STRONG (omf, lab, record);
-			break;
-
-		case GLOBAL:
-		case LOCAL:
-			parse_GLOBAL_LOCAL (omf, lab, record);
-			break;
-
-		case GEQU:
-		case EQU:
-			n = parse_GEQU_EQU (omf, lab, record, n);
-			break;
-
-		case MEM:
-			n = parse_MEM (omf, lab, record, n);
-			break;
-
-		case EXPR:
-		case BEXPR:
-		case LEXPR:
-		case RELEXPR:
-			if (record == EXPR || record == BEXPR || record == LEXPR)
-				truncate_size = parse_EXPR_BEXPR_LEXPR (omf, record);
-			else
-				truncate_size = parse_RELEXPR (omf, record);
-
-			if (assembly && space)
-			{
-				printf ("	    %s", assembler == merlin ? "db     " : "dc	   i");
-				if (assembler == orca)
-					printf ("%u\'", (unsigned short)truncate_size);
-			}
-			n = parse_expr (omf, lab, n);
-			if (assembly && space && (n > 0))
-				puts (assembler == merlin ? "" : "\'");
-			omf->counter += truncate_size;
-			break;
-
-		case DS:
-			if (assembly)
-				printf ("	    ");
-			parse_DS (omf, record);
-			break;
-
-		case LCONST:
-			if (assembly)
-				parse_CONST_asm (omf, lab, record);
-			else
-				parse_CONST (omf, record);
-			break;
-
-		default:
-			if (assembly)
-				parse_CONST_asm (omf, lab, record);
-			else
-				parse_CONST (omf, record);
-			break;
-	}
-
-	return (n);
-}
-
-void
-parse_CONST (HEADER *omf, unsigned char record)
-{
-	unsigned long count, outer = 0, i, j;
-	unsigned short edge;
-	char ptr[CONST_EDGE + CONST_EDGE];
-
-	if (record == LCONST)
-	{
-		printf ("LCONST   (%0.2x) | ", (unsigned short)record);
-		read_long (omf->refNum, count);
-		omf->displacement += 4;
-	}
-	else
-	{
-		printf ("CONST	  (%0.2x) | ", (unsigned short)record);
-		count = record;
-	}
-
-	edge = CONST_EDGE + (nooffset == TRUE ? 5 : 0);
-	while (outer < count)
-	{
-		unsigned short tmp_num = 0, num = 0, inner = 0;
-
-		if (key ())
-			bye (omf);
-
-		j = outer + edge;
-		for (i = outer; i < j && i < count; ++i)
-		{
-			read_char (omf->refNum, ptr[inner]);
-			printf ("%0.2x %n", (unsigned short)ptr[inner++], &num);
-			tmp_num += num;
-		}
-
-		printf ("%*s", (3 * edge) + 2 - tmp_num, "- ");
-		for (i = 0; i < inner; ++i)
-			putchar (isprint (ptr[i]) ? ptr[i] : '.');
-		putchar ('\n');
-
-		outer += inner;
-		omf->counter += inner;
-		omf->displacement += inner;
-
-		if (outer < count)
-		{
-			if (!nooffset)
-				printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-			printf ("%15c ", '|');
-		}
-	}
-}
-
-void
-parse_CONST_asm (HEADER *omf, LABEL *lab, unsigned char record)
-{
-	unsigned long count;
-
-	if (record == LCONST)
-	{
-		read_long (omf->refNum, count);
-		omf->displacement += 4;
-	}
-	else
-		count = record;
-
-	while (count)
-	{
-		unsigned char opcode;
-
-		if (key ())
-			bye (omf);
-
-		read_char (omf->refNum, opcode);
-		++omf->displacement;
-
-		printf ("	    ");
-		switch (opcodes[opcode].bytes)
-		{
-			case 1:
-				parse_opcode_1 (omf, opcode);
-				--count;
-				break;
-
-			case 2:
-				count = parse_opcode_2 (omf, lab, count, opcode);
-				break;
-
-			case 3:
-				count = parse_opcode_3 (omf, lab, count, opcode);
-				break;
-
-			case 4:
-				count = parse_opcode_4 (omf, lab, count, opcode);
-				break;
-		}
-
-		if (count && !nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-	}
-}
-
-unsigned short
-recognize_record (unsigned char record)
-{
-	switch (record)
-	{
-		case USING:
-		case STRONG:
-		case GLOBAL:
-		case GEQU:
-		case MEM:
-		case LOCAL:
-		case EQU:
-		case DS:
-		case LCONST:
-			return (TRUE);
-			break;
-
-		default:
-			return (FALSE);
-			break;
-	}
-}
-
-void
-parse_USING (HEADER *omf, unsigned char record)
-{
-	unsigned char length;
-	char *name;
-
-	read_char (omf->refNum, length);
-	name = malloc (length + 1);
-	GSOSread (omf->refNum, name, length);
-	name[length] = '\0';
-
-	if (!assembly)
-		printf ("USING	  (%0.2x) | %s\n", (unsigned short)record, name);
-	else
-		printf ("	    using  %s\n", name);
-
-	free (name);
-	omf->displacement += length + 1;
-}
-
-void
-parse_STRONG (HEADER *omf, LABEL *lab, unsigned char record)
-{
-	unsigned char length;
-	char *name, *str;
-
-	str = malloc (strlen (omf->segname) + (sizeof (long) * 2) + 5);
-	sprintf (str, "(%s+$%lx)", omf->segname, omf->counter);
-	if (!match_label (lab, str) && assembly)
-		printf ("%11c", ' ');
-
-	read_char (omf->refNum, length);
-	name = malloc (length + 1);
-	GSOSread (omf->refNum, name, length);
-	name[length] = '\0';
-
-	if (!assembly)
-		printf ("STRONG   (%0.2x) | %s\n", (unsigned short)record, name);
-	else
-		printf ("dc	r'%s'\n", name);
-
-	free (str);
-	free (name);
-	omf->displacement += length;
-}
-
-void
-parse_GLOBAL_LOCAL (HEADER *omf, LABEL *lab, unsigned char record)
-{
-	unsigned char length, type, private;
-	char *name;
-
-	read_char (omf->refNum, length);
-	name = malloc (length + 1);
-	GSOSread (omf->refNum, name, length);
-	name[length] = '\0';
-
-	if (label)
-	{
-		char *expr;
-
-		expr = malloc (strlen (omf->segname) + (sizeof (long) * 2) + 5);
-		sprintf (expr, "(%s+$%lx)", omf->segname, omf->counter);
-		add_label (lab, name, expr, record);
-	}
-	read_char (omf->refNum, length);
-	read_char (omf->refNum, type);
-	read_char (omf->refNum, private);
-
-	if (!assembly)
-	{
-		printf ("%s   (%0.2x) | %s\n", record == GLOBAL ? "GLOBAL" : "LOCAL ", (unsigned short)record, name);
-		if (!nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-		printf ("%15c len: %0.2x, type: %c", '|', (unsigned short)length, type);
-		if (private)
-			printf (", private");
-		putchar ('\n');
-	}
-	else
-		parse_type_attribute (omf, lab, type, name, length);
-
-	if (!label)
-		free (name);
-	omf->displacement += length + 4;
-}
-
-void
-parse_type_attribute (HEADER *omf, LABEL *lab, unsigned char type, char *name, unsigned char length)
-{
-	switch (type)
-	{
-		case 'A':
-			parse_GLOBAL_type_A (omf, lab, name, length);
-			break;
-
-		case 'C':
-			parse_GLOBAL_type_C (omf, lab, name);
-			break;
-
-		case 'D':
-			parse_GLOBAL_type_D (omf, lab, name);
-			break;
-
-		case 'F':
-			parse_GLOBAL_type_F (omf, lab, name);
-			break;
-
-		case 'H':
-			parse_GLOBAL_type_H (omf, lab, name);
-			break;
-
-		case 'I':
-			parse_GLOBAL_type_I (omf, lab, name, length);
-			break;
-
-		case 'K':
-			parse_GLOBAL_type_K (omf, lab, name);
-			break;
-
-		case 'L':
-			parse_GLOBAL_type_L (omf, lab, name, length);
-			break;
-
-		case 'N':
-			parse_GLOBAL_type_N (omf, lab, name);
-			break;
-
-		case 'S':
-			parse_GLOBAL_type_S (omf, name);
-			break;
-	}
-}
-
-void
-parse_GLOBAL_type_A (HEADER *omf, LABEL *lab, char *name, unsigned char length)
-{
-	unsigned char record;
-
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	printf ("%s", assembler == merlin ? "db     " : "dc	a");
-	read_char (omf->refNum, record);
-	if (assembler == orca)
-		if (record >= 0x01 && record <= 0xdf)
-			putchar ('\'');
-		else
-			printf ("%u\'", (unsigned short)length);
-
-	parse_GLOBAL_type (omf, lab, record);
-}
-
-void
-parse_GLOBAL_type_C (HEADER *omf, LABEL *lab, char *name)
-{
-	unsigned char record;
-
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	read_char (omf->refNum, record);
-	if (record != DS)
-		printf ("%s", assembler == merlin ? "asc    \'" : "dc	  c\'");
-
-	if (!parse_GLOBAL_type (omf, lab, record))
-	{
-		unsigned char i, j, num, outer = 0;
-		unsigned short edge;
-
-		edge = CHAR_EDGE + (nooffset == TRUE ? 16 : 0);
-		while (outer < record)
-		{
-			j = outer + edge;
-			for (i = outer; i < j && i < record; ++i)
-			{
-				read_char (omf->refNum, num);
-				putchar (num);
-			}
-
-			puts ("\'");
-			omf->displacement += i - outer;
-			omf->counter += i - outer;
-			outer = i;
-			if (outer < record)
-			{
-				if (!nooffset)
-					printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-				printf ("	    %s", assembler == merlin ? "asc    \'" : "dc     c\'");
-			}
-		}
-	}
-}
-
-void
-parse_GLOBAL_type_D (HEADER *omf, LABEL *lab, char *name)
-{
-	unsigned char record;
-	enum assembler tmp_asm;
-
-	tmp_asm = assembler;
-	assembler = orca;
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	printf ("dc	d\'");
-
-	read_char (omf->refNum, record);
-	if (!parse_GLOBAL_type (omf, lab, record))
-	{
-		unsigned short num_char = 0, edge;
-		unsigned int tmp;
-		unsigned char outer = 0;
-		double num;
-
-		edge = DOUBLE_EDGE + (nooffset == TRUE ? 16 : 0);
-		record /= sizeof (double);
-		while (outer++ < record)
-		{
-			GSOSread (omf->refNum, &num, sizeof (double));
-			printf ("%g%n", num, &tmp);
-			num_char += tmp;
-
-			omf->displacement += sizeof (double);
-			omf->counter += sizeof (double);
-			if (num_char > edge)
-			{
-				puts ("\'");
-				num_char = 0;
-				if (outer < record)
-				{
-					if (!nooffset)
-						printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-					printf ("	    dc	   d\'");
-				}
-			}
-			else
-				if (outer < record)
-					putchar (',');
-		}
-		if (num_char)
-			puts ("\'");
-	}
-
-	assembler = tmp_asm;
-}
-
-void
-parse_GLOBAL_type_F (HEADER *omf, LABEL *lab, char *name)
-{
-	unsigned char record;
-	enum assembler tmp_asm;
-
-	tmp_asm = assembler;
-	assembler = orca;
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	printf ("dc	f\'");
-
-	read_char (omf->refNum, record);
-	if (!parse_GLOBAL_type (omf, lab, record))
-	{
-		unsigned short num_char = 0, edge;
-		unsigned int tmp;
-		unsigned char outer = 0;
-		float num;
-
-		edge = FLOAT_EDGE + (nooffset == TRUE ? 16 : 0);
-		record /= sizeof (float);
-		while (outer++ < record)
-		{
-			GSOSread (omf->refNum, &num, sizeof (float));
-			printf ("%g%n", num, &tmp);
-			num_char += tmp;
-
-			omf->displacement += sizeof (float);
-			omf->counter += sizeof (float);
-			if (num_char > edge)
-			{
-				puts ("\'");
-				num_char = 0;
-				if (outer < record)
-				{
-					if (!nooffset)
-						printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-					printf ("	    dc	   f\'");
-				}
-			}
-			else
-				if (outer < record)
-					putchar (',');
-		}
-		if (num_char)
-			puts ("\'");
-	}
-
-	assembler = tmp_asm;
-}
-
-void
-parse_GLOBAL_type_H (HEADER *omf, LABEL *lab, char *name)
-{
-	unsigned char record;
-
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	printf ("%s", assembler == merlin ? "hex    " : "dc	h\'");
-
-	read_char (omf->refNum, record);
-	if (!parse_GLOBAL_type (omf, lab, record))
-	{
-		unsigned char i, j, num, outer = 0;
-		unsigned short edge;
-
-		edge = HEX_EDGE + (nooffset == TRUE ? 16 : 0);
-		while (outer < record)
-		{
-			j = outer + edge;
-			for (i = outer; i < j && i < record; ++i)
-			{
-				read_char (omf->refNum, num);
-				printf ("%0.2x", (unsigned short)num);
-			}
-
-			puts (assembler == merlin ? "" : "\'");
-			omf->displacement += i - outer;
-			omf->counter += i - outer;
-			outer = i;
-			if (outer < record)
-			{
-				if (!nooffset)
-					printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-				printf ("	    %s", assembler == merlin ? "hex    " : "dc	   h\'");
-			}
-		}
-	}
-}
-
-void
-parse_GLOBAL_type_I (HEADER *omf, LABEL *lab, char *name, unsigned char length)
-{
-	unsigned char record;
-
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	printf ("%s", assembler == merlin ? "db     " : "dc	i");
-	read_char (omf->refNum, record);
-	if (assembler == orca)
-		if (record >= 0x01 && record <= 0xdf)
-			putchar ('\'');
-		else
-			printf ("%u\'", (unsigned short)length);
-
-	if (!parse_GLOBAL_type (omf, lab, record))
-	{
-		unsigned short num_char = 0, edge;
-		unsigned int tmp;
-		unsigned char outer = 0;
-		signed char num;
-
-		edge = INT_EDGE + (nooffset == TRUE ? 16 : 0);
-		while (outer++ < record)
-		{
-			read_char (omf->refNum, num);
-			printf ("%d%n", (short)num, &tmp);
-			num_char += tmp;
-
-			++omf->displacement;
-			++omf->counter;
-			if (num_char > edge)
-			{
-				puts (assembler == merlin ? "" : "\'");
-				num_char = 0;
-				if (outer < record)
-				{
-					if (!nooffset)
-						printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-					printf ("	    %s", assembler == merlin ? "db     " : "dc	   i\'");
-				}
-			}
-			else
-				if (outer < record)
-					putchar (',');
-		}
-		if (num_char)
-			puts (assembler == merlin ? "" : "\'");
-	}
-}
-
-void
-parse_GLOBAL_type_K (HEADER *omf, LABEL *lab, char *name)
-{
-	unsigned char record;
-
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	read_char (omf->refNum, record);
-	parse_STRONG (omf, lab, record);
-}
-
-void
-parse_GLOBAL_type_L (HEADER *omf, LABEL *lab, char *name, unsigned char length)
-{
-	unsigned char record;
-	enum assembler tmp_asm;
-
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	printf ("dc	s");
-	read_char (omf->refNum, record);
-	if (record >= 0x01 && record <= 0xdf)
-		putchar ('\'');
-	else
-		printf ("%u\'", (unsigned short)length);
-
-	tmp_asm = assembler;
-	assembler = orca;
-	parse_GLOBAL_type (omf, lab, record);
-	assembler == tmp_asm;
-}
-
-void
-parse_GLOBAL_type_N (HEADER *omf, LABEL *lab, char *name)
-{
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	printf ("%s\n", assembler == merlin ? "equ    *" : "entry");
-	if (label)
-	{
-		char *expr;
-
-		expr = malloc (strlen (omf->segname) + (sizeof (long) * 2) + 5);
-		sprintf (expr, "(%s+$%lx)", omf->segname, omf->counter);
-		add_label (lab, name, expr, GLOBAL);
-	}
-}
-
-void
-parse_GLOBAL_type_S (HEADER *omf, char *name)
-{
-	unsigned long num;
-	unsigned char val;
-
-	printf ("%-11s", name);
-	if (strlen (name) >= 11)
-		putchar (' ');
-	read_char (omf->refNum, val);
-	read_long (omf->refNum, num);
-	printf ("ds	%lu\n", num);
-	omf->displacement += num;
-	omf->counter += num;
-}
-
-unsigned short
-parse_GLOBAL_type (HEADER *omf, LABEL *lab, unsigned char record)
-{
-	unsigned short n;
-
-	switch (record)
-	{
-		case EXPR:
-		case BEXPR:
-		case RELEXPR:
-		case LEXPR:
-			n = parse_record (omf, lab, record, FALSE, 0);
-			if (assembler == orca)
-				putchar ('\'');
-			if (assembly && (n > 0))
-				putchar ('\n');
-			break;
-
-		case DS:
-			parse_DS (omf, record);
-			break;
-
-		default:
-			return (FALSE);
-			break;
-	}
-
-	return (TRUE);
-}
-
-unsigned short
-parse_GEQU_EQU (HEADER *omf, LABEL *lab, unsigned char record, unsigned short n)
-{
-	unsigned char length, type, private;
-	enum assembler tmp_asm = assembler;
-	char *name;
-
-	read_char (omf->refNum, length);
-	name = malloc (length + 1);
-	GSOSread (omf->refNum, name, length);
-	name[length] = '\0';
-	read_char (omf->refNum, length);
-	read_char (omf->refNum, type);
-	read_char (omf->refNum, private);
-
-	if (!assembly)
-	{
-		printf ("%s	(%0.2x) | %s\n", record == GEQU ? "GEQU" : "EQU ", (unsigned short)record, name);
-		if (!nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-		printf ("%15c len: %0.2x, type: %c", '|', (unsigned short)length, type);
-		if (private)
-			printf (", private");
-		putchar ('\n');
-		parse_expr (omf, lab, n);
-	}
-	else
-	{
-		printf ("%-11s%s   ", name, record == GLOBAL ? "gequ" : "equ ");
-		++omf->displacement;
-		assembler = merlin;
-		n = parse_expr (omf, lab, n);
-		if (n > 0)
-			putchar ('\n');
-		assembler = tmp_asm;
-	}
-
-	free (name);
-	omf->displacement += length + 4;
-	return (n);
-}
-
-unsigned short
-parse_MEM (HEADER *omf, LABEL *lab, unsigned char record, unsigned short n)
-{
-	unsigned long adr1, adr2;
-
-	read_long (omf->refNum, adr1);
-	read_long (omf->refNum, adr2);
-
-	if (!assembly)
-	{
-		printf ("MEM	  (%0.2x) | reserve: ", (unsigned short)record);
-		printf ("$%0.2x/%0.4x - ",
-			(unsigned short)((adr1 & 0xff0000) >> 16),
-			(unsigned short)(adr1 & 0xffff));
-		printf ("$%0.2x/%0.4x\n",
-			(unsigned short)((adr2 & 0xff0000) >> 16),
-			(unsigned short)(adr2 & 0xffff));
-		n = parse_expr (omf, lab, n);
-	}
-	else
-		printf ("%14s	 $%lx,$%lx\n", "mem", adr1, adr2);
-
-	omf->displacement += 8;
-	return (n);
-}
-
-unsigned char
-parse_EXPR_BEXPR_LEXPR (HEADER *omf, unsigned char record)
-{
-	unsigned char truncate_size;
-
-	read_char (omf->refNum, truncate_size);
-	if (!assembly)
-	{
-		switch (record)
-		{
-			case EXPR:
-				printf ("EXPR ");
-				break;
-
-			case BEXPR:
-				printf ("BEXPR");
-				break;
-
-			case LEXPR:
-				printf ("LEXPR");
-				break;
-		}
-		printf ("    (%0.2x) | truncate result to %u %s\n",
-			(unsigned short)record, (unsigned short)truncate_size,
-			(truncate_size == 1 ? "byte" : "bytes"));
-	}
-
-	++omf->displacement;
-	return (truncate_size);
-}
-
-unsigned char
-parse_RELEXPR (HEADER *omf, unsigned char record)
-{
-	unsigned char truncate_size;
-	long offset;
-
-	read_char (omf->refNum, truncate_size);
-	if (!assembly)
-		printf ("RELEXPR  (%0.2x) | truncate result to %u %s\n",
-			(unsigned short)record, (unsigned short)truncate_size,
-			(truncate_size == 1 ? "byte" : "bytes"));
-
-	read_long (omf->refNum, offset);
-	omf->displacement += 5;
-	if (!assembly)
-	{
-		if (!nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-		printf ("%15c offset: $%0.8x\n", '|', offset);
-	}
-
-	return (truncate_size);
-}
-
-void
-parse_DS (HEADER *omf, unsigned char record)
-{
-	unsigned long num_zeros;
-
-	read_long (omf->refNum, num_zeros);
-	if (!assembly)
-		printf ("DS	  (%0.2x) | insert %lu %s\n",
-			(unsigned short)record, num_zeros,
-			(num_zeros > 1 ? "zeros" : "zero"));
-	else
-		printf ("ds	%lu\n", num_zeros);
-
-	omf->displacement += 5;
-	omf->counter += num_zeros;
-}
-
-unsigned short
-parse_expr (HEADER *omf, LABEL *lab, unsigned short n)
-{
-	LIST list = { 0, NULL, NULL };
-	unsigned char expr;
-	unsigned long num;
-
-	do
-	{
-		read_char (omf->refNum, expr);
-		++omf->displacement;
-
-		switch (expr)
-		{
-			case LABEL_WEAK:
-				parse_expr_weak_reference (omf, &list);
-				break;
-
-			case LABEL_VALUE:
-				parse_expr_label_value (omf, &list);
-				break;
-
-			case RELATIVE_OFFSET:
-				num = parse_expr_relative_offset (omf, &list);
-				break;
-
-			case CONSTANT_OPERAND:
-				num = parse_expr_constant_operand (omf, &list);
-				break;
-
-			case ADD:
-			case SUB:
-			case MUL:
-			case DIV:
-			case MOD:
-			case NEGATION:
-			case BIT_SHIFT:
-			case AND:
-			case OR:
-			case EOR:
-			case NOT:
-			case LESS_EQUAL:
-			case GREATER_EQUAL:
-			case NOT_EQUAL:
-			case LESS:
-			case GREATER:
-			case EQUAL:
-			case LOGICAL_AND:
-			case INCLUSIVE_OR:
-			case EXCLUSIVE_OR:
-			case COMPLEMENT:
-				push (&list, NULL, expr);
-				break;
-		}
-	} while (expr != END);
-
-	if (infix)
-		n = print_stack_infix (omf, &list, lab, n);
-	else
-		n = print_stack_postfix (omf, list.stack, lab, n);
-	delete_stack (list.stack);
-	return (n);
-}
-
-void
-parse_expr_weak_reference (HEADER *omf, LIST *list)
-{
-	char *ptr;
-	unsigned char num;
-
-	read_char (omf->refNum, num);
-	omf->displacement += num;
-	ptr = malloc (num + 1);
-	GSOSread (omf->refNum, ptr, num);
-	ptr[num] = '\0';
-
-	if (assembly)
-		push (list, ptr, 0);
-	else
-	{
-		char *str;
-
-		str = malloc (strlen (ptr) + 8);
-		strcpy (str, "weak (");
-		strcat (str, ptr);
-		strcat (str, ")");
-		push (list, str, 0);
-		free (str);
-	}
-
-	free (ptr);
-}
-
-void
-parse_expr_label_value (HEADER *omf, LIST *list)
-{
-	char *ptr;
-	unsigned char num;
-
-	read_char (omf->refNum, num);
-	omf->displacement += num;
-	ptr = malloc (num + 1);
-	GSOSread (omf->refNum, ptr, num);
-	ptr[num] = '\0';
-	push (list, ptr, 0);
-	free (ptr);
-}
-
-unsigned long
-parse_expr_relative_offset (HEADER *omf, LIST *list)
-{
-	unsigned long num;
-	char *str;
-
-	str = malloc (strlen (omf->segname) + (sizeof (long) * 2) + 5);
-	read_long (omf->refNum, num);
-	sprintf (str, "(%s+$%lx)", omf->segname, num);
-	push (list, str, 0);
-	free (str);
-	omf->displacement += omf->numlen;
-	return (num);
-}
-
-unsigned long
-parse_expr_constant_operand (HEADER *omf, LIST *list)
-{
-	unsigned long num;
-	char str[10];
-
-	read_long (omf->refNum, num);
-	sprintf (str, "$%lx", num);
-	push (list, str, 0);
-	omf->displacement += omf->numlen;
-	return (num);
-}
-
-/*
-	stack routines
- */
-
-void
-push (LIST *list, char *str, unsigned char oper)
-{
-	STACK *s;
-
-	s = malloc (sizeof (STACK));
-	if (str)
-	{
-		s->str = malloc (strlen (str) + 1);
-		s->oper = 0;
-		strcpy (s->str, str);
-	}
-	else
-	{
-		s->str = NULL;
-		s->oper = oper;
-	}
-	s->next = NULL;
-
-	if (list->last)
-	{
-		list->last->next = s;
-		++list->size;
-	}
-	else
-		list->stack = s;
-	list->last = s;
-}
-
-void
-delete_stack (STACK *s)
-{
-	while (s)
-	{
-		STACK *tmp_s;
-
-		tmp_s = s->next;
-		free (s->str);
-		free (s);
-		s = tmp_s;
-	}
-}
-
-void
-add_label (LABEL *lab, char *name, char *expr, unsigned char type)
-{
-	LABEL *l;
-
-	while (lab->next)
-		lab = lab->next;
-
-	l = malloc (sizeof (LABEL));
-	l->label = name;
-	l->expr = expr;
-	l->type = type;
-	l->next = NULL;
-	l->prev = lab;
-	lab->next = l;
-}
-
-void
-delete_labels (LABEL *lab, unsigned short type)
-{
-	while (lab = lab->next)
-		if (lab->type == type)
-		{
-			lab->next->prev = lab->prev;
-			lab->prev->next = lab->next;
-			free (lab->label);
-			free (lab->expr);
-			free (lab);
-		}
-}
-
-char *
-match_label (LABEL *lab, char *expr)
-{
-	while (lab = lab->next)
-		if (!strcmp (lab->expr, expr))
-			return (lab->label);
-
-	return (NULL);
-}
-
-unsigned short
-print_stack_postfix (HEADER *omf, STACK *stack, LABEL *lab, unsigned short n)
-{
-	unsigned short edge;
-
-	edge = POSTFIX_EDGE + (nooffset == TRUE ? 16 : 0);
-	if (!assembly)
-	{
-		if (!nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-		printf ("%15c ", '|');
-	}
-
-	while (stack)
-	{
-		do
-		{
-			char *expr;
-
-			if (stack->str)
-			{
-				if (!(label && (expr = match_label (lab, stack->str))))
-					expr = stack->str;
-			}
-			else
-				expr = find_operator (stack->oper);
-
-			n += strlen (expr);
-			printf ("%s", expr);
-
-			if ((stack = stack->next) && !(n > edge && assembly))
-			{
-				putchar (' ');
-				++n;
-			}
-		} while (stack && (n <= edge));
-
-		if (stack && (n > edge))
-		{
-			putchar ('\n');
-			if (!nooffset)
-				printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-			if (assembly)
-				printf ("%20c", ' ');
-			else
-				printf ("%15c ", '|');
-			n = 0;
-		}
-	}
-
-	if (!assembly)
-		putchar ('\n');
-	return (n);
-}
-
-unsigned short
-print_stack_infix (HEADER *omf, LIST *list, LABEL *lab, unsigned short n)
-{
-	BTREE **t;
-	STACK *stack;
-	unsigned short size = 0;
-
-	t = malloc (sizeof (BTREE *) * list->size);
-	stack = list->stack;
-	while (stack)
-	{
-		BTREE *tmp;
-
-		tmp = malloc (sizeof (BTREE));
-		tmp->str = stack->str;
-		tmp->oper = stack->oper;
-		if (!stack->str)
-		{
-			tmp->right = t[--size];
-			tmp->left = t[--size];
-		}
-		else
-		{
-			tmp->right = NULL;
-			tmp->left = NULL;
-		}
-
-		t[size++] = tmp;
-		stack = stack->next;
-	}
-
-	if (!assembly)
-	{
-		if (!nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-		printf ("%15c ", '|');
-	}
-
-	n = print_inorder (omf, t[0], lab, n, operator[t[0]->oper - 1].prec + 1);
-	if (n > 0 && !assembly)
-		putchar ('\n');
-
-	delete_btree (t[0]);
-	free (t);
-	return (n);
-}
-
-unsigned short
-newline (HEADER *omf, unsigned short n)
-{
-	unsigned short edge;
-
-	edge = INFIX_EDGE + (nooffset == TRUE ? 16 : 0);
-	if (n > edge)
-	{
-		n = 0;
-		putchar ('\n');
-
-		if (!nooffset)
-			printf ("%0.6lx %0.6lx | ", omf->displacement, omf->counter);
-		if (assembly)
-			printf ("%20c", ' ');
-		else
-			printf ("%15c ", '|');
-	}
-
-		return (n);
-}
-
-unsigned short
-print_inorder (HEADER *omf, BTREE *t, LABEL *lab, unsigned short n, unsigned short prec)
-{
-	unsigned char oper;
-	char *oper_str;
-
-	if (t != NULL)
-	{
-		if (t->str == NULL)
-		{
-			oper = t->oper;
-			if ((operator[oper - 1].prec > prec) || ((operator[oper - 1].prec == prec) && (operator[oper - 1].assoc == LEFT)))
-			{
-				putchar ('(');
-				++n;
-			}
-			n = print_inorder (omf, t->left, lab, n, operator[oper - 1].prec);
-			oper_str = find_operator (oper);
-			n += 2 + strlen (oper_str);
-			n = newline (omf, n);
-			printf (" %s ", oper_str);
-			if (n == 0)
-				n = strlen (oper_str);
-			n = print_inorder (omf, t->right, lab, n, operator[oper - 1].prec);
-			if ((operator[oper - 1].prec > prec) || ((operator[oper - 1].prec == prec) && (operator[oper - 1].assoc == LEFT)))
-			{
-				putchar (')');
-				++n;
-			}
-		}
-		else
-		{
-			char *expr;
-
-			if (!(label && (expr = match_label (lab, t->str))))
-				expr = t->str;
-			n += strlen (expr);
-			n = newline (omf, n);
-			printf ("%s", expr);
-			if (n == 0)
-				n = strlen (expr);
-		}
-	}
-
-	return (n);
-}
-
-char *
-find_operator (unsigned char operator)
-{
-	switch (operator)
-	{
-		case ADD:
-			return ("+");
-			break;
-
-		case SUB:
-			return ("-");
-			break;
-
-		case MUL:
-			return ("*");
-			break;
-
-		case DIV:
-			return ("/");
-			break;
-
-		case MOD:
-			return ("%%");
-			break;
-
-		case NEGATION:
-			return ("~");
-			break;
-
-		case BIT_SHIFT:
-			return ("<<");
-			break;
-
-		case AND:
-			return ("&&");
-			break;
-
-		case OR:
-			return ("||");
-			break;
-
-		case EOR:
-			return (".eor.");
-			break;
-
-		case NOT:
-			return ("!");
-			break;
-
-		case LESS_EQUAL:
-			return ("<=");
-			break;
-
-		case GREATER_EQUAL:
-			return (">=");
-			break;
-
-		case NOT_EQUAL:
-			return ("<>");
-			break;
-
-		case LESS:
-			return ("<");
-			break;
-
-		case GREATER:
-			return (">");
-			break;
-
-		case EQUAL:
-			return ("=");
-			break;
-
-		case LOGICAL_AND:
-			return ("&");
-			break;
-
-		case INCLUSIVE_OR:
-			return ("|");
-			break;
-
-		case EXCLUSIVE_OR:
-			return (".beor.");
-			break;
-
-		case COMPLEMENT:
-			return (".bnot.");
-			break;
-	}
-}
-
-void
-delete_btree (BTREE *t)
-{
-	if (t != NULL)
-	{
-		delete_btree (t->left);
-		delete_btree (t->right);
-		free (t);
-	}
-}
-
-int
-decode_switches (int argc, char **argv)
-{
-	int c, longind;
-
-	while ((c = getopt_long (argc, argv, "vDdTxltpmoaisnfh", long_options, &longind)) != EOF)
-	{
-		if (c == 0)
-			c = long_options[longind].val;
-
-		switch (c)
-		{
-			case 'D':
-				read_default (argv[0]);
-				break;
-
-			default:
-				set_option (c, argv[0]);
-				break;
-		}
-	}
-
-	return (optind);
-}
-
-void
-read_default (char *progname)
-{
-	Handle name;
-	Longword size;
-
-	name = LoadResource (rText, (Longword)DEFAULT);
-	size = GetResourceSize (rText, (Longword)DEFAULT);
-	HLock (name);
-	while (size)
-	{
-		int opt;
-
-		opt = get_option (*name);
-		if (opt != ERROR)
-			set_option (opt, progname);
-		size -= strlen (*name) + 1;
-		*name += strlen (*name) + 1;
-	}
-	HUnlock (name);
-}
-
-int
-get_option (char *arg)
-{
-	int i = 0;
-
-	while (long_options[i].val)
-	{
-		if ((*arg == '-') && (long_options[i].val == *(arg + 1)))
-				return (long_options[i].val);
-		else
-			if (!strcmp (long_options[i].name, arg + 1))
-				return (long_options[i].val);
-		++i;
-	}
-
-	return (ERROR);
-}
-
-void
-set_option (int opt, char *progname)
-{
-	Handle h;
-
-	switch (opt)
-	{
-		case 'v':
-			h = LoadResource (rText, VERSION);
-			fprintf (stderr, *h, progname);
-			break;
-
-		case 'd':
-			assembly = TRUE;
-			assembler = merlin;
-			infix = TRUE;
-			label = TRUE;
-			break;
-
-		case 'T':
-			tool = TRUE;
-			break;
-
-		case 'x':
-			hex = TRUE;
-			break;
-
-		case 'l':
-			label = TRUE;
-			break;
-
-		case 't':
-			infix = TRUE;
-			postfix = FALSE;
-			break;
-
-		case 'p':
-			postfix = TRUE;
-			infix = FALSE;
-			break;
-
-		case 'm':
-			assembler = merlin;
-			assembly = TRUE;
-			infix = TRUE;
-			label = TRUE;
-			break;
-
-		case 'o':
-			assembler = orca;
-			assembly = TRUE;
-			infix = TRUE;
-			label = TRUE;
-			break;
-
-		case 'a':
-			shorta = TRUE;
-			break;
-
-		case 'i':
-			shorti = TRUE;
-			break;
-
-		case 's':
-			header = TRUE;
-			break;
-
-		case 'n':
-			noheader = TRUE;
-			break;
-
-		case 'f':
-			nooffset = TRUE;
-			break;
-
-		case 'h':
-			usage_verbose (progname);
-			break;
-
-		default:
-			usage (progname);
-			break;
-	}
-}
-
-void
-usage (char *progname)
-{
-	Handle h;
-
-	h = LoadResource (rText, (Longword)USAGE);
-	fprintf (stderr, *h, progname);
-
-	ResourceShutDown ();
-	MMShutDown (userID);
-	exit (1);
-}
-
-void
-usage_verbose (char *progname)
-{
-	Handle h;
-
-	h = LoadResource (rText, (Longword)USAGE_VERBOSE);
-	fprintf (stderr, *h, progname, progname);
-
-	ResourceShutDown ();
-	MMShutDown (userID);
-	exit (0);
-}
-
-void
-GSOSset_mark (Word refNum, Longword displacement)
-{
-	SetPositionRecGS info = { 3 };
-
-	info.refNum = refNum;
-	info.base = startPlus;
-	info.displacement = displacement;
-	SetMark (&info);
-}
-
-Longword
-GSOSget_mark (Word refNum)
-{
-	PositionRecGS info = { 2 };
-
-	info.refNum = refNum;
-	GetMark (&info);
-	return (info.position);
-}
-
-Longword
-GSOSread (Word refNum, void *dataBuffer, Longword requestCount)
-{
-	IORecGS info = { 5 };
-
-	info.refNum = refNum;
-	info.dataBuffer = (char *)dataBuffer;
-	info.requestCount = requestCount;
-	info.cachePriority = cacheOff;
-	Read (&info);
-
-	return (info.transferCount);
-}
-
-Word
-GSOSopen (char *filename)
-{
-	OpenRecGS info = { 12 };
-	GSString255 name;
-
-	info.optionList = NULL;
-	name.length = strlen (filename);
-	strcpy (name.text, filename);
-	info.pathname = &name;
-	info.requestAccess = readEnable;
-	info.resourceNumber = 0;
-	Open (&info);
-
-	return (info.refNum);
-}
-
-void
-GSOSclose (Word refNum)
-{
-	IORecGS info = { 1 };
-
-	info.refNum = refNum;
-	Close (&info);
-}
-
-Longword
-GSOSget_eof (Word refNum)
-{
-	EOFRecGS info = { 2 };
-
-	info.refNum = refNum;
-	GetEOF (&info);
-	return (info.eof);
-}
-
-HEADER *
-init_globals (void)
-{
-	HEADER *omf;
-
-	version = FALSE;
-	tool = FALSE;
-	assembly = FALSE;
-	label = FALSE;
-	infix = FALSE;
-	postfix = TRUE;
-	hex = FALSE;
-	header = FALSE;
-	noheader = FALSE;
-	nooffset = FALSE;
-	help = FALSE;
-	shorta = FALSE;
-	shorti = FALSE;
-
-	omf = malloc (sizeof (HEADER));
-	omf->offset = 0;
-	return (omf);
-}
-
-int
-main (int argc, char **argv)
-{
-	HEADER *omf;
-	LABEL lab = { NULL, NULL, 0, NULL, NULL };
-	int i, names;
-	LongWord file_len;
-	GSString255 *prog;
-
-	userID = MMStartUp ();
-	prog = (GSString255 *)LGetPathname2 (userID, (Word)1);
-	ResourceStartUp (userID);
-	OpenResourceFile (readEnable, NULL, prog);
-	omf = init_globals ();
-	i = decode_switches (argc, argv);
-
-	omf->refNum = GSOSopen (argv[i]);
-	if (toolerror ())
-	{
-		if (i == argc)
-			puts ("object filename not specified");
-		else
-			perror (argv[0]);
-		usage (argv[0]);
-	}
-
-	file_len = GSOSget_eof (omf->refNum);
-	names = (++i < argc ? TRUE : FALSE);
-
-	do
-	{
-		GSOSset_mark (omf->refNum, omf->offset);
-		if (toolerror () || (names && (i == argc)))
-			break;
-
-		read_header (omf);
-		omf->displacement = omf->offset + omf->dispdata;
-		omf->counter = 0;
-
-		if (names)
-		{
-			char j, flag = FALSE;
-
-			for (j = i; j < argc; ++j)
-				if (!strncmp (omf->loadname, argv[j], (int)strlen (argv[j])) ||
-					!strncmp (omf->segname, argv[j], (int)strlen (argv[j])))
-				{
-					flag = TRUE;
-					break;
-				}
-
-			if (flag)
-			{
-				if (!noheader)
-					print_header (omf);
-				if (!header)
-					if (hex && !assembly)
-						parse_segment_hex (omf);
-					else
-						parse_segment (omf, &lab);
-
-				if (j != i)
-					argv[j] = argv[i];
-				++i;
-			}
-		}
-		else
-		{
-			if (!noheader)
-				print_header (omf);
-			if (!header)
-				if (hex && !assembly)
-					parse_segment_hex (omf);
-				else
-					parse_segment (omf, &lab);
-		}
-
-		free (omf->segname);
-		if (omf->version == 1)
-			omf->offset += (omf->bytecnt * 512);
-		else
-			omf->offset += omf->bytecnt;
-	} while (file_len > omf->offset);
-
-	delete_labels (&lab, GLOBAL);
-	bye (omf);
-}
+ END OF ARCHIVE
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads