philpem,
attached is a .bin of the 12360 PAL as read as a TMS2764 EPROM, it does appear to be a match for your file but if you could double check?
i am quite shocked my wiring worked TBH!
Harriet says hello!

Looks good to me!
Loaded 12360_Read_As-ROM.bin
DONE -->
Crypted string: --0H--0HHARRIET --------------------------------
Hex crypted string:
00 00 30 48 00 00 30 48 48 41 52 52 49 45 54 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Crypted string checksum (D7 loword): 5176
Clear string checksum (D7 hiword): 1319
AddrBitLastSeen aka Addr0 (internal): 3683 2946 2451 1679 2692 4128 3568 600
BitActiveCounter aka Addr1 - should all be 7 (internal): 7 7 7 7 7 7 7 7
I dare say you could swap in a couple of other PALs if you wanted to.
I've been working on cleaning up and figuring out the PAL readback code too...
* The decoder counts how many Pterms are associated with each bit -- that is, how many addresses it sees a bit respond to. The answer must be seven (not six, unless thou then proceedeth to seven, and eight is right out).
* Overflowing this will cause the check to fail without any checksumming or decryption being performed.
* In short: You have seven Pterms and eight bits, or 56 Pterms. Use them wisely.
* "Commands" are encoded as the deltas between the bit addresses.
* That is, every time an 'active' Pterm is seen, the decoder calculates the distance between this address and the last time it saw this bit respond.
* The "last time" array is set to -1 (well, 0xFFFF but who's counting?) at the start.
* A command (delta) of 0x800 or greater will cause an error.
* Command AND 0x400? Inverts the current bit of Crypto String character 7.
* Character 7 is zeroed at the start of the loop.
* If this happens more than once, it's an error. TL/DR: you can set bits in character 7, but not clear them.
* Char 7 is the last byte of the serial number...
* Command AND 0x200? Sets the current serial number bit.
* Command AND 0x100? Sets a bit in the checksum word.
* This is done in a slightly peculiar way. Take the index of the Pterm bit in the PAL which triggered,
* Oh, and for good measure, store the least significant 8 bits of the command in CryptoString[8+ ((NumberOfTimesIveSeenThisBit *

+ BitNumber)]
* BitNumber = 7..0 for bit mask 128..1
In summary... it stores a bunch of data as delta-encoded commands, whose meaning changes depending on which bit they happened to be seen on.
I've done a hell of a lot of commenting on this thing, results are attached. Phew.
Next up is "How the bleeding hell do I make a PROM to satisfy this thing?!"