mirror of
https://github.com/pskupinski/65816.js.git
synced 2024-06-16 01:29:32 +00:00
added stack relative indirect indexed y addressing for the operations that support it
This commit is contained in:
parent
179980e8c3
commit
a2b0188024
496
cpu.js
496
cpu.js
|
@ -53,6 +53,7 @@ function CPU_65816() {
|
||||||
0xb2 : LDA_direct_page_indirect,
|
0xb2 : LDA_direct_page_indirect,
|
||||||
0xb1 : LDA_direct_page_indirect_indexed_y,
|
0xb1 : LDA_direct_page_indirect_indexed_y,
|
||||||
0xa3 : LDA_stack_relative,
|
0xa3 : LDA_stack_relative,
|
||||||
|
0xb3 : LDA_stack_relative_indirect_indexed_y,
|
||||||
0xa2 : LDX_const,
|
0xa2 : LDX_const,
|
||||||
0xae : LDX_absolute, 0xa6 : LDX_direct_page,
|
0xae : LDX_absolute, 0xa6 : LDX_direct_page,
|
||||||
0xa0 : LDY_const, 0xbc : LDY_absolute_indexed_x,
|
0xa0 : LDY_const, 0xbc : LDY_absolute_indexed_x,
|
||||||
|
@ -68,6 +69,7 @@ function CPU_65816() {
|
||||||
0x99 : STA_absolute_indexed_y,
|
0x99 : STA_absolute_indexed_y,
|
||||||
0x95 : STA_direct_page_indexed_x,
|
0x95 : STA_direct_page_indexed_x,
|
||||||
0x83 : STA_stack_relative,
|
0x83 : STA_stack_relative,
|
||||||
|
0x93 : STA_stack_relative_indexed_y,
|
||||||
0x8e : STX_absolute, 0x86 : STX_direct_page,
|
0x8e : STX_absolute, 0x86 : STX_direct_page,
|
||||||
0x96 : STX_direct_page_indexed_y,
|
0x96 : STX_direct_page_indexed_y,
|
||||||
0x8c : STY_absolute, 0x84 : STY_direct_page,
|
0x8c : STY_absolute, 0x84 : STY_direct_page,
|
||||||
|
@ -91,7 +93,9 @@ function CPU_65816() {
|
||||||
0x7d : ADC_absolute_indexed_x,
|
0x7d : ADC_absolute_indexed_x,
|
||||||
0x79 : ADC_absolute_indexed_y,
|
0x79 : ADC_absolute_indexed_y,
|
||||||
0x75 : ADC_direct_page_indexed_x,
|
0x75 : ADC_direct_page_indexed_x,
|
||||||
0x63 : ADC_stack_relative, 0xe9 : SBC_const,
|
0x63 : ADC_stack_relative,
|
||||||
|
0x73 : ADC_stack_relative_indirect_indexed_y,
|
||||||
|
0xe9 : SBC_const,
|
||||||
0xed : SBC_absolute, 0xe5 : SBC_direct_page,
|
0xed : SBC_absolute, 0xe5 : SBC_direct_page,
|
||||||
0xf2 : SBC_direct_page_indirect,
|
0xf2 : SBC_direct_page_indirect,
|
||||||
0xf1 : SBC_direct_page_indirect_indexed_y,
|
0xf1 : SBC_direct_page_indirect_indexed_y,
|
||||||
|
@ -99,6 +103,7 @@ function CPU_65816() {
|
||||||
0xf9 : SBC_absolute_indexed_y,
|
0xf9 : SBC_absolute_indexed_y,
|
||||||
0xe1 : SBC_direct_page_indexed_x,
|
0xe1 : SBC_direct_page_indexed_x,
|
||||||
0xe3 : SBC_stack_relative,
|
0xe3 : SBC_stack_relative,
|
||||||
|
0xf3 : SBC_stack_relative_indirect_indexed_y,
|
||||||
0xc9 : CMP_const, 0xc5 : CMP_direct_page,
|
0xc9 : CMP_const, 0xc5 : CMP_direct_page,
|
||||||
0xcd : CMP_absolute, 0xd2 : CMP_direct_page_indirect,
|
0xcd : CMP_absolute, 0xd2 : CMP_direct_page_indirect,
|
||||||
0xd5 : CMP_direct_page_indexed_x,
|
0xd5 : CMP_direct_page_indexed_x,
|
||||||
|
@ -106,6 +111,7 @@ function CPU_65816() {
|
||||||
0xd9 : CMP_absolute_indexed_y,
|
0xd9 : CMP_absolute_indexed_y,
|
||||||
0xd1 : CMP_direct_page_indirect_indexed_y,
|
0xd1 : CMP_direct_page_indirect_indexed_y,
|
||||||
0xc3 : CMP_stack_relative,
|
0xc3 : CMP_stack_relative,
|
||||||
|
0xd3 : CMP_stack_relative_indirect_indexed_y,
|
||||||
0xe0 : CPX_const,
|
0xe0 : CPX_const,
|
||||||
0xec : CPX_absolute, 0xe4 : CPX_direct_page,
|
0xec : CPX_absolute, 0xe4 : CPX_direct_page,
|
||||||
0xc0 : CPY_const, 0xcc : CPY_absolute,
|
0xc0 : CPY_const, 0xcc : CPY_absolute,
|
||||||
|
@ -116,7 +122,9 @@ function CPU_65816() {
|
||||||
0x3d : AND_absolute_indexed_x,
|
0x3d : AND_absolute_indexed_x,
|
||||||
0x39 : AND_absolute_indexed_y,
|
0x39 : AND_absolute_indexed_y,
|
||||||
0x35 : AND_direct_page_indexed_x,
|
0x35 : AND_direct_page_indexed_x,
|
||||||
0x23 : AND_stack_relative, 0x09 : ORA_const,
|
0x23 : AND_stack_relative,
|
||||||
|
0x33 : AND_stack_relative_indirect_indexed_y,
|
||||||
|
0x09 : ORA_const,
|
||||||
0x0d : ORA_absolute, 0x05 : ORA_direct_page,
|
0x0d : ORA_absolute, 0x05 : ORA_direct_page,
|
||||||
0x12 : ORA_direct_page_indirect,
|
0x12 : ORA_direct_page_indirect,
|
||||||
0x11 : ORA_direct_page_indirect_indexed_y,
|
0x11 : ORA_direct_page_indirect_indexed_y,
|
||||||
|
@ -124,6 +132,7 @@ function CPU_65816() {
|
||||||
0x1f : ORA_absolute_indexed_y,
|
0x1f : ORA_absolute_indexed_y,
|
||||||
0x15 : ORA_direct_page_indexed_x,
|
0x15 : ORA_direct_page_indexed_x,
|
||||||
0x03 : ORA_stack_relative,
|
0x03 : ORA_stack_relative,
|
||||||
|
0x13 : ORA_stack_relative_indirect_indexed_y,
|
||||||
0x49 : EOR_const, 0x4d : EOR_absolute,
|
0x49 : EOR_const, 0x4d : EOR_absolute,
|
||||||
0x45 : EOR_direct_page,
|
0x45 : EOR_direct_page,
|
||||||
0x52 : EOR_direct_page_indirect,
|
0x52 : EOR_direct_page_indirect,
|
||||||
|
@ -131,6 +140,8 @@ function CPU_65816() {
|
||||||
0x5d : EOR_absolute_indexed_x,
|
0x5d : EOR_absolute_indexed_x,
|
||||||
0x59 : EOR_absolute_indexed_y,
|
0x59 : EOR_absolute_indexed_y,
|
||||||
0x55 : EOR_direct_page_indexed_x,
|
0x55 : EOR_direct_page_indexed_x,
|
||||||
|
0x43 : EOR_stack_relative,
|
||||||
|
0x53 : EOR_stack_relative_indirect_indexed_y,
|
||||||
0x4a : LSR_accumulator, 0x4e : LSR_absolute,
|
0x4a : LSR_accumulator, 0x4e : LSR_absolute,
|
||||||
0x46 : LSR_direct_page, 0x5e : LSR_absolute_indexed_x,
|
0x46 : LSR_direct_page, 0x5e : LSR_absolute_indexed_x,
|
||||||
0x56 : LSR_direct_page_indexed_x, 0x0a : ASL_accumulator,
|
0x56 : LSR_direct_page_indexed_x, 0x0a : ASL_accumulator,
|
||||||
|
@ -472,8 +483,8 @@ var PEA = {
|
||||||
return 3;
|
return 3;
|
||||||
},
|
},
|
||||||
execute:function(cpu, bytes) {
|
execute:function(cpu, bytes) {
|
||||||
cpu.mmu.push_byte(bytes[0]);
|
|
||||||
cpu.mmu.push_byte(bytes[1]);
|
cpu.mmu.push_byte(bytes[1]);
|
||||||
|
cpu.mmu.push_byte(bytes[0]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1245,6 +1256,84 @@ var EOR_direct_page_indexed_x = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var EOR_stack_relative = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
EOR_const.execute(cpu, [cpu.mmu.read_byte(location)]);
|
||||||
|
} else {
|
||||||
|
if(cpu.p.m) {
|
||||||
|
EOR_const.execute(cpu, [cpu.mmu.read_byte(cpu.r.s+bytes[0])]);
|
||||||
|
} else {
|
||||||
|
var location = cpu.r.s + bytes[0];
|
||||||
|
var low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
EOR_const.execute(cpu, [low_byte, high_byte]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var EOR_stack_relative_indirect_indexed_y = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location_loc = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
var low_byte = cpu.mmu.read_byte(location_loc);
|
||||||
|
var high_byte;
|
||||||
|
if(location_loc===0x1ff) {
|
||||||
|
high_byte = cpu.mmu.read_byte(0x100);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(location_loc+1);
|
||||||
|
}
|
||||||
|
var absolute_location = ((high_byte<<8)|low_byte)+cpu.r.y;
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
EOR_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var location_loc = (cpu.r.s + bytes[0]) & 0xffff;
|
||||||
|
var location_low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var location_high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
var absolute_location = (location_high_byte<<8)|location_low_byte;
|
||||||
|
absolute_location += cpu.r.y;
|
||||||
|
if(cpu.p.m) {
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
EOR_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var low_byte;
|
||||||
|
var high_byte;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
absolute_location &= 0xffff;
|
||||||
|
low_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
high_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
low_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
if(absolute_location===0xffff) {
|
||||||
|
high_byte = cpu.mmu.read_byte_long(0, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOR_const.execute(cpu, [low_byte, high_byte]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var ORA_const = {
|
var ORA_const = {
|
||||||
bytes_required:function(cpu) {
|
bytes_required:function(cpu) {
|
||||||
if(cpu.p.e|cpu.p.m) {
|
if(cpu.p.e|cpu.p.m) {
|
||||||
|
@ -1394,6 +1483,63 @@ var ORA_stack_relative = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var ORA_stack_relative_indirect_indexed_y = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location_loc = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
var low_byte = cpu.mmu.read_byte(location_loc);
|
||||||
|
var high_byte;
|
||||||
|
if(location_loc===0x1ff) {
|
||||||
|
high_byte = cpu.mmu.read_byte(0x100);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(location_loc+1);
|
||||||
|
}
|
||||||
|
var absolute_location = ((high_byte<<8)|low_byte)+cpu.r.y;
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
ORA_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var location_loc = (cpu.r.s + bytes[0]) & 0xffff;
|
||||||
|
var location_low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var location_high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
var absolute_location = (location_high_byte<<8)|location_low_byte;
|
||||||
|
absolute_location += cpu.r.y;
|
||||||
|
if(cpu.p.m) {
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
ORA_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var low_byte;
|
||||||
|
var high_byte;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
absolute_location &= 0xffff;
|
||||||
|
low_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
high_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
low_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
if(absolute_location===0xffff) {
|
||||||
|
high_byte = cpu.mmu.read_byte_long(0, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ORA_const.execute(cpu, [low_byte, high_byte]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var AND_const = {
|
var AND_const = {
|
||||||
bytes_required:function(cpu) {
|
bytes_required:function(cpu) {
|
||||||
if(cpu.p.e|cpu.p.m) {
|
if(cpu.p.e|cpu.p.m) {
|
||||||
|
@ -1543,6 +1689,63 @@ var AND_stack_relative = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var AND_stack_relative_indirect_indexed_y = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location_loc = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
var low_byte = cpu.mmu.read_byte(location_loc);
|
||||||
|
var high_byte;
|
||||||
|
if(location_loc===0x1ff) {
|
||||||
|
high_byte = cpu.mmu.read_byte(0x100);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(location_loc+1);
|
||||||
|
}
|
||||||
|
var absolute_location = ((high_byte<<8)|low_byte)+cpu.r.y;
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
AND_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var location_loc = (cpu.r.s + bytes[0]) & 0xffff;
|
||||||
|
var location_low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var location_high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
var absolute_location = (location_high_byte<<8)|location_low_byte;
|
||||||
|
absolute_location += cpu.r.y;
|
||||||
|
if(cpu.p.m) {
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
AND_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var low_byte;
|
||||||
|
var high_byte;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
absolute_location &= 0xffff;
|
||||||
|
low_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
high_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
low_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
if(absolute_location===0xffff) {
|
||||||
|
high_byte = cpu.mmu.read_byte_long(0, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AND_const.execute(cpu, [low_byte, high_byte]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var CPX_const = {
|
var CPX_const = {
|
||||||
bytes_required:function(cpu) {
|
bytes_required:function(cpu) {
|
||||||
if(cpu.p.e|cpu.p.x) {
|
if(cpu.p.e|cpu.p.x) {
|
||||||
|
@ -1845,6 +2048,63 @@ var CMP_stack_relative = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var CMP_stack_relative_indirect_indexed_y = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location_loc = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
var low_byte = cpu.mmu.read_byte(location_loc);
|
||||||
|
var high_byte;
|
||||||
|
if(location_loc===0x1ff) {
|
||||||
|
high_byte = cpu.mmu.read_byte(0x100);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(location_loc+1);
|
||||||
|
}
|
||||||
|
var absolute_location = ((high_byte<<8)|low_byte)+cpu.r.y;
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
CMP_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var location_loc = (cpu.r.s + bytes[0]) & 0xffff;
|
||||||
|
var location_low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var location_high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
var absolute_location = (location_high_byte<<8)|location_low_byte;
|
||||||
|
absolute_location += cpu.r.y;
|
||||||
|
if(cpu.p.m) {
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
CMP_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var low_byte;
|
||||||
|
var high_byte;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
absolute_location &= 0xffff;
|
||||||
|
low_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
high_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
low_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
if(absolute_location===0xffff) {
|
||||||
|
high_byte = cpu.mmu.read_byte_long(0, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CMP_const.execute(cpu, [low_byte, high_byte]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var SBC_const = {
|
var SBC_const = {
|
||||||
bytes_required:function(cpu) {
|
bytes_required:function(cpu) {
|
||||||
if(cpu.p.e|cpu.p.m) {
|
if(cpu.p.e|cpu.p.m) {
|
||||||
|
@ -2045,6 +2305,63 @@ var SBC_stack_relative = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var SBC_stack_relative_indirect_indexed_y = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location_loc = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
var low_byte = cpu.mmu.read_byte(location_loc);
|
||||||
|
var high_byte;
|
||||||
|
if(location_loc===0x1ff) {
|
||||||
|
high_byte = cpu.mmu.read_byte(0x100);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(location_loc+1);
|
||||||
|
}
|
||||||
|
var absolute_location = ((high_byte<<8)|low_byte)+cpu.r.y;
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
SBC_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var location_loc = (cpu.r.s + bytes[0]) & 0xffff;
|
||||||
|
var location_low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var location_high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
var absolute_location = (location_high_byte<<8)|location_low_byte;
|
||||||
|
absolute_location += cpu.r.y;
|
||||||
|
if(cpu.p.m) {
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
SBC_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var low_byte;
|
||||||
|
var high_byte;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
absolute_location &= 0xffff;
|
||||||
|
low_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
high_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
low_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
if(absolute_location===0xffff) {
|
||||||
|
high_byte = cpu.mmu.read_byte_long(0, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SBC_const.execute(cpu, [low_byte, high_byte]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var ADC_const = {
|
var ADC_const = {
|
||||||
bytes_required:function(cpu) {
|
bytes_required:function(cpu) {
|
||||||
if(cpu.p.e|cpu.p.m) {
|
if(cpu.p.e|cpu.p.m) {
|
||||||
|
@ -2226,6 +2543,63 @@ var ADC_stack_relative = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var ADC_stack_relative_indirect_indexed_y = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location_loc = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
var low_byte = cpu.mmu.read_byte(location_loc);
|
||||||
|
var high_byte;
|
||||||
|
if(location_loc===0x1ff) {
|
||||||
|
high_byte = cpu.mmu.read_byte(0x100);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(location_loc+1);
|
||||||
|
}
|
||||||
|
var absolute_location = ((high_byte<<8)|low_byte)+cpu.r.y;
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
ADC_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var location_loc = (cpu.r.s + bytes[0]) & 0xffff;
|
||||||
|
var location_low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var location_high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
var absolute_location = (location_high_byte<<8)|location_low_byte;
|
||||||
|
absolute_location += cpu.r.y;
|
||||||
|
if(cpu.p.m) {
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
ADC_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var low_byte;
|
||||||
|
var high_byte;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
absolute_location &= 0xffff;
|
||||||
|
low_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
high_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
low_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
if(absolute_location===0xffff) {
|
||||||
|
high_byte = cpu.mmu.read_byte_long(0, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ADC_const.execute(cpu, [low_byte, high_byte]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var BMI = {
|
var BMI = {
|
||||||
bytes_required:function() {
|
bytes_required:function() {
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -2800,6 +3174,65 @@ var STA_stack_relative = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var STA_stack_relative_indirect_indexed_y = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location_loc = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
var low_byte = cpu.mmu.read_byte(location_loc);
|
||||||
|
var high_byte;
|
||||||
|
if(location_loc===0x1ff) {
|
||||||
|
high_byte = cpu.mmu.read_byte(0x100);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(location_loc+1);
|
||||||
|
}
|
||||||
|
var absolute_location = ((high_byte<<8)|low_byte)+cpu.r.y;
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
cpu.mmu.store_byte(b, cpu.r.a);
|
||||||
|
} else {
|
||||||
|
var location_loc = (cpu.r.s + bytes[0]) & 0xffff;
|
||||||
|
var location_low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var location_high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
var absolute_location = (location_high_byte<<8)|location_low_byte;
|
||||||
|
absolute_location += cpu.r.y;
|
||||||
|
if(cpu.p.m) {
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
cpu.mmu.store_byte(b, cpu.r.a);
|
||||||
|
} else {
|
||||||
|
var low_byte;
|
||||||
|
var high_byte;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
absolute_location &= 0xffff;
|
||||||
|
low_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
high_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
low_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
if(absolute_location===0xffff) {
|
||||||
|
high_byte = cpu.mmu.read_byte_long(0, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var sta_location = (high_byte<<8)|low_byte;
|
||||||
|
cpu.mmu.store_byte(sta_location, cpu.r.a & 0xff);
|
||||||
|
cpu.mmu.store_byte(sta_location+1, cpu.r.a >> 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var LDA_direct_page_indirect = {
|
var LDA_direct_page_indirect = {
|
||||||
bytes_required:function() {
|
bytes_required:function() {
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -2958,6 +3391,63 @@ var LDA_stack_relative = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var LDA_stack_relative_indirect_indexed_y = {
|
||||||
|
bytes_required:function() {
|
||||||
|
return 2;
|
||||||
|
},
|
||||||
|
execute:function(cpu, bytes) {
|
||||||
|
if(cpu.p.e) {
|
||||||
|
var location_loc = 0x100 | ((cpu.r.s + bytes[0]) & 0xff);
|
||||||
|
var low_byte = cpu.mmu.read_byte(location_loc);
|
||||||
|
var high_byte;
|
||||||
|
if(location_loc===0x1ff) {
|
||||||
|
high_byte = cpu.mmu.read_byte(0x100);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(location_loc+1);
|
||||||
|
}
|
||||||
|
var absolute_location = ((high_byte<<8)|low_byte)+cpu.r.y;
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
LDA_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var location_loc = (cpu.r.s + bytes[0]) & 0xffff;
|
||||||
|
var location_low_byte = cpu.mmu.read_byte(location);
|
||||||
|
var location_high_byte = cpu.mmu.read_byte(location+1);
|
||||||
|
var absolute_location = (location_high_byte<<8)|location_low_byte;
|
||||||
|
absolute_location += cpu.r.y;
|
||||||
|
if(cpu.p.m) {
|
||||||
|
var b;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
b = cpu.mmu.read_byte_long(absolute_location & 0xffff, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
b = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
LDA_const.execute(cpu, [b]);
|
||||||
|
} else {
|
||||||
|
var low_byte;
|
||||||
|
var high_byte;
|
||||||
|
if(absolute_location>=0x10000) {
|
||||||
|
absolute_location &= 0xffff;
|
||||||
|
low_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
high_byte = cpu.mmu.read_byte_long(absolute_location, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
low_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
if(absolute_location===0xffff) {
|
||||||
|
high_byte = cpu.mmu.read_byte_long(0, cpu.r.dbr+1);
|
||||||
|
} else {
|
||||||
|
high_byte = cpu.mmu.read_byte(absolute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LDA_const.execute(cpu, [low_byte, high_byte]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var NOP = {
|
var NOP = {
|
||||||
bytes_required:function() {
|
bytes_required:function() {
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user