What are the basics of using ROM-based controller in lieu of discrete logic
Any logical transformation of N input bits to M output bits can be accomplished by a look-up table with 2N entries (indexed by the input bits) of M bits each. This is effectively joining together M truth tables each using the same N inputs.

Using a look-up table can be simpler (less error-prone) and friendlier to change than using many individual logical operations to generate the same result. In addition, at times the cost of ROM has been much smaller than the cost of arbitrary logic.

In some cases a compromise design is superior. Discrete logic might be used to compress the input to reduce the size of the table, independent portions of the input might each use a smaller table (requiring a little extra logic to parse the input before the look-up), or simple transformations (such as duplicating particular bits or conditionally inverting particular bits) might be applied to the look-up table result allowing a reduction in the number of bits per ROM entry or the number of ROM entries.

(A similar set of tradeoffs exists for a "hardware" implementation of complex instructions versus the use of microcode.)