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

