Omnimaga
Calculator Community => TI Calculators => ASM => Topic started by: Jerros on June 29, 2010, 10:39:40 am
-
I've recently converted my programm into an APP, and everything works fine, exept Sprites and Text.
For the text I've used numerious routines, but none seem to work, they all display random junk.
This is what I've tried so far:
LD HL, $1C04 ; Location of where to display Text
LD (CurRow), HL
LD HL, SomeText
LD DE, OP1
LD BC, 5 ; Lengt + the "0" in the end
LDIR
LD HL, OP1
b_call _PutS
SomeText:
.DB "Text", 0
;The above didn't work.
;Neither does this:
LD HL, $1C04 ; Location again.
LD (PenCol), HL
LD HL, SomeText
b_call _VPutS
SomeText:
.DB "Text", 0
Both won't work in an App, when I just compile it with TASM, the secont script does work normally, and shows small text at the desired location.
I have a similar problem with showing sprites.
When compiling normally, there's nothing wrong, and everything shows as it's supposed to.
But as soon as it's an APP, the spriter appear in the upper left corner, and somewhat scrambled.
My sprite script:
LD A, 38 ; X position to display
LD (xpos), A
LD A, 54 ; Y position do display
LD (ypos), A
LD B, 10 ; Length of sprite (in Y direction)
LD DE, (ypos)
LD IX, Sprite ; The sprite
CALL ClipSprXOR
ClipSprXOR: ; The actual spriting (from the asm-in-28-days, workt perfectly, but not in APPs appearantly)
LD A, %11111111
LD (clip_mask), A
LD A, E
OR A
JP M, ClipTop
SUB 64
RET NC
NEG
CP B
JR NC, VertClipDone
LD B, A
JR VertClipDone
ClipTop:
LD A, B
NEG
SUB E
RET NC
PUSH AF
ADD A, B
LD E, 0
LD B, E
LD C, A
ADD IX, BC
POP AF
NEG
LD B, A
VertClipDone:
LD C, 0
LD A, D
CP -7
JR NC, ClipLeft
CP 96
RET NC
CP 89
JR C, HorizClipDone
ClipRight:
AND 7
LD C, A
LD A, %11111111
FindRightMask:
ADD A, A
DEC C
JR NZ, FindRightMask
LD (clip_mask), A
LD A, D
JR HorizClipDone
ClipLeft:
AND 7
LD C, A
LD A, %11111111
FindLeftMask:
ADD A, A
DEC C
JR NZ, FindLeftMask
CPL
LD (clip_mask), A
LD A, D
ADD A, 96
LD C, 12
HorizClipDone:
LD H, 0
LD D, H
LD L, E
ADD HL, HL
ADD HL, DE
ADD HL, HL
ADD HL, HL
LD E, A
SRL E
SRL E
SRL E
ADD HL, DE
LD DE, PlotSScreen
ADD HL, DE
LD D, 0
LD E, C
SBC HL, DE
AND 7
JR Z, _Aligned
LD C, A
LD DE, 11
_RowLoop:
PUSH BC
LD B, C
LD A, (clip_mask)
AND (IX)
LD C, 0
_ShiftLoop:
SRL A
RR C
DJNZ _ShiftLoop
XOR (HL)
LD (HL), A
INC HL
LD A, C
XOR (HL)
LD (HL), A
ADD HL, DE
INC IX
POP BC
DJNZ _RowLoop
RET
_Aligned:
LD DE, 12
_PutLoop:
LD A, (IX)
XOR (HL)
LD (HL), A
INC IX
ADD HL, DE
DJNZ _PutLoop
RET
Sprite: ; Some random Sprite
.DB %11111111
.DB %00011000
.DB %00001100
.DB %11111111
.DB %00010000
.DB %00010000
.DB %11110000
.DB %00111100
.DB %00001110
.DB %00000011
Nothing is working, which is frustrating because it did all work before it was turned into an APP, and the programm is nearly completed >.<
Thanks in advance for any help!
-
The sprite routine does not seem to use self modifying code that is not possible in APPS.
But have you equated xpos, ypos and clip_mask to a location on safe ram?
In the first text routine:
LD HL, $1C04 ; Location of where to display Text
LD (CurRow), HL
$IC04 seems out of the screen and may overflow somewhere.
In the second you need to relocate the string in ram or code a app safe replacement for _VPutS
If you want to ease some coding it is easier to use:
appsafePutS:
ld a,(hl)
inc hl
or a
ret z
b_call _PutC
jr appPutS
ld hl,string
call appsafePutS
than relocating the string to ram every time.
-
Thanks for your reply!
But have you equated xpos, ypos and clip_mask to a location on safe ram?
Probably not...
How do I do this?
I'm actually quite a newby with ASM, so don't be afraid to explain "too much".
If you want to ease some coding it is easier to use:
appsafePutS:
ld a,(hl)
inc hl
or a
ret z
b_call _PutC
jr appPutS
ld hl,string
call appsafePutS
than relocating the string to ram every time.
Uhm...
Can you use this in an easy example for me please?
Like, lets say I want the "Hello World!" message displayed at a specific location.
How would I do that youre way?
Thanks for the help!
It's REALLY appreciated.
-
You can't use bcalls for text/sprites in an app. You have to write your own routines, or store all text in RAM.
This is because, if you call cross-page, the pointer is messed up: it points to the same address, but on a different page. So basically, you can't access data in your app during a bcall. (or an external page call, in general)
EDIT: if you want all the technical details about why this is, you can read up on wikiti.brandonw.net (http://wikiti.brandonw.net)
-
You can't use bcalls for text/sprites in an app. You have to write your own routines, or store all text in RAM.
Ok... How?
Got an example for text or sprites?
Isn't there a piece of script someone has made before to easely display messages/sprites in APPs?
I'm not really experienced enough yet to fully know how to, so any help woult be apreciated.
If anyone has a helpfull pece of script, I don't per-se need to know HOW and WHY it works, as long as it works. ;P
Anyway, thanks.
I'll look into some documentation about how to show text/sprites in APPs.
-
Actually, if you want to take the lazy way out which may or may not be easier in this case, just copy your data to ram first and then you can use your handy dandy bcalls with the ram location. If you have enough room, you can just copy all that data there at the beginning and then you're all set. If not, then you can dynamically copy the text/sprites to the ram only when you need them.
-
Actually, if you want to take the lazy way out which may or may not be easier in this case, just copy your data to ram first and then you can use your handy dandy bcalls with the ram location. If you have enough room, you can just copy all that data there at the beginning and then you're all set. If not, then you can dynamically copy the text/sprites to the ram only when you need them.
Smart :O
But I think copying the whole deal at the start would'nt work, since I turned it into an APP because of the 8kB limit, and the programm might get much larger even.
I guess the 8kB limit is still an issue when you just copy the lot at the start, so you're second solution sounds nice to me.
This might be asking for a bit too much, but can you provide me with an example scrip that, lets say, displays the "Hello World!" message in small font on a specific location?
That way things will get more concrete to me, or maybe you can tell me how to "dynamically copy the text/sprites to the ram only when you need them". (with a small script please!)
I'm sorry if I'm being very demanding here, after all I'm pretty much asking fr33 st00f here on a forum...
Thanks alot!
-
The best idea is to write your own routines, definitely. (or copy them from the internet, UTI has threads full of them and nobody will mind if you credit the right people)
As long as you keep those pieces of code on the same page as the data, no issues will arise.
-
Thanks, I'll look into that site.
The problem with writing my own would be my total lack of knowledge, I don't know WHY 90% of my script works, I just know what variables to change do what I want . : )
-
That's the beginning. Tinkering with programs is always good.