Arduino uno r4 wifi - Apple1 emulator with led matrix logo issue slow down

Dear Forum i have built an Apple 1 emulator for Arduino uno r4 wifi with a led matrix logo, but the answer from commands from cpu, for example in BASIC coding is very slow, anyone can check this code and ajust it please, to make it faster? I attack here the scretch, it works from Tera Term with this settings : After uploading A1 sketch inside Arduino Uno r4 wifi ROM from Arduino IDE for Windows etc, you have to connect it to the usb port of your PC and after installing Tera Term in Windows Start it and choose these parameters: Serial Com port of Arduino Uno r4 wifi , then from menu Setup - Terminal choose Receive: AUTO Transmit: CR and under menu Setup - Serial Port: Speed 9600 and Transmit Delay 50 ms char and 120 ms line.

Thank you for reading
Toolkitman

Emulator

Things were a lot slower in the 1970s.

1 Like

Sorry, no code. Your link to an emulator just has links to something further on, somewhere. I do not intend to try to follow the links to who know what may be at the end.

The emulator is a compressed file with arduino scratch it is on reactivemicro wiki.

No it is slower than an original apple 1 i tested a clone with the same components, I think the coding i have added to the emulator to add the led matrix logo slow it down, but my knowledged stop here!

I cant add the code. It is in 2 files separated with a lot of coding to add there is the emulated cpu that occupied a lot of space so i have add a file compressed in winrar with all the necessary to load it to arduino ide and install on arduino uno r4 wifi board.

Fixed now works at right speed!!! here the files Emulator A1.0

Glad you got it working, but I'm not going to download a zip file to find out how.

1 Like

I try to add the coding here but it is very long,
These are two files that go inside the same scratch:

a1.ino

// 12.01.2015 (c) P.Sieg simple Apple 1 emulator based on arduino_6502 c:\Users\Matteo\Downloads\a1logo.h
// project from miker00lz
// Released under GNU GPL V2
//Led Matrix Logo by Toolkitman

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

uint8_t curkey = 0;
uint8_t iskey  = 0;

extern "C" {
  uint16_t getpc();
  uint8_t getop();
  void exec6502(int32_t tickcount);
  void reset6502();
  void serout(uint8_t val) {
    //Serial.print(val, HEX);
    //Serial.println();
    Serial.write(val);
  }
  uint8_t isakey() {
    if (Serial.available()) iskey  = 0x80;
    else iskey = 0;
    return(iskey);
  }
  uint8_t getkey() {
    curkey = Serial.read() & 0x7F;
    // make a-z => A-Z
    if ((curkey >= 97) && (curkey <= 122)) curkey = curkey - 0x20;
    return(curkey);
  }
  void clearkey() {
    curkey = 0;
  }
  void printhex(uint16_t val) {
    Serial.print(val, HEX);
    Serial.println();
  }
}

void setup ()
{
  Serial.begin (9600);
  Serial.println ();
  reset6502();
  matrix.begin();
}
const uint32_t a1logo [] = 
	{
		0x20000,
		0x7766525,
		0x72057000,
		66
	};


void loop () {
  exec6502(100); //if timing is enabled, this value is in 6502 clock ticks. otherwise, simply instruction count.
  matrix.loadFrame(a1logo);
}

cpu.c

#include <stdint.h>
#include <avr/pgmspace.h>

extern void printhex(uint16_t val);
extern void serout(uint8_t value);

#define NULL (void *) 0

#define RAM_SIZE 8192 //Pro 328
//#define RAM_SIZE 4096 //Mega 1280/2560

//6502 defines
//#define UNDOCUMENTED //when this is defined, undocumented opcodes are handled.
                     //otherwise, they're simply treated as NOPs.

//#define USE_TIMING //slower, but allows you to specify number of cycles to run for exec6502 
                   //rather than simply a number of instructions. also uses a little more
                   //program memory when enabled.

#define FLAG_CARRY     0x01
#define FLAG_ZERO      0x02
#define FLAG_INTERRUPT 0x04
#define FLAG_DECIMAL   0x08
#define FLAG_BREAK     0x10
#define FLAG_CONSTANT  0x20
#define FLAG_OVERFLOW  0x40
#define FLAG_SIGN      0x80

#define BASE_STACK     0x100

#define saveaccum(n) a = (uint8_t)((n) & 0x00FF)

//flag modifier macros
#define setcarry() cpustatus |= FLAG_CARRY
#define clearcarry() cpustatus &= (~FLAG_CARRY)
#define setzero() cpustatus |= FLAG_ZERO
#define clearzero() cpustatus &= (~FLAG_ZERO)
#define setinterrupt() cpustatus |= FLAG_INTERRUPT
#define clearinterrupt() cpustatus &= (~FLAG_INTERRUPT)
#define setdecimal() cpustatus |= FLAG_DECIMAL
#define cleardecimal() cpustatus &= (~FLAG_DECIMAL)
#define setoverflow() cpustatus |= FLAG_OVERFLOW
#define clearoverflow() cpustatus &= (~FLAG_OVERFLOW)
#define setsign() cpustatus |= FLAG_SIGN
#define clearsign() cpustatus &= (~FLAG_SIGN)

//flag calculation macros
#define zerocalc(n) { if ((n) & 0x00FF) clearzero(); else setzero(); }

#define signcalc(n) { if ((n) & 0x0080) setsign(); else clearsign(); }

#define carrycalc(n) { if ((n) & 0xFF00) setcarry(); else clearcarry(); }

#define overflowcalc(n, m, o) { if (((n) ^ (uint16_t)(m)) & ((n) ^ (o)) & 0x0080) setoverflow(); else clearoverflow(); }


//6502 CPU registers
uint16_t pc;
uint8_t sp, a, x, y, cpustatus;


//helper variables
uint32_t instructions = 0; //keep track of total instructions executed
int32_t clockticks6502 = 0, clockgoal6502 = 0;
uint16_t oldpc, ea, reladdr, value, result;
uint8_t opcode, oldcpustatus, useaccum;

uint8_t RAM[RAM_SIZE];

