mirror of
				https://github.com/RaySollium99/picodrive.git
				synced 2025-10-27 00:29:39 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			723 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			723 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| @*
 | |
| @* Memory I/O handlers for Sega/Mega CD emulation
 | |
| @* (C) notaz, 2007-2009
 | |
| @*
 | |
| @* This work is licensed under the terms of MAME license.
 | |
| @* See COPYING file in the top-level directory.
 | |
| @*
 | |
| 
 | |
| .equiv PCM_STEP_SHIFT, 11
 | |
| 
 | |
| .text
 | |
| .align 2
 | |
| 
 | |
| .global PicoReadM68k8_io
 | |
| .global PicoReadM68k16_io
 | |
| .global PicoWriteM68k8_io
 | |
| .global PicoWriteM68k16_io
 | |
| 
 | |
| .global PicoReadS68k8_pr
 | |
| .global PicoReadS68k16_pr
 | |
| .global PicoWriteS68k8_pr
 | |
| .global PicoWriteS68k16_pr
 | |
| 
 | |
| .global PicoReadM68k8_cell0
 | |
| .global PicoReadM68k8_cell1
 | |
| .global PicoReadM68k16_cell0
 | |
| .global PicoReadM68k16_cell1
 | |
| .global PicoWriteM68k8_cell0
 | |
| .global PicoWriteM68k8_cell1
 | |
| .global PicoWriteM68k16_cell0
 | |
| .global PicoWriteM68k16_cell1
 | |
| 
 | |
| .global PicoReadS68k8_dec0
 | |
| .global PicoReadS68k8_dec1
 | |
| .global PicoReadS68k16_dec0
 | |
| .global PicoReadS68k16_dec1
 | |
| .global PicoWriteS68k8_dec_m0b0
 | |
| .global PicoWriteS68k8_dec_m1b0
 | |
| .global PicoWriteS68k8_dec_m2b0
 | |
| .global PicoWriteS68k8_dec_m0b1
 | |
| .global PicoWriteS68k8_dec_m1b1
 | |
| .global PicoWriteS68k8_dec_m2b1
 | |
| .global PicoWriteS68k16_dec_m0b0
 | |
| .global PicoWriteS68k16_dec_m1b0
 | |
| .global PicoWriteS68k16_dec_m2b0
 | |
| .global PicoWriteS68k16_dec_m0b1
 | |
| .global PicoWriteS68k16_dec_m1b1
 | |
| .global PicoWriteS68k16_dec_m2b1
 | |
| 
 | |
| @ externs, just for reference
 | |
| .extern Pico
 | |
| .extern Read_CDC_Host
 | |
| .extern m68k_reg_write8
 | |
| .extern s68k_reg_read16
 | |
| .extern s68k_reg_write8
 | |
| .extern s68k_poll_detect
 | |
| .extern gfx_cd_read
 | |
| .extern gfx_cd_write16
 | |
| .extern PicoCpuCS68k
 | |
| .extern PicoRead8_io
 | |
| .extern PicoRead16_io
 | |
| .extern PicoWrite8_io
 | |
| .extern PicoWrite16_io
 | |
| .extern m68k_comm_check
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| @ utilities
 | |
| 
 | |
| @ r0=addr[in,out], r1,r2=tmp
 | |
| .macro cell_map
 | |
|     ands    r1, r0, #0x01c000
 | |
