The mm-save program is pretty interesting, and simple in many regards. It is also easy to modify for customized usage.(NOTE: I did not follow the proper program flow below, but the facts are still solid.)
First it makes a "copy" of the top 32 bytes of the MiniMemory cartridge RAM by placing them into variables, then copies into E0-E1 and sets the Last Free Available Memory (LFAM) address just under the REF/DEF table described next. A short routine gets set up which copies all of the MiniMemory RAM into VDP RAM, and REF/DEF entry for the routine, and is then called via CALL LINK("A").
After you give the BASIC program a file name, it replaces the CPU-to-VDP copy routine with a routine which calls DSRLNK with a pointer to the location in VDP RAM which will hold the file name set up next. It then sets up what appears to be a peripheral access block including the file name with "DSK1." prefixing.
I do not know the construction of a PAB nor how DSRLNK works, but I assume that DSRLNK takes >1F09 passed to it and truncates the LSB to ascertain the PAB start (as >1F00,) then >0600 means "SAVE", >2000 is the start address in VDP RAM, >0000 is some kind of flag, >1000 is the length of data to save, and the trailing >0000 is another flag.
Finally, the top 32 bytes of the MiniMemory cartridge RAM destroyed above and the original LFAM pointer are restored.
Below I broke down the BASIC LOAD and VPOKE statements using the mmprogs.dsk:mmdisassem program. Neat program, though it did not correctly disassemble the data after the DSRLNK call (it disassembled into DATA >0000 when it should have been DATA >0008.)
I will play with the mm-load program later, but I suspect it does similar but reversed. These definitely fit my game purpose, though I think I may have a problem getting 4k of buffer space for my data to load. (I actually think I only need about 2k, but even so I should be able to break it down into parts -- maybe 256 or 512 bytes, or 1k at a time.)
I also think there is a more proper way to set up file buffers and PABs than this static method.
There is a more proper way to allocate PAB and file buffer by using GPLLNK routine >0038 (Get String Space.)