prog_uchar BASIC[4096] PROGMEM = {
0x4c, 0xb0, 0xe2, 0xad, 0x11, 0xd0, 0x10, 0xfb, 0xad, 0x10, 0xd0, 0x60, 0x8a, 0x29, 0x20, 0xf0, 0x23, 0xa9, 0xa0, 0x85, 0xe4, 0x4c, 0xc9, 0xe3, 0xa9, 0x20, 0xc5, 0x24, 0xb0, 0xc, 0xa9, 0x8d, 0xa0, 0x7, 0x20, 0xc9, 0xe3, 0xa9, 0xa0, 0x88, 0xd0, 0xf8, 0xa0, 0x0, 0xb1, 0xe2, 0xe6, 0xe2, 0xd0, 0x2, 0xe6, 0xe3, 0x60, 0x20, 0x15, 0xe7, 0x20, 0x76, 0xe5, 0xa5, 0xe2, 0xc5, 0xe6, 0xa5, 0xe3, 0xe5, 0xe7, 0xb0, 0xef, 0x20, 0x6d, 0xe0, 0x4c, 0x3b, 0xe0, 0xa5, 0xca, 0x85, 0xe2, 0xa5, 0xcb, 0x85, 0xe3, 0xa5, 0x4c, 0x85, 0xe6, 0xa5, 0x4d, 0x85, 0xe7, 0xd0, 0xde, 0x20, 0x15, 0xe7, 0x20, 0x6d, 0xe5, 0xa5, 0xe4, 0x85, 0xe2, 0xa5, 0xe5, 0x85, 0xe3, 0xb0, 0xc7, 0x86, 0xd8, 0xa9, 0xa0, 0x85, 0xfa, 0x20, 0x2a, 0xe0, 0x98, 0x85, 0xe4, 0x20, 0x2a, 0xe0, 0xaa, 0x20, 0x2a, 0xe0, 0x20, 0x1b, 0xe5, 0x20, 0x18, 0xe0, 0x84, 0xfa, 0xaa, 0x10, 0x18, 0xa, 0x10, 0xe9, 0xa5, 0xe4, 0xd0, 0x3, 0x20, 0x11, 0xe0, 0x8a, 0x20, 0xc9, 0xe3, 0xa9, 0x25, 0x20, 0x1a, 0xe0, 0xaa, 0x30, 0xf5, 0x85, 0xe4, 0xc9, 0x1, 0xd0, 0x5, 0xa6, 0xd8, 0x4c, 0xcd, 0xe3, 0x48, 0x84, 0xce, 0xa2, 0xed, 0x86, 0xcf, 0xc9, 0x51, 0x90, 0x4, 0xc6, 0xcf, 0xe9, 0x50, 0x48, 0xb1, 0xce, 0xaa, 0x88, 0xb1, 0xce, 0x10, 0xfa, 0xe0, 0xc0, 0xb0, 0x4, 0xe0, 0x0, 0x30, 0xf2, 0xaa, 0x68, 0xe9, 0x1, 0xd0, 0xe9, 0x24, 0xe4, 0x30, 0x3, 0x20, 0xf8, 0xef, 0xb1, 0xce, 0x10, 0x10, 0xaa, 0x29, 0x3f, 0x85, 0xe4, 0x18, 0x69, 0xa0, 0x20, 0xc9, 0xe3, 0x88, 0xe0, 0xc0, 0x90, 0xec, 0x20, 0xc, 0xe0, 0x68, 0xc9, 0x5d, 0xf0, 0xa4, 0xc9, 0x28, 0xd0, 0x8a, 0xf0, 0x9e, 0x20, 0x18, 0xe1, 0x95, 0x50, 0xd5, 0x78, 0x90, 0x11, 0xa0, 0x2b, 0x4c, 0xe0, 0xe3, 0x20, 0x34, 0xee, 0xd5, 0x50, 0x90, 0xf4, 0x20, 0xe4, 0xef, 0x95, 0x78, 0x4c, 0x23, 0xe8, 0x20, 0x34, 0xee, 0xf0, 0xe7, 0x38, 0xe9, 0x1, 0x60, 0x20, 0x18, 0xe1, 0x95, 0x50, 0x18, 0xf5, 0x78, 0x4c, 0x2, 0xe1, 0xa0, 0x14, 0xd0, 0xd6, 0x20, 0x18, 0xe1, 0xe8, 0xb5, 0x50, 0x85, 0xda, 0x65, 0xce, 0x48, 0xa8, 0xb5, 0x78, 0x85, 0xdb, 0x65, 0xcf, 0x48, 0xc4, 0xca, 0xe5, 0xcb, 0xb0, 0xe3, 0xa5, 0xda, 0x69, 0xfe, 0x85, 0xda, 0xa9, 0xff, 0xa8, 0x65, 0xdb, 0x85, 0xdb, 0xc8, 0xb1, 0xda, 0xd9, 0xcc, 0x0, 0xd0, 0xf, 0x98, 0xf0, 0xf5, 0x68, 0x91, 0xda, 0x99, 0xcc, 0x0, 0x88, 0x10, 0xf7, 0xe8, 0x60, 0xea, 0xa0, 0x80, 0xd0, 0x95, 0xa9, 0x0, 0x20, 0xa, 0xe7, 0xa0, 0x2, 0x94, 0x78, 0x20, 0xa, 0xe7, 0xa9, 0xbf, 0x20, 0xc9, 0xe3, 0xa0, 0x0, 0x20, 0x9e, 0xe2, 0x94, 0x78, 0xea, 0xea, 0xea, 0xb5, 0x51, 0x85, 0xce, 0xb5, 0x79, 0x85, 0xcf, 0xe8, 0xe8, 0x20, 0xbc, 0xe1, 0xb5, 0x4e, 0xd5, 0x76, 0xb0, 0x15, 0xf6, 0x4e, 0xa8, 0xb1, 0xce, 0xb4, 0x50, 0xc4, 0xe4, 0x90, 0x4, 0xa0, 0x83, 0xd0, 0xc1, 0x91, 0xda, 0xf6, 0x50, 0x90, 0xe5, 0xb4, 0x50, 0x8a, 0x91, 0xda, 0xe8, 0xe8, 0x60, 0xb5, 0x51, 0x85, 0xda, 0x38, 0xe9, 0x2, 0x85, 0xe4, 0xb5, 0x79, 0x85, 0xdb, 0xe9, 0x0, 0x85, 0xe5, 0xa0, 0x0, 0xb1, 0xe4, 0x18, 0xe5, 0xda, 0x85, 0xe4, 0x60, 0xb5, 0x53, 0x85, 0xce, 0xb5, 0x7b, 0x85, 0xcf, 0xb5, 0x51, 0x85, 0xda, 0xb5, 0x79, 0x85, 0xdb, 0xe8, 0xe8, 0xe8, 0xa0, 0x0, 0x94, 0x78, 0x94, 0xa0, 0xc8, 0x94, 0x50, 0xb5, 0x4d, 0xd5, 0x75, 0x8, 0x48, 0xb5, 0x4f, 0xd5, 0x77, 0x90, 0x7, 0x68, 0x28, 0xb0, 0x2, 0x56, 0x50, 0x60, 0xa8, 0xb1, 0xce, 0x85, 0xe4, 0x68, 0xa8, 0x28, 0xb0, 0xf3, 0xb1, 0xda, 0xc5, 0xe4, 0xd0, 0xed, 0xf6, 0x4f, 0xf6, 0x4d, 0xb0, 0xd7, 0x20, 0xd7, 0xe1, 0x4c, 0x36, 0xe7, 0x20, 0x54, 0xe2, 0x6, 0xce, 0x26, 0xcf, 0x90, 0xd, 0x18, 0xa5, 0xe6, 0x65, 0xda, 0x85, 0xe6, 0xa5, 0xe7, 0x65, 0xdb, 0x85, 0xe7, 0x88, 0xf0, 0x9, 0x6, 0xe6, 0x26, 0xe7, 0x10, 0xe4, 0x4c, 0x7e, 0xe7, 0xa5, 0xe6, 0x20, 0x8, 0xe7, 0xa5, 0xe7, 0x95, 0xa0, 0x6, 0xe5, 0x90, 0x28, 0x4c, 0x6f, 0xe7, 0xa9, 0x55, 0x85, 0xe5, 0x20, 0x5b, 0xe2, 0xa5, 0xce, 0x85, 0xda, 0xa5, 0xcf, 0x85, 0xdb, 0x20, 0x15, 0xe7, 0x84, 0xe6, 0x84, 0xe7, 0xa5, 0xcf, 0x10, 0x9, 0xca, 0x6, 0xe5, 0x20, 0x6f, 0xe7, 0x20, 0x15, 0xe7, 0xa0, 0x10, 0x60, 0x20, 0x6c, 0xee, 0xf0, 0xc5, 0xff, 0xc9, 0x84, 0xd0, 0x2, 0x46, 0xf8, 0xc9, 0xdf, 0xf0, 0x11, 0xc9, 0x9b, 0xf0, 0x6, 0x99, 0x0, 0x2, 0xc8, 0x10, 0xa, 0xa0, 0x8b, 0x20, 0xc4, 0xe3, 0xa0, 0x1, 0x88, 0x30, 0xf6, 0x20, 0x3, 0xe0, 0xea, 0xea, 0x20, 0xc9, 0xe3, 0xc9, 0x8d, 0xd0, 0xd6, 0xa9, 0xdf, 0x99, 0x0, 0x2, 0x60, 0x20, 0xd3, 0xef, 0x20, 0xcd, 0xe3, 0x46, 0xd9, 0xa9, 0xbe, 0x20, 0xc9, 0xe3, 0xa0, 0x0, 0x84, 0xfa, 0x24, 0xf8, 0x10, 0xc, 0xa6, 0xf6, 0xa5, 0xf7, 0x20, 0x1b, 0xe5, 0xa9, 0xa0, 0x20, 0xc9, 0xe3, 0xa2, 0xff, 0x9a, 0x20, 0x9e, 0xe2, 0x84, 0xf1, 0x8a, 0x85, 0xc8, 0xa2, 0x20, 0x20, 0x91, 0xe4, 0xa5, 0xc8, 0x69, 0x0, 0x85, 0xe0, 0xa9, 0x0, 0xaa, 0x69, 0x2, 0x85, 0xe1, 0xa1, 0xe0, 0x29, 0xf0, 0xc9, 0xb0, 0xf0, 0x3, 0x4c, 0x83, 0xe8, 0xa0, 0x2, 0xb1, 0xe0, 0x99, 0xcd, 0x0, 0x88, 0xd0, 0xf8, 0x20, 0x8a, 0xe3, 0xa5, 0xf1, 0xe5, 0xc8, 0xc9, 0x4, 0xf0, 0xa8, 0x91, 0xe0, 0xa5, 0xca, 0xf1, 0xe0, 0x85, 0xe4, 0xa5, 0xcb, 0xe9, 0x0, 0x85, 0xe5, 0xa5, 0xe4, 0xc5, 0xcc, 0xa5, 0xe5, 0xe5, 0xcd, 0x90, 0x45, 0xa5, 0xca, 0xf1, 0xe0, 0x85, 0xe6, 0xa5, 0xcb, 0xe9, 0x0, 0x85, 0xe7, 0xb1, 0xca, 0x91, 0xe6, 0xe6, 0xca, 0xd0, 0x2, 0xe6, 0xcb, 0xa5, 0xe2, 0xc5, 0xca, 0xa5, 0xe3, 0xe5, 0xcb, 0xb0, 0xe0, 0xb5, 0xe4, 0x95, 0xca, 0xca, 0x10, 0xf9, 0xb1, 0xe0, 0xa8, 0x88, 0xb1, 0xe0, 0x91, 0xe6, 0x98, 0xd0, 0xf8, 0x24, 0xf8, 0x10, 0x9, 0xb5, 0xf7, 0x75, 0xf5, 0x95, 0xf7, 0xe8, 0xf0, 0xf7, 0x10, 0x7e, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x14, 0xd0, 0x71, 0x20, 0x15, 0xe7, 0xa5, 0xe2, 0x85, 0xe6, 0xa5, 0xe3, 0x85, 0xe7, 0x20, 0x75, 0xe5, 0xa5, 0xe2, 0x85, 0xe4, 0xa5, 0xe3, 0x85, 0xe5, 0xd0, 0xe, 0x20, 0x15, 0xe7, 0x20, 0x6d, 0xe5, 0xa5, 0xe6, 0x85, 0xe2, 0xa5, 0xe7, 0x85, 0xe3, 0xa0, 0x0, 0xa5, 0xca, 0xc5, 0xe4, 0xa5, 0xcb, 0xe5, 0xe5, 0xb0, 0x16, 0xa5, 0xe4, 0xd0, 0x2, 0xc6, 0xe5, 0xc6, 0xe4, 0xa5, 0xe6, 0xd0, 0x2, 0xc6, 0xe7, 0xc6, 0xe6, 0xb1, 0xe4, 0x91, 0xe6, 0x90, 0xe0, 0xa5, 0xe6, 0x85, 0xca, 0xa5, 0xe7, 0x85, 0xcb, 0x60, 0x20, 0xc9, 0xe3, 0xc8, 0xb9, 0x0, 0xeb, 0x30, 0xf7, 0xc9, 0x8d, 0xd0, 0x6, 0xa9, 0x0, 0x85, 0x24, 0xa9, 0x8d, 0xe6, 0x24, 0x2c, 0x12, 0xd0, 0x30, 0xfb, 0x8d, 0x12, 0xd0, 0x60, 0xa0, 0x6, 0x20, 0xd3, 0xee, 0x24, 0xd9, 0x30, 0x3, 0x4c, 0xb6, 0xe2, 0x4c, 0x9a, 0xeb, 0x2a, 0x69, 0xa0, 0xdd, 0x0, 0x2, 0xd0, 0x53, 0xb1, 0xfe, 0xa, 0x30, 0x6, 0x88, 0xb1, 0xfe, 0x30, 0x29, 0xc8, 0x86, 0xc8, 0x98, 0x48, 0xa2, 0x0, 0xa1, 0xfe, 0xaa, 0x4a, 0x49, 0x48, 0x11, 0xfe, 0xc9, 0xc0, 0x90, 0x1, 0xe8, 0xc8, 0xd0, 0xf3, 0x68, 0xa8, 0x8a, 0x4c, 0xc0, 0xe4, 0xe6, 0xf1, 0xa6, 0xf1, 0xf0, 0xbc, 0x9d, 0x0, 0x2, 0x60, 0xa6, 0xc8, 0xa9, 0xa0, 0xe8, 0xdd, 0x0, 0x2, 0xb0, 0xfa, 0xb1, 0xfe, 0x29, 0x3f, 0x4a, 0xd0, 0xb6, 0xbd, 0x0, 0x2, 0xb0, 0x6, 0x69, 0x3f, 0xc9, 0x1a, 0x90, 0x6f, 0x69, 0x4f, 0xc9, 0xa, 0x90, 0x69, 0xa6, 0xfd, 0xc8, 0xb1, 0xfe, 0x29, 0xe0, 0xc9, 0x20, 0xf0, 0x7a, 0xb5, 0xa8, 0x85, 0xc8, 0xb5, 0xd1, 0x85, 0xf1, 0x88, 0xb1, 0xfe, 0xa, 0x10, 0xfa, 0x88, 0xb0, 0x38, 0xa, 0x30, 0x35, 0xb4, 0x58, 0x84, 0xff, 0xb4, 0x80, 0xe8, 0x10, 0xda, 0xf0, 0xb3, 0xc9, 0x7e, 0xb0, 0x22, 0xca, 0x10, 0x4, 0xa0, 0x6, 0x10, 0x29, 0x94, 0x80, 0xa4, 0xff, 0x94, 0x58, 0xa4, 0xc8, 0x94, 0xa8, 0xa4, 0xf1, 0x94, 0xd1, 0x29, 0x1f, 0xa8, 0xb9, 0x20, 0xec, 0xa, 0xa8, 0xa9, 0x76, 0x2a, 0x85, 0xff, 0xd0, 0x1, 0xc8, 0xc8, 0x86, 0xfd, 0xb1, 0xfe, 0x30, 0x84, 0xd0, 0x5, 0xa0, 0xe, 0x4c, 0xe0, 0xe3, 0xc9, 0x3, 0xb0, 0xc3, 0x4a, 0xa6, 0xc8, 0xe8, 0xbd, 0x0, 0x2, 0x90, 0x4, 0xc9, 0xa2, 0xf0, 0xa, 0xc9, 0xdf, 0xf0, 0x6, 0x86, 0xc8, 0x20, 0x1c, 0xe4, 0xc8, 0x88, 0xa6, 0xfd, 0xb1, 0xfe, 0x88, 0xa, 0x10, 0xcf, 0xb4, 0x58, 0x84, 0xff, 0xb4, 0x80, 0xe8, 0xb1, 0xfe, 0x29, 0x9f, 0xd0, 0xed, 0x85, 0xf2, 0x85, 0xf3, 0x98, 0x48, 0x86, 0xfd, 0xb4, 0xd0, 0x84, 0xc9, 0x18, 0xa9, 0xa, 0x85, 0xf9, 0xa2, 0x0, 0xc8, 0xb9, 0x0, 0x2, 0x29, 0xf, 0x65, 0xf2, 0x48, 0x8a, 0x65, 0xf3, 0x30, 0x1c, 0xaa, 0x68, 0xc6, 0xf9, 0xd0, 0xf2, 0x85, 0xf2, 0x86, 0xf3, 0xc4, 0xf1, 0xd0, 0xde, 0xa4, 0xc9, 0xc8, 0x84, 0xf1, 0x20, 0x1c, 0xe4, 0x68, 0xa8, 0xa5, 0xf3, 0xb0, 0xa9, 0xa0, 0x0, 0x10, 0x8b, 0x85, 0xf3, 0x86, 0xf2, 0xa2, 0x4, 0x86, 0xc9, 0xa9, 0xb0, 0x85, 0xf9, 0xa5, 0xf2, 0xdd, 0x63, 0xe5, 0xa5, 0xf3, 0xfd, 0x68, 0xe5, 0x90, 0xd, 0x85, 0xf3, 0xa5, 0xf2, 0xfd, 0x63, 0xe5, 0x85, 0xf2, 0xe6, 0xf9, 0xd0, 0xe7, 0xa5, 0xf9, 0xe8, 0xca, 0xf0, 0xe, 0xc9, 0xb0, 0xf0, 0x2, 0x85, 0xc9, 0x24, 0xc9, 0x30, 0x4, 0xa5, 0xfa, 0xf0, 0xb, 0x20, 0xc9, 0xe3, 0x24, 0xf8, 0x10, 0x4, 0x99, 0x0, 0x2, 0xc8, 0xca, 0x10, 0xc1, 0x60, 0x1, 0xa, 0x64, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x3, 0x27, 0xa5, 0xca, 0x85, 0xe6, 0xa5, 0xcb, 0x85, 0xe7, 0xe8, 0xa5, 0xe7, 0x85, 0xe5, 0xa5, 0xe6, 0x85, 0xe4, 0xc5, 0x4c, 0xa5, 0xe5, 0xe5, 0x4d, 0xb0, 0x26, 0xa0, 0x1, 0xb1, 0xe4, 0xe5, 0xce, 0xc8, 0xb1, 0xe4, 0xe5, 0xcf, 0xb0, 0x19, 0xa0, 0x0, 0xa5, 0xe6, 0x71, 0xe4, 0x85, 0xe6, 0x90, 0x3, 0xe6, 0xe7, 0x18, 0xc8, 0xa5, 0xce, 0xf1, 0xe4, 0xc8, 0xa5, 0xcf, 0xf1, 0xe4, 0xb0, 0xca, 0x60, 0x46, 0xf8, 0xa5, 0x4c, 0x85, 0xca, 0xa5, 0x4d, 0x85, 0xcb, 0xa5, 0x4a, 0x85, 0xcc, 0xa5, 0x4b, 0x85, 0xcd, 0xa9, 0x0, 0x85, 0xfb, 0x85, 0xfc, 0x85, 0xfe, 0xa9, 0x0, 0x85, 0x1d, 0x60, 0xa5, 0xd0, 0x69, 0x5, 0x85, 0xd2, 0xa5, 0xd1, 0x69, 0x0, 0x85, 0xd3, 0xa5, 0xd2, 0xc5, 0xca, 0xa5, 0xd3, 0xe5, 0xcb, 0x90, 0x3, 0x4c, 0x6b, 0xe3, 0xa5, 0xce, 0x91, 0xd0, 0xa5, 0xcf, 0xc8, 0x91, 0xd0, 0xa5, 0xd2, 0xc8, 0x91, 0xd0, 0xa5, 0xd3, 0xc8, 0x91, 0xd0, 0xa9, 0x0, 0xc8, 0x91, 0xd0, 0xc8, 0x91, 0xd0, 0xa5, 0xd2, 0x85, 0xcc, 0xa5, 0xd3, 0x85, 0xcd, 0xa5, 0xd0, 0x90, 0x43, 0x85, 0xce, 0x84, 0xcf, 0x20, 0xff, 0xe6, 0x30, 0xe, 0xc9, 0x40, 0xf0, 0xa, 0x4c, 0x28, 0xe6, 0x6, 0xc9, 0x49, 0xd0, 0x7, 0xa9, 0x49, 0x85, 0xcf, 0x20, 0xff, 0xe6, 0xa5, 0x4b, 0x85, 0xd1, 0xa5, 0x4a, 0x85, 0xd0, 0xc5, 0xcc, 0xa5, 0xd1, 0xe5, 0xcd, 0xb0, 0x94, 0xb1, 0xd0, 0xc8, 0xc5, 0xce, 0xd0, 0x6, 0xb1, 0xd0, 0xc5, 0xcf, 0xf0, 0xe, 0xc8, 0xb1, 0xd0, 0x48, 0xc8, 0xb1, 0xd0, 0x85, 0xd1, 0x68, 0xa0, 0x0, 0xf0, 0xdb, 0xa5, 0xd0, 0x69, 0x3, 0x20, 0xa, 0xe7, 0xa5, 0xd1, 0x69, 0x0, 0x95, 0x78, 0xa5, 0xcf, 0xc9, 0x40, 0xd0, 0x1c, 0x88, 0x98, 0x20, 0xa, 0xe7, 0x88, 0x94, 0x78, 0xa0, 0x3, 0xf6, 0x78, 0xc8, 0xb1, 0xd0, 0x30, 0xf9, 0x10, 0x9, 0xa9, 0x0, 0x85, 0xd4, 0x85, 0xd5, 0xa2, 0x20, 0x48, 0xa0, 0x0, 0xb1, 0xe0, 0x10, 0x18, 0xa, 0x30, 0x81, 0x20, 0xff, 0xe6, 0x20, 0x8, 0xe7, 0x20, 0xff, 0xe6, 0x95, 0xa0, 0x24, 0xd4, 0x10, 0x1, 0xca, 0x20, 0xff, 0xe6, 0xb0, 0xe6, 0xc9, 0x28, 0xd0, 0x1f, 0xa5, 0xe0, 0x20, 0xa, 0xe7, 0xa5, 0xe1, 0x95, 0x78, 0x24, 0xd4, 0x30, 0xb, 0xa9, 0x1, 0x20, 0xa, 0xe7, 0xa9, 0x0, 0x95, 0x78, 0xf6, 0x78, 0x20, 0xff, 0xe6, 0x30, 0xf9, 0xb0, 0xd3, 0x24, 0xd4, 0x10, 0x6, 0xc9, 0x4, 0xb0, 0xd0, 0x46, 0xd4, 0xa8, 0x85, 0xd6, 0xb9, 0x98, 0xe9, 0x29, 0x55, 0xa, 0x85, 0xd7, 0x68, 0xa8, 0xb9, 0x98, 0xe9, 0x29, 0xaa, 0xc5, 0xd7, 0xb0, 0x9, 0x98, 0x48, 0x20, 0xff, 0xe6, 0xa5, 0xd6, 0x90, 0x95, 0xb9, 0x10, 0xea, 0x85, 0xce, 0xb9, 0x88, 0xea, 0x85, 0xcf, 0x20, 0xfc, 0xe6, 0x4c, 0xd8, 0xe6, 0x6c, 0xce, 0x0, 0xe6, 0xe0, 0xd0, 0x2, 0xe6, 0xe1, 0xb1, 0xe0, 0x60, 0x94, 0x77, 0xca, 0x30, 0x3, 0x95, 0x50, 0x60, 0xa0, 0x66, 0x4c, 0xe0, 0xe3, 0xa0, 0x0, 0xb5, 0x50, 0x85, 0xce, 0xb5, 0xa0, 0x85, 0xcf, 0xb5, 0x78, 0xf0, 0xe, 0x85, 0xcf, 0xb1, 0xce, 0x48, 0xc8, 0xb1, 0xce, 0x85, 0xcf, 0x68, 0x85, 0xce, 0x88, 0xe8, 0x60, 0x20, 0x4a, 0xe7, 0x20, 0x15, 0xe7, 0x98, 0x20, 0x8, 0xe7, 0x95, 0xa0, 0xc5, 0xce, 0xd0, 0x6, 0xc5, 0xcf, 0xd0, 0x2, 0xf6, 0x50, 0x60, 0x20, 0x82, 0xe7, 0x20, 0x59, 0xe7, 0x20, 0x15, 0xe7, 0x24, 0xcf, 0x30, 0x1b, 0xca, 0x60, 0x20, 0x15, 0xe7, 0xa5, 0xcf, 0xd0, 0x4, 0xa5, 0xce, 0xf0, 0xf3, 0xa9, 0xff, 0x20, 0x8, 0xe7, 0x95, 0xa0, 0x24, 0xcf, 0x30, 0xe9, 0x20, 0x15, 0xe7, 0x98, 0x38, 0xe5, 0xce, 0x20, 0x8, 0xe7, 0x98, 0xe5, 0xcf, 0x50, 0x23, 0xa0, 0x0, 0x10, 0x90, 0x20, 0x6f, 0xe7, 0x20, 0x15, 0xe7, 0xa5, 0xce, 0x85, 0xda, 0xa5, 0xcf, 0x85, 0xdb, 0x20, 0x15, 0xe7, 0x18, 0xa5, 0xce, 0x65, 0xda, 0x20, 0x8, 0xe7, 0xa5, 0xcf, 0x65, 0xdb, 0x70, 0xdd, 0x95, 0xa0, 0x60, 0x20, 0x15, 0xe7, 0xa4, 0xce, 0xf0, 0x5, 0x88, 0xa5, 0xcf, 0xf0, 0xc, 0x60, 0xa5, 0x24, 0x9, 0x7, 0xa8, 0xc8, 0xa9, 0xa0, 0x20, 0xc9, 0xe3, 0xc4, 0x24, 0xb0, 0xf7, 0x60, 0x20, 0xb1, 0xe7, 0x20, 0x15, 0xe7, 0xa5, 0xcf, 0x10, 0xa, 0xa9, 0xad, 0x20, 0xc9, 0xe3, 0x20, 0x72, 0xe7, 0x50, 0xef, 0x88, 0x84, 0xd5, 0x86, 0xcf, 0xa6, 0xce, 0x20, 0x1b, 0xe5, 0xa6, 0xcf, 0x60, 0x20, 0x15, 0xe7, 0xa5, 0xce, 0x85, 0xf6, 0xa5, 0xcf, 0x85, 0xf7, 0x88, 0x84, 0xf8, 0xc8, 0xa9, 0xa, 0x85, 0xf4, 0x84, 0xf5, 0x60, 0x20, 0x15, 0xe7, 0xa5, 0xce, 0xa4, 0xcf, 0x10, 0xf2, 0x20, 0x15, 0xe7, 0xb5, 0x50, 0x85, 0xda, 0xb5, 0x78, 0x85, 0xdb, 0xa5, 0xce, 0x91, 0xda, 0xc8, 0xa5, 0xcf, 0x91, 0xda, 0xe8, 0x60, 0x68, 0x68, 0x24, 0xd5, 0x10, 0x5, 0x20, 0xcd, 0xe3, 0x46, 0xd5, 0x60, 0xa0, 0xff, 0x84, 0xd7, 0x60, 0x20, 0xcd, 0xef, 0xf0, 0x7, 0xa9, 0x25, 0x85, 0xd6, 0x88, 0x84, 0xd4, 0xe8, 0x60, 0xa5, 0xca, 0xa4, 0xcb, 0xd0, 0x5a, 0xa0, 0x41, 0xa5, 0xfc, 0xc9, 0x8, 0xb0, 0x5e, 0xa8, 0xe6, 0xfc, 0xa5, 0xe0, 0x99, 0x0, 0x1, 0xa5, 0xe1, 0x99, 0x8, 0x1, 0xa5, 0xdc, 0x99, 0x10, 0x1, 0xa5, 0xdd, 0x99, 0x18, 0x1, 0x20, 0x15, 0xe7, 0x20, 0x6d, 0xe5, 0x90, 0x4, 0xa0, 0x37, 0xd0, 0x3b, 0xa5, 0xe4, 0xa4, 0xe5, 0x85, 0xdc, 0x84, 0xdd, 0x2c, 0x11, 0xd0, 0x30, 0x4f, 0x18, 0x69, 0x3, 0x90, 0x1, 0xc8, 0xa2, 0xff, 0x86, 0xd9, 0x9a, 0x85, 0xe0, 0x84, 0xe1, 0x20, 0x79, 0xe6, 0x24, 0xd9, 0x10, 0x49, 0x18, 0xa0, 0x0, 0xa5, 0xdc, 0x71, 0xdc, 0xa4, 0xdd, 0x90, 0x1, 0xc8, 0xc5, 0x4c, 0xd0, 0xd1, 0xc4, 0x4d, 0xd0, 0xcd, 0xa0, 0x34, 0x46, 0xd9, 0x4c, 0xe0, 0xe3, 0xa0, 0x4a, 0xa5, 0xfc, 0xf0, 0xf7, 0xc6, 0xfc, 0xa8, 0xb9, 0xf, 0x1, 0x85, 0xdc, 0xb9, 0x17, 0x1, 0x85, 0xdd, 0xbe, 0xff, 0x0, 0xb9, 0x7, 0x1, 0xa8, 0x8a, 0x4c, 0x7a, 0xe8, 0xa0, 0x63, 0x20, 0xc4, 0xe3, 0xa0, 0x1, 0xb1, 0xdc, 0xaa, 0xc8, 0xb1, 0xdc, 0x20, 0x1b, 0xe5, 0x4c, 0xb3, 0xe2, 0xc6, 0xfb, 0xa0, 0x5b, 0xa5, 0xfb, 0xf0, 0xc4, 0xa8, 0xb5, 0x50, 0xd9, 0x1f, 0x1, 0xd0, 0xf0, 0xb5, 0x78, 0xd9, 0x27, 0x1, 0xd0, 0xe9, 0xb9, 0x2f, 0x1, 0x85, 0xda, 0xb9, 0x37, 0x1, 0x85, 0xdb, 0x20, 0x15, 0xe7, 0xca, 0x20, 0x93, 0xe7, 0x20, 0x1, 0xe8, 0xca, 0xa4, 0xfb, 0xb9, 0x67, 0x1, 0x95, 0x9f, 0xb9, 0x5f, 0x1, 0xa0, 0x0, 0x20, 0x8, 0xe7, 0x20, 0x82, 0xe7, 0x20, 0x59, 0xe7, 0x20, 0x15, 0xe7, 0xa4, 0xfb, 0xa5, 0xce, 0xf0, 0x5, 0x59, 0x37, 0x1, 0x10, 0x12, 0xb9, 0x3f, 0x1, 0x85, 0xdc, 0xb9, 0x47, 0x1, 0x85, 0xdd, 0xbe, 0x4f, 0x1, 0xb9, 0x57, 0x1, 0xd0, 0x87, 0xc6, 0xfb, 0x60, 0xa0, 0x54, 0xa5, 0xfb, 0xc9, 0x8, 0xf0, 0x9a, 0xe6, 0xfb, 0xa8, 0xb5, 0x50, 0x99, 0x20, 0x1, 0xb5, 0x78, 0x99, 0x28, 0x1, 0x60, 0x20, 0x15, 0xe7, 0xa4, 0xfb, 0xa5, 0xce, 0x99, 0x5f, 0x1, 0xa5, 0xcf, 0x99, 0x67, 0x1, 0xa9, 0x1, 0x99, 0x2f, 0x1, 0xa9, 0x0, 0x99, 0x37, 0x1, 0xa5, 0xdc, 0x99, 0x3f, 0x1, 0xa5, 0xdd, 0x99, 0x47, 0x1, 0xa5, 0xe0, 0x99, 0x4f, 0x1, 0xa5, 0xe1, 0x99, 0x57, 0x1, 0x60, 0x20, 0x15, 0xe7, 0xa4, 0xfb, 0xa5, 0xce, 0x99, 0x2f, 0x1, 0xa5, 0xcf, 0x4c, 0x66, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3f, 0x3f, 0xc0, 0xc0, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x30, 0xf, 0xc0, 0xcc, 0xff, 0x55, 0x0, 0xab, 0xab, 0x3, 0x3, 0xff, 0xff, 0x55, 0xff, 0xff, 0x55, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xff, 0x55, 0xc3, 0xc3, 0xc3, 0x55, 0xf0, 0xf0, 0xcf, 0x56, 0x56, 0x56, 0x55, 0xff, 0xff, 0x55, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0xff, 0xff, 0xff, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x0, 0xab, 0x3, 0x57, 0x3, 0x3, 0x3, 0x3, 0x7, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0x19, 0x5d, 0x35, 0x4b, 0xf2, 0xec, 0x87, 0x6f, 0xad, 0xb7, 0xe2, 0xf8, 0x54, 0x80, 0x96, 0x85, 0x82, 0x22, 0x10, 0x33, 0x4a, 0x13, 0x6, 0xb, 0x4a, 0x1, 0x40, 0x47, 0x7a, 0x0, 0xff, 0x23, 0x9, 0x5b, 0x16, 0xb6, 0xcb, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x24, 0xf6, 0x4e, 0x59, 0x50, 0x0, 0xff, 0x23, 0xa3, 0x6f, 0x36, 0x23, 0xd7, 0x1c, 0x22, 0xc2, 0xae, 0xba, 0x23, 0xff, 0xff, 0x21, 0x30, 0x1e, 0x3, 0xc4, 0x20, 0x0, 0xc1, 0xff, 0xff, 0xff, 0xa0, 0x30, 0x1e, 0xa4, 0xd3, 0xb6, 0xbc, 0xaa, 0x3a, 0x1, 0x50, 0x7e, 0xd8, 0xd8, 0xa5, 0x3c, 0xff, 0x16, 0x5b, 0x28, 0x3, 0xc4, 0x1d, 0x0, 0xc, 0x4e, 0x0, 0x3e, 0x0, 0xa6, 0xb0, 0x0, 0xbc, 0xc6, 0x57, 0x8c, 0x1, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xe8, 0xe0, 0xe0, 0xe0, 0xef, 0xef, 0xe3, 0xe3, 0xe5, 0xe5, 0xe7, 0xe7, 0xee, 0xef, 0xef, 0xe7, 0xe7, 0xe2, 0xef, 0xe7, 0xe7, 0xec, 0xec, 0xec, 0xe7, 0xec, 0xec, 0xec, 0xe2, 0x0, 0xff, 0xe8, 0xe1, 0xe8, 0xe8, 0xef, 0xeb, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xef, 0xee, 0xef, 0xe7, 0xe7, 0x0, 0xff, 0xe8, 0xe7, 0xe7, 0xe7, 0xe8, 0xe1, 0xe2, 0xee, 0xee, 0xee, 0xee, 0xe8, 0xff, 0xff, 0xe1, 0xe1, 0xef, 0xee, 0xe7, 0xe8, 0xee, 0xe7, 0xff, 0xff, 0xff, 0xee, 0xe1, 0xef, 0xe7, 0xe8, 0xef, 0xef, 0xeb, 0xe9, 0xe8, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xff, 0xe8, 0xe8, 0xe8, 0xee, 0xe7, 0xe8, 0xef, 0xef, 0xee, 0xef, 0xee, 0xef, 0xee, 0xee, 0xef, 0xee, 0xee, 0xee, 0xe1, 0xe8, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xb3, 0xb2, 0xb7, 0xb6, 0x37, 0xd4, 0xcf, 0xcf, 0xa0, 0xcc, 0xcf, 0xce, 0x47, 0xd3, 0xd9, 0xce, 0xd4, 0xc1, 0x58, 0xcd, 0xc5, 0xcd, 0xa0, 0xc6, 0xd5, 0xcc, 0x4c, 0xd4, 0xcf, 0xcf, 0xa0, 0xcd, 0xc1, 0xce, 0xd9, 0xa0, 0xd0, 0xc1, 0xd2, 0xc5, 0xce, 0x53, 0xd3, 0xd4, 0xd2, 0xc9, 0xce, 0x47, 0xce, 0xcf, 0xa0, 0xc5, 0xce, 0x44, 0xc2, 0xc1, 0xc4, 0xa0, 0xc2, 0xd2, 0xc1, 0xce, 0xc3, 0x48, 0xbe, 0xb8, 0xa0, 0xc7, 0xcf, 0xd3, 0xd5, 0xc2, 0x53, 0xc2, 0xc1, 0xc4, 0xa0, 0xd2, 0xc5, 0xd4, 0xd5, 0xd2, 0x4e, 0xbe, 0xb8, 0xa0, 0xc6, 0xcf, 0xd2, 0x53, 0xc2, 0xc1, 0xc4, 0xa0, 0xce, 0xc5, 0xd8, 0x54, 0xd3, 0xd4, 0xcf, 0xd0, 0xd0, 0xc5, 0xc4, 0xa0, 0xc1, 0xd4, 0x20, 0xaa, 0xaa, 0xaa, 0x20, 0xa0, 0xc5, 0xd2, 0xd2, 0xd, 0xbe, 0xb2, 0xb5, 0x35, 0xd2, 0xc1, 0xce, 0xc7, 0x45, 0xc4, 0xc9, 0x4d, 0xd3, 0xd4, 0xd2, 0xa0, 0xcf, 0xd6, 0xc6, 0x4c, 0xdc, 0xd, 0xd2, 0xc5, 0xd4, 0xd9, 0xd0, 0xc5, 0xa0, 0xcc, 0xc9, 0xce, 0xc5, 0x8d, 0x3f, 0x46, 0xd9, 0x90, 0x3, 0x4c, 0xc3, 0xe8, 0xa6, 0xcf, 0x9a, 0xa6, 0xce, 0xa0, 0x8d, 0xd0, 0x2, 0xa0, 0x99, 0x20, 0xc4, 0xe3, 0x86, 0xce, 0xba, 0x86, 0xcf, 0xa0, 0xfe, 0x84, 0xd9, 0xc8, 0x84, 0xc8, 0x20, 0x99, 0xe2, 0x84, 0xf1, 0xa2, 0x20, 0xa9, 0x30, 0x20, 0x91, 0xe4, 0xe6, 0xd9, 0xa6, 0xce, 0xa4, 0xc8, 0xa, 0x85, 0xce, 0xc8, 0xb9, 0x0, 0x2, 0xc9, 0x74, 0xf0, 0xd2, 0x49, 0xb0, 0xc9, 0xa, 0xb0, 0xf0, 0xc8, 0xc8, 0x84, 0xc8, 0xb9, 0x0, 0x2, 0x48, 0xb9, 0xff, 0x1, 0xa0, 0x0, 0x20, 0x8, 0xe7, 0x68, 0x95, 0xa0, 0xa5, 0xce, 0xc9, 0xc7, 0xd0, 0x3, 0x20, 0x6f, 0xe7, 0x4c, 0x1, 0xe8, 0xff, 0xff, 0xff, 0x50, 0x20, 0x13, 0xec, 0xd0, 0x15, 0x20, 0xb, 0xec, 0xd0, 0x10, 0x20, 0x82, 0xe7, 0x20, 0x6f, 0xe7, 0x50, 0x3, 0x20, 0x82, 0xe7, 0x20, 0x59, 0xe7, 0x56, 0x50, 0x4c, 0x36, 0xe7, 0xff, 0xff, 0xc1, 0xff, 0x7f, 0xd1, 0xcc, 0xc7, 0xcf, 0xce, 0xc5, 0x9a, 0x98, 0x8b, 0x96, 0x95, 0x93, 0xbf, 0xb2, 0x32, 0x2d, 0x2b, 0xbc, 0xb0, 0xac, 0xbe, 0x35, 0x8e, 0x61, 0xff, 0xff, 0xff, 0xdd, 0xfb, 0x20, 0xc9, 0xef, 0x15, 0x4f, 0x10, 0x5, 0x20, 0xc9, 0xef, 0x35, 0x4f, 0x95, 0x50, 0x10, 0xcb, 0x4c, 0xc9, 0xef, 0x40, 0x60, 0x8d, 0x60, 0x8b, 0x0, 0x7e, 0x8c, 0x33, 0x0, 0x0, 0x60, 0x3, 0xbf, 0x12, 0x0, 0x40, 0x89, 0xc9, 0x47, 0x9d, 0x17, 0x68, 0x9d, 0xa, 0x0, 0x40, 0x60, 0x8d, 0x60, 0x8b, 0x0, 0x7e, 0x8c, 0x3c, 0x0, 0x0, 0x60, 0x3, 0xbf, 0x1b, 0x4b, 0x67, 0xb4, 0xa1, 0x7, 0x8c, 0x7, 0xae, 0xa9, 0xac, 0xa8, 0x67, 0x8c, 0x7, 0xb4, 0xaf, 0xac, 0xb0, 0x67, 0x9d, 0xb2, 0xaf, 0xac, 0xaf, 0xa3, 0x67, 0x8c, 0x7, 0xa5, 0xab, 0xaf, 0xb0, 0xf4, 0xae, 0xa9, 0xb2, 0xb0, 0x7f, 0xe, 0x27, 0xb4, 0xae, 0xa9, 0xb2, 0xb0, 0x7f, 0xe, 0x28, 0xb4, 0xae, 0xa9, 0xb2, 0xb0, 0x64, 0x7, 0xa6, 0xa9, 0x67, 0xaf, 0xb4, 0xaf, 0xa7, 0x78, 0xb4, 0xa5, 0xac, 0x78, 0x7f, 0x2, 0xad, 0xa5, 0xb2, 0x67, 0xa2, 0xb5, 0xb3, 0xaf, 0xa7, 0xee, 0xb2, 0xb5, 0xb4, 0xa5, 0xb2, 0x7e, 0x8c, 0x39, 0xb4, 0xb8, 0xa5, 0xae, 0x67, 0xb0, 0xa5, 0xb4, 0xb3, 0x27, 0xaf, 0xb4, 0x7, 0x9d, 0x19, 0xb2, 0xaf, 0xa6, 0x7f, 0x5, 0x37, 0xb4, 0xb5, 0xb0, 0xae, 0xa9, 0x7f, 0x5, 0x28, 0xb4, 0xb5, 0xb0, 0xae, 0xa9, 0x7f, 0x5, 0x2a, 0xb4, 0xb5, 0xb0, 0xae, 0xa9, 0xe4, 0xae, 0xa5, 0x0, 0xff, 0xff, 0x47, 0xa2, 0xa1, 0xb4, 0x7f, 0xd, 0x30, 0xad, 0xa9, 0xa4, 0x7f, 0xd, 0x23, 0xad, 0xa9, 0xa4, 0x67, 0xac, 0xac, 0xa1, 0xa3, 0x0, 0x40, 0x80, 0xc0, 0xc1, 0x80, 0x0, 0x47, 0x8c, 0x68, 0x8c, 0xdb, 0x67, 0x9b, 0x68, 0x9b, 0x50, 0x8c, 0x63, 0x8c, 0x7f, 0x1, 0x51, 0x7, 0x88, 0x29, 0x84, 0x80, 0xc4, 0x80, 0x57, 0x71, 0x7, 0x88, 0x14, 0xed, 0xa5, 0xad, 0xaf, 0xac, 0xed, 0xa5, 0xad, 0xa9, 0xa8, 0xf2, 0xaf, 0xac, 0xaf, 0xa3, 0x71, 0x8, 0x88, 0xae, 0xa5, 0xac, 0x68, 0x83, 0x8, 0x68, 0x9d, 0x8, 0x71, 0x7, 0x88, 0x60, 0x76, 0xb4, 0xaf, 0xae, 0x76, 0x8d, 0x76, 0x8b, 0x51, 0x7, 0x88, 0x19, 0xb8, 0xa4, 0xae, 0xb2, 0xf2, 0xb3, 0xb5, 0xf3, 0xa2, 0xa1, 0xee, 0xa7, 0xb3, 0xe4, 0xae, 0xb2, 0xeb, 0xa5, 0xa5, 0xb0, 0x51, 0x7, 0x88, 0x39, 0x81, 0xc1, 0x4f, 0x7f, 0xf, 0x2f, 0x0, 0x51, 0x6, 0x88, 0x29, 0xc2, 0xc, 0x82, 0x57, 0x8c, 0x6a, 0x8c, 0x42, 0xae, 0xa5, 0xa8, 0xb4, 0x60, 0xae, 0xa5, 0xa8, 0xb4, 0x4f, 0x7e, 0x1e, 0x35, 0x8c, 0x27, 0x51, 0x7, 0x88, 0x9, 0x8b, 0xfe, 0xe4, 0xaf, 0xad, 0xf2, 0xaf, 0xe4, 0xae, 0xa1, 0xdc, 0xde, 0x9c, 0xdd, 0x9c, 0xde, 0xdd, 0x9e, 0xc3, 0xdd, 0xcf, 0xca, 0xcd, 0xcb, 0x0, 0x47, 0x9d, 0xad, 0xa5, 0xad, 0xaf, 0xac, 0x76, 0x9d, 0xad, 0xa5, 0xad, 0xa9, 0xa8, 0xe6, 0xa6, 0xaf, 0x60, 0x8c, 0x20, 0xaf, 0xb4, 0xb5, 0xa1, 0xf2, 0xac, 0xa3, 0xf2, 0xa3, 0xb3, 0x60, 0x8c, 0x20, 0xac, 0xa5, 0xa4, 0xee, 0xb5, 0xb2, 0x60, 0xae, 0xb5, 0xb2, 0xf4, 0xb3, 0xa9, 0xac, 0x60, 0x8c, 0x20, 0xb4, 0xb3, 0xa9, 0xac, 0x7a, 0x7e, 0x9a, 0x22, 0x20, 0x0, 0x60, 0x3, 0xbf, 0x60, 0x3, 0xbf, 0x1f, 0x20, 0xb1, 0xe7, 0xe8, 0xe8, 0xb5, 0x4f, 0x85, 0xda, 0xb5, 0x77, 0x85, 0xdb, 0xb4, 0x4e, 0x98, 0xd5, 0x76, 0xb0, 0x9, 0xb1, 0xda, 0x20, 0xc9, 0xe3, 0xc8, 0x4c, 0xf, 0xee, 0xa9, 0xff, 0x85, 0xd5, 0x60, 0xe8, 0xa9, 0x0, 0x95, 0x78, 0x95, 0xa0, 0xb5, 0x77, 0x38, 0xf5, 0x4f, 0x95, 0x50, 0x4c, 0x23, 0xe8, 0xff, 0x20, 0x15, 0xe7, 0xa5, 0xcf, 0xd0, 0x28, 0xa5, 0xce, 0x60, 0x20, 0x34, 0xee, 0xa4, 0xc8, 0xc9, 0x30, 0xb0, 0x21, 0xc0, 0x28, 0xb0, 0x1d, 0x60, 0xea, 0xea, 0x20, 0x34, 0xee, 0x60, 0xea, 0x8a, 0xa2, 0x1, 0xb4, 0xce, 0x94, 0x4c, 0xb4, 0x48, 0x94, 0xca, 0xca, 0xf0, 0xf5, 0xaa, 0x60, 0xa0, 0x77, 0x4c, 0xe0, 0xe3, 0xa0, 0x7b, 0xd0, 0xf9, 0x20, 0x54, 0xe2, 0xa5, 0xda, 0xd0, 0x7, 0xa5, 0xdb, 0xd0, 0x3, 0x4c, 0x7e, 0xe7, 0x6, 0xce, 0x26, 0xcf, 0x26, 0xe6, 0x26, 0xe7, 0xa5, 0xe6, 0xc5, 0xda, 0xa5, 0xe7, 0xe5, 0xdb, 0x90, 0xa, 0x85, 0xe7, 0xa5, 0xe6, 0xe5, 0xda, 0x85, 0xe6, 0xe6, 0xce, 0x88, 0xd0, 0xe1, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x15, 0xe7, 0x6c, 0xce, 0x0, 0xa5, 0x4c, 0xd0, 0x2, 0xc6, 0x4d, 0xc6, 0x4c, 0xa5, 0x48, 0xd0, 0x2, 0xc6, 0x49, 0xc6, 0x48, 0xa0, 0x0, 0xb1, 0x4c, 0x91, 0x48, 0xa5, 0xca, 0xc5, 0x4c, 0xa5, 0xcb, 0xe5, 0x4d, 0x90, 0xe0, 0x4c, 0x53, 0xee, 0xc9, 0x28, 0xb0, 0x9b, 0xa8, 0xa5, 0xc8, 0x60, 0xea, 0xea, 0x98, 0xaa, 0xa0, 0x6e, 0x20, 0xc4, 0xe3, 0x8a, 0xa8, 0x20, 0xc4, 0xe3, 0xa0, 0x72, 0x4c, 0xc4, 0xe3, 0x20, 0x15, 0xe7, 0x6, 0xce, 0x26, 0xcf, 0x30, 0xfa, 0xb0, 0xdc, 0xd0, 0x4, 0xc5, 0xce, 0xb0, 0xd6, 0x60, 0x20, 0x15, 0xe7, 0xb1, 0xce, 0x94, 0x9f, 0x4c, 0x8, 0xe7, 0x20, 0x34, 0xee, 0xa5, 0xce, 0x48, 0x20, 0x15, 0xe7, 0x68, 0x91, 0xce, 0x60, 0xff, 0xff, 0xff, 0x20, 0x6c, 0xee, 0xa5, 0xce, 0x85, 0xe6, 0xa5, 0xcf, 0x85, 0xe7, 0x4c, 0x44, 0xe2, 0x20, 0xe4, 0xee, 0x4c, 0x34, 0xe1, 0x20, 0xe4, 0xee, 0xb4, 0x78, 0xb5, 0x50, 0x69, 0xfe, 0xb0, 0x1, 0x88, 0x85, 0xda, 0x84, 0xdb, 0x18, 0x65, 0xce, 0x95, 0x50, 0x98, 0x65, 0xcf, 0x95, 0x78, 0xa0, 0x0, 0xb5, 0x50, 0xd1, 0xda, 0xc8, 0xb5, 0x78, 0xf1, 0xda, 0xb0, 0x80, 0x4c, 0x23, 0xe8, 0x20, 0x15, 0xe7, 0xa5, 0x4e, 0x20, 0x8, 0xe7, 0xa5, 0x4f, 0xd0, 0x4, 0xc5, 0x4e, 0x69, 0x0, 0x29, 0x7f, 0x85, 0x4f, 0x95, 0xa0, 0xa0, 0x11, 0xa5, 0x4f, 0xa, 0x18, 0x69, 0x40, 0xa, 0x26, 0x4e, 0x26, 0x4f, 0x88, 0xd0, 0xf2, 0xa5, 0xce, 0x20, 0x8, 0xe7, 0xa5, 0xcf, 0x95, 0xa0, 0x4c, 0x7a, 0xe2, 0x20, 0x15, 0xe7, 0xa4, 0xce, 0xc4, 0x4c, 0xa5, 0xcf, 0xe5, 0x4d, 0x90, 0x1f, 0x84, 0x48, 0xa5, 0xcf, 0x85, 0x49, 0x4c, 0xb6, 0xee, 0x20, 0x15, 0xe7, 0xa4, 0xce, 0xc4, 0xca, 0xa5, 0xcf, 0xe5, 0xcb, 0xb0, 0x9, 0x84, 0x4a, 0xa5, 0xcf, 0x85, 0x4b, 0x4c, 0xb7, 0xe5, 0x4c, 0xcb, 0xee, 0xea, 0xea, 0xea, 0xea, 0x20, 0xc9, 0xef, 0x20, 0x71, 0xe1, 0x4c, 0xbf, 0xef, 0x20, 0x3, 0xee, 0xa9, 0xff, 0x85, 0xc8, 0xa9, 0x74, 0x8d, 0x0, 0x2, 0x60, 0x20, 0x36, 0xe7, 0xe8, 0x20, 0x36, 0xe7, 0xb5, 0x50, 0x60, 0xa9, 0x0, 0x85, 0x4a, 0x85, 0x4c, 0xa9, 0x8, 0x85, 0x4b, 0xa9, 0x10, 0x85, 0x4d, 0x4c, 0xad, 0xe5, 0xd5, 0x78, 0xd0, 0x1, 0x18, 0x4c, 0x2, 0xe1, 0x20, 0xb7, 0xe5, 0x4c, 0x36, 0xe8, 0x20, 0xb7, 0xe5, 0x4c, 0x5b, 0xe8, 0xe0, 0x80, 0xd0, 0x1, 0x88, 0x4c, 0xc, 0xe0
};

