Jasmin/Example
< Jasmin
Jump to navigation
Jump to search
Example of a simple robot written in Jasmin Assembly code.
; --- Copyright Robert Maupin 2012. All rights reserved. -----------------
; File: cs/Nano.j
; Author: Robert Maupin, 3 December 2012
; -------------------------------------------------------------------------
; WARNING: you will never ever be able to decompile this class
.class public cs/Nano
.super robocode/AdvancedRobot
;specify a field
.field private direction D
; initializer
.method public <init>()V
.limit stack 4
aload_0
invokenonvirtual robocode/AdvancedRobot/<init>()V
aload_0
dconst_1
putfield cs/Nano/direction D
return
.end method
;run method
.method public run()V
;these don't have to be precise, just big enough to hold everything :)
.limit stack 8
.limit locals 4
aload_0 ; the 'this' statement...
;setAdjustGunForRobotTurn(true);
iconst_1
invokevirtual robocode/AdvancedRobot/setAdjustGunForRobotTurn(Z)V
aload_0
;turnRadarRightRadians(1.0/0.0);
dconst_1
dconst_0
ddiv
invokevirtual robocode/AdvancedRobot/turnRadarRightRadians(D)V
return
.end method
;turn onScannedRobot...
.method public onScannedRobot(Lrobocode.ScannedRobotEvent;)V
;these don't have to be precise, just big enough to hold everything :)
.limit stack 8
.limit locals 4
;if (1 < getOthers())
aload_0
invokevirtual robocode/AdvancedRobot/getOthers()I
iconst_1
;this is 3 bytes.... all jumps are (cept jsr_w, which is 5)
if_icmplt skipInfinityLock
;Infinity Lock Radar
;setTurnRadarLeftRadians(getRadarTurnRemainingRadians());
aload_0
dup
invokevirtual robocode/AdvancedRobot/getRadarTurnRemainingRadians()D
invokevirtual robocode/AdvancedRobot/setTurnRadarLeftRadians(D)V
skipInfinityLock:
;setTurnGunRightRadians(Utils.normalRelativeAngle(getHeadingRadians() +
; e.getBearingRadians() - getGunHeadingRadians()))
;load this early for setTurnGunRightRadians
;so we don't have to do stack manipulation later
aload_0
;;;get the angle to the enemy
;getHeadingRadians()
aload_0
invokevirtual robocode/AdvancedRobot/getHeadingRadians()D
;e.getBearingRadians()
aload_1
invokevirtual robocode/ScannedRobotEvent/getBearingRadians()D
dadd ;add the two values
;getGunHeadingRadians()
aload_0
invokevirtual robocode/AdvancedRobot/getGunHeadingRadians()D
dsub
;normalRelativeAngle(value)
invokestatic robocode/util/Utils/normalRelativeAngle(D)D
;setTurnGunRightRadians(value)
invokevirtual robocode/AdvancedRobot/setTurnGunRightRadians(D)V
;setTurnRightRadians(Math.cos(e.getBearingRadians()));
aload_0
aload_1
invokevirtual robocode/ScannedRobotEvent/getBearingRadians()D
invokestatic java/lang/Math/cos(D)D
invokevirtual robocode/AdvancedRobot/setTurnRightRadians(D)V
;setAhead(5*direction)
aload_0
iconst_5
i2d
aload_0
getfield cs/Nano/direction D
dmul
invokevirtual robocode/AdvancedRobot/setAhead(D)V
;setFire(3)
aload_0
iconst_3
i2d
invokevirtual robocode/AdvancedRobot/setFire(D)V
return
.end method
;turn onHitWall...
.method public onHitWall(Lrobocode.HitWallEvent;)V
;these don't have to be precise, just big enough to hold everything :)
.limit stack 4
.limit locals 4
;direction = -direction;
aload 0
dup
getfield cs/Nano/direction D
dneg
putfield cs/Nano/direction D
return
.end method