Omnimaga

Calculator Community => TI Calculators => ASM => Topic started by: NonstickAtom785 on September 14, 2020, 11:35:22 am

Title: HotkeySE | DoorsCS
Post by: NonstickAtom785 on September 14, 2020, 11:35:22 am

Here's the source code to a new shell expansion I made for Doors CS. You can download it below as a file.


Can anybody tell me if I could optimize this some more? This is my first functional/released assembly program and I don't know if I've missed some optimizations. Thanks all and I hope you find this useful! The source is in the download.


Edit: I got some help from Zeda at optimizing my program as well as some from Kerm. @Roccolox helped me realize that I didn't need to check the arrow keys so now the mouse goes a lot faster because it skips the iterations when the arrow keys are pressed and uses an optimized key routine.


Edit2: I finished the configuration program. It allows you to remove keys and change keys based upon your key presses. Check it out! I also made some very minor optimizations that make the program smaller. DO NOT use the older versions of HOTKEYSE with this program. I've packed the HOTKEYSE that will work in the latest HotkeySE.zip along with the KEYCONF program. (Source and documentation included.) The download link is below! Enjoy!
Title: Re: Hotkeys SE | DoorsCS
Post by: DJ Omnimaga on September 14, 2020, 02:32:13 pm
I didn't know that Doors CS still supported expansions. I thought that feature was only available in Doors CS 6.x or something (I remember trying an expansion that changed the GUI to something closer to MirageOS)
Title: Re: HotkeySE | DoorsCS
Post by: NonstickAtom785 on September 17, 2020, 03:13:04 pm
I didn't know that Doors CS still supported expansions. I thought that feature was only available in Doors CS 6.x or something (I remember trying an expansion that changed the GUI to something closer to MirageOS)

If you got a shell expansion to do that pass it over please :P . Doors kept that feature.
Title: Re: Hotkeys SE | DoorsCS
Post by: DJ Omnimaga on September 17, 2020, 03:27:49 pm
Unfortuntately that was about 13-15 years ago and I can no longer locate it. D:
Title: Re: Hotkeys SE | DoorsCS
Post by: Xeda112358 on September 20, 2020, 09:32:45 am
Alright, I just got to try this (it turns out the reason it crashed for me was a bug from another program I was testing).