prog_uchar BIOS[256] PROGMEM = {
0xd8, 0x58, 0xa0, 0x7f, 0x8c, 0x12, 0xd0, 0xa9, 0xa7, 0x8d, 0x11, 0xd0, 0x8d, 0x13, 0xd0, 0xc9, 0xdf, 0xf0, 0x13, 0xc9, 0x9b, 0xf0, 0x3, 0xc8, 0x10, 0xf, 0xa9, 0xdc, 0x20, 0xef, 0xff, 0xa9, 0x8d, 0x20, 0xef, 0xff, 0xa0, 0x1, 0x88, 0x30, 0xf6, 0xad, 0x11, 0xd0, 0x10, 0xfb, 0xad, 0x10, 0xd0, 0x99, 0x0, 0x2, 0x20, 0xef, 0xff, 0xc9, 0x8d, 0xd0, 0xd4, 0xa0, 0xff, 0xa9, 0x0, 0xaa, 0xa, 0x85, 0x2b, 0xc8, 0xb9, 0x0, 0x2, 0xc9, 0x8d, 0xf0, 0xd4, 0xc9, 0xae, 0x90, 0xf4, 0xf0, 0xf0, 0xc9, 0xba, 0xf0, 0xeb, 0xc9, 0xd2, 0xf0, 0x3b, 0x86, 0x28, 0x86, 0x29, 0x84, 0x2a, 0xb9, 0x0, 0x2, 0x49, 0xb0, 0xc9, 0xa, 0x90, 0x6, 0x69, 0x88, 0xc9, 0xfa, 0x90, 0x11, 0xa, 0xa, 0xa, 0xa, 0xa2, 0x4, 0xa, 0x26, 0x28, 0x26, 0x29, 0xca, 0xd0, 0xf8, 0xc8, 0xd0, 0xe0, 0xc4, 0x2a, 0xf0, 0x97, 0x24, 0x2b, 0x50, 0x10, 0xa5, 0x28, 0x81, 0x26, 0xe6, 0x26, 0xd0, 0xb5, 0xe6, 0x27, 0x4c, 0x44, 0xff, 0x6c, 0x24, 0x0, 0x30, 0x2b, 0xa2, 0x2, 0xb5, 0x27, 0x95, 0x25, 0x95, 0x23, 0xca, 0xd0, 0xf7, 0xd0, 0x14, 0xa9, 0x8d, 0x20, 0xef, 0xff, 0xa5, 0x25, 0x20, 0xdc, 0xff, 0xa5, 0x24, 0x20, 0xdc, 0xff, 0xa9, 0xba, 0x20, 0xef, 0xff, 0xa9, 0xa0, 0x20, 0xef, 0xff, 0xa1, 0x24, 0x20, 0xdc, 0xff, 0x86, 0x2b, 0xa5, 0x24, 0xc5, 0x28, 0xa5, 0x25, 0xe5, 0x29, 0xb0, 0xc1, 0xe6, 0x24, 0xd0, 0x2, 0xe6, 0x25, 0xa5, 0x24, 0x29, 0x7, 0x10, 0xc8, 0x48, 0x4a, 0x4a, 0x4a, 0x4a, 0x20, 0xe5, 0xff, 0x68, 0x29, 0xf, 0x9, 0xb0, 0xc9, 0xba, 0x90, 0x2, 0x69, 0x6, 0x2c, 0x12, 0xd0, 0x30, 0xfb, 0x8d, 0x12, 0xd0, 0x60, 0x0, 0x0, 0x0, 0xf, 0x0, 0xff, 0x0, 0x0
};

