I don't think what you want to do can be done in BASIC. Fortunately though, it's pretty easy in ASM. (Everything is

) Anyhoo, see if this little piece of code does the trick... I haven't tested it, but it should probably do the trick. Assemble with your favorite assembler and change the address if needed. You can still use LOCATE and PRINT in BASIC, but you can also use the function provided here while poking the X/Y coordinates to the vram_address thingy as shown. Hope it helps...
Screen_Width: EQU 80
Upper_Screen: EQU Screen_Width*0
Lower_Screen: EQU Screen_Width*12
ORG $C000
JP Initialize ; DEFUSR=&HC000: A=USR(0)
JP Print_Text ; DEFUSR=&HC003: T$="Hi!": A=USR(T$)
JP Scroll_Upper ; DEFUSR=&HC006: A=USR(0)
JP Scroll_Lower ; DEFUSR=&HC009: A=USR(0)
VramAddress:
DW $0000 ; POKE &HC00C, (Y*Screen_Width)+X
Initialize:
LD HL,0+Screen_Width*11
LD DE,1+Screen_Width*11
LD BC,Screen_Width-1
LD (HL),$20
LDIR
XOR A
CALL $005F
JP $00CC
Print_Text:
CP $03 ; DEFUSR Arg is string
RET NZ
LD A,(DE) ; Length of String
INC DE
LD C,A
LD A,(DE) ; Low Byte Address
INC DE
LD L,A
LD A,(DE) ; High Byte Address
LD H,A
LD B,0
LD DE,(VramAddress) ; VRAM Address
JP $005C
Scroll_Upper:
LD HL,Upper_Screen+Screen_Width
LD DE,Screen_Buffer
LD BC,11*Screen_Width
CALL $0059
LD HL,Screen_Buffer
LD DE,Upper_Screen
LD BC,12*Screen_Width
JP $005C
Scroll_Lower:
LD HL,Lower_Screen+Screen_Width
LD DE,Screen_Buffer
LD BC,11*Screen_Width
CALL $0059
LD HL,Screen_Buffer
LD DE,Lower_Screen
LD BC,12*Screen_Width
JP $005C
Screen_Buffer:
DS Screen_Width*12