The maximum array size is 128 kilobytes without the /AH flag to QB. However, the array can have at most 32,767 indices. It is impossible to create an array large enough to store all of [tt]
SCREEN 12[/tt] (640x480), however your 640x48 array should have worked. I will assume that you meant to type 640x480

The data for [tt]
SCREEN 12[/tt] requires 192 kilobytes to store, which is out of range even with the /AH flag (it uses so much memory that you can't do anything else). However, you can process it using an arrays of 96 kilobytes working with half of the screen at once. In general, though, [tt]
SCREEN 12[/tt] is not a good choice for fast graphics because of the way the planes are laid out. To store a pixel on the screen, QB must go through all 4 planes and for each one load a byte, modify one bit in the byte, and store it back. It's a little bit lower overhead when using PUT since it can store one bit from a row of pixels at once to a plane, but it's still very inefficient for anything. In my opinion, [tt]
SCREEN 12[/tt] should be reserved for static user interfaces -- graphics which do not need to be updated in realtime.