This is simple and practical; good work! It genuinely improves my DCS experience just by having the [.] and [prgm] buttons for renaming and editing. (Especially the [prgm] one as that is quite intuitive, same with [(] and [)] for copy/paste).
Title: Re: HotkeySE | DoorsCS
Post by: NonstickAtom785 on September 21, 2020, 01:46:40 pm
I was trying to make the buttons make sense when I was programming them(thanks Zeda). I'm making an extra configuration program that will change what key performs an action. I intentionally left out the delete action because I didn't want anybody or myself to accidentally delete something. But I'm going to modify it so that it won't be available until you run and configure that action to the specified key. What I need help with is getting the key name based off the key that is pressed. Any ideas as to what I should do in this scenario? (F.Y.I I'm using Axe but some native assembly code will help me a bunch too!)

I was thinking of making a zero terminated list of strings and using str-Get() to get the string based off of the key, but the only problem is how to set up the routine to do that since there are keys that cannot be used...(enter, on, graph, xton, stat, arrows, alpha, and shift)
Title: Re: Hotkeys SE | DoorsCS
Post by: Xeda112358 on September 21, 2020, 04:32:17 pm
What you could do is have a simple menu where the user can move a cursor to highlight an option (like "Edit"), then they press a button to assign to that option. Your code looks for the string associated with the keypress, and if the string is empty (i.e., starts with a null byte), then it isn't a valid option. You also need to verify the keypress isn't already assigned to an option.

It's basically your idea, using an empty string to signify the keypress is invalid.
Title: Re: HotkeySE | DoorsCS
Post by: NonstickAtom785 on September 22, 2020, 10:23:15 am
What you could do is have a simple menu where the user can move a cursor to highlight an option (like "Edit"), then they press a button to assign to that option. Your code looks for the string associated with the keypress, and if the string is empty (i.e., starts with a null byte), then it isn't a valid option. You also need to verify the keypress isn't already assigned to an option.

It's basically your idea, using an empty string to signify the keypress is invalid.

I can't figure out how to make a list of zero terminated strings in axe without entering in the hex codes. Does anyone know if that's possible?
Title: Re: HotkeySE | DoorsCS
Post by: Xeda112358 on September 22, 2020, 12:22:36 pm
I think you can do something like:
Code: [Select]
"HELLO"→Str1
"WORLD"[00]
"THIS"[00]
"IS"[00]
"A"[00]
"TEST"[00]

Then Str1 points to the first zero-terminated string (note that Axe will automatically tack on a 00 when you → a string)
Title: Re: HotkeySE | DoorsCS
Post by: NonstickAtom785 on September 22, 2020, 12:54:44 pm
That was useful. So I made a table of all the keys and also realized that I can't use +,-,/, and * either. So I took those out of the equation. I added a section with all of the possible keys. With that I will do something like this:
Code: [Select]
If inData(GDB1,getKey)->A
strGet(Str1,startOfTable-A
End


Edit: I can't seem to get my code to print accurate results but when I use just the routine and output it they are fine here is the current code.
Code: [Select]
Return!If GetCalc("prgmSEHTKY")->A
+100->B
Fix 5:ClrDraw
Text(1,0,"HotkeySE Config")
RectI(0,0,49,7)
HLine(
Text(3,9,"Edit:")
Text(3,15,"Lock:")
Text(3,27,"Arch:")
Text(3,33,"Cut:")
Text(3,39,"Copy:")
Text(3,45,"Paste:")
Text(3,51,"Rename:")
Text(3,57,"Folder:")
For(G,0,8)
GKY()
End
DispGraph
Lbl GKY
If inData({G+B},GDB1)->C
strGet(Str1,C-1)->D
Text(35,6*G+9,D
End
[343337382F2E2D2C2B2A272625211F1E1D19171615110E00]->GDB1"[window]"[00]->Str1
"[zoom]"[00]
"mode"[00]
"[del]"[00]
"[x^-1]"[00]
"[x^2]"[00]"[log]"[00]
"[ln]"[00]
"[sto]"[00]
"[apps]"[00]
"[sin]"[00]
"[,]"[00]
"[0]"[00]
"[prgm]"[00]
"[cos]"[00]
"[(]"[00]
"[.]"[00]
"[vars]"[00]
"[tan]"[00]
"[)]"[00]
"[(-)]"[00]
"[^]"[00]


And here is the code that outputs the correct data:
Code: [Select]
;Same data as above...
ClrHome
Repeat getKey
End
If inData(,GDB1)->A
strGet(Str1,A-1)->B
End
Output(0,0,B)


Title: Re: HotkeySE | DoorsCS
Post by: E37 on September 24, 2020, 09:38:28 am
Hm. Im not really sure what you are trying to do here but Ill try to point out anything that could be a mistake.
1. I don't see Str1 declared anywhere. Since you said some of it worked I assume you declare it somewhere and just haven't shown it.
2. In you third code block, the if statement doesn't do anything unless you meant :strGet(Str1,A-1)-B to be :strGet(Str1,A-1)->B
3. In your first block of code you say :If inData(GDB1,getKey)->A I assume that you didn't actually use that code because you flipped the arguments for inData.

Nitpicky Axe coding things and optimization:
1. You use :For(G,0,8) : <Body> : End From my experience, using that type of for loop is bad practice. Unless your for loop has a variable end amount (Like you had a variable instead of the 8) using the single argument for loop is always faster, smaller and more reliable. For example :0->G:For( 8 ) : <Body> :G++:End
2. You don't need the colons on lines like "[window]"[00]:"[zoom]"[00]:"mode"[00]:"[del]"[00]:"[x^-1]"[00]:"[x^2]"[00]
3. Please put your data at the end of your code. Scrolling through a giant block of data in the middle of code isn't fun.
4. There is no real reason for GKY to be a subroutine.
5. Why are those text commands not in a loop? You could just do: 0->X:For( 8 ):Text(3,X++*2+1*3,strGet(Str1Menu,X-1)):End:[]->Str1Menu:"Edit"[00]"Lock"[00]"Arch"[00]"Cut"[00]"Copy"[00]"Paste"[00]"Rename"[00]"Folder"[00]
Title: Re: HotkeySE | DoorsCS
Post by: NonstickAtom785 on September 24, 2020, 11:06:27 am
I found the issue. Thanks for the optimization tips. They were useful as heck.