uint8_t read6502(uint16_t address) {
  uint16_t BASICaddr, BIOSaddr;
  uint8_t tempval = 0;

  if (address == 0xD010) { //a1 simulated PIA key input
    tempval = getkey() | 0x80;
    clearkey();
    //printhex(tempval);
    return(tempval);
  }

  if (address == 0xD011) { //a1 simulated PIA key avail.
    tempval = isakey();
    //printhex(tempval);
    return(tempval);
  }

  if ((address >= 0xE000) && (address <= 0xEFFF)) {
    BASICaddr = address - 0xE000;
    return(pgm_read_byte_near(BASIC + BASICaddr));
  }
 
  if (address >= 0xF000) {
    BIOSaddr = address - 0xF000;
    if (BIOSaddr >= 0xF00) BIOSaddr = BIOSaddr - 0xF00;
    if (BIOSaddr >= 0xE00) BIOSaddr = BIOSaddr - 0xE00;
    if (BIOSaddr >= 0xD00) BIOSaddr = BIOSaddr - 0xD00;
    if (BIOSaddr >= 0xC00) BIOSaddr = BIOSaddr - 0xC00;
    if (BIOSaddr >= 0xB00) BIOSaddr = BIOSaddr - 0xB00;
    if (BIOSaddr >= 0xA00) BIOSaddr = BIOSaddr - 0xA00;
    if (BIOSaddr >= 0x900) BIOSaddr = BIOSaddr - 0x900;
    if (BIOSaddr >= 0x800) BIOSaddr = BIOSaddr - 0x800;
    if (BIOSaddr >= 0x700) BIOSaddr = BIOSaddr - 0x700;
    if (BIOSaddr >= 0x600) BIOSaddr = BIOSaddr - 0x600;
    if (BIOSaddr >= 0x500) BIOSaddr = BIOSaddr - 0x500;
    if (BIOSaddr >= 0x400) BIOSaddr = BIOSaddr - 0x400;
    if (BIOSaddr >= 0x300) BIOSaddr = BIOSaddr - 0x300;
    if (BIOSaddr >= 0x200) BIOSaddr = BIOSaddr - 0x200;
    if (BIOSaddr >= 0x100) BIOSaddr = BIOSaddr - 0x100;
    if (BIOSaddr < 0x100) return(pgm_read_byte_near(BIOS + BIOSaddr));
  }
  
  if (address < RAM_SIZE) return(RAM[address]);
  return(0);
}

