Author |
Message |
|
Adm.Wiggin aka Tianon
Know-It-All
Joined: 02 Jun 2003 Posts: 1874
|
Posted: 14 Feb 2004 07:28:27 pm Post subject: |
|
|
ok, Detached Solutions has a topic like this (here: DS's topic )
Dan Englender wrote: There are tons of useful routines that seem to float around the message boards but we don't have a central repository for them, so I thought I'd create a thread for that purpose. I'll start with a few very simple routines, but anyone who has any routines that could be of general use should feel free to contribute. A few guidelines though, to keep everything civilized:
1) Routines should be self contained and not program specific. What I mean is, someone should be able to copy/paste the routine into their own program, and not have to deal with dependencies on things in the originating program.
2) Not too long. Please no 1000 line routines.
2.5) Please submit only routines that have been sufficiently tested.
3) By posting a routine you're granting everyone the right to use it freely.
4) Post only routines you've written or have permission from the author to post.
5) Please keep follow-up commentary on the routines in different threads. I will be heavily moderating this thread, as I'd like it to be for the actual routines only (for ease of browsing at later dates). these are their rules, and they apply here as well.
I would like to add 1 or 2 more to that :
6. Please don't post a routine already posted on DS (unless it is optomized for speed or size)
7. Don't expect any credit for the routine (#3 actually says this, but in a cryptic form )
8. Please use the same format they did for displaying exe:
ClrScr
Code: Your routine goes here
Thanks and Have Fun!
Last edited by Guest on 14 Feb 2004 07:41:48 pm; edited 1 time in total |
|
Back to top |
|
|
MaxVT103
Member
Joined: 24 Aug 2003 Posts: 109
|
Posted: 15 Feb 2004 05:23:18 pm Post subject: |
|
|
This ones one I wrote a while back but it pretty much detects if you have a coordinate within a box. I used it so that you couldn't go into the goals in the game I'm working on. But here it is.
Hotspot
Code: ;----------Hot spot detection-----------
;-----------By Donald Ritter------------
;inputs b,c (first x and y cor)
;inputs d,e(Width of box "d";Height of box "e")
;inputs h,l("h" x cor to check, "l" y cor to check
;output "a"(either true(1) or false(0) )
hdetect:
ld a,b
add a,d
ld d,a
ld a,c
add a,e
ld e,a
hdetect_x1:
ld a,b
cp h
jp z,hdetect_x2
cp h
jp m,hdetect_x2
jp hno_detect
hdetect_x2:
ld a,d
cp h
jp z,hdetect_y1
cp h
jp p,hdetect_y1
jp hno_detect
hdetect_y1:
ld a,c
cp l
jp z,hdetect_y2
cp l
jp m,hdetect_y2
jp hno_detect
hdetect_y2:
ld a,e
cp l
jp z,hdetected
cp l
jp p,hdetected
jp hno_detect
hdetected:
ld a,1
ret
hno_detect:
ld a,0
ret
Last edited by Guest on 15 Feb 2004 05:24:01 pm; edited 1 time in total |
|
Back to top |
|
|
anduril66 Anduril is the Flame of the West!
Member
Joined: 25 May 2003 Posts: 129
|
Posted: 04 Mar 2004 04:08:02 pm Post subject: |
|
|
This is a very simple program that I wrote. It searches for a byte you specify starting at a given address.
Search For Byte
Code: 3E66 ld a, C9 (the value in A is the byte you're searching for)
01FFFF ld bc,FFFF (maximum number of bytes you look in,FFFF=65535 bytes)
210080 ld hl,8000 (the address you start looking in)
EDB1 cpir (used Cobb's tutorial to figure out what cpir does)
EF0745 bcall(_disphl) (warning-destroys contents of HL)
C9 ret
The value outputted is one greater than the address of the byte because cpir incs hl after cp (hl). Subtract 1, and you have the
address in decimal. You can convert it to hex and uses CalcSys to confirm. If you search past FFFF, for reasons unknown to me,
it seems to go back to 0000.
EDIT BY ADM.WIGGIN:
Please follow the rules and use the correct syntax (for ease of reading later) Thank You!
(I fixed it this time, but please remember next time! )
Last edited by Guest on 04 Mar 2004 09:03:15 pm; edited 1 time in total |
|
Back to top |
|
|
tardmrr
Newbie
Joined: 13 Apr 2004 Posts: 18
|
Posted: 29 Apr 2004 08:06:54 pm Post subject: |
|
|
This is a fast pixel plotter by Olle Hedman.
Pix
Code: ;+-----+----------------------------------------------------+
;| ALH | > PIX < Put a pixel in Graph Backup ¦ a=x e=y |
;+-----+----------------------------------------------------+
;/-----| PIX |----------------------------------------------\
PIX:
; push af ; Uncomment these to save regs..
; push de
ld d,0 ; Do y*12
sla e
sla e
ld hl,0
add hl,de
add hl,de
add hl,de
ld d,0 ; Do x/8
ld e,a
srl e
srl e
srl e
add hl,de
ld de,gbuf
add hl,de ; Add address to graphbuf
ld de,0007h ; Get the remainder of x/8
and e
ld e,a
ld IX,pixtable ; Look up in table pixel to set
add IX,de
ld a,(IX+0) ; and load this
or (HL) ; 'xor' toggle, 'and' cpl to clear
ld (HL),a
; pop de
; pop af
ret
pixtable:
.db 10000000b
.db 01000000b
.db 00100000b
.db 00010000b
.db 00001000b
.db 00000100b
.db 00000010b
.db 00000001b
;\-----------| PIX |----------------------------------------/
|
|
Back to top |
|
|
rebel.socom
Member
Joined: 31 May 2004 Posts: 151
|
Posted: 11 Jun 2004 03:08:55 pm Post subject: |
|
|
This will let you change the discribtion (that is shown at the bottom of the screen in mirage)
Changeable discribtion
Quote: .org userMem -2
.db $BB, $6D
ret
jr nc, start
.db "Mario" ;Normal discription
titleSaveChange:
.db 00h
.db "- Game Saved",00h ;Alternate discription. This will add to the Normal discription
Now to add the alternate text, do this.
Quote: ld hl, titleSaveChange
ld a,20h ; this is a space char or " "
ld (hl),a
And to change it back ...
Quote: ld h, titleSaveChange
ld a,00h ; to stop the alternate text.
ld (hl),a
This can be used (as in the example) to tell the user if there is a save game or not.
Last edited by Guest on 11 Jun 2004 03:11:02 pm; edited 1 time in total |
|
Back to top |
|
|
DarkerLine ceci n'est pas une |
Super Elite (Last Title)
Joined: 04 Nov 2003 Posts: 8328
|
Posted: 11 Jun 2004 03:24:24 pm Post subject: |
|
|
I'm not sure if that will work: it only edits the program copy made when the program is run, not the program itself. |
|
Back to top |
|
|
rebel.socom
Member
Joined: 31 May 2004 Posts: 151
|
Posted: 11 Jun 2004 03:43:43 pm Post subject: |
|
|
pssst... ur not suposed to post here but i guess i'm too. it works. I've tried it on my own program. Heres an example program. Play the game than press del to save your game. Look at the discription, it will say "Phantom Star 0.81b -saved". I used mirage 1.2. As you can see the disciption is too long so make sure it fits. play aging and press clear to quit and not save. The discription is normal.
Example program from ticalc.org for ti 83 +
Phantom
Last edited by Guest on 11 Jun 2004 03:44:51 pm; edited 1 time in total |
|
Back to top |
|
|
DarkerLine ceci n'est pas une |
Super Elite (Last Title)
Joined: 04 Nov 2003 Posts: 8328
|
Posted: 11 Jun 2004 03:51:58 pm Post subject: |
|
|
Guess Mirage copies the program back. All I know is that it wouldn't work in a regular program.
And pray tell how I'm "not supposed to post here?" |
|
Back to top |
|
|
rebel.socom
Member
Joined: 31 May 2004 Posts: 151
|
Posted: 11 Jun 2004 04:04:18 pm Post subject: |
|
|
the rules at the top
5) Please keep follow-up commentary on the routines in different threads. I will be heavily moderating this thread, as I'd like it to be for the actual routines only (for ease of browsing at later dates).
see it works because shells just bcall(_vputs) the discription. So if you change the .db 00 to .db 20h, bcall(_vputs) wont stop where it normaly stops. It will print whats atfer that too.
Just try Phantom. Im telling you it works |
|
Back to top |
|
|
DarkerLine ceci n'est pas une |
Super Elite (Last Title)
Joined: 04 Nov 2003 Posts: 8328
|
Posted: 11 Jun 2004 05:05:31 pm Post subject: |
|
|
I just wrote a program, it does not work. I'm telling you, you have to write back to the original program. |
|
Back to top |
|
|
rebel.socom
Member
Joined: 31 May 2004 Posts: 151
|
Posted: 11 Jun 2004 08:54:05 pm Post subject: |
|
|
Sir Robin wrote: I just wrote a program, it does not work. I'm telling you, you have to write back to the original program.
did u try phantom? and what do u mean write back |
|
Back to top |
|
|
rebel.socom
Member
Joined: 31 May 2004 Posts: 151
|
Posted: 01 Jul 2004 02:14:01 pm Post subject: |
|
|
PROG SEARCH
here is a routine that lets the user select a program instead of the asm program finding the ones to use. have the user selcet a program than see if that prgram is ok for use ( i cant say that any better, i dont know what your making your program for^_^ )
Code: bcall(_zeroop1);erase op1
ld a,ProgObj ;05h program object pointer
ld (op1),a ;set op1 with program object pointer
; now find first program
progup:
bcall(_findalphaup);find next program up
progselectlp:
ld hl,4*256+4;THIS is the display routine. I leave it up to you...
ld (currow),hl ;but here is the simplist one.
bcall(_eraseEOL);erase last prog name. (the previous program's ...
;name may be longer than the new one)
ld hl,op1+1 ;do not show ascii char for 05 or 06
call _dispS ;your display routine (bcall(_puts)...
progselectlp2:
call _KeyPause;your key retrivel routine
cp skLeft;put the key you want for the 'next' key here
jr z,progdown
cp skRight;your 'previous' key here
jr z,progup
cp skEnter ;your 'select prog here'
jr z,chkselectprog
cp skClear ;your 'quit' or 'back' key here
bjumpz(_JForceCmdNochar);use 'ret' if this is for an asm program
jr progselectlp2 ;loop back
progdown:
bcall(_findalphadn) ;find 'previous' program
jr progselectlp ;go to disp routine than to key loop
chkselectprog:
;now that the user has selcetd his/her program...
;do All your checks here. TI disigned there routine very well...
;you can bcall(_chkfindsym) right now if you what to.
Last edited by Guest on 01 Jul 2004 02:27:18 pm; edited 1 time in total |
|
Back to top |
|
|
sic
Advanced Newbie
Joined: 28 Jul 2003 Posts: 62
|
Posted: 02 Jul 2004 04:04:31 pm Post subject: |
|
|
Sir Robin wrote: I'm not sure if that will work: it only edits the program copy made when the program is run, not the program itself.
It works. I am the author of Phantom Star. By default, when MirageOS runs an assembly program, it moves (not copies) the entire program to 9d95h. When the program exits, MirageOS will restore the program using the data at 9d95h. Therefore, if you write values back to your program, they will be changed the next time your program is executed. This is what most people call "write-back", and ION does the same thing.
However, if you are saying that you in a shell-less program you need to manually write back to the original program, then you are entirely correct. IIRC, MirageOS has an option that disables write-back if the program is archived.
Last edited by Guest on 02 Jul 2004 04:07:33 pm; edited 1 time in total |
|
Back to top |
|
|
DarkerLine ceci n'est pas une |
Super Elite (Last Title)
Joined: 04 Nov 2003 Posts: 8328
|
Posted: 02 Jul 2004 05:36:42 pm Post subject: |
|
|
Ok, thanks for clarifying that.
EDIT by Adm.Wiggin:
I am going to leave this stuff in here, so as to clarify for anyone who misunderstands, as Sir Robin did. If any of you object to this, please PM me, and we'll talk.
Last edited by Guest on 09 Dec 2004 06:34:52 pm; edited 1 time in total |
|
Back to top |
|
|
MissingIntellect
Member
Joined: 01 Jun 2004 Posts: 227
|
Posted: 09 Dec 2004 10:27:47 am Post subject: |
|
|
About time to resurrect this topic...
Code: ;Name: BatteryStatus
;Description: Returns if the batteries are good, or low and need changing.
;Inputs: None
;Outputs: Non-Zero = Good Batteries
Zero = Batteries Low
;Destroys: A
GetBatteryStatus:
in a, (2)
and 01h
ret
Yes, I know there are other ways to get the battery status, but in my opinion this is the best, because it polls the hardware directly, so it's not dependent on the OS version and such.
Code: ;Name: DirectInput
;Inputs: A = Key Group
;Outputs: A = Key Code; Zero If None
;Destroys: A, B
DirectInput:
ld b,a
ld a,$ff ;Reset the keypad
out (1),a
ld a,b
out (1),a
in a,(1)
ret
Last edited by Guest on 09 Dec 2004 10:30:57 am; edited 1 time in total |
|
Back to top |
|
|
Adm.Wiggin aka Tianon
Know-It-All
Joined: 02 Jun 2003 Posts: 1874
|
Posted: 18 Apr 2005 05:15:37 pm Post subject: |
|
|
Boundry Check (A different, perhaps better, way)
Code: ; Your box coords (will not work with 0, keep x1 < x2, and y1 < y2 [duh])
#define x1 10
#define y1 10
#define x2 20
#define y2 30
check:
; a = x
; b = y
; returns c flag set if good
; returns c flag reset if no good (nc)
; destorys af (quite obvious if one knows any z80 at all)
cp x1
jr c,nogood
cp x2+1
jr nc,nogood
ld a,b
cp y1
jr c,nogood
cp y2+1
jr nc,nogood
;if it gets here, it's in the box! Yay! Hooray! Peoples rejoice!
; as a side effect of the last operation, the carry flag is already set.
ret
nogood:
or a;to reset the carry flag
ret Enjoy? Obviously, labels can be renamed. (thought it was time to attempt another ressurection of this topic )
Please PM me if any of this is incorrect or improper, and I will work on a fix right away!
Remember the rules!
Last edited by Guest on 18 Apr 2005 05:17:32 pm; edited 1 time in total |
|
Back to top |
|
|
D-Tal
Newbie
Joined: 23 Mar 2006 Posts: 7
|
Posted: 27 Mar 2006 10:40:10 am Post subject: |
|
|
Here's one that takes the average of two 8 bit registers (one being a) and rounds the result to an integer (stored in a). The cool part is that it doesn't use any registers other than the two you are adding.
ld a, num
ld b, num
add a,b
res 0, a
jr nc (label)
set 0, a
label:
rrca
I'm hoping that someone will use this efficient routine to mix two 8 bit audio sources in realtime, so as to make a small oncalc sequencer. That would be cool.
Typo fixed.
Last edited by Guest on 27 Mar 2006 12:32:27 pm; edited 1 time in total |
|
Back to top |
|
|
CoBB
Active Member
Joined: 30 Jun 2003 Posts: 720
|
Posted: 27 Mar 2006 11:05:23 am Post subject: |
|
|
[quote name='D-Tal' date='Mar 27 2006, 04:21 PM']add a,b
res 0, a
jr nc, label ; corrected syntax...
set 0, a
label:
rrca[/quote]
Why not just add a,b \ rra? |
|
Back to top |
|
|
leofox INF student
Super Elite (Last Title)
Joined: 11 Apr 2004 Posts: 3562
|
Posted: 27 Mar 2006 11:06:58 am Post subject: |
|
|
Probably because he wants to round up if the last bit is set. Although i must admit i was thinking of your way too, i dont think rounding matters that much.
edit: oh, this is post nr 3000! yayness!
Last edited by Guest on 27 Mar 2006 02:57:40 pm; edited 1 time in total |
|
Back to top |
|
|
CoBB
Active Member
Joined: 30 Jun 2003 Posts: 720
|
Posted: 27 Mar 2006 12:26:14 pm Post subject: |
|
|
He doesn't round, since the first thing he does is resetting the lowest bit... |
|
Back to top |
|
|
|