Hi, AloyseTech. I did read through quite a bit of documentation before posting - there's a lot on burning a bootloader, and even creating a bootloader, not so much on then using one with Atmel Studio.
I kept at it and am getting somewhere....I ended up creating an "External Tool" that linked to bossac.exe with the following arguments (taken from the output of Visual Micro and Arduino IDE, as you suggested):
-i -d --port=COM14 -U true -i -e -w -v $(TargetDir)$(TargetName).bin -R
Here's also the full BOSSA syntax.
I wasn't able to get the Arduino to go into bootloader mode via pulling PA15 low (as detailed in Atmel's app note on SAM-BA Bootloader for SAMD21). But I was able to get it into bootloader mode by opening the native USB COM port at 1200 baud as outlined in the Zero's Getting Started Guide.
Then I selected the new tool I created, and....something happened. The output indicates it read and wrote successfully (I think):
Set binary mode
readWord(addr=0)=0x200023a0
readWord(addr=0xe000ed00)=0x410cc601
readWord(addr=0x41002018)=0x10010205
version()=v1.1 [Arduino:XYZ] Jun 10 2015 11:08:10
chipId=0x10010005
Connected at 921600 baud
readWord(addr=0)=0x200023a0
readWord(addr=0xe000ed00)=0x410cc601
readWord(addr=0x41002018)=0x10010205
Atmel SMART device 0x10010005 found
write(addr=0x20004000,size=0x34)
writeWord(addr=0x20004030,value=0x10)
writeWord(addr=0x20004020,value=0x20008000)
Device : ATSAMD21G18A
readWord(addr=0)=0x200023a0
readWord(addr=0xe000ed00)=0x410cc601
readWord(addr=0x41002018)=0x10010205
Chip ID : 10010005
version()=v1.1 [Arduino:XYZ] Jun 10 2015 11:08:10
Version : v1.1 [Arduino:XYZ] Jun 10 2015 11:08:10
Address : 8192
Pages : 3968
Page Size : 64 bytes
Total Size : 248KB
Planes : 1
Lock Regions : 16
Locked : readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
readWord(addr=0x41004020)=0xffff
none
readWord(addr=0x41004018)=0
Security : false
Boot Flash : true
readWord(addr=0x40000834)=0x7000a
BOD : true
readWord(addr=0x40000834)=0x7000a
BOR : true
Arduino : FAST_CHIP_ERASE
Arduino : FAST_MULTI_PAGE_WRITE
Arduino : CAN_CHECKSUM_MEMORY_BUFFER
Erase flash
chipErase(addr=0x2000)
done in 0.821 seconds
Write 1924 bytes to flash (31 pages)
write(addr=0x20005000,size=0x7c0)
writeBuffer(scr_addr=0x20005000, dst_addr=0x2000, size=0x7c0)
[==============================] 100% (31/31 pages)
done in 0.020 seconds
Verify 1924 bytes of flash with checksum.
checksumBuffer(start_addr=0x2000, size=0x784) = 187e
Verify successful
done in 0.009 seconds
CPU reset.
readWord(addr=0)=0x200023a0
readWord(addr=0xe000ed00)=0x410cc601
readWord(addr=0x41002018)=0x10010205
writeWord(addr=0xe000ed0c,value=0x5fa0004)
But of course my LED doesn't blink. It's likely that I don't have the SAM initialized properly for the Zero board, the template I started with was the bare-bones Atmel Studio default. Seeing exactly what system_init() does and digging through clock settings is next on my list.
Also, I wasn't able to get the SAM back into bootloader mode after "programming". I was able to re-burn the bootloader through the EDBG port and upload working blink code through the Arduino IDE again. So at least I'm back to where I started.