void write6502(uint16_t address, uint8_t value) {
  if (address < RAM_SIZE) RAM[address] = value;
  if (address == 0xD012) { //a1 simulated PIA output
    serout(value & 0x7F);
  }
}

//a few general functions used by various other functions
void push16(uint16_t pushval) {
    write6502(BASE_STACK + sp, (pushval >> 8) & 0xFF);
    write6502(BASE_STACK + ((sp - 1) & 0xFF), pushval & 0xFF);
    sp -= 2;
}

void push8(uint8_t pushval) {
    write6502(BASE_STACK + sp--, pushval);
}

uint16_t pull16() {
    uint16_t temp16;
    temp16 = read6502(BASE_STACK + ((sp + 1) & 0xFF)) | ((uint16_t)read6502(BASE_STACK + ((sp + 2) & 0xFF)) << 8);
    sp += 2;
    return(temp16);
}

uint8_t pull8() {
    return (read6502(BASE_STACK + ++sp));
}

void reset6502() {
    pc = (uint16_t)read6502(0xFFFC) | ((uint16_t)read6502(0xFFFD) << 8);
    a = 0;
    x = 0;
    y = 0;
    sp = 0xFD;
    cpustatus |= FLAG_CONSTANT;
}

//addressing mode functions, calculates effective addresses
void imp() { //implied
}

