Enter any website URL to analyze its complete technology stack

Executive Summary for subethasoftware.com

1196 Response Time (ms)
200 HTTP Status
14 Scripts
14 Images
26 Links
HTTP/1.1 Protocol

SEO & Content Analysis

Basic Information
Page Title
Sub-Etha Software | "In Support of the CoCo and OS-9 since 1990!"
Meta Description
Not detected
HTML Language
en-US
Robots.txt Present
Sitemap Present
total_urls: 2
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
IP Address
181.214.142.230
Reverse DNS
concord.servershost.net
SSL/TLS Certificate
Issuer
CN=R12, O=Let's Encrypt, C=US
Protocol Tls13
Expires In 13 days

Technology Stack

Content Management Systems
WordPress WordPress (robots.txt)
JavaScript Frameworks
jQuery
Server Technologies
Generator: WordPress 6.9 PHP (inferred from WordPress)

Services & Integrations

Analytics & Tracking
Google Analytics GA4
E-commerce Platforms
Magento PrestaShop

CDN & Media Providers

Media Providers
YouTube

Dynamic Analysis & Security

Dynamic JavaScript Analysis
Bootstrap (CSS Classes) ES6+ JavaScript Features jQuery (CDN Detection) jQuery (Script Analysis) jQuery (script Resource) Web Server: LiteSpeed
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
Angular Material (Class Names) Bootstrap (Class Names) Slate Vuetify (Class Names)

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 UTC