|     ldrne   pc, [pc, r1, lsr #12]
 | |
|     beq     0f                          @ most common?
 | |
|     .long   0f
 | |
|     .long   0f
 | |
|     .long   0f
 | |
|     .long   0f
 | |
|     .long   1f
 | |
|     .long   1f
 | |
|     .long   2f
 | |
|     .long   3f
 | |
| 1: @ x16 cells
 | |
|     and     r1, r0, #0x7e00             @ col
 | |
|     and     r2, r0, #0x01fc             @ row
 | |
|     orr     r2, r2, #0x0400
 | |
|     orr     r1, r2, r1, ror #13
 | |
|     b       9f
 | |
| 2: @ x8 cells
 | |
|     and     r1, r0, #0x3f00             @ col
 | |
|     and     r2, r0, #0x00fc             @ row
 | |
|     orr     r2, r2, #0x0600
 | |
|     orr     r1, r2, r1, ror #12
 | |
|     b       9f
 | |
| 3: @ x4 cells
 | |
|     and     r1, r0, #0x1f80             @ col
 | |
|     and     r2, r0, #0x007c             @ row
 | |
|     orr     r1, r2, r1, ror #11
 | |
|     and     r2, r0,#0x1e000
 | |
|     orr     r1, r1, r2, lsr #6
 | |
|     b       9f
 | |
| 0: @ x32 cells
 | |
|     and     r1, r0, #0xfc00             @ col
 | |
|     and     r2, r0, #0x03fc             @ row
 | |
|     orr     r1, r2, r1, ror #14
 | |
| 9:
 | |
|     and     r0, r0, #3
 | |
|     orr     r0, r0, r1, ror #26         @ rol 4+2
 | |
| .endm
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| m_read_null:
 | |
|     mov     r0, #0
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoReadM68k8_cell0:                    @ 0x220000 - 0x23ffff, cell arranged
 | |
|     mov     r3, #0x0c0000
 | |
|     b       0f
 | |
| 
 | |
| PicoReadM68k8_cell1:                    @ 0x220000 - 0x23ffff, cell arranged
 | |
|     mov     r3, #0x0e0000
 | |
| 0:
 | |
|     cell_map
 | |
|     ldr     r1, =(Pico+0x22200)
 | |
|     add     r0, r0, r3
 | |
|     ldr     r1, [r1]
 | |
|     eor     r0, r0, #1
 | |
|     ldrb    r0, [r1, r0]
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoReadM68k8_io:
 | |
|     and     r1, r0, #0xff00
 | |
|     cmp     r1, #0x2000	              @ a120xx?
 | |
|     bne     PicoRead8_io
 | |
| 
 | |
|     ldr     r1, =(Pico+0x22200)
 | |
|     and     r0, r0, #0x3f
 | |
|     ldr     r1, [r1]                  @ Pico.mcd (used everywhere)
 | |
|     cmp     r0, #0x0e
 | |
|     ldrlt   pc, [pc, r0, lsl #2]
 | |
|     b       m_m68k_read8_hi
 | |
|     .long   m_m68k_read8_r00
 | |
|     .long   m_m68k_read8_r01
 | |
|     .long   m_m68k_read8_r02
 | |
|     .long   m_m68k_read8_r03
 | |
|     .long   m_m68k_read8_r04
 | |
|     .long   m_read_null               @ unused bits
 | |
|     .long   m_m68k_read8_r06
 | |
|     .long   m_m68k_read8_r07
 | |
|     .long   m_m68k_read8_r08
 | |
|     .long   m_m68k_read8_r09
 | |
|     .long   m_read_null               @ reserved
 | |
|     .long   m_read_null
 | |
|     .long   m_m68k_read8_r0c
 | |
|     .long   m_m68k_read8_r0d
 | |
| m_m68k_read8_r00:
 | |
|     add     r1, r1, #0x110000
 | |
|     ldr     r0, [r1, #0x30]
 | |
|     and     r0, r0, #0x04000000       @ we need irq2 mask state
 | |
|     mov     r0, r0, lsr #19
 | |
|     bx      lr
 | |
| m_m68k_read8_r01:
 | |
|     add     r1, r1, #0x110000
 | |
|     add     r1, r1, #0x002200
 | |
|     ldrb    r0, [r1, #2]              @ Pico_mcd->m.busreq
 | |
|     bx      lr
 | |
| m_m68k_read8_r02:
 | |
|     add     r1, r1, #0x110000
 | |
|     ldrb    r0, [r1, #2]
 | |
|     bx      lr
 | |
| m_m68k_read8_r03:                     @ FIXME: sync with C
 | |
|     add     r2, r1, #0x110000
 | |
|     ldrb    r1, [r2, #3]
 | |
|     add     r2, r2, #0x002200
 | |
|     ldr     r2, [r2, #4]
 | |
|     and     r1, r1, #0xc7
 | |
|     tst     r2, #2                    @ DMNA pending?
 | |
|     bicne   r1, r1, #1
 | |
|     orrne   r1, r1, #2
 | |
|     b       m68k_comm_check
 | |
| m_m68k_read8_r04:
 | |
|     add     r1, r1, #0x110000
 | |
|     ldrb    r0, [r1, #4]
 | |
|     bx      lr
 | |
| m_m68k_read8_r06:
 | |
|     ldrb    r0, [r1, #0x73]           @ IRQ vector
 | |
|     bx      lr
 | |
| m_m68k_read8_r07:
 | |
|     ldrb    r0, [r1, #0x72]
 | |
|     bx      lr
 | |
| m_m68k_read8_r08:
 | |
|     mov     r0, #0
 | |
|     bl      Read_CDC_Host             @ TODO: make it local
 | |
|     mov     r0, r0, lsr #8
 | |
|     bx      lr
 | |
| m_m68k_read8_r09:
 | |
|     mov     r0, #0
 | |
|     b       Read_CDC_Host
 | |
| m_m68k_read8_r0c:
 | |
|     add     r1, r1, #0x110000
 | |
|     add     r1, r1, #0x002200
 | |
|     ldr     r0, [r1, #0x14]           @ Pico_mcd->m.timer_stopwatch
 | |
|     mov     r0, r0, lsr #24
 | |
|     bx      lr
 | |
| m_m68k_read8_r0d:
 | |
|     add     r1, r1, #0x110000
 | |
|     add     r1, r1, #0x002200
 | |
|     ldr     r0, [r1, #0x14]
 | |
|     mov     r0, r0, lsr #16
 | |
|     bx      lr
 | |
| m_m68k_read8_hi:
 | |
|     cmp     r0, #0x30
 | |
|     movge   r0, #0
 | |
|     bxeq    lr
 | |
|     add     r1, r1, #0x110000
 | |
|     ldrb    r1, [r1, r0]
 | |
|     b       m68k_comm_check
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| PicoReadM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
 | |
|     mov     r3, #0x0c0000
 | |
|     b       0f
 | |
| 
 | |
| PicoReadM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
 | |
|     mov     r3, #0x0e0000
 | |
| 0:
 | |
|     cell_map
 | |
|     ldr     r1, =(Pico+0x22200)
 | |
|     add     r0, r0, r3
 | |
|     ldr     r1, [r1]
 | |
|     bic     r0, r0, #1
 | |
|     ldrh    r0, [r1, r0]
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoReadM68k16_io:
 | |
|     and     r1, r0, #0xff00
 | |
|     cmp     r1, #0x2000	              @ a120xx
 | |
|     bne     PicoRead16_io
 | |
| 
 | |
| m_m68k_read16_m68k_regs:
 | |
|     ldr     r1, =(Pico+0x22200)
 | |
|     and     r0, r0, #0x3e
 | |
|     ldr     r1, [r1]                  @ Pico.mcd (used everywhere)
 | |
|     cmp     r0, #0x0e
 | |
|     ldrlt   pc, [pc, r0, lsl #1]
 | |
|     b       m_m68k_read16_hi
 | |
|     .long   m_m68k_read16_r00
 | |
|     .long   m_m68k_read16_r02
 | |
|     .long   m_m68k_read16_r04
 | |
|     .long   m_m68k_read16_r06
 | |
|     .long   m_m68k_read16_r08
 | |
|     .long   m_read_null               @ reserved
 | |
|     .long   m_m68k_read16_r0c
 | |
| m_m68k_read16_r00:
 | |
|     add     r1, r1, #0x110000
 | |
|     ldr     r0, [r1, #0x30]
 | |
|     add     r1, r1, #0x002200
 | |
|     ldrb    r1, [r1, #2]              @ Pico_mcd->m.busreq
 | |
|     and     r0, r0, #0x04000000       @ we need irq2 mask state
 | |
|     orr     r0, r1, r0, lsr #11
 | |
|     bx      lr
 | |
| m_m68k_read16_r02:                    @ FIXME: out of sync from C
 | |
|     add     r3, r1, #0x110000
 | |
|     ldrb    r1, [r3, #2]
 | |
|     ldrb    r2, [r3, #3]
 | |
|     add     r3, r3, #0x002200
 | |
|     ldr     r3, [r3, #4]
 | |
|     and     r2, r2, #0xc7
 | |
|     orr     r1, r2, r1, lsl #8
 | |
|     tst     r3, #2                    @ DMNA pending?
 | |
|     bicne   r1, r1, #1
 | |
|     orrne   r1, r1, #2
 | |
|     b       m68k_comm_check
 | |
| m_m68k_read16_r04:
 | |
|     add     r1, r1, #0x110000
 | |
|     ldrb    r0, [r1, #4]
 | |
|     mov     r0, r0, lsl #8
 | |
|     bx      lr
 | |
| m_m68k_read16_r06:
 | |
|     ldrh    r0, [r1, #0x72]           @ IRQ vector
 | |
|     bx      lr
 | |
| m_m68k_read16_r08:
 | |
|     mov     r0, #0
 | |
|     b       Read_CDC_Host
 | |
| m_m68k_read16_r0c:
 | |
|     add     r1, r1, #0x110000
 | |
|     add     r1, r1, #0x002200
 | |
|     ldr     r0, [r1, #0x14]
 | |
|     mov     r0, r0, lsr #16
 | |
|     bx      lr
 | |
| m_m68k_read16_hi:
 | |
|     cmp     r0, #0x30
 | |
|     addlt   r1, r1, #0x110000
 | |
|     ldrlth  r1, [r1, r0]
 | |
|     movge   r0, #0
 | |
|     bxge    lr
 | |
|     mov     r2, r1, lsr #8
 | |
|     and     r1, r1, #0xff
 | |
|     orr     r1, r2, r1, lsl #8
 | |
|     b       m68k_comm_check
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| PicoWriteM68k8_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
 | |
|     mov     r12,#0x0c0000
 | |
|     b       0f
 | |
| 
 | |
| PicoWriteM68k8_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
 | |
|     mov     r12,#0x0e0000
 | |
| 0:
 | |
|     mov     r3, r1
 | |
|     cell_map
 | |
|     ldr     r2, =(Pico+0x22200)
 | |
|     add     r0, r0, r12
 | |
|     ldr     r2, [r2]
 | |
|     eor     r0, r0, #1
 | |
|     strb    r3, [r2, r0]
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoWriteM68k8_io:
 | |
|     and     r2, r0, #0xff00
 | |
|     cmp     r2, #0x2000                 @ a120xx?
 | |
|     beq     m68k_reg_write8
 | |
|     b       PicoWrite8_io
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| PicoWriteM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
 | |
|     mov     r12, #0x0c0000
 | |
|     b       0f
 | |
| 
 | |
| PicoWriteM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
 | |
|     mov     r12, #0x0e0000
 | |
| 0:
 | |
|     mov     r3, r1
 | |
|     cell_map
 | |
|     ldr     r1, =(Pico+0x22200)
 | |
|     add     r0, r0, r12
 | |
|     ldr     r1, [r1]
 | |
|     bic     r0, r0, #1
 | |
|     strh    r3, [r1, r0]
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoWriteM68k16_io:
 | |
|     and     r2, r0, #0xff00
 | |
|     cmp     r2, #0x2000                 @ a120xx?
 | |
|     bne     PicoWrite16_io
 | |
| 
 | |
| m_m68k_write16_regs:
 | |
|     and     r0, r0, #0x3e
 | |
|     cmp     r0, #0x0e
 | |
|     beq     m_m68k_write16_regs_spec
 | |
|     and     r3, r1, #0xff
 | |
|     add     r2, r0, #1
 | |
|     stmfd   sp!,{r2,r3,lr}
 | |
|     mov     r1, r1, lsr #8
 | |
|     bl      m68k_reg_write8
 | |
|     ldmfd   sp!,{r0,r1,lr}
 | |
|     b       m68k_reg_write8
 | |
| 
 | |
| m_m68k_write16_regs_spec:               @ special case
 | |
|     mov     r1, r1, lsr #8
 | |
|     b       m68k_reg_write8
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| @                                   Sub 68k
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| PicoReadS68k8_dec0:                     @ 0x080000 - 0x0bffff
 | |
|     mov     r3, #0x080000               @ + ^ / 2
 | |
|     b       0f
 | |
| 
 | |
| PicoReadS68k8_dec1:
 | |
|     mov     r3, #0x0a0000               @ + ^ / 2
 | |
| 0:
 | |
|     ldr     r2, =(Pico+0x22200)
 | |
|     eor     r0, r0, #2
 | |
|     ldr     r2, [r2]
 | |
|     movs    r0, r0, lsr #1              @ +4-6 <<16
 | |
|     add     r2, r2, r3                  @ map to our address
 | |
|     ldrb    r0, [r2, r0]
 | |
|     movcc   r0, r0, lsr #4
 | |
|     andcs   r0, r0, #0xf
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoReadS68k8_pr:
 | |
|     and     r2, r0, #0xfe00
 | |
|     cmp     r2, #0x8000
 | |
|     bne     m_s68k_read8_pcm
 | |
| 
 | |
| m_s68k_read8_regs:
 | |
|     bic     r0, r0, #0xff0000
 | |
|     bic     r0, r0, #0x008000
 | |
|     sub     r2, r0, #0x0e
 | |
|     cmp     r2, #(0x30-0x0e)
 | |
|     blo     m_s68k_read8_comm
 | |
|     sub     r2, r0, #0x58
 | |
|     cmp     r2, #0x10
 | |
|     ldrlo   r2, =gfx_cd_read
 | |
|     ldrhs   r2, =s68k_reg_read16
 | |
|     stmfd   sp!,{r0,lr}
 | |
|     bic     r0, r0, #1
 | |
|     mov     lr, pc
 | |
|     bx      r2
 | |
|     ldmfd   sp!,{r1,lr}
 | |
|     tst     r1, #1
 | |
|     moveq   r0, r0, lsr #8
 | |
|     and     r0, r0, #0xff
 | |
|     bx      lr
 | |
| 
 | |
| m_s68k_read8_comm:
 | |
|     ldr     r1, =(Pico+0x22200)
 | |
|     ldr     r1, [r1]
 | |
|     add     r1, r1, #0x110000
 | |
|     ldrb    r1, [r1, r0]
 | |
|     b       s68k_poll_detect
 | |
| 
 | |
| 
 | |
| m_s68k_read8_pcm:
 | |
|     tst     r0, #0x8000
 | |
|     bne     m_read_null
 | |
| 
 | |
|     @ must not trash r3 and r12
 | |
|     ldr     r1, =(Pico+0x22200)
 | |
|     bic     r0, r0, #0xff0000
 | |
| @    bic     r0, r0, #0x008000
 | |
|     ldr     r1, [r1]
 | |
|     mov     r2, #0x110000
 | |
|     orr     r2, r2, #0x002200
 | |
|     cmp     r0, #0x2000
 | |
|     bge     m_s68k_read8_pcm_ram
 | |
|     cmp     r0, #0x20
 | |
|     movlt   r0, #0
 | |
|     bxlt    lr
 | |
|     orr     r2, r2, #(0x48+8)           @ pcm.ch + addr_offset
 | |
|     add     r1, r1, r2
 | |
|     and     r2, r0, #0x1c
 | |
|     ldr     r1, [r1, r2, lsl #2]
 | |
|     tst     r0, #2
 | |
|     moveq   r0, r1, lsr #PCM_STEP_SHIFT
 | |
|     movne   r0, r1, lsr #(PCM_STEP_SHIFT+8)
 | |
|     and     r0, r0, #0xff
 | |
|     bx      lr
 | |
| 
 | |
| m_s68k_read8_pcm_ram:
 | |
|     orr     r2, r2, #0x40
 | |
|     ldr     r2, [r1, r2]
 | |
|     add     r1, r1, #0x100000           @ pcm_ram
 | |
|     and     r2, r2, #0x0f000000         @ bank
 | |
|     add     r1, r1, r2, lsr #12
 | |
|     bic     r0, r0, #0x00e000
 | |
|     mov     r0, r0, lsr #1
 | |
|     ldrb    r0, [r1, r0]
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| PicoReadS68k16_dec0:                    @ 0x080000 - 0x0bffff
 | |
|     mov     r3, #0x080000               @ + ^ / 2
 | |
|     b       0f
 | |
| 
 | |
| PicoReadS68k16_dec1:
 | |
|     mov     r3, #0x0a0000               @ + ^ / 2
 | |
| 0:
 | |
|     ldr     r2, =(Pico+0x22200)
 | |
|     eor     r0, r0, #2
 | |
|     ldr     r2, [r2]
 | |
|     mov     r0, r0, lsr #1              @ +4-6 <<16
 | |
|     add     r2, r2, r3                  @ map to our address
 | |
|     ldrb    r0, [r2, r0]
 | |
|     orr     r0, r0, r0, lsl #4
 | |
|     bic     r0, r0, #0xf0
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoReadS68k16_pr:
 | |
|     and     r2, r0, #0xfe00
 | |
|     cmp     r2, #0x8000
 | |
|     @ pcm is on 8-bit bus, would this be same as byte access?
 | |
|     bne     m_s68k_read8_pcm
 | |
| 
 | |
| m_s68k_read16_regs:
 | |
|     bic     r0, r0, #0xff0000
 | |
|     bic     r0, r0, #0x008000
 | |
|     bic     r0, r0, #0x000001
 | |
|     sub     r2, r0, #0x58
 | |
|     cmp     r2, #0x10
 | |
|     blo     gfx_cd_read
 | |
|     cmp     r0, #8
 | |
|     bne     s68k_reg_read16
 | |
|     mov     r0, #1
 | |
|     b       Read_CDC_Host
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| .macro m_s68k_write8_2M_decode
 | |
|     ldr     r2, =(Pico+0x22200)
 | |
|     eor     r0, r0, #2
 | |
|     ldr     r2, [r2]			@ Pico.rom
 | |
|     movs    r0, r0, lsr #1              @ +4-6 <<16
 | |
|     add     r2, r2, r3                  @ map to our address
 | |
| .endm
 | |
| 
 | |
| PicoWriteS68k8_dec_m2b0:                @ overwrite
 | |
|     ands    r1, r1, #0x0f
 | |
|     bxeq    lr
 | |
| 
 | |
| PicoWriteS68k8_dec_m0b0:
 | |
|     mov     r3, #0x080000
 | |
|     b       0f
 | |
| 
 | |
| PicoWriteS68k8_dec_m2b1:                @ overwrite
 | |
|     ands    r1, r1, #0x0f
 | |
|     bxeq    lr
 | |
| 
 | |
| PicoWriteS68k8_dec_m0b1:
 | |
|     mov     r3, #0x0a0000
 | |
| 0:
 | |
|     m_s68k_write8_2M_decode
 | |
|     ldrb    r0, [r2, r0]!
 | |
|     and     r1, r1, #0x0f
 | |
|     movcc   r1, r1, lsl #4
 | |
|     andcc   r3, r0, #0x0f
 | |
|     andcs   r3, r0, #0xf0
 | |
|     orr     r3, r3, r1
 | |
|     strneb  r3, [r2]
 | |
|     bx      lr
 | |
| 
 | |
| PicoWriteS68k8_dec_m1b0:                @ underwrite
 | |
|     mov     r3, #0x080000
 | |
|     b       0f
 | |
| 
 | |
| PicoWriteS68k8_dec_m1b1:
 | |
|     mov     r3, #0x0a0000
 | |
| 0:
 | |
|     ands    r1, r1, #0x0f
 | |
|     bxeq    lr
 | |
|     m_s68k_write8_2M_decode
 | |
|     ldrb    r0, [r2, r0]!
 | |
|     movcc   r1, r1, lsl #4
 | |
|     andcc   r3, r0, #0x0f
 | |
|     andcs   r3, r0, #0xf0
 | |
|     teq     r3, r0
 | |
|     bxne    lr
 | |
|     orr     r3, r3, r1
 | |
|     strneb  r3, [r2]
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoWriteS68k8_pr:
 | |
|     and     r2, r0, #0xfe00
 | |
|     cmp     r2, #0x8000
 | |
|     bne     m_s68k_write8_pcm
 | |
| 
 | |
| m_s68k_write8_regs:
 | |
|     bic     r0, r0, #0xff0000
 | |
|     bic     r0, r0, #0x008000
 | |
|     tst     r0, #0x7e00
 | |
|     movne   r0, #0
 | |
|     bxne    lr
 | |
|     sub     r2, r0, #0x58
 | |
|     cmp     r2, #0x10
 | |
|     bhs     s68k_reg_write8
 | |
|     bic     r0, r0, #1
 | |
|     orr     r1, r1, r1, lsl #8
 | |
|     b       gfx_cd_write16
 | |
| 
 | |
| 
 | |
| m_s68k_write8_pcm:
 | |
|     tst     r0, #0x8000
 | |
|     bxne    lr
 | |
|     bic     r0, r0, #0xff0000
 | |
|     cmp     r0, #0x12
 | |
|     movlt   r0, r0, lsr #1
 | |
|     blt     pcm_write
 | |
| 
 | |
|     cmp     r0, #0x2000
 | |
|     bxlt    lr
 | |
| 
 | |
| m_s68k_write8_pcm_ram:
 | |
|     ldr     r3, =(Pico+0x22200)
 | |
|     bic     r0, r0, #0x00e000
 | |
|     ldr     r3, [r3]
 | |
|     mov     r0, r0, lsr #1
 | |
|     add     r2, r3, #0x110000
 | |
|     add     r2, r2, #0x002200
 | |
|     add     r2, r2, #0x000040
 | |
|     ldr     r2, [r2]
 | |
|     add     r3, r3, #0x100000           @ pcm_ram
 | |
|     and     r2, r2, #0x0f000000         @ bank
 | |
|     add     r3, r3, r2, lsr #12
 | |
|     strb    r1, [r3, r0]
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 | |
| 
 | |
| 
 | |
| .macro m_s68k_write16_2M_decode
 | |
|     ldr     r2, =(Pico+0x22200)
 | |
|     eor     r0, r0, #2
 | |
|     ldr     r2, [r2]
 | |
|     mov     r0, r0, lsr #1              @ +4-6 <<16
 | |
|     add     r2, r2, r3                  @ map to our address
 | |
| .endm
 | |
| 
 | |
| PicoWriteS68k16_dec_m0b0:
 | |
|     mov     r3, #0x080000
 | |
|     b       0f
 | |
| 
 | |
| PicoWriteS68k16_dec_m0b1:
 | |
|     mov     r3, #0x0a0000
 | |
| 0:
 | |
|     m_s68k_write16_2M_decode
 | |
|     bic     r1, r1, #0xf0
 | |
|     orr     r1, r1, r1, lsr #4
 | |
|     strb    r1, [r2, r0]
 | |
|     bx      lr
 | |
| 
 | |
| PicoWriteS68k16_dec_m1b0:               @ underwrite
 | |
|     mov     r3, #0x080000
 | |
|     b       0f
 | |
| 
 | |
| PicoWriteS68k16_dec_m1b1:
 | |
|     mov     r3, #0x0a0000
 | |
| 0:
 | |
|     bics    r1, r1, #0xf000
 | |
|     bicnes  r1, r1, #0x00f0
 | |
|     bxeq    lr
 | |
|     orr     r1, r1, r1, lsr #4
 | |
|     m_s68k_write16_2M_decode
 | |
|     ldrb    r0, [r2, r0]!
 | |
|     and     r3, r1, #0x0f
 | |
|     and     r1, r1, #0xf0
 | |
|     tst     r0, #0x0f
 | |
|     orreq   r0, r0, r3
 | |
|     tst     r0, #0xf0
 | |
|     orreq   r0, r0, r1
 | |
|     strb    r0, [r2]
 | |
|     bx      lr
 | |
| 
 | |
| PicoWriteS68k16_dec_m2b0:               @ overwrite
 | |
|     mov     r3, #0x080000
 | |
|     b       0f
 | |
| 
 | |
| PicoWriteS68k16_dec_m2b1:
 | |
|     mov     r3, #0x0a0000
 | |
| 0:
 | |
|     bics    r1, r1, #0xf000
 | |
|     bicnes  r1, r1, #0x00f0
 | |
|     bxeq    lr
 | |
|     orr     r1, r1, r1, lsr #4
 | |
|     m_s68k_write16_2M_decode
 | |
|     ldrb    r0, [r2, r0]!
 | |
|     ands    r3, r1, #0x0f
 | |
|     andne   r0, r0, #0xf0
 | |
|     orrne   r0, r0, r3
 | |
|     ands    r1, r1, #0xf0
 | |
|     andne   r0, r0, #0x0f
 | |
|     orrne   r0, r0, r1
 | |
|     strb    r0, [r2]
 | |
|     bx      lr
 | |
| 
 | |
| 
 | |
| PicoWriteS68k16_pr:
 | |
|     and     r2, r0, #0xfe00
 | |
|     cmp     r2, #0x8000
 | |
|     bne     m_s68k_write8_pcm
 | |
| 
 | |
| m_s68k_write16_regs:
 | |
|     bic     r0, r0, #0xff0000
 | |
|     bic     r0, r0, #0x008000
 | |
|     bic     r0, r0, #1
 | |
|     tst     r0, #0x7e00
 | |
|     movne   r0, #0
 | |
|     bxne    lr
 | |
|     cmp     r0, #0x0e
 | |
|     beq     m_s68k_write16_regs_spec
 | |
|     sub     r2, r0, #0x58
 | |
|     cmp     r2, #0x10
 | |
|     blo     gfx_cd_write16
 | |
|     and     r3, r1, #0xff
 | |
|     add     r2, r0, #1
 | |
|     stmfd   sp!,{r2,r3,lr}
 | |
|     mov     r1, r1, lsr #8
 | |
|     bl      s68k_reg_write8
 | |
|     ldmfd   sp!,{r0,r1,lr}
 | |
|     b       s68k_reg_write8
 | |
| 
 | |
| m_s68k_write16_regs_spec:               @ special case
 | |
|     ldr     r2, =(Pico+0x22200)
 | |
|     mov     r0, #0x110000
 | |
|     ldr     r2, [r2]
 | |
|     add     r0, r0, #0x00000f
 | |
|     strb    r1, [r2, r0]                @ if (a == 0xe) s68k_regs[0xf] = d;
 | |
|     bx      lr
 | |
| 
 | |
| .pool
 | |
| 
 | |
| @ vim:filetype=armasm
 | 
