Timed Automatic Item Usage [Seeky]
#1
Timed Automatic Item Usage [Seeky]

This code will automatically press the item button at a set interval. NNNN is the number of frames to wait between presses (ex. 0x012C, which is 5 seconds) and PPPP is the exception vector area offset from 0x80000000 that the timer is stored at (ex. 0x0C98) - this has no impact on the function of the code but may need to be changed for compatibility with other codes using the exception vector area. 

NTSC-U
C0000000 00000004
3D608000 818BPPPP
398C0001 2C0CNNNN
40A10008 39800000
918BPPPP 4E800020
C251CE8C 00000005
3D608000 818BPPPP
2C0CNNNN 4182000C
540007B8 48000008
60000004 B01E002C
60000000 00000000


PAL
C0000000 00000004
3D608000 818BPPPP
398C0001 2C0CNNNN
40A10008 39800000
918BPPPP 4E800020
C2521300 00000005
3D608000 818BPPPP
2C0CNNNN 4182000C
540007B8 48000008
60000004 B01E002C
60000000 00000000

NTSC-J
C0000000 00000004
3D608000 818BPPPP
398C0001 2C0CNNNN
40A10008 39800000
918BPPPP 4E800020
C2520C80 00000005
3D608000 818BPPPP
2C0CNNNN 4182000C
540007B8 48000008
60000004 B01E002C
60000000 00000000

NTSC-K
C0000000 00000004
3D608000 818BPPPP
398C0001 2C0CNNNN
40A10008 39800000
918BPPPP 4E800020
C250F324 00000005
3D608000 818BPPPP
2C0CNNNN 4182000C
540007B8 48000008
60000004 B01E002C
60000000 00000000

Source ASM:
.set INTERVAL, 300 # Delay in frames between item uses (NNNN)
.set EVAADDRESS, 0x0C98 # Set to any free exception vector area address offset (PPPP)

C2 write (Controls the item button input)
0x80521300 PAL
0x8051CE8C NTSC-U
0x8050F324 NTSC-K
0x80520C80 NTSC-J
======================================================
lis r11, 0x8000
lwz r12, EVAADDRESS (r11) # Loads timer from memory
cmpwi r12, INTERVAL #Checks if it's time
beq- on
off:
rlwinm r0, r0, 0, 30, 28 # Clears the bit for the item input
b end
on:
ori r0, r0, 0x4 # Turns on the bit for the item input
end:
sth r0, 0x002C (r30) # Default instruction (stores the input to memory)

C0 timer (Region free)
=======================================================
lis r11, 0x8000
lwz r12, EVAADDRESS (r11) # Gets current timer value
addi r12, r12, 1 # Increments by 1
cmpwi r12, INTERVAL # If the timer has reached the value where items were pressed, restarts it
ble+ end
li r12, 0
end:
stw r12, EVAADDRESS (r11)
blr

Code created by: Seeky
Reply
#2
Nice code!
Reply
#3
lis r11, 0x8000
lwz r12, EVAADDRESS (r11) # Loads timer from memory
cmpwi r12, INTERVAL #Checks if it's time
beq- on
off:
rlwinm r0, r0, 0, 30, 28 # Clears the bit for the item input
b end
on:
ori r0, r0, 0x4 # Turns on the bit for the item input
end:
sth r0, 0x002C (r30) # Default instruction (stores the input to memory)




Since this is the default state for off, you should be able to put the bit clear instruction at the top and the code will still work. Like this:

rlwinm r0, r0, 0, 30, 28
lis r11, 0x8000
lwz r12, 0xEVAADDRESS (r11)
cmpwi r12, INTERVAL
bne+ end

ori r0, r0, 0x0004

end:
Reply
#4
Good point, another thing I've realised since is that it might not be worth clearing that bit anyway, since not clearing it would allow player inputs to still work in addition to the automatic press.
Reply
#5
Might as well design the code to allow the user to choose if they want that or not.
Reply
#6
I've fixed a pretty major mistake in the code where 1 of the values that should be PPPP was already set to 0x0C98, meaning the code broke for all other addresses
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)