Files
player/Project/Src/NES/6502mac_gcc.S

546 lines
9.5 KiB
ArmAsm
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.include "6502def.s"
// 6502 PC ROM
.macro encodePC
and r1, m6502_pc, #0xE000 // r9 & 0xE000
add r2, globalptr,#memmap_tbl // r2
lsr r0, r1, #11 // >>11
ldr r0, [r2, r0] // r2 + r0 r0
str r0, [globalptr,#lastbank] // bank
add m6502_pc, m6502_pc, r0 // m6502_pc += r0
.endm
// 6502 r0
.macro encodeP extra
and r0, cycles, #CYC_V+CYC_D+CYC_I+CYC_C // CYC_V+CYC_D+CYC_I+CYC_C
tst m6502_nz, #0x80000000 // PSR_N
IT NE
orrne r0, r0, #N // N
tst m6502_nz, #0xFF // Z
IT EQ
orreq r0, r0, #Z // Z
orr r0, r0, #\extra // (B/R)
.endm
// r0 6502
.macro decodeP
bic cycles,cycles,#CYC_V+CYC_D+CYC_I+CYC_C // CYC_V+CYC_D+CYC_I+CYC_C
and r1, r0, #V+D+I+C // V/D/I/C
orr cycles,cycles,r1 // cycles
bic m6502_nz, r0, #0xFD // r0 is signed
eor m6502_nz, m6502_nz, #Z // Z
.endm
//
.macro fetch count
ldr r0, [r10,#clocksh]
add r0, r0, \count
str r0, [globalptr,#clocksh]
ldr r1, [globalptr,#opz]
subs cycles, cycles, \count*256
ITT PL
ldrbpl r0, [m6502_pc], #1
ldrpl pc, [r1, r0, lsl #2]
ldr pc, [globalptr,#nexttimeout]
.endm
// Carry
.macro fetch_c count
ldr r0, [globalptr,#clocksh]
add r0, r0, \count
str r0, [globalptr,#clocksh]
ldr r1, [globalptr,#opz]
sbcs cycles, cycles, \count*256
ITT PL
ldrbpl r0, [m6502_pc], #1
ldrpl pc, [r1, r0, lsl #2]
ldr pc, [globalptr,#nexttimeout]
.endm
//
.macro clearcycles
and cycles,cycles,#CYC_MASK // CYC_MASK
.endm
//
.macro readmemabs
and r1, addy, #0xE000
adr lr, 0f
lsr r1, r1, #11
ldr pc, [m6502_rmem, r1]
0:
.endm
//
.macro readmemzp
ldrb r0, [cpu_zpage, addy]
.endm
//
.macro readmemzpi
lsr r0, addy, #24
ldrb r0, [cpu_zpage, r0]
.endm
// RAM NZ
.macro readmemzps
ldrsb m6502_nz, [cpu_zpage,addy]
.endm
//
.macro readmemimm
ldrb r0, [m6502_pc], #1
.endm
// NZ
.macro readmemimms
ldrsb m6502_nz, [m6502_pc], #1
.endm
//
.macro readmem
.if _type == _ABS
readmemabs
.elseif _type == _ZP
readmemzp
.elseif _type == _ZPI
readmemzpi
.elseif _type == _IMM
readmemimm
.endif
.endm
//
.macro readmems
.if _type == _ABS
readmemabs
orr m6502_nz, r0, r0, lsl #24
.elseif _type == _ZP
readmemzps
.elseif _type == _IMM
readmemimms
.endif
.endm
//
.macro writememabs
and r1, addy, #0xE000
@ ldr r2, =writemem_tbl
@ add r2, globalptr
add r2, globalptr,#writemem_tbl
adr lr, 0f
lsr r1, r1, #11
ldr pc, [r2, r1]
0:
.endm
//
.macro writememzp
strb r0, [cpu_zpage,addy]
.endm
//
.macro writememzpi
lsr r1, addy, #24
strb r0, [cpu_zpage, r1]
.endm
//
.macro writemem
.if _type == _ABS
writememabs
.elseif _type == _ZP
writememzp
.elseif _type == _ZPI
writememzpi
.endif
.endm
// 16
.macro push16
mov r1, r0, lsr #8
ldr r2, [globalptr,#m6502_s]
strb r1, [r2], #-1
orr r2, r2, #0x100
strb r0, [r2], #-1
strb r2, [globalptr,#m6502_s]
.endm
// 8
.macro push8 x
ldr r2, [globalptr,#m6502_s]
strb \x, [r2], #-1
strb r2, [globalptr,#m6502_s]
.endm
// 16
.macro pop16
ldrb r2, [globalptr,#m6502_s]
add r2, r2, #2
strb r2, [globalptr,#m6502_s]
ldr r2, [globalptr,#m6502_s]
ldrb r0, [r2], #-1
orr r2, r2, #0x100
ldrb m6502_pc, [r2]
orr m6502_pc, m6502_pc, r0, lsl #8
.endm
// 8
.macro pop8 x
ldrb r2, [globalptr,#m6502_s]
add r2, r2, #1
strb r2, [globalptr,#m6502_s]
orr r2, r2, #0x100
ldrsb \x, [cpu_zpage, r2]
.endm
//
.equ _IMM, 1
.equ _ZP, 2
.equ _ZPI, 3
.equ _ABS, 4
//
.macro doABS
.set _type, _ABS
ldrb addy, [m6502_pc], #1
ldrb r0, [m6502_pc], #1
orr addy, addy, r0, lsl #8
.endm
// X
.macro doAIX
.set _type, _ABS
ldrb addy, [m6502_pc], #1
ldrb r0, [m6502_pc], #1
orr addy, addy, r0, lsl #8
add addy, addy, m6502_x, lsr #24
.endm
// Y
.macro doAIY
.set _type, _ABS
ldrb addy, [m6502_pc], #1
ldrb r0, [m6502_pc], #1
orr addy, addy, r0, lsl #8
add addy, addy, m6502_y, lsr #24
.endm
//
.macro doIMM
.set _type, _IMM
.endm
// X
.macro doIIX
.set _type, _ABS
ldrb r0, [m6502_pc], #1
add r0, m6502_x, r0, lsl #24
lsr addy, r0, #24
ldrb addy, [cpu_zpage, addy]
add r0, r0, #0x01000000
lsr r1, r0, #24
ldrb r1, [cpu_zpage, r1]
orr addy, addy, r1, lsl #8
.endm
// Y
.macro doIIY
.set _type, _ABS
ldrb r0, [m6502_pc], #1
ldrb addy, [r0,cpu_zpage]
add r0, r0, cpu_zpage
ldrb r1, [r0, #1]
orr addy, addy, r1, lsl #8
add addy, addy, m6502_y, lsr #24
.endm
//
.macro doZPI
.set _type, _ABS
ldrb r0, [m6502_pc], #1
ldrb addy, [r0,cpu_zpage]
add r0, r0, cpu_zpage
ldrb r1, [r0, #1]
orr addy, addy, r1, lsl #8
.endm
//
.macro doZ
.set _type, _ZP
ldrb addy, [m6502_pc], #1
.endm
// bbr/bbs
.macro doZ2
.set _type, _ZP
ldrb addy, [m6502_pc], #2
.endm
// X
.macro doZIX
.set _type, _ZP
ldrb addy, [m6502_pc], #1
add addy, addy, m6502_x, lsr #24
and addy, addy, #0xff
.endm
// X
.macro doZIXf
.set _type, _ZPI
ldrb addy, [m6502_pc], #1
add addy, m6502_x, addy, lsl #24
.endm
// Y
.macro doZIY
.set _type, _ZP
ldrb addy, [m6502_pc], #1
add addy, addy, m6502_y, lsr #24
and addy, addy, #0xff
.endm
// Y
.macro doZIYf
.set _type, _ZPI
ldrb addy, [m6502_pc], #1
add addy, m6502_y, addy, lsl #24
.endm
// ADC
.macro opADC
readmem
movs r1, cycles, lsr #1
IT CS
subcs r0, r0, #0x00000100
adcs m6502_a, m6502_a, r0, ror #8
mov m6502_nz, m6502_a, asr #24
orr cycles, cycles, #CYC_C+CYC_V
IT VC
bicvc cycles, cycles, #CYC_V
.endm
// AND
.macro opAND
readmem
and m6502_a, m6502_a, r0, lsl #24
mov m6502_nz, m6502_a, asr #24
.endm
// ASL
.macro opASL
readmem
add r0, r0, r0
orrs m6502_nz, r0, r0, lsl #24
orr cycles, cycles, #CYC_C
writemem
.endm
// BIT
.macro opBIT
readmem
bic cycles, cycles, #CYC_V
tst r0, #V
IT NE
orrne cycles, cycles, #CYC_V
and m6502_nz, r0, m6502_a, lsr #24
orr m6502_nz, m6502_nz, r0, lsl #24
.endm
//
.macro opCOMP x
readmem
subs m6502_nz, \x, r0, lsl #24
mov m6502_nz, m6502_nz, asr #24
orr cycles, cycles, #CYC_C
.endm
//
.macro opDEC
readmem
sub r0, r0, #1
orr m6502_nz, r0, r0, lsl #24
writemem
.endm
//
.macro opEOR
readmem
eor m6502_a, m6502_a, r0, lsl #24
mov m6502_nz, m6502_a, asr #24
.endm
//
.macro opINC
readmem
add r0, r0, #1
orr m6502_nz, r0, r0, lsl #24
writemem
.endm
//
.macro opLOAD x
readmems
mov \x, m6502_nz, lsl #24
.endm
//
.macro opLSR
.if _type == _ABS
readmemabs
movs r0, r0, lsr #1
orr cycles, cycles, #CYC_C
mov m6502_nz, r0
writememabs
.elseif _type == _ZP
ldrb m6502_nz, [cpu_zpage, addy]
movs m6502_nz, m6502_nz, lsr #1
orr cycles, cycles, #CYC_C
strb m6502_nz, [cpu_zpage, addy]
.elseif _type == _ZPI
lsr m6502_nz, addy, #24
ldrb m6502_nz, [cpu_zpage, m6502_nz]
movs m6502_nz, m6502_nz, lsr #1
orr cycles, cycles, #CYC_C
lsr r1, addy, #24
strb m6502_nz, [cpu_zpage, r1]
.endif
.endm
// OR
.macro opORA
readmem
orr m6502_a, m6502_a, r0, lsl #24
mov m6502_nz, m6502_a, asr #24
.endm
//
.macro opROL
readmem
movs cycles, cycles, lsr #1
adc r0, r0, r0
orrs m6502_nz, r0, r0, lsl #24
adc cycles, cycles, cycles
writemem
.endm
//
.macro opROR
readmem
movs cycles, cycles, lsr #1
IT CS
orrcs r0, r0, #0x100
movs r0, r0, lsr #1
orr m6502_nz, r0, r0, lsl #24
adc cycles, cycles, cycles
writemem
.endm
//
.macro opSBC
readmem
movs r1, cycles, lsr #1
sbcs m6502_a, m6502_a, r0, lsl #24
and m6502_a, m6502_a, #0xff000000
mov m6502_nz, m6502_a, asr #24
orr cycles, cycles, #CYC_C+CYC_V
IT VC
bicvc cycles, cycles, #CYC_V
.endm
.macro opSTORE x
mov r0, \x, lsr #24
writemem
.endm
@ .global main
@ .type main, %function
@ mian:
@ encodePC
@ encodeP (B+R)
@ encodeP (R)
@ decodeP
@ fetch 10
@ fetch_c 10
@ clearcycles
@ readmemabs
@ readmemzp
@ readmemzpi
@ readmemzps
@ readmemimm
@ readmemimms
@ readmem
@ readmems
@ writememabs
@ writememzp
@ writememzpi
@ writemem
@ push16
@ push8 r0
@ pop16
@ pop8 r0
@ doABS
@ doAIX
@ doAIY
@ doIMM
@ doIIX
@ doIIY
@ doZPI
@ doZ
@ doZ2
@ doZIX
@ doZIXf
@ doZIY
@ doZIYf
@ opADC
@ opAND
@ opASL
@ opBIT
@ opCOMP r5
@ opDEC
@ opEOR
@ opINC
@ opLOAD r5
@ opLSR
@ opORA
@ opROL
@ opROR
@ opSBC
@ opSTORE r5