drc: support ms ABI
[picodrive.git] / pico / draw2_arm.S
index c37d059..6b110b3 100644 (file)
@@ -8,8 +8,7 @@
  * this is highly specialized, be careful if changing related C code!\r
  */\r
 \r
-.extern Pico\r
-.extern PicoDraw2FB\r
+#include "pico_int_o32.h"\r
 \r
 @ define these constants in your include file:\r
 @ .equiv START_ROW,            1\r
 .text\r
 .align 2\r
 \r
-.global BackFillFull @ int reg7\r
+@ void BackFillFull(void *dst, int reg7)\r
+\r
+.global BackFillFull\r
 \r
 BackFillFull:\r
     stmfd   sp!, {r4-r9,lr}\r
 \r
-    ldr     lr, =PicoDraw2FB      @ lr=PicoDraw2FB\r
-    mov     r0, r0, lsl #26\r
-    ldr     lr, [lr]\r
+    add     lr, r0, #328*8\r
+    mov     r0, r1, lsl #26\r
     mov     r0, r0, lsr #26\r
-    add     lr, lr, #328*8\r
 \r
     orr     r0, r0, r0, lsl #8\r
     orr     r0, r0, r0, lsl #16\r
@@ -67,15 +66,24 @@ BackFillFull:
 \r
     bne     .bff_loop\r
 \r
-    ldmfd   sp!, {r4-r9,r12}\r
-    bx      r12\r
+    ldmfd   sp!, {r4-r9,lr}\r
+    bx      lr\r
 \r
 .pool\r
 \r
 @ -------- some macros --------\r
 \r
+@ helpers\r
+.macro add_c24 d s c\r
+    add     \d, \s, #(\c & 0x00ff00)\r
+.if \c & 0x0000ff\r
+    add     \d, \d, #(\c & 0x0000ff)\r
+.endif\r
+.if \c & 0xff0000\r
+    add     \d, \d, #(\c & 0xff0000)\r
+.endif\r
+.endm\r
 \r
-@ helper\r
 @ TileLineSinglecol (r1=pdest, r2=pixels8, r3=pal) r4: scratch, r0: pixels8_old\r
 .macro TileLineSinglecol notsinglecol=0\r
     and     r2, r2, #0xf        @ #0x0000000f\r
