(See the best response by Kaiochao.)
mob/var/TxtSpd = 0.32

var/list/font_resources = list('final_fantasy_36_font.ttf')
parent_type = /obj
screen_loc = "1:7,4:5"
layer = 1000

var/Blank = " "
for(var/HUD/Text/Te in M.client.screen)
Te.maptext = ""

var/HUD/Text/T = new;M.client.screen.Add(T)

T.maptext_width = length(Text) / length(Text)*249
T.maptext_height = length(Text) / length(Text)*40
Blank = addtext(Blank,"[getCharacter(Text,length(Blank))]")
T.maptext = "<font face=\"Final Fantasy 3/6 Font\"><font size=3>[Blank]"

getCharacter(string, pos=1)
return ascii2text(text2ascii(string, pos))

Problem description: I'm trying to find a way to draw text downward rather than upward.

I'm using Kidpaddle45's On-screen text lib, and I see it's using the built in maptext function to draw the text on screen. I don't know if this is a result of his lib or if BYOND's maptext by default draws upward. Is there a way to reverse which direction it draws the text vertically?
Wrap your maptext with the tag <text valign=top> or use the "vertical-align" CSS property in the usual CSS way. This changes the alignment within the maptext bounds.
In response to Kaiochao
Best response
Also, you can set maptext via animate() to have it animate smoothly client-side without needing any sleep inside the loop.

The Nth character in a string is string[n].
animate(T, maptext = "<text valign=top><font...>")
for(var/i in 1 to length(Text))
animate(time = M.TxtSpd, maptext = T.maptext + Text[i])

And as usual, it's better to keep a reference to the Text obj rather than search client.screen for it. O(1) vs O(n). You could even reuse it instead of remaking it every time.
Right on, thanks for the assist, Kaiochao.