Commodore 64: Palace Tape F1 F2 loader
Palace Tape F1
Found on Antiriad and Rimrunner
Bit 0 : $30
Bit 1 : $5A
Endianess : MSbF
Tapes contain a number of separate files separated by pauses, each file is a series of 256 byte data blocks, each block has some additional bytes.
Load Address and Data Size (Stored as a block count) for each file is hard-coded inside the loader program.
This is the file structure....
- File Pilot : 01 (x100, loader requires only 15)
- File Header : 4A,50,47,29 (the values are meaningless, its just a sync sequence)
- Block Header : 4A,50,47,10,XX (XX begins at 0 for the first block and increments by 1 for each new block)
- Block Data (256 bytes)
- Block Checkbyte (0 XOR all data bytes)
- 1 Byte. (loader reads it but ignores)
if there is another block it follows immediately with its header.
etc.. til the end of file.
Notes :
- Each block is 263 bytes long. (5+256+1+1).
- On my TAPs the last pulses of all files final trailing bytes cause read errors and must be manually corrected.
Palace Tape F2
Found on Barbarian.
The same as Palace Tape F1 but there is no additional (unused) byte following checkbytes.
Palace loader
info by Fabrizio Gennari <fabrizio.ge@tiscalinet.it>
Used by Barbarian, Rimrunner, Antiriad...
Encoding:
Threshold: 469 clock cycles
Data Endianess: MOST Significant bit First
Structure:
The header for bit synchronization is made by
- a 1 bit
- 15 bytes with value $01
- an arbitrary sequence of bytes (that is, the loader accepts any sequence of bytes after the first fifteen 1's. In practical cases, there are all 1's)
- 4 bytes: the sequence $4A $50 $47 $29.
Then follows a series of 256-byte blocks, whose structure is like that:
- an arbitrary sequence of bytes (typically all $01)
- 4 bytes: the sequence $4A $50 $47 $10
- 1 byte: block number (first in the series is 0, then increments by 1)
- 256 bytes: data
- 1 byte: the EOR checksum of the 256 data bytes.
Each block starts immediately after the previous one has finished (no bit resync between blocks) and are stored in memory one after the other (first byte of a block is stored just after last byte of previous block).
Before calling the loading routine, the caller fills locations $80 and $81 with the memory location (low byte, high byte) where to put the first byte of the first block, and location $101 with the total number of blocks in the series. After the series of blocks is loaded, a new bit resync is needed.