Преглед на файлове

arm asm memory access functions for m/s68k

kub преди 5 години
родител
ревизия
78d817c370
променени са 4 файла, в които са добавени 205 реда и са изтрити 9 реда
  1. 2 0
      pico/cd/memory.c
  2. 104 9
      pico/cd/memory_arm.S
  3. 3 0
      pico/memory.c
  4. 96 0
      pico/memory_arm.S

+ 2 - 0
pico/cd/memory.c

@@ -14,12 +14,14 @@ uptr s68k_read16_map [0x1000000 >> M68K_MEM_SHIFT];
 uptr s68k_write8_map [0x1000000 >> M68K_MEM_SHIFT];
 uptr s68k_write16_map[0x1000000 >> M68K_MEM_SHIFT];
 
+#ifndef _ASM_CD_MEMORY_C
 MAKE_68K_READ8(s68k_read8, s68k_read8_map)
 MAKE_68K_READ16(s68k_read16, s68k_read16_map)
 MAKE_68K_READ32(s68k_read32, s68k_read16_map)
 MAKE_68K_WRITE8(s68k_write8, s68k_write8_map)
 MAKE_68K_WRITE16(s68k_write16, s68k_write16_map)
 MAKE_68K_WRITE32(s68k_write32, s68k_write16_map)
+#endif
 
 // -----------------------------------------------------------------
 

+ 104 - 9
pico/cd/memory_arm.S

@@ -178,9 +178,9 @@ m_m68k_read8_r02:
     bx      lr
 m_m68k_read8_r03:
     add     r1, r1, #0x110000
-    push    {r1, lr}
+    stmfd   sp!, {r1, lr}
     bl      m68k_comm_check
