2014-12-04 17:43:58 +00:00
|
|
|
.syntax unified
|
|
|
|
.cpu cortex-m0
|
|
|
|
.align 2
|
|
|
|
.thumb
|
|
|
|
.thumb_func
|
|
|
|
.text
|
|
|
|
|
|
|
|
.extern cpu6502_dump
|
|
|
|
.extern cpu6502_load
|
|
|
|
.extern cpu6502_store
|
|
|
|
|
2014-12-07 04:54:47 +00:00
|
|
|
.extern prn
|
|
|
|
.macro prn reg
|
|
|
|
push {r0-r3}
|
2014-12-07 10:01:33 +00:00
|
|
|
mov r0, \reg
|
2014-12-07 07:35:46 +00:00
|
|
|
bl prn
|
|
|
|
pop {r0-r3}
|
2014-12-07 04:54:47 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
#define T0 r4
|
|
|
|
#define T1 r5
|
|
|
|
#define PC r6
|
|
|
|
#define SR r7
|
|
|
|
#define RA r8
|
|
|
|
#define RX r9
|
|
|
|
#define RY r10
|
|
|
|
#define SP r11
|
2014-12-06 16:20:36 +00:00
|
|
|
#define TZ r12
|
2014-12-06 12:22:12 +00:00
|
|
|
#define ADDR r12
|
2014-12-04 17:43:58 +00:00
|
|
|
|
|
|
|
#define FLAG_N (1 << 7)
|
|
|
|
#define FLAG_V (1 << 6)
|
2014-12-07 15:40:40 +00:00
|
|
|
#define FLAG_X (1 << 5)
|
|
|
|
#define FLAG_B (1 << 4)
|
2014-12-04 17:43:58 +00:00
|
|
|
#define FLAG_D (1 << 3)
|
|
|
|
#define FLAG_I (1 << 2)
|
|
|
|
#define FLAG_Z (1 << 1)
|
|
|
|
#define FLAG_C (1 << 0)
|
|
|
|
|
|
|
|
.macro _ldb
|
2014-12-07 07:35:46 +00:00
|
|
|
.ifdef USE_FRAMEPOINTER
|
|
|
|
// If -fomit-frame-pointer is not specified, save and restore r12 here.
|
|
|
|
push {r1}
|
|
|
|
mov r1, r12
|
|
|
|
push {r1}
|
|
|
|
.endif
|
2014-12-04 17:43:58 +00:00
|
|
|
bl cpu6502_load
|
2014-12-07 07:35:46 +00:00
|
|
|
.ifdef USE_FRAMEPOINTER
|
|
|
|
pop {r1}
|
|
|
|
mov r12, r1
|
|
|
|
pop {r1}
|
|
|
|
.endif
|
2014-12-04 17:43:58 +00:00
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _ldw
|
|
|
|
mov T0, r0
|
|
|
|
bl cpu6502_load
|
|
|
|
mov T1, r0
|
|
|
|
adds r0, T0, #1
|
|
|
|
bl cpu6502_load
|
|
|
|
lsls r0, r0, #8
|
|
|
|
adds r0, r0, T1
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _stb
|
2014-12-07 07:35:46 +00:00
|
|
|
.ifdef USE_FRAMEPOINTER
|
|
|
|
push {r1}
|
|
|
|
mov r1, r12
|
|
|
|
push {r1}
|
|
|
|
.endif
|
2014-12-04 17:43:58 +00:00
|
|
|
bl cpu6502_store
|
2014-12-07 07:35:46 +00:00
|
|
|
.ifdef USE_FRAMEPOINTER
|
|
|
|
pop {r1}
|
|
|
|
mov r12, r1
|
|
|
|
pop {r1}
|
|
|
|
.endif
|
2014-12-04 17:43:58 +00:00
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _stw
|
|
|
|
mov T0, r0
|
|
|
|
mov T1, r1
|
|
|
|
bl cpu6502_store
|
|
|
|
adds r0, T0, #1
|
|
|
|
lsrs r1, T1, #8
|
|
|
|
bl cpu6502_store
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
.macro _pushb reg
|
|
|
|
mov r0, SP
|
|
|
|
mov r1, \reg
|
|
|
|
_stb
|
|
|
|
mov r0, SP
|
|
|
|
subs r0, r0, #1
|
2014-12-07 17:43:05 +00:00
|
|
|
cmp r0, #0xff
|
|
|
|
bne 1f
|
|
|
|
lsls r0, r0, #1
|
|
|
|
adds r0, r0, #1
|
|
|
|
1:
|
2014-12-06 12:00:22 +00:00
|
|
|
mov SP, r0
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _pushw reg
|
2014-12-04 17:43:58 +00:00
|
|
|
mov r0, SP
|
|
|
|
mov r1, \reg
|
|
|
|
lsrs r1, r1, #8
|
|
|
|
_stb
|
|
|
|
mov r0, SP
|
|
|
|
subs r0, r0, #1
|
2014-12-07 17:43:05 +00:00
|
|
|
cmp r0, #0xff
|
|
|
|
bne 1f
|
|
|
|
lsls r0, r0, #1
|
|
|
|
adds r0, r0, #1
|
|
|
|
1:
|
|
|
|
mov SP, r0
|
2014-12-04 17:43:58 +00:00
|
|
|
mov r1, \reg
|
|
|
|
_stb
|
|
|
|
mov r0, SP
|
2014-12-07 17:43:05 +00:00
|
|
|
subs r0, r0, #1
|
|
|
|
cmp r0, #0xff
|
|
|
|
bne 1f
|
|
|
|
lsls r0, r0, #1
|
|
|
|
adds r0, r0, #1
|
|
|
|
1:
|
2014-12-04 17:43:58 +00:00
|
|
|
mov SP, r0
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 13:45:05 +00:00
|
|
|
.macro _popb
|
|
|
|
mov r0, SP
|
|
|
|
adds r0, r0, #1
|
2014-12-07 17:43:05 +00:00
|
|
|
lsrs r1, r0, #10
|
|
|
|
bcc 1f
|
|
|
|
lsrs r0, r0, #1
|
|
|
|
1:
|
2014-12-06 13:45:05 +00:00
|
|
|
mov SP, r0
|
|
|
|
_ldb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 14:08:34 +00:00
|
|
|
.macro _popw
|
2014-12-07 17:43:05 +00:00
|
|
|
mov r0, SP
|
|
|
|
adds r0, r0, #1
|
|
|
|
lsrs r1, r0, #10
|
|
|
|
bcc 1f
|
|
|
|
lsrs r0, r0, #1
|
|
|
|
1:
|
|
|
|
mov SP, r0
|
2014-12-06 14:08:34 +00:00
|
|
|
_ldb
|
2014-12-07 17:43:05 +00:00
|
|
|
mov T0, r0
|
|
|
|
mov r0, SP
|
|
|
|
adds r0, r0, #1
|
|
|
|
lsrs r1, r0, #10
|
|
|
|
bcc 1f
|
|
|
|
lsrs r0, r0, #1
|
|
|
|
1:
|
2014-12-06 14:08:34 +00:00
|
|
|
mov SP, r0
|
|
|
|
_ldb
|
|
|
|
lsls r0, r0, #8
|
2014-12-07 17:43:05 +00:00
|
|
|
adds r0, r0, T0
|
2014-12-06 14:08:34 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
.macro _decode
|
2014-12-06 13:45:05 +00:00
|
|
|
bl dump
|
|
|
|
mov r0, PC
|
|
|
|
_ldb
|
|
|
|
lsls r1, r0, #2
|
|
|
|
ldr r2, 1f
|
|
|
|
adds r3, r2, r1
|
|
|
|
ldr r1, [r3]
|
|
|
|
mov pc, r1
|
|
|
|
.align 4
|
|
|
|
1:
|
|
|
|
.long op_table
|
2014-12-04 17:43:58 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:22:12 +00:00
|
|
|
.macro _fromAbsb
|
2014-12-07 04:35:20 +00:00
|
|
|
adds PC, PC, #2
|
2014-12-07 06:15:06 +00:00
|
|
|
subs r0, PC, #1
|
2014-12-06 12:22:12 +00:00
|
|
|
_ldw
|
|
|
|
mov ADDR, r0
|
|
|
|
_ldb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:44:48 +00:00
|
|
|
.macro _fromAbsoluteIndexed reg
|
2014-12-07 04:35:20 +00:00
|
|
|
adds PC, PC, #2
|
2014-12-07 06:15:06 +00:00
|
|
|
subs r0, PC, #1
|
2014-12-06 12:44:48 +00:00
|
|
|
_ldw
|
|
|
|
add r0, r0, \reg
|
|
|
|
mov ADDR, r0
|
|
|
|
_ldb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 14:08:34 +00:00
|
|
|
.macro _fromImmb
|
2014-12-04 17:43:58 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
mov r0, PC
|
|
|
|
_ldb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
.macro _fromIndexedIndirect
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-06 12:00:22 +00:00
|
|
|
mov r1, RX
|
|
|
|
adds r0, r0, R1
|
|
|
|
uxtb r0, r0
|
|
|
|
mov T0, r0
|
|
|
|
_ldb
|
|
|
|
mov T1, r0
|
|
|
|
adds r0, T0, #1
|
|
|
|
uxtb r0, r0
|
|
|
|
_ldb
|
|
|
|
lsls r0, r0, #8
|
|
|
|
adds r0, r0, T1
|
2014-12-06 12:22:12 +00:00
|
|
|
mov ADDR, r0
|
2014-12-06 12:00:22 +00:00
|
|
|
_ldb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:44:48 +00:00
|
|
|
.macro _fromIndirectIndex
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-06 12:44:48 +00:00
|
|
|
mov T0, r0
|
|
|
|
_ldb
|
|
|
|
mov T1, r0
|
|
|
|
mov r0, T0
|
|
|
|
adds r0, r0, #1
|
|
|
|
uxtb r0, r0
|
|
|
|
_ldb
|
|
|
|
lsls r0, r0, #8
|
|
|
|
add r0, r0, T1
|
|
|
|
add r0, r0, RY
|
|
|
|
mov ADDR, r0
|
|
|
|
_ldb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:22:12 +00:00
|
|
|
.macro _fromReg reg
|
|
|
|
mov r0, \reg
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
.macro _fromZero
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-06 12:22:12 +00:00
|
|
|
mov ADDR, r0
|
2014-12-06 12:00:22 +00:00
|
|
|
_ldb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:44:48 +00:00
|
|
|
.macro _fromZeroIndex reg
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-06 12:44:48 +00:00
|
|
|
add r0, r0, \reg
|
|
|
|
uxtb r0, r0
|
|
|
|
mov ADDR, r0
|
|
|
|
_ldb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 16:20:36 +00:00
|
|
|
.macro _toAbsb
|
|
|
|
adds r0, PC, #1
|
2014-12-07 10:02:33 +00:00
|
|
|
mov TZ, T0
|
2014-12-06 16:20:36 +00:00
|
|
|
_ldw
|
2014-12-07 10:02:33 +00:00
|
|
|
mov r1, TZ
|
2014-12-06 16:20:36 +00:00
|
|
|
_stb
|
2014-12-06 16:45:07 +00:00
|
|
|
adds PC, PC, #3
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _toAbsoluteIndexed reg
|
|
|
|
adds r0, PC, #1
|
|
|
|
_ldw
|
|
|
|
add r0, r0, \reg
|
|
|
|
mov r1, T0
|
|
|
|
_stb
|
|
|
|
adds PC, PC, #3
|
2014-12-06 16:20:36 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:22:12 +00:00
|
|
|
.macro _toAddr
|
|
|
|
mov r0, ADDR
|
|
|
|
mov r1, T0
|
|
|
|
_stb
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 16:20:36 +00:00
|
|
|
.macro _toIndexedIndirect
|
|
|
|
adds r0, PC, #1
|
|
|
|
_ldb
|
|
|
|
mov r1, RX
|
|
|
|
adds r0, r0, R1
|
|
|
|
uxtb r0, r0
|
|
|
|
mov T1, r0
|
|
|
|
_ldb
|
|
|
|
mov TZ, r0
|
|
|
|
adds r0, T1, #1
|
|
|
|
uxtb r0, r0
|
|
|
|
_ldb
|
|
|
|
lsls r0, r0, #8
|
|
|
|
add r0, r0, TZ
|
|
|
|
mov r1, T0
|
|
|
|
_stb
|
|
|
|
adds PC, PC, #2
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 16:45:07 +00:00
|
|
|
.macro _toIndirectIndex
|
|
|
|
adds r0, PC, #1
|
|
|
|
_ldb
|
|
|
|
mov T1, r0
|
|
|
|
_ldb
|
|
|
|
mov TZ, r0
|
|
|
|
adds r0, T1, #1
|
|
|
|
uxtb r0, r0
|
|
|
|
_ldb
|
|
|
|
lsls r0, r0, #8
|
|
|
|
add r0, r0, TZ
|
|
|
|
add r0, r0, RY
|
|
|
|
mov r1, T0
|
|
|
|
_stb
|
|
|
|
adds PC, PC, #2
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:22:12 +00:00
|
|
|
.macro _toReg reg
|
|
|
|
mov \reg, T0
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
.macro _toZero
|
2014-12-06 16:45:07 +00:00
|
|
|
adds r0, PC, #1
|
|
|
|
_ldb
|
2014-12-06 12:00:22 +00:00
|
|
|
mov r1, T0
|
|
|
|
_stb
|
2014-12-06 16:45:07 +00:00
|
|
|
adds PC, PC, #2
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _toZeroIndex reg
|
|
|
|
adds r0, PC, #1
|
|
|
|
_ldb
|
|
|
|
add r0, r0, \reg
|
|
|
|
uxtb r0, r0
|
|
|
|
mov r1, T0
|
|
|
|
_stb
|
|
|
|
adds PC, PC, #2
|
2014-12-06 12:00:22 +00:00
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro __cl flag
|
2014-12-04 17:43:58 +00:00
|
|
|
movs T0, #\flag
|
|
|
|
bics SR, SR, T0
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
.macro __se flag
|
2014-12-04 17:43:58 +00:00
|
|
|
movs T0, #\flag
|
|
|
|
orrs SR, SR, T0
|
2014-12-06 12:00:22 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-06 13:45:05 +00:00
|
|
|
.macro _flag_nz
|
|
|
|
__cl (FLAG_N | FLAG_Z)
|
|
|
|
movs r0, r0
|
|
|
|
bne 1f
|
|
|
|
__se FLAG_Z
|
|
|
|
1:
|
2014-12-07 03:38:48 +00:00
|
|
|
movs r1, #FLAG_N
|
2014-12-06 13:45:05 +00:00
|
|
|
tst r0, r1
|
|
|
|
beq 1f
|
|
|
|
__se FLAG_N
|
|
|
|
1:
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
.macro _clx flag
|
|
|
|
__cl \flag
|
2014-12-04 17:43:58 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
.macro _sex flag
|
|
|
|
__se \flag
|
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 14:24:53 +00:00
|
|
|
.macro _adc
|
2014-12-07 03:38:48 +00:00
|
|
|
mov r1, RA
|
|
|
|
add r1, r1, r0
|
|
|
|
movs r2, #FLAG_C
|
|
|
|
tst SR, r2
|
2014-12-07 05:29:14 +00:00
|
|
|
beq 1f
|
2014-12-07 03:38:48 +00:00
|
|
|
adds r1, r1, #1
|
|
|
|
1:
|
|
|
|
movs r2, #FLAG_D
|
|
|
|
tst SR, r2
|
|
|
|
beq 1f
|
|
|
|
movs r2, #0x0f
|
|
|
|
ands r1, r1, r2
|
|
|
|
mov T0, RA
|
|
|
|
lsrs T0, T0, #8
|
|
|
|
mov T1, r0
|
|
|
|
lsrs T1, T1, #8
|
|
|
|
adds r2, T0, T1
|
|
|
|
cmp r1, #10
|
|
|
|
blo 2f
|
|
|
|
subs r1, r1, #10
|
|
|
|
adds r2, r2, #1
|
|
|
|
2:
|
|
|
|
cmp r2, #10
|
|
|
|
blo 2f
|
|
|
|
adds r2, r2, #6
|
|
|
|
2:
|
|
|
|
lsls r2, r2, #8
|
|
|
|
adds r1, r1, r2
|
|
|
|
1:
|
|
|
|
__cl (FLAG_N | FLAG_Z | FLAG_C | FLAG_V)
|
|
|
|
uxtb r2, r1
|
|
|
|
movs r2, r2
|
|
|
|
bne 1f
|
|
|
|
__se FLAG_Z
|
|
|
|
1:
|
|
|
|
movs r3, #FLAG_N
|
|
|
|
tst r2, r3
|
|
|
|
beq 1f
|
|
|
|
__se FLAG_N
|
|
|
|
1:
|
2014-12-07 10:01:33 +00:00
|
|
|
lsrs r1, r1, #9
|
2014-12-07 03:38:48 +00:00
|
|
|
bcc 1f
|
|
|
|
__se FLAG_C
|
|
|
|
1:
|
|
|
|
mov r1, RA
|
|
|
|
eors r0, r1, r0
|
|
|
|
mvns r0, r0
|
|
|
|
eors r1, r1, r2
|
|
|
|
ands r0, r0, r1
|
|
|
|
lsrs r0, r0, #8
|
|
|
|
bcc 1f
|
|
|
|
__se FLAG_V
|
2014-12-07 05:29:14 +00:00
|
|
|
1:
|
2014-12-07 03:38:48 +00:00
|
|
|
mov RA, r2
|
|
|
|
adds PC, PC, #1
|
2014-12-06 14:24:53 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-06 13:45:05 +00:00
|
|
|
.macro _asl
|
|
|
|
__cl (FLAG_N | FLAG_Z | FLAG_C)
|
2014-12-07 03:38:48 +00:00
|
|
|
movs r1, #FLAG_N
|
2014-12-06 13:45:05 +00:00
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 13:45:05 +00:00
|
|
|
bics r0, r0, r1
|
|
|
|
__se FLAG_C
|
|
|
|
1:
|
2014-12-07 06:51:59 +00:00
|
|
|
lsls r0, r0, #1
|
2014-12-06 16:45:07 +00:00
|
|
|
bne 1f
|
2014-12-06 13:45:05 +00:00
|
|
|
__se FLAG_Z
|
|
|
|
1:
|
2014-12-07 06:51:59 +00:00
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 13:45:05 +00:00
|
|
|
__se FLAG_N
|
|
|
|
1:
|
2014-12-07 06:51:59 +00:00
|
|
|
mov T0, r0
|
2014-12-06 13:45:05 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _bit
|
|
|
|
__cl (FLAG_N | FLAG_Z | FLAG_V)
|
|
|
|
mov r1, RA
|
|
|
|
ands r0, r1, r0
|
2014-12-06 16:45:07 +00:00
|
|
|
bne 1f
|
2014-12-06 12:00:22 +00:00
|
|
|
__se FLAG_Z
|
2014-12-04 17:43:58 +00:00
|
|
|
1:
|
2014-12-07 03:38:48 +00:00
|
|
|
movs r1, #FLAG_N
|
2014-12-04 17:43:58 +00:00
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 12:00:22 +00:00
|
|
|
__se FLAG_N
|
2014-12-06 13:45:05 +00:00
|
|
|
1:
|
|
|
|
movs r1, #0x40
|
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 13:45:05 +00:00
|
|
|
__se FLAG_V
|
2014-12-06 12:00:22 +00:00
|
|
|
1:
|
2014-12-07 05:30:43 +00:00
|
|
|
adds PC, PC, #1
|
2014-12-06 12:00:22 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-07 05:05:38 +00:00
|
|
|
.macro _bxc reg
|
2014-12-07 05:36:36 +00:00
|
|
|
adds PC, PC, #2
|
2014-12-07 05:05:38 +00:00
|
|
|
movs r0, #\reg
|
|
|
|
tst SR, r0
|
|
|
|
bne 1f
|
|
|
|
_bxx
|
|
|
|
1:
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _bxs reg
|
2014-12-07 05:36:36 +00:00
|
|
|
adds PC, PC, #2
|
2014-12-07 05:05:38 +00:00
|
|
|
movs r0, #\reg
|
|
|
|
tst SR, r0
|
|
|
|
beq 1f
|
|
|
|
_bxx
|
|
|
|
1:
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 13:45:05 +00:00
|
|
|
.macro _bxx
|
2014-12-07 05:36:36 +00:00
|
|
|
subs r0, PC, #1
|
2014-12-07 05:05:38 +00:00
|
|
|
_ldb
|
2014-12-06 13:45:05 +00:00
|
|
|
sxtb r0, r0
|
|
|
|
add PC, PC, r0
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 16:58:56 +00:00
|
|
|
.macro _cp reg
|
2014-12-07 05:47:46 +00:00
|
|
|
__cl (FLAG_N | FLAG_Z | FLAG_C)
|
2014-12-07 02:47:22 +00:00
|
|
|
mov r1, \reg
|
2014-12-07 17:35:47 +00:00
|
|
|
subs r2, r1, r0
|
|
|
|
sxtb r2, r2
|
2014-12-07 02:47:22 +00:00
|
|
|
subs r0, r1, r0
|
2014-12-07 17:35:47 +00:00
|
|
|
bmi 1f
|
2014-12-07 02:47:22 +00:00
|
|
|
__se FLAG_C
|
|
|
|
1:
|
2014-12-07 17:35:47 +00:00
|
|
|
sxtb r0, r0
|
|
|
|
movs r0, r0
|
|
|
|
bpl 1f
|
2014-12-07 02:47:22 +00:00
|
|
|
__se FLAG_N
|
2014-12-07 17:35:47 +00:00
|
|
|
b 2f
|
2014-12-07 02:47:22 +00:00
|
|
|
1:
|
2014-12-07 17:35:47 +00:00
|
|
|
bne 2f
|
|
|
|
__se FLAG_Z
|
|
|
|
2:
|
2014-12-07 05:30:43 +00:00
|
|
|
adds PC, PC, #1
|
2014-12-06 16:58:56 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-06 16:20:36 +00:00
|
|
|
.macro _dec
|
2014-12-07 06:10:05 +00:00
|
|
|
subs r0, r0, #1
|
2014-12-07 03:38:48 +00:00
|
|
|
uxtb r0, r0
|
2014-12-06 16:20:36 +00:00
|
|
|
_flag_nz
|
2014-12-07 06:10:05 +00:00
|
|
|
mov T0, r0
|
2014-12-06 16:20:36 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 17:13:45 +00:00
|
|
|
.macro _inc
|
2014-12-07 06:10:05 +00:00
|
|
|
adds r0, r0, #1
|
2014-12-07 03:38:48 +00:00
|
|
|
uxtb r0, r0
|
2014-12-07 02:47:22 +00:00
|
|
|
_flag_nz
|
2014-12-07 06:10:05 +00:00
|
|
|
mov T0, r0
|
2014-12-07 02:47:22 +00:00
|
|
|
adds PC, PC, #1
|
2014-12-06 17:13:45 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-06 14:08:34 +00:00
|
|
|
.macro _jmp
|
|
|
|
mov PC, r0
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
.macro _ld reg
|
|
|
|
mov \reg, r0
|
|
|
|
_flag_nz
|
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _lop op
|
|
|
|
mov r1, RA
|
|
|
|
\op r0, r1, r0
|
|
|
|
mov RA, r0
|
|
|
|
_flag_nz
|
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 14:08:34 +00:00
|
|
|
.macro _lsr
|
|
|
|
__cl (FLAG_N | FLAG_Z | FLAG_C)
|
|
|
|
movs r1, #0x01
|
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 14:08:34 +00:00
|
|
|
__se FLAG_C
|
|
|
|
1:
|
2014-12-07 06:51:59 +00:00
|
|
|
lsrs r0, r0, #1
|
2014-12-06 16:45:07 +00:00
|
|
|
bne 1f
|
2014-12-06 14:08:34 +00:00
|
|
|
__se FLAG_Z
|
|
|
|
1:
|
2014-12-07 03:38:48 +00:00
|
|
|
movs r1, #FLAG_N
|
2014-12-07 06:51:59 +00:00
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 14:08:34 +00:00
|
|
|
__se FLAG_N
|
|
|
|
1:
|
2014-12-07 06:51:59 +00:00
|
|
|
mov T0, r0
|
2014-12-06 14:08:34 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 13:45:05 +00:00
|
|
|
.macro _nop
|
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _rol
|
|
|
|
movs r2, #FLAG_C
|
|
|
|
ands r2, SR, r2
|
2014-12-06 12:00:22 +00:00
|
|
|
__cl (FLAG_N | FLAG_Z | FLAG_C)
|
2014-12-07 03:38:48 +00:00
|
|
|
movs r1, #FLAG_N
|
2014-12-06 12:00:22 +00:00
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 12:00:22 +00:00
|
|
|
__se FLAG_C
|
2014-12-04 17:43:58 +00:00
|
|
|
1:
|
2014-12-06 12:00:22 +00:00
|
|
|
lsls r0, r0, #1
|
2014-12-06 13:45:05 +00:00
|
|
|
uxtb r0, r0
|
2014-12-07 06:51:59 +00:00
|
|
|
adds r0, r0, r2
|
2014-12-06 16:45:07 +00:00
|
|
|
bne 1f
|
2014-12-06 12:00:22 +00:00
|
|
|
__se FLAG_Z
|
|
|
|
1:
|
2014-12-07 06:51:59 +00:00
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 12:00:22 +00:00
|
|
|
__se FLAG_N
|
|
|
|
1:
|
2014-12-07 06:51:59 +00:00
|
|
|
mov T0, r0
|
2014-12-06 12:00:22 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 13:45:05 +00:00
|
|
|
.macro _ror
|
|
|
|
movs r2, #FLAG_C
|
|
|
|
ands r2, SR, r2
|
|
|
|
lsls r2, r2, #7
|
|
|
|
__cl (FLAG_N | FLAG_Z | FLAG_C)
|
|
|
|
movs r1, #0x01
|
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 13:45:05 +00:00
|
|
|
__se FLAG_C
|
|
|
|
1:
|
|
|
|
lsrs r0, r0, #1
|
2014-12-07 06:51:59 +00:00
|
|
|
adds r0, r0, r2
|
2014-12-06 16:45:07 +00:00
|
|
|
bne 1f
|
2014-12-06 13:45:05 +00:00
|
|
|
__se FLAG_Z
|
|
|
|
1:
|
2014-12-07 03:38:48 +00:00
|
|
|
movs r1, #FLAG_N
|
2014-12-07 06:51:59 +00:00
|
|
|
tst r0, r1
|
2014-12-06 16:45:07 +00:00
|
|
|
beq 1f
|
2014-12-06 13:45:05 +00:00
|
|
|
__se FLAG_N
|
|
|
|
1:
|
2014-12-07 06:51:59 +00:00
|
|
|
mov T0, r0
|
2014-12-04 17:43:58 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 14:08:34 +00:00
|
|
|
.macro _rti
|
|
|
|
_popb
|
|
|
|
mov SR, r0
|
|
|
|
_popw
|
|
|
|
mov PC, r0
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 17:13:45 +00:00
|
|
|
.macro _sbc
|
2014-12-07 03:56:02 +00:00
|
|
|
mov r1, RA
|
|
|
|
subs r1, r1, r0
|
|
|
|
movs r2, #FLAG_C
|
|
|
|
tst SR, r2
|
2014-12-07 05:29:14 +00:00
|
|
|
bne 1f
|
2014-12-07 03:56:02 +00:00
|
|
|
subs r1, r1, #1
|
|
|
|
1:
|
|
|
|
movs r2, #FLAG_D
|
|
|
|
tst SR, r2
|
|
|
|
beq 1f
|
|
|
|
movs r2, #0x1f
|
|
|
|
ands r1, r1, r2
|
|
|
|
mov T0, RA
|
|
|
|
lsrs T0, T0, #8
|
|
|
|
mov T1, r0
|
|
|
|
lsrs T1, T1, #8
|
|
|
|
subs r2, T0, T1
|
|
|
|
cmp r1, #10
|
|
|
|
blo 2f
|
|
|
|
subs r1, r1, #6
|
|
|
|
subs r2, r2, #1
|
|
|
|
2:
|
|
|
|
movs r3, #0x1f
|
|
|
|
ands r2, r2, r3
|
|
|
|
cmp r2, #10
|
|
|
|
blo 2f
|
|
|
|
adds r2, r2, #6
|
|
|
|
2:
|
|
|
|
lsls r2, r2, #8
|
|
|
|
adds r1, r1, r2
|
|
|
|
1:
|
|
|
|
__cl (FLAG_N | FLAG_Z | FLAG_C | FLAG_V)
|
|
|
|
uxtb r2, r1
|
|
|
|
movs r2, r2
|
|
|
|
bne 1f
|
|
|
|
__se FLAG_Z
|
|
|
|
1:
|
|
|
|
movs r3, #FLAG_N
|
|
|
|
tst r2, r3
|
|
|
|
beq 1f
|
|
|
|
__se FLAG_N
|
|
|
|
1:
|
2014-12-07 10:01:33 +00:00
|
|
|
lsrs r1, r1, #9
|
2014-12-07 06:02:40 +00:00
|
|
|
bcs 1f
|
2014-12-07 03:56:02 +00:00
|
|
|
__se FLAG_C
|
|
|
|
1:
|
|
|
|
mov r1, RA
|
|
|
|
eors r0, r1, r0
|
|
|
|
eors r1, r1, r2
|
|
|
|
ands r0, r0, r1
|
|
|
|
lsrs r0, r0, #8
|
|
|
|
bcc 1f
|
|
|
|
__se FLAG_V
|
2014-12-07 06:02:40 +00:00
|
|
|
1:
|
2014-12-07 03:56:02 +00:00
|
|
|
mov RA, r2
|
|
|
|
adds PC, PC, #1
|
2014-12-06 17:13:45 +00:00
|
|
|
.endm
|
|
|
|
|
2014-12-07 05:36:36 +00:00
|
|
|
.macro _t from to
|
2014-12-07 15:21:06 +00:00
|
|
|
mov r0, \from
|
|
|
|
mov \to, r0
|
|
|
|
_flag_nz
|
2014-12-06 16:20:36 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
.endm
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
.macro _resume
|
|
|
|
ldr r0, =#r_pc
|
|
|
|
ldr PC, [r0]
|
|
|
|
ldr r0, =#r_sr
|
|
|
|
ldr SR, [r0]
|
|
|
|
ldr r0, =#r_a
|
|
|
|
ldr T0, [r0]
|
|
|
|
mov RA, T0
|
|
|
|
ldr r0, =#r_x
|
|
|
|
ldr T0, [r0]
|
|
|
|
mov RX, T0
|
|
|
|
ldr r0, =#r_y
|
|
|
|
ldr T0, [r0]
|
|
|
|
mov RY, T0
|
|
|
|
ldr r0, =#r_sp
|
|
|
|
ldr T0, [r0]
|
|
|
|
mov SP, T0
|
|
|
|
ldr T0, =#op_table
|
|
|
|
.endm
|
|
|
|
|
|
|
|
.macro _suspend
|
|
|
|
ldr r0, =#r_pc
|
|
|
|
str PC, [r0]
|
|
|
|
ldr r0, =#r_sr
|
|
|
|
str SR, [r0]
|
|
|
|
ldr r0, =#r_a
|
|
|
|
mov T0, RA
|
|
|
|
str T0, [r0]
|
|
|
|
ldr r0, =#r_x
|
|
|
|
mov T0, RX
|
|
|
|
str T0, [r0]
|
|
|
|
ldr r0, =#r_y
|
|
|
|
mov T0, RY
|
|
|
|
str T0, [r0]
|
|
|
|
ldr r0, =#r_sp
|
|
|
|
mov T0, SP
|
|
|
|
str T0, [r0]
|
|
|
|
.endm
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
// NOP
|
2014-12-04 17:43:58 +00:00
|
|
|
op02:
|
|
|
|
op03:
|
|
|
|
op04:
|
|
|
|
op07:
|
2014-12-06 12:22:12 +00:00
|
|
|
op0b:
|
|
|
|
op0c:
|
|
|
|
op0f:
|
2014-12-06 12:44:48 +00:00
|
|
|
op12:
|
|
|
|
op13:
|
|
|
|
op14:
|
|
|
|
op17:
|
|
|
|
op1a:
|
|
|
|
op1b:
|
|
|
|
op1c:
|
|
|
|
op1f:
|
2014-12-06 13:45:05 +00:00
|
|
|
op22:
|
|
|
|
op23:
|
|
|
|
op27:
|
|
|
|
op2b:
|
|
|
|
op2f:
|
2014-12-06 13:50:50 +00:00
|
|
|
op32:
|
|
|
|
op33:
|
|
|
|
op34:
|
|
|
|
op37:
|
|
|
|
op3a:
|
|
|
|
op3b:
|
|
|
|
op3c:
|
|
|
|
op3f:
|
2014-12-06 14:08:34 +00:00
|
|
|
op42:
|
|
|
|
op43:
|
|
|
|
op44:
|
|
|
|
op47:
|
|
|
|
op4b:
|
|
|
|
op4f:
|
2014-12-06 14:14:21 +00:00
|
|
|
op52:
|
|
|
|
op53:
|
|
|
|
op54:
|
|
|
|
op57:
|
|
|
|
op5a:
|
|
|
|
op5b:
|
|
|
|
op5c:
|
|
|
|
op5f:
|
2014-12-06 14:24:53 +00:00
|
|
|
op62:
|
|
|
|
op63:
|
|
|
|
op64:
|
|
|
|
op67:
|
|
|
|
op6b:
|
|
|
|
op6f:
|
2014-12-06 14:29:28 +00:00
|
|
|
op72:
|
|
|
|
op73:
|
|
|
|
op74:
|
|
|
|
op77:
|
|
|
|
op7a:
|
|
|
|
op7b:
|
|
|
|
op7c:
|
|
|
|
op7f:
|
2014-12-06 16:20:36 +00:00
|
|
|
op80:
|
|
|
|
op82:
|
|
|
|
op83:
|
|
|
|
op87:
|
|
|
|
op89:
|
|
|
|
op8b:
|
|
|
|
op8f:
|
2014-12-06 16:45:07 +00:00
|
|
|
op93:
|
|
|
|
op97:
|
|
|
|
op9b:
|
|
|
|
op9c:
|
|
|
|
op9e:
|
|
|
|
op9f:
|
|
|
|
opa3:
|
|
|
|
opa7:
|
|
|
|
opab:
|
|
|
|
opaf:
|
2014-12-06 16:50:39 +00:00
|
|
|
opb2:
|
|
|
|
opb3:
|
|
|
|
opb7:
|
|
|
|
opbb:
|
|
|
|
opbf:
|
2014-12-06 16:58:56 +00:00
|
|
|
opc2:
|
|
|
|
opc3:
|
|
|
|
opc7:
|
|
|
|
opcb:
|
|
|
|
opcf:
|
2014-12-06 17:03:38 +00:00
|
|
|
opd2:
|
|
|
|
opd3:
|
|
|
|
opd4:
|
|
|
|
opd7:
|
|
|
|
opda:
|
|
|
|
opdb:
|
|
|
|
opdc:
|
|
|
|
opdf:
|
2014-12-06 17:13:45 +00:00
|
|
|
ope2:
|
|
|
|
ope3:
|
|
|
|
ope7:
|
|
|
|
opea:
|
|
|
|
opeb:
|
|
|
|
opef:
|
|
|
|
opf2:
|
|
|
|
opf3:
|
|
|
|
opf4:
|
|
|
|
opf7:
|
|
|
|
opfa:
|
|
|
|
opfb:
|
|
|
|
opfc:
|
|
|
|
opff:
|
2014-12-06 12:00:22 +00:00
|
|
|
_nop
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op00: // BRK
|
|
|
|
adds T0, PC, #2
|
|
|
|
_pushw T0
|
|
|
|
_pushb SR
|
|
|
|
movs r0, #0xff
|
|
|
|
lsls r0, r0, #8
|
|
|
|
adds r0, r0, #0xfe
|
|
|
|
_ldw
|
|
|
|
mov PC, r0
|
2014-12-07 15:50:05 +00:00
|
|
|
__se FLAG_I
|
2014-12-06 12:00:22 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op01: // ORA - (Indirect, X)
|
|
|
|
_fromIndexedIndirect
|
|
|
|
_lop orrs
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op05: // ORA - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_lop orrs
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op06: // ASL - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_asl
|
2014-12-06 12:22:12 +00:00
|
|
|
_toAddr
|
2014-12-06 12:00:22 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op08: // PHP
|
|
|
|
_pushb SR
|
|
|
|
adds PC, PC, #1
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 12:22:12 +00:00
|
|
|
op09: // ORA - Immediate
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-06 12:22:12 +00:00
|
|
|
_lop orrs
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op0a: // ASL - Accumulator
|
|
|
|
_fromReg RA
|
|
|
|
_asl
|
|
|
|
_toReg RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op0d: // ORA - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_lop orrs
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op0e: // ASL - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_asl
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 12:44:48 +00:00
|
|
|
op10: // BPL (N==0)
|
2014-12-07 05:05:38 +00:00
|
|
|
_bxc FLAG_N
|
2014-12-06 12:44:48 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op11: // ORA - (Indirect), Y
|
|
|
|
_fromIndirectIndex
|
|
|
|
_lop orrs
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op15: // ORA - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_lop orrs
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op16: // ASL - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_asl
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
op18: // CLC
|
|
|
|
_clx FLAG_C
|
|
|
|
_decode
|
2014-12-06 12:44:48 +00:00
|
|
|
|
|
|
|
op19: // ORA - Absolute, Y
|
|
|
|
_fromAbsoluteIndexed RY
|
|
|
|
_lop orrs
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op1d: // ORA - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_lop orrs
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op1e: // ASL - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_asl
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
op20: // JSR
|
|
|
|
adds T0, PC, #2
|
2014-12-06 12:00:22 +00:00
|
|
|
_pushw T0
|
2014-12-04 17:43:58 +00:00
|
|
|
adds r0, PC, #1
|
|
|
|
_ldw
|
|
|
|
mov PC, r0
|
|
|
|
_decode
|
2014-12-06 12:44:48 +00:00
|
|
|
|
2014-12-06 13:45:05 +00:00
|
|
|
op21: // AND - (Indirect, X)
|
|
|
|
_fromIndexedIndirect
|
|
|
|
_lop ands
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op24: // BIT - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_bit
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op25: // AND - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_lop ands
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op26: // ROR - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_ror
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op28: // PLP
|
|
|
|
_popb
|
|
|
|
mov SR, r0
|
2014-12-07 15:40:40 +00:00
|
|
|
__se (FLAG_X | FLAG_B)
|
2014-12-06 13:45:05 +00:00
|
|
|
adds PC, PC, #1
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op29: // AND - Immediate
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-06 13:45:05 +00:00
|
|
|
_lop ands
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op2a: // ROR - Accumulator
|
|
|
|
_fromReg RA
|
|
|
|
_ror
|
|
|
|
_toReg RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op2c: // BIT - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_bit
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op2d: // AND - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_lop ands
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op2e: // ROL - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_rol
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 13:50:50 +00:00
|
|
|
op30: // BMI (N==1)
|
2014-12-07 05:05:38 +00:00
|
|
|
_bxs FLAG_N
|
2014-12-06 13:50:50 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op31: // AND - (Indirect), Y
|
|
|
|
_fromIndirectIndex
|
|
|
|
_lop ands
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op35: // AND - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_lop ands
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op36: // ROL - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_rol
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
op38: // SEC
|
|
|
|
_sex FLAG_C
|
|
|
|
_decode
|
2014-12-06 13:50:50 +00:00
|
|
|
|
|
|
|
op39: // AND - Absolute, Y
|
|
|
|
_fromAbsoluteIndexed RY
|
|
|
|
_lop ands
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op3d: // AND - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_lop ands
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op3e: // ROL - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_rol
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 14:08:34 +00:00
|
|
|
op40: // RTI
|
|
|
|
_rti
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op41: // EOR - (Indirect), X
|
|
|
|
_fromIndexedIndirect
|
|
|
|
_lop eors
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op45: // EOR - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_lop eors
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op46: // LSR - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_lsr
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op48: // PHA
|
|
|
|
_pushb RA
|
|
|
|
adds PC, PC, #1
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op49: // EOR - Immediate
|
|
|
|
_fromImmb
|
|
|
|
_lop eors
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op4a: // LSR - Accumulator
|
|
|
|
_fromReg RA
|
|
|
|
_lsr
|
|
|
|
_toReg RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op4c: // JMP - Absolute
|
|
|
|
adds r0, PC, #1
|
|
|
|
_ldw
|
|
|
|
_jmp
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op4d: // EOR - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_lop eors
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op4e: // LSR - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_lsr
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 14:14:21 +00:00
|
|
|
op50: // BVC (V==0)
|
2014-12-07 05:05:38 +00:00
|
|
|
_bxc FLAG_V
|
2014-12-06 14:14:21 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op51: // EOR - (Indirect), Y
|
|
|
|
_fromIndirectIndex
|
|
|
|
_lop eors
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op55: // EOR - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_lop eors
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op56: // LSR - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_lsr
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
op58: // CLI
|
|
|
|
_clx FLAG_I
|
|
|
|
_decode
|
2014-12-06 14:14:21 +00:00
|
|
|
|
|
|
|
op59: // EOR - Absolute, Y
|
|
|
|
_fromAbsoluteIndexed RY
|
|
|
|
_lop eors
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op5d: // EOR - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_lop eors
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op5e: // LSR - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_lsr
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 14:24:53 +00:00
|
|
|
op60: // RTS
|
|
|
|
_popw
|
|
|
|
adds PC, r0, #1
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op61: // ADC - (Indirect, X)
|
|
|
|
_fromIndexedIndirect
|
|
|
|
_adc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op65: // ADC - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_adc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op66: // ROR - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_ror
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op68: // PLA
|
|
|
|
_popb
|
|
|
|
_flag_nz
|
|
|
|
mov RA, r0
|
|
|
|
adds PC, PC, #1
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op69: // ADC - Immediate
|
|
|
|
_fromImmb
|
|
|
|
_adc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op6a: // ROR - Accumulator
|
|
|
|
_fromReg RA
|
|
|
|
_ror
|
|
|
|
_toReg RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op6c: // JMP - Indirect
|
|
|
|
adds r0, PC, #1
|
|
|
|
_ldw
|
|
|
|
_ldw
|
|
|
|
_jmp
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op6d: // ADC - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_adc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op6e: // ROR - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_ror
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 14:29:28 +00:00
|
|
|
op70: // BVS (V==1)
|
2014-12-07 05:05:38 +00:00
|
|
|
_bxs FLAG_V
|
2014-12-06 14:29:28 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op71: // ADC - (Indirect), Y
|
|
|
|
_fromIndirectIndex
|
|
|
|
_adc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op75: // ADC - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_adc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op76: // ROR - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_ror
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
op78: // SEI
|
|
|
|
_sex FLAG_I
|
|
|
|
_decode
|
2014-12-06 14:29:28 +00:00
|
|
|
|
|
|
|
op79: // ADC - Absolute, Y
|
|
|
|
_fromAbsoluteIndexed RY
|
|
|
|
_adc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op7d: // ADC - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_adc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op7e: // ROR - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_ror
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 16:20:36 +00:00
|
|
|
op81: // STA - (Indirect, X)
|
|
|
|
mov T0, RA
|
|
|
|
_toIndexedIndirect
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
op84: // STY - Zero Page
|
|
|
|
mov T0, RY
|
|
|
|
_toZero
|
|
|
|
_decode
|
2014-12-06 12:22:12 +00:00
|
|
|
|
2014-12-06 16:20:36 +00:00
|
|
|
op85: // STA - Zero Page
|
|
|
|
mov T0, RA
|
|
|
|
_toZero
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op86: // STX - Zero Page
|
|
|
|
mov T0, RX
|
|
|
|
_toZero
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op88: // DEY
|
|
|
|
_fromReg RY
|
|
|
|
_dec
|
|
|
|
_toReg RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op8a: // TXA
|
2014-12-06 16:45:07 +00:00
|
|
|
_t RX, RA
|
2014-12-06 16:20:36 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op8c: // STY - Absolute
|
|
|
|
mov T0, RY
|
|
|
|
_toAbsb
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op8d: // STA - Absolute
|
|
|
|
mov T0, RA
|
|
|
|
_toAbsb
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op8e: // STX - Absolute
|
|
|
|
mov T0, RX
|
|
|
|
_toAbsb
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 16:45:07 +00:00
|
|
|
op90: // BCC (C==0)
|
2014-12-07 05:05:38 +00:00
|
|
|
_bxc FLAG_C
|
2014-12-06 16:45:07 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op91: // STA - (Indirect), Y
|
|
|
|
mov T0, RA
|
|
|
|
_toIndirectIndex
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op92: // STA - Zero Page, X
|
|
|
|
mov T0, RA
|
|
|
|
_toZeroIndex RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op94: // STY - Zero Page, X
|
|
|
|
mov T0, RY
|
|
|
|
_toZeroIndex RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op95: // STA - Zero Page, X
|
|
|
|
mov T0, RA
|
|
|
|
_toZeroIndex RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op96: // STX - Zero Page, Y
|
|
|
|
mov T0, RX
|
|
|
|
_toZeroIndex RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op98: // TYA
|
|
|
|
_t RY, RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op99: // STA - Absolute, Y
|
|
|
|
mov T0, RA
|
|
|
|
_toAbsoluteIndexed RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
op9a: // TXS
|
2014-12-07 07:35:46 +00:00
|
|
|
movs r0, #1
|
|
|
|
lsls r0, r0, #8
|
2014-12-07 17:43:05 +00:00
|
|
|
add r0, RX, r0
|
|
|
|
mov SP, r0
|
|
|
|
adds PC, PC, #1
|
2014-12-06 16:45:07 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
op9d: // STA - Absolute, X
|
|
|
|
mov T0, RA
|
|
|
|
_toAbsoluteIndexed RX
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
opa0: // LDY - Immediate
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-04 17:43:58 +00:00
|
|
|
_ld RY
|
|
|
|
_decode
|
2014-12-06 16:45:07 +00:00
|
|
|
|
|
|
|
opa1: // LDA - (Indirect, X)
|
|
|
|
_fromIndexedIndirect
|
|
|
|
_ld RA
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
opa2: // LDX - Immediate
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-04 17:43:58 +00:00
|
|
|
_ld RX
|
|
|
|
_decode
|
2014-12-06 16:45:07 +00:00
|
|
|
|
|
|
|
opa4: // LDY - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_ld RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opa5: // LDA - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_ld RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opa6: // LDX - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_ld RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opa8: // TAY
|
|
|
|
_t RA, RY
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
opa9: // LDA - Immediate
|
2014-12-06 14:08:34 +00:00
|
|
|
_fromImmb
|
2014-12-04 17:43:58 +00:00
|
|
|
_ld RA
|
|
|
|
_decode
|
2014-12-06 16:45:07 +00:00
|
|
|
|
|
|
|
opaa: // TAX
|
|
|
|
_t RA, RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opac: // LDY - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_ld RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opad: // LDA - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_ld RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opae: // LDX - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_ld RX
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 16:50:39 +00:00
|
|
|
opb0: // BCS (C==1)
|
2014-12-07 05:05:38 +00:00
|
|
|
_bxs FLAG_C
|
2014-12-06 16:50:39 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
opb1: // LDA - (Indirect), Y
|
|
|
|
_fromIndirectIndex
|
|
|
|
_ld RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opb4: // LDY - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_ld RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opb5: // LDA - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_ld RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opb6: // LDX - Zero Page, Y
|
|
|
|
_fromZeroIndex RY
|
|
|
|
_ld RX
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
opb8: // CLV
|
|
|
|
_clx FLAG_V
|
|
|
|
_decode
|
2014-12-06 16:50:39 +00:00
|
|
|
|
|
|
|
opb9: // LDA - Absolute, Y
|
|
|
|
_fromAbsoluteIndexed RY
|
|
|
|
_ld RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opba: // TSX
|
2014-12-07 15:21:06 +00:00
|
|
|
_t SP, RX
|
2014-12-07 15:36:42 +00:00
|
|
|
mov r0, RX
|
|
|
|
uxtb r0, r0
|
|
|
|
mov RX, r0
|
2014-12-06 16:50:39 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
opbc: // LDY - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_ld RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opbd: // LDA - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_ld RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opbe: // LDX - Absolute, Y
|
|
|
|
_fromAbsoluteIndexed RY
|
|
|
|
_ld RX
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 16:58:56 +00:00
|
|
|
opc0: // CPY - Immediate
|
|
|
|
_fromImmb
|
|
|
|
_cp RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opc1: // CMP - (Indirect, X)
|
|
|
|
_fromIndexedIndirect
|
|
|
|
_cp RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opc4: // CPY - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_cp RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opc5: // CMP - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_cp RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opc6: // DEC - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_dec
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opc8: // INY
|
|
|
|
_fromReg RY
|
2014-12-06 17:13:45 +00:00
|
|
|
_inc
|
2014-12-06 16:58:56 +00:00
|
|
|
_toReg RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opc9: // CMP - Immediate
|
|
|
|
_fromImmb
|
|
|
|
_cp RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opca: // DEX
|
|
|
|
_fromReg RX
|
|
|
|
_dec
|
|
|
|
_toReg RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opcc: // CPY - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_cp RY
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opcd: // CMP - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_cp RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opce: // DEC - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_dec
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 12:00:22 +00:00
|
|
|
opd0: // BNE (Z==0)
|
2014-12-07 05:05:38 +00:00
|
|
|
_bxc FLAG_Z
|
2014-12-06 12:00:22 +00:00
|
|
|
_decode
|
2014-12-06 16:58:56 +00:00
|
|
|
|
2014-12-06 17:03:38 +00:00
|
|
|
opd1: // CMP - (Indirect), Y
|
|
|
|
_fromIndirectIndex
|
|
|
|
_cp RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opd5: // CMP - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_cp RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opd6: // DEC - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_dec
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
opd8: // CLD
|
|
|
|
_clx FLAG_D
|
|
|
|
_decode
|
2014-12-06 17:03:38 +00:00
|
|
|
|
|
|
|
opd9: // CMP - Absolute, Y
|
|
|
|
_fromAbsoluteIndexed RY
|
|
|
|
_cp RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opdd: // CMP - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_cp RA
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opde: // DEC - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_dec
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-06 17:13:45 +00:00
|
|
|
ope0: // CPX - Immediate
|
|
|
|
_fromImmb
|
|
|
|
_cp RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
ope1: // SBC - (Indirect, X)
|
|
|
|
_fromIndexedIndirect
|
|
|
|
_sbc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
ope4: // CPX - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_cp RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
ope5: // SBC - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_sbc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
ope6: // INC - Zero Page
|
|
|
|
_fromZero
|
|
|
|
_inc
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
|
|
|
ope8: // INX
|
|
|
|
_fromReg RX
|
|
|
|
_inc
|
2014-12-07 15:46:38 +00:00
|
|
|
_toReg RX
|
2014-12-06 17:13:45 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
ope9: // SBC - Immediate
|
|
|
|
_fromImmb
|
|
|
|
_sbc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opec: // CPX - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_cp RX
|
|
|
|
_decode
|
|
|
|
|
|
|
|
oped: // SBC - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_sbc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opee: // INC - Absolute
|
|
|
|
_fromAbsb
|
|
|
|
_inc
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opf0: // BEQ (Z==1)
|
2014-12-07 05:05:38 +00:00
|
|
|
_bxs FLAG_Z
|
2014-12-06 17:13:45 +00:00
|
|
|
_decode
|
|
|
|
|
|
|
|
opf1: // SBC - (Indirect), Y
|
|
|
|
_fromIndirectIndex
|
|
|
|
_sbc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opf5: // SBC - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_sbc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opf6: // INC - Zero Page, X
|
|
|
|
_fromZeroIndex RX
|
|
|
|
_inc
|
|
|
|
_toAddr
|
|
|
|
_decode
|
|
|
|
|
2014-12-04 17:43:58 +00:00
|
|
|
opf8: // SED
|
|
|
|
_sex FLAG_D
|
|
|
|
_decode
|
2014-12-06 17:13:45 +00:00
|
|
|
|
|
|
|
opf9: // SBC - Absolute, Y
|
|
|
|
_fromAbsoluteIndexed RY
|
|
|
|
_sbc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opfd: // SBC - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_sbc
|
|
|
|
_decode
|
|
|
|
|
|
|
|
opfe: // INC - Absolute, X
|
|
|
|
_fromAbsoluteIndexed RX
|
|
|
|
_inc
|
|
|
|
_toAddr
|
|
|
|
_decode
|
2014-12-04 17:43:58 +00:00
|
|
|
|
|
|
|
.global cpu6502_reset
|
|
|
|
.type cpu6502_reset, %function
|
|
|
|
cpu6502_reset:
|
|
|
|
push {r4-r7,lr}
|
|
|
|
movs r4, #0x00
|
|
|
|
movs r5, #0x01
|
|
|
|
lsls r5, r5, #8
|
|
|
|
adds r5, r5, #0xff
|
|
|
|
movs r6, #0x30
|
|
|
|
ldr r7, =#r_a
|
|
|
|
str r4, [r7]
|
|
|
|
ldr r7, =#r_x
|
|
|
|
str r4, [r7]
|
|
|
|
ldr r7, =#r_y
|
|
|
|
str r4, [r7]
|
|
|
|
ldr r7, =#r_sp
|
|
|
|
str r5, [r7]
|
|
|
|
ldr r7, =#r_sr
|
|
|
|
str r6, [r7]
|
|
|
|
ldr r0, =#0xfffc
|
|
|
|
_ldw
|
|
|
|
ldr r7, =#r_pc
|
|
|
|
str r0, [r7]
|
|
|
|
pop {r4-r7,pc}
|
|
|
|
|
|
|
|
.global cpu6502_run
|
|
|
|
.type cpu6502_run, %function
|
|
|
|
cpu6502_run:
|
|
|
|
push {r4-r7,lr}
|
|
|
|
mov r0, r8
|
|
|
|
mov r1, r9
|
|
|
|
mov r2, r10
|
|
|
|
mov r3, r11
|
|
|
|
mov r4, r12
|
|
|
|
push {r0-r4}
|
|
|
|
_resume
|
|
|
|
_decode
|
|
|
|
quit:
|
|
|
|
mov r12, r0
|
|
|
|
_suspend
|
|
|
|
pop {r0-r4}
|
|
|
|
mov r8, r0
|
|
|
|
mov r9, r1
|
|
|
|
mov r10, r2
|
|
|
|
mov r11, r3
|
|
|
|
mov r0, r12
|
|
|
|
mov r12, r4
|
|
|
|
pop {r4-r7,pc}
|
|
|
|
|
|
|
|
// void dump(uint16_t pc);
|
|
|
|
.type dump, %function
|
|
|
|
dump:
|
|
|
|
push {lr}
|
|
|
|
_suspend
|
|
|
|
ldr r0, =#r_sp
|
|
|
|
ldr r1, [r0]
|
|
|
|
ldr r0, =#r_sr
|
|
|
|
ldr r2, [r0]
|
|
|
|
push {r1,r2}
|
|
|
|
ldr r3, =#r_pc
|
|
|
|
ldr r0, [r3]
|
|
|
|
ldr r3, =#r_a
|
|
|
|
ldr r1, [r3]
|
|
|
|
ldr r3, =#r_x
|
|
|
|
ldr r2, [r3]
|
|
|
|
ldr r3, =#r_y
|
|
|
|
ldr r3, [r3]
|
|
|
|
// r0=pc, r1=a, r2=x, r3=y, [sp]=sp, [sp+4]=sr
|
|
|
|
bl cpu6502_dump
|
|
|
|
mov r0, sp
|
|
|
|
adds r0, r0, #8
|
|
|
|
mov sp, r0
|
|
|
|
pop {pc}
|
|
|
|
|
|
|
|
.section .rodata
|
|
|
|
op_table:
|
|
|
|
.long op00
|
|
|
|
.long op01
|
|
|
|
.long op02
|
|
|
|
.long op03
|
|
|
|
.long op04
|
|
|
|
.long op05
|
|
|
|
.long op06
|
|
|
|
.long op07
|
|
|
|
.long op08
|
|
|
|
.long op09
|
|
|
|
.long op0a
|
|
|
|
.long op0b
|
|
|
|
.long op0c
|
|
|
|
.long op0d
|
|
|
|
.long op0e
|
|
|
|
.long op0f
|
|
|
|
.long op10
|
|
|
|
.long op11
|
|
|
|
.long op12
|
|
|
|
.long op13
|
|
|
|
.long op14
|
|
|
|
.long op15
|
|
|
|
.long op16
|
|
|
|
.long op17
|
|
|
|
.long op18
|
|
|
|
.long op19
|
|
|
|
.long op1a
|
|
|
|
.long op1b
|
|
|
|
.long op1c
|
|
|
|
.long op1d
|
|
|
|
.long op1e
|
|
|
|
.long op1f
|
|
|
|
.long op20
|
|
|
|
.long op21
|
|
|
|
.long op22
|
|
|
|
.long op23
|
|
|
|
.long op24
|
|
|
|
.long op25
|
|
|
|
.long op26
|
|
|
|
.long op27
|
|
|
|
.long op28
|
|
|
|
.long op29
|
|
|
|
.long op2a
|
|
|
|
.long op2b
|
|
|
|
.long op2c
|
|
|
|
.long op2d
|
|
|
|
.long op2e
|
|
|
|
.long op2f
|
|
|
|
.long op30
|
|
|
|
.long op31
|
|
|
|
.long op32
|
|
|
|
.long op33
|
|
|
|
.long op34
|
|
|
|
.long op35
|
|
|
|
.long op36
|
|
|
|
.long op37
|
|
|
|
.long op38
|
|
|
|
.long op39
|
|
|
|
.long op3a
|
|
|
|
.long op3b
|
|
|
|
.long op3c
|
|
|
|
.long op3d
|
|
|
|
.long op3e
|
|
|
|
.long op3f
|
|
|
|
.long op40
|
|
|
|
.long op41
|
|
|
|
.long op42
|
|
|
|
.long op43
|
|
|
|
.long op44
|
|
|
|
.long op45
|
|
|
|
.long op46
|
|
|
|
.long op47
|
|
|
|
.long op48
|
|
|
|
.long op49
|
|
|
|
.long op4a
|
|
|
|
.long op4b
|
|
|
|
.long op4c
|
|
|
|
.long op4d
|
|
|
|
.long op4e
|
|
|
|
.long op4f
|
|
|
|
.long op50
|
|
|
|
.long op51
|
|
|
|
.long op52
|
|
|
|
.long op53
|
|
|
|
.long op54
|
|
|
|
.long op55
|
|
|
|
.long op56
|
|
|
|
.long op57
|
|
|
|
.long op58
|
|
|
|
.long op59
|
|
|
|
.long op5a
|
|
|
|
.long op5b
|
|
|
|
.long op5c
|
|
|
|
.long op5d
|
|
|
|
.long op5e
|
|
|
|
.long op5f
|
|
|
|
.long op60
|
|
|
|
.long op61
|
|
|
|
.long op62
|
|
|
|
.long op63
|
|
|
|
.long op64
|
|
|
|
.long op65
|
|
|
|
.long op66
|
|
|
|
.long op67
|
|
|
|
.long op68
|
|
|
|
.long op69
|
|
|
|
.long op6a
|
|
|
|
.long op6b
|
|
|
|
.long op6c
|
|
|
|
.long op6d
|
|
|
|
.long op6e
|
|
|
|
.long op6f
|
|
|
|
.long op70
|
|
|
|
.long op71
|
|
|
|
.long op72
|
|
|
|
.long op73
|
|
|
|
.long op74
|
|
|
|
.long op75
|
|
|
|
.long op76
|
|
|
|
.long op77
|
|
|
|
.long op78
|
|
|
|
.long op79
|
|
|
|
.long op7a
|
|
|
|
.long op7b
|
|
|
|
.long op7c
|
|
|
|
.long op7d
|
|
|
|
.long op7e
|
|
|
|
.long op7f
|
|
|
|
.long op80
|
|
|
|
.long op81
|
|
|
|
.long op82
|
|
|
|
.long op83
|
|
|
|
.long op84
|
|
|
|
.long op85
|
|
|
|
.long op86
|
|
|
|
.long op87
|
|
|
|
.long op88
|
|
|
|
.long op89
|
|
|
|
.long op8a
|
|
|
|
.long op8b
|
|
|
|
.long op8c
|
|
|
|
.long op8d
|
|
|
|
.long op8e
|
|
|
|
.long op8f
|
|
|
|
.long op90
|
|
|
|
.long op91
|
|
|
|
.long op92
|
|
|
|
.long op93
|
|
|
|
.long op94
|
|
|
|
.long op95
|
|
|
|
.long op96
|
|
|
|
.long op97
|
|
|
|
.long op98
|
|
|
|
.long op99
|
|
|
|
.long op9a
|
|
|
|
.long op9b
|
|
|
|
.long op9c
|
|
|
|
.long op9d
|
|
|
|
.long op9e
|
|
|
|
.long op9f
|
|
|
|
.long opa0
|
|
|
|
.long opa1
|
|
|
|
.long opa2
|
|
|
|
.long opa3
|
|
|
|
.long opa4
|
|
|
|
.long opa5
|
|
|
|
.long opa6
|
|
|
|
.long opa7
|
|
|
|
.long opa8
|
|
|
|
.long opa9
|
|
|
|
.long opaa
|
|
|
|
.long opab
|
|
|
|
.long opac
|
|
|
|
.long opad
|
|
|
|
.long opae
|
|
|
|
.long opaf
|
|
|
|
.long opb0
|
|
|
|
.long opb1
|
|
|
|
.long opb2
|
|
|
|
.long opb3
|
|
|
|
.long opb4
|
|
|
|
.long opb5
|
|
|
|
.long opb6
|
|
|
|
.long opb7
|
|
|
|
.long opb8
|
|
|
|
.long opb9
|
|
|
|
.long opba
|
|
|
|
.long opbb
|
|
|
|
.long opbc
|
|
|
|
.long opbd
|
|
|
|
.long opbe
|
|
|
|
.long opbf
|
|
|
|
.long opc0
|
|
|
|
.long opc1
|
|
|
|
.long opc2
|
|
|
|
.long opc3
|
|
|
|
.long opc4
|
|
|
|
.long opc5
|
|
|
|
.long opc6
|
|
|
|
.long opc7
|
|
|
|
.long opc8
|
|
|
|
.long opc9
|
|
|
|
.long opca
|
|
|
|
.long opcb
|
|
|
|
.long opcc
|
|
|
|
.long opcd
|
|
|
|
.long opce
|
|
|
|
.long opcf
|
|
|
|
.long opd0
|
|
|
|
.long opd1
|
|
|
|
.long opd2
|
|
|
|
.long opd3
|
|
|
|
.long opd4
|
|
|
|
.long opd5
|
|
|
|
.long opd6
|
|
|
|
.long opd7
|
|
|
|
.long opd8
|
|
|
|
.long opd9
|
|
|
|
.long opda
|
|
|
|
.long opdb
|
|
|
|
.long opdc
|
|
|
|
.long opdd
|
|
|
|
.long opde
|
|
|
|
.long opdf
|
|
|
|
.long ope0
|
|
|
|
.long ope1
|
|
|
|
.long ope2
|
|
|
|
.long ope3
|
|
|
|
.long ope4
|
|
|
|
.long ope5
|
|
|
|
.long ope6
|
|
|
|
.long ope7
|
|
|
|
.long ope8
|
|
|
|
.long ope9
|
|
|
|
.long opea
|
|
|
|
.long opeb
|
|
|
|
.long opec
|
|
|
|
.long oped
|
|
|
|
.long opee
|
|
|
|
.long opef
|
|
|
|
.long opf0
|
|
|
|
.long opf1
|
|
|
|
.long opf2
|
|
|
|
.long opf3
|
|
|
|
.long opf4
|
|
|
|
.long opf5
|
|
|
|
.long opf6
|
|
|
|
.long opf7
|
|
|
|
.long opf8
|
|
|
|
.long opf9
|
|
|
|
.long opfa
|
|
|
|
.long opfb
|
|
|
|
.long opfc
|
|
|
|
.long opfd
|
|
|
|
.long opfe
|
|
|
|
.long opff
|
|
|
|
|
|
|
|
.bss
|
2014-12-07 15:21:06 +00:00
|
|
|
.global cpu6502_pc
|
|
|
|
cpu6502_pc:
|
2014-12-04 17:43:58 +00:00
|
|
|
r_pc: .long 0
|
|
|
|
r_a: .long 0
|
|
|
|
r_x: .long 0
|
|
|
|
r_y: .long 0
|
|
|
|
r_sp: .long 0
|
|
|
|
r_sr: .long 0
|
|
|
|
|