void acc() { //accumulator
  useaccum = 1;
}

void imm() { //immediate
    ea = pc++;
}

void zp() { //zero-page
    ea = (uint16_t)read6502((uint16_t)pc++);
}

void zpx() { //zero-page,X
    ea = ((uint16_t)read6502((uint16_t)pc++) + (uint16_t)x) & 0xFF; //zero-page wraparound
}

void zpy() { //zero-page,Y
    ea = ((uint16_t)read6502((uint16_t)pc++) + (uint16_t)y) & 0xFF; //zero-page wraparound
}

void rel() { //relative for branch ops (8-bit immediate value, sign-extended)
    reladdr = (uint16_t)read6502(pc++);
    if (reladdr & 0x80) reladdr |= 0xFF00;
}

void abso() { //absolute
    ea = (uint16_t)read6502(pc) | ((uint16_t)read6502(pc+1) << 8);
    pc += 2;
}

void absx() { //absolute,X
    uint16_t startpage;
    ea = ((uint16_t)read6502(pc) | ((uint16_t)read6502(pc+1) << 8));
    startpage = ea & 0xFF00;
    ea += (uint16_t)x;

    pc += 2;
}

void absy() { //absolute,Y
    uint16_t startpage;
    ea = ((uint16_t)read6502(pc) | ((uint16_t)read6502(pc+1) << 8));
    startpage = ea & 0xFF00;
    ea += (uint16_t)y;

    pc += 2;
}

void ind() { //indirect
    uint16_t eahelp, eahelp2;
    eahelp = (uint16_t)read6502(pc) | (uint16_t)((uint16_t)read6502(pc+1) << 8);
    eahelp2 = (eahelp & 0xFF00) | ((eahelp + 1) & 0x00FF); //replicate 6502 page-boundary wraparound bug
    ea = (uint16_t)read6502(eahelp) | ((uint16_t)read6502(eahelp2) << 8);
    pc += 2;
}

void indx() { // (indirect,X)
    uint16_t eahelp;
    eahelp = (uint16_t)(((uint16_t)read6502(pc++) + (uint16_t)x) & 0xFF); //zero-page wraparound for table pointer
    ea = (uint16_t)read6502(eahelp & 0x00FF) | ((uint16_t)read6502((eahelp+1) & 0x00FF) << 8);
}

