Microprose
Times of Lore, Xenophobe

PILOT standard 3223x[P 2168]
SYNC standard P 667, P 735
DATA
  bit 0 = DP 699
  bit 1 = DP 1398

Times of Lore uses standard logical structure, i.e.
  FLAG BYTE present
  PARITY BYTE present
The loading routine is ROM with changed constants (cb->c3), the saving routine is also ROM with changed constants (3b->2f, the rest is missing).

Xenophobe uses more sophisticated logical structure:
  FLAG BYTE none
  PARITY two bytes at the beginning of the datablock, the first is the usual XOR checksum, the second is ADD checksum

The loading routine:
 FE13 F3         DI
 FE14 AF         XOR  A
 FE15 D3FE       OUT  (+FE),A
 FE17 310000     LD   SP,+0000
 FE1A 210040     LD   HL,+4000
 FE1D 110140     LD   DE,+4001
 FE20 01FF1A     LD   BC,+1AFF
 FE23 3600       LD   (HL),+00
 FE25 EDB0       LDIR
 FE27 CD3FFE     CALL FE3F
 FE2A 3E07       LD   A,+07
 FE2C 3232FF     LD   (FF32),A
 FE2F DD210063   LD   IX,+6300
 FE33 110089     LD   DE,+8900
 FE36 CD8EFE     CALL FE8E
 FE39 AF         XOR  A
 FE3A D3FE       OUT  (+FE),A
 FE3C C30063     JP   6300

 FE3F CD39FF     CALL FF39		;load screen
 FE42 DD210060   LD   IX,+6000
 FE46 11001B     LD   DE,+1B00
 FE49 CDABFE     CALL FEAB
 FE4C D0         RET  NC
 FE4D CD02FF     CALL FF02
 FE50 7D         LD   A,L
 FE51 DD6E00     LD   L,(IX+00)
 FE54 DD6601     LD   H,(IX+01)
 FE57 77         LD   (HL),A
 FE58 DD23       INC  IX
 FE5A DD23       INC  IX
 FE5C 1B         DEC  DE
 FE5D 7A         LD   A,D
 FE5E B3         OR   E
 FE5F C24DFE     JP   NZ,FE4D
 FE62 AF         XOR  A
 FE63 D3FE       OUT  (+FE),A
 FE65 C9         RET

 FE66 010000     LD   BC,+0000		;checksum routine
 FE69 78         LD   A,B
 FE6A DDAE00     XOR  (IX+00)
 FE6D 47         LD   B,A
 FE6E 79         LD   A,C
 FE6F DD8600     ADD  A,(IX+00)
 FE72 4F         LD   C,A
 FE73 DD23       INC  IX
 FE75 1B         DEC  DE
 FE76 7A         LD   A,D
 FE77 B3         OR   E
 FE78 20EF       JR   NZ,FE69
 FE7A 3A8CFE     LD   A,(FE8C)
 FE7D B8         CP   B
 FE7E 2005       JR   NZ,FE85
 FE80 3A8DFE     LD   A,(FE8D)
 FE83 B9         CP   C
 FE84 C8         RET  Z
 FE85 D3FE       OUT  (+FE),A
 FE87 3C         INC  A
 FE88 E607       AND  +07
 FE8A 18F9       JR   FE85
 FE8C 00         NOP			;XOR checksum
 FE8D 00         NOP			;ADD checksum

 FE8E D5         PUSH DE		;load block of length DE at address IX
 FE8F DDE5       PUSH IX		;first two bytes are PARITY bytes
 FE91 CDABFE     CALL FEAB
 FE94 CD02FF     CALL FF02
 FE97 DD7500     LD   (IX+00),L
 FE9A DD23       INC  IX
 FE9C 1B         DEC  DE
 FE9D 7A         LD   A,D
 FE9E B3         OR   E
 FE9F C294FE     JP   NZ,FE94
 FEA2 DDE1       POP  IX
 FEA4 D1         POP  DE
 FEA5 AF         XOR  A
 FEA6 D3FE       OUT  (+FE),A
 FEA8 C366FE     JP   FE66

 FEAB F3         DI			;detect pilot, wait for sync and load first two bytes (checksums) to (FE8C),(FE8D)
 FEAC 3E08       LD   A,+08
 FEAE D3FE       OUT  (+FE),A
 FEB0 DBFE       IN   A,(+FE)
 FEB2 1F         RRA
 FEB3 E620       AND  +20
 FEB5 F602       OR   +02
 FEB7 4F         LD   C,A
 FEB8 BF         CP   A
 FEB9 CD19FF     CALL FF19
 FEBC 30FB       JR   NC,FEB9
 FEBE 211504     LD   HL,+0415
 FEC1 10FE       DJNZ FEC1
 FEC3 2B         DEC  HL
 FEC4 7C         LD   A,H
 FEC5 B5         OR   L
 FEC6 20F9       JR   NZ,FEC1
 FEC8 CD15FF     CALL FF15
 FECB 30EC       JR   NC,FEB9
 FECD 2670       LD   H,+70
 FECF 069C       LD   B,+9C
 FED1 CD15FF     CALL FF15
 FED4 30E3       JR   NC,FEB9
 FED6 3EC6       LD   A,+C6
 FED8 B8         CP   B
 FED9 30DE       JR   NC,FEB9
 FEDB 24         INC  H
 FEDC 20F1       JR   NZ,FECF
 FEDE 06C9       LD   B,+C9
 FEE0 CD19FF     CALL FF19
 FEE3 30D4       JR   NC,FEB9
 FEE5 78         LD   A,B
 FEE6 FED4       CP   +D4
 FEE8 30F4       JR   NC,FEDE
 FEEA CD19FF     CALL FF19
 FEED D0         RET  NC
 FEEE CD02FF     CALL FF02
 FEF1 7D         LD   A,L
 FEF2 328CFE     LD   (FE8C),A
 FEF5 CD02FF     CALL FF02
 FEF8 7D         LD   A,L
 FEF9 328DFE     LD   (FE8D),A
 FEFC 79         LD   A,C
 FEFD E6F8       AND  +F8
 FEFF 4F         LD   C,A
 FF00 37         SCF
 FF01 C9         RET

 FF02 06BE       LD   B,+BE		;LD-8-BITS
 FF04 2E01       LD   L,+01
 FF06 CD15FF     CALL FF15
 FF09 D0         RET  NC
 FF0A 3ECC       LD   A,+CC
 FF0C B8         CP   B
 FF0D CB15       RL   L
 FF0F 06BC       LD   B,+BC
 FF11 D206FF     JP   NC,FF06
 FF14 C9         RET

 FF15 CD19FF     CALL FF19		;LD-EDGE-2
 FF18 D0         RET  NC
 FF19 3E16       LD   A,+16		;LD-EDGE-1
 FF1B 3D         DEC  A
 FF1C 20FD       JR   NZ,FF1B
 FF1E A7         AND  A
 FF1F 04         INC  B
 FF20 C8         RET  Z
 FF21 3E7F       LD   A,+7F
 FF23 3E7F       LD   A,+7F
 FF25 DBFE       IN   A,(+FE)
 FF27 1F         RRA
 FF28 00         NOP
 FF29 A9         XOR  C
 FF2A E620       AND  +20
 FF2C 28F1       JR   Z,FF1F
 FF2E 79         LD   A,C
 FF2F 2F         CPL
 FF30 4F         LD   C,A
 FF31 E600       AND  +00
 FF33 F608       OR   +08
 FF35 D3FE       OUT  (+FE),A
 FF37 37         SCF
 FF38 C9         RET

 FF39 DD2103F8   LD   IX,+F803		;prepare screen address table
 FF3D FD210060   LD   IY,+6000
 FF41 DD4E00     LD   C,(IX+00)
 FF44 DD4601     LD   B,(IX+01)
 FF47 DD23       INC  IX
 FF49 DD23       INC  IX
 FF4B C5         PUSH BC
 FF4C DD7E01     LD   A,(IX+01)
 FF4F FEFF       CP   +FF
 FF51 2845       JR   Z,FF98
 FF53 E61F       AND  +1F
 FF55 57         LD   D,A
 FF56 0F         RRCA
 FF57 0F         RRCA
 FF58 0F         RRCA
 FF59 E6E0       AND  +E0
 FF5B 6F         LD   L,A
 FF5C 7A         LD   A,D
 FF5D E618       AND  +18
 FF5F F640       OR   +40
 FF61 67         LD   H,A
 FF62 DD4E00     LD   C,(IX+00)
 FF65 0600       LD   B,+00
 FF67 09         ADD  HL,BC
 FF68 E5         PUSH HL
 FF69 7C         LD   A,H
 FF6A 0F         RRCA
 FF6B 0F         RRCA
 FF6C 0F         RRCA
 FF6D E603       AND  +03
 FF6F F658       OR   +58
 FF71 67         LD   H,A
 FF72 FD7500     LD   (ERRNR),L
 FF75 FD7401     LD   (FLAGS),H
 FF78 FD23       INC  IY
 FF7A FD23       INC  IY
 FF7C E1         POP  HL
 FF7D 0608       LD   B,+08
 FF7F FD7500     LD   (ERRNR),L
 FF82 FD7401     LD   (FLAGS),H
 FF85 FD23       INC  IY
 FF87 FD23       INC  IY
 FF89 24         INC  H
 FF8A 10F3       DJNZ FF7F
 FF8C DD23       INC  IX
 FF8E DD23       INC  IX
 FF90 C1         POP  BC
 FF91 0B         DEC  BC
 FF92 78         LD   A,B
 FF93 B1         OR   C
 FF94 C24BFF     JP   NZ,FF4B
 FF97 C9         RET
 FF98 C1         POP  BC
 FF99 C9         RET

