You write a PAB in VDP memory, and set >8356 in pad to point to the length byte of your PAB.
It's actually fairly easy to do in assembly language. Reading a catalog is a bitch, because the numeric data comes back in Radix 100 format.
Doing things like relative file IO in assembly is quite simple once you get the hang of it. The trick is to write little subroutines that each do a little bit of work on the PAB. I generally 'work' on the PAB in normal CPU memory, then transfer it to VDP at the end, when I've finished setting it up.
Eg.
BL @OPCODE ; write an OPEN opcode to the opcode field
DATA OPEN,MYPAB ; (byte 0) of the pab at address MYPAB
LI R0,45 ; set record number 45
BL @SETREC ; call the 'set record' routine
DATA MYPAB ; update the PAB at address MYPAB in cpu memory
Once you have a little library of these helper routines, is very easy.
Attached is a PDF that I made for myself some time that summarises the layout of PABs. Hope you find it useful!
If you need to know anything, just go ahead and ask... Adam, Matthew, Tursi, Marc, myself etc will be happy to help.