void indy() { // (indirect),Y
    uint16_t eahelp, eahelp2, startpage;
    eahelp = (uint16_t)read6502(pc++);
    eahelp2 = (eahelp & 0xFF00) | ((eahelp + 1) & 0x00FF); //zero-page wraparound
    ea = (uint16_t)read6502(eahelp) | ((uint16_t)read6502(eahelp2) << 8);
    startpage = ea & 0xFF00;
    ea += (uint16_t)y;

}

static uint16_t getvalue() {
    if (useaccum) return((uint16_t)a);
        else return((uint16_t)read6502(ea));
}

static uint16_t getvalue16() {
    return((uint16_t)read6502(ea) | ((uint16_t)read6502(ea+1) << 8));
}

void putvalue(uint16_t saveval) {
    if (useaccum) a = (uint8_t)(saveval & 0x00FF);
        else write6502(ea, (saveval & 0x00FF));
}


//instruction handler functions
void adc() {
    value = getvalue();
    result = (uint16_t)a + value + (uint16_t)(cpustatus & FLAG_CARRY);
   
    carrycalc(result);
    zerocalc(result);
    overflowcalc(result, a, value);
    signcalc(result);
    
    #ifndef NES_CPU
    if (cpustatus & FLAG_DECIMAL) {
        clearcarry();
        
        if ((a & 0x0F) > 0x09) {
            a += 0x06;
        }
        if ((a & 0xF0) > 0x90) {
            a += 0x60;
            setcarry();
        }
        
        clockticks6502++;
    }
    #endif
   
    saveaccum(result);
}

void op_and() {
    value = getvalue();
    result = (uint16_t)a & value;
   
    zerocalc(result);
    signcalc(result);
   
    saveaccum(result);
}

void asl() {
    value = getvalue();
    result = value << 1;

    carrycalc(result);
    zerocalc(result);
    signcalc(result);
   
    putvalue(result);
}

void bcc() {
    if ((cpustatus & FLAG_CARRY) == 0) {
        oldpc = pc;
        pc += reladdr;
        if ((oldpc & 0xFF00) != (pc & 0xFF00)) clockticks6502 += 2; //check if jump crossed a page boundary
            else clockticks6502++;
    }
}

void bcs() {
    if ((cpustatus & FLAG_CARRY) == FLAG_CARRY) {
        oldpc = pc;
        pc += reladdr;
        if ((oldpc & 0xFF00) != (pc & 0xFF00)) clockticks6502 += 2; //check if jump crossed a page boundary
            else clockticks6502++;
    }
}

void beq() {
    if ((cpustatus & FLAG_ZERO) == FLAG_ZERO) {
        oldpc = pc;
        pc += reladdr;
        if ((oldpc & 0xFF00) != (pc & 0xFF00)) clockticks6502 += 2; //check if jump crossed a page boundary
            else clockticks6502++;
    }
}

void op_bit() {
    value = getvalue();
    result = (uint16_t)a & value;
   
    zerocalc(result);
    cpustatus = (cpustatus & 0x3F) | (uint8_t)(value & 0xC0);
}

void bmi() {
    if ((cpustatus & FLAG_SIGN) == FLAG_SIGN) {
        oldpc = pc;
        pc += reladdr;
        if ((oldpc & 0xFF00) != (pc & 0xFF00)) clockticks6502 += 2; //check if jump crossed a page boundary
            else clockticks6502++;
    }
}

void bne() {
    if ((cpustatus & FLAG_ZERO) == 0) {
        oldpc = pc;
        pc += reladdr;
        if ((oldpc & 0xFF00) != (pc & 0xFF00)) clockticks6502 += 2; //check if jump crossed a page boundary
            else clockticks6502++;
    }
}

void bpl() {
    if ((cpustatus & FLAG_SIGN) == 0) {
        oldpc = pc;
        pc += reladdr;
        if ((oldpc & 0xFF00) != (pc & 0xFF00)) clockticks6502 += 2; //check if jump crossed a page boundary
            else clockticks6502++;
    }
}

void brk() {
    pc++;
    push16(pc); //push next instruction address onto stack
    push8(cpustatus | FLAG_BREAK); //push CPU cpustatus to stack
    setinterrupt(); //set interrupt flag
    pc = (uint16_t)read6502(0xFFFE) | ((uint16_t)read6502(0xFFFF) << 8);
}

void bvc() {
    if ((cpustatus & FLAG_OVERFLOW) == 0) {
        oldpc = pc;
        pc += reladdr;
        if ((oldpc & 0xFF00) != (pc & 0xFF00)) clockticks6502 += 2; //check if jump crossed a page boundary
            else clockticks6502++;
    }
}

void bvs() {
    if ((cpustatus & FLAG_OVERFLOW) == FLAG_OVERFLOW) {
        oldpc = pc;
        pc += reladdr;
        if ((oldpc & 0xFF00) != (pc & 0xFF00)) clockticks6502 += 2; //check if jump crossed a page boundary
            else clockticks6502++;
    }
}

void clc() {
    clearcarry();
}

void cld() {
    cleardecimal();
}

void cli() {
    clearinterrupt();
}

void clv() {
    clearoverflow();
}

void cmp() {
    value = getvalue();
    result = (uint16_t)a - value;
   
    if (a >= (uint8_t)(value & 0x00FF)) setcarry();
        else clearcarry();
    if (a == (uint8_t)(value & 0x00FF)) setzero();
        else clearzero();
    signcalc(result);
}

void cpx() {
    value = getvalue();
    result = (uint16_t)x - value;
   
    if (x >= (uint8_t)(value & 0x00FF)) setcarry();
        else clearcarry();
    if (x == (uint8_t)(value & 0x00FF)) setzero();
        else clearzero();
    signcalc(result);
}

void cpy() {
    value = getvalue();
    result = (uint16_t)y - value;
   
    if (y >= (uint8_t)(value & 0x00FF)) setcarry();
        else clearcarry();
    if (y == (uint8_t)(value & 0x00FF)) setzero();
        else clearzero();
    signcalc(result);
}

void dec() {
    value = getvalue();
    result = value - 1;
   
    zerocalc(result);
    signcalc(result);
   
    putvalue(result);
}

void dex() {
    x--;
   
    zerocalc(x);
    signcalc(x);
}

void dey() {
    y--;
   
    zerocalc(y);
    signcalc(y);
}

void eor() {
    value = getvalue();
    result = (uint16_t)a ^ value;
   
    zerocalc(result);
    signcalc(result);
   
    saveaccum(result);
}

void inc() {
    value = getvalue();
    result = value + 1;
   
    zerocalc(result);
    signcalc(result);
   
    putvalue(result);
}

void inx() {
    x++;
   
    zerocalc(x);
    signcalc(x);
}

void iny() {
    y++;
   
    zerocalc(y);
    signcalc(y);
}

void jmp() {
    pc = ea;
}

void jsr() {
    push16(pc - 1);
    pc = ea;
}

void lda() {
    value = getvalue();
    a = (uint8_t)(value & 0x00FF);
   
    zerocalc(a);
    signcalc(a);
}

void ldx() {
    value = getvalue();
    x = (uint8_t)(value & 0x00FF);
   
    zerocalc(x);
    signcalc(x);
}

void ldy() {
    value = getvalue();
    y = (uint8_t)(value & 0x00FF);
   
    zerocalc(y);
    signcalc(y);
}

void lsr() {
    value = getvalue();
    result = value >> 1;
   
    if (value & 1) setcarry();
        else clearcarry();
    zerocalc(result);
    signcalc(result);
   
    putvalue(result);
}

void nop() {
}

void ora() {
    value = getvalue();
    result = (uint16_t)a | value;
   
    zerocalc(result);
    signcalc(result);
   
    saveaccum(result);
}

void pha() {
    push8(a);
}

void php() {
    push8(cpustatus | FLAG_BREAK);
}

void pla() {
    a = pull8();
   
    zerocalc(a);
    signcalc(a);
}

void plp() {
    cpustatus = pull8() | FLAG_CONSTANT;
}

void rol() {
    value = getvalue();
    result = (value << 1) | (cpustatus & FLAG_CARRY);
   
    carrycalc(result);
    zerocalc(result);
    signcalc(result);
   
    putvalue(result);
}

void ror() {
    value = getvalue();
    result = (value >> 1) | ((cpustatus & FLAG_CARRY) << 7);
   
    if (value & 1) setcarry();
        else clearcarry();
    zerocalc(result);
    signcalc(result);
   
    putvalue(result);
}

void rti() {
    cpustatus = pull8();
    value = pull16();
    pc = value;
}

void rts() {
    value = pull16();
    pc = value + 1;
}

void sbc() {
    value = getvalue() ^ 0x00FF;
    result = (uint16_t)a + value + (uint16_t)(cpustatus & FLAG_CARRY);
   
    carrycalc(result);
    zerocalc(result);
    overflowcalc(result, a, value);
    signcalc(result);

    #ifndef NES_CPU
    if (cpustatus & FLAG_DECIMAL) {
        clearcarry();
        
        a -= 0x66;
        if ((a & 0x0F) > 0x09) {
            a += 0x06;
        }
        if ((a & 0xF0) > 0x90) {
            a += 0x60;
            setcarry();
        }
        
        clockticks6502++;
    }
    #endif
   
    saveaccum(result);
}

void sec() {
    setcarry();
}

void sed() {
    setdecimal();
}

void sei() {
    setinterrupt();
}

void sta() {
    putvalue(a);
}

void stx() {
    putvalue(x);
}

void sty() {
    putvalue(y);
}

void tax() {
    x = a;
   
    zerocalc(x);
    signcalc(x);
}

void tay() {
    y = a;
   
    zerocalc(y);
    signcalc(y);
}

void tsx() {
    x = sp;
   
    zerocalc(x);
    signcalc(x);
}

void txa() {
    a = x;
   
    zerocalc(a);
    signcalc(a);
}

void txs() {
    sp = x;
}

void tya() {
    a = y;
   
    zerocalc(a);
    signcalc(a);
}

//undocumented instructions
#ifdef UNDOCUMENTED
    void lax() {
        lda();
        ldx();
    }

    void sax() {
        sta();
        stx();
        putvalue(a & x);
    }

    void dcp() {
        dec();
        cmp();
    }

    void isb() {
        inc();
        sbc();
    }

    void slo() {
        asl();
        ora();
    }

    void rla() {
        rol();
        op_and();
    }

    void sre() {
        lsr();
        eor();
    }

    void rra() {
        ror();
        adc();
    }
#else
    #define lax nop
    #define sax nop
    #define dcp nop
    #define isb nop
    #define slo nop
    #define rla nop
    #define sre nop
    #define rra nop
#endif


void nmi6502() {
    push16(pc);
    push8(cpustatus);
    cpustatus |= FLAG_INTERRUPT;
    pc = (uint16_t)read6502(0xFFFA) | ((uint16_t)read6502(0xFFFB) << 8);
}

void irq6502() {
    push16(pc);
    push8(cpustatus);
    cpustatus |= FLAG_INTERRUPT;
    pc = (uint16_t)read6502(0xFFFE) | ((uint16_t)read6502(0xFFFF) << 8);
}

