Welcome!
The addressing mode base,Y will access memory at a base address plus the content of the Y register. The two-byte address 'base' from the program will have Y added to it to make the effective address. That is, 'base' can be thought of as an array, and accessing base,Y is like accessing base[y] in another language.
In this case you have two base addresses, so in effect you have two arrays of bytes.
I'll rewrite your code snippet with different variable names:
Code:
lda ScreenRAMRowStartLow,Y ; load low address byte
sta ZeroPageLow
lda ScreenRAMRowStartHigh,Y ; load high address byte
sta ZeroPageHigh
as
Code:
lda lowbytes,Y ; load low address byte
sta pointerlow
lda highbytes,Y ; load high address byte
sta pointerhigh
So we load the Yth byte from the first array and store it in zero page, then the Yth byte from the second array and store in zero page. We can think of these two arrays as a single array of two-byte values.
In all likelihood these two zero page locations are adjacent: we've just constructed a pointer in zero page, as one of N possible pointers from our array.
Having got an address (or a pointer) into zero page, it's now possible to access memory that's pointed to by that pointer, typically with a new index value but once again placed in the Y register:
LDA (zp),Y
Most likely the idea here is that the array contains pointers to start of each line, so Y in the first two accesses gets a pointer to screen memory at some line of the screen, and then the subsequent access (with a new value for Y) can be used to read or write the character in that position along the line.
Now you know the intended meaning of the two arrays, it should be relatively easy to puzzle out why (and how) it's being filled with the values relating to the location of screen memory.
Hope this helps.