some audio problems fixed, missing files added
[picodrive.git] / platform / gp2x / code940 / 940init.s
index 750e0ae..2a17a9c 100644 (file)
@@ -1,8 +1,13 @@
-.global code940\r
+@ vim:filetype=armasm:\r
+\r
 \r
 .equ mmsp2_regs, (0xc0000000-0x02000000) @ assume we live @ 0x2000000 bank\r
+.equ shared_ctl,  0x00200000             @ this is where shared_ctl struncture is located\r
+\r
 \r
-code940:                          @ interrupt table:\r
+@ exception table:\r
+.global code940\r
+code940:\r
     b .b_reset                    @ reset\r
     b .b_undef                    @ undefined instructions\r
     b .b_swi                      @ software interrupt\r
@@ -32,19 +37,23 @@ code940:                          @ interrupt table:
     mov     r12, #5\r
     b       .Begin\r
 .b_irq:\r
-    mov     r12, #6\r
     mov     sp, #0x100000       @ reset stack\r
     sub     sp, sp, #4\r
-    mov     r1, #mmsp2_regs\r
-    orr     r2, r1, #0x3B00\r
-    orr     r2, r2, #0x0046\r
-    mvn     r3, #0\r
-    strh    r3, [r2]            @ clear any pending interrupts from the DUALCPU unit\r
-    orr     r2, r1, #0x4500\r
-    str     r3, [r2]            @ clear all pending interrupts in irq controller's SRCPND register\r
-    orr     r2, r2, #0x0010\r
-    str     r3, [r2]            @ clear all pending interrupts in irq controller's INTPND register\r
-    b       .Enter\r
+    mov     r0, #shared_ctl     @ remember where we were when interrupt happened\r
+    add     r0, r0, #0x20\r
+    str     lr, [r0]\r
+    mov     r0, #shared_ctl     @ increment exception counter (for debug)\r
+    add     r0, r0, #(6*4)\r
+    ldr     r1, [r0]\r
+    add     r1, r1, #1\r
+    str     r1, [r0]\r
+\r
+    bl Main940\r
+\r
+    @ we should never get here\r
+    b .b_reserved\r
+\r
+\r
 .b_fiq:\r
     mov     r12, #7\r
     b       .Begin\r
@@ -81,8 +90,13 @@ code940:                          @ interrupt table:
     mcr p15, 0, r0, c6, c4, 0\r
     mcr p15, 0, r0, c6, c4, 1\r
 \r
-    @ set regions 1 and 4 to be cacheable (so the first 2M and mp3 area will be cacheable)\r
-    mov r0, #(1<<1)|(1<<4)\r
+    @ region 5: 4K 0x00000000-0x00001000 (boot code protection region)\r
+    mov r0, #(0x0b<<1)|1\r
+    mcr p15, 0, r0, c6, c5, 0\r
+    mcr p15, 0, r0, c6, c5, 1\r
+\r
+    @ set regions 1, 4 and 5 to be cacheable (so the first 2M and mp3 area will be cacheable)\r
+    mov r0, #(1<<1)|(1<<4)|(1<<5)\r
     mcr p15, 0, r0, c2, c0, 0\r
     mcr p15, 0, r0, c2, c0, 1\r
 \r
@@ -90,10 +104,13 @@ code940:                          @ interrupt table:
     mov r0, #(1<<1)\r
     mcr p15, 0, r0, c3, c0, 0\r
 \r
-    @ set protection, allow access only to regions 1 and 2\r
-    mov r0, #(3<<8)|(3<<6)|(3<<4)|(3<<2)|(0)  @ data: [full, full, full, full, no access] for regions [4 3 2 1 0]\r
+    @ set access protection\r
+    @ data: [no, full, full, full, full, no access] for regions [5 4 3 2 1 0]\r
+    mov r0, #(0<<10)|(3<<8)|(3<<6)|(3<<4)|(3<<2)|(0)\r
     mcr p15, 0, r0, c5, c0, 0\r
-    mov r0, #(0<<8)|(0<<6)|(0<<4)|(3<<2)|(0)  @ instructions: [no access, no, no, full, no]\r
+    @ instructions: [full, no access, no, no, full, no]\r
+    mov r0,         #(0<< 6)|(0<<4)|(3<<2)|(0)\r
+    orr r0, r0,     #(3<<10)|(0<<8)\r
     mcr p15, 0, r0, c5, c0, 1\r
 \r
     mrc p15, 0, r0, c1, c0, 0   @ fetch current control reg\r
@@ -109,19 +126,74 @@ code940:                          @ interrupt table:
     mov r0, #0\r
     mcr p15, 0, r0, c7, c6, 0\r
 \r
-.Enter:\r
-    mov r0, r12\r
-    mov r1, lr\r
-    bl Main940\r
+    @ remember which exception vector we came from (increment counter for debug)\r
+    mov     r0, #shared_ctl\r
+    add     r0, r0, r12, lsl #2\r
+    ldr     r1, [r0]\r
+    add     r1, r1, #1\r
+    str     r1, [r0]\r
+    \r
+    @ remember last lr (for debug)\r
+    mov     r0, #shared_ctl\r
+    add     r0, r0, #0x20\r
+    str     lr, [r0]\r
+\r
+    @ ready to take first job-interrupt\r
+wait_for_irq:\r
+    mrs     r0, cpsr\r
+    bic     r0, r0, #0x80\r
+    msr     cpsr_c, r0              @ enable interrupts\r
+\r
+    mov     r0, #0\r
+    mcr     p15, 0, r0, c7, c0, 4   @ wait for IRQ\r
+@    mcr     p15, 0, r0, c15, c8, 2\r
+    nop\r
+    nop\r
+    b       .b_reserved\r
+\r
 \r