@@ -343,19 +351,21 @@ BackFillFull:
 \r
 @ DrawLayerTiles(*hcache, *scrpos, (cells<<24)|(nametab<<9)|(vscroll&0x3ff)<<11|(shift[width]<<8)|planeend, (ymask<<24)|(planestart<<16)|[htab||hscroll]\r
 \r
-@static void DrawLayerFull(int plane, int *hcache, int planestart, int planeend)\r
+@ void DrawLayerFull(int plane, int *hcache, int planestart, int planeend,\r
+@                    struct PicoEState *est)\r
 \r
 .global DrawLayerFull\r
 \r
 DrawLayerFull:\r
+    ldr     r12,[sp]              @ est\r
     stmfd   sp!, {r4-r11,lr}\r
 \r
     mov     r6, r1        @ hcache\r
 \r
-    ldr     r11, =(Pico+0x22228)  @ Pico.video\r
-    ldr     r10, =(Pico+0x10000)  @ r10=Pico.vram\r
-    ldrb    r5, [r11, #13]        @ pvid->reg[13]\r
-    ldrb    r7, [r11, #11]\r
+    ldr     r11, [r12, #OFS_EST_Pico]\r
+    ldr     r10, [r12, #OFS_EST_PicoMem_vram]\r
+    ldrb    r5, [r11, #OFS_Pico_video_reg+13] @ pvid->reg[13]\r
+    ldrb    r7, [r11, #OFS_Pico_video_reg+11]\r
 \r
     sub     lr, r3, r2\r
     and     lr, lr, #0x00ff0000   @ lr=cells\r
@@ -365,7 +375,7 @@ DrawLayerFull:
     bic     r5, r5, #0x00ff0000   @ just in case\r
 \r
     tst     r7, #3                @ full screen scroll? (if ==0)\r
-    ldrb    r7, [r11, #16]        @ ??hh??ww\r
+    ldrb    r7, [r11, #OFS_Pico_video_reg+16] @ ??hh??ww\r
     ldreqh  r5, [r10, r5]\r
     biceq   r5, r5, #0x0000fc00   @ r5=hscroll (0-0x3ff)\r
     movne   r5, r5, lsr #1\r
@@ -396,22 +406,21 @@ DrawLayerFull:
 \r
     @ Find name table:\r
     tst     r0, r0\r
-    ldreqb  r4, [r11, #2]\r
+    ldreqb  r4, [r11, #OFS_Pico_video_reg+2]\r
     moveq   r4, r4, lsr #3\r
-    ldrneb  r4, [r11, #4]\r
+    ldrneb  r4, [r11, #OFS_Pico_video_reg+4]\r
     and     r4, r4, #7\r
     orr     lr, lr, r4, lsl #13   @ lr|=nametab_bits{3}<<13\r
 \r
-    ldr     r11, =PicoDraw2FB     @ r11=PicoDraw2FB\r
+    ldr     r11,[sp, #9*4]        @ est\r
     sub     r4, r9, #(START_ROW<<24)\r
-    ldr     r11, [r11]\r
+    ldr     r11, [r11, #OFS_EST_Draw2FB]\r
     mov     r4, r4, asr #24\r
     mov     r7, #328*8\r
     mla     r11, r4, r7, r11      @ scrpos+=8*328*(planestart-START_ROW);\r
 \r
     @ Get vertical scroll value:\r
-    add     r7, r10, #0x012000\r
-    add     r7, r7,  #0x000180    @ r7=Pico.vsram (Pico+0x22180)\r
+    add_c24 r7, r10, (OFS_PMEM_vsram-OFS_PMEM_vram)\r
     ldr     r7, [r7]\r
     tst     r0, r0\r
     moveq   r7, r7, lsl #22\r
@@ -571,8 +580,9 @@ DrawLayerFull:
 .pool\r
 \r
 \r
+@ void DrawTilesFromCacheF(int *hc, struct PicoEState *est)\r
 \r
-.global DrawTilesFromCacheF @ int *hc\r
+.global DrawTilesFromCacheF\r
 \r
 DrawTilesFromCacheF:\r
     stmfd   sp!, {r4-r10,lr}\r
@@ -580,14 +590,13 @@ DrawTilesFromCacheF:
     mov     r9, #0xff000000 @ r9=prevcode=-1\r
     mvn     r6, #0          @ r6=prevy=-1\r
 \r
-    ldr     r4, =PicoDraw2FB  @ r4=PicoDraw2FB\r
-    ldr     r1, [r0], #4    @ read y offset\r
-    ldr     r4, [r4]\r
+    ldr     r4, [r1, #OFS_EST_Draw2FB]\r
+    ldr     r2, [r0], #4    @ read y offset\r
     mov     r7, #328\r
-    mla     r1, r7, r1, r4\r
-    sub     r12, r1, #(328*8*START_ROW) @ r12=scrpos\r
+    mla     r2, r7, r2, r4\r
+    sub     r12, r2, #(328*8*START_ROW) @ r12=scrpos\r
 \r
-    ldr     r10, =(Pico+0x10000) @ r10=Pico.vram\r
+    ldr     r10, [r1, #OFS_EST_PicoMem_vram]\r
     mov     r8, r0               @ hc\r
     mov     r0, #0xf\r
 \r
@@ -666,16 +675,18 @@ DrawTilesFromCacheF:
 @ @@@@@@@@@@@@@@@\r
 \r
 @ (tile_start<<16)|row_start\r
-.global DrawWindowFull @ int tstart, int tend, int prio\r
+@ void DrawWindowFull(int start, int end, int prio, struct PicoEState *est)\r
+\r
+.global DrawWindowFull\r
 \r
 DrawWindowFull:\r
     stmfd   sp!, {r4-r11,lr}\r
 \r
-    ldr     r11, =(Pico+0x22228)  @ Pico.video\r
-    ldrb    r12, [r11, #3]        @ pvid->reg[3]\r
+    ldr     r11, [r3, #OFS_EST_Pico]\r
+    ldrb    r12, [r11, #OFS_Pico_video_reg+3] @ pvid->reg[3]\r
     mov     r12, r12, lsl #10\r
 \r
-    ldr     r4, [r11, #12]\r
+    ldr     r4, [r11, #OFS_Pico_video_reg+12]\r
     mov     r5, #1                @ nametab_step\r
     tst     r4, #1                @ 40 cell mode?\r
     andne   r12, r12, #0xf000     @ 0x3c<<10\r
@@ -686,11 +697,11 @@ DrawWindowFull:
     and     r4, r0, #0xff\r
     mla     r12, r5, r4, r12      @ nametab += nametab_step*start;\r
 \r
+    ldr     r10, [r3, #OFS_EST_PicoMem_vram]\r
     mov     r4, r0, lsr #16       @ r4=start_cell_h\r
     add     r7, r12, r4, lsl #1\r
 \r
     @ fetch the first code now\r
-    ldr     r10, =(Pico+0x10000)  @ lr=Pico.vram\r
     ldrh    r7, [r10, r7]\r
     cmp     r2, r7, lsr #15\r
     ldmnefd sp!, {r4-r11,pc}      @ hack: simply assume that whole window uses same priority\r
@@ -704,11 +715,10 @@ DrawWindowFull:
 \r
     mov     r9, #0xff000000       @ r9=prevcode=-1\r
 \r
-    ldr     r11, =PicoDraw2FB     @ r11=scrpos\r
+    ldr     r11, [r3, #OFS_EST_Draw2FB]\r
     and     r4, r0, #0xff\r
-    ldr     r11, [r11]\r
-    sub     r4, r4, #START_ROW\r
     add     r11, r11, #328*8\r
+    sub     r4, r4, #START_ROW\r
     add     r11, r11, #8\r
 \r
     mov     r7, #328*8\r
@@ -758,7 +768,8 @@ DrawWindowFull:
     tst     r9, #0x080000       @ hflip?\r
     bne     .dwf_hflip\r
 \r
-    @ Tile (r1=pdest, r3=pal, r9=prevcode, r10=Pico.vram) r2,r4,r7: scratch, r0=0xf\r
+    @ Tile (r1=pdest, r3=pal, r9=prevcode, r10=PicoMem.vram)\r
+    @ r2,r4,r7: scratch, r0=0xf\r
     Tile 0, 0\r
     b       .dwfloop\r
 \r
@@ -868,13 +879,15 @@ DrawWindowFull:
     cmp     r6, #(END_ROW*8+8)\r
     bge     52b\r
 \r
-    @ Tile (r1=pdest, r3=pal, r9=prevcode, r10=Pico.vram) r2,r4,r7: scratch, r0=0xf\r
+    @ Tile (r1=pdest, r3=pal, r9=prevcode, r10=PicoMem.vram)\r
+    @ r2,r4,r7: scratch, r0=0xf\r
     Tile \hflip, \vflip\r
     b       52b\r
 .endm\r
 \r
+@ void DrawSpriteFull(unsigned int *sprite, struct PicoEState *est)\r
 \r
-.global DrawSpriteFull @ unsigned int *sprite\r
+.global DrawSpriteFull\r
 \r
 DrawSpriteFull:\r
     stmfd   sp!, {r4-r11,lr}\r
@@ -902,9 +915,8 @@ DrawSpriteFull:
     and     r3, lr, #0x6000\r
     mov     r3, r3, lsr #9  @ r3=pal=((code>>9)&0x30);\r
 \r
-    ldr     r11, =PicoDraw2FB     @ r11=scrpos\r
-    ldr     r10, =(Pico+0x10000)  @ r10=Pico.vram\r
-    ldr     r11, [r11]\r
+    ldr     r11, [r1, #OFS_EST_Draw2FB]\r
+    ldr     r10, [r1, #OFS_EST_PicoMem_vram]\r
     sub     r1, r12, #(START_ROW*8)\r
     mov     r0, #328\r
     mla     r11, r1, r0, r11      @ scrpos+=(sy-START_ROW*8)*328;\r