Website Technology Profiler
Discover What Any Website Is Built With – Instantly
Identify the technologies behind any website with one simple click you can quickly see what frameworks, platforms, plugins, analytics tools, and hosting providers a site uses.
Our site works as a powerful website technology profiler, scanning the page and generating a full breakdown of all detectable technologies. From CMS platforms and eCommerce systems to JavaScript libraries and server software helping you understand exactly how a website is built.
Perfect for developers, marketers, SEO professionals, and anyone curious about the tech stack behind their favorite websites.
Executive Summary for subethasoftware.com
SEO & Content Analysis
Basic Information
SEO Meta Tags
content-type: text/html; charset=UTF-8
Page Content
Sub-Etha Software | "In Support of the CoCo and OS-9 since 1990!"
See also:part 1, part 2, part 3, part 4, part 5, part 6, part 7 and part 8.In part 3 I showed a simple assembly language routine that would uppercase a string.In part 5, this routine was made more better by contributions from commenters.Today, I revisit this code and update it to use “what I now know” (thank you, Sean Conner) about being able to pass strings into a USR function without using VARPTR.First, here is the code from part 5:* UCASE.ASM v1.01* by Allen C. Huffman of Sub-Etha Software* www.subethasoftware.com / alsplace@pobox.com** 1.01 a bit smaller per Simon Jonassen** DEFUSRx() uppercase output function** INPUT: VARPTR of a string* RETURNS: # chars processed** EXAMPLE:* CLEAR 200,&H3F00* DEFUSR0=&H3F00* A$="Print this in uppercase."* PRINT A$* A=USR0(VARPTR(A$))*ORGADDR EQU $3f00GIVABF EQU $B4F4 * 46324INTCNV EQU $B3ED * 46061CHROUT EQU $A002opt 6809 * 6809 instructions onlyopt cd * cycle countingorg ORGADDRstart jsr INTCNV * get passed in value in Dtfr d,x * move value (varptr) to Xldy 2,x * load string addr to Ybeq null * exit if strlen is 0ldb ,x * load string len to Bldx #0 * clear X (count of chars conv)loop lda ,y+ * get next char, inc Y; lda ,y * load char in Acmpa #'a * compare to lowercase Ablt nextch * if less, no conv neededcmpa #'z * compare to lowercase Zbgt nextch * if greater, no conv neededlcase suba #32 * subtract 32 to make uppercaseleax 1,x * inc count of chars convertednextch jsr [CHROUT] * call ROM output character routine; leay 1,y * increment Y pointercont decb * decrement counterbne loop * not done yet; beq exit * if 0, go to exit; bra loop * go to loopexit tfr x,d * move chars conv count to Djmp GIVABF * return to callernull ldd #-1 * load -2 as errorreturn jmp GIVABF * return to caller* lwasm --decb -o ucase2.bin ucase2.asm -l* lwasm --decb -f basic -o ucase2.bas ucase2.asm -l* lwasm --decb -f ihex -o ucase2.hex ucase2.asm -l* decb copy -2 -r ucase2.bin ../Xroar/dsk/DRIVE0.DSK,UCASE2.BINIn the header comment you can see an example of the usage, and that it involved using VARPTR on a string to get the string’s descriptor location in memory, then pass that address into the USR function.See also: Color BASIC and VARPTRNow that I know we can just pass a string in directly, I thought it would be fun (?) to update this old code to use that method. Here is what I came up with. Note that I changed the “*” comments to “;” since the a09 assembly does not support those. If you wanted to run this in EDTASM, you would have to change those back.; UCASE3.ASM v1.02; by Allen C. Huffman of Sub-Etha Software; www.subethasoftware.com / alsplace@pobox.com;; 1.01 a bit smaller per Simon Jonassen; 1.02 converted to allow passing a string in to USR;; DEFUSRx() uppercase output function;; INPUT: string; RETURNS: # chars converted or -1 if error;; EXAMPLE:; CLEAR 200,&H3F00; DEFUSR0=&H3F00; A$="Print this in uppercase."; PRINT A$; A=USR0(A$); PRINT "CHARS CONVERTED:";A; A=USR0("This is another test");; PRINT "CHARS CONVERTED:";A;ORGADDR EQU $3f00CHROUT EQU $A002CHKSTR EQU $B146 ; Undocumented ROM callINTCNV EQU $B3ED ; 46061GIVABF EQU $B4F4 ; 46324org ORGADDRstart jsr CHKSTR ; ?TM ERROR if not a string.; X will be VARPTR, B will be string lengthtstbbeq reterror ; exit if strlen is 0ldy 2,x ; load string addr to Yldx #0 ; clear X (count of chars conv)loop lda ,y+ ; get next char, inc Ycmpa #'a ; compare to lowercase Ablo nextch ; if less, no conv neededcmpa #'z ; compare to lowercase Zbhi nextch ; if greater, no conv neededsuba #32 ; subtract 32 to make uppercaseleax 1,x ; inc count of chars convertednextch jsr [CHROUT] ; call ROM output character routinedecb ; decrement counterbne loop ; not done yettfr x,d ; move chars conv count to Dbra returnreterror ldd #-1 ; load -1 as errorreturn jmp GIVABF ; return to callerend; lwasm --decb -o ucase3.bin ucase3.asm -l -m; lwasm --decb -f basic -o ucase3.bas ucase3.asm -l -m; lwasm --decb -f ihex -o ucase3.hex ucase3.asm -l -m; decb copy -2 -r ucase3.bin ../Xroar/dsk/DRIVE0.DSK,UCASE3.BIN; a09 -fbasic -oucase3_a09.bas ucase3.asmHere are the changes… In the original version, I have this:start jsr INTCNV * get passed in value in Dtfr d,x * move value (varptr) to Xldy 2,x * load string addr to Ybeq null * exit if strlen is 0ldb ,x * load string len to Bldx #0 * clear X (count of chars conv)That first jsr INTCNV expects a number parameter and, if not a number, it exits with ?TM ERROR. If it gets past that, the number is in the D register and it gets transferred over to X. In this case, the number is the value returned by VARPTR:A=USR0(VARPTR(A$))That value is the address of the 5-byte string descriptor that contains the address of the actual string data and the length of that data. Y is loaded with 2 bytes in from wherever X points which makes Y contain the address of the string data.After this is a bug, I think. Looking at the comments, I think that “beq null” should be one line lower, like this:start jsr INTCNV * get passed in value in Dtfr d,x * move value (varptr) to Xldy 2,x * load string addr to Yldb ,x * load string len to Bbeq null * exit if strlen is 0ldx #0 * clear X (count of chars conv)That way, Y is loaded with the address of the string data, then b is loaded with the length of that data, and the branch-if-equal check is now checking B. If the length is 0, it is an empty string so no processing can be done on it. (That’s a bug, right?)The new code is this:start jsr CHKSTR ; ?TM ERROR if not a string.; X will be VARPTR, B will be string lengthtstbbeq reterror ; exit if strlen is 0ldy 2,x ; load string addr to Yldx #0 ; clear X (count of chars conv)The first line is something I learned from Sean Conner‘s excellent writeup on USR. That is an undocumented ROM call which checks is a variable is a string. If it isn’t, it will return back to BASIC with a ?TM ERROR. By having that check there, if the user tries to pass in a number, that error will be seen. As a bonus, if you try to EXEC that code, that, too, will show ?TM ERROR.After that, B should be the length of the string so tstb checks that to be 0 (empty string) then the rest of the code is similar.As I write this, I could have altered the order of my new code to do the tstb/beq after the ldy and then it would be closer to how the original worked. But since the original appears buggy, I won’t worry about that.Now if I load this and set it up, I should see this:DEF USR0=&H3F00A=USR0(42)?TM ERRORA=USR0("This is a test")THIS IS A TESTAlso, I notice that the value I return can be -1 if you pass in an empty string…A=USR0("")OKPRINT A-1…and if it is non-empty, it is only the count of the characters that had to be converted. So “Hello World” converts the “ello” and “orld” for a return value of 8. It does not touch the uppercase “H” and “W” or the space.I am not sure that is really useful. The code could be modified to return the length of the string it processed, but at least this way you know that a positive non-zero return value means it did do some work.Spot any bugs? Comment, if you will.Until next time…;Network & Infrastructure
DNS & Hosting
SSL/TLS Certificate
Technology Stack
Content Management Systems
JavaScript Frameworks
Server Technologies
Services & Integrations
Analytics & Tracking
E-commerce Platforms
CDN & Media Providers
Media Providers
Dynamic Analysis & Security
Dynamic JavaScript Analysis
Server Headers
LiteSpeed
Resource Analysis
External Resource Hosts
0.gravatar.com
1.gravatar.com
2.gravatar.com
c0.wp.com
gmpg.org
i0.wp.com
jetpack.wordpress.com
public-api.wordpress.com
s0.wp.com
stats.wp.com
subethasoftware.com
widgets.wp.com
UI Frameworks & Libraries
Social Media Integrations
Analysis Complete
Analyzed subethasoftware.com with 4 technologies detected across 7 categories
Analysis completed in 1196 ms • 2026-03-23 11:03:11 UTCLatest search queries
Older search queries
- https://newprediction.com/
- https://howtovalueanautomotiverepairshop.com/
- https://jacl.andrews.edu/
- https://blog.exodusintegration.co.za/
- http://thetruthaboutcpm.com/
- https://market.digitalstactic.com/
- https://tonysbologna.com/
- https://hpvc.slc.engr.wisc.edu/
- https://economicsexplored.com/
- https://www.laurahayden.com/