[Coco] DEF USR and strings?
Allen Huffman
alsplace at pobox.com
Wed Oct 29 21:26:55 EDT 2025
Okay, here is an update. From looking at the Unravelled book, when USR jumps to the code, it sets up a few things.
Register A will be VALTYP. 0 is a number, 255 is a string.
If string, X will point to the string descriptor.
Knowing that, the code can then decide if it looks at X to parse the string, or if it calls INTCNV to parse the number and load that into the D register.
Here is a simple proof-of-concept that shows the type:
* lwasm defusr.asm -fbasic -odefusr.bas --map
* Test of DEF USR.
ORGADDR equ $3f00
VIDRAM equ $400 VIDEO DISPLAY AREA
INTCNV EQU $B3ED * 46061
GIVABF EQU $B4F4 * 46324
org ORGADDR
start
cmpa #0 * 0=number
beq shownumber
cmpa #255 * 255=string
beq showstring
ldx #msgunknown
bsr print
ldd #-1 * Return -1 as an error code
return
jmp GIVABF
shownumber
ldx #msgnumeric
bsr print
ldd #0
bra return
showstring
ldx #msgstring
bsr print
ldd #0
bra return
* PRINT subroutine. Prints the string pointed to by X.
print
lda ,x+
beq printdone
jsr [$a002]
bra print
printdone
lda #13
jsr [$a002]
rts
* Data storage for the string messages.
msgstring
fcc "STRING"
fcb 0
msgnumeric
fcc "NUMBER"
fcb 0
msgunknown
fcc "UNKNOWN"
fcb 0
end
When I load this and set it up using
DEF USR0=&H3F00
I can then see it print things based on the data type I pass in:
A=USR0(0)
NUMBER
A=USR0(“HELLO”)
STRING
This should allow one to receive either a number or a string and handle both.
Looks like a new blog post is coming…
— Allen
More information about the Coco
mailing list