The "Z-80 Mini Course," by Larry Simioni, on machine programming is, in general, very good. The course begins with an introduction to machine programming principals. Part of this section was apparently extracted from the Zilog Z80 manual. I would recommend that anyone seriously contemplating machine programming purchase the Z80 User's Manual. The User's Manual gives the detail necessary to understand Z80 instructions.
The section on Bally System Operations gives a good description of the three custom chips which are responsible for much of the Bally's powerful graphics capability.
All the input/output ports are well defined. Since the custom chips and their associated I/O ports are unique to the Bally system, this section is particularly valuable.
The section on Bally BASIC memory usage gives a good description on how BASIC mixes graphics and program text.
There is a good discussion on the reason hexadecimal (base 16) numbering is used to represent binary numbers. The definitions of two's compliment numbers is not entirely correct. The two's complement of a number is defined as the one's complement (i.e. bit reversed), plus one. For two's complement, plus and minus numbers do not complement each other, but excluding a carry, do sum to zero.
The rest of the course deals with converting numbers, as well as developing and loading machine language code. The use of the stack is described. The starting location of the stack is at the top of memory, rather than at the bottom (as stated in the text). The alternate register set and some of its uses are defined. There is a good description of interrupt processing, a most important aspect of machine language programming.
The mechanics of producing machine code following this course are to convert Z80 opcodes and data into decimal numbers and place these numbers into memory. I prefer poking the opcode and data in Hexadecimal (see "Hex Poker" in ARCADIAN, 3, no. 7 (May 1981): 78.), since that is the standard for representing machine opcodes. In any case, either method is tedious and time consuming. An assembler is what we really need!