-    @ we should never get here\r
-@.b_deadloop:\r
-@    b .b_deadloop\r
-    b .b_reserved\r
 \r
+@ next job getter\r
+.global wait_get_job @ int oldjob\r
 \r
+wait_get_job:\r
+    mov     r3, #mmsp2_regs\r
+    orr     r2, r3, #0x3B00\r
+    orr     r2, r2, #0x0046         @ DUALPEND940 register\r
+    ldrh    r12,[r2]\r
 \r
-@ so asm utils are also defined here:\r
+    tst     r0, r0\r
+    beq     wgj_no_old\r
+    sub     r0, r0, #1\r
+    mov     r1, #1\r
+    mov     r1, r1, lsl r0\r
+    strh    r1, [r2]                @ clear finished job's pending bit\r
+    bic     r12,r12,r1\r
+\r
+wgj_no_old:\r
+    tst     r12,r12\r
+    beq     wgj_no_jobs\r
+    mov     r0, #0\r
+wgj_loop:\r
+    add     r0, r0, #1\r
+    movs    r12,r12,lsr #1\r
+    bxcs    lr\r
+    b       wgj_loop\r
+\r
+wgj_no_jobs:\r
+    mvn     r0, #0\r
+    orr     r2, r3, #0x4500\r
+    str     r0, [r2]            @ clear all pending interrupts in irq controller's SRCPND register\r
+    orr     r2, r2, #0x0010\r
+    str     r0, [r2]            @ clear all pending interrupts in irq controller's INTPND register\r
+    b       wait_for_irq\r
+\r
+.pool\r
+\r
+\r
+\r
+\r
+@ some asm utils are also defined here:\r
 .global spend_cycles @ c\r
 \r
 spend_cycles:\r
@@ -135,16 +207,16 @@ spend_cycles:
 \r
 \r
 @ clean-flush function from ARM940T technical reference manual\r
-.global cache_clean_flush\r
+.global dcache_clean_flush\r
 \r
-cache_clean_flush:\r
+dcache_clean_flush:\r
     mov     r1, #0                  @ init line counter\r
 ccf_outer_loop:\r
     mov     r0, #0                  @ segment counter\r
 ccf_inner_loop:\r
     orr     r2, r1, r0              @ make segment and line address\r
     mcr     p15, 0, r2, c7, c14, 2  @ clean and flush that line\r
-    add     r0, r0, #0x10           @ incremet secment counter\r
+    add     r0, r0, #0x10           @ incremet segment counter\r
     cmp     r0, #0x40               @ complete all 4 segments?\r
     bne     ccf_inner_loop\r
     add     r1, r1, #0x04000000     @ increment line counter\r
@@ -153,17 +225,18 @@ ccf_inner_loop:
     bx      lr\r
 \r
 \r
+\r
 @ clean-only version\r
-.global cache_clean\r
+.global dcache_clean\r
 \r
-cache_clean:\r
+dcache_clean:\r
     mov     r1, #0                  @ init line counter\r
 cf_outer_loop:\r
     mov     r0, #0                  @ segment counter\r
 cf_inner_loop:\r
     orr     r2, r1, r0              @ make segment and line address\r
     mcr     p15, 0, r2, c7, c10, 2  @ clean that line\r
-    add     r0, r0, #0x10           @ incremet secment counter\r
+    add     r0, r0, #0x10           @ incremet segment counter\r
     cmp     r0, #0x40               @ complete all 4 segments?\r
     bne     cf_inner_loop\r
     add     r1, r1, #0x04000000     @ increment line counter\r
@@ -172,31 +245,13 @@ cf_inner_loop:
     bx      lr\r
 \r
 \r
-.global wait_irq\r
-\r
-wait_irq:\r
-    mov     r0, #mmsp2_regs\r
-    orr     r0, r0, #0x3B00\r
-    orr     r1, r0, #0x0042\r
-    mov     r3, #0\r
-    strh    r3, [r1]                @ disable interrupts\r
-    orr     r2, r0, #0x003E\r
-    strh    r3, [r2]                @ remove busy flag\r
-    mov     r3, #1\r
-    strh    r3, [r1]                @ enable interrupts\r
-\r
-    mrs     r0, cpsr\r
-    bic     r0, r0, #0x80\r
-    msr     cpsr_c, r0              @ enable interrupts\r
+@ drain write buffer\r
+.global drain_wb\r
 \r
+drain_wb:\r
     mov     r0, #0\r
-    mcr     p15, 0, r0, c7, c0, 4   @ wait for IRQ\r
-@    mcr     p15, 0, r0, c15, c8, 2\r
-    nop\r
-    nop\r
-    b       .b_reserved\r
-\r
-.pool\r
+    mcr     p15, 0, r0, c7, c10, 4\r
+    bx      lr\r
 \r
 \r
 .global set_if_not_changed @ int *val, int oldval, int newval\r
@@ -208,4 +263,10 @@ set_if_not_changed:
     strne  r3, [r0] @ restore value which was changed there by other core\r
     bx     lr\r
 \r
-@ vim:filetype=armasm:\r
+\r
+\r
+@ pad the protected region.\r
+.rept 1024\r
+.long 0\r
+.endr\r
+\r