#ifdef USE_TIMING
prog_char ticktable[256] PROGMEM = {
/*        |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  A  |  B  |  C  |  D  |  E  |  F  |     */
/* 0 */      7,    6,    2,    8,    3,    3,    5,    5,    3,    2,    2,    2,    4,    4,    6,    6,  /* 0 */
/* 1 */      2,    5,    2,    8,    4,    4,    6,    6,    2,    4,    2,    7,    4,    4,    7,    7,  /* 1 */
/* 2 */      6,    6,    2,    8,    3,    3,    5,    5,    4,    2,    2,    2,    4,    4,    6,    6,  /* 2 */
/* 3 */      2,    5,    2,    8,    4,    4,    6,    6,    2,    4,    2,    7,    4,    4,    7,    7,  /* 3 */
/* 4 */      6,    6,    2,    8,    3,    3,    5,    5,    3,    2,    2,    2,    3,    4,    6,    6,  /* 4 */
/* 5 */      2,    5,    2,    8,    4,    4,    6,    6,    2,    4,    2,    7,    4,    4,    7,    7,  /* 5 */
/* 6 */      6,    6,    2,    8,    3,    3,    5,    5,    4,    2,    2,    2,    5,    4,    6,    6,  /* 6 */
/* 7 */      2,    5,    2,    8,    4,    4,    6,    6,    2,    4,    2,    7,    4,    4,    7,    7,  /* 7 */
/* 8 */      2,    6,    2,    6,    3,    3,    3,    3,    2,    2,    2,    2,    4,    4,    4,    4,  /* 8 */
/* 9 */      2,    6,    2,    6,    4,    4,    4,    4,    2,    5,    2,    5,    5,    5,    5,    5,  /* 9 */
/* A */      2,    6,    2,    6,    3,    3,    3,    3,    2,    2,    2,    2,    4,    4,    4,    4,  /* A */
/* B */      2,    5,    2,    5,    4,    4,    4,    4,    2,    4,    2,    4,    4,    4,    4,    4,  /* B */
/* C */      2,    6,    2,    8,    3,    3,    5,    5,    2,    2,    2,    2,    4,    4,    6,    6,  /* C */
/* D */      2,    5,    2,    8,    4,    4,    6,    6,    2,    4,    2,    7,    4,    4,    7,    7,  /* D */
/* E */      2,    6,    2,    8,    3,    3,    5,    5,    2,    2,    2,    2,    4,    4,    6,    6,  /* E */
/* F */      2,    5,    2,    8,    4,    4,    6,    6,    2,    4,    2,    7,    4,    4,    7,    7   /* F */
};
#endif

void exec6502(int32_t tickcount) {
#ifdef USE_TIMING
  clockgoal6502 += tickcount;
   
  while (clockgoal6502 > 0) {
#else
  while (tickcount--) {
#endif
    opcode = read6502(pc++);
    cpustatus |= FLAG_CONSTANT;

    useaccum = 0;

		switch (opcode) {
		case 0x0:
			imp();
			brk();
			break;
		case 0x1:
			indx();
			ora();
			break;
		case 0x5:
			zp();
			ora();
			break;
		case 0x6:
			zp();
			asl();
			break;
		case 0x8:
			imp();
			php();
			break;
		case 0x9:
			imm();
			ora();
			break;
		case 0xA:
			acc();
			asl();
			break;
		case 0xD:
			abso();
			ora();
			break;
		case 0xE:
			abso();
			asl();
			break;
		case 0x10:
			rel();
			bpl();
			break;
		case 0x11:
			indy();
			ora();
			break;
		case 0x15:
			zpx();
			ora();
			break;
		case 0x16:
			zpx();
			asl();
			break;
		case 0x18:
			imp();
			clc();
			break;
		case 0x19:
			absy();
			ora();
			break;
		case 0x1D:
			absx();
			ora();
			break;
		case 0x1E:
			absx();
			asl();
			break;
		case 0x20:
			abso();
			jsr();
			break;
		case 0x21:
			indx();
			op_and();
			break;
		case 0x24:
			zp();
			op_bit();
			break;
		case 0x25:
			zp();
			op_and();
			break;
		case 0x26:
			zp();
			rol();
			break;
		case 0x28:
			imp();
			plp();
			break;
		case 0x29:
			imm();
			op_and();
			break;
		case 0x2A:
			acc();
			rol();
			break;
		case 0x2C:
			abso();
			op_bit();
			break;
		case 0x2D:
			abso();
			op_and();
			break;
		case 0x2E:
			abso();
			rol();
			break;
		case 0x30:
			rel();
			bmi();
			break;
		case 0x31:
			indy();
			op_and();
			break;
		case 0x35:
			zpx();
			op_and();
			break;
		case 0x36:
			zpx();
			rol();
			break;
		case 0x38:
			imp();
			sec();
			break;
		case 0x39:
			absy();
			op_and();
			break;
		case 0x3D:
			absx();
			op_and();
			break;
		case 0x3E:
			absx();
			rol();
			break;
		case 0x40:
			imp();
			rti();
			break;
		case 0x41:
			indx();
			eor();
			break;
		case 0x45:
			zp();
			eor();
			break;
		case 0x46:
			zp();
			lsr();
			break;
		case 0x48:
			imp();
			pha();
			break;
		case 0x49:
			imm();
			eor();
			break;
		case 0x4A:
			acc();
			lsr();
			break;
		case 0x4C:
			abso();
			jmp();
			break;
		case 0x4D:
			abso();
			eor();
			break;
		case 0x4E:
			abso();
			lsr();
			break;
		case 0x50:
			rel();
			bvc();
			break;
		case 0x51:
			indy();
			eor();
			break;
		case 0x55:
			zpx();
			eor();
			break;
		case 0x56:
			zpx();
			lsr();
			break;
		case 0x58:
			imp();
			cli();
			break;
		case 0x59:
			absy();
			eor();
			break;
		case 0x5D:
			absx();
			eor();
			break;
		case 0x5E:
			absx();
			lsr();
			break;
		case 0x60:
			imp();
			rts();
			break;
		case 0x61:
			indx();
			adc();
			break;
		case 0x65:
			zp();
			adc();
			break;
		case 0x66:
			zp();
			ror();
			break;
		case 0x68:
			imp();
			pla();
			break;
		case 0x69:
			imm();
			adc();
			break;
		case 0x6A:
			acc();
			ror();
			break;
		case 0x6C:
			ind();
			jmp();
			break;
		case 0x6D:
			abso();
			adc();
			break;
		case 0x6E:
			abso();
			ror();
			break;
		case 0x70:
			rel();
			bvs();
			break;
		case 0x71:
			indy();
			adc();
			break;
		case 0x75:
			zpx();
			adc();
			break;
		case 0x76:
			zpx();
			ror();
			break;
		case 0x78:
			imp();
			sei();
			break;
		case 0x79:
			absy();
			adc();
			break;
		case 0x7D:
			absx();
			adc();
			break;
		case 0x7E:
			absx();
			ror();
			break;
		case 0x81:
			indx();
			sta();
			break;
		case 0x84:
			zp();
			sty();
			break;
		case 0x85:
			zp();
			sta();
			break;
		case 0x86:
			zp();
			stx();
			break;
		case 0x88:
			imp();
			dey();
			break;
		case 0x8A:
			imp();
			txa();
			break;
		case 0x8C:
			abso();
			sty();
			break;
		case 0x8D:
			abso();
			sta();
			break;
		case 0x8E:
			abso();
			stx();
			break;
		case 0x90:
			rel();
			bcc();
			break;
		case 0x91:
			indy();
			sta();
			break;
		case 0x94:
			zpx();
			sty();
			break;
		case 0x95:
			zpx();
			sta();
			break;
		case 0x96:
			zpy();
			stx();
			break;
		case 0x98:
			imp();
			tya();
			break;
		case 0x99:
			absy();
			sta();
			break;
		case 0x9A:
			imp();
			txs();
			break;
		case 0x9D:
			absx();
			sta();
			break;
		case 0xA0:
			imm();
			ldy();
			break;
		case 0xA1:
			indx();
			lda();
			break;
		case 0xA2:
			imm();
			ldx();
			break;
		case 0xA4:
			zp();
			ldy();
			break;
		case 0xA5:
			zp();
			lda();
			break;
		case 0xA6:
			zp();
			ldx();
			break;
		case 0xA8:
			imp();
			tay();
			break;
		case 0xA9:
			imm();
			lda();
			break;
		case 0xAA:
			imp();
			tax();
			break;
		case 0xAC:
			abso();
			ldy();
			break;
		case 0xAD:
			abso();
			lda();
			break;
		case 0xAE:
			abso();
			ldx();
			break;
		case 0xB0:
			rel();
			bcs();
			break;
		case 0xB1:
			indy();
			lda();
			break;
		case 0xB4:
			zpx();
			ldy();
			break;
		case 0xB5:
			zpx();
			lda();
			break;
		case 0xB6:
			zpy();
			ldx();
			break;
		case 0xB8:
			imp();
			clv();
			break;
		case 0xB9:
			absy();
			lda();
			break;
		case 0xBA:
			imp();
			tsx();
			break;
		case 0xBC:
			absx();
			ldy();
			break;
		case 0xBD:
			absx();
			lda();
			break;
		case 0xBE:
			absy();
			ldx();
			break;
		case 0xC0:
			imm();
			cpy();
			break;
		case 0xC1:
			indx();
			cmp();
			break;
		case 0xC4:
			zp();
			cpy();
			break;
		case 0xC5:
			zp();
			cmp();
			break;
		case 0xC6:
			zp();
			dec();
			break;
		case 0xC8:
			imp();
			iny();
			break;
		case 0xC9:
			imm();
			cmp();
			break;
		case 0xCA:
			imp();
			dex();
			break;
		case 0xCC:
			abso();
			cpy();
			break;
		case 0xCD:
			abso();
			cmp();
			break;
		case 0xCE:
			abso();
			dec();
			break;
		case 0xD0:
			rel();
			bne();
			break;
		case 0xD1:
			indy();
			cmp();
			break;
		case 0xD5:
			zpx();
			cmp();
			break;
		case 0xD6:
			zpx();
			dec();
			break;
		case 0xD8:
			imp();
			cld();
			break;
		case 0xD9:
			absy();
			cmp();
			break;
		case 0xDD:
			absx();
			cmp();
			break;
		case 0xDE:
			absx();
			dec();
			break;
		case 0xE0:
			imm();
			cpx();
			break;
		case 0xE1:
			indx();
			sbc();
			break;
		case 0xE4:
			zp();
			cpx();
			break;
		case 0xE5:
			zp();
			sbc();
			break;
		case 0xE6:
			zp();
			inc();
			break;
		case 0xE8:
			imp();
			inx();
			break;
		case 0xE9:
			imm();
			sbc();
			break;
		case 0xEB:
			imm();
			sbc();
			break;
		case 0xEC:
			abso();
			cpx();
			break;
		case 0xED:
			abso();
			sbc();
			break;
		case 0xEE:
			abso();
			inc();
			break;
		case 0xF0:
			rel();
			beq();
			break;
		case 0xF1:
			indy();
			sbc();
			break;
		case 0xF5:
			zpx();
			sbc();
			break;
		case 0xF6:
			zpx();
			inc();
			break;
		case 0xF8:
			imp();
			sed();
			break;
		case 0xF9:
			absy();
			sbc();
			break;
		case 0xFD:
			absx();
			sbc();
			break;
		case 0xFE:
			absx();
			inc();
			break;
		}
#ifdef USE_TIMING
      clockgoal6502 -= (int32_t)pgm_read_byte_near(ticktable + opcode);
#endif
      instructions++;
  }
}

uint16_t getpc() {
  return(pc);
}

uint8_t getop() {
  return(opcode);
}


Anyone can advice (if possible) an Arduino Nano that can fit this code and leave free at least 8kb memory for programs inside the Apple 1 emulator?
Thank you!

Arduino nano 33 BLE sense V2 works with this emulator adjusting ram size.
Here the catch in download Apple 1 nano 33 BLE sense v2 Emulator

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.