Advertisement
Guest User

ForEachUnitInRange

a guest
May 4th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 2.10 KB | None | 0 0
  1. .thumb
  2.  
  3. .macro blh to, reg=r3
  4.     ldr \reg, =\to
  5.     mov lr, \reg
  6.     .short 0xF800
  7. .endm
  8.  
  9. .equ RoutineToCall, EALiterals+0x00
  10.  
  11. ForEachUnitInRange:
  12.     push {r4-r7, lr}
  13.    
  14.     mov r6, r0 @ r6 is current stat
  15.     mov r7, r1 @ r7 is unit ptr
  16.    
  17.     bl ClearRangeMap
  18.    
  19.     @ r0 = unit x
  20.     mov r0, #0x10
  21.     ldsb r0, [r7, r0]
  22.    
  23.     @ r1 = unit y
  24.     mov r1, #0x11
  25.     ldsb r1, [r7, r1]
  26.    
  27.     mov r2, #0 @ To fill with EA
  28.     mov r3, #1 @ To fill with EA
  29.    
  30.     bl FillRangeMap
  31.    
  32.     ldr r0, =0x0202E4D4
  33.    
  34.     @ r5 = yIt
  35.     mov r5, #2
  36.     ldsh r5, [r0, r5]
  37.    
  38. StartYLoop:
  39.     sub r5, #1
  40.    
  41.     cmp r5, #0
  42.     blt End @ end y loop
  43.    
  44.     ldr r0, =0x0202E4D4
  45.    
  46.     @ r4 = xIt
  47.     mov r4, #0
  48.     ldsh r4, [r0, r4]
  49.    
  50. StartXLoop:
  51.     sub r4, #1
  52.    
  53.     cmp r4, #0
  54.     blt StartYLoop @ end x loop
  55.    
  56.     lsl r1, r5, #2 @ r1 = r5*sizeof(ptr)
  57.    
  58.     ldr r0, =0x0202E4E4
  59.     ldr r0, [r0] @ pointer to range map rows
  60.    
  61.     add r0, r1
  62.     ldr r0, [r0] @ pointer to current range row
  63.    
  64.     add r0, r4
  65.     ldrb r0, [r0] @ current range byte (0 or 1)
  66.    
  67.     cmp r0, #0
  68.     beq StartXLoop @ not in range
  69.    
  70.     ldr r0, =0x0202E4D8
  71.     ldr r0, [r0] @ pointer to unit map rows
  72.    
  73.     add r0, r1
  74.     ldr r0, [r0] @ pointer to current unit row
  75.    
  76.     add r0, r4
  77.     ldrb r0, [r0] @ current unit byte (Allegience | unitIndex)
  78.    
  79.     cmp r0, #0
  80.     beq StartXLoop
  81.    
  82.     blh 0x08019430 @ get unit struct ptr
  83.    
  84.     mov r2, r0 @ r2 = second  unit
  85.     mov r1, r7 @ r1 = current unit
  86.     mov r0, r6 @ r0 = current stat
  87.    
  88.     bl RoutineToCall
  89.    
  90.     mov r6, r0 @ store modified stat
  91.    
  92.     beq StartXLoop
  93.    
  94. .ltorg
  95.  
  96. End:
  97.     mov r0, r6
  98.     pop {r4-r7, pc}
  99.  
  100. .ltorg
  101.  
  102. ClearRangeMap:
  103.     push {lr}
  104.    
  105.     ldr r0, =0x0202E4E4 @ pointer to range map rows
  106.     ldr r0, [r0]
  107.    
  108.     mov r1, #0
  109.    
  110.     blh 0x080197E4
  111.    
  112.     pop {pc}
  113.  
  114. .ltorg
  115.  
  116. FillRangeMap: @ r0 = x, r1 = y, r2 = min, r3 = max
  117.     push {r4-r7, lr}
  118.    
  119.     mov r4, r2 @ r4 = min, use for later
  120.    
  121.     @ [r5, r6] = [x, y]
  122.     mov r5, r0
  123.     mov r6, r1
  124.    
  125.     mov r2, r3 @ range = max
  126.     mov r3, #1 @ fill = 1
  127.    
  128.     blh 0x0801AABC, r7
  129.    
  130.     @ [r0, r1] = [x, y]
  131.     mov r0, r5
  132.     mov r1, r6
  133.    
  134.     mov r2, r4 @ range = min
  135.    
  136.     mov r3, #1
  137.     neg r3, r3 @ fill = -1
  138.    
  139.     blh 0x0801AABC, r7
  140.    
  141.     pop {r4-r7, pc}
  142.  
  143. .ltorg
  144. .align
  145.  
  146. EALiterals:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement