ftp.nice.ch/pub/next/tools/emulators/a2.N.bs.tar.gz#/a2/a2.c

This is a2.c in view mode; [Download] [Up]

/*
 *  a2, an Apple II emulator in C
 *  (c) Copyright 1990 by Rich Skrenta
 *
 *  Command line interface written by Tom Markson
 *
 *  Distribution agreement:
 *
 *	You may freely copy or redistribute this software, so long
 *	as there is no profit made from its use, sale, trade or
 *	reproduction.  You may not change this copyright notice,
 *	and it must be included prominently in any copy made.
 *
 *  Send emulator related mail to:  skrenta@blekko.commodore.com
 *				    skrenta@blekko.uucp
 */


#include	<stdio.h>
#include	"a2.h"

#define	BRANCH()	val = mem[Pc++]; if (val & 0x80) Pc += val - 256; else Pc += val;

#define	put_status(s) stmp = s; N = stmp & 0x80; V = stmp & 0x40; B = stmp & 0x10; D = stmp & 0x08; I = stmp & 0x04; NZ = !(stmp & 0x02); C = stmp & 0x01;


extern long trace_lo, trace_hi;
extern FILE *logging_fp;
extern long phantom_location;
extern long breakpoint;


run()
{
  register unsigned short ptr;
  register unsigned short ptmp;
  register unsigned int val;
  register unsigned int tmp;
  register unsigned int num;
  unsigned char stmp;
  int foo;
  int show_flags = FALSE;
  

  unsigned long mjhostet = 0;


  do {					/* while (tracing) */
    if (tracing) {

      if (breakpoint == Pc) {
	MoveCursor(term_lines, 0);
	printf("Break at $%.4X\n", Pc);
	return;
      }
      
      if (phantom_location == (long) Pc)
	phantom_location = -1;		/* start tracing now */
      
      if (phantom_location == -1
	  &&  trace_lo != -1
	  &&  (long) Pc >= trace_lo
	  &&  (long) Pc <= trace_hi) {
	diss(Pc, logging_fp);
	show_flags = TRUE;
      } else
	show_flags = FALSE;
    }
    
    
    do {					/* while (running) */


      /* MJHOSTET HACK */
#if 1
      if (!(mjhostet++ & 32767))
	redraw_hgr_screen (mem + 0x2000);
#endif


      switch (mem[Pc++]) {
      case 0x00:			/* BRK */
	PCINC;
	push(high(Pc));
	push(low(Pc));
	B = 1;				/* set I flag? */
	push(get_status());
	Pc = join(mem[0xFFFE], mem[0xFFFF]);
	break;
	
      case 0x01:	/* ORA (indirect, X) */
	INDX;
	A |= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x02:
	break;
	
      case 0x03:
	break;
	
      case 0x04:	/* TSB zero page	65C02 */
	break;
	
      case 0x05:	/* ORA zero page */
	A |= rZEROP;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x06:	/* ASL zero page */
	ZEROP;
	val = REFzero << 1;
	CARRY(val);
	val &= 0xFF;
	SETzero(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x07:
	break;
	
      case 0x08:	/* PHP */
	push(get_status());
	break;
	
      case 0x09:	/* ORA immediate */
	A |= REFimm;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x0A:	/* ASL accumulator */
	A = A << 1;
	CARRY(A);
	A &= 0xFF;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x0B:
	break;
	
      case 0x0C:	/* TSB absolute		65C02 */
	break;
	
      case 0x0D:	/* ORA absolute */
	ABSOL;
	A |= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x0E:	/* ASL absolute */
	ABSOL;
	val = REFptr << 1;
	CARRY(val);
	val &= 0xFF;
	SETptr(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x0F:
	break;
	
      case 0x10:	/* BPL */
	if (N) {
	  PCINC;
	} else {
	  BRANCH();
	}
	break;
	
      case 0x11:	/* ORA (indirect), Y */
	INDY;
	A |= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x12:	/* ORA (indz)		65C02 */
	break;
	
      case 0x13:
	break;
	
      case 0x14:	/* TRB zero page	65C02 */
	break;
	
      case 0x15:	/* ORA zero page, X */
	A |= rZEROX;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x16:	/* ASL zero page, X */
	ZEROX;
	val = REFzero << 1;
	CARRY(val);
	val &= 0xFF;
	SETzero(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x17:
	break;
	
      case 0x18:	/* CLC */
	C = 0;
	break;
	
      case 0x19:	/* ORA absolute, Y */
	ABSY;
	A |= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x1A:	/* INA			65C02 */
	break;
	
      case 0x1C:	/* TRB absolute		65C02 */
	break;
	
      case 0x1D:	/* ORA absolute, X */
	ABSX;
	A |= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x1E:	/* ASL absolute, X */
	ABSX;
	val = REFptr << 1;
	CARRY(val);
	val &= 0xFF;
	SETptr(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x1F:
	break;
	
      case 0x20:	/* JSR */
	ptmp = REFimm;
	ptmp |= mem[Pc] << 8;
	push(high(Pc));
	push(low(Pc));
	Pc = ptmp;
	
	if (jmp_tbl[Pc])
	  jump(jmp_tbl[Pc]);
	break;
	
      case 0x21:	/* AND (indirect, X) */
	INDX;
	A &= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x22:
	break;
	
      case 0x23:
	break;
	
      case 0x24:	/* BIT zero page */
	tmp = rZEROP;
	ZERO(A & tmp);
	N = tmp & 0x80;
	V = tmp & 0x40;
	break;
	
      case 0x25:	/* AND zero page */
	A &= rZEROP;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x26:	/* ROL zero page */
	ZEROP;
	val = REFzero;
	tmp = C;
	val = val << 1;
	CARRY(val);
	val = (val & 0xFF) | tmp;
	SETzero(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x27:
	break;
	
      case 0x28:	/* PLP */
	put_status(pop());
	break;
	
      case 0x29:	/* AND immediate */
	A &= REFimm;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x2A:	/* ROL accumulator */
	tmp = C;
	A = A << 1;
	CARRY(A);
	A = (A & 0xFF) | tmp;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x2B:
	break;
	
      case 0x2C:	/* BIT absolute */
	ABSOL;
	tmp = REFptr;
	ZERO(A & tmp);
	N = tmp & 0x80;
	V = tmp & 0x40;
	break;
	
      case 0x2D:	/* AND absolute */
	ABSOL;
	A &= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x2E:	/* ROL absolute */
	ABSOL;
	val = REFptr;
	tmp = C;
	val = val << 1;
	CARRY(val);
	val = (val & 0xFF) | tmp;
	SETptr(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x2F:
	break;
	
      case 0x30:	/* BMI */
	if (N) {
	  BRANCH();
	} else{
	  PCINC;
	}
	break;
	
      case 0x31:	/* AND (indirect), Y */
	INDY;
	A &= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x32:	/* AND (indz)		65C02 */
	break;
	
      case 0x33:
	break;
	
      case 0x34:	/* BIT zero page, X	65C02 */
	break;
	
      case 0x35:	/* AND zero page, X */
	A &= rZEROX;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x36:	/* ROL zero page, X */
	ZEROX;
	val = REFzero;
	tmp = C;
	val = val << 1;
	CARRY(val);
	val = (val & 0xFF) | tmp;
	SETzero(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x37:
	break;
	
      case 0x38:	/* SEC */
	C = 1;
	break;
	
      case 0x39:	/* AND absolute, Y */
	ABSY;
	A &= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x3A:	/* DEA			65C02 */
	break;
	
      case 0x3B:
	break;
	
      case 0x3C:	/* BIT absolute, X	65C02 */
	break;
	
      case 0x3D:	/* AND absolute, X */
	ABSX;
	A &= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x3E:	/* ROL absolute, X */
	ABSX;
	val = REFptr;
	tmp = C;
	val = val << 1;
	CARRY(val);
	val = (val & 0xFF) | tmp;
	SETptr(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x3F:
	break;
	
      case 0x40:	/* RTI */
	put_status(pop());
	Pc = pop();
	Pc |= pop() << 8;
	break;
	
      case 0x41:	/* EOR (indirect, X) */
	INDX;
	A ^= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x42:
	break;
	
      case 0x43:
	break;
	
      case 0x44:
	break;
	
      case 0x45:	/* EOR zero page */
	A ^= rZEROP;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x46:	/* LSR zero page */
	ZEROP;
	tmp = REFzero;
	C = (tmp & 0x01);
	tmp = tmp >> 1;
	SETzero(tmp);
	N = 0;
	ZERO(tmp);
	break;
	
      case 0x47:
	break;
	
      case 0x48:	/* PHA */
	push(A);
	break;
	
      case 0x49:	/* EOR immediate */
	A ^= REFimm;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x4A:	/* LSR accumulator */
	C = (A & 0x01);
	A = A >> 1;
	N = 0;
	ZERO(A);
	break;
	
      case 0x4B:
	break;
	
      case 0x4C:	/* JMP absolute */
	ptmp = REFimm;
	ptmp |= REFimm << 8;
	Pc = ptmp;
	
	if (jmp_tbl[Pc])
	  jump(jmp_tbl[Pc]);
	break;
	
      case 0x4D:	/* EOR absolute */
	ABSOL;
	A ^= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x4E:	/* LSR absolute */
	ABSOL;
	tmp = REFptr;
	C = (tmp & 0x01);
	tmp = tmp >> 1;
	SETptr(tmp);
	N = 0;
	ZERO(tmp);
	break;
	
      case 0x4F:
	break;
	
      case 0x50:	/* BVC */
	if (V) {
	  PCINC;
	} else {
	  BRANCH();
	}
	break;
	
      case 0x51:	/* EOR (indirect), Y */
	INDY;
	A ^= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x52:	/* EOR (indz)		65C02 */
	break;
	
      case 0x53:
	break;
	
      case 0x54:
	break;
	
      case 0x55:	/* EOR zero page, X */
	A ^= rZEROX;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x56:	/* LSR zero page, X */
	ZEROX;
	tmp = REFzero;
	C = (tmp & 0x01);
	tmp = tmp >> 1;
	SETzero(tmp);
	N = 0;
	ZERO(tmp);
	break;
	
      case 0x57:
	break;
	
      case 0x58:	/* CLI */
	I = 0;
	break;
	
      case 0x59:	/* EOR absolute, Y */
	ABSY;
	A ^= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x5A:	/* PHY		65C02 */
	break;
	
      case 0x5B:
	break;
	
      case 0x5C:
	break;
	
      case 0x5D:	/* EOR absolute, X */
	ABSX;
	A ^= REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x5E:	/* LSR absolute, X */
	ABSX;
	tmp = REFptr;
	C = (tmp & 0x01);
	tmp = tmp >> 1;
	SETptr(tmp);
	N = 0;
	ZERO(tmp);
	break;
	
      case 0x5F:
	break;
	
      case 0x60:	/* RTS */
	DO_RTS;
	break;
	
      case 0x61:	/* ADC (indirect, X) */
	INDX;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  num = tobinary(val);
	  val = tobinary(A);
	  
	  val += num + C;
	  dCARRY(val);
	  while (val >= 100)
	    val -= 100;
	  
	  A = tobcd(val);
	} else {
	  A += val + C;
	  CARRY(A);
	  A &= 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp == stmp) && (tmp != N);
	break;
	
      case 0x62:
	break;
	
      case 0x63:
	break;
	
      case 0x64:	/* STZ zero page	65C02 */
	break;
	
      case 0x65:	/* ADC zero page */
	val = rZEROP;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  num = tobinary(val);
	  val = tobinary(A);
	  
	  val += num + C;
	  dCARRY(val);
	  while (val >= 100)
	    val -= 100;
	  
	  A = tobcd(val);
	} else {
	  A += val + C;
	  CARRY(A);
	  A &= 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp == stmp) && (tmp != N);
	break;
	
	
      case 0x66:	/* ROR zero page */
	ZEROP;
	val = REFzero;
	tmp = C;
	C = val & 0x01;
	val = val >> 1;
	val |= tmp << 7;
	SETzero(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x67:
	break;
	
      case 0x68:	/* PLA */
	A = pop();
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x69:	/* ADC immediate */
	val = REFimm;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  num = tobinary(val);
	  val = tobinary(A);
	  
	  val += num + C;
	  dCARRY(val);
	  while (val >= 100)
	    val -= 100;
	  
	  A = tobcd(val);
	} else {
	  A += val + C;
	  CARRY(A);
	  A &= 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp == stmp) && (tmp != N);
	break;
	
      case 0x6A:	/* ROR accumulator */
	tmp = C;
	C = A & 0x01;
	A = A >> 1;
	A |= tmp << 7;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x6B:
	break;
	
      case 0x6C:	/* JMP indirect */
	ptmp = REFimm;
	ptmp |= REFimm << 8;
	Pc = mem[ptmp++];
	Pc |= mem[ptmp] << 8;
	
	if (jmp_tbl[Pc])
	  jump(jmp_tbl[Pc]);
	break;
	
      case 0x6D:	/* ADC absolute */
	ABSOL;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  num = tobinary(val);
	  val = tobinary(A);
	  
	  val += num + C;
	  dCARRY(val);
	  while (val >= 100)
	    val -= 100;
	  
	  A = tobcd(val);
	} else {
	  A += val + C;
	  CARRY(A);
	  A &= 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp == stmp) && (tmp != N);
	break;
	
      case 0x6E:	/* ROR absolute */
	ABSOL;
	val = REFptr;
	tmp = C;
	C = val & 0x01;
	val = val >> 1;
	val |= tmp << 7;
	SETptr(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x6F:
	break;
	
      case 0x70:	/* BVS */
	if (V) {
	  BRANCH();
	} else {
	  PCINC;
	}
	break;
	
      case 0x71:	/* ADC (indirect),Y */
	INDY;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  num = tobinary(val);
	  val = tobinary(A);
	  
	  val += num + C;
	  dCARRY(val);
	  while (val >= 100)
	    val -= 100;
	  
	  A = tobcd(val);
	} else {
	  A += val + C;
	  CARRY(A);
	  A &= 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp == stmp) && (tmp != N);
	break;
	
      case 0x72:	/* ADC (indz)		65C02 */
	break;
	
      case 0x73:
	break;
	
      case 0x74:	/* STZ zero page, X	65C02 */
	break;
	
      case 0x75:	/* ADC zero page, X */
	val = rZEROX;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  num = tobinary(val);
	  val = tobinary(A);
	  
	  val += num + C;
	  dCARRY(val);
	  while (val >= 100)
	    val -= 100;
	  
	  A = tobcd(val);
	} else {
	  A += val + C;
	  CARRY(A);
	  A &= 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp == stmp) && (tmp != N);
	break;
	
      case 0x76:	/* ROR zero page, X */
	ZEROX;
	val = REFzero;
	tmp = C;
	C = val & 0x01;
	val = val >> 1;
	val |= tmp << 7;
	SETzero(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x77:
	break;
	
      case 0x78:	/* SEI */
	I = 1;
	break;
	
      case 0x79:	/* ADC absolute, Y */
	ABSY;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  num = tobinary(val);
	  val = tobinary(A);
	  
	  val += num + C;
	  dCARRY(val);
	  while (val >= 100)
	    val -= 100;
	  
	  A = tobcd(val);
	} else {
	  A += val + C;
	  CARRY(A);
	  A &= 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp == stmp) && (tmp != N);
	break;
	
      case 0x7A:	/* PLY		65C02 */
	break;
	
      case 0x7B:
	break;
	
      case 0x7C:	/* JMP (abs indirect, X)	65C02 */
	break;
	
      case 0x7D:	/* ADC absolute, X */
	ABSX;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  num = tobinary(val);
	  val = tobinary(A);
	  
	  val += num + C;
	  dCARRY(val);
	  while (val >= 100)
	    val -= 100;
	  
	  A = tobcd(val);
	} else {
	  A += val + C;
	  CARRY(A);
	  A &= 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp == stmp) && (tmp != N);
	break;
	
      case 0x7E:	/* ROR absolute, X */
	ABSX;
	val = REFptr;
	tmp = C;
	C = val & 0x01;
	val = val >> 1;
	val |= tmp << 7;
	SETptr(val);
	SIGN(val);
	ZERO(val);
	break;
	
      case 0x7F:
	break;
	
      case 0x80:	/* BRA			65C02 */
	break;
	
      case 0x81:	/* STA (indirect, X) */
	INDX;
	SETptr(A);
	break;
	
      case 0x82:
	break;
	
      case 0x83:
	break;
	
      case 0x84:	/* STY zero page */
	sZEROP(Y);
	break;
	
      case 0x85:	/* STA zero page */
	sZEROP(A);
	break;
	
      case 0x86:	/* STX zero page */
	sZEROP(X);
	break;
	
      case 0x87:
	break;
	
      case 0x88:	/* DEY */
	Y--;
	SIGN(Y);
	ZERO(Y);
	break;
	
      case 0x89:
	break;
	
      case 0x8A:	/* TXA */
	A = X;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x8B:
	break;
	
      case 0x8C:	/* STY absolute */
	ABSOL;
	SETptr(Y);
	break;
	
      case 0x8D:	/* STA absolute */
	ABSOL;
	SETptr(A);
	break;
	
      case 0x8E:	/* STX absolute */
	ABSOL;
	SETptr(X);
	break;
	
      case 0x8F:
	break;
	
      case 0x90:	/* BCC */
	if (C) {
	  PCINC;
	} else {
	  BRANCH();
	}
	break;
	
      case 0x91:	/* STA (indirect), Y */
	INDY;
	SETptr(A);
	break;
	
      case 0x92:
	break;
	
      case 0x93:
	break;
	
      case 0x94:	/* STY zero page, X */
	sZEROX(Y);
	break;
	
      case 0x95:	/* STA zero page, X */
	sZEROX(A);
	break;
	
      case 0x96:	/* STX zero page, Y */
	sZEROY(X);
	break;
	
      case 0x97:
	break;
	
      case 0x98:	/* TYA */
	A = Y;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0x99:	/* STA absolute, Y */
	ABSY;
	SETptr(A);
	break;
	
      case 0x9A:	/* TXS */
	Sp = X;
	break;
	
      case 0x9B:
	break;
	
      case 0x9C:	/* STZ absolute		65C02 */
	break;
	
      case 0x9D:	/* STA absolute, X */
	ABSX;
	SETptr(A);
	break;
	
      case 0x9E:	/* STZ absolute, X	65C02 */
	break;
	
      case 0x9F:
	break;
	
      case 0xA0:	/* LDY immediate */
	Y = REFimm;
	SIGN(Y);
	ZERO(Y);
	break;
	
      case 0xA1:	/* LDA (indirect, X) */
	INDX;
	A = REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0xA2:	/* LDX immediate */
	X = REFimm;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xA3:
	break;
	
      case 0xA4:	 /* LDY zero page */
	Y = rZEROP;
	SIGN(Y);
	ZERO(Y);
	break;
	
      case 0xA5:	/* LDA zero page */
	A = rZEROP;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0xA6:	/* LDX zero page */
	X = rZEROP;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xA7:
	break;
	
      case 0xA8:	/* TAY */
	Y = A;
	SIGN(Y);
	ZERO(Y);
	break;
	
      case 0xA9:	/* LDA immediate */
	A = REFimm;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0xAA:	/* TAX */
	X = A;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xAB:
	break;
	
      case 0xAC:	/* LDY absolute */
	ABSOL;
	Y = REFptr;
	SIGN(Y);
	ZERO(Y);
	break;
	
      case 0xAD:	/* LDA absolute */
	ABSOL;
	A = REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0xAE:	/* LDX absolute */
	ABSOL;
	X = REFptr;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xAF:
	break;
	
      case 0xB0:	/* BCS */
	if (C) {
	  BRANCH();
	} else {
	  PCINC;
	}
	break;
	
      case 0xB1:	/* LDA (indirect), Y */
	INDY;
	A = REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0xB2:	/* LDA (indz)		65C02 */
	break;
	
      case 0xB3:
	break;
	
      case 0xB4:	/* LDY zero page, X */
	Y = rZEROX;
	SIGN(Y);
	ZERO(Y);
	break;
	
      case 0xB5:	/* LDA zero page, X */
	A = rZEROX;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0xB6:	/* LDX zero page, Y */
	X = rZEROY;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xB7:
	break;
	
      case 0xB8:	/* CLV */
	V = 0;
	break;
	
      case 0xB9:	/* LDA absolute, Y */
	ABSY;
	A = REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0xBA:	/* TSX */
	X = Sp;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xBB:
	break;
	
      case 0xBC:	/* LDY absolute, X */
	ABSX;
	Y = REFptr;
	SIGN(Y);
	ZERO(Y);
	break;
	
      case 0xBD:	/* LDA absolute, X */
	ABSX;
	A = REFptr;
	SIGN(A);
	ZERO(A);
	break;
	
      case 0xBE:	/* LDX absolute, Y */
	ABSY;
	X = REFptr;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xBF:
	break;
	
      case 0xC0:	/* CPY immediate */
	tmp = REFimm;
	C = (Y >= tmp);
	tmp = (Y - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xC1:	/* CMP (indirect, X) */
	INDX;
	tmp = REFptr;
	C = (A >= tmp);
	tmp = (A - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xC2:
	break;
	
      case 0xC3:
	break;
	
      case 0xC4:	/* CPY zero page */
	tmp = rZEROP;
	C = (Y >= tmp);
	tmp = (Y - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xC5:	/* CMP zero page */
	tmp = rZEROP;
	C = (A >= tmp);
	tmp = (A - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xC6:	/* DEC zero page */
	ZEROP;
	stmp = REFzero - 1;
	SETzero(stmp);
	SIGN(stmp);
	ZERO(stmp);
	break;
	
      case 0xC7:
	break;
	
      case 0xC8:	/* INY */
	Y++;
	SIGN(Y);
	ZERO(Y);
	break;
	
      case 0xC9:	/* CMP immediate */
	tmp = REFimm;
	C = (A >= tmp);
	tmp = (A - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xCA:	/* DEX */
	X--;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xCB:
	break;
	
      case 0xCC:	/* CPY absolute */
	ABSOL;
	tmp = REFptr;
	C = (Y >= tmp);
	tmp = (Y - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xCD:	/* CMP absolute */
	ABSOL;
	tmp = REFptr;
	C = (A >= tmp);
	tmp = (A - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xCE:	/* DEC absolute */
	ABSOL;
	stmp = REFptr - 1;
	SETptr(stmp);
	SIGN(stmp);
	ZERO(stmp);
	break;
	
      case 0xCF:
	break;
	
      case 0xD0:	/* BNE */
	if (NZ) {
	  BRANCH();
	} else {
	  PCINC;
	}
	break;
	
      case 0xD1:	/* CMP (indirect), Y */
	INDY;
	tmp = REFptr;
	C = (A >= tmp);
	tmp = (A - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xD2:	/* CMP (indz)		65C02 */
	break;
	
      case 0xD3:
	break;
	
      case 0xD4:
	break;
	
      case 0xD5:	/* CMP zero page, X */
	tmp = rZEROX;
	C = (A >= tmp);
	tmp = (A - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xD6:	/* DEC zero page, X */
	ZEROX;
	stmp = REFzero - 1;
	SETzero(stmp);
	SIGN(stmp);
	ZERO(stmp);
	break;
	
      case 0xD7:
	break;
	
      case 0xD8:	/* CLD */
	D = 0;
	break;
	
      case 0xD9:	/* CMP absolute, Y */
	ABSY;
	tmp = REFptr;
	C = (A >= tmp);
	tmp = (A - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xDA:	/* PHX		65C02 */
	break;
	
      case 0xDB:
	break;
	
      case 0xDC:
	break;
	
      case 0xDD:	/* CMP absolute, X */
	ABSX;
	tmp = REFptr;
	C = (A >= tmp);
	tmp = (A - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xDE:	/* DEC absolute, X */
	ABSX;
	stmp = REFptr - 1;
	SETptr(stmp);
	SIGN(stmp);
	ZERO(stmp);
	break;
	
      case 0xDF:
	break;
	
      case 0xE0:	/* CPX immediate */
	tmp = REFimm;
	C = (X >= tmp);
	tmp = (X - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xE1:	/* SBC (indirect, X) */
	INDX;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  assert(FALSE);
	} else {
	  foo = A - (val + !C);
	  C = (foo >= 0);
	  A = foo & 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp != stmp) && (tmp != N);
	break;
	
      case 0xE2:
	break;
	
      case 0xE3:
	break;
	
      case 0xE4:	/* CPX zero page */
	tmp = rZEROP;
	C = (X >= tmp);
	tmp = (X - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xE5:	/* SBC zero page */
	val = rZEROP;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  assert(FALSE);
	} else {
	  foo = A - (val + !C);
	  C = (foo >= 0);
	  A = foo & 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp != stmp) && (tmp != N);
	break;
	
      case 0xE6:	/* INC zero page */
	ZEROP;
	stmp = REFzero + 1;
	SIGN(stmp);
	ZERO(stmp);
	SETzero(stmp);
	break;
	
      case 0xE7:
	break;
	
      case 0xE8:	/* INX */
	X++;
	SIGN(X);
	ZERO(X);
	break;
	
      case 0xE9:	/* SBC immediate */
	val = REFimm;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  assert(FALSE);
	} else {
	  foo = A - (val + !C);
	  C = (foo >= 0);
	  A = foo & 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp != stmp) && (tmp != N);
	break;
	
      case 0xEA:	/* NOP */
	break;
	
      case 0xEB:
	break;
	
      case 0xEC:	/* CPX absolute */
	ABSOL;
	tmp = REFptr;
	C = (X >= tmp);
	tmp = (X - tmp) & 0xFF;
	SIGN(tmp);
	ZERO(tmp);
	break;
	
      case 0xED:	/* SBC absolute */
	ABSOL;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  assert(FALSE);
	} else {
	  foo = A - (val + !C);
	  C = (foo >= 0);
	  A = foo & 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp != stmp) && (tmp != N);
	break;
	
      case 0xEE:	/* INC absolute */
	ABSOL;
	stmp = REFptr + 1;
	SETptr(stmp);
	SIGN(stmp);
	ZERO(stmp);
	break;
	
      case 0xEF:
	break;
	
      case 0xF0:	/* BEQ */
	if (NZ) {
	  PCINC;
	} else {
	  BRANCH();
	}
	break;
	
      case 0xF1:	/* SBC (indirect), Y */
	INDY;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  assert(FALSE);
	} else {
	  foo = A - (val + !C);
	  C = (foo >= 0);
	  A = foo & 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp != stmp) && (tmp != N);
	break;
	
      case 0xF2:	/* SBC (indz)		65C02 */
	break;
	
      case 0xF3:
	break;
	
      case 0xF4:
	break;
	
      case 0xF5:	/* SBC zero page, X */
	val = rZEROX;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  assert(FALSE);
	} else {
	  foo = A - (val + !C);
	  C = (foo >= 0);
	  A = foo & 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp != stmp) && (tmp != N);
	break;
	
      case 0xF6:	/* INC zero page, X */
	ZEROX;
	stmp = REFzero + 1;
	SETzero(stmp);
	SIGN(stmp);
	ZERO(stmp);
	break;
	
      case 0xF7:
	break;
	
      case 0xF8:	/* SED */
	D = 1;
	break;
	
      case 0xF9:	/* SBC absolute, Y */
	ABSY;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  assert(FALSE);
	} else {
	  foo = A - (val + !C);
	  C = (foo >= 0);
	  A = foo & 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp != stmp) && (tmp != N);
	break;
	
      case 0xFA:	/* PLX		65C02 */
	break;
	
      case 0xFB:
	break;
	
      case 0xFC:
	break;
	
      case 0xFD:	/* SBC absolute, X */
	ABSX;
	val = REFptr;
	tmp = A & 0x80;
	stmp = val & 0x80;
	if (D) {
	  assert(FALSE);
	} else {
	  foo = A - (val + !C);
	  C = (foo >= 0);
	  A = foo & 0xFF;
	}
	ZERO(A);
	SIGN(A);
	V = (tmp != stmp) && (tmp != N);
	break;
	
      case 0xFE:	/* INC absolute, X */
	ABSX;
	stmp = REFptr + 1;
	SETptr(stmp);
	SIGN(stmp);
	ZERO(stmp);
	break;
	
      case 0xFF:
	break;
      }
    } while (running);
    
    if (show_flags)
      flags(logging_fp);
  } while (tracing);
}


These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.