; Loader for Design Design games ; ; Currently supports ; Rommels Revenge $5b00 ; Revenge of the Body ..... $5b00 ; HOTT $6000 ; ; goat fish ORG $F000 ; 0000 ; Clear screen Entry LD HL,$4000 ; F000 LD DE,$4001 ; F003 LD BC,$1B00 ; F006 LD (HL),$00 ; F009 LDIR ; F00B LD SP,$0000 ; F00D ; Border colour for leader LD A,$F9 ; F010 LD (border_col),A ; F012 LD A,$FF ; F015 INC D ; F017 EX AF,AF' ; F018 DEC D ; F019 DI ; F01A LD A,$0F ; F01B OUT ($FE),A ; F01D LD HL,$053F ; F01F PUSH HL ; F022 IN A,($FE) ; F023 RRA ; F025 AND $20 ; F026 XOR A ; F028 LD C,A ; F029 CP A ; F02A LDBREAK RET NZ ; F02B LDSTART CALL LDEdge1 ; F02C JR NC LDBREAK ; F02F LD HL,$0415 ; F031 LDWAIT DJNZ LDWAIT ; F034 DEC HL ; F036 LD A,H ; F037 OR L ; F038 JR NZ LDWAIT ; F039 CALL LDEDGE2 ; F03B JR NC LDBREAK ; F03E LDLEADER LD B,$9C ; F040 CALL LDEDGE2 ; F042 JR NC LDBREAK ; F045 LD A,$C6 ; F047 CP B ; F049 JR NC LDSTART ; F04A INC H ; F04C JR NZ LDLEADER ; F04D LDSYNC LD B,$C9 ; F04F CALL LDEdge1 ; F051 JR NC LDBREAK ; F054 LD A,B ; F056 CP $D4 ; F057 JR NC LDSYNC ; F059 CALL LDEdge1 ; F05B JP NC Entry ; F05E LD D,$00 ; F061 LD B,$B0 ; F063 ; Get 1st IY Byte for screen addr ; From Tape LD HL,tape_to_IY ; F065 LD (tLoad_vector),HL ; F068 Attr_to_IX LD IX,$5800 ; F06B JP LF100 ; F06F ; Only jp for sync byte ($42) LDLOOP EX AF,AF' ; F072 JR NZ LDFLAG ; F073 JP wrMem_IX_1 ; F075 tLoad_vector EQU *-2 ; wrMem_IX_1 LD (IX),L ; F078 INC IX ; F07B LD HL,wrMem_IX_2 ; F07D LD (tLoad_vector),HL ; F080 JR LF0FC ; F083 wrMem_IX_2 LD (IX),L ; F085 INC IX ; F088 LD HL,wrMem_IX_3 ; F08A LD (tLoad_vector),HL ; F08D JR LF0FC ; F090 wrMem_IX_3 LD (IX),L ; F092 INC IX ; F095 LD HL,wrScreen_IY ; F097 LD (tLoad_vector),HL ; F09A JR LF0FC ; F09D wrScreen_IY LD (IY),L ; F09F INC IY ; F0A2 LD HL,wrMem_IX_1 ; F0A4 LD (tLoad_vector),HL ; F0A7 ; Decrement for scanline position DEC E ; F0AA ; Not EOL JR NZ LF0FC ; F0AB ; Load next scanline addr from tape LD HL,LF0B5 ; F0AD LD (tLoad_vector),HL ; F0B0 JR LF0FC ; F0B3 LF0B5 LD A,D ; F0B5 OR A ; F0B6 ; JP NZ never taken in real file ; ONLY taken if 0 is loaded on byte 192 ; Probably to stop non DESDES file from ; being loaded. JP NZ Entry ; F0B7 ; Get IYL updates from tape executed ; $C0 times during load LD HL,tape_to_IY ; F0BA LD (tLoad_vector),HL ; F0BD JR LF0FC ; F0C0 ; Loads IYL from tape tape_to_IY LD A,L ; F0C2 LD IYL,A ; F0C3 LD HL,NextScanline ; F0C5 LD (tLoad_vector),HL ; F0C8 JR LF0FC ; F0CB ; Loads IYH from tape ; and sets up for loading scanline NextScanline LD A,C ; F0CD XOR $01 ; F0CE LD C,A ; F0D0 LD A,$F8 ; F0D1 LD (border_col),A ; F0D3 LD A,L ; F0D6 LD IYH,A ; F0D7 LD HL,wrMem_IX_1 ; F0D9 LD (tLoad_vector),HL ; F0DC OR IYL ; F0DF ; counter for complete scanline LD E,$20 ; F0E1 ; If IY=0 then load 1 more scanline ; and set up for exucuting game JR NZ LF0FC ; F0E3 ; Vector for game execution LD HL,(Game_Entry) ; F0E5 LD (tLoad_vector),HL ; F0E8 JR LF0FC ; F0EB LDFLAG RL C ; F0ED XOR A ; F0EF LD D,A ; F0F0 LD A,C ; F0F1 RRA ; F0F2 LD C,A ; F0F3 INC DE ; F0F4 JR LF0FD ; F0F5 LD A,(IX) ; F0F7 XOR L ; F0FA RET NZ ; F0FB LF0FC XOR A ; F0FC LF0FD EX AF,AF' ; F0FD LD B,$B4 ; F0FE ; Set to 80 if rotating bits like Sinclair LF100 LD L,$80 ; F100 LD8BITS_1 CALL LDEDGE2 ; F102 RET NC ; F105 LD A,$CB ; F106 CP B ; F108 ; Normal Sinclair does RL L_ RR L ; F109 LD B,$B0 ; F10B JP NC LD8BITS_1 ; F10D LD A,D ; F110 XOR L ; F111 LD D,A ; F112 EXX ; F113 EXX ; F114 JP LDLOOP ; F115 LD A,H ; F118 CP $01 ; F119 RET ; F11B ; Game execute addr Game_Entry DEFW $5B00 ; F11C LDEDGE2 CALL LDEdge1 ; F11E RET NC ; F121 LDEdge1 LD A,$16 ; F122 LDEdge1Delay DEC A ; F124 JR NZ LDEdge1Delay ; F125 AND A ; F127 LDSample INC B ; F128 JP Z Entry ; F129 LD A,$7F ; F12C IN A,($FE) ; F12E RRA ; F130 XOR C ; F131 AND $20 ; F132 JR Z LDSample ; F134 LD A,C ; F136 ; Value of XOR controls border colour ; $F* for data $F9 for leader XOR $F8 ; F137 border_col EQU *-1 ; LD C,A ; F139 AND $07 ; F13A OR $08 ; F13C OUT ($FE),A ; F13E SCF ; F140 RET ; F141 ScreenBase EQU $4000 ; ScreenBase1 EQU $4001 ; Attrs EQU $5800 ; end EQU $F142 ;