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
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
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