Does Fadal list M97 as a valid gcode used for subroutine calls? I'm used to Haas, and that is what Haas uses for subroutines.
A subroutine is a section of gcode that is placed after the current program's M30. It is placed there so that execution of the main program does not accidentally run through the subroutine. You need a line number on the first line of the subroutine, so that its memory address can be identified from the main program.
A subprogram is slightly different in that it actually has a unique program number, and is called with M98.
There is a syntax for identifying the line number (for a subroutine) or a program number (for a subprogram). This can vary a little from one manufacturer to the next. You should be able to find this in the manual.
Both subroutines and subprograms end with an M99, which the control recognizes as a return back to the main program.
A macro contains logic statements and variables. You could have a macro within a subroutine or a subprogram, but you would still need to call it with M97/M98 and return from it with M99 for it to be an actual program sub.
First you get good, then you get fast. Then grouchiness sets in.
(Note: The opinions expressed in this post are my own and are not necessarily those of CNCzone and its management)