You can run LM from WINE, which should run fine on a mac computer. So far I have not found any LM issues with WINE. Also if you have mono install you should be able to get the linux patched version of BTSD running on you mac. As for a .spc player you could use Audio overload, which has a mac version.
Links for the above mentioned programs:
http://www.mono-project.com/MonoSX
http://www.winehq.org/ (I recommend using wine 1.1.27 dev version and not stable, dev has many many many more bug fixes.)
http://www.bannister.org/software/ao.htm
You could always try virtualbox? That would allow you to run a copy of windows inside of your mac install.
I am running Fedora 11 and with WINE I managed to get LM working without any issues(Make sure to use the development version and not stable version). Try running LM from terminal and see if WINE shows and errors. Fixme notices can be ignored, so if you see those there generally should not be a problem.
If you get any errors post them back here and we can try to work something out.
Well, I just coded up my first block and when I try to add it using BTSD with linux patch(I run on fedora 11) it crashes the program. The output below is what I receive when it crashes from terminal:
Code
xdg-open: unexpected argument 'temp.asm'
Try 'xdg-open --help' for more information.
System.IO.FileNotFoundException: Could not find file "/mnt/store/download/SNES ROMS/smw stuff/btsd-linux/temp.bin".
File name: '/mnt/store/download/SNES ROMS/smw stuff/btsd-linux/temp.bin'
at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) [0x00000]
at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share) [0x00000]
at (wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)
at System.IO.File.Open (System.String path, FileMode mode, FileAccess access, FileShare share) [0x00000]
at System.IO.File.ReadAllBytes (System.String path) [0x00000]
at Blocktool_Super_Deluxe.xkasIO.Assemble (Int32 offset, Blocktool_Super_Deluxe.BlockInfo bi, Boolean issa1) [0x00000]
at Blocktool_Super_Deluxe.Hack.InsertBlockROM (Blocktool_Super_Deluxe.BlockInsertInfo bii, Blocktool_Super_Deluxe.BlockDB bdb, Blocktool_Super_Deluxe.ROM rom) [0x00000]
at Blocktool_Super_Deluxe.Main.MainMenu_Insert_Click (System.Object sender, System.EventArgs e) [0x00000]
at System.Windows.Forms.ToolStripItem.OnClick (System.EventArgs e) [0x00000]
at System.Windows.Forms.ToolStripMenuItem.OnClick (System.EventArgs e) [0x00000]
at System.Windows.Forms.ToolStripMenuItem.HandleClick (System.EventArgs e) [0x00000]
at System.Windows.Forms.ToolStripItem.FireEvent (System.EventArgs e, ToolStripItemEventType met) [0x00000]
at (wrapper remoting-invoke-with-check) System.Windows.Forms.ToolStripItem:FireEvent (System.EventArgs,System.Windows.Forms.ToolStripItemEventType)
at System.Windows.Forms.ToolStrip.OnMouseUp (System.Windows.Forms.MouseEventArgs mea) [0x00000]
at System.Windows.Forms.ToolStripDropDown.OnMouseUp (System.Windows.Forms.MouseEventArgs mea) [0x00000]
at System.Windows.Forms.Control.WmLButtonUp (System.Windows.Forms.Message& m) [0x00000]
at System.Windows.Forms.Control.WndProc (System.Windows.Forms.Message& m) [0x00000]
at System.Windows.Forms.ScrollableControl.WndProc (System.Windows.Forms.Message& m) [0x00000]
at System.Windows.Forms.ToolStrip.WndProc (System.Windows.Forms.Message& m) [0x00000]
at System.Windows.Forms.ToolStripDropDown.WndProc (System.Windows.Forms.Message& m) [0x00000]
at System.Windows.Forms.Control+ControlWindowTarget.OnMessage (System.Windows.Forms.Message& m) [0x00000]
at System.Windows.Forms.Control+ControlNativeWindow.WndProc (System.Windows.Forms.Message& m) [0x00000]
at System.Windows.Forms.NativeWindow.WndProc (IntPtr hWnd, Msg msg, IntPtr wParam, IntPtr lParam) [0x00000]
Just in case my block could be causing this here is my blocks source(This is my first block so it could be the problem).
Even if my code is right any pointers on how I could do this more efficiently would be nice.
Code
;Gives mario cape(default) if the on/off block is set to On or a flower(default) if
;The on/off switch is set to Off.
JMP Mario : JMP Mario : JMP Mario : JMP Return : JMP Return : JMP Return : JMP Return
;#$00 = Small, #$01 = Big, #$02 = Cape, #$03 = Fire
!on_powerup = #$02
!off_powerup = #$03
Mario:
PHA ;store A
LDA $14AF ;load on/off block
CMP #$00 ;Check if on
BNE Off ;if off branch to off
JMP On ;else jump to on
Off:
LDA !off_powerup ;load power up into A for off state
STA $19 ;store the power up
JMP Done ;jump to done
On:
LDA !on_powerup ;load power up into A for on state
STA $19 ;store the power up
JMP Done ;jump to done
Done:
PLA ;restore A
RTL ;return
Return:
RTL ;return
I'm fairly sure it's not your block that's doing it. There are two lines of the error that seem like the main problem.
Code
xdg-open: unexpected argument 'temp.asm'
It looks like a software issue with Xkas.
Code
System.IO.FileNotFoundException: Could not find file "/mnt/store/download/SNES ROMS/smw stuff/btsd-linux/temp.bin".
Again, looks like Xkas failed to initialize and create temp.bin, so BTSD crashed while trying to find it.
I tried creating the temp.bin file yesterday(I tried various permissions on the file as well), but it didn't help. I also tried running it with mono on wine, which would not even start the program. When I create a temp.bin file right when the program crashes the file would be deleted.
Also, if it helps Xkas crashes right as I go to insert a patch as well.
Also, as for the code, thanks a lot for showing me how I could optimized! Glad to see what I created was not that far off from being efficient.(Also glad that was not the problem with the crash )
EDIT:
Question, what is the difference between "BRA Done" and "JMP Done"? From what I found doing a quick search it is only 8bit vs 16bit, is that the only difference? Thanks in advance!
Hey, the following code works but I am just wondering if there is anything I can change to improve it a bit. I am still a bit new to ASM, so I just want to make sure I am doing things in a rather efficient way .
Code
;Block name:Cape destroyed block
;Block author: P4plus2
;Corrections from: N/A
;Date released: 08-22-2009
;Date updated: 08-22-2009
;Version: 1.0.0
;
;Description:
;A block Mario may only destroy with a cape.
;
;Acts like block: 130
;BTSD compatible: Yes
;BT compatible: No
JMP Return : JMP Return : JMP Return : JMP Return : JMP Return : JMP Destroy : JMP Return
;To configure, change the following variables to something else listed below
;#$00 = normal shatter, #$01 = colorful shatter
!shatter_type = #$00
Destroy:
PHA ;Save A
PHB ;Push current bank
LDA #$02 ;Set bank to change to
PHA ;Push A to stack
PLB ;Pull bank (now $02)
LDA !shatter_type ;Which shatter to use
JSL $028663 ;Run shatter block routine
PLB ;Restore original bank
LDA #$02 ;Set tile to 02
STA $9C ;Store tile to be generated
JSL $00BEB0 ;Generate tile routine
PLA ;Restore A
Return:
RTL ;Return
No particular reason to push and pull A at the start/end, but other than that I see no inefficiencies.
I thought I read somewhere you should store and then restore A to prevent A from being changed by your block. I may have misread something though. I'll remove it and see if everything still works correctly.
I have a quick question, how would I find out what item mario is carrying? In the RAM map I found $1470 stores the carrying flag, but I would like to figure out the exact item. Preferably I would like to check if a certain color baby yoshi is being held. If anybody know or can link me to the values that each item would be(or at least the yoshis).
In all.log the closest thing I found was:
Code
CODE_01AA58: A5 15 LDA RAM_ControllerA
CODE_01AA5A: 29 40 AND.B #$40
CODE_01AA5C: F0 16 BEQ CODE_01AA74
CODE_01AA5E: AD 70 14 LDA.W $1470 ; \ Branch if carrying an enemy...
CODE_01AA61: 0D 7A 18 ORA.W RAM_OnYoshi ; | ...or on Yoshi
CODE_01AA64: D0 0E BNE CODE_01AA74 ; /
CODE_01AA66: A9 0B LDA.B #$0B ; \ Sprite status = Being carried
CODE_01AA68: 9D C8 14 STA.W $14C8,X ; /
CODE_01AA6B: EE 70 14 INC.W $1470 ; Set carrying enemy flag
CODE_01AA6E: A9 08 LDA.B #$08
CODE_01AA70: 8D 98 14 STA.W RAM_PickUpImgTimer
Return01AA73: 60 RTS ; Return
CODE_01AA74: B5 9E LDA RAM_SpriteNum,X ; \ Branch if Key
CODE_01AA76: C9 80 CMP.B #$80 ; |
CODE_01AA78: F0 3D BEQ CODE_01AAB7 ; /
CODE_01AA7A: C9 3E CMP.B #$3E ; \ Branch if P Switch
CODE_01AA7C: F0 34 BEQ CODE_01AAB2 ; /
CODE_01AA7E: C9 0D CMP.B #$0D ; \ Branch if Bobomb
CODE_01AA80: F0 15 BEQ CODE_01AA97 ; /
CODE_01AA82: C9 2D CMP.B #$2D ; \ Branch if Baby Yoshi
CODE_01AA84: F0 11 BEQ CODE_01AA97 ; /
CODE_01AA86: C9 A2 CMP.B #$A2 ; \ Branch if MechaKoopa
CODE_01AA88: F0 0D BEQ CODE_01AA97 ; /
CODE_01AA8A: C9 0F CMP.B #$0F ; \ Branch if not Goomba
CODE_01AA8C: D0 06 BNE CODE_01AA94 ; /
ADDR_01AA8E: A9 F0 LDA.B #$F0
ADDR_01AA90: 95 AA STA RAM_SpriteSpeedY,X
ADDR_01AA92: 80 03 BRA CODE_01AA97
Mod edit: Those blank lines were an eyesore. This looks mubh better.
This probably won't work and if just stab in the dark but here it goes...
The best thing I could think(and it doesn't sound very efficient) would be at the hijack the fireball check and instead have that jump to a routine you wrote for two more fireballs then duplicate the ALL of the fire flowers code into the freespace you jump to changing ram address for each fireball accordingly. This may not work very well or at all, just my hypothesis. But providing it works it would be something like this:
JMP wherever
wherever:
LDX.B #$09 ; \ Find a free fireball slot (08-09)
LDA.W RAM_ExSpriteNum,X ; |
BEQ CODE_00FEB5 ; |
DEX ; |
CPX.B #$07 ; |
BNE CODE_00FEAA ; |
;your code to check for two more places here
;all the code for two fireballs goes here, but modified for two separate fireballs.
If this post is way to wrong, just say so and I'll edit it out.
If you could design one language, how would you design it? Would it be web based, desktop based, both perhaps? To keep this thread interesting try to give some examples of what you would have it look like. For example mine would go something like this(though I have many ideas for languages...)
Code
include:io
include:sys
`this is a comment
int main(string *argv)
{
int numb = array(123,321,321,123);
int 10*numb_two; `array with 10 elements
io.get(numb_two:0, "\n");
io.echo(numb_two:0);
if(count(argv) > 0)[
io.echo ("you have " + count(argv) + " arguments");
io.echo ("This message was sent at " + sys.time());
io.echo (argv:0);
return 0;
]else[
io.echo ("no arguments given");
io.echo ("This message was sent at " + sys.time());
return 0;
]
return ERROR_FATAL `this should never be reached
}
The idea behind this language is to organise code slightly better by using [] for conditional statements and {} for function type declarations. The language also makes arrays a bit shorter to make and access using only one character the * for assigning and : for access. The language is not perfect for example the comment ` is a bit awkward...
Correct me if I am wrong but this is how I believe it works:
Because red starts at hex 20 you add 20
Because green starts at hex 40 you add 40
Because blue starts at hex 80 you add 80
Starting from 20 a bit shift < is then 40 then another shift is 80.
This time the problem is rather odd, when sprites hit the right side of the block everything works fine, but if the sprite hits the left side of the block the code is triggered between 10+ times. Any ideas?
The code can be found at http://p4plus2.pastebin.com/m24f2069f
I am at a loss as to why if anybody could tell me I would appreciate it greatly!
Notes:
I am using Block Tool Super Deluxe 0.43
The ROM is clean other than saving it in lunar magic.
So I know there are like 4 different number symbol things in ASM I know three of them off hand but I have forgotten what that stand for.
The ones I know are:
$
#$
!
but could some one shed light on what these stand for. Also what is the forth one that stands for binary?
$ explained above...
#$ explained above...
! is like #DEFINE in C/C++
meaning
!FREESPACE = $123456
means !FREESPACE is defined as $123456 and can be used throughout your code so that if you need to change it, you only need to change the initial !FREESPACE = $123456.
Nope I have made sure not to have them open at the same time. I'll try starting on a new ROM maybe something got messed up at one point. (good thing I try things on test ROMs first )
EDIT: reworded to make it sound less odd.
EDIT2: No success. Sprites still pass through the block as if it is not there. Would the sprite I am using(bullet bill) make a difference?
Follow Us On