-    pop     {r1, lr}
+    ldmfd   sp!, {r1, lr}
     ldrb    r0, [r1, #3]
     and     r0, r0, #0xc7
     bx      lr
@@ -219,10 +219,10 @@ m_m68k_read8_hi:
     add     r1, r1, #0x110000
     movge   r0, #0
     bxge    lr
-    add     r1, r0
-    push    {r1, lr}
+    add     r1, r1, r0
+    stmfd   sp!, {r1, lr}
     bl      m68k_comm_check
-    pop     {r1, lr}
+    ldmfd   sp!, {r1, lr}
     ldrb    r0, [r1]
     bx      lr
 
@@ -275,9 +275,9 @@ m_m68k_read16_r00:
     bx      lr
 m_m68k_read16_r02:
     add     r1, r1, #0x110000
-    push    {r1, lr}
+    stmfd   sp!, {r1, lr}
     bl      m68k_comm_check
-    pop     {r1, lr}
+    ldmfd   sp!, {r1, lr}
     ldrb    r2, [r1, #3]
     ldrb    r0, [r1, #2]
     and     r2, r2, #0xc7
@@ -307,9 +307,9 @@ m_m68k_read16_hi:
     bxge    lr
 
     add     r1, r0, r1
-    push    {r1, lr}
+    stmfd   sp!, {r1, lr}
     bl      m68k_comm_check
-    pop     {r0, lr}
+    ldmfd   sp!, {r0, lr}
     ldrh    r0, [r0]
     mov     r1, r0, lsr #8
     and     r0, r0, #0xff
@@ -701,6 +701,101 @@ m_s68k_write16_regs_spec:               @ special case
     strb    r1, [r2, r0]                @ if (a == 0xe) s68k_regs[0xf] = d;
     bx      lr
 
+.global s68k_read8
+.global s68k_read16
+.global s68k_write8
+.global s68k_write16
+
+s68k_read8:
+    ldr     r3, =s68k_read8_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    eor     r2, r0, #1
+    movs    r3, r3, lsl #1
+    ldrccb  r0, [r3, r2]
+    bxcc    lr
+    bx      r3
+
+s68k_read16:
+    ldr     r3, =s68k_read16_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    bic     r0, r0, #1
+    movs    r3, r3, lsl #1
+    ldrcch  r0, [r3, r0]
+    bxcc    lr
+    bx      r3
+
+s68k_read32:
+    ldr     r3, =s68k_read16_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    bic     r0, r0, #1
+    movs    r3, r3, lsl #1
+    ldrcch  r1, [r3, r0]!
+    ldrcch  r0, [r3, #2]
+    orrcc   r0, r0, r1, lsl #16
+    bxcc    lr
+
+    stmfd   sp!, {r0, r3, r4, lr}
+    mov     lr, pc
+    bx      r3
+    ldmfd   sp!, {r1, r3}
+    str     r0, [sp]
+    add     r0, r1, #2
+    mov     lr, pc
+    bx      r3
+    ldmfd   sp!, {r1, lr}
+    mov     r0, r0, lsl #16
+    mov     r1, r1, lsl #16
+    orr     r0, r1, r0, lsr #16
+    bx      lr
+
+s68k_write8:
+    ldr     r3, =s68k_write8_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    eor     r2, r0, #1
+    movs    r3, r3, lsl #1
+    strccb  r1, [r3, r2]
+    bxcc    lr
+    bx      r3
+
+s68k_write16:
+    ldr     r3, =s68k_write16_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    bic     r0, r0, #1
+    movs    r3, r3, lsl #1
+    strcch  r1, [r3, r0]
+    bxcc    lr
+    bx      r3
+
+s68k_write32:
+    ldr     r3, =s68k_write16_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    bic     r0, r0, #1
+    movs    r3, r3, lsl #1
+    movcc   r2, r1, lsr #16
+    strcch  r2, [r3, r0]!
+    strcch  r1, [r3, #2]
+    bxcc    lr
+
+    stmfd   sp!, {r0, r1, r3, lr}
+    mov     r1, r1, lsr #16
+    mov     lr, pc
+    bx      r3
+    ldmfd   sp!, {r0, r1, r3, lr}
+    add     r0, r0, #2
+    bx      r3
+
 .pool
 
 @ vim:filetype=armasm

+ 3 - 0
pico/memory.c

@@ -163,12 +163,14 @@ void m68k_map_unmap(int start_addr, int end_addr)
     m68k_write16_map[i] = (addr >> 1) | MAP_FLAG;
 }
 
+#ifndef _ASM_MEMORY_C
 MAKE_68K_READ8(m68k_read8, m68k_read8_map)
 MAKE_68K_READ16(m68k_read16, m68k_read16_map)
 MAKE_68K_READ32(m68k_read32, m68k_read16_map)
 MAKE_68K_WRITE8(m68k_write8, m68k_write8_map)
 MAKE_68K_WRITE16(m68k_write16, m68k_write16_map)
 MAKE_68K_WRITE32(m68k_write32, m68k_write16_map)
+#endif
 
 // -----------------------------------------------------------------
 
@@ -420,6 +422,7 @@ static u32 PicoRead8_sram(u32 a)
       d = EEPROM_read();
       if (!(a & 1))
         d >>= 8;
+      d &= 0xff;
     } else
       d = *(u8 *)(Pico.sv.data - Pico.sv.start + a);
     elprintf(EL_SRAMIO, "sram r8  [%06x]   %02x @ %06x", a, d, SekPc);

+ 96 - 0
pico/memory_arm.S

@@ -59,6 +59,7 @@ m_read8_eeprom:
     ldmfd   sp!,{r1,lr}
     tst     r1, #1
     moveq   r0, r0, lsr #8
+    and     r0, r0, #0xff
     bx      lr
 
 
@@ -220,6 +221,101 @@ m_write16_not_z80ctl:
     strb    r2, [r3, #OFS_Pico_m_sram_reg]
     bx      lr
 
+.global m68k_read8
+.global m68k_read16
+.global m68k_write8
+.global m68k_write16
+
+m68k_read8:
+    ldr     r3, =m68k_read8_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    eor     r2, r0, #1
+    movs    r3, r3, lsl #1
+    ldrccb  r0, [r3, r2]
+    bxcc    lr
+    bx      r3
+
+m68k_read16:
+    ldr     r3, =m68k_read16_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    bic     r0, r0, #1
+    movs    r3, r3, lsl #1
+    ldrcch  r0, [r3, r0]
+    bxcc    lr
+    bx      r3
+
+m68k_read32:
+    ldr     r3, =m68k_read16_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    bic     r0, r0, #1
+    movs    r3, r3, lsl #1
+    ldrcch  r1, [r3, r0]!
+    ldrcch  r0, [r3, #2]
+    orrcc   r0, r0, r1, lsl #16
+    bxcc    lr
+
+    stmfd   sp!, {r0, r3, r4, lr}
+    mov     lr, pc
+    bx      r3
+    ldmfd   sp!, {r1, r3}
+    str     r0, [sp]
+    add     r0, r1, #2
+    mov     lr, pc
+    bx      r3
+    ldmfd   sp!, {r1, lr}
+    mov     r0, r0, lsl #16
+    mov     r1, r1, lsl #16
+    orr     r0, r1, r0, lsr #16
+    bx      lr
+
+m68k_write8:
+    ldr     r3, =m68k_write8_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    eor     r2, r0, #1
+    movs    r3, r3, lsl #1
+    strccb  r1, [r3, r2]
+    bxcc    lr
+    bx      r3
+
+m68k_write16:
+    ldr     r3, =m68k_write16_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    bic     r0, r0, #1
+    movs    r3, r3, lsl #1
+    strcch  r1, [r3, r0]
+    bxcc    lr
+    bx      r3
+
+m68k_write32:
+    ldr     r3, =m68k_write16_map
+    bic     r0, r0, #0xff000000
+    mov     r2, r0, lsr #16
+    ldr     r3, [r3, r2, lsl #2]
+    bic     r0, r0, #1
+    movs    r3, r3, lsl #1
+    movcc   r2, r1, lsr #16
+    strcch  r2, [r3, r0]!
+    strcch  r1, [r3, #2]
+    bxcc    lr
+
+    stmfd   sp!, {r0, r1, r3, lr}
+    mov     r1, r1, lsr #16
+    mov     lr, pc
+    bx      r3
+    ldmfd   sp!, {r0, r1, r3, lr}
+    add     r0, r0, #2
+    bx      r3
+
 .pool
 
 @ vim:filetype=armasm