The saving routine:
 D8E3 060D       LD   B,+0D
 D8E5 CDF9D8     CALL D8F9
 D8E8 DD6E00     LD   L,(IX+00)		;the very first pulse of the datablock is 95T longer!!
 D8EB CD52D9     CALL D952		;the first pulse of each byte is 30T shorter!
 D8EE 0625       LD   B,+25
 D8F0 DD23       INC  IX
 D8F2 1B         DEC  DE
 D8F3 7A         LD   A,D
 D8F4 B3         OR   E
 D8F5 C2E8D8     JP   NZ,D8E8
 D8F8 C9         RET

 D8F9 D5         PUSH DE
 D8FA DDE5       PUSH IX
 D8FC 010000     LD   BC,+0000		;construct checksums
 D8FF 78         LD   A,B
 D900 DDAE00     XOR  (IX+00)
 D903 47         LD   B,A
 D904 79         LD   A,C
 D905 DD8600     ADD  A,(IX+00)
 D908 4F         LD   C,A
 D909 DD23       INC  IX
 D90B 1B         DEC  DE
 D90C 7A         LD   A,D
 D90D B3         OR   E
 D90E 20EF       JR   NZ,D8FF
 D910 DDE1       POP  IX
 D912 D1         POP  DE
 D913 78         LD   A,B
 D914 320040     LD   (4000),A
 D917 79         LD   A,C
 D918 320140     LD   (4001),A
 D91B F3         DI			;pilot & sync
 D91C 21980C     LD   HL,+0C98
 D91F 3E02       LD   A,+02
 D921 47         LD   B,A
 D922 10FE       DJNZ D922
 D924 D3FE       OUT  (+FE),A
 D926 EE0F       XOR  +0F
 D928 06A4       LD   B,+A4
 D92A 2D         DEC  L
 D92B 20F5       JR   NZ,D922
 D92D 05         DEC  B
 D92E 25         DEC  H
 D92F F222D9     JP   P,D922
 D932 062F       LD   B,+2F
 D934 10FE       DJNZ D934
 D936 D3FE       OUT  (+FE),A
 D938 3E0D       LD   A,+0D
 D93A 0637       LD   B,+37
 D93C 10FE       DJNZ D93C
 D93E D3FE       OUT  (+FE),A
 D940 010E2F     LD   BC,+2F0E
 D943 3A0040     LD   A,(4000)
 D946 6F         LD   L,A
 D947 CD52D9     CALL D952		;save first checksum; the first pulse is 13T longer
 D94A 3A0140     LD   A,(4001)
 D94D 6F         LD   L,A
 D94E CD52D9     CALL D952		;save second checksum; the first pulse is 83T longer!
 D951 C9         RET

 D952 3E01       LD   A,+01		;save 1 byte in L
 D954 37         SCF
 D955 C36CD9     JP   D96C
 D958 79         LD   A,C
 D959 CB78       BIT  7,B
 D95B 10FE       DJNZ D95B
 D95D 3004       JR   NC,D963
 D95F 0636       LD   B,+36
 D961 10FE       DJNZ D961
 D963 D3FE       OUT  (+FE),A
 D965 0632       LD   B,+32
 D967 20EF       JR   NZ,D958
 D969 05         DEC  B
 D96A AF         XOR  A
 D96B 3C         INC  A
 D96C CB15       RL   L
 D96E C25BD9     JP   NZ,D95B
 D971 C9         RET